@nest-arch/tui 0.2.4 → 0.2.6

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.
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const e=new Set(["-v","--v","--version"]);if(process.argv[2]&&e.has(process.argv[2])){const{APP_VERSION:s}=await import("./constants-BPutZTpn.js");console.log(`nest-arch/${s.replace(/^v/u,"")}`),process.exit(0)}await import("./index.js");
2
+ const e=new Set(["-v","--v","--version"]);if(process.argv[2]&&e.has(process.argv[2])){const{APP_VERSION:s}=await import("./constants-B6Gqk6BP.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="Build production-ready NestJS projects.",t="#e54545",o="#A0A0A0",C="#6B6B6B",R="#E5E5E5",c="#61AFEF",s="#3A3A3A",E="#7FD99A",n="#E8C468",_="#e96142ff";export{O as APP_NAME,A as APP_TAGLINE,c as COLOR_ACCENT,o as COLOR_DIM,C as COLOR_DIMMER,s as COLOR_DIVIDER,R as COLOR_FG,t as COLOR_RED,E as COLOR_SUCCESS,n as COLOR_WARM,_ as COLOR_WARM_SECONDARY};
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- var rr=Object.defineProperty;var l=(t,e)=>rr(t,"name",{value:e,configurable:!0});import{jsx as c,jsxs as y,Fragment as N}from"react/jsx-runtime";import{Box as f,Text as u,useInput as le,useStdout as Qe,render as sr,useApp as ar}from"ink";import{useState as O,useEffect as ae,useMemo as J,useRef as qe,useCallback as R,useLayoutEffect as mt}from"react";import{COLOR_DIVIDER as pe,COLOR_RED as P,COLOR_WARM as de,COLOR_DIM as E,COLOR_FG as L,COLOR_SUCCESS as je,COLOR_DIMMER as oe,COLOR_ACCENT as W,COLOR_WARM_SECONDARY as or,APP_NAME as ht,APP_TAGLINE as xe,APP_VERSION as Ie}from"./constants-BPutZTpn.js";import nr from"ink-text-input";import{createEnv as ir}from"@t3-oss/env-nextjs";import{z as ue}from"zod";import{existsSync as ve,readFileSync as cr,mkdirSync as lr,writeFileSync as pr}from"node:fs";import{homedir as gt}from"node:os";import w,{join as Y}from"node:path";import{exec as Ye,execFile as dr,spawn as Oe}from"node:child_process";import{promisify as _e}from"node:util";import Z,{access as ur,readFile as Ce,writeFile as Se,rm as mr}from"node:fs/promises";import H from"handlebars";import{Scope as hr,Project as gr}from"ts-morph";import{once as re}from"node:events";import fr from"open";const ke=l(({borderTop:t=!0})=>c(f,{borderStyle:"single",borderBottom:!t,borderLeft:!1,borderRight:!1,borderTop:t,borderColor:pe,height:1,width:"full"}),"Divider"),yr=` \uFF0Fl\u3001
1
+ var tr=Object.defineProperty;var l=(t,e)=>tr(t,"name",{value:e,configurable:!0});import{jsx as c,jsxs as y,Fragment as N}from"react/jsx-runtime";import{Box as f,Text as u,useInput as pe,useStdout as Ve,render as rr,useApp as sr}from"ink";import{useState as _,useEffect as oe,useMemo as J,useRef as qe,useCallback as R,useLayoutEffect as ut}from"react";import{COLOR_DIVIDER as de,COLOR_RED as T,COLOR_WARM as ue,COLOR_DIM as E,COLOR_FG as L,COLOR_SUCCESS as je,COLOR_DIMMER as ne,COLOR_ACCENT as W,COLOR_WARM_SECONDARY as ar,APP_NAME as mt,APP_TAGLINE as xe}from"./constants-B6Gqk6BP.js";import or from"ink-text-input";import{createEnv as nr}from"@t3-oss/env-nextjs";import{z as me}from"zod";import{existsSync as ve,readFileSync as ir,mkdirSync as cr,writeFileSync as lr}from"node:fs";import{homedir as ht}from"node:os";import w,{join as Y}from"node:path";import{exec as Qe,execFile as pr,spawn as Ie}from"node:child_process";import{promisify as _e}from"node:util";import Z,{access as dr,readFile as Oe,writeFile as Se,rm as ur}from"node:fs/promises";import H from"handlebars";import{Scope as mr,Project as hr}from"ts-morph";import{once as se}from"node:events";import gr from"open";const ke=l(({borderTop:t=!0})=>c(f,{borderStyle:"single",borderBottom:!t,borderLeft:!1,borderRight:!1,borderTop:t,borderColor:de,height:1,width:"full"}),"Divider"),fr=` \uFF0Fl\u3001
2
2
  \uFF08\uFF9F\uFF64 \uFF61\uFF17
3
3
  l\u3001\uFF9E ~\u30FD
4
4
  \u3058\u3057(_,)\u30CE
5
- `,Xe=` ,-. _,---._ __ /\\
5
+ `,Ye=` ,-. _,---._ __ /\\
6
6
  / ) .-' \`./ / \\
7
7
  ( ( ,' \` / /|
8
8
  \\ \`-" \\'\\ / |
@@ -13,17 +13,17 @@ var rr=Object.defineProperty;var l=(t,e)=>rr(t,"name",{value:e,configurable:!0})
13
13
  | | ( | Toolkit | /
14
14
  ) | \\ \`.___________|/
15
15
  \`--' \`--'
16
- `,br=l(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"),ft=l(t=>{let e=0;for(const r of t){const s=r.codePointAt(0)??0;e+=br(s)?2:1}return e},"getDisplayWidth"),wr=2,yt=[0,1,2,3,2,1],bt=["",".","..","..."],jr=l(({message:t="Scaffolding your project",isError:e=!1,isComplete:r=!1,showProgressText:s=!0,paddingX:n=2})=>{const[o,a]=O(0),[i,p]=O(0),d=!e&&!r;ae(()=>{if(!d)return;const F=setInterval(()=>{a($=>($+1)%yt.length)},200),_=setInterval(()=>{p($=>($+1)%bt.length)},400);return()=>{clearInterval(F),clearInterval(_)}},[d]);const m=yr.trimEnd().split(`
17
- `),g=Math.max(...m.map(ft)),b=yt[o];let q=de,M="\u25CF",U=E;return e?(q=P,M="\u2717",U=L):r&&(q=je,M="\u2713",U=je),y(f,{flexDirection:"column",paddingX:n,children:[c(f,{flexDirection:"column",children:m.map((F,_)=>{const $=ft(F),G=_===0||_===m.length-1,B=g-$+wr-(G?1:0),z=_===b;return y(u,{color:P,children:[F," ".repeat(B),z?c(u,{color:q,children:M}):" "]},_)})}),s&&y(u,{color:U,children:[t,d?bt[i]:""]})]})},"ScaffoldingAnimation"),vr=[{id:"generate-files",label:"Generate project"},{id:"install-agent-skills",label:"Install agent skills"},{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"}],wt=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function Sr(t,e,r){if(!t)return r.map(o=>({stage:o,status:"pending"}));if(t==="complete")return r.map(o=>({stage:o,status:e?"failed":"completed"}));const n=r.map(o=>o.id).indexOf(t);return r.map((o,a)=>a<n?{stage:o,status:e?"failed":"completed"}:a===n?{stage:o,status:e?"failed":"active"}:e&&a>n?{stage:o,status:"pending"}:e?{stage:o,status:"failed"}:{stage:o,status:"pending"})}l(Sr,"getStages");function kr(t,e){switch(t){case"completed":return"\u2713";case"active":return e;case"failed":return"\u2717";case"pending":return"\u25CB";default:return t}}l(kr,"statusIcon");function Ar(t){switch(t){case"completed":return je;case"active":return de;case"failed":return P;case"pending":return oe;default:return t}}l(Ar,"statusColor");function Pr(t){return t===void 0?"":` (${t}%)`}l(Pr,"formatPercentage");function Tr(t){return t?.message?t.message:"Installing dependencies..."}l(Tr,"getInstallMessage");const jt=l(({currentStage:t,generationMessage:e,installProgress:r,isError:s,skippedStages:n=[]})=>{const o=J(()=>vr.filter(g=>!n.includes(g.id)),[n]),a=J(()=>Sr(t,s,o),[t,s,o]),[i,p]=O(0),d=t==="complete"&&!s;ae(()=>{if(s||d)return;const g=setInterval(()=>{p(b=>(b+1)%wt.length)},80);return()=>clearInterval(g)},[s,d]);const m=wt[i]??"\u280B";return y(f,{flexDirection:"column",paddingX:2,children:[c(f,{marginBottom:1,children:c(jr,{showProgressText:!1,paddingX:0,isError:s,isComplete:d})}),c(f,{flexDirection:"column",rowGap:0,children:a.map(g=>{const b=g.status==="active",q=b&&g.stage.id==="install-dependencies",M=r?.percentage,U=16,F=M===void 0?0:Math.round(M/100*U),_=U-F;return y(f,{flexDirection:"column",children:[y(f,{children:[y(u,{bold:b,color:Ar(g.status),children:[kr(g.status,m)," ",g.stage.label]}),q?c(u,{children:M===void 0?null:y(N,{children:[c(u,{color:de,children:Pr(M)})," ",c(u,{color:de,children:"\u2588".repeat(F)}),c(u,{color:pe,children:"\u2591".repeat(_)})]})}):null]}),q?c(f,{marginLeft:4,children:c(u,{color:E,children:Tr(r)})}):null]},g.stage.id)})}),!s&&t===null?c(f,{marginTop:1,children:c(u,{color:E,children:e})}):null,d?c(f,{marginTop:1,children:c(u,{color:je,children:e})}):null,s?c(f,{marginTop:1,flexDirection:"column",children:e.split(`
18
- `).map((g,b)=>c(u,{color:g.startsWith(" ")?E:P,children:g},b))}):null]})},"InstallationProgress"),Ke=l(({action:t="select",showBack:e=!1})=>y(u,{children:[t==="select"||t==="multi-select"?c(u,{color:E,children:"Use \u2191/\u2193 to navigate \u2022 "}):null,c(u,{color:E,children:t==="confirm"?y(N,{children:[c(u,{color:L,children:"Enter "}),"to confirm"]}):t==="multi-select"?y(N,{children:[c(u,{color:L,children:"Space "}),"to toggle \u2022",c(u,{color:L,children:" Enter "}),"to confirm"]}):y(N,{children:[c(u,{color:L,children:"Enter "}),"to select"]})}),y(u,{color:E,children:[e?y(N,{children:[" ","\u2022",c(u,{color:L,children:" Ctrl+B "}),"to go back"]}):"",y(N,{children:[" ","\u2022",c(u,{color:L,children:" Ctrl+C "}),"to exit"]})]})]}),"StatusBar"),vt=l(({architecture:t,projectName:e,packageManager:r,isGitInitialized:s,dependenciesInstalled:n,outputDir:o})=>c(f,{flexDirection:"column",children:y(f,{flexDirection:"column",marginTop:1,children:[c(u,{color:je,bold:!0,children:"\u2714 Project scaffold completed successfully!"}),y(f,{marginTop:1,children:[c(u,{color:L,children:"Project: "}),c(u,{color:W,bold:!0,children:e})]}),y(f,{children:[c(u,{color:L,children:"Architecture: "}),c(u,{color:W,bold:!0,children:t})]}),o?y(f,{children:[c(u,{color:L,children:"Location: "}),c(u,{color:W,bold:!0,children:o})]}):null,s?c(f,{marginTop:1,children:c(u,{color:E,children:"Git repository initialized"})}):null,y(f,{flexDirection:"column",borderStyle:"round",borderColor:P,paddingX:2,paddingY:1,marginTop:1,width:void 0,children:[c(u,{color:L,bold:!0,children:"\u{1F680} NEXT STEPS"}),c(f,{height:1}),c(u,{color:L,children:"1. Move into the project directory:"}),c(u,{color:W,bold:!0,children:` cd ${e}`}),c(f,{height:1}),n?c(f,{children:c(u,{color:E,children:"2. Dependencies already installed"})}):y(N,{children:[c(u,{color:L,children:"2. Install dependencies:"}),c(u,{color:W,bold:!0,children:` ${r} install`})]}),c(f,{height:1}),y(u,{color:L,children:["3."," Start development server:"]}),c(u,{color:W,bold:!0,children:` ${r} run dev`})]}),c(f,{marginTop:1,children:c(u,{color:E,children:"(Press enter to exit)"})})]})}),"DoneStep"),Er=100,Ge=l(t=>{const e=qe(0);le((r,s)=>{if(s.upArrow||s.downArrow||s.leftArrow||s.rightArrow||r==="k"||r==="j"||r==="h"||r==="l"){const o=Date.now();if(o-e.current<Er)return;e.current=o}t(r,s)})},"useArrowSelect"),Rr=l(({initialSelected:t,onConfirm:e,onChange:r,options:s,prompt:n,minified:o=!1})=>{const a=J(()=>new Set(s.map(v=>v.value)),[s]),i=R(v=>v.filter(I=>a.has(I)),[a]),[p,d]=O(0),[m,g]=O(()=>i(t)),b=qe(m);b.current=m;const q=qe(r);q.current=r,ae(()=>{const v=i(t);g(v),d(0),q.current?.(v)},[t,i]);const M=R(v=>m.includes(v),[m]),U=R(v=>{const I=s[v];I&&g(D=>{const V=D.includes(I.value)?D.filter(ee=>ee!==I.value):[...D,I.value];return b.current=V,r?.(V),V})},[s,r]),F=R(()=>{e(b.current)},[e]),_=s.length>16,$=_?Math.ceil(s.length/2):s.length;Ge((v,I)=>{I.upArrow||v==="k"?d(D=>(D-1+s.length)%s.length):I.downArrow||v==="j"?d(D=>(D+1)%s.length):_&&(I.leftArrow||v==="h")?d(D=>(D-$+s.length)%s.length):_&&(I.rightArrow||v==="l")?d(D=>(D+$)%s.length):I.return?F():(v===" "||v==="x")&&U(p)});const G=m.length,B=l((v,I)=>{const D=M(v.value),V=I===p,ee=D?"\u25CF":"\u25CB";return y(f,{flexDirection:"column",children:[c(u,{children:V?y(N,{children:[c(u,{color:P,children:"> "}),c(u,{color:D?P:E,children:`${ee} `}),c(u,{color:D?P:L,children:v.label})]}):y(N,{children:[c(u,{color:D?P:E,children:` ${ee}`}),c(u,{color:oe,children:` ${v.label}`})]})}),V&&!_?y(u,{color:E,children:[" ",v.description]}):null]},v.value)},"renderOption");let z;return _||(z=o?0:1),y(f,{flexDirection:"column",children:[c(u,{color:E,children:n}),c(u,{color:de,children:G===0?"No options selected yet \u2014 pick what you need":`${G} selected`}),c(f,{marginTop:1,flexDirection:_?"row":"column",rowGap:z,columnGap:_?4:void 0,overflow:"hidden",children:_?y(N,{children:[c(f,{flexDirection:"column",rowGap:o?0:1,flexGrow:1,flexBasis:0,children:s.slice(0,$).map((v,I)=>B(v,I))}),c(f,{flexDirection:"column",rowGap:o?0:1,flexGrow:1,flexBasis:0,children:s.slice($).map((v,I)=>B(v,I+$))})]}):s.map((v,I)=>B(v,I))})]})},"MultiSelectStep"),St="my-nest-app",kt=64,qr=/^[a-z][a-z0-9-]*$/u;function ne(t){return t.trim()||St}l(ne,"resolveProjectName");function Me(t){const e=t.trim();return e?e.length>kt?`Project name must be at most ${kt} characters`:qr.test(e)?null:"Use lowercase letters, numbers, and hyphens; must start with a letter":null}l(Me,"validateProjectName");const At=l(({error:t,onChange:e,onSubmit:r,value:s})=>(le((n,o)=>{o.return&&r()}),y(f,{flexDirection:"column",children:[c(u,{color:E,children:"Enter a name for your project"}),y(f,{marginTop:1,flexDirection:"row",alignItems:"center",columnGap:1,children:[c(u,{color:L,children:"Project name:"}),c(nr,{placeholder:St,value:s,onChange:e})]}),t?c(u,{color:P,children:t}):null]})),"ProjectNameStep"),me=ir({emptyStringAsUndefined:!0,runtimeEnv:process.env,server:{APP_MAX_WIDTH:ue.string().pipe(ue.coerce.number()).default(95),NEST_ARCH_BETA_MODE:ue.enum(["true","false"]).default("false").transform(t=>t==="true"),NEST_ARCH_SCHEMA_URL:ue.string().default("./schema.json"),NEST_ARCH_VERSION:ue.string().default("0.0.1"),NODE_ENV:ue.enum(["development","production","test"]).default("development")}}),De=l(({onConfirm:t,options:e,prompt:r,initialValue:s})=>{const[n,o]=O(()=>{const i=e.findIndex(p=>p.value===s);return Math.max(i,0)});ae(()=>{const i=e.findIndex(p=>p.value===s);o(Math.max(i,0))},[s,e]);const a=R(()=>{const i=e[n];i&&i.devOnly!==(me.NODE_ENV==="production")&&t(i.value)},[t,e,n]);return Ge((i,p)=>{p.upArrow||i==="k"?o(d=>(d-1+e.length)%e.length):p.downArrow||i==="j"?o(d=>(d+1)%e.length):p.return&&a()}),y(f,{flexDirection:"column",children:[c(u,{color:E,children:r}),c(f,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((i,p)=>{const d=p===n;return y(f,{flexDirection:"column",children:[c(u,{children:d?c(N,{children:i.devOnly===(me.NODE_ENV==="production")?y(N,{children:[c(u,{color:oe,children:"> "}),y(u,{color:oe,children:[i.label,". (Comming soon)"]})]}):y(N,{children:[c(u,{color:P,children:"> "}),c(u,{color:P,children:i.label})]})}):c(u,{color:oe,children:` ${i.label}`})}),d?c(u,{color:E,children:i.description}):null]},i.value)})})]})},"SingleSelectStep"),Pt=[{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"}],Tt=[{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"}],Et=[{description:"Default NestJS HTTP adapter",label:"Express",value:"express"},{description:"High-performance HTTP adapter",label:"Fastify",value:"fastify"}],Rt=[{description:"Standalone NestJS application",label:"Single project",value:"single"},{description:"Multiple apps and shared packages",devOnly:!0,label:"Monorepo (Turborepo)",value:"monorepo"}],qt=[{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"}],Ze=[{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:"Better SQLite",value:"sqlite"},{description:"Document database",label:"MongoDB",value:"mongodb"}],et=[{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 (Code first)",value:"graphql"}],rt=[{description:"No authentication scaffolding",label:"None",value:"none"},{description:"Flexible authentication \u2014 stateless (OAuth 2 JWE session) when no database, ORM-backed (JWT Authorization Bearer) 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"}],st=[{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"},{description:"Scaffold a Todo CRUD module example (GraphQL only)",label:"Todo Example",value:"todo-example"},{description:"Latest TypeScript compiler \u2014 faster checking and new language features (default: TypeScript 6)",label:"TypeScript 7",value:"typescript-7"}],xt=[{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:"Modern OpenAPI documentation UI",label:"Scalar UI (Recommended)",value:"scalar-ui"}],xr=[{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"}],It=[{description:"Run git init and create initial commit",label:"Yes",value:"yes"},{description:"Skip git initialization",label:"No",value:"no"}],Ir=[{description:"Install all project dependencies using the selected package manager",label:"Yes (Recommended)",value:"yes"},{description:"Skip dependency installation",label:"No",value:"no"}],Or=[{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"}],_r=[{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"}],Cr=[{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"}],Gr=[{description:"Install the reusable Ultracite skill after setup",label:"Yes",value:"yes"},{description:"Skip installing the Ultracite skill",label:"No",value:"no"}],Mr={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"},Dr=["projectName","packageManager","formatter","httpProvider","projectType","architecture","database","orm","apiLayer","auth","extras","microservices","addons","ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill","initGit","installDependencies","summary","installing","done"];function zr(t){return t.includes("mongodb")}l(zr,"databaseIncludesMongodb");function at(t){return t.length===0}l(at,"databaseIsEmpty");function ze(t){return t.includes("rest")||t.includes("trpc")}l(ze,"hasApiLayer");function Ne(t){return at(t)}l(Ne,"shouldSkipOrmStep");function Ae(t){return Dr.filter(e=>!(e==="orm"&&Ne(t.database)||e==="auth"&&!ze(t.api)||e==="microservices"&&t.architecture!=="nest-gateway"||(e==="ultraciteEditors"||e==="ultraciteAgents"||e==="ultraciteHooks"||e==="ultraciteInstallSkill")&&(!t.addons.includes("ultracite")||t.formatter==="none")))}l(Ae,"getVisibleSteps");const Ot=["ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill"];function Pe(t){return Ot.includes(t)}l(Pe,"isUltraciteSubStep");function Nr(t,e){if(!Pe(t))return null;const r=Ot.filter(i=>Ae(e).includes(i)),s=r.indexOf(t);if(s===-1)return null;const n=r.length,o=s+1,a=Math.round(o/n*100);return{current:o,percent:a,total:n}}l(Nr,"getUltraciteSubStepInfo");function ot(t){return Ae(t).filter(e=>e!=="installing"&&e!=="done"&&!Pe(e)).length}l(ot,"getTotalSteps");function Fr(t,e){const r=Ae(e).filter(o=>o!=="installing"&&o!=="done");if(t==="installing"||t==="done")return ot(e);if(Pe(t)){const o=r.indexOf("addons");return o===-1?1:o+1}const n=r.filter(o=>!Pe(o)).indexOf(t);return n===-1?1:n+1}l(Fr,"getDisplayStepNumber");function Lr(t,e){const r=Ae(e),s=r.indexOf(t);return s===-1||s>=r.length-1?null:r[s+1]??null}l(Lr,"getNextStepId");function $r(t,e){const r=Ae(e),s=r.indexOf(t);return s<=0?null:r[s-1]??null}l($r,"getPreviousStepId");function Ur(t){return t==="monorepo"?qt:qt.filter(e=>e.value!=="nest-gateway")}l(Ur,"filterArchitectureOptions");function _t(t){return zr(t)?et.filter(e=>e.value!=="drizzle"):et}l(_t,"filterOrmOptions");function Br(t){return t.includes("drizzle")?Ze.filter(e=>e.value!=="mongodb"):Ze}l(Br,"filterDatabaseOptions");function Jr(t){return at(t)?rt.filter(e=>e.value!=="better-auth"):rt}l(Jr,"filterAuthOptions");function Hr(t){return at(t)?tt.filter(e=>e.value!=="graphql"):tt}l(Hr,"filterApiOptions");function Wr(t,e){return e.includes("drizzle")?t.filter(r=>r!=="mongodb"):t}l(Wr,"sanitizeDatabaseForOrm");function Ct(t){return"nest-api"}l(Ct,"defaultArchitecture");function Gt(t,e){if(Ne(e))return[];const r=new Set(_t(e).map(s=>s.value));return t.filter(s=>r.has(s))}l(Gt,"sanitizeOrmForDatabase");function he(t,e){return t.find(r=>r.value===e)?.label??e}l(he,"labelFor");function ge(t,e){return e.length===0?"None":e.map(r=>he(t,r)).join(", ")}l(ge,"labelsFor");const Vr=l(({onConfirm:t,state:e})=>{le((n,o)=>{o.return&&t()});const r={"nest-api":"NestJS API","nest-gateway":"NestJS API Gateway","nest-microservice":"NestJS Microservice"},s=[{label:"Project",value:ne(e.projectName)},{label:"Package manager",value:e.packageManager?he(Pt,e.packageManager):"\u2014"},{label:"Formatter",value:e.formatter?he(Tt,e.formatter):"\u2014"},{label:"HTTP provider",value:e.httpProvider?he(Et,e.httpProvider):"\u2014"},{label:"Project type",value:e.projectType?he(Rt,e.projectType):"\u2014"},{label:"Architecture",value:e.architecture?r[e.architecture]??e.architecture:"\u2014"},{label:"Database",value:ge(Ze,e.database)}];return Ne(e.database)||s.push({label:"ORM",value:ge(et,e.orm)}),s.push({label:"API layer",value:ge(tt,e.api)}),e.architecture==="nest-gateway"&&s.push({label:"Microservices",value:ge([{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)}),ze(e.api)&&s.push({label:"Auth",value:e.auth?he(rt,e.auth):"\u2014"}),s.push({label:"Extras",value:ge(st,e.extras)},{label:"Addons",value:ge(xt,e.addons)},{label:"Git",value:e.initGit==="yes"?"Initialize repository":"Skip"},{label:"Install deps",value:e.installDependencies==="yes"?"Install":"Skip"}),y(N,{children:[c(f,{flexDirection:"column",marginBottom:1,children:y(u,{children:[c(u,{color:P,children:"\u2726 "}),c(u,{color:W,children:"Review your selections"})]})}),c(f,{flexDirection:"column",rowGap:0,overflow:"hidden",children:s.map(n=>y(f,{flexDirection:"row",columnGap:1,children:[c(u,{color:or,children:`${n.label}:`}),c(u,{color:de,children:n.value})]},n.label))})]})},"SummaryStep");function Fe(t){return t.length===0?"\u2014":t.join(", ")}l(Fe,"formatList");const Qr=l(({state:t,stepId:e})=>{const{stdout:r}=Qe(),s=r.columns||r.getWindowSize?.()[0]||80,n=Math.min(me.APP_MAX_WIDTH,s-4),o=[];if(e!=="projectName"&&t.projectName.trim()&&o.push(ne(t.projectName)),t.packageManager&&o.push(t.packageManager),t.httpProvider&&o.push(t.httpProvider),t.projectType&&o.push(t.projectType==="monorepo"?"Monorepo":"Single"),t.architecture){const p={"nest-api":"Nest API","nest-gateway":"API Gateway","nest-microservice":"Microservice"};o.push(p[t.architecture]??t.architecture)}if(t.database.length>0&&o.push(Fe(t.database)),t.orm.length>0&&o.push(Fe(t.orm)),t.api.length>0&&o.push(Fe(t.api)),t.auth&&o.push(t.auth),t.formatter){const p={biome:"Biome",none:"No formatter","oxlint-oxfmt":"Oxlint+Oxfmt"};o.push(p[t.formatter]??t.formatter)}if(t.microservices.length>0&&o.push(Fe(t.microservices)),t.installDependencies&&o.push(t.installDependencies==="yes"?"install: yes":"install: no"),t.extras.length>0&&o.push(`+${t.extras.length} extras`),t.addons.length>0&&!Pe(e)&&o.push(`+${t.addons.length} addons`),t.initGit&&o.push(t.initGit==="yes"?"git init":"no git"),o.length===0)return y(u,{children:[c(u,{color:P,children:"\u25C6 "}),c(u,{color:P,children:"Create a new NestJS project"})]});const[a,...i]=o;return y(N,{children:[y(u,{children:[c(u,{color:P,children:"\u25C6 "}),c(u,{color:P,children:"Create a new NestJS project"})]}),e!=="summary"&&c(f,{borderStyle:"single",borderColor:pe,width:n,children:y(u,{children:[c(u,{children:"Project Name: "}),c(u,{color:P,children:a}),c(u,{color:E,children:" Selected: "}),i.length>0?c(u,{color:E,children:`${i.filter(p=>p!=="none").join(" \xB7 ")}`}):null]})})]})},"WizardContextBar"),Yr=l(({displayStep:t,stepId:e,subProgress:r,totalSteps:s})=>y(f,{paddingLeft:2,paddingTop:e==="summary"?2:1,marginBottom:1,children:[c(u,{color:L,children:"Create project"}),c(u,{color:E,children:` \u2014 step ${t}/${s}`}),r?c(u,{color:W,children:` \xB7 Ultracite configuration (${r.current}/${r.total} \xB7 ${r.percent}%)`}):c(u,{color:W,children:` \xB7 ${Mr[e]}`})]}),"WizardTitle$1"),nt=Y(gt(),".nestarch"),it=Y(nt,"last-used.json");function Xr(){try{if(!ve(it))return null;const t=cr(it,"utf-8");return JSON.parse(t)}catch{return null}}l(Xr,"getLastUsedConfig");function Mt(t){try{ve(nt)||lr(nt,{recursive:!0}),pr(it,JSON.stringify(t,null,2),"utf-8")}catch{}}l(Mt,"saveLastUsedConfig");function Kr(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"}),n=r.getDate(),o=r.getFullYear(),a=`${s} ${n}, ${o}`;return`${e.join(", ")} (last used ${a})`}l(Kr,"buildLastUsedDescription");const Zr=[{label:"NestJS Best Practices",name:"nestjs-best-practices",repo:"kadajett/agent-nestjs-skills",when:l(()=>!0,"when")},{label:"Prisma CLI",name:"prisma-cli",repo:"prisma/skills",when:l(t=>t.orm.includes("prisma"),"when")},{label:"Prisma Client API",name:"prisma-client-api",repo:"prisma/skills",when:l(t=>t.orm.includes("prisma"),"when")},{label:"Prisma Database Setup",name:"prisma-database-setup",repo:"prisma/skills",when:l(t=>t.orm.includes("prisma"),"when")},{label:"Prisma NestJS Patterns",name:"prisma-nestjs-patterns",repo:"davidcastagnetoa/skills",when:l(t=>t.orm.includes("prisma"),"when")},{label:"NestJS TypeORM Integration",name:"nestjs-typeorm-integration",repo:"vong3432/vibemark",when:l(t=>t.orm.includes("typeorm"),"when")},{label:"Better Auth Best Practices",name:"better-auth-best-practices",repo:"better-auth/skills",when:l(t=>t.auth==="better-auth"||t.auth==="better-auth:stateless","when")},{label:"JWT Security",name:"jwt-security",repo:"mindrally/skills",when:l(t=>t.auth!=="none","when")},{label:"Turborepo",name:"turborepo",repo:"vercel/turborepo",when:l(t=>t.projectType==="monorepo","when")},{label:"Ultracite",name:"ultracite",repo:"haydenbleasel/ultracite",when:l(t=>t.addons.includes("ultracite"),"when")}];function es(t){return Zr.filter(e=>e.when(t))}l(es,"resolveSkills");const ts=_e(Ye);function rs(t){return`npx skills add ${`https://github.com/${t.repo}`} --skill ${t.name}`}l(rs,"buildCommand");async function ss(t,e){const r={failed:[],installed:[]};if(!e.addons.includes("agent-skills"))return r;const s=es(e);for(const n of s)try{const o=rs(n);await ts(o,{cwd:t,maxBuffer:4*1024*1024,timeout:6e4}),r.installed.push(n.name)}catch(o){const a=o instanceof Error?o.message:"Unknown error";r.failed.push({error:a,name:n.name})}return r}l(ss,"installAgentSkills");class dt{static{l(this,"TemplateEngine")}cache={};cacheEnabled;templatesDir;constructor(e,r={}){this.templatesDir=e,this.cacheEnabled=r.cache??!0,dt.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)=>(r.pop(),r.every(Boolean))),H.registerHelper("or",(...r)=>(r.pop(),r.some(Boolean))),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,n)=>n===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=w.join(this.templatesDir,e),n=await Z.readFile(s,"utf-8"),o=H.compile(n);return this.cacheEnabled&&(this.cache[r]=o),o}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 as{static{l(this,"FileWriter")}baseDir;writtenFiles=new Set;constructor(e){this.baseDir=e}getBaseDir(){return this.baseDir}async writeFile(e,r={}){const s=w.join(this.baseDir,e.filePath),n=w.dirname(s);try{await Z.mkdir(n,{recursive:!0});let o=!1;try{await Z.stat(s),o=!0}catch{o=!1}if(o&&!r.overwrite)return{backed:!1,error:"File already exists and overwrite is disabled",filePath:s,written:!1};let a=!1;if(o&&r.createBackups&&!r.dryRun){const i=`${s}.bak`;await Z.copyFile(s,i),a=!0}return r.dryRun||(await Z.writeFile(s,e.content,"utf-8"),this.writtenFiles.add(s)),{backed:a,filePath:s,written:!r.dryRun}}catch(o){return{backed:!1,error:o instanceof Error?o.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=w.join(this.baseDir,e);try{return await Z.stat(r),!0}catch{return!1}}getWrittenFiles(){return[...this.writtenFiles]}clearWrittenFiles(){this.writtenFiles.clear()}async copyDirectory(e,r){const s=[],n=w.join(this.baseDir,e),o=w.join(this.baseDir,r);await Z.mkdir(o,{recursive:!0});const a=await Z.readdir(n,{withFileTypes:!0});for(const i of a){const p=w.join(n,i.name),d=w.join(o,i.name);if(i.isDirectory()){const m=await this.copyDirectory(w.relative(this.baseDir,p),w.relative(this.baseDir,d));s.push(...m)}else{const m=await Z.readFile(p,"utf-8");await Z.writeFile(d,m,"utf-8"),s.push(d),this.writtenFiles.add(d)}}return s}}const Le=_e(dr);async function os(t){await Le("git",["init"],{cwd:t})}l(os,"gitInit");async function Dt(t){await Le("git",["add","."],{cwd:t})}l(Dt,"gitAddAll");async function zt(t,e){await Le("git",["commit","--no-verify","-m",e],{cwd:t})}l(zt,"gitCommit");async function ns(t){try{const{stdout:e}=await Le("git",["diff","--cached","--name-only"],{cwd:t});return e.trim().length>0}catch{return!1}}l(ns,"gitHasStagedChanges");async function is(t){try{return await ur(Y(t,".git")),!0}catch{return!1}}l(is,"gitDirectoryExists");const Nt=_e(Ye),cs={bun:["Bun is not installed or not found in your PATH.",""," Install Bun: https://bun.sh",""," Then restart your terminal and try again."].join(`
16
+ `,yr=l(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"),gt=l(t=>{let e=0;for(const r of t){const s=r.codePointAt(0)??0;e+=yr(s)?2:1}return e},"getDisplayWidth"),br=2,ft=[0,1,2,3,2,1],yt=["",".","..","..."],wr=l(({message:t="Scaffolding your project",isError:e=!1,isComplete:r=!1,showProgressText:s=!0,paddingX:n=2})=>{const[o,a]=_(0),[i,p]=_(0),d=!e&&!r;oe(()=>{if(!d)return;const F=setInterval(()=>{a($=>($+1)%ft.length)},200),O=setInterval(()=>{p($=>($+1)%yt.length)},400);return()=>{clearInterval(F),clearInterval(O)}},[d]);const m=fr.trimEnd().split(`
17
+ `),g=Math.max(...m.map(gt)),b=ft[o];let q=ue,M="\u25CF",U=E;return e?(q=T,M="\u2717",U=L):r&&(q=je,M="\u2713",U=je),y(f,{flexDirection:"column",paddingX:n,children:[c(f,{flexDirection:"column",children:m.map((F,O)=>{const $=gt(F),G=O===0||O===m.length-1,B=g-$+br-(G?1:0),z=O===b;return y(u,{color:T,children:[F," ".repeat(B),z?c(u,{color:q,children:M}):" "]},O)})}),s&&y(u,{color:U,children:[t,d?yt[i]:""]})]})},"ScaffoldingAnimation"),jr=[{id:"generate-files",label:"Generate project"},{id:"install-agent-skills",label:"Install agent skills"},{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 vr(t,e,r){if(!t)return r.map(o=>({stage:o,status:"pending"}));if(t==="complete")return r.map(o=>({stage:o,status:e?"failed":"completed"}));const n=r.map(o=>o.id).indexOf(t);return r.map((o,a)=>a<n?{stage:o,status:e?"failed":"completed"}:a===n?{stage:o,status:e?"failed":"active"}:e&&a>n?{stage:o,status:"pending"}:e?{stage:o,status:"failed"}:{stage:o,status:"pending"})}l(vr,"getStages");function Sr(t,e){switch(t){case"completed":return"\u2713";case"active":return e;case"failed":return"\u2717";case"pending":return"\u25CB";default:return t}}l(Sr,"statusIcon");function kr(t){switch(t){case"completed":return je;case"active":return ue;case"failed":return T;case"pending":return ne;default:return t}}l(kr,"statusColor");function Ar(t){return t===void 0?"":` (${t}%)`}l(Ar,"formatPercentage");function Tr(t){return t?.message?t.message:"Installing dependencies..."}l(Tr,"getInstallMessage");const wt=l(({currentStage:t,generationMessage:e,installProgress:r,isError:s,skippedStages:n=[]})=>{const o=J(()=>jr.filter(g=>!n.includes(g.id)),[n]),a=J(()=>vr(t,s,o),[t,s,o]),[i,p]=_(0),d=t==="complete"&&!s;oe(()=>{if(s||d)return;const g=setInterval(()=>{p(b=>(b+1)%bt.length)},80);return()=>clearInterval(g)},[s,d]);const m=bt[i]??"\u280B";return y(f,{flexDirection:"column",paddingX:2,children:[c(f,{marginBottom:1,children:c(wr,{showProgressText:!1,paddingX:0,isError:s,isComplete:d})}),c(f,{flexDirection:"column",rowGap:0,children:a.map(g=>{const b=g.status==="active",q=b&&g.stage.id==="install-dependencies",M=r?.percentage,U=16,F=M===void 0?0:Math.round(M/100*U),O=U-F;return y(f,{flexDirection:"column",children:[y(f,{children:[y(u,{bold:b,color:kr(g.status),children:[Sr(g.status,m)," ",g.stage.label]}),q?c(u,{children:M===void 0?null:y(N,{children:[c(u,{color:ue,children:Ar(M)})," ",c(u,{color:ue,children:"\u2588".repeat(F)}),c(u,{color:de,children:"\u2591".repeat(O)})]})}):null]}),q?c(f,{marginLeft:4,children:c(u,{color:E,children:Tr(r)})}):null]},g.stage.id)})}),!s&&t===null?c(f,{marginTop:1,children:c(u,{color:E,children:e})}):null,d?c(f,{marginTop:1,children:c(u,{color:je,children:e})}):null,s?c(f,{marginTop:1,flexDirection:"column",children:e.split(`
18
+ `).map((g,b)=>c(u,{color:g.startsWith(" ")?E:T,children:g},b))}):null]})},"InstallationProgress"),Xe=l(({action:t="select",showBack:e=!1})=>y(u,{children:[t==="select"||t==="multi-select"?c(u,{color:E,children:"Use \u2191/\u2193 to navigate \u2022 "}):null,c(u,{color:E,children:t==="confirm"?y(N,{children:[c(u,{color:L,children:"Enter "}),"to confirm"]}):t==="multi-select"?y(N,{children:[c(u,{color:L,children:"Space "}),"to toggle \u2022",c(u,{color:L,children:" Enter "}),"to confirm"]}):y(N,{children:[c(u,{color:L,children:"Enter "}),"to select"]})}),y(u,{color:E,children:[e?y(N,{children:[" ","\u2022",c(u,{color:L,children:" Ctrl+B "}),"to go back"]}):"",y(N,{children:[" ","\u2022",c(u,{color:L,children:" Ctrl+C "}),"to exit"]})]})]}),"StatusBar"),jt=l(({architecture:t,projectName:e,packageManager:r,isGitInitialized:s,dependenciesInstalled:n,outputDir:o})=>c(f,{flexDirection:"column",children:y(f,{flexDirection:"column",marginTop:1,children:[c(u,{color:je,bold:!0,children:"\u2714 Project scaffold completed successfully!"}),y(f,{marginTop:1,children:[c(u,{color:L,children:"Project: "}),c(u,{color:W,bold:!0,children:e})]}),y(f,{children:[c(u,{color:L,children:"Architecture: "}),c(u,{color:W,bold:!0,children:t})]}),o?y(f,{children:[c(u,{color:L,children:"Location: "}),c(u,{color:W,bold:!0,children:o})]}):null,s?c(f,{marginTop:1,children:c(u,{color:E,children:"Git repository initialized"})}):null,y(f,{flexDirection:"column",borderStyle:"round",borderColor:T,paddingX:2,paddingY:1,marginTop:1,width:void 0,children:[c(u,{color:L,bold:!0,children:"\u{1F680} NEXT STEPS"}),c(f,{height:1}),c(u,{color:L,children:"1. Move into the project directory:"}),c(u,{color:W,bold:!0,children:` cd ${e}`}),c(f,{height:1}),n?c(f,{children:c(u,{color:E,children:"2. Dependencies already installed"})}):y(N,{children:[c(u,{color:L,children:"2. Install dependencies:"}),c(u,{color:W,bold:!0,children:` ${r} install`})]}),c(f,{height:1}),y(u,{color:L,children:["3."," Start development server:"]}),c(u,{color:W,bold:!0,children:` ${r} run dev`})]}),c(f,{marginTop:1,children:c(u,{color:E,children:"(Press enter to exit)"})})]})}),"DoneStep"),Pr=100,Ce=l(t=>{const e=qe(0);pe((r,s)=>{if(s.upArrow||s.downArrow||s.leftArrow||s.rightArrow||r==="k"||r==="j"||r==="h"||r==="l"){const o=Date.now();if(o-e.current<Pr)return;e.current=o}t(r,s)})},"useArrowSelect"),Er=l(({initialSelected:t,onConfirm:e,onChange:r,options:s,prompt:n,minified:o=!1})=>{const a=J(()=>new Set(s.map(v=>v.value)),[s]),i=R(v=>v.filter(I=>a.has(I)),[a]),[p,d]=_(0),[m,g]=_(()=>i(t)),b=qe(m);b.current=m;const q=qe(r);q.current=r,oe(()=>{const v=i(t);g(v),d(0),q.current?.(v)},[t,i]);const M=R(v=>m.includes(v),[m]),U=R(v=>{const I=s[v];I&&g(D=>{const V=D.includes(I.value)?D.filter(ee=>ee!==I.value):[...D,I.value];return b.current=V,r?.(V),V})},[s,r]),F=R(()=>{e(b.current)},[e]),O=s.length>16,$=O?Math.ceil(s.length/2):s.length;Ce((v,I)=>{I.upArrow||v==="k"?d(D=>(D-1+s.length)%s.length):I.downArrow||v==="j"?d(D=>(D+1)%s.length):O&&(I.leftArrow||v==="h")?d(D=>(D-$+s.length)%s.length):O&&(I.rightArrow||v==="l")?d(D=>(D+$)%s.length):I.return?F():(v===" "||v==="x")&&U(p)});const G=m.length,B=l((v,I)=>{const D=M(v.value),V=I===p,ee=D?"\u25CF":"\u25CB";return y(f,{flexDirection:"column",children:[c(u,{children:V?y(N,{children:[c(u,{color:T,children:"> "}),c(u,{color:D?T:E,children:`${ee} `}),c(u,{color:D?T:L,children:v.label})]}):y(N,{children:[c(u,{color:D?T:E,children:` ${ee}`}),c(u,{color:ne,children:` ${v.label}`})]})}),V&&!O?y(u,{color:E,children:[" ",v.description]}):null]},v.value)},"renderOption");let z;return O||(z=o?0:1),y(f,{flexDirection:"column",children:[c(u,{color:E,children:n}),c(u,{color:ue,children:G===0?"No options selected yet \u2014 pick what you need":`${G} selected`}),c(f,{marginTop:1,flexDirection:O?"row":"column",rowGap:z,columnGap:O?4:void 0,overflow:"hidden",children:O?y(N,{children:[c(f,{flexDirection:"column",rowGap:o?0:1,flexGrow:1,flexBasis:0,children:s.slice(0,$).map((v,I)=>B(v,I))}),c(f,{flexDirection:"column",rowGap:o?0:1,flexGrow:1,flexBasis:0,children:s.slice($).map((v,I)=>B(v,I+$))})]}):s.map((v,I)=>B(v,I))})]})},"MultiSelectStep"),vt="my-nest-app",St=64,Rr=/^[a-z][a-z0-9-]*$/u;function ie(t){return t.trim()||vt}l(ie,"resolveProjectName");function Ge(t){const e=t.trim();return e?e.length>St?`Project name must be at most ${St} characters`:Rr.test(e)?null:"Use lowercase letters, numbers, and hyphens; must start with a letter":null}l(Ge,"validateProjectName");const kt=l(({error:t,onChange:e,onSubmit:r,value:s})=>(pe((n,o)=>{o.return&&r()}),y(f,{flexDirection:"column",children:[c(u,{color:E,children:"Enter a name for your project"}),y(f,{marginTop:1,flexDirection:"row",alignItems:"center",columnGap:1,children:[c(u,{color:L,children:"Project name:"}),c(or,{placeholder:vt,value:s,onChange:e})]}),t?c(u,{color:T,children:t}):null]})),"ProjectNameStep"),te=nr({emptyStringAsUndefined:!0,runtimeEnv:process.env,server:{APP_MAX_WIDTH:me.string().pipe(me.coerce.number()).default(95),NEST_ARCH_BETA_MODE:me.enum(["true","false"]).default("false").transform(t=>t==="true"),NEST_ARCH_SCHEMA_URL:me.string().default("./schema.json"),NEST_ARCH_VERSION:me.string().default("0.0.1"),NODE_ENV:me.enum(["development","production","test"]).default("development")}}),Me=l(({onConfirm:t,options:e,prompt:r,initialValue:s})=>{const[n,o]=_(()=>{const i=e.findIndex(p=>p.value===s);return Math.max(i,0)});oe(()=>{const i=e.findIndex(p=>p.value===s);o(Math.max(i,0))},[s,e]);const a=R(()=>{const i=e[n];i&&i.devOnly!==(te.NODE_ENV==="production")&&t(i.value)},[t,e,n]);return Ce((i,p)=>{p.upArrow||i==="k"?o(d=>(d-1+e.length)%e.length):p.downArrow||i==="j"?o(d=>(d+1)%e.length):p.return&&a()}),y(f,{flexDirection:"column",children:[c(u,{color:E,children:r}),c(f,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((i,p)=>{const d=p===n;return y(f,{flexDirection:"column",children:[c(u,{children:d?c(N,{children:i.devOnly===(te.NODE_ENV==="production")?y(N,{children:[c(u,{color:ne,children:"> "}),y(u,{color:ne,children:[i.label,". (Comming soon)"]})]}):y(N,{children:[c(u,{color:T,children:"> "}),c(u,{color:T,children:i.label})]})}):c(u,{color:ne,children:` ${i.label}`})}),d?c(u,{color:E,children:i.description}):null]},i.value)})})]})},"SingleSelectStep"),At=[{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"}],Tt=[{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",devOnly:!0,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:"Better SQLite",value:"sqlite"},{description:"Document database",label:"MongoDB",value:"mongodb"}],Ze=[{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"}],et=[{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 (Code first)",value:"graphql"}],tt=[{description:"No authentication scaffolding",label:"None",value:"none"},{description:"Flexible authentication \u2014 stateless (OAuth 2 JWE session) when no database, ORM-backed (JWT Authorization Bearer) 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"}],rt=[{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"},{description:"Scaffold a Todo CRUD module example (GraphQL only)",label:"Todo Example",value:"todo-example"},{description:"Latest TypeScript compiler \u2014 faster checking and new language features (default: TypeScript 6)",label:"TypeScript 7",value:"typescript-7"}],qt=[{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:"Modern OpenAPI documentation UI",label:"Scalar UI (Recommended)",value:"scalar-ui"}],qr=[{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"}],xt=[{description:"Run git init and create initial commit",label:"Yes",value:"yes"},{description:"Skip git initialization",label:"No",value:"no"}],xr=[{description:"Install all project dependencies using the selected package manager",label:"Yes (Recommended)",value:"yes"},{description:"Skip dependency installation",label:"No",value:"no"}],Ir=[{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"}],_r=[{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"}],Or=[{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"}],Cr=[{description:"Install the reusable Ultracite skill after setup",label:"Yes",value:"yes"},{description:"Skip installing the Ultracite skill",label:"No",value:"no"}],Gr={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"},Mr=["projectName","packageManager","formatter","httpProvider","projectType","architecture","database","orm","apiLayer","auth","extras","microservices","addons","ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill","initGit","installDependencies","summary","installing","done"];function Dr(t){return t.includes("mongodb")}l(Dr,"databaseIncludesMongodb");function st(t){return t.length===0}l(st,"databaseIsEmpty");function De(t){return t.includes("rest")||t.includes("trpc")}l(De,"hasApiLayer");function ze(t){return st(t)}l(ze,"shouldSkipOrmStep");function Ae(t){return Mr.filter(e=>!(e==="orm"&&ze(t.database)||e==="auth"&&!De(t.api)||e==="microservices"&&t.architecture!=="nest-gateway"||(e==="ultraciteEditors"||e==="ultraciteAgents"||e==="ultraciteHooks"||e==="ultraciteInstallSkill")&&(!t.addons.includes("ultracite")||t.formatter==="none")))}l(Ae,"getVisibleSteps");const It=["ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill"];function Te(t){return It.includes(t)}l(Te,"isUltraciteSubStep");function zr(t,e){if(!Te(t))return null;const r=It.filter(i=>Ae(e).includes(i)),s=r.indexOf(t);if(s===-1)return null;const n=r.length,o=s+1,a=Math.round(o/n*100);return{current:o,percent:a,total:n}}l(zr,"getUltraciteSubStepInfo");function at(t){return Ae(t).filter(e=>e!=="installing"&&e!=="done"&&!Te(e)).length}l(at,"getTotalSteps");function Nr(t,e){const r=Ae(e).filter(o=>o!=="installing"&&o!=="done");if(t==="installing"||t==="done")return at(e);if(Te(t)){const o=r.indexOf("addons");return o===-1?1:o+1}const n=r.filter(o=>!Te(o)).indexOf(t);return n===-1?1:n+1}l(Nr,"getDisplayStepNumber");function Fr(t,e){const r=Ae(e),s=r.indexOf(t);return s===-1||s>=r.length-1?null:r[s+1]??null}l(Fr,"getNextStepId");function Lr(t,e){const r=Ae(e),s=r.indexOf(t);return s<=0?null:r[s-1]??null}l(Lr,"getPreviousStepId");function $r(t){return t==="monorepo"?Rt:Rt.filter(e=>e.value!=="nest-gateway")}l($r,"filterArchitectureOptions");function _t(t){return Dr(t)?Ze.filter(e=>e.value!=="drizzle"):Ze}l(_t,"filterOrmOptions");function Ur(t){return t.includes("drizzle")?Ke.filter(e=>e.value!=="mongodb"):Ke}l(Ur,"filterDatabaseOptions");function Br(t){return st(t)?tt.filter(e=>e.value!=="better-auth"):tt}l(Br,"filterAuthOptions");function Jr(t){return st(t)?et.filter(e=>e.value!=="graphql"):et}l(Jr,"filterApiOptions");function Hr(t,e){return e.includes("drizzle")?t.filter(r=>r!=="mongodb"):t}l(Hr,"sanitizeDatabaseForOrm");function Ot(t){return"nest-api"}l(Ot,"defaultArchitecture");function Ct(t,e){if(ze(e))return[];const r=new Set(_t(e).map(s=>s.value));return t.filter(s=>r.has(s))}l(Ct,"sanitizeOrmForDatabase");function he(t,e){return t.find(r=>r.value===e)?.label??e}l(he,"labelFor");function ge(t,e){return e.length===0?"None":e.map(r=>he(t,r)).join(", ")}l(ge,"labelsFor");const Wr=l(({onConfirm:t,state:e})=>{pe((n,o)=>{o.return&&t()});const r={"nest-api":"NestJS API","nest-gateway":"NestJS API Gateway","nest-microservice":"NestJS Microservice"},s=[{label:"Project",value:ie(e.projectName)},{label:"Package manager",value:e.packageManager?he(At,e.packageManager):"\u2014"},{label:"Formatter",value:e.formatter?he(Tt,e.formatter):"\u2014"},{label:"HTTP provider",value:e.httpProvider?he(Pt,e.httpProvider):"\u2014"},{label:"Project type",value:e.projectType?he(Et,e.projectType):"\u2014"},{label:"Architecture",value:e.architecture?r[e.architecture]??e.architecture:"\u2014"},{label:"Database",value:ge(Ke,e.database)}];return ze(e.database)||s.push({label:"ORM",value:ge(Ze,e.orm)}),s.push({label:"API layer",value:ge(et,e.api)}),e.architecture==="nest-gateway"&&s.push({label:"Microservices",value:ge([{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)}),De(e.api)&&s.push({label:"Auth",value:e.auth?he(tt,e.auth):"\u2014"}),s.push({label:"Extras",value:ge(rt,e.extras)},{label:"Addons",value:ge(qt,e.addons)},{label:"Git",value:e.initGit==="yes"?"Initialize repository":"Skip"},{label:"Install deps",value:e.installDependencies==="yes"?"Install":"Skip"}),y(N,{children:[c(f,{flexDirection:"column",marginBottom:1,children:y(u,{children:[c(u,{color:T,children:"\u2726 "}),c(u,{color:W,children:"Review your selections"})]})}),c(f,{flexDirection:"column",rowGap:0,overflow:"hidden",children:s.map(n=>y(f,{flexDirection:"row",columnGap:1,children:[c(u,{color:ar,children:`${n.label}:`}),c(u,{color:ue,children:n.value})]},n.label))})]})},"SummaryStep");function Ne(t){return t.length===0?"\u2014":t.join(", ")}l(Ne,"formatList");const Vr=l(({state:t,stepId:e})=>{const{stdout:r}=Ve(),s=r.columns||r.getWindowSize?.()[0]||80,n=Math.min(te.APP_MAX_WIDTH,s-4),o=[];if(e!=="projectName"&&t.projectName.trim()&&o.push(ie(t.projectName)),t.packageManager&&o.push(t.packageManager),t.httpProvider&&o.push(t.httpProvider),t.projectType&&o.push(t.projectType==="monorepo"?"Monorepo":"Single"),t.architecture){const p={"nest-api":"Nest API","nest-gateway":"API Gateway","nest-microservice":"Microservice"};o.push(p[t.architecture]??t.architecture)}if(t.database.length>0&&o.push(Ne(t.database)),t.orm.length>0&&o.push(Ne(t.orm)),t.api.length>0&&o.push(Ne(t.api)),t.auth&&o.push(t.auth),t.formatter){const p={biome:"Biome",none:"No formatter","oxlint-oxfmt":"Oxlint+Oxfmt"};o.push(p[t.formatter]??t.formatter)}if(t.microservices.length>0&&o.push(Ne(t.microservices)),t.installDependencies&&o.push(t.installDependencies==="yes"?"install: yes":"install: no"),t.extras.length>0&&o.push(`+${t.extras.length} extras`),t.addons.length>0&&!Te(e)&&o.push(`+${t.addons.length} addons`),t.initGit&&o.push(t.initGit==="yes"?"git init":"no git"),o.length===0)return y(u,{children:[c(u,{color:T,children:"\u25C6 "}),c(u,{color:T,children:"Create a new NestJS project"})]});const[a,...i]=o;return y(N,{children:[y(u,{children:[c(u,{color:T,children:"\u25C6 "}),c(u,{color:T,children:"Create a new NestJS project"})]}),e!=="summary"&&c(f,{borderStyle:"single",borderColor:de,width:n,children:y(u,{children:[c(u,{children:"Project Name: "}),c(u,{color:T,children:a}),c(u,{color:E,children:" Selected: "}),i.length>0?c(u,{color:E,children:`${i.filter(p=>p!=="none").join(" \xB7 ")}`}):null]})})]})},"WizardContextBar"),Qr=l(({displayStep:t,stepId:e,subProgress:r,totalSteps:s})=>y(f,{paddingLeft:2,paddingTop:e==="summary"?2:1,marginBottom:1,children:[c(u,{color:L,children:"Create project"}),c(u,{color:E,children:` \u2014 step ${t}/${s}`}),r?c(u,{color:W,children:` \xB7 Ultracite configuration (${r.current}/${r.total} \xB7 ${r.percent}%)`}):c(u,{color:W,children:` \xB7 ${Gr[e]}`})]}),"WizardTitle$1"),ot=Y(ht(),".nestarch"),nt=Y(ot,"last-used.json");function Yr(){try{if(!ve(nt))return null;const t=ir(nt,"utf-8");return JSON.parse(t)}catch{return null}}l(Yr,"getLastUsedConfig");function Gt(t){try{ve(ot)||cr(ot,{recursive:!0}),lr(nt,JSON.stringify(t,null,2),"utf-8")}catch{}}l(Gt,"saveLastUsedConfig");function Xr(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"}),n=r.getDate(),o=r.getFullYear(),a=`${s} ${n}, ${o}`;return`${e.join(", ")} (last used ${a})`}l(Xr,"buildLastUsedDescription");const Kr=[{label:"NestJS Best Practices",name:"nestjs-best-practices",repo:"kadajett/agent-nestjs-skills",when:l(()=>!0,"when")},{label:"Prisma CLI",name:"prisma-cli",repo:"prisma/skills",when:l(t=>t.orm.includes("prisma"),"when")},{label:"Prisma Client API",name:"prisma-client-api",repo:"prisma/skills",when:l(t=>t.orm.includes("prisma"),"when")},{label:"Prisma Database Setup",name:"prisma-database-setup",repo:"prisma/skills",when:l(t=>t.orm.includes("prisma"),"when")},{label:"Prisma NestJS Patterns",name:"prisma-nestjs-patterns",repo:"davidcastagnetoa/skills",when:l(t=>t.orm.includes("prisma"),"when")},{label:"NestJS TypeORM Integration",name:"nestjs-typeorm-integration",repo:"vong3432/vibemark",when:l(t=>t.orm.includes("typeorm"),"when")},{label:"Better Auth Best Practices",name:"better-auth-best-practices",repo:"better-auth/skills",when:l(t=>t.auth==="better-auth"||t.auth==="better-auth:stateless","when")},{label:"JWT Security",name:"jwt-security",repo:"mindrally/skills",when:l(t=>t.auth!=="none","when")},{label:"Turborepo",name:"turborepo",repo:"vercel/turborepo",when:l(t=>t.projectType==="monorepo","when")},{label:"Ultracite",name:"ultracite",repo:"haydenbleasel/ultracite",when:l(t=>t.addons.includes("ultracite"),"when")}];function Zr(t){return Kr.filter(e=>e.when(t))}l(Zr,"resolveSkills");const es=_e(Qe);function ts(t){return`npx skills add ${`https://github.com/${t.repo}`} --skill ${t.name}`}l(ts,"buildCommand");async function rs(t,e){const r={failed:[],installed:[]};if(!e.addons.includes("agent-skills"))return r;const s=Zr(e);for(const n of s)try{const o=ts(n);await es(o,{cwd:t,maxBuffer:4*1024*1024,timeout:6e4}),r.installed.push(n.name)}catch(o){const a=o instanceof Error?o.message:"Unknown error";r.failed.push({error:a,name:n.name})}return r}l(rs,"installAgentSkills");class pt{static{l(this,"TemplateEngine")}cache={};cacheEnabled;templatesDir;constructor(e,r={}){this.templatesDir=e,this.cacheEnabled=r.cache??!0,pt.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)=>(r.pop(),r.every(Boolean))),H.registerHelper("or",(...r)=>(r.pop(),r.some(Boolean))),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,n)=>n===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=w.join(this.templatesDir,e),n=await Z.readFile(s,"utf-8"),o=H.compile(n);return this.cacheEnabled&&(this.cache[r]=o),o}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 ss{static{l(this,"FileWriter")}baseDir;writtenFiles=new Set;constructor(e){this.baseDir=e}getBaseDir(){return this.baseDir}async writeFile(e,r={}){const s=w.join(this.baseDir,e.filePath),n=w.dirname(s);try{await Z.mkdir(n,{recursive:!0});let o=!1;try{await Z.stat(s),o=!0}catch{o=!1}if(o&&!r.overwrite)return{backed:!1,error:"File already exists and overwrite is disabled",filePath:s,written:!1};let a=!1;if(o&&r.createBackups&&!r.dryRun){const i=`${s}.bak`;await Z.copyFile(s,i),a=!0}return r.dryRun||(await Z.writeFile(s,e.content,"utf-8"),this.writtenFiles.add(s)),{backed:a,filePath:s,written:!r.dryRun}}catch(o){return{backed:!1,error:o instanceof Error?o.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=w.join(this.baseDir,e);try{return await Z.stat(r),!0}catch{return!1}}getWrittenFiles(){return[...this.writtenFiles]}clearWrittenFiles(){this.writtenFiles.clear()}async copyDirectory(e,r){const s=[],n=w.join(this.baseDir,e),o=w.join(this.baseDir,r);await Z.mkdir(o,{recursive:!0});const a=await Z.readdir(n,{withFileTypes:!0});for(const i of a){const p=w.join(n,i.name),d=w.join(o,i.name);if(i.isDirectory()){const m=await this.copyDirectory(w.relative(this.baseDir,p),w.relative(this.baseDir,d));s.push(...m)}else{const m=await Z.readFile(p,"utf-8");await Z.writeFile(d,m,"utf-8"),s.push(d),this.writtenFiles.add(d)}}return s}}const Fe=_e(pr);async function as(t){await Fe("git",["init"],{cwd:t})}l(as,"gitInit");async function Mt(t){await Fe("git",["add","."],{cwd:t})}l(Mt,"gitAddAll");async function Dt(t,e){await Fe("git",["commit","--no-verify","-m",e],{cwd:t})}l(Dt,"gitCommit");async function os(t){try{const{stdout:e}=await Fe("git",["diff","--cached","--name-only"],{cwd:t});return e.trim().length>0}catch{return!1}}l(os,"gitHasStagedChanges");async function ns(t){try{return await dr(Y(t,".git")),!0}catch{return!1}}l(ns,"gitDirectoryExists");const zt=_e(Qe),is={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
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
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
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 ls(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}`)}}}l(ls,"getFormatterCommand");function ps(t){return t instanceof Error&&"code"in t&&(t.code==="ENOENT"||t.code==="EINVAL")}l(ps,"isPackageManagerNotFoundError");async function ds(t,e){const r=ls(t);try{return await Nt(r,{cwd:e,timeout:12e4}),await Nt(r,{cwd:e,timeout:12e4}),{success:!0}}catch(s){return ps(s)?{error:cs[t],success:!1}:{success:!0}}}l(ds,"runFormatter");const us=_e(Ye);function ms(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}`}}l(ms,"buildUltraciteInitCommand");function hs(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"}}l(hs,"mapFormatterToLinter");async function gs(t){const e=Y(t,"package.json");try{const s=await Ce(e,"utf-8"),n=JSON.parse(s);n.devDependencies&&(n.devDependencies=Object.fromEntries(Object.entries(n.devDependencies).filter(([o])=>!o.startsWith("stylelint")))),await Se(e,`${JSON.stringify(n,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 n=Y(t,s);ve(n)&&await mr(n,{force:!0})}}l(gs,"removeStylelint");async function fs(t,e){const r=hs(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 n=["ultracite","init","--quiet","--skip-install","--pm",e.packageManager,"--linter",r,"--frameworks","nestjs"];s.length>0&&n.push("--integrations",...s),e.addons.includes("ultracite")&&(e.ultraciteEditors.length>0&&n.push("--editors",...e.ultraciteEditors),e.ultraciteAgents.length>0&&n.push("--agents",...e.ultraciteAgents),e.ultraciteHooks.length>0&&n.push("--hooks",...e.ultraciteHooks),e.ultraciteInstallSkill==="yes"&&n.push("--install-skill"));const o=ms(e.packageManager,n);try{return await us(o,{cwd:t,timeout:12e4}),e.formatter==="eslint-prettier-no-stylelint"&&await gs(t),{message:"Ultracite setup completed",success:!0}}catch(a){let i=a instanceof Error?a.message:String(a);if(a&&typeof a=="object"&&"stderr"in a){const p=a.stderr?.trim();p&&(i=`${i}
24
- ${p}`)}return{message:`Ultracite setup failed: ${i}`,success:!1}}}l(fs,"runUltraciteInit");class ys{static{l(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 n=await Z.readdir(e,{withFileTypes:!0});for(const o of n){if(!o.isFile())continue;const{name:a}=o,i=w.extname(a);if(i===".hbs"){const p=w.basename(a,i),d={description:`Template: ${p}`,format:"handlebars",id:p,name:p.replaceAll(/[-_]/gu," "),optional:a.startsWith("_"),path:w.join(w.relative(w.dirname(e),e),a)};s.push(d),this.registerTemplate(d)}}if(r&&s.length>0){const o={description:`Templates from ${e}`,id:r,name:r,templates:s};this.registerGroup(o)}}catch(n){console.error(`Failed to load templates from ${e}:`,n)}return s}clear(){this.templates.clear(),this.groups.clear()}getStats(){return{groupCount:this.groups.size,templateCount:this.templates.size}}}function _o(t,e,r){}l(_o,"log");const ct={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 bs(t){const e=Y(t,"oxlint.config.ts");let r;try{r=await Ce(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 n=Object.entries(ct.oxlint).map(([a,i])=>{const p=Array.isArray(i)?JSON.stringify(i):`"${i}"`;return` "${a}": ${p}`}).join(`,
26
- `),o=JSON.stringify(["error",{pattern:".*\\.(test|spec)\\.[tj]sx?$"}]);s=s.replace(/export default defineConfig\(\{([\s\S]*?)\}\);/u,(a,i)=>{const p=i.includes("vitest"),d=i.includes("ignorePatterns"),m=i.includes("rules:"),g=i.includes("overrides:");let b=i;return p||(b=b.replace(/(extends:\s*\[)([\s\S]*?)(\s*\],)/u,(q,M,U,F)=>{const _=U.trimEnd(),$=!_.endsWith(",");return`${M}${_}${$?",":""}
22
+ `)};function cs(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}`)}}}l(cs,"getFormatterCommand");function ls(t){return t instanceof Error&&"code"in t&&(t.code==="ENOENT"||t.code==="EINVAL")}l(ls,"isPackageManagerNotFoundError");async function ps(t,e){const r=cs(t);try{return await zt(r,{cwd:e,timeout:12e4}),await zt(r,{cwd:e,timeout:12e4}),{success:!0}}catch(s){return ls(s)?{error:is[t],success:!1}:{success:!0}}}l(ps,"runFormatter");const ds=_e(Qe);function us(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}`}}l(us,"buildUltraciteInitCommand");function ms(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"}}l(ms,"mapFormatterToLinter");async function hs(t){const e=Y(t,"package.json");try{const s=await Oe(e,"utf-8"),n=JSON.parse(s);n.devDependencies&&(n.devDependencies=Object.fromEntries(Object.entries(n.devDependencies).filter(([o])=>!o.startsWith("stylelint")))),await Se(e,`${JSON.stringify(n,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 n=Y(t,s);ve(n)&&await ur(n,{force:!0})}}l(hs,"removeStylelint");async function gs(t,e){const r=ms(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 n=["ultracite","init","--quiet","--skip-install","--pm",e.packageManager,"--linter",r,"--frameworks","nestjs"];s.length>0&&n.push("--integrations",...s),e.addons.includes("ultracite")&&(e.ultraciteEditors.length>0&&n.push("--editors",...e.ultraciteEditors),e.ultraciteAgents.length>0&&n.push("--agents",...e.ultraciteAgents),e.ultraciteHooks.length>0&&n.push("--hooks",...e.ultraciteHooks),e.ultraciteInstallSkill==="yes"&&n.push("--install-skill"));const o=us(e.packageManager,n);try{return await ds(o,{cwd:t,timeout:12e4}),e.formatter==="eslint-prettier-no-stylelint"&&await hs(t),{message:"Ultracite setup completed",success:!0}}catch(a){let i=a instanceof Error?a.message:String(a);if(a&&typeof a=="object"&&"stderr"in a){const p=a.stderr?.trim();p&&(i=`${i}
24
+ ${p}`)}return{message:`Ultracite setup failed: ${i}`,success:!1}}}l(gs,"runUltraciteInit");class fs{static{l(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 n=await Z.readdir(e,{withFileTypes:!0});for(const o of n){if(!o.isFile())continue;const{name:a}=o,i=w.extname(a);if(i===".hbs"){const p=w.basename(a,i),d={description:`Template: ${p}`,format:"handlebars",id:p,name:p.replaceAll(/[-_]/gu," "),optional:a.startsWith("_"),path:w.join(w.relative(w.dirname(e),e),a)};s.push(d),this.registerTemplate(d)}}if(r&&s.length>0){const o={description:`Templates from ${e}`,id:r,name:r,templates:s};this.registerGroup(o)}}catch(n){console.error(`Failed to load templates from ${e}:`,n)}return s}clear(){this.templates.clear(),this.groups.clear()}getStats(){return{groupCount:this.groups.size,templateCount:this.templates.size}}}function _o(t,e,r){}l(_o,"log");const it={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 ys(t){const e=Y(t,"oxlint.config.ts");let r;try{r=await Oe(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 n=Object.entries(it.oxlint).map(([a,i])=>{const p=Array.isArray(i)?JSON.stringify(i):`"${i}"`;return` "${a}": ${p}`}).join(`,
26
+ `),o=JSON.stringify(["error",{pattern:".*\\.(test|spec)\\.[tj]sx?$"}]);s=s.replace(/export default defineConfig\(\{([\s\S]*?)\}\);/u,(a,i)=>{const p=i.includes("vitest"),d=i.includes("ignorePatterns"),m=i.includes("rules:"),g=i.includes("overrides:");let b=i;return p||(b=b.replace(/(extends:\s*\[)([\s\S]*?)(\s*\],)/u,(q,M,U,F)=>{const O=U.trimEnd(),$=!O.endsWith(",");return`${M}${O}${$?",":""}
27
27
  vitest,
28
28
  ${F.trimStart()}`})),d||(b=b.replace(/(extends:\s*\[[\s\S]*?\],?)/u,`$1
29
29
  ignorePatterns: [...(core.ignorePatterns ?? []), "prisma/generated/**"],`)),g||(b=`${b} overrides: [
@@ -38,7 +38,7 @@ import vitest from "ultracite/oxlint/vitest";`));const n=Object.entries(ct.oxlin
38
38
  `),m||(b=`${b} rules: {
39
39
  ${n},
40
40
  },
41
- `),`export default defineConfig({${b}});`});try{await Se(e,s,"utf-8"),`${e}`}catch{}}l(bs,"injectOxlintRules");async function ws(t){const e=Y(t,"biome.jsonc");let r;try{r=await Ce(e,"utf-8"),`${e}`}catch{return}const s=ct.biome,n=r.includes('"linter"'),o=r.includes('"rules"');if(n&&o){const a=Object.entries(s).flatMap(([p,d])=>Object.entries(d).map(([m,g])=>` "${p}": {
41
+ `),`export default defineConfig({${b}});`});try{await Se(e,s,"utf-8"),`${e}`}catch{}}l(ys,"injectOxlintRules");async function bs(t){const e=Y(t,"biome.jsonc");let r;try{r=await Oe(e,"utf-8"),`${e}`}catch{return}const s=it.biome,n=r.includes('"linter"'),o=r.includes('"rules"');if(n&&o){const a=Object.entries(s).flatMap(([p,d])=>Object.entries(d).map(([m,g])=>` "${p}": {
42
42
  "${m}": "${g}"
43
43
  }`)).join(`,
44
44
  `),i=r.replace(/("linter"\s*:\s*\{[\s\S]*?"rules"\s*:\s*\{)([\s\S]*?)(\})/u,(p,d,m,g)=>{const b=m.trim().endsWith(",")?"":",";return`${d}${m}${b}
@@ -53,13 +53,13 @@ ${g}
53
53
  }
54
54
  }`,p=r.replace(/(\}\s*)$/u,d=>`,
55
55
  ${i}
56
- ${d}`);try{await Se(e,p,"utf-8"),`${e}`}catch{}}}l(ws,"injectBiomeRules");async function js(t){const e=Y(t,"eslint.config.mjs");let r;try{r=await Ce(e,"utf-8"),`${e}`}catch{return}if(r.includes("rules:"))return;const s=Object.entries(ct.eslint).map(([o,a])=>{const i=Array.isArray(a)?JSON.stringify(a):`"${a}"`;return` "${o}": ${i}`}).join(`,
56
+ ${d}`);try{await Se(e,p,"utf-8"),`${e}`}catch{}}}l(bs,"injectBiomeRules");async function ws(t){const e=Y(t,"eslint.config.mjs");let r;try{r=await Oe(e,"utf-8"),`${e}`}catch{return}if(r.includes("rules:"))return;const s=Object.entries(it.eslint).map(([o,a])=>{const i=Array.isArray(a)?JSON.stringify(a):`"${a}"`;return` "${o}": ${i}`}).join(`,
57
57
  `),n=r.replace(/\];?$/u,` {
58
58
  rules: {
59
59
  ${s},
60
60
  },
61
61
  },
62
- ];`);try{await Se(e,n,"utf-8"),`${e}`}catch{}}l(js,"injectEslintRules");async function vs(t,e){switch(e){case"oxlint-oxfmt":return await bs(t),{success:!0};case"biome":return await ws(t),{success:!0};case"eslint-prettier-stylelint":case"eslint-prettier-no-stylelint":return await js(t),{success:!0};default:return{message:"No injection needed",success:!0}}}l(vs,"injectUltraciteRules");const Ss="single-project/architecture/nest-api",ks="single-project/architecture/nest-gateway",As="single-project/architecture/nest-microservice",Ps="monorepo/root",Ts="monorepo/apps/api-gateway",Es="monorepo/packages",Rs="addons/husky",qs="extras/docker",xs="extras/swagger",Is="extras/database",Os="monorepo/packages/db",_s="feature/graphql/todo-example",Cs="monorepo/feature/graphql/todo-example",Ft="feature/rest/todo-example",Lt="monorepo/feature/rest/todo-example",Gs=[{conditions:{extras:["docker"]},id:"extra-docker",name:"Docker Support",priority:5,templateGroups:[qs]},{conditions:{extras:["swagger"]},id:"extra-swagger",name:"Swagger Documentation",priority:5,templateGroups:[xs]},{conditions:{database:["postgresql","mysql","sqlite","mongodb"]},id:"extra-database",name:"Database Module",priority:5,templateGroups:[Is]},{conditions:{database:["postgresql","mysql","sqlite","mongodb"],projectType:"monorepo"},id:"monorepo-db-package",name:"Monorepo DB Package",priority:5,templateGroups:[Os]},{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:{api:["graphql"],projectType:"single"},id:"feature-graphql",name:"GraphQL API templates (single)",priority:3,templateGroups:["feature/graphql"]},{conditions:{api:["graphql"],projectType:"monorepo"},id:"monorepo-feature-graphql",name:"GraphQL API templates (monorepo)",priority:3,templateGroups:["monorepo/feature/graphql"]},{conditions:{api:["graphql"],extras:["todo-example"],projectType:"single"},id:"extra-todo-example",name:"Todo Example (single, graphql)",priority:5,templateGroups:[_s]},{conditions:{api:["graphql"],extras:["todo-example"],projectType:"monorepo"},id:"monorepo-extra-todo-example",name:"Todo Example (monorepo, graphql)",priority:5,templateGroups:[Cs]},{conditions:{api:["rest"],extras:["todo-example"],projectType:"single"},id:"extra-rest-todo-example",name:"REST Todo Example (single)",priority:5,templateGroups:[Ft]},{conditions:{api:["rest"],extras:["todo-example"],projectType:"monorepo"},id:"monorepo-extra-rest-todo-example",name:"REST Todo Example (monorepo)",priority:5,templateGroups:[Lt]},{conditions:{api:["trpc"],extras:["todo-example"],projectType:"single"},id:"extra-trpc-todo-example",name:"tRPC Todo Example (single)",priority:5,templateGroups:[Ft]},{conditions:{api:["trpc"],extras:["todo-example"],projectType:"monorepo"},id:"monorepo-extra-trpc-todo-example",name:"tRPC Todo Example (monorepo)",priority:5,templateGroups:[Lt]}],Ms=[{conditions:{architecture:"nest-api",projectType:"single"},id:"single-nest-api",name:"Single NestJS API",priority:10,templateGroups:[Ss]},{conditions:{architecture:"nest-gateway",projectType:"single"},id:"single-nest-gateway",name:"Single NestJS Gateway",priority:10,templateGroups:[ks]},{conditions:{architecture:"nest-microservice",projectType:"single"},id:"single-nest-microservice",name:"Single NestJS Microservice",priority:10,templateGroups:[As]},{conditions:{projectType:"monorepo"},id:"monorepo-root",name:"Monorepo Root",priority:10,templateGroups:[Ps,Ts,Es]},{conditions:{addons:["husky"]},id:"addon-husky",name:"Husky Git Hooks",priority:5,templateGroups:[Rs]}],Ds=[...Ms,...Gs];function zs(t){t.registerAll(Ds)}l(zs,"initializeTemplateMappings");class Be{static{l(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 a of this.mappings)Be.matches(a.conditions,e)&&r.push(a);const s=[],n={},o=[];for(const a of r){for(const i of a.templateGroups)s.includes(i)||s.push(i);Object.assign(n,a.extraVariables),o.push(a.id)}return{extraVariables:n,matchedMappings:o,templateGroups:s}}findFirst(e){return this.mappings.find(r=>Be.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 Ns(t){return t.replaceAll(/([a-z])([A-Z])/gu,"$1-$2").replaceAll(/\s+/gu,"-").toLowerCase()}l(Ns,"toKebabCase");function Fs(t){return t.replaceAll(/[-_\s](.)/gu,(e,r)=>r.toUpperCase()).replace(/^(.)/u,e=>e.toLowerCase())}l(Fs,"toCamelCase");function Ls(t){return t.replaceAll(/[-_\s](.)/gu,(e,r)=>r.toUpperCase()).replace(/^(.)/u,e=>e.toUpperCase())}l(Ls,"toPascalCase");function $s(t){const e=t.database.includes("postgresql"),r=t.database.includes("mysql"),s=t.database.includes("sqlite"),n=t.database.includes("mongodb"),o=t.orm.includes("prisma"),a=t.orm.includes("typeorm"),i=t.orm.includes("drizzle"),p=t.database.length>0&&!o&&!a&&!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],graphqlPlayground:t.api.includes("graphql"),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:n,hasMysql:r,hasOrm:t.orm.length>0,hasPostgres:e,hasRest:t.api.includes("rest"),hasSqlite:s,hasTodoExample:t.extras.includes("todo-example"),hasTrpc:t.api.includes("trpc"),hasTrpcAndAuth:t.api.includes("trpc")&&t.auth!=="none",httpProvider:t.httpProvider,initGit:t.initGit,isBetterAuth:t.auth==="better-auth"||t.auth==="better-auth:stateless",isBun:t.packageManager==="bun",isMonorepo:t.projectType==="monorepo",isNpm:t.packageManager==="npm",isPassportAuth:t.auth==="passport",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:Fs(t.projectName),projectNameKebab:Ns(t.projectName),projectNamePascalCase:Ls(t.projectName),projectType:t.projectType,shouldImportAuthModule:t.auth!=="none"&&(t.api.includes("rest")||t.api.includes("graphql")),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:o,useRawSql:p,useSwaggerScalar:t.extras.includes("swagger")&&t.addons.includes("scalar-ui"),useTypeorm:a,useTypescript7:t.extras.includes("typescript-7"),year:new Date().getFullYear()}}l($s,"buildTemplateVariables");function Us(t,e){return{...t,...e}}l(Us,"mergeTemplateExtras");class Bs{static{l(this,"BetterAuthGenerator")}project;config;constructor(e,r){this.project=e,this.config=r}generate(e){const r=this.config.orm??[],s=this.config.database??[],n=s.length>0,o=this.config.skipModule??!1;if(!n){this.generateStateless(e,o);return}const a=r.includes("prisma"),i=r.includes("drizzle"),p=r.includes("typeorm");a?(this.generatePrisma(e,s),o||this.generateModule(e,"prisma")):i?(this.generateDrizzle(e,s),o||this.generateModule(e,"drizzle")):p?(this.generateNative(e,s),o||this.generateTypeormModule(e,s)):(this.generateNative(e,s),o||this.generateModule(e,"raw.sql"))}generateAuthOnly(e){const r=this.config.database??[];if(!(r.length>0)){this.generateStateless(e,!0);return}const n=this.config.orm??[],o=n.includes("prisma"),a=n.includes("drizzle"),i=n.includes("typeorm");o?this.generatePrisma(e,r):a?this.generateDrizzle(e,r):i?this.generateNative(e,r):this.generateNative(e,r)}generatePrisma(e,r){const s=r.includes("postgresql"),n=r.includes("mysql");let o;s?o="postgresql":n?o="mysql":o="sqlite";let a,i,p;s?(a="PrismaPg",i="@prisma/adapter-pg",p="new PrismaPg({ connectionString: '' })"):n?(a="PrismaMariaDb",i="@prisma/adapter-mariadb",p="new PrismaMariaDb('')"):(a="PrismaBetterSqlite3",i="@prisma/adapter-better-sqlite3",p="new PrismaBetterSqlite3({ url: ':memory:' })");const d=this.config.extras?.includes("swagger"),m=[`import { ${a} } from "${i}";`,'import { betterAuth } from "better-auth";','import { prismaAdapter } from "better-auth/adapters/prisma";','import { PrismaClient } from "../database/orm/prisma/generated/client.js";',...d?['import { openAPI } from "better-auth/plugins";']:[],"","export function createAuth(prisma: PrismaClient) {"," return betterAuth({",` database: prismaAdapter(prisma, { provider: "${o}" }),`," emailAndPassword: { enabled: true },"," experimental: { joins: true },",...d?[" 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 = ${p};`," 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"],g=w.join(e,"auth.ts");this.project.createSourceFile(g,m.join(`
62
+ ];`);try{await Se(e,n,"utf-8"),`${e}`}catch{}}l(ws,"injectEslintRules");async function js(t,e){switch(e){case"oxlint-oxfmt":return await ys(t),{success:!0};case"biome":return await bs(t),{success:!0};case"eslint-prettier-stylelint":case"eslint-prettier-no-stylelint":return await ws(t),{success:!0};default:return{message:"No injection needed",success:!0}}}l(js,"injectUltraciteRules");const vs="single-project/architecture/nest-api",Ss="single-project/architecture/nest-gateway",ks="single-project/architecture/nest-microservice",As="monorepo/root",Ts="monorepo/apps/api-gateway",Ps="monorepo/packages",Es="addons/husky",Rs="extras/docker",qs="extras/swagger",xs="extras/database",Is="monorepo/packages/db",_s="feature/graphql/todo-example",Os="monorepo/feature/graphql/todo-example",Nt="feature/rest/todo-example",Ft="monorepo/feature/rest/todo-example",Cs=[{conditions:{extras:["docker"]},id:"extra-docker",name:"Docker Support",priority:5,templateGroups:[Rs]},{conditions:{extras:["swagger"]},id:"extra-swagger",name:"Swagger Documentation",priority:5,templateGroups:[qs]},{conditions:{database:["postgresql","mysql","sqlite","mongodb"]},id:"extra-database",name:"Database Module",priority:5,templateGroups:[xs]},{conditions:{database:["postgresql","mysql","sqlite","mongodb"],projectType:"monorepo"},id:"monorepo-db-package",name:"Monorepo DB Package",priority:5,templateGroups:[Is]},{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:{api:["graphql"],projectType:"single"},id:"feature-graphql",name:"GraphQL API templates (single)",priority:3,templateGroups:["feature/graphql"]},{conditions:{api:["graphql"],projectType:"monorepo"},id:"monorepo-feature-graphql",name:"GraphQL API templates (monorepo)",priority:3,templateGroups:["monorepo/feature/graphql"]},{conditions:{api:["graphql"],extras:["todo-example"],projectType:"single"},id:"extra-todo-example",name:"Todo Example (single, graphql)",priority:5,templateGroups:[_s]},{conditions:{api:["graphql"],extras:["todo-example"],projectType:"monorepo"},id:"monorepo-extra-todo-example",name:"Todo Example (monorepo, graphql)",priority:5,templateGroups:[Os]},{conditions:{api:["rest"],extras:["todo-example"],projectType:"single"},id:"extra-rest-todo-example",name:"REST Todo Example (single)",priority:5,templateGroups:[Nt]},{conditions:{api:["rest"],extras:["todo-example"],projectType:"monorepo"},id:"monorepo-extra-rest-todo-example",name:"REST Todo Example (monorepo)",priority:5,templateGroups:[Ft]},{conditions:{api:["trpc"],extras:["todo-example"],projectType:"single"},id:"extra-trpc-todo-example",name:"tRPC Todo Example (single)",priority:5,templateGroups:[Nt]},{conditions:{api:["trpc"],extras:["todo-example"],projectType:"monorepo"},id:"monorepo-extra-trpc-todo-example",name:"tRPC Todo Example (monorepo)",priority:5,templateGroups:[Ft]}],Gs=[{conditions:{architecture:"nest-api",projectType:"single"},id:"single-nest-api",name:"Single NestJS API",priority:10,templateGroups:[vs]},{conditions:{architecture:"nest-gateway",projectType:"single"},id:"single-nest-gateway",name:"Single NestJS Gateway",priority:10,templateGroups:[Ss]},{conditions:{architecture:"nest-microservice",projectType:"single"},id:"single-nest-microservice",name:"Single NestJS Microservice",priority:10,templateGroups:[ks]},{conditions:{projectType:"monorepo"},id:"monorepo-root",name:"Monorepo Root",priority:10,templateGroups:[As,Ts,Ps]},{conditions:{addons:["husky"]},id:"addon-husky",name:"Husky Git Hooks",priority:5,templateGroups:[Es]}],Ms=[...Gs,...Cs];function Ds(t){t.registerAll(Ms)}l(Ds,"initializeTemplateMappings");class Ue{static{l(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 a of this.mappings)Ue.matches(a.conditions,e)&&r.push(a);const s=[],n={},o=[];for(const a of r){for(const i of a.templateGroups)s.includes(i)||s.push(i);Object.assign(n,a.extraVariables),o.push(a.id)}return{extraVariables:n,matchedMappings:o,templateGroups:s}}findFirst(e){return this.mappings.find(r=>Ue.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 zs(t){return t.replaceAll(/([a-z])([A-Z])/gu,"$1-$2").replaceAll(/\s+/gu,"-").toLowerCase()}l(zs,"toKebabCase");function Ns(t){return t.replaceAll(/[-_\s](.)/gu,(e,r)=>r.toUpperCase()).replace(/^(.)/u,e=>e.toLowerCase())}l(Ns,"toCamelCase");function Fs(t){return t.replaceAll(/[-_\s](.)/gu,(e,r)=>r.toUpperCase()).replace(/^(.)/u,e=>e.toUpperCase())}l(Fs,"toPascalCase");function Ls(t){const e=t.database.includes("postgresql"),r=t.database.includes("mysql"),s=t.database.includes("sqlite"),n=t.database.includes("mongodb"),o=t.orm.includes("prisma"),a=t.orm.includes("typeorm"),i=t.orm.includes("drizzle"),p=t.database.length>0&&!o&&!a&&!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],graphqlPlayground:t.api.includes("graphql"),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:n,hasMysql:r,hasOrm:t.orm.length>0,hasPostgres:e,hasRest:t.api.includes("rest"),hasSqlite:s,hasTodoExample:t.extras.includes("todo-example"),hasTrpc:t.api.includes("trpc"),hasTrpcAndAuth:t.api.includes("trpc")&&t.auth!=="none",httpProvider:t.httpProvider,initGit:t.initGit,isBetterAuth:t.auth==="better-auth"||t.auth==="better-auth:stateless",isBun:t.packageManager==="bun",isMonorepo:t.projectType==="monorepo",isNpm:t.packageManager==="npm",isPassportAuth:t.auth==="passport",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:Ns(t.projectName),projectNameKebab:zs(t.projectName),projectNamePascalCase:Fs(t.projectName),projectType:t.projectType,shouldImportAuthModule:t.auth!=="none"&&(t.api.includes("rest")||t.api.includes("graphql")),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:o,useRawSql:p,useSwaggerScalar:t.extras.includes("swagger")&&t.addons.includes("scalar-ui"),useTypeorm:a,useTypescript7:t.extras.includes("typescript-7"),year:new Date().getFullYear()}}l(Ls,"buildTemplateVariables");function $s(t,e){return{...t,...e}}l($s,"mergeTemplateExtras");class Us{static{l(this,"BetterAuthGenerator")}project;config;constructor(e,r){this.project=e,this.config=r}generate(e){const r=this.config.orm??[],s=this.config.database??[],n=s.length>0,o=this.config.skipModule??!1;if(!n){this.generateStateless(e,o);return}const a=r.includes("prisma"),i=r.includes("drizzle"),p=r.includes("typeorm");a?(this.generatePrisma(e,s),o||this.generateModule(e,"prisma")):i?(this.generateDrizzle(e,s),o||this.generateModule(e,"drizzle")):p?(this.generateNative(e,s),o||this.generateTypeormModule(e,s)):(this.generateNative(e,s),o||this.generateModule(e,"raw.sql"))}generateAuthOnly(e){const r=this.config.database??[];if(!(r.length>0)){this.generateStateless(e,!0);return}const n=this.config.orm??[],o=n.includes("prisma"),a=n.includes("drizzle"),i=n.includes("typeorm");o?this.generatePrisma(e,r):a?this.generateDrizzle(e,r):i?this.generateNative(e,r):this.generateNative(e,r)}generatePrisma(e,r){const s=r.includes("postgresql"),n=r.includes("mysql");let o;s?o="postgresql":n?o="mysql":o="sqlite";let a,i,p;s?(a="PrismaPg",i="@prisma/adapter-pg",p="new PrismaPg({ connectionString: '' })"):n?(a="PrismaMariaDb",i="@prisma/adapter-mariadb",p="new PrismaMariaDb('')"):(a="PrismaBetterSqlite3",i="@prisma/adapter-better-sqlite3",p="new PrismaBetterSqlite3({ url: ':memory:' })");const d=this.config.extras?.includes("swagger"),m=[`import { ${a} } from "${i}";`,'import { betterAuth } from "better-auth";','import { prismaAdapter } from "better-auth/adapters/prisma";','import { PrismaClient } from "../database/orm/prisma/generated/client.js";',...d?['import { openAPI } from "better-auth/plugins";']:[],"","export function createAuth(prisma: PrismaClient) {"," return betterAuth({",` database: prismaAdapter(prisma, { provider: "${o}" }),`," emailAndPassword: { enabled: true },"," experimental: { joins: true },",...d?[" 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 = ${p};`," 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"],g=w.join(e,"auth.ts");this.project.createSourceFile(g,m.join(`
63
63
  `),{overwrite:!0})}generateDrizzle(e,r){const s=r.includes("postgresql"),n=r.includes("mysql"),o=r.includes("sqlite");let a,i,p,d,m,g;s?(a='import { drizzle } from "drizzle-orm/node-postgres";',i='import { Pool } from "pg";',p="NodePgDatabase",d="pg",m='new Pool({ connectionString: "" })',g="drizzle({ client: pool, schema })"):n?(a='import { drizzle } from "drizzle-orm/mysql2";',i='import mysql from "mysql2/promise";',p="MySql2Database",d="mysql",m='mysql.createPool({ uri: "" })',g="drizzle({ client: pool, schema })"):(a='import { drizzle } from "drizzle-orm/better-sqlite3";',i='import Database from "better-sqlite3";',p="BetterSqlite3Database",d="sqlite",m='new Database(":memory:")',g="drizzle({ client: sqliteDb, schema })");const b=this.config.extras?.includes("swagger"),q=['import { betterAuth } from "better-auth";','import { drizzleAdapter } from "@better-auth/drizzle-adapter";',a,i,'import * as schema from "../database/orm/drizzle/schema.js";',...b?['import { openAPI } from "better-auth/plugins";']:[],"",`export function createAuth(db: ${p}<typeof schema>) {`," return betterAuth({",` database: drizzleAdapter(db, { provider: "${d}", usePlural: true }),`," emailAndPassword: { enabled: true },"," experimental: { joins: true },",...b?[" plugins: [openAPI()],"]:[]," });","}","","// Lazily created \u2014 only initializes when CLI accesses auth.options","// This is for auth schema generation only, ignore this code","function createCliAuth() {",o?` const sqliteDb = ${m};`:` const pool = ${m};`,...o?[` const db = ${g};`]:[` const db = ${g};`]," 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"],M=w.join(e,"auth.ts");this.project.createSourceFile(M,q.join(`
64
64
  `),{overwrite:!0})}generateNative(e,r){const s=r.includes("postgresql"),n=r.includes("mysql");let o,a,i;s?(o=`import { Pool } from "pg";
65
65
  `,a="Pool",i='new Pool({ connectionString: "" })'):n?(o=`import { createPool } from "mysql2";
@@ -69,8 +69,8 @@ ${s},
69
69
  `),o=w.join(e,"auth.ts");this.project.createSourceFile(o,n,{overwrite:!0}),r||this.generateStatelessModule(e)}generateModule(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 {}",""],n=w.join(e,"auth.module.ts");this.project.createSourceFile(n,s.join(`
70
70
  `),{overwrite:!0})}generateTypeormModule(e,r){const s=r.includes("postgresql"),n=r.includes("mysql");let o,a;s?(o='import { Pool } from "pg";',a="new Pool({ connectionString: process.env.POSTGRES_URL! })"):n?(o='import { createPool } from "mysql2";',a="createPool({ uri: process.env.MYSQL_URL! })"):(o='import Database from "better-sqlite3";',a='new Database(process.env.SQLITE_PATH ?? ":memory:")');const i=['import { Module } from "@nestjs/common";','import { AuthModule as BetterAuthModule } from "@thallesp/nestjs-better-auth";',o,'import { createAuth } from "./auth.js";',"","@Module({"," exports: [BetterAuthModule],"," imports: ["," BetterAuthModule.forRootAsync({"," useFactory: () => ({",` auth: createAuth(${a}),`," }),"," }),"," ],","})","export class AuthModule {}",""],p=w.join(e,"auth.module.ts");this.project.createSourceFile(p,i.join(`
71
71
  `),{overwrite:!0})}generateStatelessModule(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=w.join(e,"auth.module.ts");this.project.createSourceFile(s,r.join(`
72
- `),{overwrite:!0})}}class Js{static{l(this,"PassportAuthGenerator")}project;config;constructor(e,r){this.project=e,this.config=r}generate(e){(this.config.database?.length??0)>0?this.generateDbAuth(e):this.generateStatelessAuth(e)}generateStatelessAuth(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(`
73
- `),s=w.join(e,"strategies/jwt.strategy.ts");this.project.createSourceFile(s,r,{overwrite:!0});const n=w.join(e,"auth.service.ts"),o=this.project.createSourceFile(n,"",{overwrite:!0});o.addImportDeclaration({moduleSpecifier:"@nestjs/common",namedImports:["Injectable"]}),o.addImportDeclaration({moduleSpecifier:"@nestjs/jwt",namedImports:["JwtService"]}),o.addClass({ctors:[{parameters:[{decorators:[{name:"Inject"}],isReadonly:!0,name:"jwtService",scope:hr.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 a=["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(`
72
+ `),{overwrite:!0})}}class Bs{static{l(this,"PassportAuthGenerator")}project;config;constructor(e,r){this.project=e,this.config=r}generate(e){(this.config.database?.length??0)>0?this.generateDbAuth(e):this.generateStatelessAuth(e)}generateStatelessAuth(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(`
73
+ `),s=w.join(e,"strategies/jwt.strategy.ts");this.project.createSourceFile(s,r,{overwrite:!0});const n=w.join(e,"auth.service.ts"),o=this.project.createSourceFile(n,"",{overwrite:!0});o.addImportDeclaration({moduleSpecifier:"@nestjs/common",namedImports:["Injectable"]}),o.addImportDeclaration({moduleSpecifier:"@nestjs/jwt",namedImports:["JwtService"]}),o.addClass({ctors:[{parameters:[{decorators:[{name:"Inject"}],isReadonly:!0,name:"jwtService",scope:mr.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 a=["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(`
74
74
  `),i=w.join(e,"auth.controller.ts");this.project.createSourceFile(i,a,{overwrite:!0}),this.generateDecorators(e),this.generateGuard(e);const p=['import { Module } from "@nestjs/common";','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 { RestAuthGuard } from "./guards/rest-auth.guard.js";','import { RestOptionalAuthGuard } from "./guards/rest-optional-auth.guard.js";','import { RestRolesGuard } from "./guards/rest-roles.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,"," RestAuthGuard,"," RestOptionalAuthGuard,"," RestRolesGuard,"," ],"," exports: ["," AuthService,"," RestAuthGuard,"," RestOptionalAuthGuard,"," RestRolesGuard,"," ],","})","export class AuthModule {}",""].join(`
75
75
  `),d=w.join(e,"auth.module.ts");this.project.createSourceFile(d,p,{overwrite:!0})}generateDbAuth(e){const r=this.config.orm??[],s=r.includes("prisma"),n=r.includes("typeorm"),o=r.includes("drizzle"),a=(this.config.api??[]).includes("graphql"),i=(this.config.extras??[]).includes("swagger");this.generatePasswordService(e),this.generateDbAuthService(e,{useDrizzle:o,usePrisma:s,useTypeorm:n}),this.generateLoginSchema(e),this.generateSignupSchema(e),this.generateRefreshTokenSchema(e),this.generateJwtDto(e),a&&(this.generateLoginInput(e),this.generateSignupInput(e),this.generateRefreshTokenInput(e)),this.generateDbJwtStrategy(e),this.generateDbRestGuard(e),a&&this.generateDbGqlGuard(e),this.generateRestOptionalAuthGuard(e),this.generateRestRolesGuard(e),a&&(this.generateGqlOptionalAuthGuard(e),this.generateGqlRolesGuard(e)),this.generateDbController(e,i),a&&(this.generateTokenModel(e),this.generateAuthModel(e),this.generateAuthResolver(e)),this.generateDecorators(e),this.generateDbModule(e,{hasGraphql:a,useTypeorm:n})}generatePasswordService(e){const r=['import { Injectable } from "@nestjs/common";','import { hash, compare } from "bcrypt";',"","@Injectable()","export class PasswordService {"," private readonly saltRounds = 10;",""," validatePassword(password: string, hashedPassword: string): Promise<boolean> {"," return compare(password, hashedPassword);"," }",""," hashPassword(password: string): Promise<string> {"," return hash(password, this.saltRounds);"," }","}",""].join(`
76
76
  `);this.project.createSourceFile(w.join(e,"password.service.ts"),r,{overwrite:!0})}generateDbAuthService(e,r){const{usePrisma:s,useTypeorm:n}=r,o=["import {"," ConflictException,"," Injectable,"," NotFoundException,"," UnauthorizedException,",'} from "@nestjs/common";','import { JwtService } from "@nestjs/jwt";','import { env } from "../config/env.js";','import { PasswordService } from "./password.service.js";'];let a,i,p,d,m;s?(a='import { DbService } from "../database/db.service.js";',i=[" private readonly db: DbService,"," private readonly jwtService: JwtService,"," private readonly passwordService: PasswordService,"].join(`
@@ -113,26 +113,26 @@ ${s},
113
113
  `),{overwrite:!0})}generateDecorators(e){const r=w.join(e,"decorators"),s=['import { createParamDecorator, ExecutionContext } from "@nestjs/common";',"","export const CurrentUser = createParamDecorator("," (_data: unknown, ctx: ExecutionContext) => {"," const request = ctx.switchToHttp().getRequest();"," return request.user;"," }",");",""].join(`
114
114
  `);this.project.createSourceFile(w.join(r,"current-user.decorator.ts"),s,{overwrite:!0});const n=['import { createParamDecorator, ExecutionContext } from "@nestjs/common";','import { GqlExecutionContext } from "@nestjs/graphql";',"","export const UserEntity = createParamDecorator("," (_data: unknown, ctx: ExecutionContext) => {"," const gqlCtx = GqlExecutionContext.create(ctx);"," return gqlCtx.getContext().req.user;"," }",");",""].join(`
115
115
  `);this.project.createSourceFile(w.join(r,"user.decorator.ts"),n,{overwrite:!0});const o=['export { CurrentUser } from "./current-user.decorator.js";','export { UserEntity } from "./user.decorator.js";',""].join(`
116
- `);this.project.createSourceFile(w.join(r,"index.ts"),o,{overwrite:!0})}generateGuard(e){this.generateDbRestGuard(e),this.generateRestOptionalAuthGuard(e),this.generateRestRolesGuard(e)}}class Hs{static{l(this,"AuthModuleGenerator")}project;config;passportGen;betterAuthGen;constructor(e){this.config=e,this.project=new gr,this.passportGen=new Js(this.project,e),this.betterAuthGen=new Bs(this.project,e)}generate(){const e=`${this.config.outputDir}/auth`,r=this.config.strategy==="better-auth:stateless"?"better-auth":this.config.strategy;r==="passport"?this.passportGen.generate(e):r==="better-auth"&&this.betterAuthGen.generate(e)}generateAuthOnly(){const e=`${this.config.outputDir}/auth`;(this.config.strategy==="better-auth:stateless"?"better-auth":this.config.strategy)==="better-auth"&&this.betterAuthGen.generateAuthOnly(e)}async save(){await this.project.save()}}class Ws{static{l(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 Vs(t,e,r){const s=[];for(const n of r)try{if(n==="auth"){const o=t.api.includes("rest"),a=new Hs({api:t.api,database:t.database,extras:t.extras,orm:t.orm,outputDir:`${e}/src`,skipModule:!o&&(t.auth==="better-auth"||t.auth==="better-auth:stateless"),strategy:t.auth});await(o||t.auth==="passport"?a.generate():a.generateAuthOnly()),await a.save(),s.push({filesCount:3,generatedFiles:[],success:!0})}else console.log(`Generator ${n} not yet implemented`)}catch(o){s.push({error:o instanceof Error?o.message:"Unknown error",filesCount:0,generatedFiles:[],success:!1})}return s}l(Vs,"executePresetGenerators");function Qs(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 o of r)e.push(` - ${o}`)}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.7.1"),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.3.4-noble"),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(o=>["postgresql","mysql","mongodb"].includes(o))&&(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(`
116
+ `);this.project.createSourceFile(w.join(r,"index.ts"),o,{overwrite:!0})}generateGuard(e){this.generateDbRestGuard(e),this.generateRestOptionalAuthGuard(e),this.generateRestRolesGuard(e)}}class Js{static{l(this,"AuthModuleGenerator")}project;config;passportGen;betterAuthGen;constructor(e){this.config=e,this.project=new hr,this.passportGen=new Bs(this.project,e),this.betterAuthGen=new Us(this.project,e)}generate(){const e=`${this.config.outputDir}/auth`,r=this.config.strategy==="better-auth:stateless"?"better-auth":this.config.strategy;r==="passport"?this.passportGen.generate(e):r==="better-auth"&&this.betterAuthGen.generate(e)}generateAuthOnly(){const e=`${this.config.outputDir}/auth`;(this.config.strategy==="better-auth:stateless"?"better-auth":this.config.strategy)==="better-auth"&&this.betterAuthGen.generateAuthOnly(e)}async save(){await this.project.save()}}class Hs{static{l(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 Ws(t,e,r){const s=[];for(const n of r)try{if(n==="auth"){const o=t.api.includes("rest"),a=new Js({api:t.api,database:t.database,extras:t.extras,orm:t.orm,outputDir:`${e}/src`,skipModule:!o&&(t.auth==="better-auth"||t.auth==="better-auth:stateless"),strategy:t.auth});await(o||t.auth==="passport"?a.generate():a.generateAuthOnly()),await a.save(),s.push({filesCount:3,generatedFiles:[],success:!0})}else console.log(`Generator ${n} not yet implemented`)}catch(o){s.push({error:o instanceof Error?o.message:"Unknown error",filesCount:0,generatedFiles:[],success:!1})}return s}l(Ws,"executePresetGenerators");function Vs(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 o of r)e.push(` - ${o}`)}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.7.1"),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.3.4-noble"),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(o=>["postgresql","mysql","mongodb"].includes(o))&&(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(`
117
117
  `)}
118
- `}l(Qs,"generateDockerCompose");async function Ys(t,e,r,s,n){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",i=a.replace("/schema.ts","/migrations");let p="process.env.POSTGRES_URL!";e.database.includes("mysql")?p="process.env.MYSQL_URL!":e.database.includes("sqlite")&&(p="process.env.SQLITE_PATH!");const d=[e.formatter==="oxlint-oxfmt"?"// oxlint-disable typescript/no-non-null-assertion":"","import 'dotenv/config';","import { defineConfig } from 'drizzle-kit';","","export default defineConfig({"," dbCredentials: {",` url: ${p},`," },",` dialect: '${o}',`,` out: '${i}',`,` schema: '${a}',`,"});",""].join(`
119
- `);try{const m=await t.writeFile({content:d,filePath:"drizzle.config.ts",isBinary:!1},r);m.written&&s.push(m.filePath)}catch(m){const g=m instanceof Error?m.message:String(m);n.push(`Failed to generate drizzle.config.ts: ${g}`)}}l(Ys,"generateDrizzleConfig");function Xs(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(" ")}l(Xs,"buildReproducibleCommand");function Ks(t){return{$schema:me.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:Xs(t),ultraciteAgents:t.ultraciteAgents,ultraciteEditors:t.ultraciteEditors,ultraciteHooks:t.ultraciteHooks,ultraciteInstallSkill:t.ultraciteInstallSkill,version:me.NEST_ARCH_VERSION}}l(Ks,"buildMetadata");function Zs(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(`
118
+ `}l(Vs,"generateDockerCompose");async function Qs(t,e,r,s,n){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",i=a.replace("/schema.ts","/migrations");let p="process.env.POSTGRES_URL!";e.database.includes("mysql")?p="process.env.MYSQL_URL!":e.database.includes("sqlite")&&(p="process.env.SQLITE_PATH!");const d=[e.formatter==="oxlint-oxfmt"?"// oxlint-disable typescript/no-non-null-assertion":"","import 'dotenv/config';","import { defineConfig } from 'drizzle-kit';","","export default defineConfig({"," dbCredentials: {",` url: ${p},`," },",` dialect: '${o}',`,` out: '${i}',`,` schema: '${a}',`,"});",""].join(`
119
+ `);try{const m=await t.writeFile({content:d,filePath:"drizzle.config.ts",isBinary:!1},r);m.written&&s.push(m.filePath)}catch(m){const g=m instanceof Error?m.message:String(m);n.push(`Failed to generate drizzle.config.ts: ${g}`)}}l(Qs,"generateDrizzleConfig");function Ys(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(" ")}l(Ys,"buildReproducibleCommand");function Xs(t){return{$schema:te.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:Ys(t),ultraciteAgents:t.ultraciteAgents,ultraciteEditors:t.ultraciteEditors,ultraciteHooks:t.ultraciteHooks,ultraciteInstallSkill:t.ultraciteInstallSkill,version:te.NEST_ARCH_VERSION}}l(Xs,"buildMetadata");function Ks(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(`
120
120
  `)+JSON.stringify(t,null,2)}
121
- `}l(Zs,"serializeMetadata");function ea(){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","todo-example"]},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)}
122
- `}l(ea,"buildSchemaContent");async function ta(t,e,r,s,n){try{const o=Ks(e),a=Zs(o),i=await t.writeFile({content:a,filePath:"nest-arch.jsonc",isBinary:!1},r);i.written&&s.push(i.filePath);const p=ea(),d=await t.writeFile({content:p,filePath:"schema.json",isBinary:!1},r);d.written&&s.push(d.filePath)}catch(o){const a=o instanceof Error?o.message:String(o);n.push(`Failed to generate nest-arch.jsonc/schema.json: ${a}`)}}l(ta,"generateMetadata");const ra={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":"^24.0.0",dotenv:"^17.2.2",typescript:"^6.0.2","typescript-7":"^7.0.0",zod:"^4.4.3"},dependencies:{"@apollo/server":"^5.5.1","@as-integrations/fastify":"^3.1.0","@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":"^12.0.1","@nestjs/core":"^12.0.1","@nestjs/graphql":"^14.0.0-next.0","@nestjs/jwt":"^11.0.0","@nestjs/microservices":"^12.0.1","@nestjs/passport":"^11.0.0","@nestjs/platform-express":"^12.0.1","@nestjs/platform-fastify":"^12.0.1","@nestjs/swagger":"^12.0.1","@nestjs/terminus":"^12.0.0","@nestjs/throttler":"6.5.0","@nestjs/typeorm":"12.0.1","@prisma/adapter-better-sqlite3":"^7.10.0","@prisma/adapter-mariadb":"^7.10.0","@prisma/adapter-pg":"^7.10.0","@prisma/adapter-ppg":"^7.10.0","@prisma/client":"^7.10.0","@scalar/nestjs-api-reference":"^1.2.17","@t3-oss/env-core":"^0.13.11","@thallesp/nestjs-better-auth":"^2.7.0","@trpc/client":"^11.18.0","@trpc/openapi":"^11.18.0-alpha","@trpc/server":"^11.18.0",amqplib:"^0.10.5",bcrypt:"^6.0.0","better-auth":"^1.7.2","better-sqlite3":"^12.11.1",dotenv:"^17.2.2","drizzle-graphql":"^0.8.5","drizzle-orm":"^0.45.2",graphql:"^17.0.2","graphql-scalars":"^2.0.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.13.0","nestjs-zod":"^5.5.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.1.1","typeorm-relations-graphql":"^3.0.0",zod:"^4.5.4"},devDependencies:{"@nestjs/cli":"^12.0.0","@nestjs/mau":"^0.2.6","@nestjs/schematics":"^12.0.0","@nestjs/testing":"^12.0.1","@types/amqplib":"^0.10.6","@types/bcrypt":"^5.0.2","@types/better-sqlite3":"^7.6.13","@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.2","drizzle-kit":"^0.31.10",husky:"^9.1.7",oxfmt:"^0.66.0",oxlint:"^1.81.0",prettier:"^3.4.2",prisma:"^7.10.0","source-map-support":"^0.5.21",supertest:"^7.0.0",turbo:"^2.8.12",typescript:"^6.0.2","typescript-7":"^7.0.0",ultracite:"7.9.4","vite-tsconfig-paths":"^5.1.4",vitest:"^4.1.10"}};function $t(){return ra}l($t,"loadReference");function h(t){const e=$t(),r=e.dependencies[t]??e.devDependencies[t];if(!r)throw new Error(`Dependency "${t}" not found in reference package.json`);return r}l(h,"getDependencyVersion");function Ut(){return{...$t().catalog}}l(Ut,"getCatalogDependencies");const sa=[{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:".env.example",src:"base/.env.example.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"}],aa={dest:"pnpm-workspace.yaml",src:"base/pnpm-workspace.yaml.hbs"},oa={dest:".yarnrc.yml",src:"base/.yarnrc.yml.hbs"},na={dest:"bunfig.toml",src:"base/bunfig.toml.hbs"},ia=[{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"}],ca=[{dest:"src/api/todo/todo.controller.ts",src:"feature/rest/todo-example/src/api/todo/todo.controller.ts.hbs"},{dest:"src/api/todo/todo.service.ts",src:"feature/rest/todo-example/src/api/todo/todo.service.ts.hbs"},{dest:"src/api/todo/todo.module.ts",src:"feature/rest/todo-example/src/api/todo/todo.module.ts.hbs"},{dest:"src/api/todo/todo.router.ts",src:"feature/rest/todo-example/src/api/todo/todo.router.ts.hbs"},{dest:"src/api/todo/dto/create-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/create-todo.dto.ts.hbs"},{dest:"src/api/todo/dto/update-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/update-todo.dto.ts.hbs"}],la=[{dest:"apps/api-gateway/src/api/todo/todo.controller.ts",src:"feature/rest/todo-example/src/api/todo/todo.controller.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/todo.service.ts",src:"feature/rest/todo-example/src/api/todo/todo.service.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/todo.module.ts",src:"feature/rest/todo-example/src/api/todo/todo.module.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/todo.router.ts",src:"feature/rest/todo-example/src/api/todo/todo.router.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/dto/create-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/create-todo.dto.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/dto/update-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/update-todo.dto.ts.hbs"}],pa=[{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"}],da=[{dest:".husky/pre-commit",src:"addons/husky/pre-commit.hbs"}],ua=[{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"}],ma=[{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"}],ha=[{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"}],Bt={"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"}]},Jt=[{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"}],ga="package.json",fa=[{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"}],ya=[{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"}],ba=[{dest:"src/graphql/graphql.module.ts",src:"feature/graphql/src/graphql/graphql.module.ts.hbs"},{dest:"src/graphql/models/base.model.ts",src:"feature/graphql/src/graphql/models/base.model.ts.hbs"},{dest:"src/graphql/models/user.model.ts",src:"feature/graphql/src/graphql/models/user.model.ts.hbs"},{dest:"src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts",src:"feature/graphql/src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts.hbs"},{dest:"src/graphql/orm/drizzle/drizzle-graphql.module.ts",src:"feature/graphql/src/graphql/orm/drizzle/drizzle-graphql.module.ts.hbs"}],wa=[{dest:"src/graphql/dto/create-todo.input.ts",src:"feature/graphql/src/graphql/dto/create-todo.input.ts.hbs"},{dest:"src/graphql/dto/update-todo.input.ts",src:"feature/graphql/src/graphql/dto/update-todo.input.ts.hbs"},{dest:"src/graphql/models/todo.model.ts",src:"feature/graphql/src/graphql/models/todo.model.ts.hbs"},{dest:"src/graphql/resolvers/todo.resolver.ts",src:"feature/graphql/src/graphql/resolvers/todo.resolver.ts.hbs"}],ja=[{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"}],va=[{dest:"apps/api-gateway/src/graphql/graphql.module.ts",src:"monorepo/feature/graphql/src/graphql/graphql.module.ts.hbs"},{dest:"apps/api-gateway/src/graphql/models/base.model.ts",src:"monorepo/feature/graphql/src/graphql/models/base.model.ts.hbs"},{dest:"apps/api-gateway/src/graphql/models/user.model.ts",src:"monorepo/feature/graphql/src/graphql/models/user.model.ts.hbs"},{dest:"apps/api-gateway/src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts",src:"monorepo/feature/graphql/src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts.hbs"},{dest:"apps/api-gateway/src/graphql/orm/drizzle/drizzle-graphql.module.ts",src:"monorepo/feature/graphql/src/graphql/orm/drizzle/drizzle-graphql.module.ts.hbs"}],Sa=[{dest:"apps/api-gateway/src/graphql/dto/create-todo.input.ts",src:"monorepo/feature/graphql/src/graphql/dto/create-todo.input.ts.hbs"},{dest:"apps/api-gateway/src/graphql/dto/update-todo.input.ts",src:"monorepo/feature/graphql/src/graphql/dto/update-todo.input.ts.hbs"},{dest:"apps/api-gateway/src/graphql/models/todo.model.ts",src:"monorepo/feature/graphql/src/graphql/models/todo.model.ts.hbs"},{dest:"apps/api-gateway/src/graphql/resolvers/todo.resolver.ts",src:"monorepo/feature/graphql/src/graphql/resolvers/todo.resolver.ts.hbs"}],ka=[{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"}],Aa={"addons/husky":da,"extras/database":ma,"extras/docker":ua,"extras/swagger":[],"feature/graphql":ba,"feature/graphql/todo-example":wa,"feature/rest":ia,"feature/rest/todo-example":ca,"feature/trpc":pa,"monorepo/apps/api-gateway":fa,"monorepo/feature/graphql":va,"monorepo/feature/graphql/todo-example":Sa,"monorepo/feature/rest":ya,"monorepo/feature/rest/todo-example":la,"monorepo/feature/trpc":ja,"monorepo/packages":ka,"monorepo/packages/db":ha,"monorepo/root":Jt};function Ht(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&&(e.bcrypt=h("bcrypt"),r["@types/bcrypt"]=h("@types/bcrypt"),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)s==="graphql"?(e["@nestjs/graphql"]=h("@nestjs/graphql"),e["@nestjs/apollo"]=h("@nestjs/apollo"),e.graphql=h("graphql"),e["@apollo/server"]=h("@apollo/server"),t.httpProvider==="fastify"?e["@as-integrations/fastify"]=h("@as-integrations/fastify"):e["@as-integrations/express5"]=h("@as-integrations/express5"),t.auth==="passport"&&(e["graphql-scalars"]=h("graphql-scalars")),t.orm.includes("typeorm")&&(e["typeorm-relations-graphql"]=h("typeorm-relations-graphql")),t.orm.includes("drizzle")&&(e["drizzle-graphql"]=h("drizzle-graphql"))):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"))}l(Ht,"addConditionalDependencies");function Wt(t,e,r){const s=t.orm.includes("prisma"),n=t.orm.includes("drizzle"),o=t.orm.includes("typeorm"),a=t.database.length>0&&!s&&!n&&!o;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-mariadb"]=h("@prisma/adapter-mariadb")),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")&&n&&(e.pg=h("pg"),r["@types/pg"]=h("@types/pg")),t.database.includes("mysql")&&n&&(e.mysql2=h("mysql2")),t.database.includes("sqlite")&&n&&(e["better-sqlite3"]=h("better-sqlite3"),r["@types/better-sqlite3"]=h("@types/better-sqlite3")),t.database.includes("mongodb")&&a&&(e.mongodb=h("mongodb"))}l(Wt,"addDatabaseDependencies");async function Pa(t,e,r,s,n,o){try{const a=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",i={"@nestjs/common":h("@nestjs/common"),"@nestjs/core":h("@nestjs/core"),[a]:h(a),"@t3-oss/env-core":h("@t3-oss/env-core"),dotenv:h("dotenv"),"reflect-metadata":h("reflect-metadata"),rxjs:h("rxjs"),zod:h("zod")},p=t.extras.includes("typescript-7")?h("typescript-7"):h("typescript"),d={"@nestjs/cli":h("@nestjs/cli"),"@nestjs/mau":h("@nestjs/mau"),"@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:p,"vite-tsconfig-paths":h("vite-tsconfig-paths"),vitest:h("vitest")};t.httpProvider==="express"&&(d["@types/express"]=h("@types/express"));const m={build:"nest build",deploy:"nest deploy",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"};Ht(t,i,d),Wt(t,i,d),t.addons.includes("ultracite")&&(d.ultracite=h("ultracite"),m.check="ultracite check",m.fix="ultracite fix"),t.addons.includes("husky")&&(d.husky=h("husky"),m.prepare="husky"),t.orm.includes("prisma")&&(m["prisma:generate"]="prisma generate",m["prisma:format"]="prisma format",m["prisma:push"]="prisma db push",m["prisma:studio"]="prisma studio",m["prisma:migrate"]="prisma migrate dev",m["prisma:migrate:deploy"]="prisma migrate deploy",m.postinstall="prisma generate"),t.orm.includes("drizzle")&&(m["db:generate"]="drizzle-kit generate",m["db:migrate"]="drizzle-kit migrate",m["db:studio"]="drizzle-kit studio",m["db:push"]="drizzle-kit push"),t.api.includes("trpc")&&(m["trpc:generate"]="nestjs-trpc generate -e src/app.module.ts -o src/libs/trpc/@generated",m["trpc:watch"]="nestjs-trpc watch -e src/app.module.ts -o src/libs/trpc/@generated"),t.orm.includes("typeorm")&&(m["typeorm:run"]="typeorm migration:run -d src/database/orm/typeorm/data-source.ts",m["typeorm:revert"]="typeorm migration:revert -d src/database/orm/typeorm/data-source.ts",m["typeorm:generate"]="typeorm migration:generate -d src/database/orm/typeorm/data-source.ts",m["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:m,dependencies:i,devDependencies:d},b=JSON.stringify(g,null,2),q=await r.writeFile({content:b,filePath:"package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});q.written&&n.push(q.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate package.json: ${i}`),console.error("Failed to generate package.json:",a)}}l(Pa,"generateSingleProjectPackageJson");async function Ta(t,e,r,s,n,o){try{const a={build:"turbo build","check-types":"turbo check-types",dev:"turbo dev"},i={"@repo/env":"workspace:*",dotenv:"catalog:",zod:"catalog:"},p=t.extras.includes("typescript-7"),d=p?h("typescript-7"):"catalog:",m={"@repo/config":"workspace:*","@types/node":"catalog:",turbo:h("turbo"),typescript:d};t.addons.includes("ultracite")&&(a.check="ultracite check"),t.addons.includes("husky")&&(m.husky=h("husky"),a.prepare="husky");const b={bun:"bun@1.3.14",npm:void 0,pnpm:"pnpm@11.6.0",yarn:"yarn@4.6.0"}[t.packageManager],q=p?{...Ut(),typescript:h("typescript-7")}:Ut(),M={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,workspaces:["apps/*","packages/*"],type:"module",...b?{packageManager:b}:{},...t.packageManager==="bun"?{catalog:q}:{},scripts:a,dependencies:i,devDependencies:m},U=JSON.stringify(M,null,2),F=await r.writeFile({content:U,filePath:ga,isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});F.written&&n.push(F.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate monorepo root package.json: ${i}`),console.error("Failed to generate monorepo root package.json:",a)}}l(Ta,"generateMonorepoRootPackageJson");async function Ea(t,e,r,s,n,o){try{const a=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",i={"@nestjs/common":h("@nestjs/common"),"@nestjs/core":h("@nestjs/core"),[a]:h(a),"@repo/env":"workspace:*","reflect-metadata":h("reflect-metadata"),rxjs:h("rxjs"),zod:"catalog:"};t.database.length>0&&(i["@repo/db"]="workspace:*");const p=t.extras.includes("typescript-7")?h("typescript-7"):"catalog:",d={"@nestjs/cli":h("@nestjs/cli"),"@nestjs/mau":h("@nestjs/mau"),"@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:p,"vite-tsconfig-paths":h("vite-tsconfig-paths"),vitest:h("vitest")};t.httpProvider==="express"&&(d["@types/express"]=h("@types/express"));const m={build:"nest build",deploy:"nest deploy",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"};Ht(t,i,d),t.addons.includes("ultracite")&&(d.ultracite=h("ultracite"),m.check="ultracite check",m.fix="ultracite fix"),t.addons.includes("husky")&&(d.husky=h("husky"),m.prepare="husky"),t.api.includes("trpc")&&(m["trpc:generate"]="nestjs-trpc generate -e src/app.module.ts -o ../../packages/shared/src/trpc/@generated",m["trpc:watch"]="nestjs-trpc watch -e src/app.module.ts -o ../../packages/shared/src/trpc/@generated");const g={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:m,dependencies:i,devDependencies:d},b=JSON.stringify(g,null,2),q=await r.writeFile({content:b,filePath:"apps/api-gateway/package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});q.written&&n.push(q.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate monorepo app package.json: ${i}`),console.error("Failed to generate monorepo app package.json:",a)}}l(Ea,"generateMonorepoAppPackageJson");async function Ra(t,e,r,s,n,o){try{const a={"@nestjs/common":"catalog:","@nestjs/core":"catalog:","reflect-metadata":"catalog:",rxjs:"catalog:"},p={"@repo/config":"workspace:*","@types/node":"catalog:",typescript:t.extras.includes("typescript-7")?h("typescript-7"):"catalog:"};Wt(t,a,p);const d={};t.orm.includes("prisma")&&(d["prisma:generate"]="prisma generate",d["prisma:format"]="prisma format",d["prisma:push"]="prisma db push",d["prisma:studio"]="prisma studio",d["prisma:migrate"]="prisma migrate dev",d["prisma:migrate:deploy"]="prisma migrate deploy",d.postinstall="prisma generate"),t.orm.includes("drizzle")&&(d["db:generate"]="drizzle-kit generate",d["db:migrate"]="drizzle-kit migrate",d["db:studio"]="drizzle-kit studio",d["db:push"]="drizzle-kit push"),t.orm.includes("typeorm")&&(d["typeorm:run"]="typeorm-ts esm migration:run -d src/database/orm/typeorm/data-source.ts",d["typeorm:revert"]="typeorm-ts esm migration:revert -d src/database/orm/typeorm/data-source.ts",d["typeorm:generate"]="typeorm-ts esm migration:generate -d src/database/orm/typeorm/data-source.ts",d["typeorm:create"]="typeorm migration:create");const m={name:"@repo/db",version:"0.0.1",private:!0,type:"module",main:"./src/index.ts",exports:{".":"./src/index.ts"},...Object.keys(d).length>0?{scripts:d}:{},dependencies:a,devDependencies:p},g=JSON.stringify(m,null,2),b=await r.writeFile({content:g,filePath:"packages/db/package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});b.written&&n.push(b.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate monorepo db package.json: ${i}`),console.error("Failed to generate monorepo db package.json:",a)}}l(Ra,"generateMonorepoDbPackageJson");async function qa(t,e,r,s,n){let o="postgresql";e.database.includes("mysql")?o="mysql":e.database.includes("sqlite")?o="sqlite":e.database.includes("mongodb")&&(o="mongodb");const a=o==="mongodb",i=["generator client {",' provider = "prisma-client"',' output = "./generated"',"}","","datasource db {",` provider = "${o}"`,"}",""],p=e.extras.includes("todo-example");e.auth==="passport"&&e.database.length>0&&i.push("enum Role {"," ADMIN"," USER","}","","model User {",` id String ${a?'@id @default(auto()) @map("_id") @db.ObjectId':"@id @default(cuid())"}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," email String @unique"," password String"," firstname String?"," lastname String?"," role Role @default(USER)",...p?[" todos Todo[]",""]:[""],' @@map("user")',"}",""),p&&e.database.length>0&&(e.auth==="none"?i.push("model Todo {",` id String ${a?'@id @default(auto()) @map("_id") @db.ObjectId':"@id @default(cuid())"}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," title String"," description String?"," completed Boolean @default(false)","",' @@map("todo")',"}",""):i.push("model Todo {",` id String ${a?'@id @default(auto()) @map("_id") @db.ObjectId':"@id @default(cuid())"}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," title String"," description String?"," completed Boolean @default(false)",` authorId ${a?"String? @db.ObjectId":"String?"}`," author User? @relation(fields: [authorId], references: [id])","",' @@map("todo")',"}",""));const d=i.join(`
123
- `);try{const m=await t.writeFile({content:d,filePath:"src/database/orm/prisma/schema.prisma",isBinary:!1},r);m.written&&s.push(m.filePath)}catch(m){const g=m instanceof Error?m.message:String(m);n.push(`Failed to generate src/database/orm/prisma/schema.prisma: ${g}`)}}l(qa,"generatePrismaSchema");function Vt(t,e){const r=!!e.usePrisma,s=!!e.useTypeorm,n=!!e.useDrizzle,o=!!e.useRawSql,a=!!e.hasPostgres,i=!!e.hasMysql,p=!!e.hasSqlite,d=!!e.hasMongodb;return t.filter(m=>{const{dest:g}=m;return g.includes("prisma-sql.adapter")?r&&(a||i||p):g.includes("prisma-mongo.adapter")?r&&d:g.includes("typeorm-sql.adapter")?s&&(a||i||p):g.includes("orm/typeorm/data-source")||g.includes("entities/")?s:g.includes("drizzle-sql.adapter")?n:g.includes("raw-sql.adapter")?o&&(a||i||p):g.includes("raw-mongo.adapter")?o&&d:g.includes("orm/drizzle/schema")?n:!0})}l(Vt,"filterDatabaseTemplates");function Qt(t,e){const r=!!e.hasTrpcAndAuth;return t.filter(s=>s.dest.includes("libs/trpc/protected.ts")||s.dest.includes("libs/trpc/inner.context.ts")||s.dest.includes("libs/middlewares/auth.trpc.middleware.ts")?r:!0)}l(Qt,"filterTrpcTemplates");function Yt(t,e){const r=!!e.useTypeorm,s=!!e.usePrisma,n=!!e.useDrizzle;return t.filter(o=>{const{dest:a}=o;return a.includes("orm/typeorm")?r:a.includes("orm/prisma")?s:a.includes("orm/drizzle")?n:!0})}l(Yt,"filterGraphqlTemplates");function Xt(t,e){const r=!!e.hasTrpc,s=!!e.hasRest;return t.filter(n=>n.dest.includes("todo.router.ts")?r:n.dest.includes("todo.controller.ts")?s:!0)}l(Xt,"filterTodoTemplates");class xa{static{l(this,"ProjectGenerator")}templateEngine;fileWriter;registry;options;mapper;constructor(e,r){this.options=r,this.fileWriter=new as(e),this.templateEngine=new dt(r.templatesDir,{cache:r.cacheTemplates??!0}),this.registry=new ys,this.mapper=new Be,zs(this.mapper)}getMapper(){return this.mapper}async generate(e){const r=Date.now(),s=[],n=[];try{const o=this.mapper.resolve(e);let a=$s(e);a=Us(a,o.extraVariables),a.hasUltracite=e.addons.includes("ultracite"),a.hasHusky=e.addons.includes("husky"),a.hasAgentSkills=e.addons.includes("agent-skills"),await(e.projectType==="monorepo"?this.generateMonorepo.bind(this):this.generateSingleProject.bind(this))(e,a,o.templateGroups,s,n);const p=Date.now()-r,d=n.length===0;if(d){const m={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await ta(this.fileWriter,e,m,s,n)}return console.log(`\u2705 Project generated in ${p}ms`),{error:d&&n.length===0?void 0:n.join(`
124
- `),filesCount:s.length,generatedFiles:s,success:d&&n.length===0}}catch(o){return{error:o instanceof Error?o.message:"Unknown error",filesCount:0,generatedFiles:s,success:!1}}}async generateSingleProject(e,r,s,n,o){const a={dryRun:this.options.dryRun,overwrite:this.options.overwrite},i=[...sa];r.packageManager==="pnpm"?i.push(aa):r.packageManager==="yarn"?i.push(oa):r.packageManager==="bun"&&i.push(na),await Pa(e,r,this.fileWriter,a,n,o);for(const p of i)await this.renderAndWrite(p.src,p.dest,r,n,o);await this.processTemplateGroups(e,r,s,n,o),await this.processPostTemplateSteps(e,r,n,o)}async generateMonorepo(e,r,s,n,o){const a={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await Ta(e,r,this.fileWriter,a,n,o),await Ea(e,r,this.fileWriter,a,n,o),e.database.length>0&&await Ra(e,r,this.fileWriter,a,n,o),await this.processTemplateGroups(e,r,s,n,o),await this.processPostTemplateSteps(e,r,n,o)}TEMPLATE_FILTERS={"extras/database":Vt,"feature/graphql":Yt,"feature/rest/todo-example":Xt,"feature/trpc":Qt,"monorepo/feature/graphql":Yt,"monorepo/feature/rest/todo-example":Xt,"monorepo/feature/trpc":Qt,"monorepo/packages/db":Vt};async processSingleArchTemplates(e,r,s,n){const o=Bt[e];if(!o)return;const a=new Set(["package.json","pnpm-workspace.yaml",".yarnrc.yml","bunfig.toml"]);for(const i of o)a.has(i.dest)||await this.renderAndWrite(i.src,i.dest,r,s,n)}async processMonorepoRoot(e,r,s){for(const i of Jt)await this.renderAndWrite(i.src,i.dest,e,r,s);const n={bun:{dest:"bunfig.toml",src:"monorepo/root/bunfig.toml.hbs"},pnpm:{dest:"pnpm-workspace.yaml",src:"monorepo/root/pnpm-workspace.yaml.hbs"},yarn:{dest:".yarnrc.yml",src:"monorepo/root/.yarnrc.yml.hbs"}},o=e.packageManager,a=n[o];a&&await this.renderAndWrite(a.src,a.dest,e,r,s)}shouldSkipTemplate(e,r,s){return!!(s&&e.dest==="packages/db/package.json"||e.dest==="docker-compose.yml"&&r.database.length>0)}async processTemplateGroups(e,r,s,n,o){const a=e.projectType==="monorepo";for(const i of s){if(!a&&Bt[i]){await this.processSingleArchTemplates(i,r,n,o);continue}if(a&&i==="monorepo/root"){await this.processMonorepoRoot(r,n,o);continue}if(!a&&i==="monorepo/packages/db")continue;const p=Aa[i];if(!p)continue;const d=this.TEMPLATE_FILTERS[i],m=d?d(p,r):p;for(const g of m)this.shouldSkipTemplate(g,e,a)||await this.renderAndWrite(g.src,g.dest,r,n,o)}}async processPostTemplateSteps(e,r,s,n){const o={dryRun:this.options.dryRun,overwrite:this.options.overwrite},a=e.projectType==="monorepo"?"apps/api-gateway/src/docs/create-docs.ts":"src/docs/create-docs.ts";if(e.extras.includes("swagger")&&await this.renderAndWrite("extras/swagger/create-docs.ts.hbs",a,r,s,n),e.extras.includes("docker")&&e.database.length>0){const i=Qs(e),p=await this.fileWriter.writeFile({content:i,filePath:"docker-compose.yml",isBinary:!1},o);p.written&&s.push(p.filePath)}if(e.orm.includes("prisma")&&(await qa(this.fileWriter,e,o,s,n),await this.renderAndWrite("base/prisma.config.ts.hbs","prisma.config.ts",r,s,n)),e.orm.includes("drizzle")&&await Ys(this.fileWriter,e,o,s,n),e.auth!=="none"){const i=Ws.composeGenerators(e),p=await Vs(e,this.fileWriter.getBaseDir(),i);for(const d of p)!d.success&&d.error&&n.push(d.error)}}async renderAndWrite(e,r,s,n,o){try{const a=await this.templateEngine.renderToFile(e,r,{context:s}),i=await this.fileWriter.writeFile(a,{dryRun:this.options.dryRun,overwrite:this.options.overwrite});i.written&&n.push(i.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate ${r}: ${i}`),console.error(`Failed to generate ${r}:`,a)}}getBaseDir(){return this.fileWriter.getBaseDir()}clearCaches(){this.templateEngine.clearCache(),this.registry.clear()}}const Ia=/Resolved|Resolving/iu,Oa=/Downloaded?|downloaded/iu,_a=/Link(ed|ing)/iu,Ca=/saved (to )?(lockfile|bun)/iu;function Ga(t){const e=[],r=t.split(`
125
- `);for(const s of r){const n=s.trim();if(n){if(Ia.test(n)){e.push({message:"Resolving packages...",phase:"resolve"});continue}if(Oa.test(n)){e.push({message:"Downloading...",phase:"download"});continue}if(_a.test(n)){e.push({message:"Linking packages...",phase:"link"});continue}if(n.includes("packages installed")){e.push({message:n,percentage:100,phase:"link"});continue}if(Ca.test(n)){e.push({message:"Saving lockfile...",phase:"postinstall"});continue}(n.includes("[script]")||n.includes("postinstall"))&&e.push({message:"Running postinstall scripts...",phase:"postinstall"})}}return e}l(Ga,"parseBunText");class Ma{static{l(this,"BunInstaller")}async install(e,r,s){const n=Oe("bun install",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let o="";const a=l(p=>{const d=p.toString();o+=d;const m=Ga(d);for(const g of m)r?.(g)},"handleData");n.stderr.on("data",a),n.stdout.on("data",a);const[i]=await Promise.race([re(n,"close"),re(n,"error").then(([p])=>{const d=p;throw d.code==="ENOENT"||d.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(`
126
- `)):new Error(d.message)})]);if(i===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(o.trim()||`bun install exited with code ${i}`)}}const Da=/^(\d+)\/(\d+)\s+resolving/iu,za=/^(\d+)\/(\d+)\s+extract:/iu,Na=/^(\d+)\/(\d+)\s+(\S+)/iu,Fa=/^(\d+)ms\s+(.*)/iu;function La(t){const e=[],r=t.split(`
127
- `);for(const s of r){const n=s.trim();if(n.includes("resolving")){const o=Da.exec(n);o?e.push({completed:Number(o[1]),message:"Resolving packages...",percentage:Math.round(Number(o[1])/Number(o[2])*100),phase:"resolve",total:Number(o[2])}):e.push({message:"Resolving packages...",phase:"resolve"});continue}if(n.includes("extract:")||n.includes("http fetch")){const o=za.exec(n)||Na.exec(n);o?e.push({completed:Number(o[1]),message:"Downloading...",percentage:Math.round(Number(o[1])/Number(o[2])*100),phase:"download",total:Number(o[2])}):e.push({message:"Downloading...",phase:"download"});continue}if(n.includes("timing")){const o=Fa.exec(n);if(o){const a=o[2]??"";a.includes("build")?e.push({message:"Building dependencies...",phase:"build"}):a.includes("link")&&e.push({message:"Linking packages...",phase:"link"})}continue}n.includes("postinstall")&&!n.includes("timing")&&e.push({message:"Running postinstall scripts...",phase:"postinstall"})}return e}l(La,"parseNpmText");class $a{static{l(this,"NpmInstaller")}async install(e,r,s){const n=Oe("npm install --loglevel silly",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let o="";const a=l(p=>{const d=p.toString();o+=d;const m=La(d);for(const g of m)r?.(g)},"handleData");n.stderr.on("data",a),n.stdout.on("data",()=>{});const[i]=await Promise.race([re(n,"close"),re(n,"error").then(([p])=>{const d=p;throw d.code==="ENOENT"||d.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(`
128
- `)):new Error(d.message)})]);if(i===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(o.trim()||`npm install exited with code ${i}`)}}function Ua(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"}}}l(Ua,"mapPnpmStage");function Ba(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}l(Ba,"mapPnpmStat");function Ja(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"}}l(Ja,"mapPnpmFetching");function Ha(t){if(!t.type)return null;switch(t.type){case"stage":{const e=t.data?.stage;return e?Ua(e,t.data):null}case"stat":return Ba(t.data);case"fetching":return Ja(t);case"warning":case"error":return{message:t.message??t.type,phase:"download"};default:return null}}l(Ha,"parsePnpmLine");class Wa{static{l(this,"PnpmInstaller")}async install(e,r,s){const n=Oe("pnpm install --reporter ndjson",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let o="";n.stdout.on("data",i=>{const p=i.toString().split(`
129
- `).filter(Boolean);for(const d of p)try{const m=JSON.parse(d),g=Ha(m);g&&r&&r(g)}catch{}}),n.stderr.on("data",i=>{o+=i.toString()});const[a]=await Promise.race([re(n,"close"),re(n,"error").then(([i])=>{const p=i;throw p.code==="ENOENT"||p.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(`
130
- `)):new Error(p.message)})]);if(a===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(o.trim()||`pnpm install exited with code ${a}`)}}function Va(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}}l(Va,"parseYarnLine");class Qa{static{l(this,"YarnInstaller")}async install(e,r,s){const n=Oe("yarn install --json",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let o="";n.stdout.on("data",i=>{const p=i.toString().split(`
131
- `).filter(Boolean);for(const d of p)try{const m=JSON.parse(d),g=Va(m);g&&r&&r(g)}catch{}}),n.stderr.on("data",i=>{o+=i.toString()});const[a]=await Promise.race([re(n,"close"),re(n,"error").then(([i])=>{const p=i;throw p.code==="ENOENT"||p.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(`
132
- `)):new Error(p.message)})]);if(a===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(o.trim()||`yarn install exited with code ${a}`)}}function Ya(t){switch(t){case"pnpm":return new Wa;case"npm":return new $a;case"yarn":return new Qa;case"bun":return new Ma;default:throw new Error(`Unhandled package manager: ${t}`)}}l(Ya,"createPackageInstaller");class Xa{static{l(this,"ProjectPipeline")}outputDir;generatorOptions;state;context;events;constructor(e,r){this.outputDir=e,this.generatorOptions=r}emit(e){this.events?.onStageChange?.(e)}addPhase(e){this.state.phases.push(e)}async execute(e,r){this.context=e,this.events=r,this.state={generatedFiles:[],installSucceeded:!1,phases:[]};const s=[this.phaseGenerateFiles,this.phaseInstallAgentSkills,this.phaseSetupLinter,this.phaseGitInit,this.phaseInstallDependencies,this.phaseRunFormatter,this.phaseFormatterCommit];for(const o of s)if(!await o.call(this))break;this.emit("complete");const n=this.state.phases.every(o=>o.success||o.skipped);return this.buildResult(n)}async phaseGenerateFiles(){this.emit("generate-files");const e=new xa(this.outputDir,this.generatorOptions);try{const r=await e.generate(this.context);return this.state.generatedFiles.push(...r.generatedFiles),r.success?(this.addPhase({phase:"generate-files",success:!0}),!0):(this.addPhase({error:r.error,phase:"generate-files",success:!1}),!1)}catch(r){return this.addPhase({error:r instanceof Error?r.message:String(r),phase:"generate-files",success:!1}),!1}}async phaseInstallAgentSkills(){if(!this.context.addons.includes("agent-skills"))return this.addPhase({phase:"install-agent-skills",skipped:!0,success:!0}),!0;this.emit("install-agent-skills");try{const e=await ss(this.outputDir,this.context),r=e.failed.length>0?e.failed.map(s=>`${s.name}: ${s.error}`).join(", "):void 0;this.addPhase({phase:"install-agent-skills",success:!0,...r?{error:r}:{}})}catch(e){this.addPhase({error:e instanceof Error?e.message:String(e),phase:"install-agent-skills",success:!0})}return!0}async phaseSetupLinter(){if(this.context.formatter==="none")return this.addPhase({phase:"setup-linter",skipped:!0,success:!0}),!0;this.emit("setup-linter");try{const e=await fs(this.outputDir,this.context);if(!e.success)return this.addPhase({error:e.message,phase:"setup-linter",success:!1}),!1;const r=await vs(this.outputDir,this.context.formatter);return r.success?(this.addPhase({phase:"setup-linter",success:!0}),!0):(this.addPhase({error:r.message??"Rule injection failed",phase:"setup-linter",success:!1}),!1)}catch(e){return this.addPhase({error:e instanceof Error?e.message:String(e),phase:"setup-linter",success:!1}),!1}}async phaseGitInit(){if(!this.context.initGit)return this.addPhase({phase:"initialize-git",skipped:!0,success:!0}),this.addPhase({phase:"initial-commit",skipped:!0,success:!0}),!0;this.emit("initialize-git");try{await is(this.outputDir)||await os(this.outputDir),this.addPhase({phase:"initialize-git",success:!0})}catch(s){this.addPhase({error:s instanceof Error?s.message:String(s),phase:"initialize-git",success:!1})}const{3:e}=this.state.phases;if(e?.success??!1){this.emit("initial-commit");try{await Dt(this.outputDir),await zt(this.outputDir,"Initial project scaffold"),this.addPhase({phase:"initial-commit",success:!0})}catch(s){this.addPhase({error:s instanceof Error?s.message:String(s),phase:"initial-commit",success:!1})}}else this.addPhase({phase:"initial-commit",skipped:!0,success:!0});return!0}async phaseInstallDependencies(){if(!this.context.installDependencies)return this.addPhase({phase:"install-dependencies",skipped:!0,success:!0}),!0;this.emit("install-dependencies");try{await Ya(this.context.packageManager).install(this.outputDir,r=>{this.events?.onInstallProgress?.(r)}),this.state.installSucceeded=!0,this.addPhase({phase:"install-dependencies",success:!0})}catch(e){this.addPhase({error:e instanceof Error?e.message:String(e),phase:"install-dependencies",success:!1})}return!0}async phaseRunFormatter(){if(!(this.state.installSucceeded&&this.context.formatter!=="none"))return this.addPhase({phase:"run-formatter",skipped:!0,success:!0}),!0;this.emit("run-formatter");try{const r=await ds(this.context.packageManager,this.outputDir);this.addPhase({phase:"run-formatter",success:r.success,...r.success?{}:{error:r.error}})}catch(r){this.addPhase({error:r instanceof Error?r.message:String(r),phase:"run-formatter",success:!1})}return!0}async phaseFormatterCommit(){const{5:e}=this.state.phases;if(!(this.context.initGit&&e?.success&&!e.skipped))return this.addPhase({phase:"formatter-commit",skipped:!0,success:!0}),!0;this.emit("formatter-commit");try{await Dt(this.outputDir),await ns(this.outputDir)&&await zt(this.outputDir,"Apply formatter"),this.addPhase({phase:"formatter-commit",success:!0})}catch(s){this.addPhase({error:s instanceof Error?s.message:String(s),phase:"formatter-commit",success:!1})}return!0}buildResult(e){return{generatedFiles:this.state.generatedFiles,outputDir:this.outputDir,phases:this.state.phases,success:e}}}function Ka(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}}l(Ka,"buildGeneratorContext");function $e(t){return me.NEST_ARCH_BETA_MODE?Y(gt(),"test-projects",t):Y(process.cwd(),t)}l($e,"getOutputDir");function Za(){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")}l(Za,"getTemplatesDir");async function Kt(t,e){const r=$e(t.projectName),s=Ka(t),n=Za(),o=new Xa(r,{cacheTemplates:!0,templatesDir:n});try{const a=await o.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"},p=a.phases.filter(d=>!d.success&&!d.skipped&&d.error).map(d=>`${i[d.phase]||d.phase} failed:
121
+ `}l(Ks,"serializeMetadata");function Zs(){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","todo-example"]},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)}
122
+ `}l(Zs,"buildSchemaContent");async function ea(t,e,r,s,n){try{const o=Xs(e),a=Ks(o),i=await t.writeFile({content:a,filePath:"nest-arch.jsonc",isBinary:!1},r);i.written&&s.push(i.filePath);const p=Zs(),d=await t.writeFile({content:p,filePath:"schema.json",isBinary:!1},r);d.written&&s.push(d.filePath)}catch(o){const a=o instanceof Error?o.message:String(o);n.push(`Failed to generate nest-arch.jsonc/schema.json: ${a}`)}}l(ea,"generateMetadata");const ta={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":"^24.0.0",dotenv:"^17.2.2",typescript:"^6.0.2","typescript-7":"^7.0.0",zod:"^4.4.3"},dependencies:{"@apollo/server":"^5.5.1","@as-integrations/fastify":"^3.1.0","@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":"^12.0.1","@nestjs/core":"^12.0.1","@nestjs/graphql":"^14.0.0-next.0","@nestjs/jwt":"^11.0.0","@nestjs/microservices":"^12.0.1","@nestjs/passport":"^11.0.0","@nestjs/platform-express":"^12.0.1","@nestjs/platform-fastify":"^12.0.1","@nestjs/swagger":"^12.0.1","@nestjs/terminus":"^12.0.0","@nestjs/throttler":"6.5.0","@nestjs/typeorm":"12.0.1","@prisma/adapter-better-sqlite3":"^7.10.0","@prisma/adapter-mariadb":"^7.10.0","@prisma/adapter-pg":"^7.10.0","@prisma/adapter-ppg":"^7.10.0","@prisma/client":"^7.10.0","@scalar/nestjs-api-reference":"^1.2.17","@t3-oss/env-core":"^0.13.11","@thallesp/nestjs-better-auth":"^2.7.0","@trpc/client":"^11.18.0","@trpc/openapi":"^11.18.0-alpha","@trpc/server":"^11.18.0",amqplib:"^0.10.5",bcrypt:"^6.0.0","better-auth":"^1.7.2","better-sqlite3":"^12.11.1",dotenv:"^17.2.2","drizzle-graphql":"^0.8.5","drizzle-orm":"^0.45.2",graphql:"^17.0.2","graphql-scalars":"^2.0.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.13.0","nestjs-zod":"^5.5.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.1.1","typeorm-relations-graphql":"^3.0.0",zod:"^4.5.4"},devDependencies:{"@nestjs/cli":"^12.0.0","@nestjs/mau":"^0.2.6","@nestjs/schematics":"^12.0.0","@nestjs/testing":"^12.0.1","@types/amqplib":"^0.10.6","@types/bcrypt":"^5.0.2","@types/better-sqlite3":"^7.6.13","@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.2","drizzle-kit":"^0.31.10",husky:"^9.1.7",oxfmt:"^0.66.0",oxlint:"^1.81.0",prettier:"^3.4.2",prisma:"^7.10.0","source-map-support":"^0.5.21",supertest:"^7.0.0",turbo:"^2.8.12",typescript:"^6.0.2","typescript-7":"^7.0.0",ultracite:"7.9.4","vite-tsconfig-paths":"^5.1.4",vitest:"^4.1.10"}};function Lt(){return ta}l(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}l(h,"getDependencyVersion");function $t(){return{...Lt().catalog}}l($t,"getCatalogDependencies");const ra=[{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:".env.example",src:"base/.env.example.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"}],sa={dest:"pnpm-workspace.yaml",src:"base/pnpm-workspace.yaml.hbs"},aa={dest:".yarnrc.yml",src:"base/.yarnrc.yml.hbs"},oa={dest:"bunfig.toml",src:"base/bunfig.toml.hbs"},na=[{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"}],ia=[{dest:"src/api/todo/todo.controller.ts",src:"feature/rest/todo-example/src/api/todo/todo.controller.ts.hbs"},{dest:"src/api/todo/todo.service.ts",src:"feature/rest/todo-example/src/api/todo/todo.service.ts.hbs"},{dest:"src/api/todo/todo.module.ts",src:"feature/rest/todo-example/src/api/todo/todo.module.ts.hbs"},{dest:"src/api/todo/todo.router.ts",src:"feature/rest/todo-example/src/api/todo/todo.router.ts.hbs"},{dest:"src/api/todo/dto/create-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/create-todo.dto.ts.hbs"},{dest:"src/api/todo/dto/update-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/update-todo.dto.ts.hbs"}],ca=[{dest:"apps/api-gateway/src/api/todo/todo.controller.ts",src:"feature/rest/todo-example/src/api/todo/todo.controller.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/todo.service.ts",src:"feature/rest/todo-example/src/api/todo/todo.service.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/todo.module.ts",src:"feature/rest/todo-example/src/api/todo/todo.module.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/todo.router.ts",src:"feature/rest/todo-example/src/api/todo/todo.router.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/dto/create-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/create-todo.dto.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/dto/update-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/update-todo.dto.ts.hbs"}],la=[{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"}],pa=[{dest:".husky/pre-commit",src:"addons/husky/pre-commit.hbs"}],da=[{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"}],ua=[{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"}],ma=[{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"}],Ut={"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"}],ha="package.json",ga=[{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"}],fa=[{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"}],ya=[{dest:"src/graphql/graphql.module.ts",src:"feature/graphql/src/graphql/graphql.module.ts.hbs"},{dest:"src/graphql/models/base.model.ts",src:"feature/graphql/src/graphql/models/base.model.ts.hbs"},{dest:"src/graphql/models/user.model.ts",src:"feature/graphql/src/graphql/models/user.model.ts.hbs"},{dest:"src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts",src:"feature/graphql/src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts.hbs"},{dest:"src/graphql/orm/drizzle/drizzle-graphql.module.ts",src:"feature/graphql/src/graphql/orm/drizzle/drizzle-graphql.module.ts.hbs"}],ba=[{dest:"src/graphql/dto/create-todo.input.ts",src:"feature/graphql/src/graphql/dto/create-todo.input.ts.hbs"},{dest:"src/graphql/dto/update-todo.input.ts",src:"feature/graphql/src/graphql/dto/update-todo.input.ts.hbs"},{dest:"src/graphql/models/todo.model.ts",src:"feature/graphql/src/graphql/models/todo.model.ts.hbs"},{dest:"src/graphql/resolvers/todo.resolver.ts",src:"feature/graphql/src/graphql/resolvers/todo.resolver.ts.hbs"}],wa=[{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"}],ja=[{dest:"apps/api-gateway/src/graphql/graphql.module.ts",src:"monorepo/feature/graphql/src/graphql/graphql.module.ts.hbs"},{dest:"apps/api-gateway/src/graphql/models/base.model.ts",src:"monorepo/feature/graphql/src/graphql/models/base.model.ts.hbs"},{dest:"apps/api-gateway/src/graphql/models/user.model.ts",src:"monorepo/feature/graphql/src/graphql/models/user.model.ts.hbs"},{dest:"apps/api-gateway/src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts",src:"monorepo/feature/graphql/src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts.hbs"},{dest:"apps/api-gateway/src/graphql/orm/drizzle/drizzle-graphql.module.ts",src:"monorepo/feature/graphql/src/graphql/orm/drizzle/drizzle-graphql.module.ts.hbs"}],va=[{dest:"apps/api-gateway/src/graphql/dto/create-todo.input.ts",src:"monorepo/feature/graphql/src/graphql/dto/create-todo.input.ts.hbs"},{dest:"apps/api-gateway/src/graphql/dto/update-todo.input.ts",src:"monorepo/feature/graphql/src/graphql/dto/update-todo.input.ts.hbs"},{dest:"apps/api-gateway/src/graphql/models/todo.model.ts",src:"monorepo/feature/graphql/src/graphql/models/todo.model.ts.hbs"},{dest:"apps/api-gateway/src/graphql/resolvers/todo.resolver.ts",src:"monorepo/feature/graphql/src/graphql/resolvers/todo.resolver.ts.hbs"}],Sa=[{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"}],ka={"addons/husky":pa,"extras/database":ua,"extras/docker":da,"extras/swagger":[],"feature/graphql":ya,"feature/graphql/todo-example":ba,"feature/rest":na,"feature/rest/todo-example":ia,"feature/trpc":la,"monorepo/apps/api-gateway":ga,"monorepo/feature/graphql":ja,"monorepo/feature/graphql/todo-example":va,"monorepo/feature/rest":fa,"monorepo/feature/rest/todo-example":ca,"monorepo/feature/trpc":wa,"monorepo/packages":Sa,"monorepo/packages/db":ma,"monorepo/root":Bt};function Jt(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&&(e.bcrypt=h("bcrypt"),r["@types/bcrypt"]=h("@types/bcrypt"),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)s==="graphql"?(e["@nestjs/graphql"]=h("@nestjs/graphql"),e["@nestjs/apollo"]=h("@nestjs/apollo"),e.graphql=h("graphql"),e["@apollo/server"]=h("@apollo/server"),t.httpProvider==="fastify"?e["@as-integrations/fastify"]=h("@as-integrations/fastify"):e["@as-integrations/express5"]=h("@as-integrations/express5"),t.auth==="passport"&&(e["graphql-scalars"]=h("graphql-scalars")),t.orm.includes("typeorm")&&(e["typeorm-relations-graphql"]=h("typeorm-relations-graphql")),t.orm.includes("drizzle")&&(e["drizzle-graphql"]=h("drizzle-graphql"))):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"))}l(Jt,"addConditionalDependencies");function Ht(t,e,r){const s=t.orm.includes("prisma"),n=t.orm.includes("drizzle"),o=t.orm.includes("typeorm"),a=t.database.length>0&&!s&&!n&&!o;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-mariadb"]=h("@prisma/adapter-mariadb")),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")&&n&&(e.pg=h("pg"),r["@types/pg"]=h("@types/pg")),t.database.includes("mysql")&&n&&(e.mysql2=h("mysql2")),t.database.includes("sqlite")&&n&&(e["better-sqlite3"]=h("better-sqlite3"),r["@types/better-sqlite3"]=h("@types/better-sqlite3")),t.database.includes("mongodb")&&a&&(e.mongodb=h("mongodb"))}l(Ht,"addDatabaseDependencies");async function Aa(t,e,r,s,n,o){try{const a=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",i={"@nestjs/common":h("@nestjs/common"),"@nestjs/core":h("@nestjs/core"),[a]:h(a),"@t3-oss/env-core":h("@t3-oss/env-core"),dotenv:h("dotenv"),"reflect-metadata":h("reflect-metadata"),rxjs:h("rxjs"),zod:h("zod")},p=t.extras.includes("typescript-7")?h("typescript-7"):h("typescript"),d={"@nestjs/cli":h("@nestjs/cli"),"@nestjs/mau":h("@nestjs/mau"),"@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:p,"vite-tsconfig-paths":h("vite-tsconfig-paths"),vitest:h("vitest")};t.httpProvider==="express"&&(d["@types/express"]=h("@types/express"));const m={build:"nest build",deploy:"nest deploy",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"};Jt(t,i,d),Ht(t,i,d),t.addons.includes("ultracite")&&(d.ultracite=h("ultracite"),m.check="ultracite check",m.fix="ultracite fix"),t.addons.includes("husky")&&(d.husky=h("husky"),m.prepare="husky"),t.orm.includes("prisma")&&(m["prisma:generate"]="prisma generate",m["prisma:format"]="prisma format",m["prisma:push"]="prisma db push",m["prisma:studio"]="prisma studio",m["prisma:migrate"]="prisma migrate dev",m["prisma:migrate:deploy"]="prisma migrate deploy",m.postinstall="prisma generate"),t.orm.includes("drizzle")&&(m["db:generate"]="drizzle-kit generate",m["db:migrate"]="drizzle-kit migrate",m["db:studio"]="drizzle-kit studio",m["db:push"]="drizzle-kit push"),t.api.includes("trpc")&&(m["trpc:generate"]="nestjs-trpc generate -e src/app.module.ts -o src/libs/trpc/@generated",m["trpc:watch"]="nestjs-trpc watch -e src/app.module.ts -o src/libs/trpc/@generated"),t.orm.includes("typeorm")&&(m["typeorm:run"]="typeorm migration:run -d src/database/orm/typeorm/data-source.ts",m["typeorm:revert"]="typeorm migration:revert -d src/database/orm/typeorm/data-source.ts",m["typeorm:generate"]="typeorm migration:generate -d src/database/orm/typeorm/data-source.ts",m["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:m,dependencies:i,devDependencies:d},b=JSON.stringify(g,null,2),q=await r.writeFile({content:b,filePath:"package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});q.written&&n.push(q.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate package.json: ${i}`),console.error("Failed to generate package.json:",a)}}l(Aa,"generateSingleProjectPackageJson");async function Ta(t,e,r,s,n,o){try{const a={build:"turbo build","check-types":"turbo check-types",dev:"turbo dev"},i={"@repo/env":"workspace:*",dotenv:"catalog:",zod:"catalog:"},p=t.extras.includes("typescript-7"),d=p?h("typescript-7"):"catalog:",m={"@repo/config":"workspace:*","@types/node":"catalog:",turbo:h("turbo"),typescript:d};t.addons.includes("ultracite")&&(a.check="ultracite check"),t.addons.includes("husky")&&(m.husky=h("husky"),a.prepare="husky");const b={bun:"bun@1.3.14",npm:void 0,pnpm:"pnpm@11.6.0",yarn:"yarn@4.6.0"}[t.packageManager],q=p?{...$t(),typescript:h("typescript-7")}:$t(),M={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,workspaces:["apps/*","packages/*"],type:"module",...b?{packageManager:b}:{},...t.packageManager==="bun"?{catalog:q}:{},scripts:a,dependencies:i,devDependencies:m},U=JSON.stringify(M,null,2),F=await r.writeFile({content:U,filePath:ha,isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});F.written&&n.push(F.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate monorepo root package.json: ${i}`),console.error("Failed to generate monorepo root package.json:",a)}}l(Ta,"generateMonorepoRootPackageJson");async function Pa(t,e,r,s,n,o){try{const a=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",i={"@nestjs/common":h("@nestjs/common"),"@nestjs/core":h("@nestjs/core"),[a]:h(a),"@repo/env":"workspace:*","reflect-metadata":h("reflect-metadata"),rxjs:h("rxjs"),zod:"catalog:"};t.database.length>0&&(i["@repo/db"]="workspace:*");const p=t.extras.includes("typescript-7")?h("typescript-7"):"catalog:",d={"@nestjs/cli":h("@nestjs/cli"),"@nestjs/mau":h("@nestjs/mau"),"@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:p,"vite-tsconfig-paths":h("vite-tsconfig-paths"),vitest:h("vitest")};t.httpProvider==="express"&&(d["@types/express"]=h("@types/express"));const m={build:"nest build",deploy:"nest deploy",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"};Jt(t,i,d),t.addons.includes("ultracite")&&(d.ultracite=h("ultracite"),m.check="ultracite check",m.fix="ultracite fix"),t.addons.includes("husky")&&(d.husky=h("husky"),m.prepare="husky"),t.api.includes("trpc")&&(m["trpc:generate"]="nestjs-trpc generate -e src/app.module.ts -o ../../packages/shared/src/trpc/@generated",m["trpc:watch"]="nestjs-trpc watch -e src/app.module.ts -o ../../packages/shared/src/trpc/@generated");const g={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:m,dependencies:i,devDependencies:d},b=JSON.stringify(g,null,2),q=await r.writeFile({content:b,filePath:"apps/api-gateway/package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});q.written&&n.push(q.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate monorepo app package.json: ${i}`),console.error("Failed to generate monorepo app package.json:",a)}}l(Pa,"generateMonorepoAppPackageJson");async function Ea(t,e,r,s,n,o){try{const a={"@nestjs/common":"catalog:","@nestjs/core":"catalog:","reflect-metadata":"catalog:",rxjs:"catalog:"},p={"@repo/config":"workspace:*","@types/node":"catalog:",typescript:t.extras.includes("typescript-7")?h("typescript-7"):"catalog:"};Ht(t,a,p);const d={};t.orm.includes("prisma")&&(d["prisma:generate"]="prisma generate",d["prisma:format"]="prisma format",d["prisma:push"]="prisma db push",d["prisma:studio"]="prisma studio",d["prisma:migrate"]="prisma migrate dev",d["prisma:migrate:deploy"]="prisma migrate deploy",d.postinstall="prisma generate"),t.orm.includes("drizzle")&&(d["db:generate"]="drizzle-kit generate",d["db:migrate"]="drizzle-kit migrate",d["db:studio"]="drizzle-kit studio",d["db:push"]="drizzle-kit push"),t.orm.includes("typeorm")&&(d["typeorm:run"]="typeorm-ts esm migration:run -d src/database/orm/typeorm/data-source.ts",d["typeorm:revert"]="typeorm-ts esm migration:revert -d src/database/orm/typeorm/data-source.ts",d["typeorm:generate"]="typeorm-ts esm migration:generate -d src/database/orm/typeorm/data-source.ts",d["typeorm:create"]="typeorm migration:create");const m={name:"@repo/db",version:"0.0.1",private:!0,type:"module",main:"./src/index.ts",exports:{".":"./src/index.ts"},...Object.keys(d).length>0?{scripts:d}:{},dependencies:a,devDependencies:p},g=JSON.stringify(m,null,2),b=await r.writeFile({content:g,filePath:"packages/db/package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});b.written&&n.push(b.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate monorepo db package.json: ${i}`),console.error("Failed to generate monorepo db package.json:",a)}}l(Ea,"generateMonorepoDbPackageJson");async function Ra(t,e,r,s,n){let o="postgresql";e.database.includes("mysql")?o="mysql":e.database.includes("sqlite")?o="sqlite":e.database.includes("mongodb")&&(o="mongodb");const a=o==="mongodb",i=["generator client {",' provider = "prisma-client"',' output = "./generated"',"}","","datasource db {",` provider = "${o}"`,"}",""],p=e.extras.includes("todo-example");e.auth==="passport"&&e.database.length>0&&i.push("enum Role {"," ADMIN"," USER","}","","model User {",` id String ${a?'@id @default(auto()) @map("_id") @db.ObjectId':"@id @default(cuid())"}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," email String @unique"," password String"," firstname String?"," lastname String?"," role Role @default(USER)",...p?[" todos Todo[]",""]:[""],' @@map("user")',"}",""),p&&e.database.length>0&&(e.auth==="none"?i.push("model Todo {",` id String ${a?'@id @default(auto()) @map("_id") @db.ObjectId':"@id @default(cuid())"}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," title String"," description String?"," completed Boolean @default(false)","",' @@map("todo")',"}",""):i.push("model Todo {",` id String ${a?'@id @default(auto()) @map("_id") @db.ObjectId':"@id @default(cuid())"}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," title String"," description String?"," completed Boolean @default(false)",` authorId ${a?"String? @db.ObjectId":"String?"}`," author User? @relation(fields: [authorId], references: [id])","",' @@map("todo")',"}",""));const d=i.join(`
123
+ `);try{const m=await t.writeFile({content:d,filePath:"src/database/orm/prisma/schema.prisma",isBinary:!1},r);m.written&&s.push(m.filePath)}catch(m){const g=m instanceof Error?m.message:String(m);n.push(`Failed to generate src/database/orm/prisma/schema.prisma: ${g}`)}}l(Ra,"generatePrismaSchema");function Wt(t,e){const r=!!e.usePrisma,s=!!e.useTypeorm,n=!!e.useDrizzle,o=!!e.useRawSql,a=!!e.hasPostgres,i=!!e.hasMysql,p=!!e.hasSqlite,d=!!e.hasMongodb;return t.filter(m=>{const{dest:g}=m;return g.includes("prisma-sql.adapter")?r&&(a||i||p):g.includes("prisma-mongo.adapter")?r&&d:g.includes("typeorm-sql.adapter")?s&&(a||i||p):g.includes("orm/typeorm/data-source")||g.includes("entities/")?s:g.includes("drizzle-sql.adapter")?n:g.includes("raw-sql.adapter")?o&&(a||i||p):g.includes("raw-mongo.adapter")?o&&d:g.includes("orm/drizzle/schema")?n:!0})}l(Wt,"filterDatabaseTemplates");function Vt(t,e){const r=!!e.hasTrpcAndAuth;return t.filter(s=>s.dest.includes("libs/trpc/protected.ts")||s.dest.includes("libs/trpc/inner.context.ts")||s.dest.includes("libs/middlewares/auth.trpc.middleware.ts")?r:!0)}l(Vt,"filterTrpcTemplates");function Qt(t,e){const r=!!e.useTypeorm,s=!!e.usePrisma,n=!!e.useDrizzle;return t.filter(o=>{const{dest:a}=o;return a.includes("orm/typeorm")?r:a.includes("orm/prisma")?s:a.includes("orm/drizzle")?n:!0})}l(Qt,"filterGraphqlTemplates");function Yt(t,e){const r=!!e.hasTrpc,s=!!e.hasRest;return t.filter(n=>n.dest.includes("todo.router.ts")?r:n.dest.includes("todo.controller.ts")?s:!0)}l(Yt,"filterTodoTemplates");class qa{static{l(this,"ProjectGenerator")}templateEngine;fileWriter;registry;options;mapper;constructor(e,r){this.options=r,this.fileWriter=new ss(e),this.templateEngine=new pt(r.templatesDir,{cache:r.cacheTemplates??!0}),this.registry=new fs,this.mapper=new Ue,Ds(this.mapper)}getMapper(){return this.mapper}async generate(e){const r=Date.now(),s=[],n=[];try{const o=this.mapper.resolve(e);let a=Ls(e);a=$s(a,o.extraVariables),a.hasUltracite=e.addons.includes("ultracite"),a.hasHusky=e.addons.includes("husky"),a.hasAgentSkills=e.addons.includes("agent-skills"),await(e.projectType==="monorepo"?this.generateMonorepo.bind(this):this.generateSingleProject.bind(this))(e,a,o.templateGroups,s,n);const p=Date.now()-r,d=n.length===0;if(d){const m={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await ea(this.fileWriter,e,m,s,n)}return console.log(`\u2705 Project generated in ${p}ms`),{error:d&&n.length===0?void 0:n.join(`
124
+ `),filesCount:s.length,generatedFiles:s,success:d&&n.length===0}}catch(o){return{error:o instanceof Error?o.message:"Unknown error",filesCount:0,generatedFiles:s,success:!1}}}async generateSingleProject(e,r,s,n,o){const a={dryRun:this.options.dryRun,overwrite:this.options.overwrite},i=[...ra];r.packageManager==="pnpm"?i.push(sa):r.packageManager==="yarn"?i.push(aa):r.packageManager==="bun"&&i.push(oa),await Aa(e,r,this.fileWriter,a,n,o);for(const p of i)await this.renderAndWrite(p.src,p.dest,r,n,o);await this.processTemplateGroups(e,r,s,n,o),await this.processPostTemplateSteps(e,r,n,o)}async generateMonorepo(e,r,s,n,o){const a={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await Ta(e,r,this.fileWriter,a,n,o),await Pa(e,r,this.fileWriter,a,n,o),e.database.length>0&&await Ea(e,r,this.fileWriter,a,n,o),await this.processTemplateGroups(e,r,s,n,o),await this.processPostTemplateSteps(e,r,n,o)}TEMPLATE_FILTERS={"extras/database":Wt,"feature/graphql":Qt,"feature/rest/todo-example":Yt,"feature/trpc":Vt,"monorepo/feature/graphql":Qt,"monorepo/feature/rest/todo-example":Yt,"monorepo/feature/trpc":Vt,"monorepo/packages/db":Wt};async processSingleArchTemplates(e,r,s,n){const o=Ut[e];if(!o)return;const a=new Set(["package.json","pnpm-workspace.yaml",".yarnrc.yml","bunfig.toml"]);for(const i of o)a.has(i.dest)||await this.renderAndWrite(i.src,i.dest,r,s,n)}async processMonorepoRoot(e,r,s){for(const i of Bt)await this.renderAndWrite(i.src,i.dest,e,r,s);const n={bun:{dest:"bunfig.toml",src:"monorepo/root/bunfig.toml.hbs"},pnpm:{dest:"pnpm-workspace.yaml",src:"monorepo/root/pnpm-workspace.yaml.hbs"},yarn:{dest:".yarnrc.yml",src:"monorepo/root/.yarnrc.yml.hbs"}},o=e.packageManager,a=n[o];a&&await this.renderAndWrite(a.src,a.dest,e,r,s)}shouldSkipTemplate(e,r,s){return!!(s&&e.dest==="packages/db/package.json"||e.dest==="docker-compose.yml"&&r.database.length>0)}async processTemplateGroups(e,r,s,n,o){const a=e.projectType==="monorepo";for(const i of s){if(!a&&Ut[i]){await this.processSingleArchTemplates(i,r,n,o);continue}if(a&&i==="monorepo/root"){await this.processMonorepoRoot(r,n,o);continue}if(!a&&i==="monorepo/packages/db")continue;const p=ka[i];if(!p)continue;const d=this.TEMPLATE_FILTERS[i],m=d?d(p,r):p;for(const g of m)this.shouldSkipTemplate(g,e,a)||await this.renderAndWrite(g.src,g.dest,r,n,o)}}async processPostTemplateSteps(e,r,s,n){const o={dryRun:this.options.dryRun,overwrite:this.options.overwrite},a=e.projectType==="monorepo"?"apps/api-gateway/src/docs/create-docs.ts":"src/docs/create-docs.ts";if(e.extras.includes("swagger")&&await this.renderAndWrite("extras/swagger/create-docs.ts.hbs",a,r,s,n),e.extras.includes("docker")&&e.database.length>0){const i=Vs(e),p=await this.fileWriter.writeFile({content:i,filePath:"docker-compose.yml",isBinary:!1},o);p.written&&s.push(p.filePath)}if(e.orm.includes("prisma")&&(await Ra(this.fileWriter,e,o,s,n),await this.renderAndWrite("base/prisma.config.ts.hbs","prisma.config.ts",r,s,n)),e.orm.includes("drizzle")&&await Qs(this.fileWriter,e,o,s,n),e.auth!=="none"){const i=Hs.composeGenerators(e),p=await Ws(e,this.fileWriter.getBaseDir(),i);for(const d of p)!d.success&&d.error&&n.push(d.error)}}async renderAndWrite(e,r,s,n,o){try{const a=await this.templateEngine.renderToFile(e,r,{context:s}),i=await this.fileWriter.writeFile(a,{dryRun:this.options.dryRun,overwrite:this.options.overwrite});i.written&&n.push(i.filePath)}catch(a){const i=a instanceof Error?a.message:String(a);o.push(`Failed to generate ${r}: ${i}`),console.error(`Failed to generate ${r}:`,a)}}getBaseDir(){return this.fileWriter.getBaseDir()}clearCaches(){this.templateEngine.clearCache(),this.registry.clear()}}const xa=/Resolved|Resolving/iu,Ia=/Downloaded?|downloaded/iu,_a=/Link(ed|ing)/iu,Oa=/saved (to )?(lockfile|bun)/iu;function Ca(t){const e=[],r=t.split(`
125
+ `);for(const s of r){const n=s.trim();if(n){if(xa.test(n)){e.push({message:"Resolving packages...",phase:"resolve"});continue}if(Ia.test(n)){e.push({message:"Downloading...",phase:"download"});continue}if(_a.test(n)){e.push({message:"Linking packages...",phase:"link"});continue}if(n.includes("packages installed")){e.push({message:n,percentage:100,phase:"link"});continue}if(Oa.test(n)){e.push({message:"Saving lockfile...",phase:"postinstall"});continue}(n.includes("[script]")||n.includes("postinstall"))&&e.push({message:"Running postinstall scripts...",phase:"postinstall"})}}return e}l(Ca,"parseBunText");class Ga{static{l(this,"BunInstaller")}async install(e,r,s){const n=Ie("bun install",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let o="";const a=l(p=>{const d=p.toString();o+=d;const m=Ca(d);for(const g of m)r?.(g)},"handleData");n.stderr.on("data",a),n.stdout.on("data",a);const[i]=await Promise.race([se(n,"close"),se(n,"error").then(([p])=>{const d=p;throw d.code==="ENOENT"||d.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(`
126
+ `)):new Error(d.message)})]);if(i===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(o.trim()||`bun install exited with code ${i}`)}}const Ma=/^(\d+)\/(\d+)\s+resolving/iu,Da=/^(\d+)\/(\d+)\s+extract:/iu,za=/^(\d+)\/(\d+)\s+(\S+)/iu,Na=/^(\d+)ms\s+(.*)/iu;function Fa(t){const e=[],r=t.split(`
127
+ `);for(const s of r){const n=s.trim();if(n.includes("resolving")){const o=Ma.exec(n);o?e.push({completed:Number(o[1]),message:"Resolving packages...",percentage:Math.round(Number(o[1])/Number(o[2])*100),phase:"resolve",total:Number(o[2])}):e.push({message:"Resolving packages...",phase:"resolve"});continue}if(n.includes("extract:")||n.includes("http fetch")){const o=Da.exec(n)||za.exec(n);o?e.push({completed:Number(o[1]),message:"Downloading...",percentage:Math.round(Number(o[1])/Number(o[2])*100),phase:"download",total:Number(o[2])}):e.push({message:"Downloading...",phase:"download"});continue}if(n.includes("timing")){const o=Na.exec(n);if(o){const a=o[2]??"";a.includes("build")?e.push({message:"Building dependencies...",phase:"build"}):a.includes("link")&&e.push({message:"Linking packages...",phase:"link"})}continue}n.includes("postinstall")&&!n.includes("timing")&&e.push({message:"Running postinstall scripts...",phase:"postinstall"})}return e}l(Fa,"parseNpmText");class La{static{l(this,"NpmInstaller")}async install(e,r,s){const n=Ie("npm install --loglevel silly",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let o="";const a=l(p=>{const d=p.toString();o+=d;const m=Fa(d);for(const g of m)r?.(g)},"handleData");n.stderr.on("data",a),n.stdout.on("data",()=>{});const[i]=await Promise.race([se(n,"close"),se(n,"error").then(([p])=>{const d=p;throw d.code==="ENOENT"||d.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(`
128
+ `)):new Error(d.message)})]);if(i===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(o.trim()||`npm install exited with code ${i}`)}}function $a(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"}}}l($a,"mapPnpmStage");function Ua(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}l(Ua,"mapPnpmStat");function Ba(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"}}l(Ba,"mapPnpmFetching");function Ja(t){if(!t.type)return null;switch(t.type){case"stage":{const e=t.data?.stage;return e?$a(e,t.data):null}case"stat":return Ua(t.data);case"fetching":return Ba(t);case"warning":case"error":return{message:t.message??t.type,phase:"download"};default:return null}}l(Ja,"parsePnpmLine");class Ha{static{l(this,"PnpmInstaller")}async install(e,r,s){const n=Ie("pnpm install --reporter ndjson",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let o="";n.stdout.on("data",i=>{const p=i.toString().split(`
129
+ `).filter(Boolean);for(const d of p)try{const m=JSON.parse(d),g=Ja(m);g&&r&&r(g)}catch{}}),n.stderr.on("data",i=>{o+=i.toString()});const[a]=await Promise.race([se(n,"close"),se(n,"error").then(([i])=>{const p=i;throw p.code==="ENOENT"||p.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(`
130
+ `)):new Error(p.message)})]);if(a===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(o.trim()||`pnpm install exited with code ${a}`)}}function Wa(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}}l(Wa,"parseYarnLine");class Va{static{l(this,"YarnInstaller")}async install(e,r,s){const n=Ie("yarn install --json",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let o="";n.stdout.on("data",i=>{const p=i.toString().split(`
131
+ `).filter(Boolean);for(const d of p)try{const m=JSON.parse(d),g=Wa(m);g&&r&&r(g)}catch{}}),n.stderr.on("data",i=>{o+=i.toString()});const[a]=await Promise.race([se(n,"close"),se(n,"error").then(([i])=>{const p=i;throw p.code==="ENOENT"||p.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(`
132
+ `)):new Error(p.message)})]);if(a===0){r?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(o.trim()||`yarn install exited with code ${a}`)}}function Qa(t){switch(t){case"pnpm":return new Ha;case"npm":return new La;case"yarn":return new Va;case"bun":return new Ga;default:throw new Error(`Unhandled package manager: ${t}`)}}l(Qa,"createPackageInstaller");class Ya{static{l(this,"ProjectPipeline")}outputDir;generatorOptions;state;context;events;constructor(e,r){this.outputDir=e,this.generatorOptions=r}emit(e){this.events?.onStageChange?.(e)}addPhase(e){this.state.phases.push(e)}async execute(e,r){this.context=e,this.events=r,this.state={generatedFiles:[],installSucceeded:!1,phases:[]};const s=[this.phaseGenerateFiles,this.phaseInstallAgentSkills,this.phaseSetupLinter,this.phaseGitInit,this.phaseInstallDependencies,this.phaseRunFormatter,this.phaseFormatterCommit];for(const o of s)if(!await o.call(this))break;this.emit("complete");const n=this.state.phases.every(o=>o.success||o.skipped);return this.buildResult(n)}async phaseGenerateFiles(){this.emit("generate-files");const e=new qa(this.outputDir,this.generatorOptions);try{const r=await e.generate(this.context);return this.state.generatedFiles.push(...r.generatedFiles),r.success?(this.addPhase({phase:"generate-files",success:!0}),!0):(this.addPhase({error:r.error,phase:"generate-files",success:!1}),!1)}catch(r){return this.addPhase({error:r instanceof Error?r.message:String(r),phase:"generate-files",success:!1}),!1}}async phaseInstallAgentSkills(){if(!this.context.addons.includes("agent-skills"))return this.addPhase({phase:"install-agent-skills",skipped:!0,success:!0}),!0;this.emit("install-agent-skills");try{const e=await rs(this.outputDir,this.context),r=e.failed.length>0?e.failed.map(s=>`${s.name}: ${s.error}`).join(", "):void 0;this.addPhase({phase:"install-agent-skills",success:!0,...r?{error:r}:{}})}catch(e){this.addPhase({error:e instanceof Error?e.message:String(e),phase:"install-agent-skills",success:!0})}return!0}async phaseSetupLinter(){if(this.context.formatter==="none")return this.addPhase({phase:"setup-linter",skipped:!0,success:!0}),!0;this.emit("setup-linter");try{const e=await gs(this.outputDir,this.context);if(!e.success)return this.addPhase({error:e.message,phase:"setup-linter",success:!1}),!1;const r=await js(this.outputDir,this.context.formatter);return r.success?(this.addPhase({phase:"setup-linter",success:!0}),!0):(this.addPhase({error:r.message??"Rule injection failed",phase:"setup-linter",success:!1}),!1)}catch(e){return this.addPhase({error:e instanceof Error?e.message:String(e),phase:"setup-linter",success:!1}),!1}}async phaseGitInit(){if(!this.context.initGit)return this.addPhase({phase:"initialize-git",skipped:!0,success:!0}),this.addPhase({phase:"initial-commit",skipped:!0,success:!0}),!0;this.emit("initialize-git");try{await ns(this.outputDir)||await as(this.outputDir),this.addPhase({phase:"initialize-git",success:!0})}catch(s){this.addPhase({error:s instanceof Error?s.message:String(s),phase:"initialize-git",success:!1})}const{3:e}=this.state.phases;if(e?.success??!1){this.emit("initial-commit");try{await Mt(this.outputDir),await Dt(this.outputDir,"Initial project scaffold"),this.addPhase({phase:"initial-commit",success:!0})}catch(s){this.addPhase({error:s instanceof Error?s.message:String(s),phase:"initial-commit",success:!1})}}else this.addPhase({phase:"initial-commit",skipped:!0,success:!0});return!0}async phaseInstallDependencies(){if(!this.context.installDependencies)return this.addPhase({phase:"install-dependencies",skipped:!0,success:!0}),!0;this.emit("install-dependencies");try{await Qa(this.context.packageManager).install(this.outputDir,r=>{this.events?.onInstallProgress?.(r)}),this.state.installSucceeded=!0,this.addPhase({phase:"install-dependencies",success:!0})}catch(e){this.addPhase({error:e instanceof Error?e.message:String(e),phase:"install-dependencies",success:!1})}return!0}async phaseRunFormatter(){if(!(this.state.installSucceeded&&this.context.formatter!=="none"))return this.addPhase({phase:"run-formatter",skipped:!0,success:!0}),!0;this.emit("run-formatter");try{const r=await ps(this.context.packageManager,this.outputDir);this.addPhase({phase:"run-formatter",success:r.success,...r.success?{}:{error:r.error}})}catch(r){this.addPhase({error:r instanceof Error?r.message:String(r),phase:"run-formatter",success:!1})}return!0}async phaseFormatterCommit(){const{5:e}=this.state.phases;if(!(this.context.initGit&&e?.success&&!e.skipped))return this.addPhase({phase:"formatter-commit",skipped:!0,success:!0}),!0;this.emit("formatter-commit");try{await Mt(this.outputDir),await os(this.outputDir)&&await Dt(this.outputDir,"Apply formatter"),this.addPhase({phase:"formatter-commit",success:!0})}catch(s){this.addPhase({error:s instanceof Error?s.message:String(s),phase:"formatter-commit",success:!1})}return!0}buildResult(e){return{generatedFiles:this.state.generatedFiles,outputDir:this.outputDir,phases:this.state.phases,success:e}}}function Xa(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}}l(Xa,"buildGeneratorContext");function Le(t){return te.NEST_ARCH_BETA_MODE?Y(ht(),"test-projects",t):Y(process.cwd(),t)}l(Le,"getOutputDir");function Ka(){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")}l(Ka,"getTemplatesDir");async function Xt(t,e){const r=Le(t.projectName),s=Xa(t),n=Ka(),o=new Ya(r,{cacheTemplates:!0,templatesDir:n});try{const a=await o.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"},p=a.phases.filter(d=>!d.success&&!d.skipped&&d.error).map(d=>`${i[d.phase]||d.phase} failed:
133
133
  ${d.error}`);return p.length>0?{message:p.join(`
134
134
 
135
- `),outputDir:r,success:!1}:{message:`Project created with ${a.generatedFiles.length} files`,outputDir:r,success:!0}}catch(a){return{message:`Failed to generate project: ${a instanceof Error?a.message:String(a)}`,outputDir:r,success:!1}}}l(Kt,"generateProject");const eo=l(()=>({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 Zt(t){return!t.packageManager||!t.formatter||!t.httpProvider||!t.projectType||!t.architecture||!t.initGit||!t.installDependencies?null:{addons:t.addons,api:t.api,architecture:t.architecture,auth:t.auth??"none",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:ne(t.projectName),projectType:t.projectType,ultraciteAgents:t.ultraciteAgents,ultraciteEditors:t.ultraciteEditors,ultraciteHooks:t.ultraciteHooks,ultraciteInstallSkill:t.ultraciteInstallSkill??"no"}}l(Zt,"buildResult");const to=l(({onBack:t,onExit:e,onStepChange:r})=>{const[s,n]=O("projectName"),o=qe(s);o.current=s;const[a,i]=O(eo),[p,d]=O(null),[m,g]=O(null),[b,q]=O(null),[M,U]=O(null),F=J(()=>ot(a),[a]),_=J(()=>Fr(s,a),[s,a]),$=J(()=>Nr(s,a),[s,a]);mt(()=>{if(!m||m.isError)return;const A=Zt(a);A&&Mt(A),n("done"),r?.("done")},[m,a,r]);const G=R(A=>{const k=Lr(o.current,A);k&&(n(k),r?.(k))},[r]),B=R(()=>{const A=$r(s,a);if(A){n(A),r?.(A);return}t()},[t,a,s,r]),z=l(A=>R(k=>{i(j=>{const x={...j,[A]:k};return G(x),x})},[A]),"useStepFieldHandler"),v=z("packageManager"),I=z("formatter"),D=z("httpProvider"),V=z("auth"),ee=z("microservices"),fe=z("addons"),ye=z("ultraciteEditors"),be=z("ultraciteAgents"),we=z("ultraciteHooks"),ie=z("ultraciteInstallSkill"),Te=z("initGit"),T=z("installDependencies"),X=R(()=>{const A=Me(a.projectName);if(A){d(A);return}const k=ne(a.projectName),j=$e(k);if(ve(j)){d(`Directory "${j}" already exists. Choose a different name or delete the existing directory.`);return}const x={...a,projectName:k};i(x),G(x)},[G,a]),ce=R(A=>{const k=A==="single"&&a.architecture==="nest-gateway"?Ct():a.architecture??Ct(),j={...a,architecture:k,extras:A==="single"?a.extras.filter(x=>x!=="packages/shared"):a.extras,microservices:k==="nest-gateway"?a.microservices:[],projectType:A};i(j),G(j)},[G,a]),C=R(A=>{const k={...a,architecture:A,microservices:A==="nest-gateway"?a.microservices:[]};i(k),G(k)},[G,a]),K=R(A=>{const k=A==="none"?[]:[A],j=Gt(a.orm,k),x=k.length===0,Ve={...a,api:x?a.api.filter(te=>te!=="graphql"):a.api,auth:x&&a.auth==="better-auth"?null:a.auth,database:k,orm:j};i(Ve),G(Ve)},[G,a]),se=R(A=>{const k=A==="none"?[]:[A],j=Wr(a.database,k),x={...a,database:j,orm:Gt(k,j)};i(x),G(x)},[G,a]),S=R(A=>{const k=ze(A),j={...a,addons:k?a.addons:a.addons.filter(x=>x!=="scalar-ui"),api:A,auth:k?a.auth:null,extras:k?a.extras:a.extras.filter(x=>x==="docker"||x==="packages/shared")};i(j),G(j)},[G,a]),Ee=R(A=>{const k=A.includes("swagger"),j={...a,addons:k?a.addons:a.addons.filter(x=>x!=="scalar-ui"),extras:A};i(j),G(j)},[G,a]),Je=J(()=>{const A=a.projectType==="monorepo"?st:st.filter(k=>k.value!=="packages/shared");return ze(a.api)?A:A.filter(k=>k.value==="docker"||k.value==="packages/shared")},[a.projectType,a.api]),Re=R(async()=>{const A=Zt(a);if(A){n("installing"),r?.("installing");try{const k=await Kt(A,{onInstallProgress:l(j=>{U(j)},"onInstallProgress"),onStageChange:l(j=>{q(j)},"onStageChange")});g({isError:!k.success,message:k.message})}catch(k){g({isError:!0,message:`Error: ${k instanceof Error?k.message:String(k)}`})}}},[a,r]),He=R(()=>{n("summary"),r?.("summary"),g(null)},[r]),We=J(()=>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"&&m?.isError?"confirm":"select",[s,m?.isError]);return{architectureOpts:J(()=>Ur(a.projectType),[a.projectType]),currentStage:b,displayStep:_,extrasStepOptions:Je,generationStatus:m,goBack:B,handleAddons:fe,handleApi:S,handleArchitecture:C,handleAuth:V,handleDatabase:K,handleExtras:Ee,handleFormatter:I,handleHttpProvider:D,handleInitGit:Te,handleInstallDependencies:T,handleMicroservices:ee,handleOrm:se,handlePackageManager:v,handleProjectNameSubmit:X,handleProjectType:ce,handleRetry:He,handleSummaryConfirm:Re,handleUltraciteAgents:be,handleUltraciteEditors:ye,handleUltraciteHooks:we,handleUltraciteInstallSkill:ie,installProgress:M,projectNameError:p,setProjectNameError:d,setState:i,state:a,statusAction:We,stepId:s,subProgress:$,totalSteps:F}},"useCreateProjectWizard"),ro=l(({onBack:t,onDone:e,onExit:r,onStepChange:s})=>{const{architectureOpts:n,currentStage:o,displayStep:a,extrasStepOptions:i,generationStatus:p,goBack:d,handleProjectNameSubmit:m,handlePackageManager:g,handleFormatter:b,handleHttpProvider:q,handleProjectType:M,handleArchitecture:U,handleDatabase:F,handleOrm:_,handleApi:$,handleAuth:G,handleExtras:B,handleMicroservices:z,handleAddons:v,handleUltraciteEditors:I,handleUltraciteAgents:D,handleUltraciteHooks:V,handleUltraciteInstallSkill:ee,handleInitGit:fe,handleInstallDependencies:ye,handleRetry:be,handleSummaryConfirm:we,installProgress:ie,projectNameError:Te,setProjectNameError:T,setState:X,statusAction:ce,stepId:C,subProgress:K,totalSteps:se,state:S}=to({onBack:t,onExit:r,onStepChange:s}),[Ee,Je]=O([]),[Re]=O([]),He=J(()=>{const j=new Set;return S.initGit==="no"&&(j.add("initialize-git"),j.add("initial-commit")),S.installDependencies==="no"&&j.add("install-dependencies"),(S.formatter==="none"||S.installDependencies==="no")&&(j.add("setup-linter"),j.add("run-formatter")),(S.initGit==="no"||j.has("run-formatter"))&&j.add("formatter-commit"),S.addons.includes("agent-skills")||j.add("install-agent-skills"),[...j]},[S.initGit,S.installDependencies,S.formatter,S.addons]),We=J(()=>xt.filter(j=>!(j.value==="ultracite"&&S.formatter==="none"||j.value==="scalar-ui"&&!S.extras.includes("swagger"))),[S.formatter,S.extras]),ut=J(()=>{let j=S;return C==="addons"&&(j={...j,addons:Ee}),C==="database"&&(j={...j,database:Re}),ot(j)},[C,S,Ee,Re,se]);ae(()=>{C==="done"&&e()},[C,e]),le((j,x)=>{if(x.ctrl&&j==="c"){r();return}if(x.ctrl&&j==="b"&&C!=="done"){d();return}if(C==="done"&&x.return){r();return}C==="installing"&&p?.isError&&x.return&&be()});const A=l(()=>{const x={architecture:{options:n,prompt:"Choose an application architecture"},auth:{options:Jr(S.database),prompt:"Choose an authentication strategy"},formatter:{options:Tt,prompt:"Choose a formatter-linter (with ultracite preset) setup"},httpProvider:{options:Et,prompt:"Choose an HTTP provider"},initGit:{options:It,prompt:"Initialize a git repository?"},installDependencies:{options:Ir,prompt:"Install dependencies?"},packageManager:{options:Pt,prompt:"Choose a package manager"},projectType:{options:Rt,prompt:"Choose a project layout"},ultraciteInstallSkill:{options:Gr,prompt:"Install Ultracite skill?"}}[C];if(x)return c(De,{onConfirm:{architecture:U,auth:G,formatter:b,httpProvider:q,initGit:fe,installDependencies:ye,packageManager:g,projectType:M,ultraciteInstallSkill:ee}[C],options:x.options,prompt:x.prompt},C);const te={addons:{initialSelected:S.addons,onChange:Je,options:We,prompt:"Select addons (optional)"},apiLayer:{initialSelected:S.architecture==="nest-api"&&S.api.length===0?["rest"]:S.api,options:Hr(S.database),prompt:"Select API layers (optional)"},extras:{initialSelected:S.extras,options:i,prompt:"Select extras (optional)"},microservices:{initialSelected:S.microservices,options:xr,prompt:"Select microservice communication protocols"},ultraciteAgents:{initialSelected:S.ultraciteAgents,minified:!0,options:_r,prompt:"Select Ultracite agents"},ultraciteEditors:{initialSelected:S.ultraciteEditors,minified:!0,options:Or,prompt:"Select Ultracite editors"},ultraciteHooks:{initialSelected:S.ultraciteHooks,options:Cr,prompt:"Select Ultracite hooks"}}[C];if(te){const Q={addons:v,apiLayer:$,extras:B,microservices:z,ultraciteAgents:D,ultraciteEditors:I,ultraciteHooks:V};return c(Rr,{initialSelected:te.initialSelected,onConfirm:Q[C],options:te.options,prompt:te.prompt,...te.minified?{minified:!0}:{},...te.onChange?{onChange:te.onChange}:{}},C)}switch(C){case"projectName":return c(At,{error:Te,onChange:l(Q=>{X(tr=>({...tr,projectName:Q})),T(Me(Q))},"onChange"),onSubmit:m,value:S.projectName});case"database":{const Q={description:"Skip database scaffolding for now",label:"No database",value:"none"};return c(De,{initialValue:S.database[0]??"none",onConfirm:F,options:[Q,...Br(S.orm)],prompt:"Select a database for your project (optional)"},"database")}case"orm":{const Q={description:"Use plain database access without an ORM",label:"No ORM",value:"none"};return c(De,{initialValue:S.orm[0]??"none",onConfirm:_,options:[Q,..._t(S.database)],prompt:"Select an ORM to include"},"orm")}case"summary":return c(Vr,{onConfirm:we,state:S});case"installing":return y(f,{flexDirection:"column",children:[c(jt,{currentStage:o,generationMessage:p?.message??"Scaffolding your project",installProgress:ie,isError:p?.isError??!1,packageManager:S.packageManager??void 0,skippedStages:He}),p?.isError?c(f,{marginTop:1,children:y(u,{color:E,children:["Press ",c(u,{color:P,children:"Enter"})," to go back to Summary and retry, or ",c(u,{color:E,children:"Ctrl+B"})," to go back"]})}):null]});case"done":{const Q=ne(S.projectName);return c(vt,{architecture:S.architecture||"nest-api",projectName:Q,packageManager:S.packageManager||"pnpm",dependenciesInstalled:S.installDependencies==="yes",isGitInitialized:S.initGit==="yes",outputDir:$e(Q)})}default:return null}},"renderStep"),k=C!=="installing"&&C!=="done";return y(f,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[k?y(N,{children:[c(Qr,{state:S,stepId:C}),c(f,{height:0}),c(Yr,{displayStep:a,stepId:C,subProgress:K??void 0,totalSteps:ut}),c(f,{height:2})]}):null,A(),c(f,{flexGrow:1}),k?y(N,{children:[c(ke,{}),c(f,{height:1}),c(Ke,{action:ce,showBack:!0})]}):null]})},"CreateProjectWizardScreen"),lt=` _ _ ___ ___ _____ _ ___ ___ _ _
135
+ `),outputDir:r,success:!1}:{message:`Project created with ${a.generatedFiles.length} files`,outputDir:r,success:!0}}catch(a){return{message:`Failed to generate project: ${a instanceof Error?a.message:String(a)}`,outputDir:r,success:!1}}}l(Xt,"generateProject");const Za=l(()=>({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 Kt(t){return!t.packageManager||!t.formatter||!t.httpProvider||!t.projectType||!t.architecture||!t.initGit||!t.installDependencies?null:{addons:t.addons,api:t.api,architecture:t.architecture,auth:t.auth??"none",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:ze(t.database)?[]:t.orm,packageManager:t.packageManager,projectName:ie(t.projectName),projectType:t.projectType,ultraciteAgents:t.ultraciteAgents,ultraciteEditors:t.ultraciteEditors,ultraciteHooks:t.ultraciteHooks,ultraciteInstallSkill:t.ultraciteInstallSkill??"no"}}l(Kt,"buildResult");const eo=l(({onBack:t,onExit:e,onStepChange:r})=>{const[s,n]=_("projectName"),o=qe(s);o.current=s;const[a,i]=_(Za),[p,d]=_(null),[m,g]=_(null),[b,q]=_(null),[M,U]=_(null),F=J(()=>at(a),[a]),O=J(()=>Nr(s,a),[s,a]),$=J(()=>zr(s,a),[s,a]);ut(()=>{if(!m||m.isError)return;const A=Kt(a);A&&Gt(A),n("done"),r?.("done")},[m,a,r]);const G=R(A=>{const k=Fr(o.current,A);k&&(n(k),r?.(k))},[r]),B=R(()=>{const A=Lr(s,a);if(A){n(A),r?.(A);return}t()},[t,a,s,r]),z=l(A=>R(k=>{i(j=>{const x={...j,[A]:k};return G(x),x})},[A]),"useStepFieldHandler"),v=z("packageManager"),I=z("formatter"),D=z("httpProvider"),V=z("auth"),ee=z("microservices"),fe=z("addons"),ye=z("ultraciteEditors"),be=z("ultraciteAgents"),we=z("ultraciteHooks"),ce=z("ultraciteInstallSkill"),Pe=z("initGit"),P=z("installDependencies"),X=R(()=>{const A=Ge(a.projectName);if(A){d(A);return}const k=ie(a.projectName),j=Le(k);if(ve(j)){d(`Directory "${j}" already exists. Choose a different name or delete the existing directory.`);return}const x={...a,projectName:k};i(x),G(x)},[G,a]),le=R(A=>{const k=A==="single"&&a.architecture==="nest-gateway"?Ot():a.architecture??Ot(),j={...a,architecture:k,extras:A==="single"?a.extras.filter(x=>x!=="packages/shared"):a.extras,microservices:k==="nest-gateway"?a.microservices:[],projectType:A};i(j),G(j)},[G,a]),C=R(A=>{const k={...a,architecture:A,microservices:A==="nest-gateway"?a.microservices:[]};i(k),G(k)},[G,a]),K=R(A=>{const k=A==="none"?[]:[A],j=Ct(a.orm,k),x=k.length===0,We={...a,api:x?a.api.filter(re=>re!=="graphql"):a.api,auth:x&&a.auth==="better-auth"?null:a.auth,database:k,orm:j};i(We),G(We)},[G,a]),ae=R(A=>{const k=A==="none"?[]:[A],j=Hr(a.database,k),x={...a,database:j,orm:Ct(k,j)};i(x),G(x)},[G,a]),S=R(A=>{const k=De(A),j={...a,addons:k?a.addons:a.addons.filter(x=>x!=="scalar-ui"),api:A,auth:k?a.auth:null,extras:k?a.extras:a.extras.filter(x=>x==="docker"||x==="packages/shared")};i(j),G(j)},[G,a]),Ee=R(A=>{const k=A.includes("swagger"),j={...a,addons:k?a.addons:a.addons.filter(x=>x!=="scalar-ui"),extras:A};i(j),G(j)},[G,a]),Be=J(()=>{const A=a.projectType==="monorepo"?rt:rt.filter(k=>k.value!=="packages/shared");return De(a.api)?A:A.filter(k=>k.value==="docker"||k.value==="packages/shared")},[a.projectType,a.api]),Re=R(async()=>{const A=Kt(a);if(A){n("installing"),r?.("installing");try{const k=await Xt(A,{onInstallProgress:l(j=>{U(j)},"onInstallProgress"),onStageChange:l(j=>{q(j)},"onStageChange")});g({isError:!k.success,message:k.message})}catch(k){g({isError:!0,message:`Error: ${k instanceof Error?k.message:String(k)}`})}}},[a,r]),Je=R(()=>{n("summary"),r?.("summary"),g(null)},[r]),He=J(()=>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"&&m?.isError?"confirm":"select",[s,m?.isError]);return{architectureOpts:J(()=>$r(a.projectType),[a.projectType]),currentStage:b,displayStep:O,extrasStepOptions:Be,generationStatus:m,goBack:B,handleAddons:fe,handleApi:S,handleArchitecture:C,handleAuth:V,handleDatabase:K,handleExtras:Ee,handleFormatter:I,handleHttpProvider:D,handleInitGit:Pe,handleInstallDependencies:P,handleMicroservices:ee,handleOrm:ae,handlePackageManager:v,handleProjectNameSubmit:X,handleProjectType:le,handleRetry:Je,handleSummaryConfirm:Re,handleUltraciteAgents:be,handleUltraciteEditors:ye,handleUltraciteHooks:we,handleUltraciteInstallSkill:ce,installProgress:M,projectNameError:p,setProjectNameError:d,setState:i,state:a,statusAction:He,stepId:s,subProgress:$,totalSteps:F}},"useCreateProjectWizard"),to=l(({onBack:t,onDone:e,onExit:r,onStepChange:s})=>{const{architectureOpts:n,currentStage:o,displayStep:a,extrasStepOptions:i,generationStatus:p,goBack:d,handleProjectNameSubmit:m,handlePackageManager:g,handleFormatter:b,handleHttpProvider:q,handleProjectType:M,handleArchitecture:U,handleDatabase:F,handleOrm:O,handleApi:$,handleAuth:G,handleExtras:B,handleMicroservices:z,handleAddons:v,handleUltraciteEditors:I,handleUltraciteAgents:D,handleUltraciteHooks:V,handleUltraciteInstallSkill:ee,handleInitGit:fe,handleInstallDependencies:ye,handleRetry:be,handleSummaryConfirm:we,installProgress:ce,projectNameError:Pe,setProjectNameError:P,setState:X,statusAction:le,stepId:C,subProgress:K,totalSteps:ae,state:S}=eo({onBack:t,onExit:r,onStepChange:s}),[Ee,Be]=_([]),[Re]=_([]),Je=J(()=>{const j=new Set;return S.initGit==="no"&&(j.add("initialize-git"),j.add("initial-commit")),S.installDependencies==="no"&&j.add("install-dependencies"),(S.formatter==="none"||S.installDependencies==="no")&&(j.add("setup-linter"),j.add("run-formatter")),(S.initGit==="no"||j.has("run-formatter"))&&j.add("formatter-commit"),S.addons.includes("agent-skills")||j.add("install-agent-skills"),[...j]},[S.initGit,S.installDependencies,S.formatter,S.addons]),He=J(()=>qt.filter(j=>!(j.value==="ultracite"&&S.formatter==="none"||j.value==="scalar-ui"&&!S.extras.includes("swagger"))),[S.formatter,S.extras]),dt=J(()=>{let j=S;return C==="addons"&&(j={...j,addons:Ee}),C==="database"&&(j={...j,database:Re}),at(j)},[C,S,Ee,Re,ae]);oe(()=>{C==="done"&&e()},[C,e]),pe((j,x)=>{if(x.ctrl&&j==="c"){r();return}if(x.ctrl&&j==="b"&&C!=="done"){d();return}if(C==="done"&&x.return){r();return}C==="installing"&&p?.isError&&x.return&&be()});const A=l(()=>{const x={architecture:{options:n,prompt:"Choose an application architecture"},auth:{options:Br(S.database),prompt:"Choose an authentication strategy"},formatter:{options:Tt,prompt:"Choose a formatter-linter (with ultracite preset) setup"},httpProvider:{options:Pt,prompt:"Choose an HTTP provider"},initGit:{options:xt,prompt:"Initialize a git repository?"},installDependencies:{options:xr,prompt:"Install dependencies?"},packageManager:{options:At,prompt:"Choose a package manager"},projectType:{options:Et,prompt:"Choose a project layout"},ultraciteInstallSkill:{options:Cr,prompt:"Install Ultracite skill?"}}[C];if(x)return c(Me,{onConfirm:{architecture:U,auth:G,formatter:b,httpProvider:q,initGit:fe,installDependencies:ye,packageManager:g,projectType:M,ultraciteInstallSkill:ee}[C],options:x.options,prompt:x.prompt},C);const re={addons:{initialSelected:S.addons,onChange:Be,options:He,prompt:"Select addons (optional)"},apiLayer:{initialSelected:S.architecture==="nest-api"&&S.api.length===0?["rest"]:S.api,options:Jr(S.database),prompt:"Select API layers (optional)"},extras:{initialSelected:S.extras,options:i,prompt:"Select extras (optional)"},microservices:{initialSelected:S.microservices,options:qr,prompt:"Select microservice communication protocols"},ultraciteAgents:{initialSelected:S.ultraciteAgents,minified:!0,options:_r,prompt:"Select Ultracite agents"},ultraciteEditors:{initialSelected:S.ultraciteEditors,minified:!0,options:Ir,prompt:"Select Ultracite editors"},ultraciteHooks:{initialSelected:S.ultraciteHooks,options:Or,prompt:"Select Ultracite hooks"}}[C];if(re){const Q={addons:v,apiLayer:$,extras:B,microservices:z,ultraciteAgents:D,ultraciteEditors:I,ultraciteHooks:V};return c(Er,{initialSelected:re.initialSelected,onConfirm:Q[C],options:re.options,prompt:re.prompt,...re.minified?{minified:!0}:{},...re.onChange?{onChange:re.onChange}:{}},C)}switch(C){case"projectName":return c(kt,{error:Pe,onChange:l(Q=>{X(er=>({...er,projectName:Q})),P(Ge(Q))},"onChange"),onSubmit:m,value:S.projectName});case"database":{const Q={description:"Skip database scaffolding for now",label:"No database",value:"none"};return c(Me,{initialValue:S.database[0]??"none",onConfirm:F,options:[Q,...Ur(S.orm)],prompt:"Select a database for your project (optional)"},"database")}case"orm":{const Q={description:"Use plain database access without an ORM",label:"No ORM",value:"none"};return c(Me,{initialValue:S.orm[0]??"none",onConfirm:O,options:[Q,..._t(S.database)],prompt:"Select an ORM to include"},"orm")}case"summary":return c(Wr,{onConfirm:we,state:S});case"installing":return y(f,{flexDirection:"column",children:[c(wt,{currentStage:o,generationMessage:p?.message??"Scaffolding your project",installProgress:ce,isError:p?.isError??!1,packageManager:S.packageManager??void 0,skippedStages:Je}),p?.isError?c(f,{marginTop:1,children:y(u,{color:E,children:["Press ",c(u,{color:T,children:"Enter"})," to go back to Summary and retry, or ",c(u,{color:E,children:"Ctrl+B"})," to go back"]})}):null]});case"done":{const Q=ie(S.projectName);return c(jt,{architecture:S.architecture||"nest-api",projectName:Q,packageManager:S.packageManager||"pnpm",dependenciesInstalled:S.installDependencies==="yes",isGitInitialized:S.initGit==="yes",outputDir:Le(Q)})}default:return null}},"renderStep"),k=C!=="installing"&&C!=="done";return y(f,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[k?y(N,{children:[c(Vr,{state:S,stepId:C}),c(f,{height:0}),c(Qr,{displayStep:a,stepId:C,subProgress:K??void 0,totalSteps:dt}),c(f,{height:2})]}):null,A(),c(f,{flexGrow:1}),k?y(N,{children:[c(ke,{}),c(f,{height:1}),c(Xe,{action:le,showBack:!0})]}):null]})},"CreateProjectWizardScreen"),ct=` _ _ ___ ___ _____ _ ___ ___ _ _
136
136
  | \\| | __/ __|_ _| /_\\ | _ \\/ __| || |
137
137
  | .\` | _|\\__ \\ | | / _ \\| / (__| __ |
138
- |_|\\_|___|___/ |_| /_/ \\_\\_|_\\\\___|_||_|`,so=12,ao=4,er=l(({onlyCat:t=!1})=>{const{stdout:e}=Qe(),r=e.columns||e.getWindowSize?.()[0]||80,s=e.rows||e.getWindowSize?.()[1]||24;return t?s<15||r<20?c(f,{flexDirection:"column",alignItems:"center",children:c(u,{bold:!0,color:P,children:ht})}):c(f,{flexDirection:"column",alignItems:"center",children:c(u,{color:P,children:Xe})}):s<15||r<38?y(f,{flexDirection:"column",alignItems:"center",rowGap:0,children:[c(u,{bold:!0,color:P,children:ht}),c(u,{color:E,children:xe}),c(u,{color:W,children:Ie})]}):s<15+ao||r<55?y(f,{flexDirection:"column",alignItems:"center",rowGap:0,children:[c(u,{color:P,children:lt}),c(u,{color:E,children:xe}),c(u,{color:W,children:Ie})]}):s<15+so||r<80?y(f,{flexDirection:"column",alignItems:"center",rowGap:0,children:[c(u,{color:P,children:Xe}),c(u,{color:P,children:lt}),c(u,{color:E,children:xe}),c(u,{color:W,children:Ie})]}):y(f,{flexDirection:"row",columnGap:2,alignItems:"flex-start",children:[c(u,{color:P,children:Xe}),y(f,{flexDirection:"column",children:[c(u,{color:P,children:lt}),y(u,{color:E,children:[" ",xe]}),y(u,{color:W,children:[" ",Ie]})]})]})},"Header"),pt={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"},oo=l(({onSelect:t,options:e})=>{const[r,s]=O(0),n=R(()=>{const o=e[r];o&&!o.disabled&&t(o)},[t,e,r]);return Ge((o,a)=>{a.upArrow||o==="k"?s(i=>Math.max(0,i-1)):a.downArrow||o==="j"?s(i=>Math.min(e.length-1,i+1)):a.return&&n()}),y(f,{flexDirection:"column",children:[c(u,{color:E,children:"Choose a project preset"}),c(f,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((o,a)=>y(f,{flexDirection:"column",children:[c(u,{children:a===r?y(N,{children:[c(u,{color:o.disabled?pe:P,children:"> "}),c(u,{color:o.disabled?pe:P,children:o.name})]}):c(u,{color:o.disabled?pe:oe,children:` ${o.name}`})}),a===r&&o.description?c(u,{color:E,children:o.description}):null]},o.name))})]})},"PresetStep"),no={done:"Done",initGit:"Git repository",installing:"Installing",preset:"Project preset",projectName:"Project name"},io=l(({step:t})=>y(u,{children:[c(u,{color:P,children:"\u2727 "}),c(u,{color:L,children:no[t]})]}),"WizardTitle"),co=l(({onBack:t,onDone:e,onExit:r,onStepChange:s})=>{const[n,o]=O("preset"),[a,i]=O(""),[p,d]=O(null),[m,g]=O(null),[b,q]=O(null),[M,U]=O(null),[F,_]=O(null),[$,G]=O("");ae(()=>{n==="done"&&e()},[n,e]);const B=J(()=>Xr(),[]),z=J(()=>{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 B?T.push({description:Kr(B),name:"Last Used"}):T.push({description:"",disabled:!0,name:"Last Used"}),T},[B]),[v,I]=O(pt),D=J(()=>{const T=new Set;return m==="no"&&(T.add("initialize-git"),T.add("initial-commit")),v.installDependencies==="no"&&T.add("install-dependencies"),(v.formatter==="none"||v.installDependencies==="no")&&(T.add("setup-linter"),T.add("run-formatter")),(m==="no"||T.has("run-formatter"))&&T.add("formatter-commit"),v.addons.includes("agent-skills")||T.add("install-agent-skills"),[...T]},[m,v]),V=R(()=>{switch(n){case"projectName":{o("preset"),s?.("preset"),d(null);return}case"initGit":{o("projectName"),s?.("projectName");return}default:t()}},[t,n,s]),ee=R(T=>{if(T.name==="Last Used"&&B){const{projectName:X,initGit:ce,...C}=B;I(C)}else T.name==="API Gateway"?I({...pt,architecture:"nest-gateway",projectType:"monorepo"}):I(pt);o("projectName"),s?.("projectName")},[B,s]),fe=R(T=>{i(T),d(Me(T))},[]),ye=R(()=>{const T=Me(a);if(T){d(T);return}o("initGit"),s?.("initGit")},[a,s]),be=R(async T=>{g(T);const X=ne(a),ce=$e(X);G(ce),o("installing"),s?.("installing");const C={...v,initGit:T,projectName:X};try{const K=await Kt(C,{onInstallProgress:l(se=>{_(se)},"onInstallProgress"),onStageChange:l(se=>{U(se)},"onStageChange")});q({isError:!K.success,message:K.message}),K.success&&Mt(C)}catch(K){q({isError:!0,message:`Error: ${K instanceof Error?K.message:String(K)}`})}},[a,v,s]);mt(()=>{b&&!b.isError&&(o("done"),s?.("done"))},[b,s]),le((T,X)=>{if(X.ctrl&&T==="c"){r();return}if(X.ctrl&&T==="b"&&n!=="done"){V();return}n==="done"&&X.return&&r()});const we=J(()=>n==="projectName"?"confirm":"select",[n]),ie=n!=="installing"&&n!=="done";return y(f,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[ie?y(N,{children:[c(er,{}),c(ke,{}),c(f,{height:1}),c(io,{step:n}),c(f,{height:2})]}):null,l(()=>{switch(n){case"preset":return c(oo,{onSelect:ee,options:z});case"projectName":return c(At,{error:p,onChange:fe,onSubmit:ye,value:a});case"initGit":return c(De,{onConfirm:be,options:It,prompt:"Initialize a git repository?"});case"installing":return y(f,{flexDirection:"column",children:[c(jt,{currentStage:M,generationMessage:b?.message??"Scaffolding your project",installProgress:F,isError:b?.isError??!1,skippedStages:D}),b?.isError?c(f,{marginTop:1,children:y(u,{color:E,children:["Press ",c(u,{color:P,children:"Enter"})," to go back to Summary and retry, or ",c(u,{color:E,children:"Ctrl+B"})," to go back"]})}):null]});case"done":{const T=ne(a);return c(vt,{architecture:v.architecture||"nest-api",projectName:T,packageManager:v.packageManager||"pnpm",dependenciesInstalled:v.installDependencies==="yes",isGitInitialized:m==="yes",outputDir:$})}default:return null}},"renderStep")(),c(f,{flexGrow:1}),ie?y(N,{children:[c(ke,{}),c(f,{height:1}),c(Ke,{action:we,showBack:!0})]}):null]})},"ProjectPresetWizardScreen"),Ue=[{description:"Scaffold a new project with best practices",name:"Create a new NestJS project"},{description:"Choose from predefined configurations",name:"Starter templates"},{description:"Browse the Nest Arch docs",name:"Documentation"},{description:"Close Nest Arch",name:"Exit"}],lo=l(({onSelect:t})=>{const[e,r]=O(0),s=R(()=>{const a=Ue[e]??null;a?.disabled||t(e,a)},[t,e]),n=[];for(let a=0;a<Ue.length;a+=1)Ue[a].disabled||n.push(a);const o=n.indexOf(e);return Ge((a,i)=>{if(i.upArrow||a==="k"){const p=n[o-1];p!==void 0&&r(p)}else if(i.downArrow||a==="j"){const p=n[o+1];p!==void 0&&r(p)}else i.return&&s()}),y(f,{flexDirection:"column",children:[c(u,{color:E,children:" What would you like to do?"}),c(f,{marginTop:1,flexDirection:"column",rowGap:1,children:Ue.map((a,i)=>c(u,{children:i===e&&!a.disabled?y(N,{children:[c(u,{color:P,children:"> "}),c(u,{color:P,children:a.name})]}):c(u,{color:oe,children:` ${a.name}`})},a.name))})]})},"MainMenu"),po=l(()=>y(u,{children:[c(u,{color:P,children:"\u2727 "}),c(u,{color:L,children:" Welcome to "}),c(u,{color:P,children:"Nest Arch"}),c(u,{color:L,children:" \u2013 Let's build something amazing."})]}),"WelcomeMessage"),uo=l(({onCreateProject:t,onExit:e,onUsePreset:r})=>{const s=R(async()=>{const o="https://github.com/Angel-Mario";try{await fr(o,{wait:!1})}catch{}},[]),n=R((o,a)=>{a?.name==="Exit"?e():a?.name==="Create a new NestJS project"?t():a?.name==="Use a project preset"?r():a?.name==="View documentation"&&s()},[t,e,r,s]);return le((o,a)=>{a.ctrl&&o==="c"&&e()}),y(f,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[c(er,{}),c(ke,{}),c(f,{height:1}),c(po,{}),c(f,{height:2}),c(lo,{onSelect:n}),c(f,{flexGrow:1}),c(ke,{borderTop:!1}),c(f,{height:1}),c(Ke,{})]})},"WelcomeScreen"),mo=l(({onDone:t})=>{const[e,r]=O("welcome"),{stdout:s}=Qe(),{exit:n}=ar(),[o,a]=O(s?.rows??24);ae(()=>{if(!s)return;const b=l(()=>{a(s.rows)},"handleResize");return s.on("resize",b),()=>{s.off("resize",b)}},[s]);const i=R(()=>{n()},[n]),p=R(()=>{r("preset-wizard")},[]),d=R(()=>{r("create-wizard")},[]),m=R(()=>{r("welcome")},[]);return c(f,{height:o,flexDirection:"column",children:l(()=>e==="create-wizard"?c(ro,{onBack:m,onDone:t,onExit:i}):e==="preset-wizard"?c(co,{onBack:m,onDone:t,onExit:i}):c(uo,{onCreateProject:d,onExit:i,onUsePreset:p}),"renderScreen")()})},"App");async function ho(){process.stdout.write("\x1B[?1049h");let t=!1;try{await sr(c(mo,{onDone:l(()=>{process.stdout.write("\x1B[?1049l"),t=!0},"onDone")})).waitUntilExit()}finally{t||process.stdout.write("\x1B[?1049l")}}l(ho,"main");try{await ho()}catch(t){console.error("Error:",t),process.exit(1)}
138
+ |_|\\_|___|___/ |_| /_/ \\_\\_|_\\\\___|_||_|`,ro=12,so=4,Zt=l(({onlyCat:t=!1})=>{const{stdout:e}=Ve(),r=e.columns||e.getWindowSize?.()[0]||80,s=e.rows||e.getWindowSize?.()[1]||24;return t?s<15||r<20?c(f,{flexDirection:"column",alignItems:"center",children:c(u,{bold:!0,color:T,children:mt})}):c(f,{flexDirection:"column",alignItems:"center",children:c(u,{color:T,children:Ye})}):s<15||r<38?y(f,{flexDirection:"column",alignItems:"center",rowGap:0,children:[c(u,{bold:!0,color:T,children:mt}),c(u,{color:E,children:xe}),c(u,{color:W,children:te.NEST_ARCH_VERSION})]}):s<15+so||r<55?y(f,{flexDirection:"column",alignItems:"center",rowGap:0,children:[c(u,{color:T,children:ct}),c(u,{color:E,children:xe}),c(u,{color:W,children:te.NEST_ARCH_VERSION})]}):s<15+ro||r<80?y(f,{flexDirection:"column",alignItems:"center",rowGap:0,children:[c(u,{color:T,children:Ye}),c(u,{color:T,children:ct}),c(u,{color:E,children:xe}),c(u,{color:W,children:te.NEST_ARCH_VERSION})]}):y(f,{flexDirection:"row",columnGap:2,alignItems:"flex-start",children:[c(u,{color:T,children:Ye}),y(f,{flexDirection:"column",children:[c(u,{color:T,children:ct}),y(u,{color:E,children:[" ",xe]}),y(u,{color:W,children:[" ",te.NEST_ARCH_VERSION]})]})]})},"Header"),lt={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"},ao=l(({onSelect:t,options:e})=>{const[r,s]=_(0),n=R(()=>{const o=e[r];o&&!o.disabled&&t(o)},[t,e,r]);return Ce((o,a)=>{a.upArrow||o==="k"?s(i=>Math.max(0,i-1)):a.downArrow||o==="j"?s(i=>Math.min(e.length-1,i+1)):a.return&&n()}),y(f,{flexDirection:"column",children:[c(u,{color:E,children:"Choose a project preset"}),c(f,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((o,a)=>y(f,{flexDirection:"column",children:[c(u,{children:a===r?y(N,{children:[c(u,{color:o.disabled?de:T,children:"> "}),c(u,{color:o.disabled?de:T,children:o.name})]}):c(u,{color:o.disabled?de:ne,children:` ${o.name}`})}),a===r&&o.description?c(u,{color:E,children:o.description}):null]},o.name))})]})},"PresetStep"),oo={done:"Done",initGit:"Git repository",installing:"Installing",preset:"Project preset",projectName:"Project name"},no=l(({step:t})=>y(u,{children:[c(u,{color:T,children:"\u2727 "}),c(u,{color:L,children:oo[t]})]}),"WizardTitle"),io=l(({onBack:t,onDone:e,onExit:r,onStepChange:s})=>{const[n,o]=_("preset"),[a,i]=_(""),[p,d]=_(null),[m,g]=_(null),[b,q]=_(null),[M,U]=_(null),[F,O]=_(null),[$,G]=_("");oe(()=>{n==="done"&&e()},[n,e]);const B=J(()=>Yr(),[]),z=J(()=>{const P=[{description:"REST API with standard NestJS modules and structure",name:"Basic NestJS API"},{description:"Microservice support with gateway routing",name:"API Gateway"}];return B?P.push({description:Xr(B),name:"Last Used"}):P.push({description:"",disabled:!0,name:"Last Used"}),P},[B]),[v,I]=_(lt),D=J(()=>{const P=new Set;return m==="no"&&(P.add("initialize-git"),P.add("initial-commit")),v.installDependencies==="no"&&P.add("install-dependencies"),(v.formatter==="none"||v.installDependencies==="no")&&(P.add("setup-linter"),P.add("run-formatter")),(m==="no"||P.has("run-formatter"))&&P.add("formatter-commit"),v.addons.includes("agent-skills")||P.add("install-agent-skills"),[...P]},[m,v]),V=R(()=>{switch(n){case"projectName":{o("preset"),s?.("preset"),d(null);return}case"initGit":{o("projectName"),s?.("projectName");return}default:t()}},[t,n,s]),ee=R(P=>{if(P.name==="Last Used"&&B){const{projectName:X,initGit:le,...C}=B;I(C)}else P.name==="API Gateway"?I({...lt,architecture:"nest-gateway",projectType:"monorepo"}):I(lt);o("projectName"),s?.("projectName")},[B,s]),fe=R(P=>{i(P),d(Ge(P))},[]),ye=R(()=>{const P=Ge(a);if(P){d(P);return}o("initGit"),s?.("initGit")},[a,s]),be=R(async P=>{g(P);const X=ie(a),le=Le(X);G(le),o("installing"),s?.("installing");const C={...v,initGit:P,projectName:X};try{const K=await Xt(C,{onInstallProgress:l(ae=>{O(ae)},"onInstallProgress"),onStageChange:l(ae=>{U(ae)},"onStageChange")});q({isError:!K.success,message:K.message}),K.success&&Gt(C)}catch(K){q({isError:!0,message:`Error: ${K instanceof Error?K.message:String(K)}`})}},[a,v,s]);ut(()=>{b&&!b.isError&&(o("done"),s?.("done"))},[b,s]),pe((P,X)=>{if(X.ctrl&&P==="c"){r();return}if(X.ctrl&&P==="b"&&n!=="done"){V();return}n==="done"&&X.return&&r()});const we=J(()=>n==="projectName"?"confirm":"select",[n]),ce=n!=="installing"&&n!=="done";return y(f,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[ce?y(N,{children:[c(Zt,{}),c(ke,{}),c(f,{height:1}),c(no,{step:n}),c(f,{height:2})]}):null,l(()=>{switch(n){case"preset":return c(ao,{onSelect:ee,options:z});case"projectName":return c(kt,{error:p,onChange:fe,onSubmit:ye,value:a});case"initGit":return c(Me,{onConfirm:be,options:xt,prompt:"Initialize a git repository?"});case"installing":return y(f,{flexDirection:"column",children:[c(wt,{currentStage:M,generationMessage:b?.message??"Scaffolding your project",installProgress:F,isError:b?.isError??!1,skippedStages:D}),b?.isError?c(f,{marginTop:1,children:y(u,{color:E,children:["Press ",c(u,{color:T,children:"Enter"})," to go back to Summary and retry, or ",c(u,{color:E,children:"Ctrl+B"})," to go back"]})}):null]});case"done":{const P=ie(a);return c(jt,{architecture:v.architecture||"nest-api",projectName:P,packageManager:v.packageManager||"pnpm",dependenciesInstalled:v.installDependencies==="yes",isGitInitialized:m==="yes",outputDir:$})}default:return null}},"renderStep")(),c(f,{flexGrow:1}),ce?y(N,{children:[c(ke,{}),c(f,{height:1}),c(Xe,{action:we,showBack:!0})]}):null]})},"ProjectPresetWizardScreen"),$e=[{description:"Scaffold a new project with best practices",name:"Create a new NestJS project"},{description:"Choose from predefined configurations",name:"Starter templates"},{description:"Browse the Nest Arch docs",name:"Documentation"},{description:"Close Nest Arch",name:"Exit"}],co=l(({onSelect:t})=>{const[e,r]=_(0),s=R(()=>{const a=$e[e]??null;a?.disabled||t(e,a)},[t,e]),n=[];for(let a=0;a<$e.length;a+=1)$e[a].disabled||n.push(a);const o=n.indexOf(e);return Ce((a,i)=>{if(i.upArrow||a==="k"){const p=n[o-1];p!==void 0&&r(p)}else if(i.downArrow||a==="j"){const p=n[o+1];p!==void 0&&r(p)}else i.return&&s()}),y(f,{flexDirection:"column",children:[c(u,{color:E,children:" What would you like to do?"}),c(f,{marginTop:1,flexDirection:"column",rowGap:1,children:$e.map((a,i)=>c(u,{children:i===e&&!a.disabled?y(N,{children:[c(u,{color:T,children:"> "}),c(u,{color:T,children:a.name})]}):c(u,{color:ne,children:` ${a.name}`})},a.name))})]})},"MainMenu"),lo=l(()=>y(u,{children:[c(u,{color:T,children:"\u2727 "}),c(u,{color:L,children:" Welcome to "}),c(u,{color:T,children:"Nest Arch"}),c(u,{color:L,children:" \u2013 Let's build something amazing."})]}),"WelcomeMessage"),po=l(({onCreateProject:t,onExit:e,onUsePreset:r})=>{const s=R(async()=>{const o="https://github.com/Angel-Mario";try{await gr(o,{wait:!1})}catch{}},[]),n=R((o,a)=>{a?.name==="Exit"?e():a?.name==="Create a new NestJS project"?t():a?.name==="Use a project preset"?r():a?.name==="View documentation"&&s()},[t,e,r,s]);return pe((o,a)=>{a.ctrl&&o==="c"&&e()}),y(f,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[c(Zt,{}),c(ke,{}),c(f,{height:1}),c(lo,{}),c(f,{height:2}),c(co,{onSelect:n}),c(f,{flexGrow:1}),c(ke,{borderTop:!1}),c(f,{height:1}),c(Xe,{})]})},"WelcomeScreen"),uo=l(({onDone:t})=>{const[e,r]=_("welcome"),{stdout:s}=Ve(),{exit:n}=sr(),[o,a]=_(s?.rows??24);oe(()=>{if(!s)return;const b=l(()=>{a(s.rows)},"handleResize");return s.on("resize",b),()=>{s.off("resize",b)}},[s]);const i=R(()=>{n()},[n]),p=R(()=>{r("preset-wizard")},[]),d=R(()=>{r("create-wizard")},[]),m=R(()=>{r("welcome")},[]);return c(f,{height:o,flexDirection:"column",children:l(()=>e==="create-wizard"?c(to,{onBack:m,onDone:t,onExit:i}):e==="preset-wizard"?c(io,{onBack:m,onDone:t,onExit:i}):c(po,{onCreateProject:d,onExit:i,onUsePreset:p}),"renderScreen")()})},"App");async function mo(){process.stdout.write("\x1B[?1049h");let t=!1;try{await rr(c(uo,{onDone:l(()=>{process.stdout.write("\x1B[?1049l"),t=!0},"onDone")})).waitUntilExit()}finally{t||process.stdout.write("\x1B[?1049l")}}l(mo,"main");try{await mo()}catch(t){console.error("Error:",t),process.exit(1)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nest-arch/tui",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "private": false,
5
5
  "description": "Interactive terminal UI for generating NestJS projects",
6
6
  "keywords": [
@@ -48,7 +48,7 @@
48
48
  "pkgroll": "^2.5.2",
49
49
  "tsx": "^4.19.2",
50
50
  "vitest": "^4.1.7",
51
- "@nest-arch/core": "0.2.4",
51
+ "@nest-arch/core": "0.2.6",
52
52
  "@nest-arch/env": "0.0.0",
53
53
  "@nest-arch/shared": "0.0.0"
54
54
  },
@@ -1 +0,0 @@
1
- const O="Nest Arch",A="v0.2.2",t="Build production-ready NestJS projects.",o="#e54545",R="#A0A0A0",c="#6B6B6B",s="#E5E5E5",C="#61AFEF",E="#3A3A3A",n="#7FD99A",_="#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,n as COLOR_SUCCESS,_ as COLOR_WARM,L as COLOR_WARM_SECONDARY};