[{"data":1,"prerenderedAt":1184},["ShallowReactive",2],{"navigation_docs":3,"-getting-started":36,"-getting-started-surround":1181},[4,8,12,16,20,24,28,32],{"title":5,"path":6,"stem":7},"Getting started","\u002Fgetting-started","1.getting-started",{"title":9,"path":10,"stem":11},"Core concepts","\u002Fcore-concepts","2.core-concepts",{"title":13,"path":14,"stem":15},"Cross-cutting concerns","\u002Fcross-cutting","3.cross-cutting",{"title":17,"path":18,"stem":19},"Tenancy & RLS","\u002Ftenancy-and-rls","4.tenancy-and-rls",{"title":21,"path":22,"stem":23},"How the codegen works","\u002Fhow-the-codegen-works","5.how-the-codegen-works",{"title":25,"path":26,"stem":27},"vs. NestJS","\u002Fvs-nestjs","6.vs-nestjs",{"title":29,"path":30,"stem":31},"Before \u002F after","\u002Fbefore-after","7.before-after",{"title":33,"path":34,"stem":35},"Modules","\u002Fmodules","8.modules",{"id":37,"title":5,"body":38,"description":1175,"extension":1176,"links":1177,"meta":1178,"navigation":314,"path":6,"seo":1179,"stem":7,"__hash__":1180},"docs\u002F1.getting-started.md",{"type":39,"value":40,"toc":1168},"minimark",[41,69,74,100,165,181,185,203,467,669,684,688,772,800,819,823,830,1009,1024,1028,1164],[42,43,44,48,49,52,53,56,57,60,61,64,65,68],"note",{},[45,46,47],"strong",{},"nuxt-roost is a Nuxt module."," It targets ",[45,50,51],{},"Nuxt 3 \u002F 4"," and runs on its ",[45,54,55],{},"Nitro"," server. It\nalso works in a ",[45,58,59],{},"standalone Nitro"," app (no Nuxt) via the bundled Nitro module — see\n",[62,63,21],"a",{"href":22},". Requires ",[45,66,67],{},"Node 22+",".",[70,71,73],"h2",{"id":72},"install","Install",[75,76,81],"pre",{"className":77,"code":78,"language":79,"meta":80,"style":80},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add nuxt-roost\n","bash","",[82,83,84],"code",{"__ignoreMap":80},[85,86,89,93,97],"span",{"class":87,"line":88},"line",1,[85,90,92],{"class":91},"sBMFI","pnpm",[85,94,96],{"class":95},"sfazB"," add",[85,98,99],{"class":95}," nuxt-roost\n",[75,101,106],{"className":102,"code":103,"filename":104,"language":105,"meta":80,"style":80},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['nuxt-roost'],\n})\n","nuxt.config.ts","ts",[82,107,108,129,156],{"__ignoreMap":80},[85,109,110,114,117,121,125],{"class":87,"line":88},[85,111,113],{"class":112},"s7zQu","export",[85,115,116],{"class":112}," default",[85,118,120],{"class":119},"s2Zo4"," defineNuxtConfig",[85,122,124],{"class":123},"sTEyZ","(",[85,126,128],{"class":127},"sMK4o","{\n",[85,130,132,136,139,142,145,148,150,153],{"class":87,"line":131},2,[85,133,135],{"class":134},"swJcz","  modules",[85,137,138],{"class":127},":",[85,140,141],{"class":123}," [",[85,143,144],{"class":127},"'",[85,146,147],{"class":95},"nuxt-roost",[85,149,144],{"class":127},[85,151,152],{"class":123},"]",[85,154,155],{"class":127},",\n",[85,157,159,162],{"class":87,"line":158},3,[85,160,161],{"class":127},"}",[85,163,164],{"class":123},")\n",[166,167,168,169,172,173,176,177,180],"p",{},"That's the whole setup — ",[45,170,171],{},"no tsconfig changes needed",". roost's decorators are legacy\n(experimental) decorators, and the module turns on ",[82,174,175],{},"experimentalDecorators"," in every generated\ntsconfig for you, so controllers typecheck in the editor and under ",[82,178,179],{},"nuxi typecheck"," out of the box.",[70,182,184],{"id":183},"write-a-feature","Write a feature",[166,186,187,188,191,192,155,195,198,199,202],{},"Create a feature folder under ",[82,189,190],{},"server\u002Ffeatures\u002F"," (the name is auto-detected — ",[82,193,194],{},"features\u002F",[82,196,197],{},"nests\u002F",", or ",[82,200,201],{},"domain\u002F","). A feature is just a few decorated classes:",[75,204,207],{"className":102,"code":205,"filename":206,"language":105,"meta":80,"style":80},"\u002F\u002F Injectable, Scoped, RequestContext — all auto-imported, no import line needed.\n@Injectable() \u002F\u002F SINGLETON — the shared store \u002F connection pool\nexport class ProjectStore {\n  readonly rows = new Map\u003Cstring, { id: string; name: string }[]>()\n}\n\n@Scoped() \u002F\u002F tenant-bound, per request (shorthand for @Injectable({ scope: 'scoped' }))\nexport class ProjectsRepo {\n  constructor(\n    private readonly store: ProjectStore,\n    private readonly ctx: RequestContext,\n  ) {}\n  all() {\n    return this.store.rows.get(this.ctx.tenantId) ?? []\n  }\n  \u002F\u002F ...\n}\n","server\u002Ffeatures\u002Fprojects\u002Fprojects.repo.ts",[82,208,209,215,229,243,303,309,316,329,341,350,369,386,395,406,450,456,462],{"__ignoreMap":80},[85,210,211],{"class":87,"line":88},[85,212,214],{"class":213},"sHwdD","\u002F\u002F Injectable, Scoped, RequestContext — all auto-imported, no import line needed.\n",[85,216,217,220,223,226],{"class":87,"line":131},[85,218,219],{"class":127},"@",[85,221,222],{"class":119},"Injectable",[85,224,225],{"class":123},"() ",[85,227,228],{"class":213},"\u002F\u002F SINGLETON — the shared store \u002F connection pool\n",[85,230,231,233,237,240],{"class":87,"line":158},[85,232,113],{"class":112},[85,234,236],{"class":235},"spNyl"," class",[85,238,239],{"class":91}," ProjectStore",[85,241,242],{"class":127}," {\n",[85,244,246,249,252,255,258,261,264,267,270,273,276,278,281,284,287,289,291,294,297,300],{"class":87,"line":245},4,[85,247,248],{"class":235},"  readonly",[85,250,251],{"class":134}," rows",[85,253,254],{"class":127}," =",[85,256,257],{"class":127}," new",[85,259,260],{"class":134}," Map",[85,262,263],{"class":127},"\u003C",[85,265,266],{"class":91},"string",[85,268,269],{"class":127},",",[85,271,272],{"class":127}," {",[85,274,275],{"class":134}," id",[85,277,138],{"class":127},[85,279,280],{"class":91}," string",[85,282,283],{"class":127},";",[85,285,286],{"class":134}," name",[85,288,138],{"class":127},[85,290,280],{"class":91},[85,292,293],{"class":127}," }",[85,295,296],{"class":123},"[]",[85,298,299],{"class":127},">",[85,301,302],{"class":123},"()\n",[85,304,306],{"class":87,"line":305},5,[85,307,308],{"class":127},"}\n",[85,310,312],{"class":87,"line":311},6,[85,313,315],{"emptyLinePlaceholder":314},true,"\n",[85,317,319,321,324,326],{"class":87,"line":318},7,[85,320,219],{"class":127},[85,322,323],{"class":119},"Scoped",[85,325,225],{"class":123},[85,327,328],{"class":213},"\u002F\u002F tenant-bound, per request (shorthand for @Injectable({ scope: 'scoped' }))\n",[85,330,332,334,336,339],{"class":87,"line":331},8,[85,333,113],{"class":112},[85,335,236],{"class":235},[85,337,338],{"class":91}," ProjectsRepo",[85,340,242],{"class":127},[85,342,344,347],{"class":87,"line":343},9,[85,345,346],{"class":235},"  constructor",[85,348,349],{"class":127},"(\n",[85,351,353,356,359,363,365,367],{"class":87,"line":352},10,[85,354,355],{"class":235},"    private",[85,357,358],{"class":235}," readonly",[85,360,362],{"class":361},"sHdIc"," store",[85,364,138],{"class":127},[85,366,239],{"class":91},[85,368,155],{"class":127},[85,370,372,374,376,379,381,384],{"class":87,"line":371},11,[85,373,355],{"class":235},[85,375,358],{"class":235},[85,377,378],{"class":361}," ctx",[85,380,138],{"class":127},[85,382,383],{"class":91}," RequestContext",[85,385,155],{"class":127},[85,387,389,392],{"class":87,"line":388},12,[85,390,391],{"class":127},"  )",[85,393,394],{"class":127}," {}\n",[85,396,398,401,404],{"class":87,"line":397},13,[85,399,400],{"class":134},"  all",[85,402,403],{"class":127},"()",[85,405,242],{"class":127},[85,407,409,412,415,418,420,423,425,428,430,433,436,438,441,444,447],{"class":87,"line":408},14,[85,410,411],{"class":112},"    return",[85,413,414],{"class":127}," this.",[85,416,417],{"class":123},"store",[85,419,68],{"class":127},[85,421,422],{"class":123},"rows",[85,424,68],{"class":127},[85,426,427],{"class":119},"get",[85,429,124],{"class":134},[85,431,432],{"class":127},"this.",[85,434,435],{"class":123},"ctx",[85,437,68],{"class":127},[85,439,440],{"class":123},"tenantId",[85,442,443],{"class":134},") ",[85,445,446],{"class":127},"??",[85,448,449],{"class":134}," []\n",[85,451,453],{"class":87,"line":452},15,[85,454,455],{"class":127},"  }\n",[85,457,459],{"class":87,"line":458},16,[85,460,461],{"class":213},"  \u002F\u002F ...\n",[85,463,465],{"class":87,"line":464},17,[85,466,308],{"class":127},[75,468,471],{"className":102,"code":469,"filename":470,"language":105,"meta":80,"style":80},"import { ProjectsService } from '.\u002Fprojects.service'\n\n\u002F\u002F No `nuxt-roost\u002Fruntime` import — Controller, Get, Param, Body (and the rest) are auto-imported.\n@Controller() \u002F\u002F path defaults to the feature folder → \u002Fprojects\nexport class ProjectsController {\n  constructor(private readonly projects: ProjectsService) {}\n\n  @Get()\n  list() {\n    return this.projects.list()\n  }\n\n  @Get(':id')\n  get(@Param() id: string) {\n    return this.projects.get(id) \u002F\u002F route params injected as arguments, Nest-style\n  }\n}\n","server\u002Ffeatures\u002Fprojects\u002Fprojects.controller.ts",[82,472,473,497,501,506,518,529,552,556,566,575,591,595,599,616,640,661,665],{"__ignoreMap":80},[85,474,475,478,480,483,485,488,491,494],{"class":87,"line":88},[85,476,477],{"class":112},"import",[85,479,272],{"class":127},[85,481,482],{"class":123}," ProjectsService",[85,484,293],{"class":127},[85,486,487],{"class":112}," from",[85,489,490],{"class":127}," '",[85,492,493],{"class":95},".\u002Fprojects.service",[85,495,496],{"class":127},"'\n",[85,498,499],{"class":87,"line":131},[85,500,315],{"emptyLinePlaceholder":314},[85,502,503],{"class":87,"line":158},[85,504,505],{"class":213},"\u002F\u002F No `nuxt-roost\u002Fruntime` import — Controller, Get, Param, Body (and the rest) are auto-imported.\n",[85,507,508,510,513,515],{"class":87,"line":245},[85,509,219],{"class":127},[85,511,512],{"class":119},"Controller",[85,514,225],{"class":123},[85,516,517],{"class":213},"\u002F\u002F path defaults to the feature folder → \u002Fprojects\n",[85,519,520,522,524,527],{"class":87,"line":305},[85,521,113],{"class":112},[85,523,236],{"class":235},[85,525,526],{"class":91}," ProjectsController",[85,528,242],{"class":127},[85,530,531,533,535,538,540,543,545,547,550],{"class":87,"line":311},[85,532,346],{"class":235},[85,534,124],{"class":127},[85,536,537],{"class":235},"private",[85,539,358],{"class":235},[85,541,542],{"class":361}," projects",[85,544,138],{"class":127},[85,546,482],{"class":91},[85,548,549],{"class":127},")",[85,551,394],{"class":127},[85,553,554],{"class":87,"line":318},[85,555,315],{"emptyLinePlaceholder":314},[85,557,558,561,564],{"class":87,"line":331},[85,559,560],{"class":127},"  @",[85,562,563],{"class":119},"Get",[85,565,302],{"class":123},[85,567,568,571,573],{"class":87,"line":343},[85,569,570],{"class":134},"  list",[85,572,403],{"class":127},[85,574,242],{"class":127},[85,576,577,579,581,584,586,589],{"class":87,"line":352},[85,578,411],{"class":112},[85,580,414],{"class":127},[85,582,583],{"class":123},"projects",[85,585,68],{"class":127},[85,587,588],{"class":119},"list",[85,590,302],{"class":134},[85,592,593],{"class":87,"line":371},[85,594,455],{"class":127},[85,596,597],{"class":87,"line":388},[85,598,315],{"emptyLinePlaceholder":314},[85,600,601,603,605,607,609,612,614],{"class":87,"line":397},[85,602,560],{"class":127},[85,604,563],{"class":119},[85,606,124],{"class":123},[85,608,144],{"class":127},[85,610,611],{"class":95},":id",[85,613,144],{"class":127},[85,615,164],{"class":123},[85,617,618,621,624,627,629,632,634,636,638],{"class":87,"line":408},[85,619,620],{"class":134},"  get",[85,622,623],{"class":127},"(@",[85,625,626],{"class":119},"Param",[85,628,225],{"class":123},[85,630,631],{"class":361},"id",[85,633,138],{"class":127},[85,635,280],{"class":91},[85,637,549],{"class":127},[85,639,242],{"class":127},[85,641,642,644,646,648,650,652,654,656,658],{"class":87,"line":452},[85,643,411],{"class":112},[85,645,414],{"class":127},[85,647,583],{"class":123},[85,649,68],{"class":127},[85,651,427],{"class":119},[85,653,124],{"class":134},[85,655,631],{"class":123},[85,657,443],{"class":134},[85,659,660],{"class":213},"\u002F\u002F route params injected as arguments, Nest-style\n",[85,662,663],{"class":87,"line":458},[85,664,455],{"class":127},[85,666,667],{"class":87,"line":464},[85,668,308],{"class":127},[166,670,671,672,675,676,679,680,683],{},"Run ",[82,673,674],{},"nuxt dev",". roost runs the codegen, writes the route delegates + the DI manifest into a\ngitignored ",[82,677,678],{},".roost\u002F",", and Nitro serves ",[82,681,682],{},"GET \u002Fapi\u002Fprojects",". Edit a controller and it hot-reloads.",[70,685,687],{"id":686},"auto-imports","Auto-imports",[166,689,690,693,694,155,696,698,699,698,702,698,705,708,709,698,711,698,713,155,716,698,719,698,722,725,726,698,729,698,731,698,734,737,738,741,742,698,745,698,748,698,751,754,755,757,758,761,762,761,765,761,768,771],{},[45,691,692],{},"roost's decorators + types"," are auto-imported into server code: ",[82,695,512],{},[82,697,563],{},"\u002F",[82,700,701],{},"Post",[82,703,704],{},"Put",[82,706,707],{},"Delete",", ",[82,710,222],{},[82,712,323],{},[82,714,715],{},"Transient",[82,717,718],{},"UseGuards",[82,720,721],{},"UseInterceptors",[82,723,724],{},"UseFilters",", the param-injection decorators\n",[82,727,728],{},"Body",[82,730,626],{},[82,732,733],{},"Query",[82,735,736],{},"Ctx",", the method-level ",[82,739,740],{},"ValidateBody",", the pipe helpers\n(",[82,743,744],{},"ParseInt",[82,746,747],{},"ParseBool",[82,749,750],{},"ParseUUID",[82,752,753],{},"DefaultValue","\u002F…), the prebuilt HTTP exceptions, and the ",[82,756,736],{}," \u002F\n",[82,759,760],{},"RequestContext"," \u002F ",[82,763,764],{},"RoostGuard",[82,766,767],{},"RoostInterceptor",[82,769,770],{},"RoostFilter"," types.",[166,773,774,777,778,781,782,708,785,788,789,792,793,796,797,68],{},[45,775,776],{},"Your own feature pieces"," are auto-imported too — every export under the feature dir (guards,\nservices, repos, DTO schemas + types) is available without an import, the same way Nuxt\nauto-imports ",[82,779,780],{},"server\u002Futils\u002F",". So a controller can reference ",[82,783,784],{},"MemberGuard",[82,786,787],{},"ProjectsService",",\nthe ",[82,790,791],{},"createProjectSchema"," zod schema, and the ",[82,794,795],{},"CreateProjectDto"," type with ",[45,798,799],{},"no import line at all",[42,801,802,803,806,807,810,811,814,815,818],{},"The feature dir is a ",[45,804,805],{},"flat auto-import namespace",": keep exported names unique across features,\nand avoid names that shadow a TS lib global — so the playground suffixes its entity ",[82,808,809],{},"ProjectRecord","\nto keep it distinct from DTOs and helpers. (Provider\nclass names must already be unique for the DI container, so the main risk is duplicate DTO\u002Fhelper\nnames.) On a collision the last one wins. To turn off just the feature-dir auto-imports, set\n",[82,812,813],{},"roost: { autoImportFeatures: false }"," and import your own pieces explicitly; roost's own\ndecorators stay auto-imported (disable everything with ",[82,816,817],{},"nitro: { imports: false }",").",[70,820,822],{"id":821},"what-got-generated","What got generated",[166,824,825,826,829],{},"Open ",[82,827,828],{},".roost\u002Fmanifest.json"," — a route table with every route's full effective chain:",[75,831,835],{"className":832,"code":833,"language":834,"meta":80,"style":80},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"featureRoot\": \"server\u002Ffeatures\",\n  \"routes\": [\n    {\n      \"method\": \"GET\",\n      \"path\": \"\u002Fapi\u002Fprojects\",\n      \"handler\": \"ProjectsController.list\",\n      \"guards\": [],\n      \"filters\": [\"defaultErrorFilter (built-in)\"],\n      \"body\": null\n    }\n  ]\n}\n","json",[82,836,837,841,864,878,883,904,924,944,958,981,995,1000,1005],{"__ignoreMap":80},[85,838,839],{"class":87,"line":88},[85,840,128],{"class":127},[85,842,843,846,849,852,854,857,860,862],{"class":87,"line":131},[85,844,845],{"class":127},"  \"",[85,847,848],{"class":235},"featureRoot",[85,850,851],{"class":127},"\"",[85,853,138],{"class":127},[85,855,856],{"class":127}," \"",[85,858,859],{"class":95},"server\u002Ffeatures",[85,861,851],{"class":127},[85,863,155],{"class":127},[85,865,866,868,871,873,875],{"class":87,"line":158},[85,867,845],{"class":127},[85,869,870],{"class":235},"routes",[85,872,851],{"class":127},[85,874,138],{"class":127},[85,876,877],{"class":127}," [\n",[85,879,880],{"class":87,"line":245},[85,881,882],{"class":127},"    {\n",[85,884,885,888,891,893,895,897,900,902],{"class":87,"line":305},[85,886,887],{"class":127},"      \"",[85,889,890],{"class":91},"method",[85,892,851],{"class":127},[85,894,138],{"class":127},[85,896,856],{"class":127},[85,898,899],{"class":95},"GET",[85,901,851],{"class":127},[85,903,155],{"class":127},[85,905,906,908,911,913,915,917,920,922],{"class":87,"line":311},[85,907,887],{"class":127},[85,909,910],{"class":91},"path",[85,912,851],{"class":127},[85,914,138],{"class":127},[85,916,856],{"class":127},[85,918,919],{"class":95},"\u002Fapi\u002Fprojects",[85,921,851],{"class":127},[85,923,155],{"class":127},[85,925,926,928,931,933,935,937,940,942],{"class":87,"line":318},[85,927,887],{"class":127},[85,929,930],{"class":91},"handler",[85,932,851],{"class":127},[85,934,138],{"class":127},[85,936,856],{"class":127},[85,938,939],{"class":95},"ProjectsController.list",[85,941,851],{"class":127},[85,943,155],{"class":127},[85,945,946,948,951,953,955],{"class":87,"line":331},[85,947,887],{"class":127},[85,949,950],{"class":91},"guards",[85,952,851],{"class":127},[85,954,138],{"class":127},[85,956,957],{"class":127}," [],\n",[85,959,960,962,965,967,969,971,973,976,978],{"class":87,"line":343},[85,961,887],{"class":127},[85,963,964],{"class":91},"filters",[85,966,851],{"class":127},[85,968,138],{"class":127},[85,970,141],{"class":127},[85,972,851],{"class":127},[85,974,975],{"class":95},"defaultErrorFilter (built-in)",[85,977,851],{"class":127},[85,979,980],{"class":127},"],\n",[85,982,983,985,988,990,992],{"class":87,"line":352},[85,984,887],{"class":127},[85,986,987],{"class":91},"body",[85,989,851],{"class":127},[85,991,138],{"class":127},[85,993,994],{"class":127}," null\n",[85,996,997],{"class":87,"line":371},[85,998,999],{"class":127},"    }\n",[85,1001,1002],{"class":87,"line":388},[85,1003,1004],{"class":127},"  ]\n",[85,1006,1007],{"class":87,"line":397},[85,1008,308],{"class":127},[166,1010,1011,1012,1015,1016,1019,1020,1023],{},"The route delegates (",[82,1013,1014],{},".roost\u002Fapi\u002F**",") and the DI manifest (",[82,1017,1018],{},".roost\u002Fdi.generated.ts",") are ",[45,1021,1022],{},"real,\nopenable files"," — nothing is virtual or hidden.",[70,1025,1027],{"id":1026},"module-options","Module options",[75,1029,1031],{"className":102,"code":1030,"filename":104,"language":105,"meta":80,"style":80},"export default defineNuxtConfig({\n  modules: ['nuxt-roost'],\n  roost: {\n    featuresDir: 'features', \u002F\u002F override auto-detection\n    globals: { interceptors: ['auditInterceptor'] }, \u002F\u002F applied to every route\n    logRoutes: true, \u002F\u002F print the route table on boot\n    autoImportFeatures: true, \u002F\u002F auto-import your feature pieces (default true; false → import them yourself)\n  },\n})\n",[82,1032,1033,1045,1063,1072,1091,1123,1139,1153,1158],{"__ignoreMap":80},[85,1034,1035,1037,1039,1041,1043],{"class":87,"line":88},[85,1036,113],{"class":112},[85,1038,116],{"class":112},[85,1040,120],{"class":119},[85,1042,124],{"class":123},[85,1044,128],{"class":127},[85,1046,1047,1049,1051,1053,1055,1057,1059,1061],{"class":87,"line":131},[85,1048,135],{"class":134},[85,1050,138],{"class":127},[85,1052,141],{"class":123},[85,1054,144],{"class":127},[85,1056,147],{"class":95},[85,1058,144],{"class":127},[85,1060,152],{"class":123},[85,1062,155],{"class":127},[85,1064,1065,1068,1070],{"class":87,"line":158},[85,1066,1067],{"class":134},"  roost",[85,1069,138],{"class":127},[85,1071,242],{"class":127},[85,1073,1074,1077,1079,1081,1084,1086,1088],{"class":87,"line":245},[85,1075,1076],{"class":134},"    featuresDir",[85,1078,138],{"class":127},[85,1080,490],{"class":127},[85,1082,1083],{"class":95},"features",[85,1085,144],{"class":127},[85,1087,269],{"class":127},[85,1089,1090],{"class":213}," \u002F\u002F override auto-detection\n",[85,1092,1093,1096,1098,1100,1103,1105,1107,1109,1112,1114,1117,1120],{"class":87,"line":305},[85,1094,1095],{"class":134},"    globals",[85,1097,138],{"class":127},[85,1099,272],{"class":127},[85,1101,1102],{"class":134}," interceptors",[85,1104,138],{"class":127},[85,1106,141],{"class":123},[85,1108,144],{"class":127},[85,1110,1111],{"class":95},"auditInterceptor",[85,1113,144],{"class":127},[85,1115,1116],{"class":123},"] ",[85,1118,1119],{"class":127},"},",[85,1121,1122],{"class":213}," \u002F\u002F applied to every route\n",[85,1124,1125,1128,1130,1134,1136],{"class":87,"line":311},[85,1126,1127],{"class":134},"    logRoutes",[85,1129,138],{"class":127},[85,1131,1133],{"class":1132},"sfNiH"," true",[85,1135,269],{"class":127},[85,1137,1138],{"class":213}," \u002F\u002F print the route table on boot\n",[85,1140,1141,1144,1146,1148,1150],{"class":87,"line":318},[85,1142,1143],{"class":134},"    autoImportFeatures",[85,1145,138],{"class":127},[85,1147,1133],{"class":1132},[85,1149,269],{"class":127},[85,1151,1152],{"class":213}," \u002F\u002F auto-import your feature pieces (default true; false → import them yourself)\n",[85,1154,1155],{"class":87,"line":331},[85,1156,1157],{"class":127},"  },\n",[85,1159,1160,1162],{"class":87,"line":343},[85,1161,161],{"class":127},[85,1163,164],{"class":123},[1165,1166,1167],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":80,"searchDepth":131,"depth":131,"links":1169},[1170,1171,1172,1173,1174],{"id":72,"depth":131,"text":73},{"id":183,"depth":131,"text":184},{"id":686,"depth":131,"text":687},{"id":821,"depth":131,"text":822},{"id":1026,"depth":131,"text":1027},"Install nuxt-roost and write your first decorated controller.","md",null,{},{"title":5,"description":1175},"iS3pE9TZXr31Bgbv2MNdpZDcrS82R0yohVP4jXrTIuc",[1177,1182],{"title":9,"path":10,"stem":11,"description":1183,"children":-1},"Decorators as build-time annotations, awilix DI, and the two generated artifacts.",1780506501961]