[{"data":1,"prerenderedAt":1550},["ShallowReactive",2],{"navigation":3,"\u002Fnest\u002Fdatabase\u002Fmodels":173,"\u002Fnest\u002Fdatabase\u002Fmodels-surround":1545},[4,9,14,19,46,96,109,127,148],{"title":5,"path":6,"stem":7,"icon":8},"Introduction","\u002Fintroduction","01.introduction","i-lucide-info",{"title":10,"path":11,"stem":12,"icon":13},"Installation","\u002Finstallation","02.installation","i-lucide-circle-arrow-down",{"title":15,"path":16,"stem":17,"icon":18},"First App","\u002Ffirst-app","03.first-app","i-lucide-play",{"title":20,"icon":21,"path":22,"stem":23,"children":24,"page":45},"Core","i-lucide-container","\u002Fcore","10.core",[25,30,35,40],{"title":26,"path":27,"stem":28,"icon":29},"Architecture","\u002Fcore\u002Farchitecture","10.core\u002F1.architecture","i-lucide-folder-tree",{"title":31,"path":32,"stem":33,"icon":34},"Concepts","\u002Fcore\u002Fconcepts","10.core\u002F2.concepts","i-lucide-lightbulb",{"title":36,"path":37,"stem":38,"icon":39},"Runtime","\u002Fcore\u002Fruntime","10.core\u002F3.runtime","i-lucide-cpu",{"title":41,"path":42,"stem":43,"icon":44},"Modules","\u002Fcore\u002Fmodules","10.core\u002F4.modules","i-lucide-puzzle",false,{"title":47,"icon":48,"path":49,"stem":50,"children":51,"page":45},"Server","i-simple-icons-nestjs","\u002Fnest","11.nest",[52,55,72,77,82,87,92],{"title":5,"path":53,"stem":54,"icon":8},"\u002Fnest\u002Fintroduction","11.nest\u002F1.introduction",{"title":56,"path":57,"stem":58,"children":59,"icon":71},"Database","\u002Fnest\u002Fdatabase","11.nest\u002F2.database\u002F1.index",[60,61,66],{"title":56,"path":57,"stem":58,"icon":8},{"title":62,"path":63,"stem":64,"icon":65},"Models","\u002Fnest\u002Fdatabase\u002Fmodels","11.nest\u002F2.database\u002F2.models","i-lucide-database-zap",{"title":67,"path":68,"stem":69,"icon":70},"Plugins","\u002Fnest\u002Fdatabase\u002Fplugins","11.nest\u002F2.database\u002F3.plugins","i-lucide-plug","i-lucide-database",{"title":73,"path":74,"stem":75,"icon":76},"Controllers","\u002Fnest\u002Fcontrollers","11.nest\u002F3.controllers","i-lucide-route",{"title":78,"path":79,"stem":80,"icon":81},"Guards","\u002Fnest\u002Fguards","11.nest\u002F4.guards","i-lucide-shield-check",{"title":83,"path":84,"stem":85,"icon":86},"Services","\u002Fnest\u002Fservices","11.nest\u002F5.services","i-lucide-layers",{"title":88,"path":89,"stem":90,"icon":91},"Locales","\u002Fnest\u002Flocales","11.nest\u002F6.locales","i-lucide-languages",{"title":93,"path":94,"stem":95},"Env","\u002Fnest\u002Fenv","11.nest\u002F7.env",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":45},"Client","i-simple-icons-nuxt","\u002Fnuxt","12.nuxt",[102,105],{"title":5,"path":103,"stem":104},"\u002Fnuxt\u002Fintroduction","12.nuxt\u002F1.introduction",{"title":106,"path":107,"stem":108},"Coming Soon","\u002Fnuxt\u002Fcoming-soon","12.nuxt\u002F2.coming-soon",{"title":110,"icon":111,"path":112,"stem":113,"children":114,"page":45},"Configuration","i-lucide-settings","\u002Fconfiguration","13.configuration",[115,119,123],{"title":116,"path":117,"stem":118},"Opensya Config","\u002Fconfiguration\u002Fopensya-config","13.configuration\u002F1.opensya-config",{"title":120,"path":121,"stem":122},"Runtime Config","\u002Fconfiguration\u002Fruntime-config","13.configuration\u002F2.runtime-config",{"title":124,"path":125,"stem":126},"Server Config","\u002Fconfiguration\u002Fserver-config","13.configuration\u002F3.server-config",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":45},"Deployment","i-lucide-cloud","\u002Fdeployment","14.deployment",[133,136,140,144],{"title":5,"path":134,"stem":135},"\u002Fdeployment\u002Fintroduction","14.deployment\u002F1.introduction",{"title":137,"path":138,"stem":139},"Docker","\u002Fdeployment\u002Fdocker","14.deployment\u002F2.docker",{"title":141,"path":142,"stem":143},"Production","\u002Fdeployment\u002Fproduction","14.deployment\u002F3.production",{"title":145,"path":146,"stem":147},"Self Hosting","\u002Fdeployment\u002Fself-hosting","14.deployment\u002F4.self-hosting",{"title":149,"icon":150,"path":151,"stem":152,"children":153,"page":45},"Advanced","i-lucide-plus","\u002Fadvanced","15.advanced",[154,158,162,165,169],{"title":155,"path":156,"stem":157},"Internals","\u002Fadvanced\u002Finternals","15.advanced\u002F1.internals",{"title":159,"path":160,"stem":161},"Compiler","\u002Fadvanced\u002Fcompiler","15.advanced\u002F2.compiler",{"title":41,"path":163,"stem":164},"\u002Fadvanced\u002Fmodules","15.advanced\u002F3.modules",{"title":166,"path":167,"stem":168},"Globals","\u002Fadvanced\u002Fglobals","15.advanced\u002F4.globals",{"title":170,"path":171,"stem":172},"Lifecycle","\u002Fadvanced\u002Flifecycle","15.advanced\u002F5.lifecycle",{"id":174,"title":62,"body":175,"description":1538,"extension":1539,"links":1540,"meta":1541,"navigation":1542,"path":63,"seo":1543,"stem":64,"__hash__":1544},"docs\u002F11.nest\u002F2.database\u002F2.models.md",{"type":176,"value":177,"toc":1525},"minimark",[178,182,186,189,194,202,238,241,248,252,259,521,524,528,535,569,572,575,616,620,623,649,652,658,662,669,835,839,842,844,862,881,888,892,895,1141,1145,1148,1361,1364,1380,1384,1387,1405,1452,1456,1459,1462,1469,1471,1491,1494,1498,1501,1518,1521],[179,180,62],"h1",{"id":181},"models",[183,184,185],"p",{},"Models define the entities and data structures used throughout the application.",[183,187,188],{},"The OpenSya runtime automatically discovers, registers and integrates models into the generated backend runtime.",[190,191,193],"h2",{"id":192},"filesystem-structure","Filesystem Structure",[183,195,196,197,201],{},"Models are placed inside the ",[198,199,200],"code",{},"server\u002Fdatabase\u002Fmodels"," directory.",[203,204,210],"pre",{"className":205,"code":206,"filename":207,"language":208,"meta":209,"style":209},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","server\u002Fdatabase\u002Fmodels\u002F\n├── candidate.ts\n├── interview.ts\n└── feedback.ts\n","Structure","txt","",[198,211,212,220,226,232],{"__ignoreMap":209},[213,214,217],"span",{"class":215,"line":216},"line",1,[213,218,219],{},"server\u002Fdatabase\u002Fmodels\u002F\n",[213,221,223],{"class":215,"line":222},2,[213,224,225],{},"├── candidate.ts\n",[213,227,229],{"class":215,"line":228},3,[213,230,231],{},"├── interview.ts\n",[213,233,235],{"class":215,"line":234},4,[213,236,237],{},"└── feedback.ts\n",[183,239,240],{},"Each file represents a database model automatically discovered by the runtime.",[242,243,245],"callout",{"color":244,"icon":29},"primary",[183,246,247],{},"Models are automatically discovered through filesystem conventions.",[190,249,251],{"id":250},"creating-a-model","Creating a Model",[183,253,254,255,258],{},"A model is defined using the ",[198,256,257],{},"Model"," type.",[203,260,265],{"className":261,"code":262,"filename":263,"language":264,"meta":209,"style":209},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Model } from '#core\u002Fnest\u002Ftypes';\n\nconst model = {\n  schema: {\n    firstName: { type: String, required: true },\n    lastName: { type: String, required: true },\n    email: { type: String, required: true, unique: true },\n    skills: [{ type: String }],\n    available: { type: Boolean, default: true },\n  },\n} satisfies Model;\n\nexport default model;\n","server\u002Fdatabase\u002Fmodels\u002Fcandidate.ts","ts",[198,266,267,300,306,321,332,365,391,426,456,484,490,503,508],{"__ignoreMap":209},[213,268,269,273,277,281,284,287,290,294,297],{"class":215,"line":216},[213,270,272],{"class":271},"s7zQu","import",[213,274,276],{"class":275},"sMK4o"," {",[213,278,280],{"class":279},"sTEyZ"," Model",[213,282,283],{"class":275}," }",[213,285,286],{"class":271}," from",[213,288,289],{"class":275}," '",[213,291,293],{"class":292},"sfazB","#core\u002Fnest\u002Ftypes",[213,295,296],{"class":275},"'",[213,298,299],{"class":275},";\n",[213,301,302],{"class":215,"line":222},[213,303,305],{"emptyLinePlaceholder":304},true,"\n",[213,307,308,312,315,318],{"class":215,"line":228},[213,309,311],{"class":310},"spNyl","const",[213,313,314],{"class":279}," model ",[213,316,317],{"class":275},"=",[213,319,320],{"class":275}," {\n",[213,322,323,327,330],{"class":215,"line":234},[213,324,326],{"class":325},"swJcz","  schema",[213,328,329],{"class":275},":",[213,331,320],{"class":275},[213,333,335,338,340,342,345,347,350,353,356,358,362],{"class":215,"line":334},5,[213,336,337],{"class":325},"    firstName",[213,339,329],{"class":275},[213,341,276],{"class":275},[213,343,344],{"class":325}," type",[213,346,329],{"class":275},[213,348,349],{"class":279}," String",[213,351,352],{"class":275},",",[213,354,355],{"class":325}," required",[213,357,329],{"class":275},[213,359,361],{"class":360},"sfNiH"," true",[213,363,364],{"class":275}," },\n",[213,366,368,371,373,375,377,379,381,383,385,387,389],{"class":215,"line":367},6,[213,369,370],{"class":325},"    lastName",[213,372,329],{"class":275},[213,374,276],{"class":275},[213,376,344],{"class":325},[213,378,329],{"class":275},[213,380,349],{"class":279},[213,382,352],{"class":275},[213,384,355],{"class":325},[213,386,329],{"class":275},[213,388,361],{"class":360},[213,390,364],{"class":275},[213,392,394,397,399,401,403,405,407,409,411,413,415,417,420,422,424],{"class":215,"line":393},7,[213,395,396],{"class":325},"    email",[213,398,329],{"class":275},[213,400,276],{"class":275},[213,402,344],{"class":325},[213,404,329],{"class":275},[213,406,349],{"class":279},[213,408,352],{"class":275},[213,410,355],{"class":325},[213,412,329],{"class":275},[213,414,361],{"class":360},[213,416,352],{"class":275},[213,418,419],{"class":325}," unique",[213,421,329],{"class":275},[213,423,361],{"class":360},[213,425,364],{"class":275},[213,427,429,432,434,437,440,442,444,447,450,453],{"class":215,"line":428},8,[213,430,431],{"class":325},"    skills",[213,433,329],{"class":275},[213,435,436],{"class":279}," [",[213,438,439],{"class":275},"{",[213,441,344],{"class":325},[213,443,329],{"class":275},[213,445,446],{"class":279}," String ",[213,448,449],{"class":275},"}",[213,451,452],{"class":279},"]",[213,454,455],{"class":275},",\n",[213,457,459,462,464,466,468,470,473,475,478,480,482],{"class":215,"line":458},9,[213,460,461],{"class":325},"    available",[213,463,329],{"class":275},[213,465,276],{"class":275},[213,467,344],{"class":325},[213,469,329],{"class":275},[213,471,472],{"class":279}," Boolean",[213,474,352],{"class":275},[213,476,477],{"class":325}," default",[213,479,329],{"class":275},[213,481,361],{"class":360},[213,483,364],{"class":275},[213,485,487],{"class":215,"line":486},10,[213,488,489],{"class":275},"  },\n",[213,491,493,495,498,501],{"class":215,"line":492},11,[213,494,449],{"class":275},[213,496,497],{"class":271}," satisfies",[213,499,280],{"class":500},"sBMFI",[213,502,299],{"class":275},[213,504,506],{"class":215,"line":505},12,[213,507,305],{"emptyLinePlaceholder":304},[213,509,511,514,516,519],{"class":215,"line":510},13,[213,512,513],{"class":271},"export",[213,515,477],{"class":271},[213,517,518],{"class":279}," model",[213,520,299],{"class":275},[183,522,523],{},"The runtime automatically discovers and registers the model.",[190,525,527],{"id":526},"accessing-models","Accessing Models",[183,529,530,531,534],{},"Models are accessed through the OpenSya runtime using the ",[198,532,533],{},"getModel()"," helper.",[203,536,539],{"className":261,"code":537,"filename":538,"language":264,"meta":209,"style":209},"const candidateModel = getModel('Candidate');\n","Example",[198,540,541],{"__ignoreMap":209},[213,542,543,545,548,550,554,557,559,562,564,567],{"class":215,"line":216},[213,544,311],{"class":310},[213,546,547],{"class":279}," candidateModel ",[213,549,317],{"class":275},[213,551,553],{"class":552},"s2Zo4"," getModel",[213,555,556],{"class":279},"(",[213,558,296],{"class":275},[213,560,561],{"class":292},"Candidate",[213,563,296],{"class":275},[213,565,566],{"class":279},")",[213,568,299],{"class":275},[183,570,571],{},"The runtime automatically returns the registered model instance.",[183,573,574],{},"Example:",[203,576,579],{"className":261,"code":577,"filename":578,"language":264,"meta":209,"style":209},"const candidate = await getModel('Candidate').findById(candidateId);\n","services\u002Ffind-candidate.ts",[198,580,581],{"__ignoreMap":209},[213,582,583,585,588,590,593,595,597,599,601,603,605,608,611,614],{"class":215,"line":216},[213,584,311],{"class":310},[213,586,587],{"class":279}," candidate ",[213,589,317],{"class":275},[213,591,592],{"class":271}," await",[213,594,553],{"class":552},[213,596,556],{"class":279},[213,598,296],{"class":275},[213,600,561],{"class":292},[213,602,296],{"class":275},[213,604,566],{"class":279},[213,606,607],{"class":275},".",[213,609,610],{"class":552},"findById",[213,612,613],{"class":279},"(candidateId)",[213,615,299],{"class":275},[190,617,619],{"id":618},"model-registry","Model Registry",[183,621,622],{},"All discovered models are automatically registered inside the OpenSya runtime registry.",[203,624,627],{"className":205,"code":625,"filename":626,"language":208,"meta":209,"style":209},"server\u002Fdatabase\u002Fmodels\u002Fcandidate.ts\n    ↓\nRegistered as:\nCandidate\n","Runtime Registry",[198,628,629,634,639,644],{"__ignoreMap":209},[213,630,631],{"class":215,"line":216},[213,632,633],{},"server\u002Fdatabase\u002Fmodels\u002Fcandidate.ts\n",[213,635,636],{"class":215,"line":222},[213,637,638],{},"    ↓\n",[213,640,641],{"class":215,"line":228},[213,642,643],{},"Registered as:\n",[213,645,646],{"class":215,"line":234},[213,647,648],{},"Candidate\n",[183,650,651],{},"This allows models to be accessed consistently across the entire application without manual imports.",[183,653,654,655,657],{},"Models should generally be accessed through ",[198,656,533],{}," rather than direct runtime imports.\n::",[190,659,661],{"id":660},"explicit-model-name","Explicit Model Name",[183,663,664,665,668],{},"You can explicitly define the model name using the ",[198,666,667],{},"name"," property.",[203,670,673],{"className":261,"code":671,"filename":672,"language":264,"meta":209,"style":209},"import { Model } from '#core\u002Fnest\u002Ftypes';\n\nconst model: Model = {\n  name: 'InterviewFeedback',\n\n  schema: {\n    rating: { type: Number, required: true },\n    comment: { type: String },\n    recommended: { type: Boolean, default: false },\n  },\n};\n\nexport default model;\n","server\u002Fdatabase\u002Fmodels\u002Finterview-feedback.ts",[198,674,675,695,699,714,730,734,742,768,786,812,816,821,825],{"__ignoreMap":209},[213,676,677,679,681,683,685,687,689,691,693],{"class":215,"line":216},[213,678,272],{"class":271},[213,680,276],{"class":275},[213,682,280],{"class":279},[213,684,283],{"class":275},[213,686,286],{"class":271},[213,688,289],{"class":275},[213,690,293],{"class":292},[213,692,296],{"class":275},[213,694,299],{"class":275},[213,696,697],{"class":215,"line":222},[213,698,305],{"emptyLinePlaceholder":304},[213,700,701,703,705,707,709,712],{"class":215,"line":228},[213,702,311],{"class":310},[213,704,518],{"class":279},[213,706,329],{"class":275},[213,708,280],{"class":500},[213,710,711],{"class":275}," =",[213,713,320],{"class":275},[213,715,716,719,721,723,726,728],{"class":215,"line":234},[213,717,718],{"class":325},"  name",[213,720,329],{"class":275},[213,722,289],{"class":275},[213,724,725],{"class":292},"InterviewFeedback",[213,727,296],{"class":275},[213,729,455],{"class":275},[213,731,732],{"class":215,"line":334},[213,733,305],{"emptyLinePlaceholder":304},[213,735,736,738,740],{"class":215,"line":367},[213,737,326],{"class":325},[213,739,329],{"class":275},[213,741,320],{"class":275},[213,743,744,747,749,751,753,755,758,760,762,764,766],{"class":215,"line":393},[213,745,746],{"class":325},"    rating",[213,748,329],{"class":275},[213,750,276],{"class":275},[213,752,344],{"class":325},[213,754,329],{"class":275},[213,756,757],{"class":279}," Number",[213,759,352],{"class":275},[213,761,355],{"class":325},[213,763,329],{"class":275},[213,765,361],{"class":360},[213,767,364],{"class":275},[213,769,770,773,775,777,779,781,783],{"class":215,"line":428},[213,771,772],{"class":325},"    comment",[213,774,329],{"class":275},[213,776,276],{"class":275},[213,778,344],{"class":325},[213,780,329],{"class":275},[213,782,446],{"class":279},[213,784,785],{"class":275},"},\n",[213,787,788,791,793,795,797,799,801,803,805,807,810],{"class":215,"line":458},[213,789,790],{"class":325},"    recommended",[213,792,329],{"class":275},[213,794,276],{"class":275},[213,796,344],{"class":325},[213,798,329],{"class":275},[213,800,472],{"class":279},[213,802,352],{"class":275},[213,804,477],{"class":325},[213,806,329],{"class":275},[213,808,809],{"class":360}," false",[213,811,364],{"class":275},[213,813,814],{"class":215,"line":486},[213,815,489],{"class":275},[213,817,818],{"class":215,"line":492},[213,819,820],{"class":275},"};\n",[213,822,823],{"class":215,"line":505},[213,824,305],{"emptyLinePlaceholder":304},[213,826,827,829,831,833],{"class":215,"line":510},[213,828,513],{"class":271},[213,830,477],{"class":271},[213,832,518],{"class":279},[213,834,299],{"class":275},[190,836,838],{"id":837},"automatic-model-name-inference","Automatic Model Name Inference",[183,840,841],{},"If the model name is not provided, OpenSya automatically infers it from the filename.",[183,843,574],{},[203,845,848],{"className":205,"code":846,"filename":847,"language":208,"meta":209,"style":209},"server\u002Fdatabase\u002Fmodels\u002Fcandidate.ts\n    ↓\nCandidate\n","Inference",[198,849,850,854,858],{"__ignoreMap":209},[213,851,852],{"class":215,"line":216},[213,853,633],{},[213,855,856],{"class":215,"line":222},[213,857,638],{},[213,859,860],{"class":215,"line":228},[213,861,648],{},[203,863,865],{"className":205,"code":864,"filename":847,"language":208,"meta":209,"style":209},"server\u002Fdatabase\u002Fmodels\u002Finterview-feedback.ts\n    ↓\nInterviewFeedback\n",[198,866,867,872,876],{"__ignoreMap":209},[213,868,869],{"class":215,"line":216},[213,870,871],{},"server\u002Fdatabase\u002Fmodels\u002Finterview-feedback.ts\n",[213,873,874],{"class":215,"line":222},[213,875,638],{},[213,877,878],{"class":215,"line":228},[213,879,880],{},"InterviewFeedback\n",[242,882,885],{"color":883,"icon":884},"info","i-lucide-sparkles",[183,886,887],{},"In most cases, explicit model names are not required.",[190,889,891],{"id":890},"schema-definitions","Schema Definitions",[183,893,894],{},"Schemas are fully compatible with the OpenSya database runtime and support standard schema definitions.",[203,896,899],{"className":261,"code":897,"filename":898,"language":264,"meta":209,"style":209},"import { Model } from '#core\u002Fnest\u002Ftypes';\n\nconst model = {\n  schema: {\n    status: {\n      type: String,\n      required: true,\n      enum: ['pending', 'reviewed', 'accepted', 'rejected'],\n    },\n\n    score: {\n      type: Number,\n      default: 0,\n    },\n\n    archived: {\n      type: Boolean,\n      default: false,\n    },\n  },\n} satisfies Model;\n\nexport default model;\n","server\u002Fdatabase\u002Fmodels\u002Fjob-application.ts",[198,900,901,921,925,935,943,952,963,974,1021,1026,1030,1039,1049,1062,1067,1072,1082,1093,1104,1109,1114,1125,1130],{"__ignoreMap":209},[213,902,903,905,907,909,911,913,915,917,919],{"class":215,"line":216},[213,904,272],{"class":271},[213,906,276],{"class":275},[213,908,280],{"class":279},[213,910,283],{"class":275},[213,912,286],{"class":271},[213,914,289],{"class":275},[213,916,293],{"class":292},[213,918,296],{"class":275},[213,920,299],{"class":275},[213,922,923],{"class":215,"line":222},[213,924,305],{"emptyLinePlaceholder":304},[213,926,927,929,931,933],{"class":215,"line":228},[213,928,311],{"class":310},[213,930,314],{"class":279},[213,932,317],{"class":275},[213,934,320],{"class":275},[213,936,937,939,941],{"class":215,"line":234},[213,938,326],{"class":325},[213,940,329],{"class":275},[213,942,320],{"class":275},[213,944,945,948,950],{"class":215,"line":334},[213,946,947],{"class":325},"    status",[213,949,329],{"class":275},[213,951,320],{"class":275},[213,953,954,957,959,961],{"class":215,"line":367},[213,955,956],{"class":325},"      type",[213,958,329],{"class":275},[213,960,349],{"class":279},[213,962,455],{"class":275},[213,964,965,968,970,972],{"class":215,"line":393},[213,966,967],{"class":325},"      required",[213,969,329],{"class":275},[213,971,361],{"class":360},[213,973,455],{"class":275},[213,975,976,979,981,983,985,988,990,992,994,997,999,1001,1003,1006,1008,1010,1012,1015,1017,1019],{"class":215,"line":428},[213,977,978],{"class":325},"      enum",[213,980,329],{"class":275},[213,982,436],{"class":279},[213,984,296],{"class":275},[213,986,987],{"class":292},"pending",[213,989,296],{"class":275},[213,991,352],{"class":275},[213,993,289],{"class":275},[213,995,996],{"class":292},"reviewed",[213,998,296],{"class":275},[213,1000,352],{"class":275},[213,1002,289],{"class":275},[213,1004,1005],{"class":292},"accepted",[213,1007,296],{"class":275},[213,1009,352],{"class":275},[213,1011,289],{"class":275},[213,1013,1014],{"class":292},"rejected",[213,1016,296],{"class":275},[213,1018,452],{"class":279},[213,1020,455],{"class":275},[213,1022,1023],{"class":215,"line":458},[213,1024,1025],{"class":275},"    },\n",[213,1027,1028],{"class":215,"line":486},[213,1029,305],{"emptyLinePlaceholder":304},[213,1031,1032,1035,1037],{"class":215,"line":492},[213,1033,1034],{"class":325},"    score",[213,1036,329],{"class":275},[213,1038,320],{"class":275},[213,1040,1041,1043,1045,1047],{"class":215,"line":505},[213,1042,956],{"class":325},[213,1044,329],{"class":275},[213,1046,757],{"class":279},[213,1048,455],{"class":275},[213,1050,1051,1054,1056,1060],{"class":215,"line":510},[213,1052,1053],{"class":325},"      default",[213,1055,329],{"class":275},[213,1057,1059],{"class":1058},"sbssI"," 0",[213,1061,455],{"class":275},[213,1063,1065],{"class":215,"line":1064},14,[213,1066,1025],{"class":275},[213,1068,1070],{"class":215,"line":1069},15,[213,1071,305],{"emptyLinePlaceholder":304},[213,1073,1075,1078,1080],{"class":215,"line":1074},16,[213,1076,1077],{"class":325},"    archived",[213,1079,329],{"class":275},[213,1081,320],{"class":275},[213,1083,1085,1087,1089,1091],{"class":215,"line":1084},17,[213,1086,956],{"class":325},[213,1088,329],{"class":275},[213,1090,472],{"class":279},[213,1092,455],{"class":275},[213,1094,1096,1098,1100,1102],{"class":215,"line":1095},18,[213,1097,1053],{"class":325},[213,1099,329],{"class":275},[213,1101,809],{"class":360},[213,1103,455],{"class":275},[213,1105,1107],{"class":215,"line":1106},19,[213,1108,1025],{"class":275},[213,1110,1112],{"class":215,"line":1111},20,[213,1113,489],{"class":275},[213,1115,1117,1119,1121,1123],{"class":215,"line":1116},21,[213,1118,449],{"class":275},[213,1120,497],{"class":271},[213,1122,280],{"class":500},[213,1124,299],{"class":275},[213,1126,1128],{"class":215,"line":1127},22,[213,1129,305],{"emptyLinePlaceholder":304},[213,1131,1133,1135,1137,1139],{"class":215,"line":1132},23,[213,1134,513],{"class":271},[213,1136,477],{"class":271},[213,1138,518],{"class":279},[213,1140,299],{"class":275},[190,1142,1144],{"id":1143},"strong-typing","Strong Typing",[183,1146,1147],{},"Models can also be strongly typed using TypeScript generics.",[203,1149,1152],{"className":261,"code":1150,"filename":1151,"language":264,"meta":209,"style":209},"import { Model } from '#core\u002Fnest\u002Ftypes';\n\ntype MediaSchema = {\n  filename: string;\n  type: string;\n  size: number;\n};\n\nconst model: Model\u003CMediaSchema> = {\n  schema: {\n    filename: { type: String, required: true },\n    type: { type: String, required: true },\n    size: { type: Number, required: true },\n  },\n};\n\nexport default model;\n","server\u002Fdatabase\u002Fmodels\u002Fmedia.ts",[198,1153,1154,1174,1178,1190,1202,1213,1225,1229,1233,1256,1264,1289,1314,1339,1343,1347,1351],{"__ignoreMap":209},[213,1155,1156,1158,1160,1162,1164,1166,1168,1170,1172],{"class":215,"line":216},[213,1157,272],{"class":271},[213,1159,276],{"class":275},[213,1161,280],{"class":279},[213,1163,283],{"class":275},[213,1165,286],{"class":271},[213,1167,289],{"class":275},[213,1169,293],{"class":292},[213,1171,296],{"class":275},[213,1173,299],{"class":275},[213,1175,1176],{"class":215,"line":222},[213,1177,305],{"emptyLinePlaceholder":304},[213,1179,1180,1183,1186,1188],{"class":215,"line":228},[213,1181,1182],{"class":310},"type",[213,1184,1185],{"class":500}," MediaSchema",[213,1187,711],{"class":275},[213,1189,320],{"class":275},[213,1191,1192,1195,1197,1200],{"class":215,"line":234},[213,1193,1194],{"class":325},"  filename",[213,1196,329],{"class":275},[213,1198,1199],{"class":500}," string",[213,1201,299],{"class":275},[213,1203,1204,1207,1209,1211],{"class":215,"line":334},[213,1205,1206],{"class":325},"  type",[213,1208,329],{"class":275},[213,1210,1199],{"class":500},[213,1212,299],{"class":275},[213,1214,1215,1218,1220,1223],{"class":215,"line":367},[213,1216,1217],{"class":325},"  size",[213,1219,329],{"class":275},[213,1221,1222],{"class":500}," number",[213,1224,299],{"class":275},[213,1226,1227],{"class":215,"line":393},[213,1228,820],{"class":275},[213,1230,1231],{"class":215,"line":428},[213,1232,305],{"emptyLinePlaceholder":304},[213,1234,1235,1237,1239,1241,1243,1246,1249,1252,1254],{"class":215,"line":458},[213,1236,311],{"class":310},[213,1238,518],{"class":279},[213,1240,329],{"class":275},[213,1242,280],{"class":500},[213,1244,1245],{"class":275},"\u003C",[213,1247,1248],{"class":500},"MediaSchema",[213,1250,1251],{"class":275},">",[213,1253,711],{"class":275},[213,1255,320],{"class":275},[213,1257,1258,1260,1262],{"class":215,"line":486},[213,1259,326],{"class":325},[213,1261,329],{"class":275},[213,1263,320],{"class":275},[213,1265,1266,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287],{"class":215,"line":492},[213,1267,1268],{"class":325},"    filename",[213,1270,329],{"class":275},[213,1272,276],{"class":275},[213,1274,344],{"class":325},[213,1276,329],{"class":275},[213,1278,349],{"class":279},[213,1280,352],{"class":275},[213,1282,355],{"class":325},[213,1284,329],{"class":275},[213,1286,361],{"class":360},[213,1288,364],{"class":275},[213,1290,1291,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312],{"class":215,"line":505},[213,1292,1293],{"class":325},"    type",[213,1295,329],{"class":275},[213,1297,276],{"class":275},[213,1299,344],{"class":325},[213,1301,329],{"class":275},[213,1303,349],{"class":279},[213,1305,352],{"class":275},[213,1307,355],{"class":325},[213,1309,329],{"class":275},[213,1311,361],{"class":360},[213,1313,364],{"class":275},[213,1315,1316,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337],{"class":215,"line":510},[213,1317,1318],{"class":325},"    size",[213,1320,329],{"class":275},[213,1322,276],{"class":275},[213,1324,344],{"class":325},[213,1326,329],{"class":275},[213,1328,757],{"class":279},[213,1330,352],{"class":275},[213,1332,355],{"class":325},[213,1334,329],{"class":275},[213,1336,361],{"class":360},[213,1338,364],{"class":275},[213,1340,1341],{"class":215,"line":1064},[213,1342,489],{"class":275},[213,1344,1345],{"class":215,"line":1069},[213,1346,820],{"class":275},[213,1348,1349],{"class":215,"line":1074},[213,1350,305],{"emptyLinePlaceholder":304},[213,1352,1353,1355,1357,1359],{"class":215,"line":1084},[213,1354,513],{"class":271},[213,1356,477],{"class":271},[213,1358,518],{"class":279},[213,1360,299],{"class":275},[183,1362,1363],{},"This improves:",[1365,1366,1367,1371,1374,1377],"ul",{},[1368,1369,1370],"li",{},"Type safety",[1368,1372,1373],{},"IDE autocompletion",[1368,1375,1376],{},"Shared runtime contracts",[1368,1378,1379],{},"Developer experience",[190,1381,1383],{"id":1382},"runtime-discovery","Runtime Discovery",[183,1385,1386],{},"During startup, OpenSya automatically:",[1388,1389,1390,1393,1396,1399,1402],"ol",{},[1368,1391,1392],{},"Discovers model files",[1368,1394,1395],{},"Registers schemas",[1368,1397,1398],{},"Loads plugins",[1368,1400,1401],{},"Generates typings",[1368,1403,1404],{},"Integrates models into the generated runtime",[203,1406,1409],{"className":205,"code":1407,"filename":1408,"language":208,"meta":209,"style":209},"Filesystem Discovery\n    ↓\nModel Registration\n    ↓\nPlugin Loading\n    ↓\nType Generation\n    ↓\nRuntime Integration\n","Runtime Lifecycle",[198,1410,1411,1416,1420,1425,1429,1434,1438,1443,1447],{"__ignoreMap":209},[213,1412,1413],{"class":215,"line":216},[213,1414,1415],{},"Filesystem Discovery\n",[213,1417,1418],{"class":215,"line":222},[213,1419,638],{},[213,1421,1422],{"class":215,"line":228},[213,1423,1424],{},"Model Registration\n",[213,1426,1427],{"class":215,"line":234},[213,1428,638],{},[213,1430,1431],{"class":215,"line":334},[213,1432,1433],{},"Plugin Loading\n",[213,1435,1436],{"class":215,"line":367},[213,1437,638],{},[213,1439,1440],{"class":215,"line":393},[213,1441,1442],{},"Type Generation\n",[213,1444,1445],{"class":215,"line":428},[213,1446,638],{},[213,1448,1449],{"class":215,"line":458},[213,1450,1451],{},"Runtime Integration\n",[190,1453,1455],{"id":1454},"overriding-native-models","Overriding Native Models",[183,1457,1458],{},"OpenSya allows overriding native models by declaring another model with the same name.",[183,1460,1461],{},"This can be useful for advanced customizations and infrastructure extensions.",[242,1463,1466],{"color":1464,"icon":1465},"warning","i-lucide-triangle-alert",[183,1467,1468],{},"Overriding native models should be done carefully. Changing native runtime models may impact internal behaviors, integrations or generated typings.",[183,1470,574],{},[203,1472,1475],{"className":205,"code":1473,"filename":1474,"language":208,"meta":209,"style":209},"server\u002Fdatabase\u002Fmodels\u002Fuser.ts\n    ↓\nOverrides native User model\n","Override Example",[198,1476,1477,1482,1486],{"__ignoreMap":209},[213,1478,1479],{"class":215,"line":216},[213,1480,1481],{},"server\u002Fdatabase\u002Fmodels\u002Fuser.ts\n",[213,1483,1484],{"class":215,"line":222},[213,1485,638],{},[213,1487,1488],{"class":215,"line":228},[213,1489,1490],{},"Overrides native User model\n",[183,1492,1493],{},"This feature is intended for advanced use cases and infrastructure-level customizations.",[190,1495,1497],{"id":1496},"philosophy","Philosophy",[183,1499,1500],{},"OpenSya models are designed to remain:",[1365,1502,1503,1506,1509,1512,1515],{},[1368,1504,1505],{},"Flexible",[1368,1507,1508],{},"Modular",[1368,1510,1511],{},"Runtime-aware",[1368,1513,1514],{},"Strongly typed",[1368,1516,1517],{},"Scalable",[183,1519,1520],{},"The goal is to make recruitment and business infrastructures easier to evolve without introducing unnecessary schema rigidity.",[1522,1523,1524],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":209,"searchDepth":216,"depth":222,"links":1526},[1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537],{"id":192,"depth":222,"text":193},{"id":250,"depth":222,"text":251},{"id":526,"depth":222,"text":527},{"id":618,"depth":222,"text":619},{"id":660,"depth":222,"text":661},{"id":837,"depth":222,"text":838},{"id":890,"depth":222,"text":891},{"id":1143,"depth":222,"text":1144},{"id":1382,"depth":222,"text":1383},{"id":1454,"depth":222,"text":1455},{"id":1496,"depth":222,"text":1497},"Learn how to define and orchestrate database models in OpenSya.","md",null,{},{"icon":65},{"title":62,"description":1538},"hQ8AQaLKI7xAYmNsYLlnWZ8QPftMP2VboUxFz9-FOpg",[1546,1548],{"title":56,"path":57,"stem":58,"description":1547,"icon":8,"children":-1},"Understand how OpenSya manages data and why MongoDB powers the backend infrastructure.",{"title":67,"path":68,"stem":69,"description":1549,"icon":70,"children":-1},"Learn how to create reusable database plugins with the OpenSya MongoDB runtime.",1779143770782]