[{"data":1,"prerenderedAt":2123},["ShallowReactive",2],{"navigation":3,"\u002Fnest\u002Fservices":173,"\u002Fnest\u002Fservices-surround":2118},[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":83,"body":175,"description":2111,"extension":2112,"links":2113,"meta":2114,"navigation":2115,"path":84,"seo":2116,"stem":85,"__hash__":2117},"docs\u002F11.nest\u002F5.services.md",{"type":176,"value":177,"toc":2099},"minimark",[178,182,190,193,200,205,212,357,360,364,367,484,487,861,865,871,949,952,975,985,989,992,1033,1036,1103,1107,1110,1483,1486,1549,1553,1556,1756,1759,1763,1768,1940,1950,1954,1957,1978,2026,2030,2033,2036,2039,2063,2066,2069,2082,2086,2089,2092,2095],[179,180,181],"p",{},"Services contain reusable business logic in the OpenSya backend runtime.",[179,183,184,185,189],{},"They are automatically discovered, compiled and registered from the ",[186,187,188],"code",{},"server\u002Fservices"," directory.",[179,191,192],{},"Controllers should stay thin and delegate application logic to services.",[194,195,197],"callout",{"color":196,"icon":86},"primary",[179,198,199],{},"Services are the preferred place for business logic in OpenSya applications.",[201,202,204],"h2",{"id":203},"creating-a-service","Creating a Service",[179,206,207,208,211],{},"A service is created using the global ",[186,209,210],{},"defineService"," helper.",[213,214,220],"pre",{"className":215,"code":216,"filename":217,"language":218,"meta":219,"style":219},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const findById = async (candidateId: string) => {\n  const Candidate = getModel('Candidate');\n\n  return Candidate.findById(candidateId);\n};\n\nexport default defineService(findById);\n","server\u002Fservices\u002Fcandidate\u002Ffind-by-id.ts","ts","",[186,221,222,265,299,306,329,335,340],{"__ignoreMap":219},[223,224,227,231,235,239,242,245,249,252,256,259,262],"span",{"class":225,"line":226},"line",1,[223,228,230],{"class":229},"spNyl","const",[223,232,234],{"class":233},"sTEyZ"," findById ",[223,236,238],{"class":237},"sMK4o","=",[223,240,241],{"class":229}," async",[223,243,244],{"class":237}," (",[223,246,248],{"class":247},"sHdIc","candidateId",[223,250,251],{"class":237},":",[223,253,255],{"class":254},"sBMFI"," string",[223,257,258],{"class":237},")",[223,260,261],{"class":229}," =>",[223,263,264],{"class":237}," {\n",[223,266,268,271,274,277,281,285,288,292,294,296],{"class":225,"line":267},2,[223,269,270],{"class":229},"  const",[223,272,273],{"class":233}," Candidate",[223,275,276],{"class":237}," =",[223,278,280],{"class":279},"s2Zo4"," getModel",[223,282,284],{"class":283},"swJcz","(",[223,286,287],{"class":237},"'",[223,289,291],{"class":290},"sfazB","Candidate",[223,293,287],{"class":237},[223,295,258],{"class":283},[223,297,298],{"class":237},";\n",[223,300,302],{"class":225,"line":301},3,[223,303,305],{"emptyLinePlaceholder":304},true,"\n",[223,307,309,313,315,318,321,323,325,327],{"class":225,"line":308},4,[223,310,312],{"class":311},"s7zQu","  return",[223,314,273],{"class":233},[223,316,317],{"class":237},".",[223,319,320],{"class":279},"findById",[223,322,284],{"class":283},[223,324,248],{"class":233},[223,326,258],{"class":283},[223,328,298],{"class":237},[223,330,332],{"class":225,"line":331},5,[223,333,334],{"class":237},"};\n",[223,336,338],{"class":225,"line":337},6,[223,339,305],{"emptyLinePlaceholder":304},[223,341,343,346,349,352,355],{"class":225,"line":342},7,[223,344,345],{"class":311},"export",[223,347,348],{"class":311}," default",[223,350,351],{"class":279}," defineService",[223,353,354],{"class":233},"(findById)",[223,356,298],{"class":237},[179,358,359],{},"The service handler can receive parameters and return synchronous or asynchronous values.",[201,361,363],{"id":362},"service-handler","Service Handler",[179,365,366],{},"A service is simply a function registered by the OpenSya runtime.",[213,368,370],{"className":215,"code":369,"language":218,"meta":219,"style":219},"type DefineService = \u003CP extends any[], R>(\n  handler: (...args: P) => MayBePromise\u003CR>,\n) => {\n  handler: (...args: P) => MayBePromise\u003CR>;\n};\n",[186,371,372,409,443,453,480],{"__ignoreMap":219},[223,373,374,377,380,382,385,388,391,394,397,400,403,406],{"class":225,"line":226},[223,375,376],{"class":229},"type",[223,378,379],{"class":254}," DefineService",[223,381,276],{"class":237},[223,383,384],{"class":237}," \u003C",[223,386,387],{"class":254},"P",[223,389,390],{"class":229}," extends",[223,392,393],{"class":254}," any",[223,395,396],{"class":233},"[]",[223,398,399],{"class":237},",",[223,401,402],{"class":254}," R",[223,404,405],{"class":237},">",[223,407,408],{"class":233},"(\n",[223,410,411,414,416,419,422,424,427,429,431,434,437,440],{"class":225,"line":267},[223,412,413],{"class":279},"  handler",[223,415,251],{"class":237},[223,417,418],{"class":237}," (...",[223,420,421],{"class":247},"args",[223,423,251],{"class":237},[223,425,426],{"class":254}," P",[223,428,258],{"class":237},[223,430,261],{"class":229},[223,432,433],{"class":254}," MayBePromise",[223,435,436],{"class":237},"\u003C",[223,438,439],{"class":254},"R",[223,441,442],{"class":237},">,\n",[223,444,445,448,451],{"class":225,"line":301},[223,446,447],{"class":233},") ",[223,449,450],{"class":229},"=>",[223,452,264],{"class":237},[223,454,455,457,459,461,463,465,467,469,471,473,475,477],{"class":225,"line":308},[223,456,413],{"class":283},[223,458,251],{"class":237},[223,460,418],{"class":237},[223,462,421],{"class":247},[223,464,251],{"class":237},[223,466,426],{"class":254},[223,468,258],{"class":237},[223,470,261],{"class":229},[223,472,433],{"class":254},[223,474,436],{"class":237},[223,476,439],{"class":254},[223,478,479],{"class":237},">;\n",[223,481,482],{"class":225,"line":331},[223,483,334],{"class":237},[179,485,486],{},"This means services can accept any number of arguments.",[213,488,491],{"className":215,"code":489,"filename":490,"language":218,"meta":219,"style":219},"type SearchCandidateInput = {\n  query?: string;\n  available?: boolean;\n};\n\nconst search = async (input: SearchCandidateInput) => {\n  const Candidate = getModel('Candidate');\n\n  return Candidate.find({\n    ...(input.available !== undefined ? { available: input.available } : {}),\n    ...(input.query\n      ? {\n          $or: [\n            { firstName: new RegExp(input.query, 'i') },\n            { lastName: new RegExp(input.query, 'i') },\n            { email: new RegExp(input.query, 'i') },\n          ],\n        }\n      : {}),\n  });\n};\n\nexport default defineService(search);\n","server\u002Fservices\u002Fcandidate\u002Fsearch.ts",[186,492,493,504,516,528,532,536,562,584,589,606,659,673,681,692,733,767,801,809,815,827,837,842,847],{"__ignoreMap":219},[223,494,495,497,500,502],{"class":225,"line":226},[223,496,376],{"class":229},[223,498,499],{"class":254}," SearchCandidateInput",[223,501,276],{"class":237},[223,503,264],{"class":237},[223,505,506,509,512,514],{"class":225,"line":267},[223,507,508],{"class":283},"  query",[223,510,511],{"class":237},"?:",[223,513,255],{"class":254},[223,515,298],{"class":237},[223,517,518,521,523,526],{"class":225,"line":301},[223,519,520],{"class":283},"  available",[223,522,511],{"class":237},[223,524,525],{"class":254}," boolean",[223,527,298],{"class":237},[223,529,530],{"class":225,"line":308},[223,531,334],{"class":237},[223,533,534],{"class":225,"line":331},[223,535,305],{"emptyLinePlaceholder":304},[223,537,538,540,543,545,547,549,552,554,556,558,560],{"class":225,"line":337},[223,539,230],{"class":229},[223,541,542],{"class":233}," search ",[223,544,238],{"class":237},[223,546,241],{"class":229},[223,548,244],{"class":237},[223,550,551],{"class":247},"input",[223,553,251],{"class":237},[223,555,499],{"class":254},[223,557,258],{"class":237},[223,559,261],{"class":229},[223,561,264],{"class":237},[223,563,564,566,568,570,572,574,576,578,580,582],{"class":225,"line":342},[223,565,270],{"class":229},[223,567,273],{"class":233},[223,569,276],{"class":237},[223,571,280],{"class":279},[223,573,284],{"class":283},[223,575,287],{"class":237},[223,577,291],{"class":290},[223,579,287],{"class":237},[223,581,258],{"class":283},[223,583,298],{"class":237},[223,585,587],{"class":225,"line":586},8,[223,588,305],{"emptyLinePlaceholder":304},[223,590,592,594,596,598,601,603],{"class":225,"line":591},9,[223,593,312],{"class":311},[223,595,273],{"class":233},[223,597,317],{"class":237},[223,599,600],{"class":279},"find",[223,602,284],{"class":283},[223,604,605],{"class":237},"{\n",[223,607,609,612,614,616,618,621,624,627,630,633,636,638,641,643,645,648,651,654,656],{"class":225,"line":608},10,[223,610,611],{"class":237},"    ...",[223,613,284],{"class":283},[223,615,551],{"class":233},[223,617,317],{"class":237},[223,619,620],{"class":233},"available",[223,622,623],{"class":237}," !==",[223,625,626],{"class":237}," undefined",[223,628,629],{"class":237}," ?",[223,631,632],{"class":237}," {",[223,634,635],{"class":283}," available",[223,637,251],{"class":237},[223,639,640],{"class":233}," input",[223,642,317],{"class":237},[223,644,620],{"class":233},[223,646,647],{"class":237}," }",[223,649,650],{"class":237}," :",[223,652,653],{"class":237}," {}",[223,655,258],{"class":283},[223,657,658],{"class":237},",\n",[223,660,662,664,666,668,670],{"class":225,"line":661},11,[223,663,611],{"class":237},[223,665,284],{"class":283},[223,667,551],{"class":233},[223,669,317],{"class":237},[223,671,672],{"class":233},"query\n",[223,674,676,679],{"class":225,"line":675},12,[223,677,678],{"class":237},"      ?",[223,680,264],{"class":237},[223,682,684,687,689],{"class":225,"line":683},13,[223,685,686],{"class":283},"          $or",[223,688,251],{"class":237},[223,690,691],{"class":283}," [\n",[223,693,695,698,701,703,706,709,711,713,715,718,720,723,726,728,730],{"class":225,"line":694},14,[223,696,697],{"class":237},"            {",[223,699,700],{"class":283}," firstName",[223,702,251],{"class":237},[223,704,705],{"class":237}," new",[223,707,708],{"class":279}," RegExp",[223,710,284],{"class":283},[223,712,551],{"class":233},[223,714,317],{"class":237},[223,716,717],{"class":233},"query",[223,719,399],{"class":237},[223,721,722],{"class":237}," '",[223,724,725],{"class":290},"i",[223,727,287],{"class":237},[223,729,447],{"class":283},[223,731,732],{"class":237},"},\n",[223,734,736,738,741,743,745,747,749,751,753,755,757,759,761,763,765],{"class":225,"line":735},15,[223,737,697],{"class":237},[223,739,740],{"class":283}," lastName",[223,742,251],{"class":237},[223,744,705],{"class":237},[223,746,708],{"class":279},[223,748,284],{"class":283},[223,750,551],{"class":233},[223,752,317],{"class":237},[223,754,717],{"class":233},[223,756,399],{"class":237},[223,758,722],{"class":237},[223,760,725],{"class":290},[223,762,287],{"class":237},[223,764,447],{"class":283},[223,766,732],{"class":237},[223,768,770,772,775,777,779,781,783,785,787,789,791,793,795,797,799],{"class":225,"line":769},16,[223,771,697],{"class":237},[223,773,774],{"class":283}," email",[223,776,251],{"class":237},[223,778,705],{"class":237},[223,780,708],{"class":279},[223,782,284],{"class":283},[223,784,551],{"class":233},[223,786,317],{"class":237},[223,788,717],{"class":233},[223,790,399],{"class":237},[223,792,722],{"class":237},[223,794,725],{"class":290},[223,796,287],{"class":237},[223,798,447],{"class":283},[223,800,732],{"class":237},[223,802,804,807],{"class":225,"line":803},17,[223,805,806],{"class":283},"          ]",[223,808,658],{"class":237},[223,810,812],{"class":225,"line":811},18,[223,813,814],{"class":237},"        }\n",[223,816,818,821,823,825],{"class":225,"line":817},19,[223,819,820],{"class":237},"      :",[223,822,653],{"class":237},[223,824,258],{"class":283},[223,826,658],{"class":237},[223,828,830,833,835],{"class":225,"line":829},20,[223,831,832],{"class":237},"  }",[223,834,258],{"class":283},[223,836,298],{"class":237},[223,838,840],{"class":225,"line":839},21,[223,841,334],{"class":237},[223,843,845],{"class":225,"line":844},22,[223,846,305],{"emptyLinePlaceholder":304},[223,848,850,852,854,856,859],{"class":225,"line":849},23,[223,851,345],{"class":311},[223,853,348],{"class":311},[223,855,351],{"class":279},[223,857,858],{"class":233},"(search)",[223,860,298],{"class":237},[201,862,864],{"id":863},"calling-a-service","Calling a Service",[179,866,867,868,317],{},"Services are accessed through the OpenSya runtime using ",[186,869,870],{},"useService",[213,872,875],{"className":215,"code":873,"filename":874,"language":218,"meta":219,"style":219},"export default defineController(async ({ req }) => {\n  return useService('candidate.findById')(req.params.id);\n});\n","server\u002Fcontrollers\u002Fcandidates\u002F[id]\u002Findex.get.ts",[186,876,877,904,940],{"__ignoreMap":219},[223,878,879,881,883,886,888,891,894,897,900,902],{"class":225,"line":226},[223,880,345],{"class":311},[223,882,348],{"class":311},[223,884,885],{"class":279}," defineController",[223,887,284],{"class":233},[223,889,890],{"class":229},"async",[223,892,893],{"class":237}," ({",[223,895,896],{"class":247}," req",[223,898,899],{"class":237}," })",[223,901,261],{"class":229},[223,903,264],{"class":237},[223,905,906,908,911,913,915,918,920,923,926,928,931,933,936,938],{"class":225,"line":267},[223,907,312],{"class":311},[223,909,910],{"class":279}," useService",[223,912,284],{"class":283},[223,914,287],{"class":237},[223,916,917],{"class":290},"candidate.findById",[223,919,287],{"class":237},[223,921,922],{"class":283},")(",[223,924,925],{"class":233},"req",[223,927,317],{"class":237},[223,929,930],{"class":233},"params",[223,932,317],{"class":237},[223,934,935],{"class":233},"id",[223,937,258],{"class":283},[223,939,298],{"class":237},[223,941,942,945,947],{"class":225,"line":301},[223,943,944],{"class":237},"}",[223,946,258],{"class":233},[223,948,298],{"class":237},[179,950,951],{},"The service name is derived from its file path.",[213,953,958],{"className":954,"code":955,"filename":956,"language":957,"meta":219,"style":219},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","server\u002Fservices\u002Fcandidate\u002Ffind-by-id.ts\n                ↓\ncandidate.findById\n","Service Name","txt",[186,959,960,965,970],{"__ignoreMap":219},[223,961,962],{"class":225,"line":226},[223,963,964],{},"server\u002Fservices\u002Fcandidate\u002Ffind-by-id.ts\n",[223,966,967],{"class":225,"line":267},[223,968,969],{},"                ↓\n",[223,971,972],{"class":225,"line":301},[223,973,974],{},"candidate.findById\n",[194,976,979],{"color":977,"icon":978},"info","i-lucide-sparkles",[179,980,981,982,317],{},"Services are registered in the runtime registry and can be accessed by name using ",[186,983,984],{},"useService()",[201,986,988],{"id":987},"file-based-naming","File-based Naming",[179,990,991],{},"OpenSya infers service names from the filesystem.",[213,993,996],{"className":954,"code":994,"filename":995,"language":957,"meta":219,"style":219},"server\u002Fservices\u002F\n├── candidate\u002F\n│   ├── find-by-id.ts\n│   ├── search.ts\n│   └── create.ts\n└── interview\u002F\n    └── schedule.ts\n","Structure",[186,997,998,1003,1008,1013,1018,1023,1028],{"__ignoreMap":219},[223,999,1000],{"class":225,"line":226},[223,1001,1002],{},"server\u002Fservices\u002F\n",[223,1004,1005],{"class":225,"line":267},[223,1006,1007],{},"├── candidate\u002F\n",[223,1009,1010],{"class":225,"line":301},[223,1011,1012],{},"│   ├── find-by-id.ts\n",[223,1014,1015],{"class":225,"line":308},[223,1016,1017],{},"│   ├── search.ts\n",[223,1019,1020],{"class":225,"line":331},[223,1021,1022],{},"│   └── create.ts\n",[223,1024,1025],{"class":225,"line":337},[223,1026,1027],{},"└── interview\u002F\n",[223,1029,1030],{"class":225,"line":342},[223,1031,1032],{},"    └── schedule.ts\n",[179,1034,1035],{},"Generated service names:",[1037,1038,1039,1052],"table",{},[1040,1041,1042],"thead",{},[1043,1044,1045,1050],"tr",{},[1046,1047,1049],"th",{"align":1048},"left","File",[1046,1051,956],{"align":1048},[1053,1054,1055,1067,1079,1091],"tbody",{},[1043,1056,1057,1063],{},[1058,1059,1060],"td",{},[186,1061,1062],{},"candidate\u002Ffind-by-id.ts",[1058,1064,1065],{},[186,1066,917],{},[1043,1068,1069,1074],{},[1058,1070,1071],{},[186,1072,1073],{},"candidate\u002Fsearch.ts",[1058,1075,1076],{},[186,1077,1078],{},"candidate.search",[1043,1080,1081,1086],{},[1058,1082,1083],{},[186,1084,1085],{},"candidate\u002Fcreate.ts",[1058,1087,1088],{},[186,1089,1090],{},"candidate.create",[1043,1092,1093,1098],{},[1058,1094,1095],{},[186,1096,1097],{},"interview\u002Fschedule.ts",[1058,1099,1100],{},[186,1101,1102],{},"interview.schedule",[201,1104,1106],{"id":1105},"typed-services","Typed Services",[179,1108,1109],{},"Services can be explicitly typed using regular TypeScript types.",[213,1111,1114],{"className":215,"code":1112,"filename":1113,"language":218,"meta":219,"style":219},"type ScheduleInterviewInput = {\n  candidateId: string;\n  interviewerId: string;\n  scheduledAt: Date;\n};\n\ntype ScheduleInterviewResult = {\n  id: string;\n  candidateId: string;\n  interviewerId: string;\n  scheduledAt: Date;\n};\n\nconst scheduleInterview = async (\n  input: ScheduleInterviewInput,\n): Promise\u003CScheduleInterviewResult> => {\n  const Interview = getModel('Interview');\n\n  const interview = await Interview.create({\n    candidateId: input.candidateId,\n    interviewerId: input.interviewerId,\n    scheduledAt: input.scheduledAt,\n  });\n\n  return {\n    id: interview.id,\n    candidateId: input.candidateId,\n    interviewerId: input.interviewerId,\n    scheduledAt: input.scheduledAt,\n  };\n};\n\nexport default defineService(scheduleInterview);\n","server\u002Fservices\u002Finterview\u002Fschedule.ts",[186,1115,1116,1127,1138,1149,1161,1165,1169,1180,1191,1201,1211,1221,1225,1229,1243,1254,1274,1298,1302,1325,1340,1356,1372,1380,1385,1392,1408,1423,1438,1453,1459,1464,1469],{"__ignoreMap":219},[223,1117,1118,1120,1123,1125],{"class":225,"line":226},[223,1119,376],{"class":229},[223,1121,1122],{"class":254}," ScheduleInterviewInput",[223,1124,276],{"class":237},[223,1126,264],{"class":237},[223,1128,1129,1132,1134,1136],{"class":225,"line":267},[223,1130,1131],{"class":283},"  candidateId",[223,1133,251],{"class":237},[223,1135,255],{"class":254},[223,1137,298],{"class":237},[223,1139,1140,1143,1145,1147],{"class":225,"line":301},[223,1141,1142],{"class":283},"  interviewerId",[223,1144,251],{"class":237},[223,1146,255],{"class":254},[223,1148,298],{"class":237},[223,1150,1151,1154,1156,1159],{"class":225,"line":308},[223,1152,1153],{"class":283},"  scheduledAt",[223,1155,251],{"class":237},[223,1157,1158],{"class":254}," Date",[223,1160,298],{"class":237},[223,1162,1163],{"class":225,"line":331},[223,1164,334],{"class":237},[223,1166,1167],{"class":225,"line":337},[223,1168,305],{"emptyLinePlaceholder":304},[223,1170,1171,1173,1176,1178],{"class":225,"line":342},[223,1172,376],{"class":229},[223,1174,1175],{"class":254}," ScheduleInterviewResult",[223,1177,276],{"class":237},[223,1179,264],{"class":237},[223,1181,1182,1185,1187,1189],{"class":225,"line":586},[223,1183,1184],{"class":283},"  id",[223,1186,251],{"class":237},[223,1188,255],{"class":254},[223,1190,298],{"class":237},[223,1192,1193,1195,1197,1199],{"class":225,"line":591},[223,1194,1131],{"class":283},[223,1196,251],{"class":237},[223,1198,255],{"class":254},[223,1200,298],{"class":237},[223,1202,1203,1205,1207,1209],{"class":225,"line":608},[223,1204,1142],{"class":283},[223,1206,251],{"class":237},[223,1208,255],{"class":254},[223,1210,298],{"class":237},[223,1212,1213,1215,1217,1219],{"class":225,"line":661},[223,1214,1153],{"class":283},[223,1216,251],{"class":237},[223,1218,1158],{"class":254},[223,1220,298],{"class":237},[223,1222,1223],{"class":225,"line":675},[223,1224,334],{"class":237},[223,1226,1227],{"class":225,"line":683},[223,1228,305],{"emptyLinePlaceholder":304},[223,1230,1231,1233,1236,1238,1240],{"class":225,"line":694},[223,1232,230],{"class":229},[223,1234,1235],{"class":233}," scheduleInterview ",[223,1237,238],{"class":237},[223,1239,241],{"class":229},[223,1241,1242],{"class":233}," (\n",[223,1244,1245,1248,1250,1252],{"class":225,"line":735},[223,1246,1247],{"class":247},"  input",[223,1249,251],{"class":237},[223,1251,1122],{"class":254},[223,1253,658],{"class":237},[223,1255,1256,1258,1260,1263,1265,1268,1270,1272],{"class":225,"line":769},[223,1257,258],{"class":233},[223,1259,251],{"class":237},[223,1261,1262],{"class":254}," Promise",[223,1264,436],{"class":237},[223,1266,1267],{"class":254},"ScheduleInterviewResult",[223,1269,405],{"class":237},[223,1271,261],{"class":229},[223,1273,264],{"class":237},[223,1275,1276,1278,1281,1283,1285,1287,1289,1292,1294,1296],{"class":225,"line":803},[223,1277,270],{"class":229},[223,1279,1280],{"class":233}," Interview",[223,1282,276],{"class":237},[223,1284,280],{"class":279},[223,1286,284],{"class":283},[223,1288,287],{"class":237},[223,1290,1291],{"class":290},"Interview",[223,1293,287],{"class":237},[223,1295,258],{"class":283},[223,1297,298],{"class":237},[223,1299,1300],{"class":225,"line":811},[223,1301,305],{"emptyLinePlaceholder":304},[223,1303,1304,1306,1309,1311,1314,1316,1318,1321,1323],{"class":225,"line":817},[223,1305,270],{"class":229},[223,1307,1308],{"class":233}," interview",[223,1310,276],{"class":237},[223,1312,1313],{"class":311}," await",[223,1315,1280],{"class":233},[223,1317,317],{"class":237},[223,1319,1320],{"class":279},"create",[223,1322,284],{"class":283},[223,1324,605],{"class":237},[223,1326,1327,1330,1332,1334,1336,1338],{"class":225,"line":829},[223,1328,1329],{"class":283},"    candidateId",[223,1331,251],{"class":237},[223,1333,640],{"class":233},[223,1335,317],{"class":237},[223,1337,248],{"class":233},[223,1339,658],{"class":237},[223,1341,1342,1345,1347,1349,1351,1354],{"class":225,"line":839},[223,1343,1344],{"class":283},"    interviewerId",[223,1346,251],{"class":237},[223,1348,640],{"class":233},[223,1350,317],{"class":237},[223,1352,1353],{"class":233},"interviewerId",[223,1355,658],{"class":237},[223,1357,1358,1361,1363,1365,1367,1370],{"class":225,"line":844},[223,1359,1360],{"class":283},"    scheduledAt",[223,1362,251],{"class":237},[223,1364,640],{"class":233},[223,1366,317],{"class":237},[223,1368,1369],{"class":233},"scheduledAt",[223,1371,658],{"class":237},[223,1373,1374,1376,1378],{"class":225,"line":849},[223,1375,832],{"class":237},[223,1377,258],{"class":283},[223,1379,298],{"class":237},[223,1381,1383],{"class":225,"line":1382},24,[223,1384,305],{"emptyLinePlaceholder":304},[223,1386,1388,1390],{"class":225,"line":1387},25,[223,1389,312],{"class":311},[223,1391,264],{"class":237},[223,1393,1395,1398,1400,1402,1404,1406],{"class":225,"line":1394},26,[223,1396,1397],{"class":283},"    id",[223,1399,251],{"class":237},[223,1401,1308],{"class":233},[223,1403,317],{"class":237},[223,1405,935],{"class":233},[223,1407,658],{"class":237},[223,1409,1411,1413,1415,1417,1419,1421],{"class":225,"line":1410},27,[223,1412,1329],{"class":283},[223,1414,251],{"class":237},[223,1416,640],{"class":233},[223,1418,317],{"class":237},[223,1420,248],{"class":233},[223,1422,658],{"class":237},[223,1424,1426,1428,1430,1432,1434,1436],{"class":225,"line":1425},28,[223,1427,1344],{"class":283},[223,1429,251],{"class":237},[223,1431,640],{"class":233},[223,1433,317],{"class":237},[223,1435,1353],{"class":233},[223,1437,658],{"class":237},[223,1439,1441,1443,1445,1447,1449,1451],{"class":225,"line":1440},29,[223,1442,1360],{"class":283},[223,1444,251],{"class":237},[223,1446,640],{"class":233},[223,1448,317],{"class":237},[223,1450,1369],{"class":233},[223,1452,658],{"class":237},[223,1454,1456],{"class":225,"line":1455},30,[223,1457,1458],{"class":237},"  };\n",[223,1460,1462],{"class":225,"line":1461},31,[223,1463,334],{"class":237},[223,1465,1467],{"class":225,"line":1466},32,[223,1468,305],{"emptyLinePlaceholder":304},[223,1470,1472,1474,1476,1478,1481],{"class":225,"line":1471},33,[223,1473,345],{"class":311},[223,1475,348],{"class":311},[223,1477,351],{"class":279},[223,1479,1480],{"class":233},"(scheduleInterview)",[223,1482,298],{"class":237},[179,1484,1485],{},"Then it can be called from a controller.",[213,1487,1490],{"className":215,"code":1488,"filename":1489,"language":218,"meta":219,"style":219},"export default defineController(async ({ req }) => {\n  return useService('interview.schedule')(req.body);\n});\n","server\u002Fcontrollers\u002Finterviews\u002Findex.post.ts",[186,1491,1492,1514,1541],{"__ignoreMap":219},[223,1493,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512],{"class":225,"line":226},[223,1495,345],{"class":311},[223,1497,348],{"class":311},[223,1499,885],{"class":279},[223,1501,284],{"class":233},[223,1503,890],{"class":229},[223,1505,893],{"class":237},[223,1507,896],{"class":247},[223,1509,899],{"class":237},[223,1511,261],{"class":229},[223,1513,264],{"class":237},[223,1515,1516,1518,1520,1522,1524,1526,1528,1530,1532,1534,1537,1539],{"class":225,"line":267},[223,1517,312],{"class":311},[223,1519,910],{"class":279},[223,1521,284],{"class":283},[223,1523,287],{"class":237},[223,1525,1102],{"class":290},[223,1527,287],{"class":237},[223,1529,922],{"class":283},[223,1531,925],{"class":233},[223,1533,317],{"class":237},[223,1535,1536],{"class":233},"body",[223,1538,258],{"class":283},[223,1540,298],{"class":237},[223,1542,1543,1545,1547],{"class":225,"line":301},[223,1544,944],{"class":237},[223,1546,258],{"class":233},[223,1548,298],{"class":237},[201,1550,1552],{"id":1551},"services-and-models","Services and Models",[179,1554,1555],{},"Services are a good place to interact with database models.",[213,1557,1560],{"className":215,"code":1558,"filename":1559,"language":218,"meta":219,"style":219},"type CreateCandidateInput = {\n  firstName: string;\n  lastName: string;\n  email: string;\n};\n\nconst createCandidate = async (input: CreateCandidateInput) => {\n  const Candidate = getModel('Candidate');\n\n  return Candidate.create({\n    firstName: input.firstName,\n    lastName: input.lastName,\n    email: input.email,\n  });\n};\n\nexport default defineService(createCandidate);\n","server\u002Fservices\u002Fcandidate\u002Fcreate.ts",[186,1561,1562,1573,1584,1595,1606,1610,1614,1639,1661,1665,1679,1695,1711,1727,1735,1739,1743],{"__ignoreMap":219},[223,1563,1564,1566,1569,1571],{"class":225,"line":226},[223,1565,376],{"class":229},[223,1567,1568],{"class":254}," CreateCandidateInput",[223,1570,276],{"class":237},[223,1572,264],{"class":237},[223,1574,1575,1578,1580,1582],{"class":225,"line":267},[223,1576,1577],{"class":283},"  firstName",[223,1579,251],{"class":237},[223,1581,255],{"class":254},[223,1583,298],{"class":237},[223,1585,1586,1589,1591,1593],{"class":225,"line":301},[223,1587,1588],{"class":283},"  lastName",[223,1590,251],{"class":237},[223,1592,255],{"class":254},[223,1594,298],{"class":237},[223,1596,1597,1600,1602,1604],{"class":225,"line":308},[223,1598,1599],{"class":283},"  email",[223,1601,251],{"class":237},[223,1603,255],{"class":254},[223,1605,298],{"class":237},[223,1607,1608],{"class":225,"line":331},[223,1609,334],{"class":237},[223,1611,1612],{"class":225,"line":337},[223,1613,305],{"emptyLinePlaceholder":304},[223,1615,1616,1618,1621,1623,1625,1627,1629,1631,1633,1635,1637],{"class":225,"line":342},[223,1617,230],{"class":229},[223,1619,1620],{"class":233}," createCandidate ",[223,1622,238],{"class":237},[223,1624,241],{"class":229},[223,1626,244],{"class":237},[223,1628,551],{"class":247},[223,1630,251],{"class":237},[223,1632,1568],{"class":254},[223,1634,258],{"class":237},[223,1636,261],{"class":229},[223,1638,264],{"class":237},[223,1640,1641,1643,1645,1647,1649,1651,1653,1655,1657,1659],{"class":225,"line":586},[223,1642,270],{"class":229},[223,1644,273],{"class":233},[223,1646,276],{"class":237},[223,1648,280],{"class":279},[223,1650,284],{"class":283},[223,1652,287],{"class":237},[223,1654,291],{"class":290},[223,1656,287],{"class":237},[223,1658,258],{"class":283},[223,1660,298],{"class":237},[223,1662,1663],{"class":225,"line":591},[223,1664,305],{"emptyLinePlaceholder":304},[223,1666,1667,1669,1671,1673,1675,1677],{"class":225,"line":608},[223,1668,312],{"class":311},[223,1670,273],{"class":233},[223,1672,317],{"class":237},[223,1674,1320],{"class":279},[223,1676,284],{"class":283},[223,1678,605],{"class":237},[223,1680,1681,1684,1686,1688,1690,1693],{"class":225,"line":661},[223,1682,1683],{"class":283},"    firstName",[223,1685,251],{"class":237},[223,1687,640],{"class":233},[223,1689,317],{"class":237},[223,1691,1692],{"class":233},"firstName",[223,1694,658],{"class":237},[223,1696,1697,1700,1702,1704,1706,1709],{"class":225,"line":675},[223,1698,1699],{"class":283},"    lastName",[223,1701,251],{"class":237},[223,1703,640],{"class":233},[223,1705,317],{"class":237},[223,1707,1708],{"class":233},"lastName",[223,1710,658],{"class":237},[223,1712,1713,1716,1718,1720,1722,1725],{"class":225,"line":683},[223,1714,1715],{"class":283},"    email",[223,1717,251],{"class":237},[223,1719,640],{"class":233},[223,1721,317],{"class":237},[223,1723,1724],{"class":233},"email",[223,1726,658],{"class":237},[223,1728,1729,1731,1733],{"class":225,"line":694},[223,1730,832],{"class":237},[223,1732,258],{"class":283},[223,1734,298],{"class":237},[223,1736,1737],{"class":225,"line":735},[223,1738,334],{"class":237},[223,1740,1741],{"class":225,"line":769},[223,1742,305],{"emptyLinePlaceholder":304},[223,1744,1745,1747,1749,1751,1754],{"class":225,"line":803},[223,1746,345],{"class":311},[223,1748,348],{"class":311},[223,1750,351],{"class":279},[223,1752,1753],{"class":233},"(createCandidate)",[223,1755,298],{"class":237},[179,1757,1758],{},"This keeps controllers focused on HTTP concerns and moves database logic into reusable services.",[201,1760,1762],{"id":1761},"services-calling-other-services","Services Calling Other Services",[179,1764,1765,1766,317],{},"Services can also call other services through ",[186,1767,870],{},[213,1769,1772],{"className":215,"code":1770,"filename":1771,"language":218,"meta":219,"style":219},"const archiveCandidate = async (candidateId: string) => {\n  const candidate = await useService('candidate.findById')(candidateId);\n\n  if (!candidate) {\n    throw new Error('Candidate not found');\n  }\n\n  candidate.archived = true;\n\n  return candidate.save();\n};\n\nexport default defineService(archiveCandidate);\n","server\u002Fservices\u002Fcandidate\u002Farchive.ts",[186,1773,1774,1799,1828,1832,1849,1872,1877,1881,1899,1903,1919,1923,1927],{"__ignoreMap":219},[223,1775,1776,1778,1781,1783,1785,1787,1789,1791,1793,1795,1797],{"class":225,"line":226},[223,1777,230],{"class":229},[223,1779,1780],{"class":233}," archiveCandidate ",[223,1782,238],{"class":237},[223,1784,241],{"class":229},[223,1786,244],{"class":237},[223,1788,248],{"class":247},[223,1790,251],{"class":237},[223,1792,255],{"class":254},[223,1794,258],{"class":237},[223,1796,261],{"class":229},[223,1798,264],{"class":237},[223,1800,1801,1803,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826],{"class":225,"line":267},[223,1802,270],{"class":229},[223,1804,1805],{"class":233}," candidate",[223,1807,276],{"class":237},[223,1809,1313],{"class":311},[223,1811,910],{"class":279},[223,1813,284],{"class":283},[223,1815,287],{"class":237},[223,1817,917],{"class":290},[223,1819,287],{"class":237},[223,1821,922],{"class":283},[223,1823,248],{"class":233},[223,1825,258],{"class":283},[223,1827,298],{"class":237},[223,1829,1830],{"class":225,"line":301},[223,1831,305],{"emptyLinePlaceholder":304},[223,1833,1834,1837,1839,1842,1845,1847],{"class":225,"line":308},[223,1835,1836],{"class":311},"  if",[223,1838,244],{"class":283},[223,1840,1841],{"class":237},"!",[223,1843,1844],{"class":233},"candidate",[223,1846,447],{"class":283},[223,1848,605],{"class":237},[223,1850,1851,1854,1856,1859,1861,1863,1866,1868,1870],{"class":225,"line":331},[223,1852,1853],{"class":311},"    throw",[223,1855,705],{"class":237},[223,1857,1858],{"class":279}," Error",[223,1860,284],{"class":283},[223,1862,287],{"class":237},[223,1864,1865],{"class":290},"Candidate not found",[223,1867,287],{"class":237},[223,1869,258],{"class":283},[223,1871,298],{"class":237},[223,1873,1874],{"class":225,"line":337},[223,1875,1876],{"class":237},"  }\n",[223,1878,1879],{"class":225,"line":342},[223,1880,305],{"emptyLinePlaceholder":304},[223,1882,1883,1886,1888,1891,1893,1897],{"class":225,"line":586},[223,1884,1885],{"class":233},"  candidate",[223,1887,317],{"class":237},[223,1889,1890],{"class":233},"archived",[223,1892,276],{"class":237},[223,1894,1896],{"class":1895},"sfNiH"," true",[223,1898,298],{"class":237},[223,1900,1901],{"class":225,"line":591},[223,1902,305],{"emptyLinePlaceholder":304},[223,1904,1905,1907,1909,1911,1914,1917],{"class":225,"line":608},[223,1906,312],{"class":311},[223,1908,1805],{"class":233},[223,1910,317],{"class":237},[223,1912,1913],{"class":279},"save",[223,1915,1916],{"class":283},"()",[223,1918,298],{"class":237},[223,1920,1921],{"class":225,"line":661},[223,1922,334],{"class":237},[223,1924,1925],{"class":225,"line":675},[223,1926,305],{"emptyLinePlaceholder":304},[223,1928,1929,1931,1933,1935,1938],{"class":225,"line":683},[223,1930,345],{"class":311},[223,1932,348],{"class":311},[223,1934,351],{"class":279},[223,1936,1937],{"class":233},"(archiveCandidate)",[223,1939,298],{"class":237},[194,1941,1944,1947],{"color":1942,"icon":1943},"warning","i-lucide-triangle-alert",[179,1945,1946],{},"Avoid circular service dependencies.",[179,1948,1949],{},"If two services depend on each other, consider extracting shared logic into a third service.",[201,1951,1953],{"id":1952},"runtime-discovery","Runtime Discovery",[179,1955,1956],{},"During startup, OpenSya automatically:",[1958,1959,1960,1964,1967,1970,1973],"ol",{},[1961,1962,1963],"li",{},"Discovers service files",[1961,1965,1966],{},"Infers service names from file paths",[1961,1968,1969],{},"Registers services in the runtime registry",[1961,1971,1972],{},"Generates typings",[1961,1974,1975,1976],{},"Makes services available through ",[186,1977,984],{},[213,1979,1982],{"className":954,"code":1980,"filename":1981,"language":957,"meta":219,"style":219},"Filesystem Discovery\n        ↓\nService Compilation\n        ↓\nService Registration\n        ↓\nType Generation\n        ↓\nRuntime Execution\n","Runtime Lifecycle",[186,1983,1984,1989,1994,1999,2003,2008,2012,2017,2021],{"__ignoreMap":219},[223,1985,1986],{"class":225,"line":226},[223,1987,1988],{},"Filesystem Discovery\n",[223,1990,1991],{"class":225,"line":267},[223,1992,1993],{},"        ↓\n",[223,1995,1996],{"class":225,"line":301},[223,1997,1998],{},"Service Compilation\n",[223,2000,2001],{"class":225,"line":308},[223,2002,1993],{},[223,2004,2005],{"class":225,"line":331},[223,2006,2007],{},"Service Registration\n",[223,2009,2010],{"class":225,"line":337},[223,2011,1993],{},[223,2013,2014],{"class":225,"line":342},[223,2015,2016],{},"Type Generation\n",[223,2018,2019],{"class":225,"line":586},[223,2020,1993],{},[223,2022,2023],{"class":225,"line":591},[223,2024,2025],{},"Runtime Execution\n",[201,2027,2029],{"id":2028},"best-practices","Best Practices",[179,2031,2032],{},"Keep services focused and reusable.",[179,2034,2035],{},"A service should usually represent one business action.",[179,2037,2038],{},"Good examples include:",[2040,2041,2042,2046,2050,2054,2058],"ul",{},[1961,2043,2044],{},[186,2045,1090],{},[1961,2047,2048],{},[186,2049,917],{},[1961,2051,2052],{},[186,2053,1078],{},[1961,2055,2056],{},[186,2057,1102],{},[1961,2059,2060],{},[186,2061,2062],{},"application.submit",[179,2064,2065],{},"Avoid putting HTTP-specific logic inside services.",[179,2067,2068],{},"Controllers should handle request input and response concerns, while services handle business behavior.",[194,2070,2072],{"color":977,"icon":2071},"i-lucide-code",[179,2073,2074,2075,2077,2078,2081],{},"Services should not depend on Express-specific objects such as ",[186,2076,925],{}," or ",[186,2079,2080],{},"res"," unless absolutely necessary.",[201,2083,2085],{"id":2084},"philosophy","Philosophy",[179,2087,2088],{},"Services are the business layer of the OpenSya backend runtime.",[179,2090,2091],{},"They make recruitment and business infrastructures easier to maintain by centralizing reusable logic and keeping controllers small.",[179,2093,2094],{},"Together with controllers, models and guards, services form the core execution layer of the generated NestJS runtime.",[2096,2097,2098],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":219,"searchDepth":226,"depth":267,"links":2100},[2101,2102,2103,2104,2105,2106,2107,2108,2109,2110],{"id":203,"depth":267,"text":204},{"id":362,"depth":267,"text":363},{"id":863,"depth":267,"text":864},{"id":987,"depth":267,"text":988},{"id":1105,"depth":267,"text":1106},{"id":1551,"depth":267,"text":1552},{"id":1761,"depth":267,"text":1762},{"id":1952,"depth":267,"text":1953},{"id":2028,"depth":267,"text":2029},{"id":2084,"depth":267,"text":2085},"Learn how to define reusable business logic with the OpenSya Nest runtime.","md",null,{},{"icon":86},{"title":83,"description":2111},"nzPaN7Q3qDHEEoKQTkhdKnILTL88k7ZEFdDkbKgOZeI",[2119,2121],{"title":78,"path":79,"stem":80,"description":2120,"icon":81,"children":-1},"Learn how to create runtime guards and access control rules in the OpenSya Nest runtime.",{"title":88,"path":89,"stem":90,"description":2122,"icon":91,"children":-1},"Learn how to add, override and use translations in the OpenSya Nest runtime.",1779143767266]