@nest-arch/tui 0.1.47 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/constants-BbJ71cex.js +1 -0
  3. package/dist/index.js +120 -1
  4. package/dist/templates/base/.gitignore.hbs +3 -0
  5. package/dist/templates/base/README.md.hbs +119 -6
  6. package/dist/templates/base/pnpm-workspace.yaml.hbs +3 -0
  7. package/dist/templates/base/src/app.controller.ts.hbs +10 -0
  8. package/dist/templates/base/src/app.module.ts.hbs +33 -4
  9. package/dist/templates/base/src/app.router.spec.ts.hbs +58 -0
  10. package/dist/templates/base/src/app.router.ts.hbs +26 -0
  11. package/dist/templates/base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs +3 -3
  12. package/dist/templates/base/src/libs/middlewares/auth.trpc.middleware.ts.hbs +42 -0
  13. package/dist/templates/base/src/libs/trpc/context.ts.hbs +13 -0
  14. package/dist/templates/base/src/libs/trpc/error.handler.ts.hbs +10 -0
  15. package/dist/templates/base/src/libs/trpc/inner.context.ts.hbs +7 -0
  16. package/dist/templates/base/src/libs/trpc/protected.ts.hbs +12 -0
  17. package/dist/templates/base/src/libs/trpc/scripts/fix-trpc-generated.mjs.hbs +21 -0
  18. package/dist/templates/base/src/libs/trpc/scripts/watch-trpc.mjs.hbs +91 -0
  19. package/dist/templates/base/src/main.ts.hbs +74 -1
  20. package/dist/templates/extras/swagger/create-docs.ts.hbs +232 -0
  21. package/dist/templates/monorepo/apps/api-gateway/src/app.controller.ts.hbs +10 -0
  22. package/dist/templates/monorepo/apps/api-gateway/src/app.module.ts.hbs +26 -1
  23. package/dist/templates/monorepo/apps/api-gateway/src/main.ts.hbs +73 -0
  24. package/dist/templates/monorepo/root/pnpm-workspace.yaml.hbs +3 -0
  25. package/dist/templates/single-project/architecture/nest-api/pnpm-workspace.yaml.hbs +3 -0
  26. package/dist/templates/single-project/architecture/nest-api/src/main.ts.hbs +73 -0
  27. package/dist/templates/single-project/architecture/nest-gateway/src/main.ts.hbs +73 -0
  28. package/dist/templates/single-project/architecture/nest-microservice/src/main.ts.hbs +74 -0
  29. package/package.json +2 -2
  30. package/dist/index-CKkM9bux.js +0 -117
  31. package/dist/index-deeDdMp1.js +0 -4
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import"./index-CKkM9bux.js";import"react/jsx-runtime";import"ink";import"react";import"ink-text-input";import"@t3-oss/env-nextjs";import"zod";import"node:fs";import"node:os";import"node:path";import"node:fs/promises";import"handlebars";import"node:child_process";import"node:util";import"ts-morph";import"node:events";import"open";
2
+ const e=new Set(["-v","--v","--version"]);if(process.argv[2]&&e.has(process.argv[2])){const{APP_VERSION:s}=await import("./constants-BbJ71cex.js");console.log(`nest-arch/${s.replace(/^v/u,"")}`),process.exit(0)}await import("./index.js");
@@ -0,0 +1 @@
1
+ const O="Nest Arch",A="v0.2.0",t="The comfy way to build NestJS projects",o="#e54545",R="#A0A0A0",c="#6B6B6B",s="#E5E5E5",C="#61AFEF",E="#3A3A3A",_="#7FD99A",n="#E8C468",L="#e96142ff";export{O as APP_NAME,t as APP_TAGLINE,A as APP_VERSION,C as COLOR_ACCENT,R as COLOR_DIM,c as COLOR_DIMMER,E as COLOR_DIVIDER,s as COLOR_FG,o as COLOR_RED,_ as COLOR_SUCCESS,n as COLOR_WARM,L as COLOR_WARM_SECONDARY};
package/dist/index.js CHANGED
@@ -1 +1,120 @@
1
- import"react/jsx-runtime";import"ink";import"react";import"./index-CKkM9bux.js";import"ink-text-input";import"@t3-oss/env-nextjs";import"zod";import"node:fs";import"node:os";import"node:path";import"node:fs/promises";import"handlebars";import"node:child_process";import"node:util";import"ts-morph";import"node:events";import"open";
1
+ var Vt=Object.defineProperty;var u=(t,e)=>Vt(t,"name",{value:e,configurable:!0});import{jsx as c,jsxs as j,Fragment as L}from"react/jsx-runtime";import{Box as b,Text as m,useInput as le,useStdout as Ue,render as Qt,useApp as Xt}from"ink";import{useState as I,useEffect as ae,useMemo as U,useRef as He,useCallback as k,useLayoutEffect as lt}from"react";import{COLOR_DIVIDER as pe,COLOR_RED as E,COLOR_WARM as ue,COLOR_DIM as _,COLOR_FG as q,COLOR_SUCCESS as we,COLOR_DIMMER as je,COLOR_ACCENT as W,COLOR_WARM_SECONDARY as Zt,APP_NAME as pt,APP_TAGLINE as _e,APP_VERSION as Oe}from"./constants-BbJ71cex.js";import er from"ink-text-input";import{createEnv as tr}from"@t3-oss/env-nextjs";import{z as de}from"zod";import{existsSync as ve,readFileSync as rr,mkdirSync as sr,writeFileSync as ar}from"node:fs";import{homedir as ut}from"node:os";import A,{join as Y}from"node:path";import X,{access as nr,readFile as Me,writeFile as Se,rm as or}from"node:fs/promises";import H from"handlebars";import{execFile as ir,exec as dt,spawn as Ce}from"node:child_process";import{promisify as We}from"node:util";import{Project as cr,Scope as mt}from"ts-morph";import{once as re}from"node:events";import lr from"open";const ke=u(({borderTop:t=!0})=>c(b,{borderStyle:"single",borderBottom:!t,borderLeft:!1,borderRight:!1,borderTop:t,borderColor:pe,height:1,width:"full"}),"Divider"),pr=` \uFF0Fl\u3001
2
+ \uFF08\uFF9F\uFF64 \uFF61\uFF17
3
+ l\u3001\uFF9E ~\u30FD
4
+ \u3058\u3057(_,)\u30CE
5
+ `,Je=` ,-. _,---._ __ /\\
6
+ / ) .-' \`./ / \\
7
+ ( ( ,' \` / /|
8
+ \\ \`-" \\'\\ / |
9
+ \`. , \\ \\ / |
10
+ /\`. ,'-\`----Y |
11
+ ( ; | '
12
+ | ,-. ,-' Angel's | /
13
+ | | ( | Stuff | /
14
+ ) | \\ \`.___________|/
15
+ \`--' \`--'
16
+ `,ur=u(t=>t>=4352&&t<=4447||t>=9001&&t<=9002||t>=11904&&t<=42191&&t!==12351||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65135||t>=65281&&t<=65376||t>=65504&&t<=65510||t>=131072&&t<=196605||t>=196608&&t<=262141,"isFullwidthCodePoint"),ht=u(t=>{let e=0;for(const r of t){const s=r.codePointAt(0)??0;e+=ur(s)?2:1}return e},"getDisplayWidth"),dr=2,gt=[0,1,2,3,2,1],ft=["",".","..","..."],mr=u(({message:t="Scaffolding your project",isError:e=!1,isComplete:r=!1,showProgressText:s=!0,paddingX:o=2})=>{const[a,n]=I(0),[i,l]=I(0),p=!e&&!r;ae(()=>{if(!p)return;const $=setInterval(()=>{n(z=>(z+1)%gt.length)},200),M=setInterval(()=>{l(z=>(z+1)%ft.length)},400);return()=>{clearInterval($),clearInterval(M)}},[p]);const g=pr.trimEnd().split(`
17
+ `),d=Math.max(...g.map(ht)),f=gt[a];let P=ue,N="\u25CF",G=_;return e?(P=E,N="\u2717",G=q):r&&(P=we,N="\u2713",G=we),j(b,{flexDirection:"column",paddingX:o,children:[c(b,{flexDirection:"column",children:g.map(($,M)=>{const z=ht($),v=M===0||M===g.length-1,F=d-z+dr-(v?1:0),Z=M===f;return j(m,{color:E,children:[$," ".repeat(F),Z?c(m,{color:P,children:N}):" "]},M)})}),s&&j(m,{color:G,children:[t,p?ft[i]:""]})]})},"ScaffoldingAnimation"),hr=[{id:"generate-files",label:"Generate project"},{id:"setup-linter",label:"Setup linter"},{id:"initialize-git",label:"Initialize Git"},{id:"initial-commit",label:"Initial commit"},{id:"install-dependencies",label:"Install dependencies"},{id:"run-formatter",label:"Run formatter"},{id:"formatter-commit",label:"Commit formatting"}],bt=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function gr(t,e,r){if(!t)return r.map(a=>({stage:a,status:"pending"}));if(t==="complete")return r.map(a=>({stage:a,status:e?"failed":"completed"}));const o=r.map(a=>a.id).indexOf(t);return r.map((a,n)=>n<o?{stage:a,status:e?"failed":"completed"}:n===o?{stage:a,status:e?"failed":"active"}:e&&n>o?{stage:a,status:"pending"}:e?{stage:a,status:"failed"}:{stage:a,status:"pending"})}u(gr,"getStages");function fr(t,e){switch(t){case"completed":return"\u2713";case"active":return e;case"failed":return"\u2717";case"pending":return"\u25CB";default:return t}}u(fr,"statusIcon");function br(t){switch(t){case"completed":return we;case"active":return ue;case"failed":return E;case"pending":return je;default:return t}}u(br,"statusColor");function yr(t){return t===void 0?"":` (${t}%)`}u(yr,"formatPercentage");function wr(t){return t?.message?t.message:"Installing dependencies..."}u(wr,"getInstallMessage");const yt=u(({currentStage:t,generationMessage:e,installProgress:r,isError:s,skippedStages:o=[]})=>{const a=U(()=>hr.filter(d=>!o.includes(d.id)),[o]),n=U(()=>gr(t,s,a),[t,s,a]),[i,l]=I(0),p=t==="complete"&&!s;ae(()=>{if(s||p)return;const d=setInterval(()=>{l(f=>(f+1)%bt.length)},80);return()=>clearInterval(d)},[s,p]);const g=bt[i]??"\u280B";return j(b,{flexDirection:"column",paddingX:2,children:[c(b,{marginBottom:1,children:c(mr,{showProgressText:!1,paddingX:0,isError:s,isComplete:p})}),c(b,{flexDirection:"column",rowGap:0,children:n.map(d=>{const f=d.status==="active",P=f&&d.stage.id==="install-dependencies",N=r?.percentage,G=16,$=N===void 0?0:Math.round(N/100*G),M=G-$;return j(b,{flexDirection:"column",children:[j(b,{children:[j(m,{bold:f,color:br(d.status),children:[fr(d.status,g)," ",d.stage.label]}),P?c(m,{children:N===void 0?null:j(L,{children:[c(m,{color:ue,children:yr(N)})," ",c(m,{color:ue,children:"\u2588".repeat($)}),c(m,{color:pe,children:"\u2591".repeat(M)})]})}):null]}),P?c(b,{marginLeft:4,children:c(m,{color:_,children:wr(r)})}):null]},d.stage.id)})}),!s&&t===null?c(b,{marginTop:1,children:c(m,{color:_,children:e})}):null,p?c(b,{marginTop:1,children:c(m,{color:we,children:e})}):null,s?c(b,{marginTop:1,flexDirection:"column",children:e.split(`
18
+ `).map((d,f)=>c(m,{color:d.startsWith(" ")?_:E,children:d},f))}):null]})},"InstallationProgress"),Ye=u(({action:t="select",showBack:e=!1})=>j(m,{children:[t==="select"||t==="multi-select"?c(m,{color:_,children:"Use \u2191/\u2193 to navigate \u2022 "}):null,c(m,{color:_,children:t==="confirm"?j(L,{children:[c(m,{color:q,children:"Enter "}),"to confirm"]}):t==="multi-select"?j(L,{children:[c(m,{color:q,children:"Space "}),"to toggle \u2022",c(m,{color:q,children:" Enter "}),"to confirm"]}):j(L,{children:[c(m,{color:q,children:"Enter "}),"to select"]})}),j(m,{color:_,children:[e?j(L,{children:[" ","\u2022",c(m,{color:q,children:" Ctrl+B "}),"to go back"]}):"",j(L,{children:[" ","\u2022",c(m,{color:q,children:" Ctrl+C "}),"to exit"]})]})]}),"StatusBar"),wt=u(({architecture:t,projectName:e,packageManager:r,isGitInitialized:s,dependenciesInstalled:o,outputDir:a})=>c(b,{flexDirection:"column",children:j(b,{flexDirection:"column",marginTop:1,children:[c(m,{color:we,bold:!0,children:"\u2714 Project scaffold completed successfully!"}),j(b,{marginTop:1,children:[c(m,{color:q,children:"Project: "}),c(m,{color:W,bold:!0,children:e})]}),j(b,{children:[c(m,{color:q,children:"Architecture: "}),c(m,{color:W,bold:!0,children:t})]}),a?j(b,{children:[c(m,{color:q,children:"Location: "}),c(m,{color:W,bold:!0,children:a})]}):null,s?c(b,{marginTop:1,children:c(m,{color:_,children:"Git repository initialized"})}):null,j(b,{flexDirection:"column",borderStyle:"round",borderColor:E,paddingX:2,paddingY:1,marginTop:1,width:void 0,children:[c(m,{color:q,bold:!0,children:"\u{1F680} NEXT STEPS"}),c(b,{height:1}),c(m,{color:q,children:"1. Move into the project directory:"}),c(m,{color:W,bold:!0,children:` cd ${e}`}),c(b,{height:1}),o?c(b,{children:c(m,{color:_,children:"2. Dependencies already installed"})}):j(L,{children:[c(m,{color:q,children:"2. Install dependencies:"}),c(m,{color:W,bold:!0,children:` ${r} install`})]}),c(b,{height:1}),j(m,{color:q,children:["3."," Start development server:"]}),c(m,{color:W,bold:!0,children:` ${r} run dev`})]}),c(b,{marginTop:1,children:c(m,{color:_,children:"(Press enter to exit)"})})]})}),"DoneStep"),jr=100,Ie=u(t=>{const e=He(0);le((r,s)=>{if(s.upArrow||s.downArrow||s.leftArrow||s.rightArrow||r==="k"||r==="j"||r==="h"||r==="l"){const a=Date.now();if(a-e.current<jr)return;e.current=a}t(r,s)})},"useArrowSelect"),ne=u(({initialSelected:t,onConfirm:e,onChange:r,options:s,prompt:o,minified:a=!1})=>{const n=U(()=>new Set(s.map(S=>S.value)),[s]),i=k(S=>S.filter(C=>n.has(C)),[n]),[l,p]=I(0),[g,d]=I(()=>i(t)),f=He(g);f.current=g;const P=He(r);P.current=r,ae(()=>{const S=i(t);d(S),p(0),P.current?.(S)},[t,i]);const N=k(S=>g.includes(S),[g]),G=k(S=>{const C=s[S];C&&d(x=>{const J=x.includes(C.value)?x.filter(ee=>ee!==C.value):[...x,C.value];return f.current=J,r?.(J),J})},[s,r]),$=k(()=>{e(f.current)},[e]),M=s.length>16,z=M?Math.ceil(s.length/2):s.length;Ie((S,C)=>{C.upArrow||S==="k"?p(x=>(x-1+s.length)%s.length):C.downArrow||S==="j"?p(x=>(x+1)%s.length):M&&(C.leftArrow||S==="h")?p(x=>(x-z+s.length)%s.length):M&&(C.rightArrow||S==="l")?p(x=>(x+z)%s.length):C.return?$():(S===" "||S==="x")&&G(l)});const v=g.length,F=u((S,C)=>{const x=N(S.value),J=C===l,ee=x?"\u25CF":"\u25CB";return j(b,{flexDirection:"column",children:[c(m,{children:J?j(L,{children:[c(m,{color:E,children:"> "}),c(m,{color:x?E:_,children:`${ee} `}),c(m,{color:x?E:q,children:S.label})]}):j(L,{children:[c(m,{color:x?E:_,children:` ${ee}`}),c(m,{color:je,children:` ${S.label}`})]})}),J&&!M?j(m,{color:_,children:[" ",S.description]}):null]},S.value)},"renderOption");let Z;return M||(Z=a?0:1),j(b,{flexDirection:"column",children:[c(m,{color:_,children:o}),c(m,{color:ue,children:v===0?"No options selected yet \u2014 pick what you need":`${v} selected`}),c(b,{marginTop:1,flexDirection:M?"row":"column",rowGap:Z,columnGap:M?4:void 0,overflow:"hidden",children:M?j(L,{children:[c(b,{flexDirection:"column",rowGap:a?0:1,flexGrow:1,flexBasis:0,children:s.slice(0,z).map((S,C)=>F(S,C))}),c(b,{flexDirection:"column",rowGap:a?0:1,flexGrow:1,flexBasis:0,children:s.slice(z).map((S,C)=>F(S,C+z))})]}):s.map((S,C)=>F(S,C))})]})},"MultiSelectStep"),jt="my-nest-app",vt=64,vr=/^[a-z][a-z0-9-]*$/u;function oe(t){return t.trim()||jt}u(oe,"resolveProjectName");function De(t){const e=t.trim();return e?e.length>vt?`Project name must be at most ${vt} characters`:vr.test(e)?null:"Use lowercase letters, numbers, and hyphens; must start with a letter":null}u(De,"validateProjectName");const St=u(({error:t,onChange:e,onSubmit:r,value:s})=>(le((o,a)=>{a.return&&r()}),j(b,{flexDirection:"column",children:[c(m,{color:_,children:"Enter a name for your project"}),j(b,{marginTop:1,flexDirection:"row",alignItems:"center",columnGap:1,children:[c(m,{color:q,children:"Project name:"}),c(er,{placeholder:jt,value:s,onChange:e})]}),t?c(m,{color:E,children:t}):null]})),"ProjectNameStep"),K=u(({onConfirm:t,options:e,prompt:r,initialValue:s})=>{const[o,a]=I(()=>{const i=e.findIndex(l=>l.value===s);return Math.max(i,0)});ae(()=>{const i=e.findIndex(l=>l.value===s);a(Math.max(i,0))},[s,e]);const n=k(()=>{const i=e[o];i&&t(i.value)},[t,e,o]);return Ie((i,l)=>{l.upArrow||i==="k"?a(p=>(p-1+e.length)%e.length):l.downArrow||i==="j"?a(p=>(p+1)%e.length):l.return&&n()}),j(b,{flexDirection:"column",children:[c(m,{color:_,children:r}),c(b,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((i,l)=>{const p=l===o;return j(b,{flexDirection:"column",children:[c(m,{children:p?j(L,{children:[c(m,{color:E,children:"> "}),c(m,{color:E,children:i.label})]}):c(m,{color:je,children:` ${i.label}`})}),p?c(m,{color:_,children:i.description}):null]},i.value)})})]})},"SingleSelectStep"),kt=[{description:"Fast, disk-efficient package manager (recommended)",label:"pnpm",value:"pnpm"},{description:"Default Node.js package manager",label:"npm",value:"npm"},{description:"Classic alternative with workspaces support",label:"yarn",value:"yarn"},{description:"A superfast Node.js-compatible package manager",label:"bun",value:"bun"}],At=[{description:"The modern, all-in-one toolchain written in Rust",label:"Biome",value:"biome"},{description:"The fastest linter available, 50-100x faster than ESLint",label:"Oxlint + Oxfmt",value:"oxlint-oxfmt"},{description:"No formatter and no linter. Welcome to the jungle",label:"(None)",value:"none"}],Pt=[{description:"Default NestJS HTTP adapter",label:"Express",value:"express"},{description:"High-performance HTTP adapter",label:"Fastify",value:"fastify"}],Et=[{description:"Standalone NestJS application",label:"Single project",value:"single"},{description:"Multiple apps and shared packages",label:"Monorepo (Turborepo)",value:"monorepo"}],Rt=[{description:"Standard REST or GraphQL API application",label:"NestJS API",value:"nest-api"},{description:"Gateway routing for microservices (monorepo only)",label:"NestJS API Gateway",value:"nest-gateway"},{description:"Message-based or RPC microservice",label:"NestJS Microservice",value:"nest-microservice"}],Ke=[{description:"Relational database with strong ecosystem",label:"PostgreSQL",value:"postgresql"},{description:"Popular relational database",label:"MySQL",value:"mysql"},{description:"Embedded database for local development",label:"SQLite",value:"sqlite"},{description:"Document database",label:"MongoDB",value:"mongodb"}],Ve=[{description:"Type-safe ORM with schema and migrations",label:"Prisma",value:"prisma"},{description:"Decorator-based ORM for TypeScript",label:"TypeORM",value:"typeorm"},{description:"Lightweight SQL ORM <insert MongoDB unsupported joke here>",label:"Drizzle",value:"drizzle"}],Tt=[{description:"RESTful HTTP endpoints",label:"REST",value:"rest"},{description:"End-to-end typesafe APIs",label:"tRPC",value:"trpc"},{description:"GraphQL schema and resolvers",label:"GraphQL",value:"graphql"}],Qe=[{description:"No authentication scaffolding",label:"None",value:"none"},{description:"Flexible authentication \u2014 stateless (JWE cookies) when no database, ORM-backed when database selected",label:"Passport",value:"passport"},{description:"Modern auth library with database-backed sessions",label:"Better Auth",value:"better-auth"},{description:"Better Auth without a database \u2014 Oauth session data stored in signed/encrypted cookies",label:"Better Auth (Stateless)",value:"better-auth:stateless"}],Xe=[{description:"Dockerfile and docker-compose setup",label:"Docker",value:"docker"},{description:"Terminus health check endpoints",label:"Health Check",value:"health-check"},{description:"Request throttling middleware",label:"Rate Limiting",value:"rate-limiting"},{description:"OpenAPI documentation",label:"Swagger",value:"swagger"},{description:"Shared packages for API types in a monorepo",label:"packages/shared",value:"packages/shared"}],Ze=[{description:"Cursor agent skills library (.agents/skills)",label:"Agent Skills",value:"agent-skills"},{description:"Git hooks for pre-commit checks",label:"Husky",value:"husky"},{description:"Configurate ultracite for your developer tools",label:"Ultracite",value:"ultracite"},{description:"Zod-based DTO validation",label:"NestJS-Zod",value:"nestjs-zod"},{description:"Modern OpenAPI documentation UI",label:"Scalar UI (Recommended)",value:"scalar-ui"}],Sr=[{description:"Pub/sub or streaming protocol",label:"Redis",value:"redis"},{description:"Lightweight MQTT messaging",label:"MQTT",value:"mqtt"},{description:"Cloud-native messaging broker",label:"NATS",value:"nats"},{description:"Enterprise messaging with RabbitMQ",label:"RabbitMQ",value:"rabbitmq"},{description:"Highly scalable Kafka streaming",label:"Kafka",value:"kafka"},{description:"RPC-style gRPC communication",label:"gRPC",value:"grpc"}],_t=[{description:"Run git init and create initial commit",label:"Yes",value:"yes"},{description:"Skip git initialization",label:"No",value:"no"}],kr=[{description:"Install all project dependencies using the selected package manager",label:"Yes (Recommended)",value:"yes"},{description:"Skip dependency installation",label:"No",value:"no"}],Ar=[{description:"Universal (creates .vscode/settings.json for Visual Studio Code, Cursor, Windsurf, and more)",label:"Universal",value:"universal"},{description:"Zed (creates .zed/settings.json)",label:"Zed",value:"zed"}],Pr=[{description:"Universal (creates AGENTS.md for Codex, Jules, Devin, and more)",label:".agents (Universal)",value:"universal"},{description:"Claude (creates .claude/CLAUDE.md)",label:"Claude",value:"claude"},{description:"Replit (creates replit.md)",label:"Replit",value:"replit"},{description:"Aider (creates ultracite.md)",label:"Aider",value:"aider"},{description:"Gemini (creates GEMINI.md)",label:"Gemini",value:"gemini"},{description:"Roo (creates .roo/rules/ultracite.md)",label:"Roo",value:"roo-code"},{description:"Amazon Q CLI (creates .amazonq/rules/ultracite.md)",label:"Amazon Q CLI",value:"amazon-q-cli"},{description:"Firebender (creates firebender.json)",label:"Firebender",value:"firebender"}],Er=[{description:"Cursor agent hooks",label:"Cursor",value:"cursor"},{description:"Windsurf agent hooks",label:"Windsurf",value:"windsurf"},{description:"CodeBuddy agent hooks",label:"CodeBuddy",value:"codebuddy"},{description:"Claude agent hooks",label:"Claude",value:"claude"}],Rr=[{description:"Install the reusable Ultracite skill after setup",label:"Yes",value:"yes"},{description:"Skip installing the Ultracite skill",label:"No",value:"no"}],Tr={addons:"Addons",apiLayer:"API layer",architecture:"Architecture",auth:"Authentication",database:"Database",done:"Done",extras:"Extras",formatter:"Formatter",httpProvider:"HTTP provider",initGit:"Git repository",installDependencies:"Install dependencies",installing:"Installing",microservices:"Microservices communication",orm:"ORM",packageManager:"Package manager",projectName:"Project name",projectType:"Project type",summary:"Summary",ultraciteAgents:"Ultracite agents",ultraciteEditors:"Ultracite editors",ultraciteHooks:"Ultracite hooks",ultraciteInstallSkill:"Ultracite skill"},_r=["projectName","packageManager","formatter","httpProvider","projectType","architecture","database","orm","apiLayer","auth","extras","microservices","addons","ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill","initGit","installDependencies","summary","installing","done"];function Or(t){return t.includes("mongodb")}u(Or,"databaseIncludesMongodb");function Ot(t){return t.length===0}u(Ot,"databaseIsEmpty");function Ne(t){return Ot(t)}u(Ne,"shouldSkipOrmStep");function Ae(t){return _r.filter(e=>!(e==="orm"&&Ne(t.database)||e==="microservices"&&t.architecture!=="nest-gateway"||(e==="ultraciteEditors"||e==="ultraciteAgents"||e==="ultraciteHooks"||e==="ultraciteInstallSkill")&&(!t.addons.includes("ultracite")||t.formatter==="none")))}u(Ae,"getVisibleSteps");const Mt=["ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill"];function Pe(t){return Mt.includes(t)}u(Pe,"isUltraciteSubStep");function Mr(t,e){if(!Pe(t))return null;const r=Mt.filter(i=>Ae(e).includes(i)),s=r.indexOf(t);if(s===-1)return null;const o=r.length,a=s+1,n=Math.round(a/o*100);return{current:a,percent:n,total:o}}u(Mr,"getUltraciteSubStepInfo");function et(t){return Ae(t).filter(e=>e!=="installing"&&e!=="done"&&!Pe(e)).length}u(et,"getTotalSteps");function Cr(t,e){const r=Ae(e).filter(a=>a!=="installing"&&a!=="done");if(t==="installing"||t==="done")return et(e);if(Pe(t)){const a=r.indexOf("addons");return a===-1?1:a+1}const o=r.filter(a=>!Pe(a)).indexOf(t);return o===-1?1:o+1}u(Cr,"getDisplayStepNumber");function Ir(t,e){const r=Ae(e),s=r.indexOf(t);return s===-1||s>=r.length-1?null:r[s+1]??null}u(Ir,"getNextStepId");function Dr(t,e){const r=Ae(e),s=r.indexOf(t);return s<=0?null:r[s-1]??null}u(Dr,"getPreviousStepId");function Nr(t){return t==="monorepo"?Rt:Rt.filter(e=>e.value!=="nest-gateway")}u(Nr,"filterArchitectureOptions");function Ct(t){return Or(t)?Ve.filter(e=>e.value!=="drizzle"):Ve}u(Ct,"filterOrmOptions");function xr(t){return t.includes("drizzle")?Ke.filter(e=>e.value!=="mongodb"):Ke}u(xr,"filterDatabaseOptions");function zr(t){return Ot(t)?Qe.filter(e=>e.value!=="better-auth"):Qe}u(zr,"filterAuthOptions");function qr(t,e){return e.includes("drizzle")?t.filter(r=>r!=="mongodb"):t}u(qr,"sanitizeDatabaseForOrm");function It(t){return"nest-api"}u(It,"defaultArchitecture");function Dt(t,e){if(Ne(e))return[];const r=new Set(Ct(e).map(s=>s.value));return t.filter(s=>r.has(s))}u(Dt,"sanitizeOrmForDatabase");function me(t,e){return t.find(r=>r.value===e)?.label??e}u(me,"labelFor");function he(t,e){return e.length===0?"None":e.map(r=>me(t,r)).join(", ")}u(he,"labelsFor");const Gr=u(({onConfirm:t,state:e})=>{le((o,a)=>{a.return&&t()});const r={"nest-api":"NestJS API","nest-gateway":"NestJS API Gateway","nest-microservice":"NestJS Microservice"},s=[{label:"Project",value:oe(e.projectName)},{label:"Package manager",value:e.packageManager?me(kt,e.packageManager):"\u2014"},{label:"Formatter",value:e.formatter?me(At,e.formatter):"\u2014"},{label:"HTTP provider",value:e.httpProvider?me(Pt,e.httpProvider):"\u2014"},{label:"Project type",value:e.projectType?me(Et,e.projectType):"\u2014"},{label:"Architecture",value:e.architecture?r[e.architecture]??e.architecture:"\u2014"},{label:"Database",value:he(Ke,e.database)}];return Ne(e.database)||s.push({label:"ORM",value:he(Ve,e.orm)}),s.push({label:"API layer",value:he(Tt,e.api)}),e.architecture==="nest-gateway"&&s.push({label:"Microservices",value:he([{label:"Redis",value:"redis"},{label:"MQTT",value:"mqtt"},{label:"NATS",value:"nats"},{label:"RabbitMQ",value:"rabbitmq"},{label:"Kafka",value:"kafka"},{label:"gRPC",value:"grpc"}],e.microservices)}),s.push({label:"Auth",value:e.auth?me(Qe,e.auth):"\u2014"},{label:"Extras",value:he(Xe,e.extras)},{label:"Addons",value:he(Ze,e.addons)},{label:"Git",value:e.initGit==="yes"?"Initialize repository":"Skip"},{label:"Install deps",value:e.installDependencies==="yes"?"Install":"Skip"}),j(L,{children:[c(b,{flexDirection:"column",marginBottom:1,children:j(m,{children:[c(m,{color:E,children:"\u2726 "}),c(m,{color:W,children:"Review your selections"})]})}),c(b,{flexDirection:"column",rowGap:0,overflow:"hidden",children:s.map(o=>j(b,{flexDirection:"row",columnGap:1,children:[c(m,{color:Zt,children:`${o.label}:`}),c(m,{color:ue,children:o.value})]},o.label))})]})},"SummaryStep"),xe=tr({emptyStringAsUndefined:!0,runtimeEnv:process.env,server:{APP_MAX_WIDTH:de.string().pipe(de.coerce.number()).default(95),NEST_ARCH_BETA_MODE:de.enum(["true","false"]).default("false").transform(t=>t==="true"),NEST_ARCH_SCHEMA_URL:de.string().default("./schema.json"),NEST_ARCH_VERSION:de.string().default("0.0.1"),NODE_ENV:de.enum(["development","production","test"]).default("development")}});function tt(t){return t.length===0?"\u2014":t.join(", ")}u(tt,"formatList");const $r=u(({state:t,stepId:e})=>{const{stdout:r}=Ue(),s=r.columns||r.getWindowSize?.()[0]||80,o=Math.min(xe.APP_MAX_WIDTH,s-4),a=[];if(e!=="projectName"&&t.projectName.trim()&&a.push(oe(t.projectName)),t.packageManager&&a.push(t.packageManager),t.httpProvider&&a.push(t.httpProvider),t.projectType&&a.push(t.projectType==="monorepo"?"Monorepo":"Single"),t.architecture){const l={"nest-api":"Nest API","nest-gateway":"API Gateway","nest-microservice":"Microservice"};a.push(l[t.architecture]??t.architecture)}if(t.database.length>0&&a.push(tt(t.database)),t.orm.length>0&&a.push(tt(t.orm)),t.api.length>0&&a.push(tt(t.api)),t.auth&&a.push(t.auth),t.extras.length>0&&a.push(`+${t.extras.length} extras`),t.addons.length>0&&!Pe(e)&&a.push(`+${t.addons.length} addons`),t.initGit&&a.push(t.initGit==="yes"?"git init":"no git"),a.length===0)return j(m,{children:[c(m,{color:E,children:"\u25C6 "}),c(m,{color:E,children:"Create a new NestJS project"})]});const[n,...i]=a;return j(L,{children:[j(m,{children:[c(m,{color:E,children:"\u25C6 "}),c(m,{color:E,children:"Create a new NestJS project"})]}),e!=="summary"&&c(b,{borderStyle:"single",borderColor:pe,width:o,children:j(m,{children:[c(m,{children:"Project Name: "}),c(m,{color:E,children:n}),c(m,{color:_,children:" Selected: "}),i.length>0?c(m,{color:_,children:`${i.filter(l=>l!=="none").join(" \xB7 ")}`}):null]})})]})},"WizardContextBar"),Lr=u(({displayStep:t,stepId:e,subProgress:r,totalSteps:s})=>j(b,{paddingLeft:2,paddingTop:e==="summary"?2:1,marginBottom:1,children:[c(m,{color:q,children:"Create project"}),c(m,{color:_,children:` \u2014 step ${t}/${s}`}),r?c(m,{color:W,children:` \xB7 Ultracite configuration (${r.current}/${r.total} \xB7 ${r.percent}%)`}):c(m,{color:W,children:` \xB7 ${Tr[e]}`})]}),"WizardTitle$1"),rt=Y(ut(),".nestarch"),st=Y(rt,"last-used.json");function Br(){try{if(!ve(st))return null;const t=rr(st,"utf-8");return JSON.parse(t)}catch{return null}}u(Br,"getLastUsedConfig");function Nt(t){try{ve(rt)||sr(rt,{recursive:!0}),ar(st,JSON.stringify(t,null,2),"utf-8")}catch{}}u(Nt,"saveLastUsedConfig");function Fr(t){const e=[t.packageManager];t.httpProvider&&e.push(t.httpProvider),t.api.length>0&&e.push(t.api.join(", ")),t.projectType&&e.push(t.projectType);const r=new Date,s=r.toLocaleString("en-US",{month:"short"}),o=r.getDate(),a=r.getFullYear(),n=`${s} ${o}, ${a}`;return`${e.join(", ")} (last used ${n})`}u(Fr,"buildLastUsedDescription");class it{static{u(this,"TemplateEngine")}cache={};cacheEnabled;templatesDir;constructor(e,r={}){this.templatesDir=e,this.cacheEnabled=r.cache??!0,it.registerHelpers(r.helpers)}static registerHelpers(e){if(H.registerHelper("eq",(r,s)=>r===s),H.registerHelper("ne",(r,s)=>r!==s),H.registerHelper("lt",(r,s)=>r<s),H.registerHelper("gt",(r,s)=>r>s),H.registerHelper("and",(r,s)=>r&&s),H.registerHelper("or",(r,s)=>r||s),H.registerHelper("includes",(r,s)=>Array.isArray(r)?r.includes(s):typeof r=="string"?r.includes(String(s)):!1),H.registerHelper("uppercase",r=>r?.toUpperCase?.()),H.registerHelper("lowercase",r=>r?.toLowerCase?.()),H.registerHelper("capitalize",r=>r?r.charAt(0).toUpperCase()+r.slice(1):""),H.registerHelper("camelCase",r=>r?.split("-").map((s,o)=>o===0?s.toLowerCase():s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()).join("")),H.registerHelper("pascalCase",r=>r?.split("-").map(s=>s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()).join("")),H.registerHelper("snakeCase",r=>r?.replaceAll(/([A-Z])/gu,"_$1").toLowerCase()),e)for(const[r,s]of Object.entries(e))H.registerHelper(r,s)}async loadTemplate(e){const r=e;if(this.cacheEnabled&&this.cache[r])return this.cache[r];const s=A.join(this.templatesDir,e),o=await X.readFile(s,"utf-8"),a=H.compile(o);return this.cacheEnabled&&(this.cache[r]=a),a}async renderTemplate(e,r){return(await this.loadTemplate(e))(r.context)}async renderToFile(e,r,s){return{content:await this.renderTemplate(e,s),filePath:r,isBinary:!1}}clearCache(){this.cache={}}getCacheStats(){return{enabled:this.cacheEnabled,size:Object.keys(this.cache).length}}}class Ur{static{u(this,"FileWriter")}baseDir;writtenFiles=new Set;constructor(e){this.baseDir=e}getBaseDir(){return this.baseDir}async writeFile(e,r={}){const s=A.join(this.baseDir,e.filePath),o=A.dirname(s);try{await X.mkdir(o,{recursive:!0});let a=!1;try{await X.stat(s),a=!0}catch{a=!1}if(a&&!r.overwrite)return{backed:!1,error:"File already exists and overwrite is disabled",filePath:s,written:!1};let n=!1;if(a&&r.createBackups&&!r.dryRun){const i=`${s}.bak`;await X.copyFile(s,i),n=!0}return r.dryRun||(await X.writeFile(s,e.content,"utf-8"),this.writtenFiles.add(s)),{backed:n,filePath:s,written:!r.dryRun}}catch(a){return{backed:!1,error:a instanceof Error?a.message:"Unknown error",filePath:s,written:!1}}}writeFiles(e,r={}){return Promise.all(e.map(s=>this.writeFile(s,r)))}async fileExists(e){const r=A.join(this.baseDir,e);try{return await X.stat(r),!0}catch{return!1}}getWrittenFiles(){return[...this.writtenFiles]}clearWrittenFiles(){this.writtenFiles.clear()}async copyDirectory(e,r){const s=[],o=A.join(this.baseDir,e),a=A.join(this.baseDir,r);await X.mkdir(a,{recursive:!0});const n=await X.readdir(o,{withFileTypes:!0});for(const i of n){const l=A.join(o,i.name),p=A.join(a,i.name);if(i.isDirectory()){const g=await this.copyDirectory(A.relative(this.baseDir,l),A.relative(this.baseDir,p));s.push(...g)}else{const g=await X.readFile(l,"utf-8");await X.writeFile(p,g,"utf-8"),s.push(p),this.writtenFiles.add(p)}}return s}}const ze=We(ir);async function Hr(t){await ze("git",["init"],{cwd:t})}u(Hr,"gitInit");async function xt(t){await ze("git",["add","."],{cwd:t})}u(xt,"gitAddAll");async function zt(t,e){await ze("git",["commit","--no-verify","-m",e],{cwd:t})}u(zt,"gitCommit");async function Wr(t){try{const{stdout:e}=await ze("git",["diff","--cached","--name-only"],{cwd:t});return e.trim().length>0}catch{return!1}}u(Wr,"gitHasStagedChanges");async function Jr(t){try{return await nr(Y(t,".git")),!0}catch{return!1}}u(Jr,"gitDirectoryExists");const Yr=We(dt),Kr={bun:["Bun is not installed or not found in your PATH.",""," Install Bun: https://bun.sh",""," Then restart your terminal and try again."].join(`
19
+ `),npm:["npm is not installed or not found in your PATH.",""," Install npm: https://nodejs.org/en/download",""," Then restart your terminal and try again."].join(`
20
+ `),pnpm:["pnpm is not installed or not found in your PATH.",""," Install pnpm: npm install -g pnpm"," Or enable Corepack: corepack enable && corepack prepare pnpm@latest --activate",""," Then restart your terminal and try again."].join(`
21
+ `),yarn:["Yarn is not installed or not found in your PATH.",""," Install Yarn: npm install -g yarn",""," Then restart your terminal and try again."].join(`
22
+ `)};function Vr(t){switch(t){case"pnpm":return"pnpm dlx ultracite fix --unsafe";case"npm":return"npx --yes ultracite fix --unsafe";case"yarn":return"yarn dlx ultracite fix --unsafe";case"bun":return"bunx ultracite fix --unsafe";default:{const e=t;throw new Error(`Unsupported package manager: ${e}`)}}}u(Vr,"getFormatterCommand");function Qr(t){return t instanceof Error&&"code"in t&&(t.code==="ENOENT"||t.code==="EINVAL")}u(Qr,"isPackageManagerNotFoundError");async function Xr(t,e){const r=Vr(t);try{return await Yr(r,{cwd:e,timeout:12e4}),{success:!0}}catch(s){return Qr(s)?{error:Kr[t],success:!1}:{success:!0}}}u(Xr,"runFormatter");const Zr=We(dt);function es(t,e){const r=e.join(" ");switch(t){case"pnpm":return`pnpm dlx ${r}`;case"yarn":return`yarn dlx ${r}`;case"bun":return`bunx ${r}`;default:return`npx --yes ${r}`}}u(es,"buildUltraciteInitCommand");function ts(t){switch(t){case"biome":return"biome";case"eslint-prettier-stylelint":case"eslint-prettier-no-stylelint":return"eslint";case"oxlint-oxfmt":return"oxlint";case"none":return"none";default:return"oxlint"}}u(ts,"mapFormatterToLinter");async function rs(t){const e=Y(t,"package.json");try{const s=await Me(e,"utf-8"),o=JSON.parse(s);o.devDependencies&&(o.devDependencies=Object.fromEntries(Object.entries(o.devDependencies).filter(([a])=>!a.startsWith("stylelint")))),await Se(e,`${JSON.stringify(o,null,2)}
23
+ `,"utf-8")}catch{}const r=[".stylelintrc",".stylelintrc.json",".stylelintrc.js",".stylelintrc.yaml",".stylelintrc.yml","stylelint.config.js","stylelint.config.mjs","stylelint.config.cjs"];for(const s of r){const o=Y(t,s);ve(o)&&await or(o,{force:!0})}}u(rs,"removeStylelint");async function ss(t,e){const r=ts(e.formatter);if(r==="none")return{message:"Skipping ultracite init (no formatter selected)",success:!0};const s=[];e.addons.includes("husky")&&s.push("husky");const o=["ultracite","init","--quiet","--skip-install","--pm",e.packageManager,"--linter",r,"--frameworks","nestjs"];s.length>0&&o.push("--integrations",...s),e.addons.includes("ultracite")&&(e.ultraciteEditors.length>0&&o.push("--editors",...e.ultraciteEditors),e.ultraciteAgents.length>0&&o.push("--agents",...e.ultraciteAgents),e.ultraciteHooks.length>0&&o.push("--hooks",...e.ultraciteHooks),e.ultraciteInstallSkill==="yes"&&o.push("--install-skill"));const a=es(e.packageManager,o);try{return await Zr(a,{cwd:t,timeout:12e4}),e.formatter==="eslint-prettier-no-stylelint"&&await rs(t),{message:"Ultracite setup completed",success:!0}}catch(n){let i=n instanceof Error?n.message:String(n);if(n&&typeof n=="object"&&"stderr"in n){const l=n.stderr?.trim();l&&(i=`${i}
24
+ ${l}`)}return{message:`Ultracite setup failed: ${i}`,success:!1}}}u(ss,"runUltraciteInit");class as{static{u(this,"TemplateRegistry")}templates=new Map;groups=new Map;registerTemplate(e){this.templates.set(e.id,e)}registerTemplates(e){for(const r of e)this.registerTemplate(r)}registerGroup(e){this.groups.set(e.id,e);for(const r of e.templates)this.registerTemplate(r)}getTemplate(e){return this.templates.get(e)}getGroup(e){return this.groups.get(e)}getAllTemplates(){return[...this.templates.values()]}getAllGroups(){return[...this.groups.values()]}getTemplatesByGroup(e){return this.groups.get(e)?.templates||[]}getTemplatesByFormat(e){return[...this.templates.values()].filter(r=>r.format===e)}async loadFromDirectory(e,r){const s=[];try{const o=await X.readdir(e,{withFileTypes:!0});for(const a of o){if(!a.isFile())continue;const{name:n}=a,i=A.extname(n);if(i===".hbs"){const l=A.basename(n,i),p={description:`Template: ${l}`,format:"handlebars",id:l,name:l.replaceAll(/[-_]/gu," "),optional:n.startsWith("_"),path:A.join(A.relative(A.dirname(e),e),n)};s.push(p),this.registerTemplate(p)}}if(r&&s.length>0){const a={description:`Templates from ${e}`,id:r,name:r,templates:s};this.registerGroup(a)}}catch(o){console.error(`Failed to load templates from ${e}:`,o)}return s}clear(){this.templates.clear(),this.groups.clear()}getStats(){return{groupCount:this.groups.size,templateCount:this.templates.size}}}function tn(t,e,r){}u(tn,"log");const at={biome:{complexity:{noStaticOnlyClass:"off",noUselessConstructor:"off"},performance:{noNamespaceImport:"off"},style:{noParameterProperties:"off",useImportType:"off"}},eslint:{"@typescript-eslint/consistent-type-imports":"off","@typescript-eslint/no-extraneous-class":"off","@typescript-eslint/parameter-properties":"off","class-methods-use-this":"off","func-style":["off"],"no-useless-constructor":"off","unicorn/no-static-only-class":"off","vitest/consistent-test-filename":"off"},oxlint:{"class-methods-use-this":"off","func-style":["off"],"no-useless-constructor":"off","oxc/no-const-enum":"off","typescript/ban-ts-comment":"off","typescript/consistent-type-imports":"off","typescript/no-extraneous-class":"off","typescript/no-non-null-assertion":"off","typescript/parameter-properties":"off","unicorn/no-static-only-class":"off"}};async function ns(t){const e=Y(t,"oxlint.config.ts");let r;try{r=await Me(e,"utf-8"),`${e}`}catch{return}let s=r;/import vitest from "ultracite\/oxlint\/vitest"/u.test(r)||(s=s.replace(/(import nestjs from "ultracite\/oxlint\/nestjs";)/u,`$1
25
+ import vitest from "ultracite/oxlint/vitest";`));const o=Object.entries(at.oxlint).map(([n,i])=>{const l=Array.isArray(i)?JSON.stringify(i):`"${i}"`;return` "${n}": ${l}`}).join(`,
26
+ `),a=JSON.stringify(["error",{pattern:".*\\.(test|spec)\\.[tj]sx?$"}]);s=s.replace(/export default defineConfig\(\{([\s\S]*?)\}\);/u,(n,i)=>{const l=i.includes("vitest"),p=i.includes("ignorePatterns"),g=i.includes("rules:"),d=i.includes("overrides:");let f=i;return l||(f=f.replace(/(extends:\s*\[)([\s\S]*?)(\s*\],)/u,(P,N,G,$)=>{const M=G.trimEnd(),z=!M.endsWith(",");return`${N}${M}${z?",":""}
27
+ vitest,
28
+ ${$.trimStart()}`})),p||(f=f.replace(/(extends:\s*\[[\s\S]*?\],?)/u,`$1
29
+ ignorePatterns: [...(core.ignorePatterns ?? []), "prisma/generated/**"],`)),d||(f=`${f} overrides: [
30
+ {
31
+ files: ["**/*.{test,spec}.{ts,tsx,js,jsx}"],
32
+ plugins: ["vitest"],
33
+ rules: {
34
+ "vitest/consistent-test-filename": ${a},
35
+ },
36
+ },
37
+ ],
38
+ `),g||(f=`${f} rules: {
39
+ ${o},
40
+ },
41
+ `),`export default defineConfig({${f}});`});try{await Se(e,s,"utf-8"),`${e}`}catch{}}u(ns,"injectOxlintRules");async function os(t){const e=Y(t,"biome.jsonc");let r;try{r=await Me(e,"utf-8"),`${e}`}catch{return}const s=at.biome,o=r.includes('"linter"'),a=r.includes('"rules"');if(o&&a){const n=Object.entries(s).flatMap(([l,p])=>Object.entries(p).map(([g,d])=>` "${l}": {
42
+ "${g}": "${d}"
43
+ }`)).join(`,
44
+ `),i=r.replace(/("linter"\s*:\s*\{[\s\S]*?"rules"\s*:\s*\{)([\s\S]*?)(\})/u,(l,p,g,d)=>{const f=g.trim().endsWith(",")?"":",";return`${p}${g}${f}
45
+ ${n}
46
+ ${d}`});try{await Se(e,i,"utf-8"),`${e}`}catch{}}else{const i=` "linter": {
47
+ "rules": {
48
+ ${Object.entries(s).map(([p,g])=>{const d=Object.entries(g).map(([f,P])=>` "${f}": "${P}"`).join(`,
49
+ `);return` "${p}": {
50
+ ${d}
51
+ }`}).join(`,
52
+ `)}
53
+ }
54
+ }`,l=r.replace(/(\}\s*)$/u,p=>`,
55
+ ${i}
56
+ ${p}`);try{await Se(e,l,"utf-8"),`${e}`}catch{}}}u(os,"injectBiomeRules");async function is(t){const e=Y(t,"eslint.config.mjs");let r;try{r=await Me(e,"utf-8"),`${e}`}catch{return}if(r.includes("rules:"))return;const s=Object.entries(at.eslint).map(([a,n])=>{const i=Array.isArray(n)?JSON.stringify(n):`"${n}"`;return` "${a}": ${i}`}).join(`,
57
+ `),o=r.replace(/\];?$/u,` {
58
+ rules: {
59
+ ${s},
60
+ },
61
+ },
62
+ ];`);try{await Se(e,o,"utf-8"),`${e}`}catch{}}u(is,"injectEslintRules");async function cs(t,e){switch(e){case"oxlint-oxfmt":return await ns(t),{success:!0};case"biome":return await os(t),{success:!0};case"eslint-prettier-stylelint":case"eslint-prettier-no-stylelint":return await is(t),{success:!0};default:return{message:"No injection needed",success:!0}}}u(cs,"injectUltraciteRules");function ls(t){const e=[`pnpm create nest-arch@latest ${t.projectName}`,`--package-manager ${t.packageManager}`,`--http-provider ${t.httpProvider}`,`--project-type ${t.projectType}`,`--architecture ${t.architecture}`,`--database ${t.database.length>0?t.database.join(" "):"none"}`,`--orm ${t.orm.length>0?t.orm.join(" "):"none"}`,`--api ${t.api.length>0?t.api.join(" "):"none"}`,`--auth ${t.auth}`,`--extras ${t.extras.length>0?t.extras.join(" "):"none"}`,`--microservices ${t.microservices.length>0?t.microservices.join(" "):"none"}`,`--addons ${t.addons.length>0?t.addons.join(" "):"none"}`,`--formatter ${t.formatter}`,`--install-dependencies ${t.installDependencies?"yes":"no"}`,t.initGit?"--git":"--no-git"];return t.addons.includes("ultracite")&&(t.ultraciteEditors.length>0&&e.push(`--ultracite-editors ${t.ultraciteEditors.join(" ")}`),t.ultraciteAgents.length>0&&e.push(`--ultracite-agents ${t.ultraciteAgents.join(" ")}`),t.ultraciteHooks.length>0&&e.push(`--ultracite-hooks ${t.ultraciteHooks.join(" ")}`),e.push(`--ultracite-install-skill ${t.ultraciteInstallSkill}`)),e.join(" ")}u(ls,"buildReproducibleCommand");function ps(t){return{$schema:xe.NEST_ARCH_SCHEMA_URL,addons:t.addons,api:t.api,architecture:t.architecture,auth:t.auth,createdAt:new Date().toISOString(),database:t.database,description:t.description,extras:t.extras,formatter:t.formatter,httpProvider:t.httpProvider,initGit:t.initGit,installDependencies:t.installDependencies,microservices:t.microservices,orm:t.orm,packageManager:t.packageManager,projectName:t.projectName,projectType:t.projectType,reproducibleCommand:ls(t),ultraciteAgents:t.ultraciteAgents,ultraciteEditors:t.ultraciteEditors,ultraciteHooks:t.ultraciteHooks,ultraciteInstallSkill:t.ultraciteInstallSkill,version:xe.NEST_ARCH_VERSION}}u(ps,"buildMetadata");function us(t){return`${["// nest-arch","//","// Project scaffolding tool for NestJS applications","//","// This file records the options used to generate this project.","// It can be used to reproduce the exact same project setup.","// This file is safe to delete.",""].join(`
63
+ `)+JSON.stringify(t,null,2)}
64
+ `}u(us,"serializeMetadata");function ds(){return`${JSON.stringify({$schema:"http://json-schema.org/draft-07/schema#",description:"NestArch project configuration metadata file schema",properties:{$schema:{type:"string"},addons:{items:{enum:["agent-skills","husky","ultracite","nestjs-zod","scalar-ui"]},type:"array"},api:{items:{enum:["rest","trpc","graphql"]},type:"array"},architecture:{enum:["nest-api","nest-gateway","nest-microservice"]},auth:{enum:["passport","better-auth","better-auth:stateless","none"]},createdAt:{format:"date-time",type:"string"},database:{items:{enum:["postgresql","mysql","sqlite","mongodb"]},type:"array"},description:{type:"string"},extras:{items:{enum:["docker","health-check","rate-limiting","swagger","packages/shared"]},type:"array"},formatter:{enum:["biome","eslint-prettier-stylelint","eslint-prettier-no-stylelint","oxlint-oxfmt","none"]},httpProvider:{enum:["express","fastify"]},initGit:{type:"boolean"},installDependencies:{type:"boolean"},microservices:{items:{enum:["redis","mqtt","nats","rabbitmq","kafka","grpc"]},type:"array"},orm:{items:{enum:["prisma","typeorm","drizzle"]},type:"array"},packageManager:{enum:["pnpm","npm","yarn","bun"]},projectName:{type:"string"},projectType:{enum:["single","monorepo"]},reproducibleCommand:{type:"string"},ultraciteAgents:{items:{enum:["universal","claude","codex","jules","replit","devin","lovable","zencoder","ona","openclaw","continue","snowflake-cortex","deepagents","qoder","kimi-cli","mcpjam","mux","pi","adal","copilot","cline","amp","aider","firebase-studio","open-hands","gemini","junie","augmentcode","kilo-code","goose","roo-code","warp","droid","opencode","crush","qwen","amazon-q-cli","firebender","cursor-cli","mistral-vibe","vercel"]},type:"array"},ultraciteEditors:{items:{enum:["universal","vscode","cursor","windsurf","antigravity","kiro","trae","void","bob","codebuddy","zed"]},type:"array"},ultraciteHooks:{items:{enum:["cursor","windsurf","codebuddy","claude","copilot"]},type:"array"},ultraciteInstallSkill:{enum:["yes","no"]},version:{type:"string"}},required:["version","createdAt","reproducibleCommand","projectName","packageManager","httpProvider","projectType","architecture","database","orm","api","auth","extras","microservices","addons","initGit","formatter","installDependencies","ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill"],title:"NestArchMetadata",type:"object"},null,2)}
65
+ `}u(ds,"buildSchemaContent");const ms="single-project/architecture/nest-api",hs="single-project/architecture/nest-gateway",gs="single-project/architecture/nest-microservice",fs="monorepo/root",bs="monorepo/apps/api-gateway",ys="monorepo/packages",ws="addons/husky",js="extras/docker",vs="extras/swagger",Ss="extras/database",ks="monorepo/packages/db",As=[{conditions:{architecture:"nest-api",projectType:"single"},id:"single-nest-api",name:"Single NestJS API",priority:10,templateGroups:[ms]},{conditions:{architecture:"nest-gateway",projectType:"single"},id:"single-nest-gateway",name:"Single NestJS Gateway",priority:10,templateGroups:[hs]},{conditions:{architecture:"nest-microservice",projectType:"single"},id:"single-nest-microservice",name:"Single NestJS Microservice",priority:10,templateGroups:[gs]},{conditions:{projectType:"monorepo"},id:"monorepo-root",name:"Monorepo Root",priority:10,templateGroups:[fs,bs,ys]},{conditions:{addons:["husky"]},id:"addon-husky",name:"Husky Git Hooks",priority:5,templateGroups:[ws]},{conditions:{extras:["docker"]},id:"extra-docker",name:"Docker Support",priority:5,templateGroups:[js]},{conditions:{extras:["swagger"]},id:"extra-swagger",name:"Swagger Documentation",priority:5,templateGroups:[vs]},{conditions:{database:["postgresql","mysql","sqlite","mongodb"]},id:"extra-database",name:"Database Module",priority:5,templateGroups:[Ss]},{conditions:{api:["rest"],projectType:"single"},id:"feature-rest",name:"REST API templates (single)",priority:3,templateGroups:["feature/rest"]},{conditions:{api:["rest"],projectType:"monorepo"},id:"monorepo-feature-rest",name:"REST API templates (monorepo)",priority:3,templateGroups:["monorepo/feature/rest"]},{conditions:{api:["trpc"],projectType:"single"},id:"feature-trpc",name:"tRPC API templates (single)",priority:3,templateGroups:["feature/trpc"]},{conditions:{api:["trpc"],projectType:"monorepo"},id:"monorepo-feature-trpc",name:"tRPC API templates (monorepo)",priority:3,templateGroups:["monorepo/feature/trpc"]},{conditions:{database:["postgresql","mysql","sqlite","mongodb"],projectType:"monorepo"},id:"monorepo-db-package",name:"Monorepo DB Package",priority:5,templateGroups:[ks]}];function Ps(t){t.registerAll(As)}u(Ps,"initializeTemplateMappings");class $e{static{u(this,"TemplateMapper")}mappings=[];register(e){this.mappings.push(e),this.mappings.sort((r,s)=>(s.priority??0)-(r.priority??0))}registerAll(e){for(const r of e)this.register(r)}resolve(e){const r=[];for(const n of this.mappings)$e.matches(n.conditions,e)&&r.push(n);const s=[],o={},a=[];for(const n of r){for(const i of n.templateGroups)s.includes(i)||s.push(i);Object.assign(o,n.extraVariables),a.push(n.id)}return{extraVariables:o,matchedMappings:a,templateGroups:s}}findFirst(e){return this.mappings.find(r=>$e.matches(r.conditions,e))}getAll(){return[...this.mappings]}getById(e){return this.mappings.find(r=>r.id===e)}clear(){this.mappings=[]}static matches(e,r){return!(e.architecture!==void 0&&e.architecture!==r.architecture||e.projectType!==void 0&&e.projectType!==r.projectType||e.database!==void 0&&!e.database.some(s=>r.database.includes(s))||e.orm!==void 0&&!e.orm.some(s=>r.orm.includes(s))||e.api!==void 0&&!e.api.some(s=>r.api.includes(s))||e.extras!==void 0&&!e.extras.some(s=>r.extras.includes(s))||e.addons!==void 0&&!e.addons.some(s=>r.addons.includes(s))||e.microservices!==void 0&&!e.microservices.some(s=>r.microservices.includes(s)))}}function Es(t){return t.replaceAll(/([a-z])([A-Z])/gu,"$1-$2").replaceAll(/\s+/gu,"-").toLowerCase()}u(Es,"toKebabCase");function Rs(t){return t.replaceAll(/[-_\s](.)/gu,(e,r)=>r.toUpperCase()).replace(/^(.)/u,e=>e.toLowerCase())}u(Rs,"toCamelCase");function Ts(t){return t.replaceAll(/[-_\s](.)/gu,(e,r)=>r.toUpperCase()).replace(/^(.)/u,e=>e.toUpperCase())}u(Ts,"toPascalCase");function _s(t){const e=t.database.includes("postgresql"),r=t.database.includes("mysql"),s=t.database.includes("sqlite"),o=t.database.includes("mongodb"),a=t.orm.includes("prisma"),n=t.orm.includes("typeorm"),i=t.orm.includes("drizzle"),l=t.database.length>0&&!a&&!n&&!i;return{addons:[...t.addons],apiType:t.api[0]??null,apis:[...t.api],architecture:t.architecture,auth:t.auth,databasePorts:{mongodb:27017,mysql:3306,postgres:5432},databaseType:t.database[0]??null,databases:[...t.database],description:t.description||"A NestJS application",docker:t.extras.includes("docker"),extras:[...t.extras],hasAuth:t.auth!=="none",hasBetterAuthWithoutRest:(t.auth==="better-auth"||t.auth==="better-auth:stateless")&&!t.api.includes("rest"),hasDatabase:t.database.length>0,hasGraphql:t.api.includes("graphql"),hasMongodb:o,hasMysql:r,hasOrm:t.orm.length>0,hasPostgres:e,hasRest:t.api.includes("rest"),hasSqlite:s,hasTrpc:t.api.includes("trpc"),hasTrpcAndAuth:t.api.includes("trpc")&&t.auth!=="none",httpProvider:t.httpProvider,initGit:t.initGit,isBun:t.packageManager==="bun",isMonorepo:t.projectType==="monorepo",isNpm:t.packageManager==="npm",isPnpm:t.packageManager==="pnpm",isSingle:t.projectType==="single",isYarn:t.packageManager==="yarn",microservices:[...t.microservices],ormType:t.orm[0]??null,orms:[...t.orm],packageManager:t.packageManager,projectName:t.projectName,projectNameCamelCase:Rs(t.projectName),projectNameKebab:Es(t.projectName),projectNamePascalCase:Ts(t.projectName),projectType:t.projectType,shouldImportAuthModule:t.auth!=="none"&&t.api.includes("rest"),supportsCatalog:["pnpm","yarn","bun"].includes(t.packageManager),swagger:t.extras.includes("swagger"),trpcGeneratePath:t.projectType==="monorepo"?"../../packages/shared/src/trpc/@generated":"src/libs/trpc/@generated",useDrizzle:i,usePrisma:a,useRawSql:l,useSwaggerScalar:t.extras.includes("swagger")&&t.addons.includes("scalar-ui"),useTypeorm:n,year:new Date().getFullYear()}}u(_s,"buildTemplateVariables");function Os(t,e){return{...t,...e}}u(Os,"mergeTemplateExtras");class Ms{static{u(this,"AuthModuleGenerator")}project;config;constructor(e){this.config=e,this.project=new cr}generate(){const e=`${this.config.outputDir}/auth`,r=this.config.strategy==="better-auth:stateless"?"better-auth":this.config.strategy;r==="passport"?this.generatePassportAuth(e):r==="better-auth"&&this.generateBetterAuth(e)}generateAuthOnly(){const e=`${this.config.outputDir}/auth`;if((this.config.strategy==="better-auth:stateless"?"better-auth":this.config.strategy)!=="better-auth")return;const s=this.config.database??[];if(!(s.length>0)){this.generateBetterAuthStateless(e,!0);return}const a=this.config.orm??[],n=a.includes("prisma"),i=a.includes("drizzle"),l=a.includes("typeorm");n?this.generateBetterAuthPrisma(e,s):i?this.generateBetterAuthDrizzle(e,s):l?this.generateBetterAuthNative(e,s):this.generateBetterAuthNative(e,s)}generatePassportAuth(e){(this.config.database?.length??0)>0?this.generatePassportDbAuth(e):this.generatePassportStatelessAuth(e)}generatePassportStatelessAuth(e){const r=['import { Injectable } from "@nestjs/common";','import { PassportStrategy } from "@nestjs/passport";','import { Strategy, ExtractJwt } from "passport-jwt";','import { Request } from "express";',"","interface JwtPayload {"," sub: string;"," email?: string;"," [key: string]: unknown;","}","","@Injectable()","export class JwtStrategy extends PassportStrategy(Strategy) {"," constructor() {"," super({"," jwtFromRequest: ExtractJwt.fromExtractors(["," (request: Request) => request?.cookies?.access_token ?? null,"," ExtractJwt.fromAuthHeaderAsBearerToken(),"," ]),"," ignoreExpiration: false,",' secretOrKey: process.env.JWT_SECRET || "your-secret-key",'," });"," }",""," async validate(payload: JwtPayload) {"," // Stateless: no DB lookup \u2014 trust the token payload"," return { userId: payload.sub, ...payload };"," }","}",""].join(`
66
+ `),s=A.join(e,"strategies/jwt.strategy.ts");this.project.createSourceFile(s,r,{overwrite:!0});const o=A.join(e,"auth.service.ts"),a=this.project.createSourceFile(o,"",{overwrite:!0});a.addImportDeclaration({moduleSpecifier:"@nestjs/common",namedImports:["Injectable"]}),a.addImportDeclaration({moduleSpecifier:"@nestjs/jwt",namedImports:["JwtService"]}),a.addClass({ctors:[{parameters:[{decorators:[{name:"Inject"}],isReadonly:!0,name:"jwtService",scope:mt.Private,type:"JwtService"}]}],decorators:[{arguments:[],name:"Injectable"}],isExported:!0,methods:[{name:"login",parameters:[{name:"user",type:"Record<string, unknown>"}],returnType:"{ access_token: string }",statements:["const payload = { sub: user.id as string, ...user };","return { access_token: this.jwtService.sign(payload) };"]},{name:"verifyToken",parameters:[{name:"token",type:"string"}],returnType:"any",statements:["return this.jwtService.verify(token);"]}],name:"AuthService"});const n=["import {"," Controller,"," Post, Get, Body, UseGuards, Req, Res",'} from "@nestjs/common";','import { AuthGuard } from "@nestjs/passport";','import { AuthService } from "./auth.service.js";','import type { Request, Response } from "express";',"",'@Controller("auth")',"export class AuthController {"," constructor(private readonly authService: AuthService) {}","",' @Post("login")'," async login("," @Body() body: Record<string, unknown>,"," @Res({ passthrough: true }) response: Response,"," ) {"," const result = await this.authService.login(body);",' response.cookie("access_token", result.access_token, {'," httpOnly: true,",' secure: process.env.NODE_ENV === "production",',' sameSite: "strict",'," });"," return result;"," }","",' @Get("profile")',' @UseGuards(AuthGuard("jwt"))'," getProfile(@Req() request: Request) {"," return request.user;"," }","",' @Post("logout")'," async logout(@Res({ passthrough: true }) response: Response) {",' response.clearCookie("access_token");',' return { message: "Logged out" };'," }","}",""].join(`
67
+ `),i=A.join(e,"auth.controller.ts");this.project.createSourceFile(i,n,{overwrite:!0}),this.generatePassportDecorators(e),this.generatePassportGuard(e);const l=['import { Module } from "@nestjs/common";','import { APP_GUARD } from "@nestjs/core";','import { JwtModule } from "@nestjs/jwt";','import { PassportModule } from "@nestjs/passport";','import { AuthController } from "./auth.controller.js";','import { AuthService } from "./auth.service.js";','import { JwtStrategy } from "./strategies/jwt.strategy.js";','import { JwtAuthGuard } from "./guards/jwt-auth.guard.js";',"","@Module({"," imports: [",' PassportModule.register({ defaultStrategy: "jwt" }),'," JwtModule.register({",' secret: process.env.JWT_SECRET || "your-secret-key",',' signOptions: { expiresIn: "24h" },'," }),"," ],"," controllers: [AuthController],"," providers: ["," AuthService,"," JwtStrategy,"," {"," provide: APP_GUARD,"," useClass: JwtAuthGuard,"," },"," ],"," exports: [AuthService],","})","export class AuthModule {}",""].join(`
68
+ `),p=A.join(e,"auth.module.ts");this.project.createSourceFile(p,l,{overwrite:!0})}generatePassportDbAuth(e){const r=this.config.orm??[],s=r.includes("prisma"),o=r.includes("typeorm");let a,n;s?(n=['import { Injectable, UnauthorizedException } from "@nestjs/common";','import { PassportStrategy } from "@nestjs/passport";','import { Strategy, ExtractJwt } from "passport-jwt";','import { PrismaClient } from "@prisma/client";'],a=["const prisma = new PrismaClient();","const user = await prisma.user.findUnique({"," where: { id: payload.sub },","});","if (!user) {",' throw new UnauthorizedException("User not found");',"}","return user;"]):o?(n=['import { Injectable, UnauthorizedException } from "@nestjs/common";','import { PassportStrategy } from "@nestjs/passport";','import { Strategy, ExtractJwt } from "passport-jwt";','import { InjectRepository } from "@nestjs/typeorm";','import { Repository } from "typeorm";','import { UserEntity } from "../../modules/users/entities/user.entity.js";'],a=["const user = await this.userRepository.findOne({"," where: { id: payload.sub },","});","if (!user) {",' throw new UnauthorizedException("User not found");',"}","return user;"]):(n=['import { Injectable, UnauthorizedException } from "@nestjs/common";','import { PassportStrategy } from "@nestjs/passport";','import { Strategy, ExtractJwt } from "passport-jwt";'],a=["// Add your ORM user lookup here","// const user = await db.select().from(users).where(eq(users.id, payload.sub)).limit(1);","if (!payload.sub) {",' throw new UnauthorizedException("Invalid token");',"}","return { userId: payload.sub, ...payload };"]);const i=[" super({"," jwtFromRequest: ExtractJwt.fromExtractors(["," (request: { cookies?: Record<string, string> }) => request?.cookies?.access_token ?? null,"," ExtractJwt.fromAuthHeaderAsBearerToken(),"," ]),"," ignoreExpiration: false,",' secretOrKey: process.env.JWT_SECRET || "your-secret-key",'," });"].join(`
69
+ `),l=o?`
70
+ constructor(
71
+ @InjectRepository(UserEntity)
72
+ private readonly userRepository: Repository<UserEntity>,
73
+ ) {
74
+ ${i}
75
+ }`:`
76
+ constructor() {
77
+ ${i}
78
+ }`,p=[...n,"","interface JwtPayload {"," sub: string;"," [key: string]: unknown;","}","","@Injectable()","export class JwtStrategy extends PassportStrategy(Strategy) {",l,""," async validate(payload: JwtPayload) {",...a.map(v=>` ${v}`)," }","}",""].join(`
79
+ `),g=A.join(e,"strategies/jwt.strategy.ts");this.project.createSourceFile(g,p,{overwrite:!0});const d=A.join(e,"auth.service.ts"),f=this.project.createSourceFile(d,"",{overwrite:!0});f.addImportDeclaration({moduleSpecifier:"@nestjs/common",namedImports:["Injectable"]}),f.addImportDeclaration({moduleSpecifier:"@nestjs/jwt",namedImports:["JwtService"]}),f.addClass({ctors:[{parameters:[{decorators:[{name:"Inject"}],isReadonly:!0,name:"jwtService",scope:mt.Private,type:"JwtService"}]}],decorators:[{arguments:[],name:"Injectable"}],isExported:!0,methods:[{name:"login",parameters:[{name:"user",type:"Record<string, unknown>"}],returnType:"{ access_token: string }",statements:["const payload = { sub: user.id as string, ...user };","return { access_token: this.jwtService.sign(payload) };"]},{name:"verifyToken",parameters:[{name:"token",type:"string"}],returnType:"any",statements:["return this.jwtService.verify(token);"]}],name:"AuthService"});const P=["import {"," Controller,"," Post, Get, Body, UseGuards, Req, Res",'} from "@nestjs/common";','import { AuthGuard } from "@nestjs/passport";','import { AuthService } from "./auth.service.js";','import type { Request, Response } from "express";',"",'@Controller("auth")',"export class AuthController {"," constructor(private readonly authService: AuthService) {}","",' @Post("login")'," async login("," @Body() body: Record<string, unknown>,"," @Res({ passthrough: true }) response: Response,"," ) {"," const result = await this.authService.login(body);",' response.cookie("access_token", result.access_token, {'," httpOnly: true,",' secure: process.env.NODE_ENV === "production",',' sameSite: "strict",'," });"," return result;"," }","",' @Get("profile")',' @UseGuards(AuthGuard("jwt"))'," getProfile(@Req() request: Request) {"," return request.user;"," }","",' @Post("logout")'," async logout(@Res({ passthrough: true }) response: Response) {",' response.clearCookie("access_token");',' return { message: "Logged out" };'," }","}",""].join(`
80
+ `),N=A.join(e,"auth.controller.ts");this.project.createSourceFile(N,P,{overwrite:!0}),this.generatePassportDecorators(e),this.generatePassportGuard(e);const G=['import { Module } from "@nestjs/common";','import { APP_GUARD } from "@nestjs/core";','import { JwtModule } from "@nestjs/jwt";','import { PassportModule } from "@nestjs/passport";','import { AuthController } from "./auth.controller.js";','import { AuthService } from "./auth.service.js";','import { JwtStrategy } from "./strategies/jwt.strategy.js";','import { JwtAuthGuard } from "./guards/jwt-auth.guard.js";'];o&&G.push('import { TypeOrmModule } from "@nestjs/typeorm";','import { UserEntity } from "../../modules/users/entities/user.entity.js";');const $=[" imports: [",' PassportModule.register({ defaultStrategy: "jwt" }),'," JwtModule.register({",' secret: process.env.JWT_SECRET || "your-secret-key",',' signOptions: { expiresIn: "24h" },'," }),",o?" TypeOrmModule.forFeature([UserEntity]),":" // Import your ORM module here"," ],"," controllers: [AuthController],"," providers: ["," AuthService,"," JwtStrategy,"," {"," provide: APP_GUARD,"," useClass: JwtAuthGuard,"," },"," ],"," exports: [AuthService],"].join(`
81
+ `),M=[...G,"","@Module({",$,"})","export class AuthModule {}",""].join(`
82
+ `),z=A.join(e,"auth.module.ts");this.project.createSourceFile(z,M,{overwrite:!0})}generatePassportDecorators(e){const r=A.join(e,"decorators"),s=['import { SetMetadata } from "@nestjs/common";',"",'export const ALLOW_ANONYMOUS_KEY = "auth:allowAnonymous";',"export const AllowAnonymous = () =>"," SetMetadata(ALLOW_ANONYMOUS_KEY, true);",""].join(`
83
+ `);this.project.createSourceFile(A.join(r,"allow-anonymous.decorator.ts"),s,{overwrite:!0});const o=['import { SetMetadata } from "@nestjs/common";',"",'export const OPTIONAL_AUTH_KEY = "auth:optionalAuth";',"export const OptionalAuth = () => SetMetadata(OPTIONAL_AUTH_KEY, true);",""].join(`
84
+ `);this.project.createSourceFile(A.join(r,"optional-auth.decorator.ts"),o,{overwrite:!0});const a=['import { createParamDecorator, ExecutionContext } from "@nestjs/common";',"","export const Session = createParamDecorator("," (_data: unknown, ctx: ExecutionContext) => {"," const request = ctx.switchToHttp().getRequest();"," return request.user ?? null;"," },",");",""].join(`
85
+ `);this.project.createSourceFile(A.join(r,"session.decorator.ts"),a,{overwrite:!0});const n=['import { SetMetadata } from "@nestjs/common";',"",'export const ROLES_KEY = "auth:roles";',"export const Roles = (...roles: string[]) =>"," SetMetadata(ROLES_KEY, roles);",""].join(`
86
+ `);this.project.createSourceFile(A.join(r,"roles.decorator.ts"),n,{overwrite:!0});const i=['import { SetMetadata } from "@nestjs/common";',"",'export const ORG_ROLES_KEY = "auth:orgRoles";',"export const OrgRoles = (...roles: string[]) =>"," SetMetadata(ORG_ROLES_KEY, roles);",""].join(`
87
+ `);this.project.createSourceFile(A.join(r,"org-roles.decorator.ts"),i,{overwrite:!0});const l=['import { SetMetadata } from "@nestjs/common";',"",'export const USER_PERMISSIONS_KEY = "auth:userPermissions";',"","export interface UserPermissionCheck {"," permission?: Record<string, string[]>;"," permissions?: Record<string, string[]>;"," role?: string;"," userId?: string;","}","","export const UserHasPermission = (check: UserPermissionCheck) =>"," SetMetadata(USER_PERMISSIONS_KEY, check);",""].join(`
88
+ `);this.project.createSourceFile(A.join(r,"user-has-permission.decorator.ts"),l,{overwrite:!0});const p=['import { SetMetadata } from "@nestjs/common";',"",'export const MEMBER_PERMISSIONS_KEY = "auth:memberPermissions";',"","export interface MemberPermissionCheck {"," permissions: Record<string, string[]>;","}","","export const MemberHasPermission = (check: MemberPermissionCheck) =>"," SetMetadata(MEMBER_PERMISSIONS_KEY, check);",""].join(`
89
+ `);this.project.createSourceFile(A.join(r,"member-has-permission.decorator.ts"),p,{overwrite:!0});const g=['export { AllowAnonymous, ALLOW_ANONYMOUS_KEY } from "./allow-anonymous.decorator.js";','export { OptionalAuth, OPTIONAL_AUTH_KEY } from "./optional-auth.decorator.js";','export { Session } from "./session.decorator.js";','export { Roles, ROLES_KEY } from "./roles.decorator.js";','export { OrgRoles, ORG_ROLES_KEY } from "./org-roles.decorator.js";',"export {"," UserHasPermission,"," USER_PERMISSIONS_KEY,"," UserPermissionCheck,",'} from "./user-has-permission.decorator.js";',"export {"," MemberHasPermission,"," MEMBER_PERMISSIONS_KEY,"," MemberPermissionCheck,",'} from "./member-has-permission.decorator.js";',""].join(`
90
+ `);this.project.createSourceFile(A.join(r,"index.ts"),g,{overwrite:!0})}generatePassportGuard(e){const r=A.join(e,"guards"),s=['import { Injectable, ExecutionContext, ForbiddenException } from "@nestjs/common";','import { Reflector } from "@nestjs/core";','import { AuthGuard } from "@nestjs/passport";','import { ALLOW_ANONYMOUS_KEY } from "../decorators/allow-anonymous.decorator.js";','import { OPTIONAL_AUTH_KEY } from "../decorators/optional-auth.decorator.js";','import { ROLES_KEY } from "../decorators/roles.decorator.js";','import { ORG_ROLES_KEY } from "../decorators/org-roles.decorator.js";','import { USER_PERMISSIONS_KEY } from "../decorators/user-has-permission.decorator.js";','import { MEMBER_PERMISSIONS_KEY } from "../decorators/member-has-permission.decorator.js";',"","@Injectable()",'export class JwtAuthGuard extends AuthGuard("jwt") {'," constructor(private readonly reflector: Reflector) {"," super();"," }",""," canActivate(context: ExecutionContext) {"," const isAllowAnonymous = this.reflector.getAllAndOverride<boolean>("," ALLOW_ANONYMOUS_KEY,"," [context.getHandler(), context.getClass()],"," );"," if (isAllowAnonymous) {"," return true;"," }",""," return super.canActivate(context) as boolean | Promise<boolean>;"," }",""," handleRequest("," err: Error | null,"," user: Record<string, unknown> | null,"," _info: unknown,"," context: ExecutionContext,"," ) {"," const isOptional = this.reflector.getAllAndOverride<boolean>("," OPTIONAL_AUTH_KEY,"," [context.getHandler(), context.getClass()],"," );",""," if (isOptional && (err || !user)) {"," return null;"," }",""," if (err || !user) {",' throw err || new ForbiddenException("Invalid token");'," }",""," const roles = this.reflector.getAllAndOverride<string[]>("," ROLES_KEY,"," [context.getHandler(), context.getClass()],"," );"," if (roles?.length > 0) {"," const userRole = (user as Record<string, string>).role;"," if (!userRole || !roles.includes(userRole)) {",' throw new ForbiddenException("Insufficient role permissions");'," }"," }",""," const orgRoles = this.reflector.getAllAndOverride<string[]>("," ORG_ROLES_KEY,"," [context.getHandler(), context.getClass()],"," );"," if (orgRoles?.length > 0) {"," const session = (user as Record<string, unknown>).session as Record<string, unknown> | undefined;"," const memberRole = session?.activeOrganizationId"," ? (user as Record<string, string>).role"," : null;"," if (!memberRole || !orgRoles.includes(memberRole)) {",' throw new ForbiddenException("Insufficient organization role permissions");'," }"," }",""," // Placeholder: implement user permission check logic here"," const _userPermission = this.reflector.getAllAndOverride<unknown>("," USER_PERMISSIONS_KEY,"," [context.getHandler(), context.getClass()],"," );",""," // Placeholder: implement member permission check logic here"," const _memberPermission = this.reflector.getAllAndOverride<unknown>("," MEMBER_PERMISSIONS_KEY,"," [context.getHandler(), context.getClass()],"," );",""," return user;"," }","}",""].join(`
91
+ `);this.project.createSourceFile(A.join(r,"jwt-auth.guard.ts"),s,{overwrite:!0})}generateBetterAuth(e){const r=this.config.orm??[],s=this.config.database??[],o=s.length>0,a=this.config.skipModule??!1;if(!o){this.generateBetterAuthStateless(e,a);return}const n=r.includes("prisma"),i=r.includes("drizzle"),l=r.includes("typeorm");n?(this.generateBetterAuthPrisma(e,s),a||this.generateBetterAuthModule(e,"prisma")):i?(this.generateBetterAuthDrizzle(e,s),a||this.generateBetterAuthModule(e,"drizzle")):l?(this.generateBetterAuthNative(e,s),a||this.generateBetterAuthTypeormModule(e,s)):(this.generateBetterAuthNative(e,s),a||this.generateBetterAuthModule(e,"raw.sql"))}generateBetterAuthPrisma(e,r){const s=r.includes("postgresql"),o=r.includes("mysql");let a;s?a="postgresql":o?a="mysql":a="sqlite";let n,i,l;s?(n="PrismaPg",i="@prisma/adapter-pg",l="new PrismaPg({ connectionString: '' })"):o?(n="PrismaMySql",i="@prisma/adapter-mysql2",l="new PrismaMySql({ uri: '' })"):(n="PrismaBetterSqlite3",i="@prisma/adapter-better-sqlite3",l="new PrismaBetterSqlite3({ url: ':memory:' })");const p=this.config.extras?.includes("swagger"),g=[`import { ${n} } from "${i}";`,'import { betterAuth } from "better-auth";','import { prismaAdapter } from "better-auth/adapters/prisma";','import { PrismaClient } from "../database/orm/prisma/generated/client.js";',...p?['import { openAPI } from "better-auth/plugins";']:[],"","export function createAuth(prisma: PrismaClient) {"," return betterAuth({",` database: prismaAdapter(prisma, { provider: "${a}" }),`," emailAndPassword: { enabled: true },"," experimental: { joins: true },",...p?[" plugins: [openAPI()],"]:[]," });","}","","// Lazily created \u2014 only initializes when CLI accesses auth.options","// This is for auth schema generation only, ignore this code","// no connectionString needed because auth@latest generate doesnt access the DB","function createCliAuth() {",` const adapter = ${l};`," const prisma = new PrismaClient({ adapter });"," return createAuth(prisma);","}","","let instance: ReturnType<typeof createAuth>;","","export const auth = new Proxy({} as ReturnType<typeof createAuth>, {"," get(_, prop) {"," if (!instance) {"," instance = createCliAuth();"," }"," return Reflect.get(instance, prop, instance);"," },","});","export type UserSession = typeof instance.$Infer.Session"],d=A.join(e,"auth.ts");this.project.createSourceFile(d,g.join(`
92
+ `),{overwrite:!0})}generateBetterAuthDrizzle(e,r){const s=r.includes("postgresql"),o=r.includes("mysql"),a=r.includes("sqlite");let n,i,l,p,g,d;s?(n='import { drizzle } from "drizzle-orm/node-postgres";',i='import { Pool } from "pg";',l="NodePgDatabase",p="pg",g='new Pool({ connectionString: "" })',d="drizzle({ client: pool, schema })"):o?(n='import { drizzle } from "drizzle-orm/mysql2";',i='import mysql from "mysql2/promise";',l="MySql2Database",p="mysql",g='mysql.createPool({ uri: "" })',d="drizzle({ client: pool, schema })"):(n='import { drizzle } from "drizzle-orm/better-sqlite3";',i='import Database from "better-sqlite3";',l="BetterSqlite3Database",p="sqlite",g='new Database(":memory:")',d="drizzle({ client: sqliteDb, schema })");const f=this.config.extras?.includes("swagger"),P=['import { betterAuth } from "better-auth";','import { drizzleAdapter } from "@better-auth/drizzle-adapter";',n,i,'import * as schema from "../database/orm/drizzle/schema.js";',...f?['import { openAPI } from "better-auth/plugins";']:[],"",`export function createAuth(db: ${l}<typeof schema>) {`," return betterAuth({",` database: drizzleAdapter(db, { provider: "${p}", usePlural: true }),`," emailAndPassword: { enabled: true },"," experimental: { joins: true },",...f?[" plugins: [openAPI()],"]:[]," });","}","","// Lazily created \u2014 only initializes when CLI accesses auth.options","// This is for auth schema generation only, ignore this code","function createCliAuth() {",a?` const sqliteDb = ${g};`:` const pool = ${g};`,...a?[` const db = ${d};`]:[` const db = ${d};`]," return createAuth(db);","}","","let instance: ReturnType<typeof createAuth>;","","export const auth = new Proxy({} as ReturnType<typeof createAuth>, {"," get(_, prop) {"," if (!instance) {"," instance = createCliAuth();"," }"," return Reflect.get(instance, prop, instance);"," },","});","export type UserSession = typeof instance.$Infer.Session"],N=A.join(e,"auth.ts");this.project.createSourceFile(N,P.join(`
93
+ `),{overwrite:!0})}generateBetterAuthNative(e,r){const s=r.includes("postgresql"),o=r.includes("mysql");let a,n,i;s?(a=`import { Pool } from "pg";
94
+ `,n="Pool",i='new Pool({ connectionString: "" })'):o?(a=`import { createPool } from "mysql2";
95
+ `,n="ReturnType<typeof createPool>",i='createPool({ uri: "" })'):(a=`import Database from "better-sqlite3";
96
+ `,n="Database.Database",i='new Database(":memory:")');const l=this.config.extras?.includes("swagger"),p=['import { betterAuth } from "better-auth";',a.trim(),...l?['import { openAPI } from "better-auth/plugins";']:[],"",`export function createAuth(pool: ${n}) {`," return betterAuth({"," database: pool,"," emailAndPassword: { enabled: true },"," experimental: { joins: true },",...l?[" plugins: [openAPI()],"]:[]," });","}","","// Lazily created \u2014 only initializes when CLI accesses auth.options","// This is for auth schema generation only, ignore this code","function createCliAuth() {",` const pool = ${i};`," return createAuth(pool);","}","","let instance: ReturnType<typeof createAuth>;","","export const auth = new Proxy({} as ReturnType<typeof createAuth>, {"," get(_, prop) {"," if (!instance) {"," instance = createCliAuth();"," }"," return Reflect.get(instance, prop, instance);"," },","});","export type UserSession = typeof instance.$Infer.Session"],g=A.join(e,"auth.ts");this.project.createSourceFile(g,p.join(`
97
+ `),{overwrite:!0})}generateBetterAuthStateless(e,r=!1){const s=this.config.extras?.includes("swagger"),o=['import { betterAuth } from "better-auth";',...s?['import { openAPI } from "better-auth/plugins";']:[],"","export const auth = betterAuth({"," session: {"," cookieCache: {"," enabled: true,"," maxAge: 7 * 24 * 60 * 60, // 7 days",' strategy: "jwe",'," },"," },"," account: {"," storeAccountCookie: true,",' storeStateStrategy: "cookie",'," },"," experimental: { joins: true },",...s?[" plugins: [openAPI()],"]:[],"});",""].join(`
98
+ `),a=A.join(e,"auth.ts");this.project.createSourceFile(a,o,{overwrite:!0}),r||this.generateBetterAuthStatelessModule(e)}generateBetterAuthModule(e,r){const s=['import { Module } from "@nestjs/common";','import { AuthModule as BetterAuthModule } from "@thallesp/nestjs-better-auth";','import { DbService } from "../database/db.service.js";','import { createAuth } from "./auth.js";',"","@Module({"," exports: [BetterAuthModule],"," imports: ["," BetterAuthModule.forRootAsync({"," inject: [DbService],"," useFactory: (db: DbService) => ({",` auth: createAuth(db.${r}),`," }),"," }),"," ],","})","export class AuthModule {}",""],o=A.join(e,"auth.module.ts");this.project.createSourceFile(o,s.join(`
99
+ `),{overwrite:!0})}generateBetterAuthTypeormModule(e,r){const s=r.includes("postgresql"),o=r.includes("mysql");let a,n;s?(a='import { Pool } from "pg";',n="new Pool({ connectionString: process.env.POSTGRES_URL! })"):o?(a='import { createPool } from "mysql2";',n="createPool({ uri: process.env.MYSQL_URL! })"):(a='import Database from "better-sqlite3";',n='new Database(process.env.SQLITE_PATH ?? ":memory:")');const i=['import { Module } from "@nestjs/common";','import { AuthModule as BetterAuthModule } from "@thallesp/nestjs-better-auth";',a,'import { createAuth } from "./auth.js";',"","@Module({"," exports: [BetterAuthModule],"," imports: ["," BetterAuthModule.forRootAsync({"," useFactory: () => ({",` auth: createAuth(${n}),`," }),"," }),"," ],","})","export class AuthModule {}",""],l=A.join(e,"auth.module.ts");this.project.createSourceFile(l,i.join(`
100
+ `),{overwrite:!0})}generateBetterAuthStatelessModule(e){const r=['import { Module } from "@nestjs/common";','import { AuthModule as BetterAuthModule } from "@thallesp/nestjs-better-auth";','import { auth } from "./auth.js";',"","@Module({"," imports: [BetterAuthModule.forRoot({ auth })],"," exports: [BetterAuthModule],","})","export class AuthModule {}",""],s=A.join(e,"auth.module.ts");this.project.createSourceFile(s,r.join(`
101
+ `),{overwrite:!0})}async save(){await this.project.save()}}class qt{static{u(this,"PresetComposer")}presets=new Map;constructor(){this.registerDefaultPresets()}registerDefaultPresets(){this.registerPreset({architectures:["nest-api"],description:"RESTful API with JWT authentication and Swagger documentation",extras:["swagger"],generators:["auth"],id:"rest-api",name:"REST API"}),this.registerPreset({architectures:["nest-api"],description:"GraphQL API with Apollo Server and authentication",extras:["graphql","apollo"],generators:["auth"],id:"graphql-api",name:"GraphQL API"}),this.registerPreset({architectures:["nest-microservice"],description:"Microservice with messaging and inter-service communication",extras:["nats","rabbitmq"],generators:["auth"],id:"microservice",name:"Microservice"}),this.registerPreset({architectures:["nest-gateway"],description:"API Gateway for routing and load balancing",extras:["rate-limiting","load-balance"],generators:[],id:"gateway",name:"API Gateway"}),this.registerPreset({architectures:["nest-api"],description:"Complete application with database, auth, and all extras",extras:["swagger","docker","health-check","rate-limiting"],generators:["auth","config","database"],id:"fullstack",name:"Full Stack"})}registerPreset(e){this.presets.set(e.id,e)}getPreset(e){return this.presets.get(e)}getAllPresets(){return[...this.presets.values()]}getPresetsForArchitecture(e){return[...this.presets.values()].filter(r=>r.architectures.includes(e))}static composeGenerators(e){const r=new Set;return e.auth!=="none"&&r.add("auth"),e.database.length>0&&r.add("database"),[...r]}static composeExtras(e){const r=new Set(e.extras);return e.api.includes("rest")&&e.extras.includes("swagger")&&r.add("swagger"),e.orm.includes("prisma")&&r.add("prisma"),e.orm.includes("typeorm")&&r.add("typeorm"),[...r]}suggestPreset(e){if(this.getPresetsForArchitecture(e.architecture).length!==0)return e.api.includes("graphql")?this.presets.get("graphql-api"):e.architecture==="nest-microservice"?this.presets.get("microservice"):e.architecture==="nest-gateway"?this.presets.get("gateway"):e.database.length>0&&e.auth!=="none"?this.presets.get("fullstack")??this.presets.get("rest-api"):this.presets.get("rest-api")}validateContext(e,r){const s=this.getPreset(r);return s?s.architectures.includes(e.architecture):!1}}async function Gt(t,e,r){const s=[];for(const o of r)try{if(o==="auth"){const a=t.api.includes("rest"),n=new Ms({database:t.database,extras:t.extras,orm:t.orm,outputDir:`${e}/src`,skipModule:!a&&(t.auth==="better-auth"||t.auth==="better-auth:stateless"),strategy:t.auth});await(a||t.auth==="passport"?n.generate():n.generateAuthOnly()),await n.save(),s.push({filesCount:3,generatedFiles:[],success:!0})}else console.log(`Generator ${o} not yet implemented`)}catch(a){s.push({error:a instanceof Error?a.message:"Unknown error",filesCount:0,generatedFiles:[],success:!1})}return s}u(Gt,"executePresetGenerators");function $t(t){const e=["services:",` ${t.projectName}:`," build:"," context: ."," dockerfile: Dockerfile"," ports:",` - "${t.httpProvider==="fastify"?"3001:3001":"3000:3000"}"`," environment:"," - NODE_ENV=development"],r=[],s=t.projectName;if(t.database.includes("postgresql")&&r.push("postgres"),t.database.includes("mysql")&&r.push("mysql"),t.database.includes("mongodb")&&r.push("mongodb"),r.length>0){e.push(" depends_on:");for(const a of r)e.push(` - ${a}`)}return e.push(" volumes:"),e.push(" - .:/app"),e.push(" - /app/node_modules"),t.database.includes("postgresql")&&(e.push(""),e.push(" postgres:"),e.push(" image: postgres:17-alpine"),e.push(" environment:"),e.push(" POSTGRES_USER: postgres"),e.push(" POSTGRES_PASSWORD: postgres"),e.push(` POSTGRES_DB: ${s}_db`),e.push(" ports:"),e.push(' - "5432:5432"'),e.push(" volumes:"),e.push(" - postgres_data:/var/lib/postgresql/data")),t.database.includes("mysql")&&(e.push(""),e.push(" mysql:"),e.push(" image: mysql:9"),e.push(" environment:"),e.push(" MYSQL_ROOT_PASSWORD: mysql"),e.push(` MYSQL_DATABASE: ${s}_db`),e.push(" ports:"),e.push(' - "3306:3306"'),e.push(" volumes:"),e.push(" - mysql_data:/var/lib/mysql")),t.database.includes("mongodb")&&(e.push(""),e.push(" mongodb:"),e.push(" image: mongo:8"),e.push(" environment:"),e.push(` MONGO_INITDB_DATABASE: ${s}_db`),e.push(" ports:"),e.push(' - "27017:27017"'),e.push(" volumes:"),e.push(" - mongo_data:/data/db")),t.database.some(a=>["postgresql","mysql","mongodb"].includes(a))&&(e.push(""),e.push("volumes:"),t.database.includes("postgresql")&&e.push(" postgres_data:"),t.database.includes("mysql")&&e.push(" mysql_data:"),t.database.includes("mongodb")&&e.push(" mongo_data:")),`${e.join(`
102
+ `)}
103
+ `}u($t,"generateDockerCompose");const Cs={name:"@nest-arch/dependencies-reference",version:"0.0.0",description:"Single source of truth for dependency versions used across all generated templates. Do not install this package.",private:!0,catalog:{"@types/node":"^22.13.14",dotenv:"^17.2.2",typescript:"^6.0.2",zod:"^4.4.3"},dependencies:{"@better-auth/drizzle-adapter":"^1.2.0","@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.7.13","@nestjs/apollo":"^14.0.0-next.0","@nestjs/common":"next","@nestjs/core":"next","@nestjs/graphql":"^14.0.0-next.0","@nestjs/jwt":"next","@nestjs/microservices":"next","@nestjs/passport":"next","@nestjs/platform-express":"next","@nestjs/platform-fastify":"next","@nestjs/swagger":"next","@nestjs/terminus":"next","@nestjs/throttler":"next","@nestjs/typeorm":"11.0.1","@prisma/adapter-pg":"^7.8.0","@prisma/adapter-ppg":"^7.8.0","@prisma/client":"^7.8.0","@scalar/nestjs-api-reference":"^1.2.4","@t3-oss/env-core":"^0.13.11","@thallesp/nestjs-better-auth":"^2.6.1","@trpc/client":"^11.18.0","@trpc/openapi":"^11.18.0-alpha","@trpc/server":"^11.18.0",amqplib:"^0.10.5","apollo-server-express":"^3.13.0","apollo-server-fastify":"^3.13.0","better-auth":"^1.6.17","better-sqlite3":"^12.19.0",dotenv:"^17.2.2","drizzle-orm":"^0.45.2",graphql:"^16.10.0",ioredis:"^5.6.0",kafkajs:"^2.2.4",mongodb:"^6.13.0",mqtt:"^5.10.0",mysql2:"^3.12.0",nats:"^2.28.0","nestjs-trpc":"^2.11.0","nestjs-zod":"^5.4.0",passport:"^0.7.0","passport-jwt":"^4.0.1","passport-local":"^1.0.0",pg:"^8.21.0","reflect-metadata":"^0.2.2",rxjs:"^7.8.1",typeorm:"^1.0.0",zod:"^4.4.3"},devDependencies:{"@nestjs/cli":"next","@nestjs/schematics":"next","@nestjs/testing":"next","@types/amqplib":"^0.10.6","@types/better-sqlite3":"^9.4.4","@types/express":"^5.0.0","@types/node":"^24.0.0","@types/passport-jwt":"^4.0.1","@types/passport-local":"^1.0.38","@types/pg":"^8.11.11","@types/supertest":"^7.0.0","@vitest/coverage-v8":"4.1.6","drizzle-kit":"^0.31.10",husky:"^9.1.7",oxfmt:"^0.52.0",oxlint:"^1.67.0",prisma:"^7.8.0","source-map-support":"^0.5.21",supertest:"^7.0.0",turbo:"^2.8.12",typescript:"^6.0.2",ultracite:"7.8.3",vitest:"^4.1.2"}};function Lt(){return Cs}u(Lt,"loadReference");function h(t){const e=Lt(),r=e.dependencies[t]??e.devDependencies[t];if(!r)throw new Error(`Dependency "${t}" not found in reference package.json`);return r}u(h,"getDependencyVersion");function Is(){return{...Lt().catalog}}u(Is,"getCatalogDependencies");const Ds=[{dest:"tsconfig.json",src:"base/tsconfig.json.hbs"},{dest:"tsconfig.build.json",src:"base/tsconfig.build.json.hbs"},{dest:"nest-cli.json",src:"base/nest-cli.json.hbs"},{dest:".gitignore",src:"base/.gitignore.hbs"},{dest:".env",src:"base/.env.hbs"},{dest:"README.md",src:"base/README.md.hbs"},{dest:"vitest.config.ts",src:"base/vitest.config.ts.hbs"},{dest:"vitest.config.e2e.ts",src:"base/vitest.config.e2e.ts.hbs"},{dest:"src/main.ts",src:"base/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"base/src/app.module.ts.hbs"},{dest:"src/app.service.ts",src:"base/src/app.service.ts.hbs"},{dest:"src/config/env.ts",src:"single-project/shared/config/env.ts.hbs"}],Ns={dest:"pnpm-workspace.yaml",src:"base/pnpm-workspace.yaml.hbs"},xs={dest:".yarnrc.yml",src:"base/.yarnrc.yml.hbs"},zs=[{dest:"src/app.controller.ts",src:"base/src/app.controller.ts.hbs"},{dest:"src/app.controller.spec.ts",src:"base/src/app.controller.spec.ts.hbs"},{dest:"test/app.e2e-spec.ts",src:"base/test/app.e2e-spec.ts.hbs"}],qs=[{dest:"src/app.router.ts",src:"base/src/app.router.ts.hbs"},{dest:"src/app.router.spec.ts",src:"base/src/app.router.spec.ts.hbs"},{dest:"src/libs/trpc/context.ts",src:"base/src/libs/trpc/context.ts.hbs"},{dest:"src/libs/trpc/error.handler.ts",src:"base/src/libs/trpc/error.handler.ts.hbs"},{dest:"src/libs/trpc/protected.ts",src:"base/src/libs/trpc/protected.ts.hbs"},{dest:"src/libs/trpc/inner.context.ts",src:"base/src/libs/trpc/inner.context.ts.hbs"},{dest:"src/libs/middlewares/auth.trpc.middleware.ts",src:"base/src/libs/middlewares/auth.trpc.middleware.ts.hbs"},{dest:"src/libs/trpc/scripts/fix-trpc-generated.mjs",src:"base/src/libs/trpc/scripts/fix-trpc-generated.mjs.hbs"},{dest:"src/libs/trpc/scripts/watch-trpc.mjs",src:"base/src/libs/trpc/scripts/watch-trpc.mjs.hbs"}],Gs=[{dest:".husky/pre-commit",src:"addons/husky/pre-commit.hbs"}],$s=[{dest:"Dockerfile",src:"extras/docker/Dockerfile.hbs"},{dest:"docker-compose.yml",src:"extras/docker/docker-compose.yml.hbs"},{dest:".dockerignore",src:"extras/docker/.dockerignore.hbs"}],Ls=[{dest:"src/database/adapters/interfaces/db-adapter.interface.ts",src:"base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs"},{dest:"src/database/adapters/sql/prisma-sql.adapter.ts",src:"base/src/database/adapters/sql/prisma-sql.adapter.ts.hbs"},{dest:"src/database/adapters/sql/drizzle-sql.adapter.ts",src:"base/src/database/adapters/sql/drizzle-sql.adapter.ts.hbs"},{dest:"src/database/adapters/sql/typeorm-sql.adapter.ts",src:"base/src/database/adapters/sql/typeorm-sql.adapter.ts.hbs"},{dest:"src/database/adapters/sql/raw-sql.adapter.ts",src:"base/src/database/adapters/sql/raw-sql.adapter.ts.hbs"},{dest:"src/database/adapters/mongo/prisma-mongo.adapter.ts",src:"base/src/database/adapters/mongo/prisma-mongo.adapter.ts.hbs"},{dest:"src/database/adapters/mongo/raw-mongo.adapter.ts",src:"base/src/database/adapters/mongo/raw-mongo.adapter.ts.hbs"},{dest:"src/database/db.service.ts",src:"base/src/database/db.service.ts.hbs"},{dest:"src/database/db.module.ts",src:"base/src/database/db.module.ts.hbs"},{dest:"src/database/index.ts",src:"base/src/database/index.ts.hbs"},{dest:"src/database/orm/drizzle/schema.ts",src:"base/src/database/orm/drizzle/schema.ts.hbs"},{dest:"src/database/orm/typeorm/data-source.ts",src:"base/src/database/orm/typeorm/data-source.ts.hbs"},{dest:"src/database/entities/todo.entity.ts",src:"base/src/database/entities/todo.entity.ts.hbs"}],Bs=[{dest:"packages/db/package.json",src:"monorepo/packages/db/package.json.hbs"},{dest:"packages/db/tsconfig.json",src:"monorepo/packages/db/tsconfig.json.hbs"},{dest:"packages/db/src/adapters/interfaces/db-adapter.interface.ts",src:"base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs"},{dest:"packages/db/src/adapters/sql/prisma-sql.adapter.ts",src:"base/src/database/adapters/sql/prisma-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/sql/drizzle-sql.adapter.ts",src:"base/src/database/adapters/sql/drizzle-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/sql/typeorm-sql.adapter.ts",src:"base/src/database/adapters/sql/typeorm-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/sql/raw-sql.adapter.ts",src:"base/src/database/adapters/sql/raw-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/mongo/prisma-mongo.adapter.ts",src:"base/src/database/adapters/mongo/prisma-mongo.adapter.ts.hbs"},{dest:"packages/db/src/adapters/mongo/raw-mongo.adapter.ts",src:"base/src/database/adapters/mongo/raw-mongo.adapter.ts.hbs"},{dest:"packages/db/src/db.service.ts",src:"base/src/database/db.service.ts.hbs"},{dest:"packages/db/src/db.module.ts",src:"base/src/database/db.module.ts.hbs"},{dest:"packages/db/src/index.ts",src:"base/src/database/index.ts.hbs"},{dest:"packages/db/src/orm/drizzle/schema.ts",src:"base/src/database/orm/drizzle/schema.ts.hbs"},{dest:"packages/db/src/orm/typeorm/data-source.ts",src:"base/src/database/orm/typeorm/data-source.ts.hbs"},{dest:"packages/db/src/entities/todo.entity.ts",src:"base/src/database/entities/todo.entity.ts.hbs"}],Fs={"single-project/architecture/nest-api":[{dest:"src/main.ts",src:"single-project/architecture/nest-api/src/main.ts.hbs"},{dest:".env",src:"single-project/architecture/nest-api/.env.hbs"},{dest:"package.json",src:"single-project/architecture/nest-api/package.json.hbs"},{dest:"pnpm-workspace.yaml",src:"single-project/architecture/nest-api/pnpm-workspace.yaml.hbs"}],"single-project/architecture/nest-gateway":[{dest:"src/main.ts",src:"single-project/architecture/nest-gateway/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"single-project/architecture/nest-gateway/src/app.module.ts.hbs"},{dest:"src/app.controller.ts",src:"single-project/architecture/nest-gateway/src/app.controller.ts.hbs"},{dest:"src/app.service.ts",src:"single-project/architecture/nest-gateway/src/app.service.ts.hbs"},{dest:"package.json",src:"single-project/architecture/nest-api/package.json.hbs"},{dest:"pnpm-workspace.yaml",src:"single-project/architecture/nest-api/pnpm-workspace.yaml.hbs"}],"single-project/architecture/nest-microservice":[{dest:"src/main.ts",src:"single-project/architecture/nest-microservice/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"single-project/architecture/nest-microservice/src/app.module.ts.hbs"},{dest:"src/app.controller.ts",src:"single-project/architecture/nest-microservice/src/app.controller.ts.hbs"},{dest:"src/app.service.ts",src:"single-project/architecture/nest-microservice/src/app.service.ts.hbs"},{dest:".env",src:"single-project/architecture/nest-microservice/.env.hbs"},{dest:"package.json",src:"single-project/architecture/nest-api/package.json.hbs"},{dest:"pnpm-workspace.yaml",src:"single-project/architecture/nest-api/pnpm-workspace.yaml.hbs"}]},Bt=[{dest:"turbo.json",src:"monorepo/root/turbo.json.hbs"},{dest:"tsconfig.json",src:"monorepo/root/tsconfig.json.hbs"},{dest:".gitignore",src:"monorepo/root/.gitignore.hbs"},{dest:"README.md",src:"monorepo/root/README.md.hbs"}],Us="package.json",Hs=[{dest:"apps/api-gateway/src/main.ts",src:"monorepo/apps/api-gateway/src/main.ts.hbs"},{dest:"apps/api-gateway/src/app.module.ts",src:"monorepo/apps/api-gateway/src/app.module.ts.hbs"},{dest:"apps/api-gateway/src/app.service.ts",src:"monorepo/apps/api-gateway/src/app.service.ts.hbs"},{dest:"apps/api-gateway/tsconfig.json",src:"monorepo/apps/api-gateway/tsconfig.json.hbs"},{dest:"apps/api-gateway/tsconfig.build.json",src:"monorepo/apps/api-gateway/tsconfig.build.json.hbs"},{dest:"apps/api-gateway/nest-cli.json",src:"monorepo/apps/api-gateway/nest-cli.json.hbs"},{dest:"apps/api-gateway/vitest.config.ts",src:"monorepo/apps/api-gateway/vitest.config.ts.hbs"},{dest:"apps/api-gateway/vitest.config.e2e.ts",src:"monorepo/apps/api-gateway/vitest.config.e2e.ts.hbs"}],Ws=[{dest:"apps/api-gateway/src/app.controller.ts",src:"monorepo/apps/api-gateway/src/app.controller.ts.hbs"},{dest:"apps/api-gateway/src/app.controller.spec.ts",src:"monorepo/apps/api-gateway/src/app.controller.spec.ts.hbs"},{dest:"apps/api-gateway/test/app.e2e-spec.ts",src:"monorepo/apps/api-gateway/test/app.e2e-spec.ts.hbs"}],Js=[{dest:"apps/api-gateway/src/app.router.ts",src:"base/src/app.router.ts.hbs"},{dest:"apps/api-gateway/src/app.router.spec.ts",src:"base/src/app.router.spec.ts.hbs"},{dest:"apps/api-gateway/src/libs/trpc/context.ts",src:"base/src/libs/trpc/context.ts.hbs"},{dest:"apps/api-gateway/src/libs/trpc/error.handler.ts",src:"base/src/libs/trpc/error.handler.ts.hbs"},{dest:"apps/api-gateway/src/libs/trpc/protected.ts",src:"base/src/libs/trpc/protected.ts.hbs"},{dest:"apps/api-gateway/src/libs/trpc/inner.context.ts",src:"base/src/libs/trpc/inner.context.ts.hbs"},{dest:"apps/api-gateway/src/libs/middlewares/auth.trpc.middleware.ts",src:"base/src/libs/middlewares/auth.trpc.middleware.ts.hbs"},{dest:"apps/api-gateway/src/libs/trpc/scripts/fix-trpc-generated.mjs",src:"base/src/libs/trpc/scripts/fix-trpc-generated.mjs.hbs"},{dest:"apps/api-gateway/src/libs/trpc/scripts/watch-trpc.mjs",src:"base/src/libs/trpc/scripts/watch-trpc.mjs.hbs"}],Ys=[{dest:"packages/config/package.json",src:"monorepo/packages/config/package.json.hbs"},{dest:"packages/config/tsconfig.base.json",src:"monorepo/packages/config/tsconfig.base.json.hbs"},{dest:"packages/config/tsconfig.nestjs.json",src:"monorepo/packages/config/tsconfig.nestjs.json.hbs"},{dest:"packages/env/package.json",src:"monorepo/packages/env/package.json.hbs"},{dest:"packages/env/src/api-gateway.ts",src:"monorepo/packages/env/src/api-gateway.ts.hbs"},{dest:"packages/env/tsconfig.json",src:"monorepo/packages/env/tsconfig.json.hbs"},{dest:"packages/shared/package.json",src:"monorepo/packages/shared/package.json.hbs"},{dest:"packages/shared/tsconfig.json",src:"monorepo/packages/shared/tsconfig.json.hbs"}],Ft={"addons/husky":Gs,"extras/database":Ls,"extras/docker":$s,"extras/swagger":[],"feature/rest":zs,"feature/trpc":qs,"monorepo/apps/api-gateway":Hs,"monorepo/feature/rest":Ws,"monorepo/feature/trpc":Js,"monorepo/packages":Ys,"monorepo/packages/db":Bs,"monorepo/root":Bt};function Ut(t,e,r){t.auth==="passport"?(e["@nestjs/jwt"]=h("@nestjs/jwt"),e["@nestjs/passport"]=h("@nestjs/passport"),e.passport=h("passport"),e["passport-jwt"]=h("passport-jwt"),r["@types/passport-jwt"]=h("@types/passport-jwt"),t.database.length>0&&t.orm.includes("typeorm")&&(e["@nestjs/typeorm"]=h("@nestjs/typeorm"),e.typeorm=h("typeorm"))):(t.auth==="better-auth"||t.auth==="better-auth:stateless")&&(e["better-auth"]=h("better-auth"),e["@thallesp/nestjs-better-auth"]=h("@thallesp/nestjs-better-auth"),t.orm.includes("drizzle")&&(e["@better-auth/drizzle-adapter"]=h("@better-auth/drizzle-adapter")));for(const s of t.api)if(s==="graphql"){e["@nestjs/graphql"]=h("@nestjs/graphql"),e["@nestjs/apollo"]=h("@nestjs/apollo"),e.graphql=h("graphql");const o=t.httpProvider==="fastify"?"apollo-server-fastify":"apollo-server-express";e[o]=h(o)}else s==="trpc"&&(e["@trpc/server"]=h("@trpc/server"),e["@trpc/client"]=h("@trpc/client"),e["@trpc/openapi"]=h("@trpc/openapi"),e["nestjs-trpc"]=h("nestjs-trpc"));t.extras.includes("swagger")&&(e["@nestjs/swagger"]=h("@nestjs/swagger"),t.addons.includes("scalar-ui")&&(e["@scalar/nestjs-api-reference"]=h("@scalar/nestjs-api-reference"))),t.extras.includes("health-check")&&(e["@nestjs/terminus"]=h("@nestjs/terminus")),t.extras.includes("rate-limiting")&&(e["@nestjs/throttler"]=h("@nestjs/throttler"));for(const s of t.microservices)s==="redis"?e.ioredis=h("ioredis"):s==="mqtt"?e.mqtt=h("mqtt"):s==="nats"?e.nats=h("nats"):s==="rabbitmq"?(e.amqplib=h("amqplib"),r["@types/amqplib"]=h("@types/amqplib")):s==="kafka"?e.kafkajs=h("kafkajs"):s==="grpc"&&(e["@grpc/grpc-js"]=h("@grpc/grpc-js"),e["@grpc/proto-loader"]=h("@grpc/proto-loader"));t.addons.includes("nestjs-zod")&&(e["nestjs-zod"]=h("nestjs-zod"))}u(Ut,"addConditionalDependencies");function Ht(t,e,r){const s=t.orm.includes("prisma"),o=t.orm.includes("drizzle"),a=t.orm.includes("typeorm"),n=t.database.length>0&&!s&&!o&&!a;for(const i of t.orm)i==="prisma"?(e["@prisma/client"]=h("@prisma/client"),r.prisma=h("prisma"),t.database.includes("postgresql")&&(e["@prisma/adapter-pg"]=h("@prisma/adapter-pg")),t.database.includes("mysql")&&(e["@prisma/adapter-mysql2"]=h("@prisma/adapter-mysql2")),t.database.includes("sqlite")&&(e["@prisma/adapter-better-sqlite3"]=h("@prisma/adapter-better-sqlite3"))):i==="typeorm"?(e.typeorm=h("typeorm"),e["@nestjs/typeorm"]=h("@nestjs/typeorm"),t.database.includes("postgresql")&&(e.pg=h("pg"),r["@types/pg"]=h("@types/pg"))):i==="drizzle"&&(e["drizzle-orm"]=h("drizzle-orm"),r["drizzle-kit"]=h("drizzle-kit"));t.database.includes("postgresql")&&o&&(e.pg=h("pg"),r["@types/pg"]=h("@types/pg")),t.database.includes("mysql")&&o&&(e.mysql2=h("mysql2")),t.database.includes("sqlite")&&o&&(e["better-sqlite3"]=h("better-sqlite3"),r["@types/better-sqlite3"]=h("@types/better-sqlite3")),t.database.includes("mongodb")&&n&&(e.mongodb=h("mongodb"))}u(Ht,"addDatabaseDependencies");async function Ks(t,e,r,s,o,a){try{const n=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",i={"@nestjs/common":h("@nestjs/common"),"@nestjs/core":h("@nestjs/core"),[n]:h(n),"@t3-oss/env-core":h("@t3-oss/env-core"),dotenv:h("dotenv"),"reflect-metadata":h("reflect-metadata"),rxjs:h("rxjs"),zod:h("zod")},l={"@nestjs/cli":h("@nestjs/cli"),"@nestjs/schematics":h("@nestjs/schematics"),"@nestjs/testing":h("@nestjs/testing"),"@types/node":h("@types/node"),"@types/supertest":h("@types/supertest"),"@vitest/coverage-v8":h("@vitest/coverage-v8"),"source-map-support":h("source-map-support"),supertest:h("supertest"),typescript:h("typescript"),vitest:h("vitest")};t.httpProvider==="express"&&(l["@types/express"]=h("@types/express"));const p={build:"nest build",dev:"nest start --watch",start:"nest start","start:debug":"nest start --debug --watch","start:dev":"nest start --watch","start:prod":"node dist/main",test:"vitest run","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts","test:watch":"vitest"};Ut(t,i,l),Ht(t,i,l),t.addons.includes("ultracite")&&(l.ultracite=h("ultracite"),p.check="ultracite check",p.fix="ultracite fix"),t.addons.includes("husky")&&(l.husky=h("husky"),p.prepare="husky"),t.orm.includes("prisma")&&(p["prisma:generate"]="prisma generate",p["prisma:push"]="prisma db push",p["prisma:studio"]="prisma studio",p["prisma:migrate"]="prisma migrate dev",p["prisma:migrate:deploy"]="prisma migrate deploy",p.postinstall="prisma generate"),t.orm.includes("drizzle")&&(p["db:generate"]="drizzle-kit generate",p["db:migrate"]="drizzle-kit migrate",p["db:studio"]="drizzle-kit studio",p["db:push"]="drizzle-kit push"),t.api.includes("trpc")&&(p["trpc:generate"]="nestjs-trpc generate -e src/app.module.ts -o src/libs/trpc/@generated && node src/libs/trpc/scripts/fix-trpc-generated.mjs",p["trpc:watch"]="node src/libs/trpc/scripts/watch-trpc.mjs"),t.orm.includes("typeorm")&&(p["typeorm:run"]="typeorm migration:run -d src/database/orm/typeorm/data-source.ts",p["typeorm:revert"]="typeorm migration:revert -d src/database/orm/typeorm/data-source.ts",p["typeorm:generate"]="typeorm migration:generate -d src/database/orm/typeorm/data-source.ts",p["typeorm:create"]="typeorm migration:create");const g={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:p,dependencies:i,devDependencies:l},d=JSON.stringify(g,null,2),f=await r.writeFile({content:d,filePath:"package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});f.written&&o.push(f.filePath)}catch(n){const i=n instanceof Error?n.message:String(n);a.push(`Failed to generate package.json: ${i}`),console.error("Failed to generate package.json:",n)}}u(Ks,"generateSingleProjectPackageJson");async function Vs(t,e,r,s,o,a){try{const n={build:"turbo build","check-types":"turbo check-types",dev:"turbo dev"},i={"@repo/env":"workspace:*",dotenv:"catalog:",zod:"catalog:"},l={"@repo/config":"workspace:*","@types/node":"catalog:",turbo:h("turbo"),typescript:"catalog:"};t.addons.includes("ultracite")&&(n.check="ultracite check"),t.addons.includes("husky")&&(l.husky=h("husky"),n.prepare="husky");const g={bun:"bun@1.3.14",npm:void 0,pnpm:"pnpm@11.6.0",yarn:"yarn@4.6.0"}[t.packageManager],d={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,workspaces:["apps/*","packages/*"],type:"module",...g?{packageManager:g}:{},...t.packageManager==="bun"?{catalog:Is()}:{},scripts:n,dependencies:i,devDependencies:l},f=JSON.stringify(d,null,2),P=await r.writeFile({content:f,filePath:Us,isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});P.written&&o.push(P.filePath)}catch(n){const i=n instanceof Error?n.message:String(n);a.push(`Failed to generate monorepo root package.json: ${i}`),console.error("Failed to generate monorepo root package.json:",n)}}u(Vs,"generateMonorepoRootPackageJson");async function Qs(t,e,r,s,o,a){try{const n=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",i={"@nestjs/common":h("@nestjs/common"),"@nestjs/core":h("@nestjs/core"),[n]:h(n),"@repo/env":"workspace:*","reflect-metadata":h("reflect-metadata"),rxjs:h("rxjs"),zod:"catalog:"};t.database.length>0&&(i["@repo/db"]="workspace:*");const l={"@nestjs/cli":h("@nestjs/cli"),"@nestjs/schematics":h("@nestjs/schematics"),"@nestjs/testing":h("@nestjs/testing"),"@repo/config":"workspace:*","@types/node":"catalog:","@types/supertest":h("@types/supertest"),"@vitest/coverage-v8":h("@vitest/coverage-v8"),"source-map-support":h("source-map-support"),supertest:h("supertest"),typescript:"catalog:",vitest:h("vitest")};t.httpProvider==="express"&&(l["@types/express"]=h("@types/express"));const p={build:"nest build",dev:"nest start --watch",start:"nest start","start:debug":"nest start --debug --watch","start:dev":"nest start --watch","start:prod":"node dist/main",test:"vitest run","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts","test:watch":"vitest"};Ut(t,i,l),t.addons.includes("ultracite")&&(l.ultracite=h("ultracite"),p.check="ultracite check",p.fix="ultracite fix"),t.addons.includes("husky")&&(l.husky=h("husky"),p.prepare="husky"),t.api.includes("trpc")&&(p["trpc:generate"]="nestjs-trpc generate -e src/app.module.ts -o ../../packages/shared/src/trpc/@generated && node src/libs/trpc/scripts/fix-trpc-generated.mjs",p["trpc:watch"]="node src/libs/trpc/scripts/watch-trpc.mjs");const g={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:p,dependencies:i,devDependencies:l},d=JSON.stringify(g,null,2),f=await r.writeFile({content:d,filePath:"apps/api-gateway/package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});f.written&&o.push(f.filePath)}catch(n){const i=n instanceof Error?n.message:String(n);a.push(`Failed to generate monorepo app package.json: ${i}`),console.error("Failed to generate monorepo app package.json:",n)}}u(Qs,"generateMonorepoAppPackageJson");async function Xs(t,e,r,s,o,a){try{const n={"@nestjs/common":"catalog:","@nestjs/core":"catalog:","reflect-metadata":"catalog:",rxjs:"catalog:"},i={"@repo/config":"workspace:*","@types/node":"catalog:",typescript:"catalog:"};Ht(t,n,i);const l={};t.orm.includes("prisma")&&(l["prisma:generate"]="prisma generate",l["prisma:push"]="prisma db push",l["prisma:studio"]="prisma studio",l["prisma:migrate"]="prisma migrate dev",l["prisma:migrate:deploy"]="prisma migrate deploy",l.postinstall="prisma generate"),t.orm.includes("drizzle")&&(l["db:generate"]="drizzle-kit generate",l["db:migrate"]="drizzle-kit migrate",l["db:studio"]="drizzle-kit studio",l["db:push"]="drizzle-kit push"),t.orm.includes("typeorm")&&(l["typeorm:run"]="typeorm-ts esm migration:run -d src/database/orm/typeorm/data-source.ts",l["typeorm:revert"]="typeorm-ts esm migration:revert -d src/database/orm/typeorm/data-source.ts",l["typeorm:generate"]="typeorm-ts esm migration:generate -d src/database/orm/typeorm/data-source.ts",l["typeorm:create"]="typeorm migration:create");const p={name:"@repo/db",version:"0.0.1",private:!0,type:"module",main:"./src/index.ts",exports:{".":"./src/index.ts"},...Object.keys(l).length>0?{scripts:l}:{},dependencies:n,devDependencies:i},g=JSON.stringify(p,null,2),d=await r.writeFile({content:g,filePath:"packages/db/package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});d.written&&o.push(d.filePath)}catch(n){const i=n instanceof Error?n.message:String(n);a.push(`Failed to generate monorepo db package.json: ${i}`),console.error("Failed to generate monorepo db package.json:",n)}}u(Xs,"generateMonorepoDbPackageJson");class Zs{static{u(this,"ProjectGenerator")}templateEngine;fileWriter;registry;options;mapper;constructor(e,r){this.options=r,this.fileWriter=new Ur(e),this.templateEngine=new it(r.templatesDir,{cache:r.cacheTemplates??!0}),this.registry=new as,this.mapper=new $e,Ps(this.mapper)}getMapper(){return this.mapper}async generate(e){const r=Date.now(),s=[],o=[];try{const a=this.mapper.resolve(e);let n=_s(e);n=Os(n,a.extraVariables),n.hasUltracite=e.addons.includes("ultracite"),n.hasHusky=e.addons.includes("husky"),await(e.projectType==="monorepo"?this.generateMonorepo(e,n,a.templateGroups,s,o):this.generateSingleProject(e,n,a.templateGroups,s,o));const i=Date.now()-r,l=o.length===0;return l&&await this.generateMetadata(e,n,s,o),console.log(`\u2705 Project generated in ${i}ms`),{error:l&&o.length===0?void 0:o.join(`
104
+ `),filesCount:s.length,generatedFiles:s,success:l&&o.length===0}}catch(a){return{error:a instanceof Error?a.message:"Unknown error",filesCount:0,generatedFiles:s,success:!1}}}async generateSingleProject(e,r,s,o,a){const n={dryRun:this.options.dryRun,overwrite:this.options.overwrite},i=[...Ds];r.packageManager==="pnpm"?i.push(Ns):r.packageManager==="yarn"&&i.push(xs),await Ks(e,r,this.fileWriter,n,o,a);for(const l of i)await this.renderAndWrite(l.src,l.dest,r,o,a);e.extras.includes("swagger")&&await this.renderAndWrite("extras/swagger/create-docs.ts.hbs",e.projectType==="monorepo"?"apps/api-gateway/src/docs/create-docs.ts":"src/docs/create-docs.ts",r,o,a);for(const l of s){if(l==="monorepo/packages/db")continue;const p=Fs[l];if(p){for(const P of p)P.dest==="package.json"||P.dest==="pnpm-workspace.yaml"||P.dest===".yarnrc.yml"||await this.renderAndWrite(P.src,P.dest,r,o,a);continue}const g=Ft[l];if(!g)continue;const d=l==="extras/database"||l==="monorepo/packages/db"?this.filterDatabaseTemplates(g,r):g,f=l==="feature/trpc"?this.filterTrpcTemplates(d,r):d;for(const P of f)P.dest==="docker-compose.yml"&&e.database.length>0||await this.renderAndWrite(P.src,P.dest,r,o,a)}if(e.extras.includes("docker")&&e.database.length>0){const l=$t(e),p=await this.fileWriter.writeFile({content:l,filePath:"docker-compose.yml",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});p.written&&o.push(p.filePath)}if(e.orm.includes("prisma")&&(await this.generatePrismaSchema(e,o,a),await this.renderAndWrite("base/prisma.config.ts.hbs","prisma.config.ts",r,o,a)),e.orm.includes("drizzle")&&await this.generateDrizzleConfig(e,o,a),e.auth!=="none"){const l=qt.composeGenerators(e),p=await Gt(e,this.fileWriter.getBaseDir(),l);for(const g of p)!g.success&&g.error&&a.push(g.error)}}async generateMonorepo(e,r,s,o,a){const n={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await Vs(e,r,this.fileWriter,n,o,a),await Qs(e,r,this.fileWriter,n,o,a),e.database.length>0&&await Xs(e,r,this.fileWriter,n,o,a);for(const i of s){if(i==="monorepo/root"){for(const d of Bt)await this.renderAndWrite(d.src,d.dest,r,o,a);r.packageManager==="pnpm"?await this.renderAndWrite("monorepo/root/pnpm-workspace.yaml.hbs","pnpm-workspace.yaml",r,o,a):r.packageManager==="yarn"&&await this.renderAndWrite("monorepo/root/.yarnrc.yml.hbs",".yarnrc.yml",r,o,a);continue}const l=Ft[i];if(!l)continue;const p=i==="extras/database"||i==="monorepo/packages/db"?this.filterDatabaseTemplates(l,r):l,g=i==="monorepo/feature/trpc"?this.filterTrpcTemplates(p,r):p;for(const d of g)d.dest!=="packages/db/package.json"&&(d.dest==="docker-compose.yml"&&e.database.length>0||await this.renderAndWrite(d.src,d.dest,r,o,a))}if(e.extras.includes("swagger")&&await this.renderAndWrite("extras/swagger/create-docs.ts.hbs","apps/api-gateway/src/docs/create-docs.ts",r,o,a),e.extras.includes("docker")&&e.database.length>0){const i=$t(e),l=await this.fileWriter.writeFile({content:i,filePath:"docker-compose.yml",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});l.written&&o.push(l.filePath)}if(e.orm.includes("prisma")&&(await this.generatePrismaSchema(e,o,a),await this.renderAndWrite("base/prisma.config.ts.hbs","prisma.config.ts",r,o,a)),e.orm.includes("drizzle")&&await this.generateDrizzleConfig(e,o,a),e.auth!=="none"){const i=qt.composeGenerators(e),l=await Gt(e,this.fileWriter.getBaseDir(),i);for(const p of l)!p.success&&p.error&&a.push(p.error)}}async generateMetadata(e,r,s,o){try{const a=ps(e),n=us(a),i=await this.fileWriter.writeFile({content:n,filePath:"nest-arch.jsonc",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});i.written&&s.push(i.filePath);const l=ds(),p=await this.fileWriter.writeFile({content:l,filePath:"schema.json",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});p.written&&s.push(p.filePath)}catch(a){const n=a instanceof Error?a.message:String(a);o.push(`Failed to generate nest-arch.jsonc/schema.json: ${n}`)}}filterTrpcTemplates(e,r){const s=!!r.hasTrpcAndAuth;return e.filter(o=>o.dest.includes("libs/trpc/protected.ts")||o.dest.includes("libs/trpc/inner.context.ts")||o.dest.includes("libs/middlewares/auth.trpc.middleware.ts")?s:!0)}filterDatabaseTemplates(e,r){const s=!!r.usePrisma,o=!!r.useTypeorm,a=!!r.useDrizzle,n=!!r.useRawSql,i=!!r.hasPostgres,l=!!r.hasMysql,p=!!r.hasSqlite,g=!!r.hasMongodb;return e.filter(d=>{const{dest:f}=d;return f.includes("prisma-sql.adapter")?s&&(i||l||p):f.includes("prisma-mongo.adapter")?s&&g:f.includes("typeorm-sql.adapter")?o&&(i||l||p):f.includes("orm/typeorm/data-source")||f.includes("entities/")?o:f.includes("drizzle-sql.adapter")?a:f.includes("raw-sql.adapter")?n&&(i||l||p):f.includes("raw-mongo.adapter")?n&&g:f.includes("orm/drizzle/schema")?a:!0})}async generatePrismaSchema(e,r,s){let o="postgresql";e.database.includes("mysql")?o="mysql":e.database.includes("sqlite")?o="sqlite":e.database.includes("mongodb")&&(o="mongodb");const a=["generator client {",' provider = "prisma-client"',' output = "./generated"',"}","","datasource db {",` provider = "${o}"`,"}",""].join(`
105
+ `);try{const n=await this.fileWriter.writeFile({content:a,filePath:"src/database/orm/prisma/schema.prisma",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});n.written&&r.push(n.filePath)}catch(n){const i=n instanceof Error?n.message:String(n);s.push(`Failed to generate src/database/orm/prisma/schema.prisma: ${i}`)}}async generateDrizzleConfig(e,r,s){let o="postgresql";e.database.includes("mysql")?o="mysql":e.database.includes("sqlite")&&(o="sqlite");const a=e.projectType==="monorepo"?"./packages/db/src/orm/drizzle/schema.ts":"./src/database/orm/drizzle/schema.ts",n=a.replace("/schema.ts","/migrations");let i="process.env.POSTGRES_URL!";e.database.includes("mysql")?i="process.env.MYSQL_URL!":e.database.includes("sqlite")&&(i="process.env.SQLITE_PATH!");const l=[e.formatter==="oxlint-oxfmt"?"// oxlint-disable typescript/no-non-null-assertion":"","import 'dotenv/config';","import { defineConfig } from 'drizzle-kit';","","export default defineConfig({"," dbCredentials: {",` url: ${i},`," },",` dialect: '${o}',`,` out: '${n}',`,` schema: '${a}',`,"});",""].join(`
106
+ `);try{const p=await this.fileWriter.writeFile({content:l,filePath:"drizzle.config.ts",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});p.written&&r.push(p.filePath)}catch(p){const g=p instanceof Error?p.message:String(p);s.push(`Failed to generate drizzle.config.ts: ${g}`)}}async renderAndWrite(e,r,s,o,a){try{const n=await this.templateEngine.renderToFile(e,r,{context:s}),i=await this.fileWriter.writeFile(n,{dryRun:this.options.dryRun,overwrite:this.options.overwrite});i.written&&o.push(i.filePath)}catch(n){const i=n instanceof Error?n.message:String(n);a.push(`Failed to generate ${r}: ${i}`),console.error(`Failed to generate ${r}:`,n)}}getBaseDir(){return this.fileWriter.getBaseDir()}clearCaches(){this.templateEngine.clearCache(),this.registry.clear()}}const ea=/Resolved|Resolving/iu,ta=/Downloaded?|downloaded/iu,ra=/Link(ed|ing)/iu,sa=/saved (to )?(lockfile|bun)/iu;function aa(t){const e=[],r=t.split(`
107
+ `);for(const s of r){const o=s.trim();if(o){if(ea.test(o)){e.push({message:"Resolving packages...",phase:"resolve"});continue}if(ta.test(o)){e.push({message:"Downloading...",phase:"download"});continue}if(ra.test(o)){e.push({message:"Linking packages...",phase:"link"});continue}if(o.includes("packages installed")){e.push({message:o,percentage:100,phase:"link"});continue}if(sa.test(o)){e.push({message:"Saving lockfile...",phase:"postinstall"});continue}(o.includes("[script]")||o.includes("postinstall"))&&e.push({message:"Running postinstall scripts...",phase:"postinstall"})}}return e}u(aa,"parseBunText");class na{static{u(this,"BunInstaller")}async install(e,r,s){const o=Ce("bun install",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let a="";const n=u(l=>{const p=l.toString();a+=p;const g=aa(p);for(const d of g)r?.(d)},"handleData");o.stderr.on("data",n),o.stdout.on("data",n);const[i]=await Promise.race([re(o,"close"),re(o,"error").then(([l])=>{const p=l;throw p.code==="ENOENT"||p.code==="EINVAL"?new Error(["Bun is not installed or not found in your PATH.",""," Install Bun: https://bun.sh",""," Then restart your terminal and try again."].join(`
108
+ `)):new Error(p.message)})]);if(i===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(a.trim()||`bun install exited with code ${i}`)}}const oa=/^(\d+)\/(\d+)\s+resolving/iu,ia=/^(\d+)\/(\d+)\s+extract:/iu,ca=/^(\d+)\/(\d+)\s+(\S+)/iu,la=/^(\d+)ms\s+(.*)/iu;function pa(t){const e=[],r=t.split(`
109
+ `);for(const s of r){const o=s.trim();if(o.includes("resolving")){const a=oa.exec(o);a?e.push({completed:Number(a[1]),message:"Resolving packages...",percentage:Math.round(Number(a[1])/Number(a[2])*100),phase:"resolve",total:Number(a[2])}):e.push({message:"Resolving packages...",phase:"resolve"});continue}if(o.includes("extract:")||o.includes("http fetch")){const a=ia.exec(o)||ca.exec(o);a?e.push({completed:Number(a[1]),message:"Downloading...",percentage:Math.round(Number(a[1])/Number(a[2])*100),phase:"download",total:Number(a[2])}):e.push({message:"Downloading...",phase:"download"});continue}if(o.includes("timing")){const a=la.exec(o);if(a){const n=a[2]??"";n.includes("build")?e.push({message:"Building dependencies...",phase:"build"}):n.includes("link")&&e.push({message:"Linking packages...",phase:"link"})}continue}o.includes("postinstall")&&!o.includes("timing")&&e.push({message:"Running postinstall scripts...",phase:"postinstall"})}return e}u(pa,"parseNpmText");class ua{static{u(this,"NpmInstaller")}async install(e,r,s){const o=Ce("npm install --loglevel silly",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let a="";const n=u(l=>{const p=l.toString();a+=p;const g=pa(p);for(const d of g)r?.(d)},"handleData");o.stderr.on("data",n),o.stdout.on("data",()=>{});const[i]=await Promise.race([re(o,"close"),re(o,"error").then(([l])=>{const p=l;throw p.code==="ENOENT"||p.code==="EINVAL"?new Error(["npm is not installed or not found in your PATH.",""," Install npm: https://nodejs.org/en/download",""," Then restart your terminal and try again."].join(`
110
+ `)):new Error(p.message)})]);if(i===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(a.trim()||`npm install exited with code ${i}`)}}function da(t,e){const r=e?.status,s=e?.progress;switch(r){case"resolving":return{message:"Resolving packages...",percentage:s??0,phase:"resolve"};case"downloading":case"fetching":return{message:"Downloading...",percentage:s??e?.progress,phase:"download"};case"linking":return{message:"Linking packages...",percentage:s??0,phase:"link"};case"build":return{message:"Building dependencies...",percentage:s??0,phase:"build"};default:return{message:r||"Installing dependencies...",percentage:s??0,phase:"download"}}}u(da,"mapPnpmStage");function ma(t){const e=t?.status;return e==="downloaded"?{message:"Downloaded packages",percentage:100,phase:"download"}:e==="installed"?{message:"Packages installed",percentage:100,phase:"link"}:null}u(ma,"mapPnpmStat");function ha(t){const e=t.data;return e&&e.total>0?{completed:e.fetched,message:`Downloading ${e.package}...`,percentage:Math.round(e.fetched/e.total*100),phase:"download",total:e.total}:{message:"Downloading...",phase:"download"}}u(ha,"mapPnpmFetching");function ga(t){if(!t.type)return null;switch(t.type){case"stage":{const e=t.data?.stage;return e?da(e,t.data):null}case"stat":return ma(t.data);case"fetching":return ha(t);case"warning":case"error":return{message:t.message??t.type,phase:"download"};default:return null}}u(ga,"parsePnpmLine");class fa{static{u(this,"PnpmInstaller")}async install(e,r,s){const o=Ce("pnpm install --reporter ndjson",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let a="";o.stdout.on("data",i=>{const l=i.toString().split(`
111
+ `).filter(Boolean);for(const p of l)try{const g=JSON.parse(p),d=ga(g);d&&r&&r(d)}catch{}}),o.stderr.on("data",i=>{a+=i.toString()});const[n]=await Promise.race([re(o,"close"),re(o,"error").then(([i])=>{const l=i;throw l.code==="ENOENT"||l.code==="EINVAL"?new Error(["pnpm is not installed or not found in your PATH.",""," Install pnpm: npm install -g pnpm"," Or enable Corepack: corepack enable && corepack prepare pnpm@latest --activate",""," Then restart your terminal and try again."].join(`
112
+ `)):new Error(l.message)})]);if(n===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(a.trim()||`pnpm install exited with code ${n}`)}}function ba(t){switch(t.type){case"step":{const e=t.displayName??"";return e.includes("Resolution")?{message:"Resolving packages...",phase:"resolve"}:e.includes("Fetch")?{message:"Downloading...",phase:"download"}:e.includes("Link")?{message:"Linking packages...",phase:"link"}:e.includes("Build")?{message:"Building dependencies...",phase:"build"}:{message:e||"Installing...",phase:"postinstall"}}case"progress":{const e=typeof t.data=="object"?t.data:void 0,r=e?.current,s=e?.total;return r!==void 0&&s!==void 0?{completed:r,message:"Processing...",percentage:Math.round(r/s*100),phase:"download",total:s}:null}case"success":return{message:typeof t.data=="string"?t.data:t.data?.message??"Done",percentage:100,phase:"complete"};case"error":return{message:typeof t.data=="string"?t.data:t.data?.message??"Error",phase:"download"};default:return null}}u(ba,"parseYarnLine");class ya{static{u(this,"YarnInstaller")}async install(e,r,s){const o=Ce("yarn install --json",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let a="";o.stdout.on("data",i=>{const l=i.toString().split(`
113
+ `).filter(Boolean);for(const p of l)try{const g=JSON.parse(p),d=ba(g);d&&r&&r(d)}catch{}}),o.stderr.on("data",i=>{a+=i.toString()});const[n]=await Promise.race([re(o,"close"),re(o,"error").then(([i])=>{const l=i;throw l.code==="ENOENT"||l.code==="EINVAL"?new Error(["Yarn is not installed or not found in your PATH.",""," Install Yarn: npm install -g yarn",""," Then restart your terminal and try again."].join(`
114
+ `)):new Error(l.message)})]);if(n===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(a.trim()||`yarn install exited with code ${n}`)}}function wa(t){switch(t){case"pnpm":return new fa;case"npm":return new ua;case"yarn":return new ya;case"bun":return new na;default:throw new Error(`Unhandled package manager: ${t}`)}}u(wa,"createPackageInstaller");class ja{static{u(this,"ProjectPipeline")}outputDir;generatorOptions;constructor(e,r){this.outputDir=e,this.generatorOptions=r}async execute(e,r){const s=[],o=[],a=u(d=>{r?.onStageChange?.(d)},"emitStage"),n=u(d=>{s.push(d)},"addPhase");a("generate-files");const i=new Zs(this.outputDir,this.generatorOptions);try{const d=await i.generate(e);if(o.push(...d.generatedFiles),!d.success)return n({error:d.error,phase:"generate-files",success:!1}),this.buildResult(!1,s,o);n({phase:"generate-files",success:!0})}catch(d){return n({error:d instanceof Error?d.message:String(d),phase:"generate-files",success:!1}),this.buildResult(!1,s,o)}if(e.formatter!=="none"){a("setup-linter");try{const d=await ss(this.outputDir,e);if(!d.success)return n({error:d.message,phase:"setup-linter",success:!1}),this.buildResult(!1,s,o);const f=await cs(this.outputDir,e.formatter);if(!f.success)return n({error:f.message??"Rule injection failed",phase:"setup-linter",success:!1}),this.buildResult(!1,s,o);n({phase:"setup-linter",success:!0})}catch(d){return n({error:d instanceof Error?d.message:String(d),phase:"setup-linter",success:!1}),this.buildResult(!1,s,o)}}else n({phase:"setup-linter",skipped:!0,success:!0});if(e.initGit){a("initialize-git");try{await Jr(this.outputDir)||await Hr(this.outputDir),n({phase:"initialize-git",success:!0})}catch(d){n({error:d instanceof Error?d.message:String(d),phase:"initialize-git",success:!1})}if(s[2]?.success){a("initial-commit");try{await xt(this.outputDir),await zt(this.outputDir,"Initial project scaffold"),n({phase:"initial-commit",success:!0})}catch(d){n({error:d instanceof Error?d.message:String(d),phase:"initial-commit",success:!1})}}else n({phase:"initial-commit",skipped:!0,success:!0})}else n({phase:"initialize-git",skipped:!0,success:!0}),n({phase:"initial-commit",skipped:!0,success:!0});let l=!1;if(e.installDependencies){a("install-dependencies");try{await wa(e.packageManager).install(this.outputDir,f=>{r?.onInstallProgress?.(f)}),l=!0,n({phase:"install-dependencies",success:!0})}catch(d){n({error:d instanceof Error?d.message:String(d),phase:"install-dependencies",success:!1})}}else n({phase:"install-dependencies",skipped:!0,success:!0});if(l&&e.formatter!=="none"){a("run-formatter");try{const d=await Xr(e.packageManager,this.outputDir);d.success?n({phase:"run-formatter",success:!0}):n({error:d.error,phase:"run-formatter",success:!1})}catch(d){n({error:d instanceof Error?d.message:String(d),phase:"run-formatter",success:!1})}}else n({phase:"run-formatter",skipped:!0,success:!0});const{5:p}=s;if(e.initGit&&p?.success&&!p.skipped){a("formatter-commit");try{await xt(this.outputDir),await Wr(this.outputDir)&&await zt(this.outputDir,"Apply formatter"),n({phase:"formatter-commit",success:!0})}catch(d){n({error:d instanceof Error?d.message:String(d),phase:"formatter-commit",success:!1})}}else n({phase:"formatter-commit",skipped:!0,success:!0});a("complete");const g=s.every(d=>d.success||d.skipped);return this.buildResult(g,s,o)}buildResult(e,r,s){return{generatedFiles:s,outputDir:this.outputDir,phases:r,success:e}}}function va(t){return{addons:t.addons,api:t.api,architecture:t.architecture,auth:t.auth,database:t.database,description:`${t.projectName} NestJS application`,extras:t.extras,formatter:t.formatter,httpProvider:t.httpProvider,initGit:t.initGit==="yes",installDependencies:t.installDependencies==="yes",microservices:t.microservices,orm:t.orm,packageManager:t.packageManager,projectName:t.projectName,projectType:t.projectType,ultraciteAgents:t.ultraciteAgents,ultraciteEditors:t.ultraciteEditors,ultraciteHooks:t.ultraciteHooks,ultraciteInstallSkill:t.ultraciteInstallSkill}}u(va,"buildGeneratorContext");function qe(t){return xe.NEST_ARCH_BETA_MODE?Y(ut(),"test-projects",t):Y(process.cwd(),t)}u(qe,"getOutputDir");function Sa(){const t=import.meta.dirname;if(t){const r=Y(t,"templates");if(ve(r))return r}return Y(t??process.cwd(),"..","..","..","..","packages","core","templates")}u(Sa,"getTemplatesDir");async function Wt(t,e){const r=qe(t.projectName),s=va(t),o=Sa(),a=new ja(r,{cacheTemplates:!0,templatesDir:o});try{const n=await a.execute(s,e),i={"formatter-commit":"Commit formatting","generate-files":"Generate project","initial-commit":"Initial commit","initialize-git":"Initialize Git","install-dependencies":"Install dependencies","run-formatter":"Run formatter","setup-linter":"Setup linter"},l=n.phases.filter(p=>!p.success&&!p.skipped&&p.error).map(p=>`${i[p.phase]||p.phase} failed:
115
+ ${p.error}`);return l.length>0?{message:l.join(`
116
+
117
+ `),outputDir:r,success:!1}:{message:`Project created with ${n.generatedFiles.length} files`,outputDir:r,success:!0}}catch(n){return{message:`Failed to generate project: ${n instanceof Error?n.message:String(n)}`,outputDir:r,success:!1}}}u(Wt,"generateProject");const ka=u(()=>({addons:[],api:[],architecture:null,auth:null,database:[],extras:[],formatter:null,httpProvider:null,initGit:null,installDependencies:null,microservices:[],orm:[],packageManager:null,projectName:"",projectType:null,ultraciteAgents:[],ultraciteEditors:[],ultraciteHooks:[],ultraciteInstallSkill:null}),"initialState");function Jt(t){return!t.packageManager||!t.formatter||!t.httpProvider||!t.projectType||!t.architecture||!t.auth||!t.initGit||!t.installDependencies?null:{addons:t.addons,api:t.api,architecture:t.architecture,auth:t.auth,database:t.database,extras:t.extras,formatter:t.formatter,httpProvider:t.httpProvider,initGit:t.initGit,installDependencies:t.installDependencies,microservices:t.architecture==="nest-gateway"?t.microservices:[],orm:Ne(t.database)?[]:t.orm,packageManager:t.packageManager,projectName:oe(t.projectName),projectType:t.projectType,ultraciteAgents:t.ultraciteAgents,ultraciteEditors:t.ultraciteEditors,ultraciteHooks:t.ultraciteHooks,ultraciteInstallSkill:t.ultraciteInstallSkill??"no"}}u(Jt,"buildResult");const Aa=u(({onBack:t,onExit:e,onStepChange:r})=>{const[s,o]=I("projectName"),[a,n]=I(ka),[i,l]=I(null),[p,g]=I(null),[d,f]=I(null),[P,N]=I(null),G=U(()=>et(a),[a]),$=U(()=>Cr(s,a),[s,a]),M=U(()=>Mr(s,a),[s,a]),z=U(()=>{const w=new Set;return a.initGit==="no"&&(w.add("initialize-git"),w.add("initial-commit")),a.installDependencies==="no"&&w.add("install-dependencies"),(a.formatter==="none"||a.installDependencies==="no")&&(w.add("setup-linter"),w.add("run-formatter")),(a.initGit==="no"||w.has("run-formatter"))&&w.add("formatter-commit"),[...w]},[a.initGit,a.installDependencies,a.formatter]);lt(()=>{if(!p||p.isError)return;const w=Jt(a);w&&Nt(w),o("done"),r?.("done")},[p,a,r]);const v=k(w=>{const y=Ir(s,w);y&&(o(y),r?.(y))},[s,r]),F=k(()=>{const w=Dr(s,a);if(w){o(w),r?.(w);return}t()},[t,a,s,r]),Z=k(()=>{const w=De(a.projectName);if(w){l(w);return}const y=oe(a.projectName),B=qe(y);if(ve(B)){l(`Directory "${B}" already exists. Choose a different name or delete the existing directory.`);return}const R={...a,projectName:y};n(R),v(R)},[v,a]),S=k(w=>{const y={...a,packageManager:w};n(y),v(y)},[v,a]),C=k(w=>{const y={...a,formatter:w};n(y),v(y)},[v,a]),x=k(w=>{const y={...a,httpProvider:w};n(y),v(y)},[v,a]),J=k(w=>{const y=w==="single"&&a.architecture==="nest-gateway"?It():a.architecture??It(),B={...a,architecture:y,extras:w==="single"?a.extras.filter(R=>R!=="packages/shared"):a.extras,microservices:y==="nest-gateway"?a.microservices:[],projectType:w};n(B),v(B)},[v,a]),ee=k(w=>{const y={...a,architecture:w,microservices:w==="nest-gateway"?a.microservices:[]};n(y),v(y)},[v,a]),ge=k(w=>{const y=w==="none"?[]:[w],B=Dt(a.orm,y),R={...a,database:y,orm:B};n(R),v(R)},[v,a]),fe=k(w=>{const y=w==="none"?[]:[w],B=qr(a.database,y),R={...a,database:B,orm:Dt(y,B)};n(R),v(R)},[v,a]),be=k(w=>{const y={...a,api:w};n(y),v(y)},[v,a]),ye=k(w=>{const y={...a,auth:w};n(y),v(y)},[v,a]),ie=k(w=>{const y={...a,extras:w};n(y),v(y)},[v,a]),Ee=U(()=>a.projectType==="monorepo"?Xe:Xe.filter(w=>w.value!=="packages/shared"),[a.projectType]),T=k(w=>{const y={...a,microservices:w};n(y),v(y)},[v,a]),V=k(w=>{const y={...a,addons:w};n(y),v(y)},[v,a]),ce=k(w=>{const y={...a,ultraciteEditors:w};n(y),v(y)},[v,a]),te=k(w=>{const y={...a,ultraciteAgents:w};n(y),v(y)},[v,a]),D=k(w=>{const y={...a,ultraciteHooks:w};n(y),v(y)},[v,a]),se=k(w=>{const y={...a,ultraciteInstallSkill:w};n(y),v(y)},[v,a]),Le=k(w=>{const y={...a,initGit:w};n(y),v(y)},[v,a]),O=k(w=>{const y={...a,installDependencies:w};n(y),v(y)},[v,a]),Re=k(async()=>{const w=Jt(a);if(w){o("installing"),r?.("installing");try{const y=await Wt(w,{onInstallProgress:u(B=>{N(B)},"onInstallProgress"),onStageChange:u(B=>{f(B)},"onStageChange")});g({isError:!y.success,message:y.message})}catch(y){g({isError:!0,message:`Error: ${y instanceof Error?y.message:String(y)}`})}}},[a,r]),Be=k(()=>{o("summary"),r?.("summary"),g(null)},[r]),Te=U(()=>s==="projectName"||s==="summary"?"confirm":s==="database"||s==="orm"||s==="apiLayer"||s==="extras"||s==="microservices"||s==="addons"||s==="ultraciteEditors"||s==="ultraciteAgents"||s==="ultraciteHooks"?"select":s==="installing"&&p?.isError?"confirm":"select",[s,p?.isError]);return{architectureOpts:U(()=>Nr(a.projectType),[a.projectType]),currentStage:d,displayStep:$,extrasStepOptions:Ee,generationStatus:p,goBack:F,handleAddons:V,handleApi:be,handleArchitecture:ee,handleAuth:ye,handleDatabase:ge,handleExtras:ie,handleFormatter:C,handleHttpProvider:x,handleInitGit:Le,handleInstallDependencies:O,handleMicroservices:T,handleOrm:fe,handlePackageManager:S,handleProjectNameSubmit:Z,handleProjectType:J,handleRetry:Be,handleSummaryConfirm:Re,handleUltraciteAgents:te,handleUltraciteEditors:ce,handleUltraciteHooks:D,handleUltraciteInstallSkill:se,installProgress:P,projectNameError:i,setProjectNameError:l,setState:n,skippedStages:z,state:a,statusAction:Te,stepId:s,subProgress:M,totalSteps:G}},"useCreateProjectWizard"),Pa=u(({onBack:t,onDone:e,onExit:r,onStepChange:s})=>{const{architectureOpts:o,currentStage:a,displayStep:n,extrasStepOptions:i,generationStatus:l,goBack:p,handleProjectNameSubmit:g,handlePackageManager:d,handleFormatter:f,handleHttpProvider:P,handleProjectType:N,handleArchitecture:G,handleDatabase:$,handleOrm:M,handleApi:z,handleAuth:v,handleExtras:F,handleMicroservices:Z,handleAddons:S,handleUltraciteEditors:C,handleUltraciteAgents:x,handleUltraciteHooks:J,handleUltraciteInstallSkill:ee,handleInitGit:ge,handleInstallDependencies:fe,handleRetry:be,handleSummaryConfirm:ye,installProgress:ie,projectNameError:Ee,setProjectNameError:T,setState:V,skippedStages:ce,statusAction:te,stepId:D,subProgress:se,totalSteps:Le,state:O}=Aa({onBack:t,onExit:r,onStepChange:s}),[Re,Be]=I([]),[Te]=I([]),ct=U(()=>O.formatter==="none"?Ze.filter(R=>R.value!=="ultracite"):Ze,[O.formatter]),w=U(()=>{let R=O;return D==="addons"&&(R={...R,addons:Re}),D==="database"&&(R={...R,database:Te}),et(R)},[D,O,Re,Te,Le]);ae(()=>{D==="done"&&e()},[D,e]),le((R,Q)=>{if(Q.ctrl&&R==="c"){r();return}if(Q.ctrl&&R==="b"&&D!=="done"){p();return}if(D==="done"&&Q.return){r();return}D==="installing"&&l?.isError&&Q.return&&be()});const y=u(()=>{switch(D){case"projectName":return c(St,{error:Ee,onChange:u(R=>{V(Q=>({...Q,projectName:R})),T(De(R))},"onChange"),onSubmit:g,value:O.projectName});case"packageManager":return c(K,{onConfirm:d,options:kt,prompt:"Choose a package manager"},"packageManager");case"formatter":return c(K,{onConfirm:f,options:At,prompt:"Choose a formatter-linter (with ultracite preset) setup"},"formatter");case"httpProvider":return c(K,{onConfirm:P,options:Pt,prompt:"Choose an HTTP provider"},"httpProvider");case"projectType":return c(K,{onConfirm:N,options:Et,prompt:"Choose a project layout"},"projectType");case"architecture":return c(K,{onConfirm:G,options:o,prompt:"Choose an application architecture"},"architecture");case"database":{const Q=[{description:"Skip database scaffolding for now",label:"No database",value:"none"},...xr(O.orm)];return c(K,{initialValue:O.database[0]??"none",onConfirm:$,options:Q,prompt:"Select a database for your project (optional)"},"database")}case"orm":{const R=Ct(O.database),Fe=[{description:"Use plain database access without an ORM",label:"No ORM",value:"none"},...R];return c(K,{initialValue:O.orm[0]??"none",onConfirm:M,options:Fe,prompt:"Select an ORM to include"},"orm")}case"apiLayer":{const R=O.architecture==="nest-api"&&O.api.length===0?["rest"]:O.api;return c(ne,{initialSelected:R,onConfirm:z,options:Tt,prompt:"Select API layers (optional)"},"apiLayer")}case"auth":{const R=zr(O.database);return c(K,{onConfirm:v,options:R,prompt:"Choose an authentication strategy"},"auth")}case"extras":return c(ne,{initialSelected:O.extras,onConfirm:F,options:i,prompt:"Select extras (optional)"},"extras");case"microservices":return c(ne,{initialSelected:O.microservices,onConfirm:Z,options:Sr,prompt:"Select microservice communication protocols"},"microservices");case"addons":return c(ne,{initialSelected:O.addons,onConfirm:S,onChange:Be,options:ct,prompt:"Select addons (optional)"},"addons");case"ultraciteEditors":return c(ne,{initialSelected:O.ultraciteEditors,onConfirm:C,options:Ar,prompt:"Select Ultracite editors",minified:!0},"ultraciteEditors");case"ultraciteAgents":return c(ne,{initialSelected:O.ultraciteAgents,onConfirm:x,options:Pr,prompt:"Select Ultracite agents",minified:!0},"ultraciteAgents");case"ultraciteHooks":return c(ne,{initialSelected:O.ultraciteHooks,onConfirm:J,options:Er,prompt:"Select Ultracite hooks"},"ultraciteHooks");case"ultraciteInstallSkill":return c(K,{onConfirm:ee,options:Rr,prompt:"Install Ultracite skill?"},"ultraciteInstallSkill");case"initGit":return c(K,{onConfirm:ge,options:_t,prompt:"Initialize a git repository?"},"initGit");case"installDependencies":return c(K,{onConfirm:fe,options:kr,prompt:"Install dependencies?"},"installDependencies");case"summary":return c(Gr,{onConfirm:ye,state:O});case"installing":return j(b,{flexDirection:"column",children:[c(yt,{currentStage:a,generationMessage:l?.message??"Scaffolding your project",installProgress:ie,isError:l?.isError??!1,packageManager:O.packageManager??void 0,skippedStages:ce}),l?.isError?c(b,{marginTop:1,children:j(m,{color:_,children:["Press ",c(m,{color:E,children:"Enter"})," to go back to Summary and retry, or ",c(m,{color:_,children:"Ctrl+B"})," to go back"]})}):null]});case"done":{const R=oe(O.projectName),Q=O.initGit==="yes",Fe=qe(R),Kt=O.installDependencies==="yes";return c(wt,{architecture:O.architecture||"nest-api",projectName:R,packageManager:O.packageManager||"pnpm",dependenciesInstalled:Kt,isGitInitialized:Q,outputDir:Fe})}default:return null}},"renderStep"),B=D!=="installing"&&D!=="done";return j(b,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[B?j(L,{children:[c($r,{state:O,stepId:D}),c(b,{height:0}),c(Lr,{displayStep:n,stepId:D,subProgress:se??void 0,totalSteps:w}),c(b,{height:2})]}):null,y(),c(b,{flexGrow:1}),B?j(L,{children:[c(ke,{}),c(b,{height:1}),c(Ye,{action:te,showBack:!0})]}):null]})},"CreateProjectWizardScreen"),nt=` _ _ ___ ___ _____ _ ___ ___ _ _
118
+ | \\| | __/ __|_ _| /_\\ | _ \\/ __| || |
119
+ | .\` | _|\\__ \\ | | / _ \\| / (__| __ |
120
+ |_|\\_|___|___/ |_| /_/ \\_\\_|_\\\\___|_||_|`,Ea=12,Ra=4,Yt=u(({onlyCat:t=!1})=>{const{stdout:e}=Ue(),r=e.columns||e.getWindowSize?.()[0]||80,s=e.rows||e.getWindowSize?.()[1]||24;return t?s<15||r<20?c(b,{flexDirection:"column",alignItems:"center",children:c(m,{bold:!0,color:E,children:pt})}):c(b,{flexDirection:"column",alignItems:"center",children:c(m,{color:E,children:Je})}):s<15||r<38?j(b,{flexDirection:"column",alignItems:"center",rowGap:0,children:[c(m,{bold:!0,color:E,children:pt}),c(m,{color:_,children:_e}),c(m,{color:W,children:Oe})]}):s<15+Ra||r<55?j(b,{flexDirection:"column",alignItems:"center",rowGap:0,children:[c(m,{color:E,children:nt}),c(m,{color:_,children:_e}),c(m,{color:W,children:Oe})]}):s<15+Ea||r<80?j(b,{flexDirection:"column",alignItems:"center",rowGap:0,children:[c(m,{color:E,children:Je}),c(m,{color:E,children:nt}),c(m,{color:_,children:_e}),c(m,{color:W,children:Oe})]}):j(b,{flexDirection:"row",columnGap:2,alignItems:"flex-start",children:[c(m,{color:E,children:Je}),j(b,{flexDirection:"column",children:[c(m,{color:E,children:nt}),j(m,{color:_,children:[" ",_e]}),j(m,{color:W,children:[" ",Oe]})]})]})},"Header"),ot={addons:["ultracite","husky"],api:["rest"],architecture:"nest-api",auth:"none",database:[],extras:[],formatter:"oxlint-oxfmt",httpProvider:"express",installDependencies:"yes",microservices:[],orm:[],packageManager:"pnpm",projectType:"single",ultraciteAgents:[],ultraciteEditors:[],ultraciteHooks:[],ultraciteInstallSkill:"no"},Ta=u(({onSelect:t,options:e})=>{const[r,s]=I(0),o=k(()=>{const a=e[r];a&&!a.disabled&&t(a)},[t,e,r]);return Ie((a,n)=>{n.upArrow||a==="k"?s(i=>Math.max(0,i-1)):n.downArrow||a==="j"?s(i=>Math.min(e.length-1,i+1)):n.return&&o()}),j(b,{flexDirection:"column",children:[c(m,{color:_,children:"Choose a project preset"}),c(b,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((a,n)=>j(b,{flexDirection:"column",children:[c(m,{children:n===r?j(L,{children:[c(m,{color:a.disabled?pe:E,children:"> "}),c(m,{color:a.disabled?pe:E,children:a.name})]}):c(m,{color:a.disabled?pe:je,children:` ${a.name}`})}),n===r&&a.description?c(m,{color:_,children:a.description}):null]},a.name))})]})},"PresetStep"),_a={done:"Done",initGit:"Git repository",installing:"Installing",preset:"Project preset",projectName:"Project name"},Oa=u(({step:t})=>j(m,{children:[c(m,{color:E,children:"\u2727 "}),c(m,{color:q,children:_a[t]})]}),"WizardTitle"),Ma=u(({onBack:t,onDone:e,onExit:r,onStepChange:s})=>{const[o,a]=I("preset"),[n,i]=I(""),[l,p]=I(null),[g,d]=I(null),[f,P]=I(null),[N,G]=I(null),[$,M]=I(null),[z,v]=I("");ae(()=>{o==="done"&&e()},[o,e]);const F=U(()=>Br(),[]),Z=U(()=>{const T=[{description:"REST API with standard NestJS modules and structure",name:"Basic NestJS API"},{description:"Microservice support with gateway routing",name:"API Gateway"}];return F?T.push({description:Fr(F),name:"Last Used"}):T.push({description:"",disabled:!0,name:"Last Used"}),T},[F]),[S,C]=I(ot),x=U(()=>{const T=new Set;return g==="no"&&(T.add("initialize-git"),T.add("initial-commit")),S.installDependencies==="no"&&T.add("install-dependencies"),(S.formatter==="none"||S.installDependencies==="no")&&(T.add("setup-linter"),T.add("run-formatter")),(g==="no"||T.has("run-formatter"))&&T.add("formatter-commit"),[...T]},[g,S]),J=k(()=>{switch(o){case"projectName":{a("preset"),s?.("preset"),p(null);return}case"initGit":{a("projectName"),s?.("projectName");return}default:t()}},[t,o,s]),ee=k(T=>{if(T.name==="Last Used"&&F){const{projectName:V,initGit:ce,...te}=F;C(te)}else T.name==="API Gateway"?C({...ot,architecture:"nest-gateway",projectType:"monorepo"}):C(ot);a("projectName"),s?.("projectName")},[F,s]),ge=k(T=>{i(T),p(De(T))},[]),fe=k(()=>{const T=De(n);if(T){p(T);return}a("initGit"),s?.("initGit")},[n,s]),be=k(async T=>{d(T);const V=oe(n),ce=qe(V);v(ce),a("installing"),s?.("installing");const te={...S,initGit:T,projectName:V};try{const D=await Wt(te,{onInstallProgress:u(se=>{M(se)},"onInstallProgress"),onStageChange:u(se=>{G(se)},"onStageChange")});P({isError:!D.success,message:D.message}),D.success&&Nt(te)}catch(D){P({isError:!0,message:`Error: ${D instanceof Error?D.message:String(D)}`})}},[n,S,s]);lt(()=>{f&&!f.isError&&(a("done"),s?.("done"))},[f,s]),le((T,V)=>{if(V.ctrl&&T==="c"){r();return}if(V.ctrl&&T==="b"&&o!=="done"){J();return}o==="done"&&V.return&&r()});const ye=U(()=>o==="projectName"?"confirm":"select",[o]),ie=o!=="installing"&&o!=="done";return j(b,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[ie?j(L,{children:[c(Yt,{}),c(ke,{}),c(b,{height:1}),c(Oa,{step:o}),c(b,{height:2})]}):null,u(()=>{switch(o){case"preset":return c(Ta,{onSelect:ee,options:Z});case"projectName":return c(St,{error:l,onChange:ge,onSubmit:fe,value:n});case"initGit":return c(K,{onConfirm:be,options:_t,prompt:"Initialize a git repository?"});case"installing":return j(b,{flexDirection:"column",children:[c(yt,{currentStage:N,generationMessage:f?.message??"Scaffolding your project",installProgress:$,isError:f?.isError??!1,skippedStages:x}),f?.isError?c(b,{marginTop:1,children:j(m,{color:_,children:["Press ",c(m,{color:E,children:"Enter"})," to go back to Summary and retry, or ",c(m,{color:_,children:"Ctrl+B"})," to go back"]})}):null]});case"done":{const T=oe(n);return c(wt,{architecture:S.architecture||"nest-api",projectName:T,packageManager:S.packageManager||"pnpm",dependenciesInstalled:S.installDependencies==="yes",isGitInitialized:g==="yes",outputDir:z})}default:return null}},"renderStep")(),c(b,{flexGrow:1}),ie?j(L,{children:[c(ke,{}),c(b,{height:1}),c(Ye,{action:ye,showBack:!0})]}):null]})},"ProjectPresetWizardScreen"),Ge=[{description:"Scaffold a new project with best practices",name:"Create a new NestJS project"},{description:"Choose from predefined configurations",name:"Use a project preset"},{description:"Browse the Nest Arch docs",name:"View documentation"},{description:"Close Nest Arch",name:"Exit"}],Ca=u(({onSelect:t})=>{const[e,r]=I(0),s=k(()=>{const n=Ge[e]??null;n?.disabled||t(e,n)},[t,e]),o=[];for(let n=0;n<Ge.length;n+=1)Ge[n].disabled||o.push(n);const a=o.indexOf(e);return Ie((n,i)=>{if(i.upArrow||n==="k"){const l=o[a-1];l!==void 0&&r(l)}else if(i.downArrow||n==="j"){const l=o[a+1];l!==void 0&&r(l)}else i.return&&s()}),j(b,{flexDirection:"column",children:[c(m,{color:_,children:" What would you like to do?"}),c(b,{marginTop:1,flexDirection:"column",rowGap:1,children:Ge.map((n,i)=>c(m,{children:i===e&&!n.disabled?j(L,{children:[c(m,{color:E,children:"> "}),c(m,{color:E,children:n.name})]}):c(m,{color:je,children:` ${n.name}`})},n.name))})]})},"MainMenu"),Ia=u(()=>j(m,{children:[c(m,{color:E,children:"\u2727 "}),c(m,{color:q,children:" Welcome to "}),c(m,{color:E,children:"Nest Arch"}),c(m,{color:q,children:" \u2013 Let's build something amazing."})]}),"WelcomeMessage"),Da=u(({onCreateProject:t,onExit:e,onUsePreset:r})=>{const s=k(async()=>{const a="https://github.com/Angel-Mario";try{await lr(a,{wait:!1})}catch{}},[]),o=k((a,n)=>{n?.name==="Exit"?e():n?.name==="Create a new NestJS project"?t():n?.name==="Use a project preset"?r():n?.name==="View documentation"&&s()},[t,e,r,s]);return le((a,n)=>{n.ctrl&&a==="c"&&e()}),j(b,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[c(Yt,{}),c(ke,{}),c(b,{height:1}),c(Ia,{}),c(b,{height:2}),c(Ca,{onSelect:o}),c(b,{flexGrow:1}),c(ke,{borderTop:!1}),c(b,{height:1}),c(Ye,{})]})},"WelcomeScreen"),Na=u(({onDone:t})=>{const[e,r]=I("welcome"),{stdout:s}=Ue(),{exit:o}=Xt(),[a,n]=I(s?.rows??24);ae(()=>{if(!s)return;const f=u(()=>{n(s.rows)},"handleResize");return s.on("resize",f),()=>{s.off("resize",f)}},[s]);const i=k(()=>{o()},[o]),l=k(()=>{r("preset-wizard")},[]),p=k(()=>{r("create-wizard")},[]),g=k(()=>{r("welcome")},[]);return c(b,{height:a,flexDirection:"column",children:u(()=>e==="create-wizard"?c(Pa,{onBack:g,onDone:t,onExit:i}):e==="preset-wizard"?c(Ma,{onBack:g,onDone:t,onExit:i}):c(Da,{onCreateProject:p,onExit:i,onUsePreset:l}),"renderScreen")()})},"App");async function xa(){process.stdout.write("\x1B[?1049h");let t=!1;try{await Qt(c(Na,{onDone:u(()=>{process.stdout.write("\x1B[?1049l"),t=!0},"onDone")})).waitUntilExit()}finally{t||process.stdout.write("\x1B[?1049l")}}u(xa,"main");try{await xa()}catch(t){console.error("Error:",t),process.exit(1)}
@@ -6,6 +6,9 @@
6
6
  # Prisma generated
7
7
  **/prisma/generated
8
8
 
9
+ # Trpc generated
10
+ **/trpc/@generated
11
+
9
12
  # Logs
10
13
  logs
11
14
  *.log