[{"data":1,"prerenderedAt":503},["ShallowReactive",2],{"navigation_docs":3,"-vs-nestjs":36,"-vs-nestjs-surround":498},[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":25,"body":38,"description":491,"extension":492,"links":493,"meta":494,"navigation":495,"path":26,"seo":496,"stem":27,"__hash__":497},"docs\u002F6.vs-nestjs.md",{"type":39,"value":40,"toc":483},"minimark",[41,50,55,161,164,168,403,407,464,468],[42,43,44,45,49],"p",{},"roost borrows NestJS's ",[46,47,48],"em",{},"authoring"," model — decorated controllers, DI, guards\u002Finterceptors\u002Ffilters —\nand almost nothing of its runtime. It's a Nitro-native take, not a port.",[51,52,54],"h2",{"id":53},"the-big-difference-no-runtime-reflection","The big difference: no runtime reflection",[56,57,58,73],"table",{},[59,60,61],"thead",{},[62,63,64,67,70],"tr",{},[65,66],"th",{},[65,68,69],{},"NestJS",[65,71,72],{},"nuxt-roost",[74,75,76,105,123,136,150],"tbody",{},[62,77,78,82,99],{},[79,80,81],"td",{},"Reads constructor types",[79,83,84,85,89,90,94,95,98],{},"at ",[86,87,88],"strong",{},"runtime"," (",[91,92,93],"code",{},"reflect-metadata"," + ",[91,96,97],{},"design:paramtypes",")",[79,100,84,101,104],{},[86,102,103],{},"build time"," (ts-morph AST)",[62,106,107,110,113],{},[79,108,109],{},"Composition root",[79,111,112],{},"built at runtime by the IoC container",[79,114,115,118,119,122],{},[86,116,117],{},"generated"," as plain ",[91,120,121],{},"asFunction"," factories",[62,124,125,128,131],{},[79,126,127],{},"Decorators at runtime",[79,129,130],{},"inspected",[79,132,133],{},[86,134,135],{},"no-ops",[62,137,138,141,144],{},[79,139,140],{},"Router",[79,142,143],{},"NestJS's own",[79,145,146,149],{},[86,147,148],{},"Nitro's file-based router"," (generated delegates)",[62,151,152,155,158],{},[79,153,154],{},"Edge bundle weight",[79,156,157],{},"the NestJS runtime + reflect-metadata",[79,159,160],{},"the runtime only — ts-morph never ships",[42,162,163],{},"NestJS's reflection is powerful but couples you to its runtime and a metadata polyfill. roost moves\nthe same information to build time, so the edge story is \"just Nitro.\"",[51,165,167],{"id":166},"what-maps-over","What maps over",[56,169,170,179],{},[59,171,172],{},[62,173,174,176],{},[65,175,69],{},[65,177,178],{},"roost",[74,180,181,198,225,236,253,272,295,327,389],{},[62,182,183,195],{},[79,184,185,188,189,188,192],{},[91,186,187],{},"@Controller"," \u002F ",[91,190,191],{},"@Get",[91,193,194],{},"@Post",[79,196,197],{},"same",[62,199,200,209],{},[79,201,202,205,206],{},[91,203,204],{},"@Injectable()"," + constructor injection, lifetimes via ",[91,207,208],{},"{ scope }",[79,210,211,212,188,215,218,219,221,222,224],{},"same — plus ",[91,213,214],{},"@Scoped()",[91,216,217],{},"@Transient()"," shortcuts (",[91,220,204],{}," → SINGLETON, ",[91,223,187],{}," → SCOPED)",[62,226,227,233],{},[79,228,229,232],{},[91,230,231],{},"@UseGuards"," (class + method)",[79,234,235],{},"same — DI'd guards, merged",[62,237,238,250],{},[79,239,240,89,243,246,247,98],{},[91,241,242],{},"@UseInterceptors",[91,244,245],{},"intercept","\u002F",[91,248,249],{},"next",[79,251,252],{},"same — DI'd interceptors",[62,254,255,258],{},[79,256,257],{},"Exception filters",[79,259,260,263,264,267,268,271],{},[91,261,262],{},"@UseFilters"," — DI'd, ",[86,265,266],{},"self-inspecting"," (no ",[91,269,270],{},"@Catch(Type)"," yet)",[62,273,274,285],{},[79,275,276,277,280,281,284],{},"Built-in HTTP exceptions (",[91,278,279],{},"NotFoundException",", ",[91,282,283],{},"ForbiddenException",", …)",[79,286,287,288,291,292,98],{},"same names, ",[91,289,290],{},"extend HttpError","; mapped by the built-in fallback (over h3, not ",[91,293,294],{},"HttpException",[62,296,297,312],{},[79,298,299,188,302,188,305,188,308,311],{},[91,300,301],{},"@Body()",[91,303,304],{},"@Param()",[91,306,307],{},"@Query()",[91,309,310],{},"@Req()"," param injection",[79,313,314,188,317,188,320,188,323,326],{},[91,315,316],{},"@Body(schema)",[91,318,319],{},"@Param('id', schema?)",[91,321,322],{},"@Query(schema)",[91,324,325],{},"@Ctx"," — same shape; the schema\u002Fpipe rides on the decorator (no reflect-metadata to read the type)",[62,328,329,353],{},[79,330,331,332,188,335,188,338,188,341,188,344,188,347,188,350],{},"Pipes — ",[91,333,334],{},"ParseIntPipe",[91,336,337],{},"ParseBoolPipe",[91,339,340],{},"ParseUUIDPipe",[91,342,343],{},"DefaultValuePipe",[91,345,346],{},"ParseArrayPipe",[91,348,349],{},"ParseEnumPipe",[91,351,352],{},"ValidationPipe",[79,354,355,356,359,360,188,363,188,366,188,369,188,372,188,375,378,379,188,382,188,385,388],{},"a ",[86,357,358],{},"zod schema"," is the pipe: ",[91,361,362],{},"ParseInt",[91,364,365],{},"ParseBool",[91,367,368],{},"ParseUUID",[91,370,371],{},"DefaultValue",[91,373,374],{},"ParseArray",[91,376,377],{},"ParseEnum"," helpers (auto-imported), on ",[91,380,381],{},"@Param('id', …)",[91,383,384],{},"@Query('key', …)",[91,386,387],{},"@Body",". One chained schema instead of a pipe list",[62,390,391,397],{},[79,392,393,394,98],{},"Global guards\u002Finterceptors\u002Ffilters (",[91,395,396],{},"APP_*",[79,398,399,402],{},[91,400,401],{},"roost.globals"," config",[51,404,406],{"id":405},"whats-different-on-purpose","What's different on purpose",[408,409,410,424,430,455],"ul",{},[411,412,413,416,417,419,420,423],"li",{},[86,414,415],{},"Filters self-inspect"," rather than using a ",[91,418,270],{}," registry — DI without a matching\nengine. A ",[91,421,422],{},"@Catch"," decorator is a planned level-2 add.",[411,425,426,429],{},[86,427,428],{},"Cross-cutting concerns reference tokens",", resolved per request, instead of provider instances\nthreaded through a module system.",[411,431,432,440,441,443,444,446,447,450,451,454],{},[86,433,434,436,437,439],{},[91,435,301],{}," carries the schema, and a bare ",[91,438,301],{}," is a build error."," Nest's bare ",[91,442,301],{},"\ninjects and a global pipe validates — two jobs in one decorator. roost can't reflect the type into\na validator, so the schema is explicit (",[91,445,316],{},"); requiring it means injection never\n",[46,448,449],{},"silently"," skips validation. ",[91,452,453],{},"@Body(null)"," is the explicit \"raw, no validation\" escape hatch.",[411,456,457,463],{},[86,458,459,460],{},"No ",[91,461,462],{},"@Module"," (yet) — features are folders; the composition root is generated whole.",[51,465,467],{"id":466},"what-roost-is-not","What roost is not",[42,469,470,471,473,474,477,478,482],{},"It's not a full framework. There's no built-in ",[91,472,462],{}," graph, no microservices transport, no\nGraphQL layer. It's an ",[86,475,476],{},"ergonomics layer"," over Nitro + awilix: the same structure you'd build by\nhand (see ",[479,480,481],"a",{"href":30},"before \u002F after","), generated from decorators instead of hand-maintained.\nIf you need NestJS's full runtime, use NestJS. If you're on Nitro\u002FNuxt and want the authoring nicety\nwithout the reflection, that's roost.",{"title":484,"searchDepth":485,"depth":485,"links":486},"",2,[487,488,489,490],{"id":53,"depth":485,"text":54},{"id":166,"depth":485,"text":167},{"id":405,"depth":485,"text":406},{"id":466,"depth":485,"text":467},"What's the same, what's deliberately different, and what roost is not.","md",null,{},true,{"title":25,"description":491},"Fo4xRCtGlEcD-FL09Ew853W8KQbwdZIWYzckOlq8YqQ",[499,501],{"title":21,"path":22,"stem":23,"description":500,"children":-1},"The build-time AST pass — what it reads, what it emits, and the dev-watch loop.",{"title":29,"path":30,"stem":31,"description":502,"children":-1},"The same feature hand-wired in plain Nitro vs. with roost — proven identical in behavior.",1780506501961]