@nest-arch/tui 0.1.35 → 0.1.38

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
- import"./index-B1adwhS2.js";import"react/jsx-runtime";import"ink";import"react";import"@t3-oss/env-nextjs";import"zod";import"ink-text-input";import"node:fs";import"node:os";import"node:path";import"node:fs/promises";import"handlebars";import"node:child_process";import"node:util";import"ts-morph";import"open";
2
+ import"./index-D8EatQzo.js";import"react/jsx-runtime";import"ink";import"react";import"ink-text-input";import"@t3-oss/env-nextjs";import"zod";import"node:fs";import"node:os";import"node:path";import"node:child_process";import"node:util";import"node:fs/promises";import"handlebars";import"ts-morph";import"open";
@@ -1,4 +1,4 @@
1
- var i=Object.defineProperty;var r=(e,a)=>i(e,"name",{value:a,configurable:!0});import{e as t}from"./index-B1adwhS2.js";import"react/jsx-runtime";import"ink";import"react";import"@t3-oss/env-nextjs";import"zod";import"ink-text-input";import"node:fs";import"node:os";import"node:path";import"node:fs/promises";import"handlebars";import"node:child_process";import"node:util";import"ts-morph";import"open";function s(e){return[`pnpm create nest-arch@latest ${e.projectName}`,`--package-manager ${e.packageManager}`,`--http-provider ${e.httpProvider}`,`--project-type ${e.projectType}`,`--architecture ${e.architecture}`,`--database ${e.database.length>0?e.database.join(" "):"none"}`,`--orm ${e.orm.length>0?e.orm.join(" "):"none"}`,`--api ${e.api.length>0?e.api.join(" "):"none"}`,`--auth ${e.auth}`,`--extras ${e.extras.length>0?e.extras.join(" "):"none"}`,`--microservices ${e.microservices.length>0?e.microservices.join(" "):"none"}`,`--addons ${e.addons.length>0?e.addons.join(" "):"none"}`,e.initGit?"--git":"--no-git"].join(" ")}r(s,"buildReproducibleCommand");function p(e){return{$schema:t.NEST_ARCH_SCHEMA_URL,addons:e.addons,api:e.api,architecture:e.architecture,auth:e.auth,createdAt:new Date().toISOString(),database:e.database,description:e.description,extras:e.extras,httpProvider:e.httpProvider,initGit:e.initGit,microservices:e.microservices,orm:e.orm,packageManager:e.packageManager,projectName:e.projectName,projectType:e.projectType,reproducibleCommand:s(e),version:t.NEST_ARCH_VERSION}}r(p,"buildMetadata");function o(e){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(`
1
+ var i=Object.defineProperty;var r=(e,a)=>i(e,"name",{value:a,configurable:!0});import{e as t}from"./index-D8EatQzo.js";import"react/jsx-runtime";import"ink";import"react";import"ink-text-input";import"@t3-oss/env-nextjs";import"zod";import"node:fs";import"node:os";import"node:path";import"node:child_process";import"node:util";import"node:fs/promises";import"handlebars";import"ts-morph";import"open";function s(e){return[`pnpm create nest-arch@latest ${e.projectName}`,`--package-manager ${e.packageManager}`,`--http-provider ${e.httpProvider}`,`--project-type ${e.projectType}`,`--architecture ${e.architecture}`,`--database ${e.database.length>0?e.database.join(" "):"none"}`,`--orm ${e.orm.length>0?e.orm.join(" "):"none"}`,`--api ${e.api.length>0?e.api.join(" "):"none"}`,`--auth ${e.auth}`,`--extras ${e.extras.length>0?e.extras.join(" "):"none"}`,`--microservices ${e.microservices.length>0?e.microservices.join(" "):"none"}`,`--addons ${e.addons.length>0?e.addons.join(" "):"none"}`,e.initGit?"--git":"--no-git"].join(" ")}r(s,"buildReproducibleCommand");function p(e){return{$schema:t.NEST_ARCH_SCHEMA_URL,addons:e.addons,api:e.api,architecture:e.architecture,auth:e.auth,createdAt:new Date().toISOString(),database:e.database,description:e.description,extras:e.extras,httpProvider:e.httpProvider,initGit:e.initGit,microservices:e.microservices,orm:e.orm,packageManager:e.packageManager,projectName:e.projectName,projectType:e.projectType,reproducibleCommand:s(e),version:t.NEST_ARCH_VERSION}}r(p,"buildMetadata");function o(e){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(`
2
2
  `)+JSON.stringify(e,null,2)}
3
3
  `}r(o,"serializeMetadata");function n(){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:["jwt","passport","better-auth","none"]},createdAt:{format:"date-time",type:"string"},database:{items:{enum:["postgresql","mysql","sqlite","mongodb"]},type:"array"},description:{type:"string"},extras:{items:{enum:["docker","health-check","rate-limiting","swagger","packages/shared"]},type:"array"},httpProvider:{enum:["express","fastify"]},initGit:{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"},version:{type:"string"}},required:["version","createdAt","reproducibleCommand","projectName","packageManager","httpProvider","projectType","architecture","database","orm","api","auth","extras","microservices","addons","initGit"],title:"NestArchMetadata",type:"object"},null,2)}
4
4
  `}r(n,"buildSchemaContent");export{p as buildMetadata,n as buildSchemaContent,o as serializeMetadata};
@@ -0,0 +1,50 @@
1
+ var Ct=Object.defineProperty;var p=(t,e)=>Ct(t,"name",{value:e,configurable:!0});import{jsx as i,jsxs as b,Fragment as R}from"react/jsx-runtime";import{Box as f,Text as c,useInput as X,useStdout as Qe,render as xt,useApp as _t}from"ink";import{useState as O,useEffect as le,useRef as Ot,useCallback as w,useMemo as B}from"react";import It from"ink-text-input";import{createEnv as Nt}from"@t3-oss/env-nextjs";import{z as re}from"zod";import{existsSync as Oe,readFileSync as Rt,mkdirSync as Mt,writeFileSync as Dt}from"node:fs";import{homedir as Ye}from"node:os";import M,{join as J}from"node:path";import{execFile as Gt,exec as $t}from"node:child_process";import{promisify as Xe}from"node:util";import F,{readFile as Ie,writeFile as ge}from"node:fs/promises";import D from"handlebars";import"ts-morph";import Lt from"open";const Ze="Nest Arch",fe="v0.1.38",be="The comfy way to build NestJS projects",S="#e54545",P="#A0A0A0",ye="#6B6B6B",I="#E5E5E5",G="#61AFEF",pe="#3A3A3A",Ft="#7FD99A",ve="#E8C468",we="#e96142ff",ue=p(({borderTop:t=!0})=>i(f,{borderStyle:"single",borderBottom:!t,borderLeft:!1,borderRight:!1,borderTop:t,borderColor:pe,height:1,width:"full"}),"Divider"),Ut=` \uFF0Fl\u3001
2
+ \uFF08\uFF9F\uFF64 \uFF61\uFF17
3
+ l\u3001\uFF9E ~\u30FD
4
+ \u3058\u3057(_,)\u30CE
5
+ `,Ne=` ,-. _,---._ __ /\\
6
+ / ) .-' \`./ / \\
7
+ ( ( ,' \` / /|
8
+ \\ \`-" \\'\\ / |
9
+ \`. , \\ \\ / |
10
+ /\`. ,'-\`----Y |
11
+ ( ; | '
12
+ | ,-. ,-' Angel's | /
13
+ | | ( | Stuff | /
14
+ ) | \\ \`.___________|/
15
+ \`--' \`--'
16
+ `,zt=p(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"),et=p(t=>{let e=0;for(const r of t){const s=r.codePointAt(0)??0;e+=zt(s)?2:1}return e},"getDisplayWidth"),Ht=2,tt=[0,1,2,3,2,1],rt=["",".","..","..."],st=p(({message:t,isError:e})=>{const[r,s]=O(0),[o,n]=O(0);le(()=>{const h=setInterval(()=>{s(j=>(j+1)%tt.length)},200),y=setInterval(()=>{n(j=>(j+1)%rt.length)},400);return()=>{clearInterval(h),clearInterval(y)}},[]);const a=Ut.trimEnd().split(`
17
+ `),l=Math.max(...a.map(et)),u=tt[r];return b(f,{flexDirection:"column",paddingX:2,children:[i(f,{flexDirection:"column",children:a.map((h,y)=>{const j=et(h),k=y===0||y===a.length-1,N=l-j+Ht-(k?1:0),v=y===u;return b(c,{color:S,children:[h," ".repeat(N),v?i(c,{color:ve,children:"\u25CF"}):" "]},y)})}),b(c,{color:e?I:P,children:[t,e?"":rt[o]]})]})},"ScaffoldingAnimation"),Re=p(({action:t="select",showBack:e=!1})=>b(c,{children:[t==="select"||t==="multi-select"?i(c,{color:P,children:"Use \u2191/\u2193 to navigate \u2022 "}):null,i(c,{color:P,children:t==="confirm"?b(R,{children:[i(c,{color:I,children:"Enter "}),"to confirm"]}):t==="multi-select"?b(R,{children:[i(c,{color:I,children:"Space "}),"to toggle \u2022",i(c,{color:I,children:" Enter "}),"to confirm"]}):b(R,{children:[i(c,{color:I,children:"Enter "}),"to select"]})}),b(c,{color:P,children:[e?b(R,{children:[" ","\u2022",i(c,{color:I,children:" Ctrl+B "}),"to go back"]}):"",b(R,{children:[" ","\u2022",i(c,{color:I,children:" Ctrl+C "}),"to exit"]})]})]}),"StatusBar"),nt=p(({architecture:t,projectName:e,packageManager:r,isGitInitialized:s,outputDir:o})=>i(f,{flexDirection:"column",children:b(f,{flexDirection:"column",marginTop:1,children:[i(c,{color:Ft,bold:!0,children:"\u2714 Project scaffold completed successfully!"}),b(f,{marginTop:1,children:[i(c,{color:I,children:"Project: "}),i(c,{color:G,bold:!0,children:e})]}),b(f,{children:[i(c,{color:I,children:"Architecture: "}),i(c,{color:G,bold:!0,children:t})]}),o?b(f,{children:[i(c,{color:I,children:"Location: "}),i(c,{color:G,bold:!0,children:o})]}):null,s?i(f,{marginTop:1,children:i(c,{color:P,children:"Git repository initialized"})}):null,b(f,{flexDirection:"column",borderStyle:"round",borderColor:S,paddingX:2,paddingY:1,marginTop:1,width:void 0,children:[i(c,{color:I,bold:!0,children:"\u{1F680} NEXT STEPS"}),i(f,{height:1}),i(c,{color:I,children:"1. Move into the project directory:"}),i(c,{color:G,bold:!0,children:` cd ${e}`}),i(f,{height:1}),i(c,{color:I,children:"2. Install dependencies:"}),i(c,{color:G,bold:!0,children:` ${r} install`}),i(f,{height:1}),i(c,{color:I,children:"3. Start development server:"}),i(c,{color:G,bold:!0,children:` ${r} run dev`})]}),i(f,{marginTop:1,children:i(c,{color:P,children:"(Press enter to exit)"})})]})}),"DoneStep"),Wt=100,je=p(t=>{const e=Ot(0);X((r,s)=>{if(s.upArrow||s.downArrow||s.leftArrow||s.rightArrow||r==="k"||r==="j"||r==="h"||r==="l"){const n=Date.now();if(n-e.current<Wt)return;e.current=n}t(r,s)})},"useArrowSelect"),q=p(({initialSelected:t,onConfirm:e,options:r,prompt:s,minified:o=!1})=>{const[n,a]=O(0),[l,u]=O(t);le(()=>{u(t),a(0)},[t]);const h=w(A=>l.includes(A),[l]),y=w(A=>{const E=r[A];E&&u(T=>T.includes(E.value)?T.filter(H=>H!==E.value):[...T,E.value])},[r]),j=w(()=>{e(l)},[e,l]),k=r.length>16,N=k?Math.ceil(r.length/2):r.length;je((A,E)=>{E.upArrow||A==="k"?a(T=>(T-1+r.length)%r.length):E.downArrow||A==="j"?a(T=>(T+1)%r.length):k&&(E.leftArrow||A==="h")?a(T=>(T-N+r.length)%r.length):k&&(E.rightArrow||A==="l")?a(T=>(T+N)%r.length):E.return?j():(A===" "||A==="x")&&y(n)});const v=l.length,W=p((A,E)=>{const T=h(A.value),H=E===n,K=T?"\u25CF":"\u25CB";return b(f,{flexDirection:"column",children:[i(c,{children:H?b(R,{children:[i(c,{color:S,children:"> "}),i(c,{color:T?S:P,children:`${K} `}),i(c,{color:T?S:I,children:A.label})]}):b(R,{children:[i(c,{color:T?S:P,children:` ${K}`}),i(c,{color:ye,children:` ${A.label}`})]})}),H&&!o?i(c,{color:P,children:A.description}):null]},A.value)},"renderOption");let $;return k||($=o?0:1),b(f,{flexDirection:"column",children:[i(c,{color:P,children:s}),i(c,{color:ve,children:v===0?"No options selected yet \u2014 pick what you need":`${v} selected`}),i(f,{marginTop:1,flexDirection:k?"row":"column",rowGap:$,columnGap:k?4:void 0,overflow:"hidden",children:k?b(R,{children:[i(f,{flexDirection:"column",rowGap:o?0:1,flexGrow:1,flexBasis:0,children:r.slice(0,N).map((A,E)=>W(A,E))}),i(f,{flexDirection:"column",rowGap:o?0:1,flexGrow:1,flexBasis:0,children:r.slice(N).map((A,E)=>W(A,E+N))})]}):r.map((A,E)=>W(A,E))})]})},"MultiSelectStep"),it="my-nest-app",at=64,Bt=/^[a-z][a-z0-9-]*$/u;function Z(t){return t.trim()||it}p(Z,"resolveProjectName");function ke(t){const e=t.trim();return e?e.length>at?`Project name must be at most ${at} characters`:Bt.test(e)?null:"Use lowercase letters, numbers, and hyphens; must start with a letter":null}p(ke,"validateProjectName");const ot=p(({error:t,onChange:e,onSubmit:r,value:s})=>(X((o,n)=>{n.return&&r()}),b(f,{flexDirection:"column",children:[i(c,{color:P,children:"Enter a name for your project"}),b(f,{marginTop:1,flexDirection:"row",alignItems:"center",columnGap:1,children:[i(c,{color:I,children:"Project name:"}),i(It,{placeholder:it,value:s,onChange:e})]}),t?i(c,{color:S,children:t}):null]})),"ProjectNameStep"),V=p(({onConfirm:t,options:e,prompt:r})=>{const[s,o]=O(0),n=w(()=>{const a=e[s];a&&t(a.value)},[t,e,s]);return je((a,l)=>{l.upArrow||a==="k"?o(u=>(u-1+e.length)%e.length):l.downArrow||a==="j"?o(u=>(u+1)%e.length):l.return&&n()}),b(f,{flexDirection:"column",children:[i(c,{color:P,children:r}),i(f,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((a,l)=>{const u=l===s;return b(f,{flexDirection:"column",children:[i(c,{children:u?b(R,{children:[i(c,{color:S,children:"> "}),i(c,{color:S,children:a.label})]}):i(c,{color:ye,children:` ${a.label}`})}),u?i(c,{color:P,children:a.description}):null]},a.value)})})]})},"SingleSelectStep"),ct=[{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"}],Me=[{description:"The modern, all-in-one toolchain written in Rust",label:"Biome",value:"biome"},{description:"The most mature and comprehensive linting ecosystem",label:"ESLint + Prettier",value:"eslint-prettier"},{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"}],lt=[{description:"Default NestJS HTTP adapter",label:"Express",value:"express"},{description:"High-performance HTTP adapter",label:"Fastify",value:"fastify"}],pt=[{description:"Standalone NestJS application",label:"Single project",value:"single"},{description:"Multiple apps and shared packages",label:"Monorepo (Turborepo)",value:"monorepo"}],ut=[{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"}],dt=[{description:"Relational database with strong ecosystem",label:"PostgreSQL",value:"postgresql"},{description:"Popular relational database",label:"MySQL",value:"mysql"},{description:"Embedded database for local development",label:"SQLite",value:"sqlite"},{description:"Document database",label:"MongoDB",value:"mongodb"}],De=[{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 (not available with MongoDB)",label:"Drizzle",value:"drizzle"}],mt=[{description:"RESTful HTTP endpoints",label:"REST",value:"rest"},{description:"End-to-end typesafe APIs",label:"tRPC",value:"trpc"},{description:"GraphQL schema and resolvers",label:"GraphQL",value:"graphql"}],ht=[{description:"No authentication scaffolding",label:"None",value:"none"},{description:"JSON Web Token authentication",label:"JWT",value:"jwt"},{description:"Flexible authentication middleware",label:"Passport",value:"passport"},{description:"Modern auth library integration",label:"Better Auth",value:"better-auth"}],Ge=[{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"}],$e=[{description:"Cursor agent skills library (.agents/skills)",label:"Agent Skills",value:"agent-skills"},{description:"Git hooks for pre-commit checks",label:"Husky",value:"husky"},{description:"Configurate ultracite for your developer tools",label:"Ultracite",value:"ultracite"},{description:"Zod-based DTO validation",label:"NestJS-Zod",value:"nestjs-zod"},{description:"Modern OpenAPI documentation UI",label:"Scalar UI (Recommended)",value:"scalar-ui"}],Jt=[{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"}],gt=[{description:"Run git init and create initial commit",label:"Yes",value:"yes"},{description:"Skip git initialization",label:"No",value:"no"}],qt=[{description:"Write .vscode/settings.json for every VS Code-based editor",label:"Universal",value:"universal"},{description:"Antigravity code editor",label:"Antigravity",value:"antigravity"},{description:"Bob code editor",label:"Bob",value:"bob"},{description:"CodeBuddy code editor",label:"CodeBuddy",value:"codebuddy"},{description:"Cursor AI code editor",label:"Cursor",value:"cursor"},{description:"Kiro AI IDE",label:"Kiro",value:"kiro"},{description:"Trae AI IDE",label:"Trae",value:"trae"},{description:"Visual Studio Code",label:"VS Code",value:"vscode"},{description:"Windsurf AI code editor",label:"Windsurf",value:"windsurf"},{description:"Void code editor",label:"Void",value:"void"},{description:"Zed code editor",label:"Zed",value:"zed"}],Vt=[{description:"Configure for all AI agents",label:".agents (Universal)",value:"universal"},{description:"Adal AI",label:"Adal",value:"adal"},{description:"Aider AI",label:"Aider",value:"aider"},{description:"Amazon Q CLI",label:"Amazon Q",value:"amazon-q-cli"},{description:"Amp AI",label:"Amp",value:"amp"},{description:"Augment Code",label:"Augment",value:"augmentcode"},{description:"Anthropic Claude",label:"Claude",value:"claude"},{description:"Cline AI",label:"Cline",value:"cline"},{description:"OpenAI Codex",label:"Codex",value:"codex"},{description:"GitHub Copilot",label:"Copilot",value:"copilot"},{description:"Continue AI",label:"Continue",value:"continue"},{description:"Crush AI",label:"Crush",value:"crush"},{description:"Cursor CLI",label:"Cursor CLI",value:"cursor-cli"},{description:"DeepAgents AI",label:"DeepAgents",value:"deepagents"},{description:"Devin AI",label:"Devin",value:"devin"},{description:"Droid AI",label:"Droid",value:"droid"},{description:"Firebender AI",label:"Firebender",value:"firebender"},{description:"Firebase Studio",label:"Firebase Studio",value:"firebase-studio"},{description:"Google Gemini",label:"Gemini",value:"gemini"},{description:"Goose AI",label:"Goose",value:"goose"},{description:"JetBrains Junie",label:"Junie",value:"junie"},{description:"Google Jules",label:"Jules",value:"jules"},{description:"Kilo Code",label:"Kilo Code",value:"kilo-code"},{description:"Kimi CLI",label:"Kimi CLI",value:"kimi-cli"},{description:"Lovable AI",label:"Lovable",value:"lovable"},{description:"MCPJam AI",label:"MCPJam",value:"mcpjam"},{description:"Mistral Vibe",label:"Mistral Vibe",value:"mistral-vibe"},{description:"Mux AI",label:"Mux",value:"mux"},{description:"Ona AI",label:"Ona",value:"ona"},{description:"OpenClaw AI",label:"OpenClaw",value:"openclaw"},{description:"OpenCode AI",label:"OpenCode",value:"opencode"},{description:"OpenHands AI",label:"OpenHands",value:"open-hands"},{description:"Pi AI",label:"Pi",value:"pi"},{description:"Qoder AI",label:"Qoder",value:"qoder"},{description:"Qwen AI",label:"Qwen",value:"qwen"},{description:"Replit AI",label:"Replit",value:"replit"},{description:"Roo Code",label:"Roo Code",value:"roo-code"},{description:"Snowflake Cortex",label:"Snowflake Cortex",value:"snowflake-cortex"},{description:"Vercel AI",label:"Vercel",value:"vercel"},{description:"Warp AI",label:"Warp",value:"warp"},{description:"Zencoder AI",label:"Zencoder",value:"zencoder"}],Kt=[{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"}],Qt=[{description:"Install the reusable Ultracite skill after setup",label:"Yes",value:"yes"},{description:"Skip installing the Ultracite skill",label:"No",value:"no"}],Yt={addons:"Addons",apiLayer:"API layer",architecture:"Architecture",auth:"Authentication",database:"Database",done:"Done",extras:"Extras",formatter:"Formatter",httpProvider:"HTTP provider",initGit:"Git repository",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",ultraciteSetup:"Ultracite setup"},Xt=["projectName","packageManager","formatter","httpProvider","projectType","architecture","database","orm","apiLayer","auth","extras","microservices","addons","ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill","initGit","summary","ultraciteSetup","installing","done"];function Zt(t){return t.includes("mongodb")}p(Zt,"databaseIncludesMongodb");function er(t){return t.length===0}p(er,"databaseIsEmpty");function Se(t){return er(t)}p(Se,"shouldSkipOrmStep");function de(t){return Xt.filter(e=>!(e==="orm"&&Se(t.database)||e==="microservices"&&t.architecture!=="nest-gateway"||(e==="ultraciteEditors"||e==="ultraciteAgents"||e==="ultraciteHooks"||e==="ultraciteInstallSkill"||e==="ultraciteSetup")&&(!t.addons.includes("ultracite")||t.formatter==="none")))}p(de,"getVisibleSteps");const ft=["ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill"];function me(t){return ft.includes(t)}p(me,"isUltraciteSubStep");function tr(t,e){if(!me(t))return null;const r=ft.filter(l=>de(e).includes(l)),s=r.indexOf(t);if(s===-1)return null;const o=r.length,n=s+1,a=Math.round(n/o*100);return{current:n,percent:a,total:o}}p(tr,"getUltraciteSubStepInfo");function bt(t){return de(t).filter(e=>!(e==="installing"||e==="done"||me(e))).length+(t.addons.includes("ultracite")?1:0)}p(bt,"getTotalSteps");function rr(t,e){const r=de(e).filter(n=>n!=="installing"&&n!=="done");if(t==="installing"||t==="done")return bt(e);if(me(t)){const n=r.indexOf("addons");return n===-1?1:n+1}const o=r.filter(n=>!me(n)).indexOf(t);return o===-1?1:o+1}p(rr,"getDisplayStepNumber");function sr(t,e){const r=de(e),s=r.indexOf(t);return s===-1||s>=r.length-1?null:r[s+1]??null}p(sr,"getNextStepId");function nr(t,e){const r=de(e),s=r.indexOf(t);return s<=0?null:r[s-1]??null}p(nr,"getPreviousStepId");function ir(t){return t==="monorepo"?ut:ut.filter(e=>e.value!=="nest-gateway")}p(ir,"filterArchitectureOptions");function yt(t){return Zt(t)?De.filter(e=>e.value!=="drizzle"):De}p(yt,"filterOrmOptions");function vt(t){return"nest-api"}p(vt,"defaultArchitecture");function wt(t,e){if(Se(e))return[];const r=new Set(yt(e).map(s=>s.value));return t.filter(s=>r.has(s))}p(wt,"sanitizeOrmForDatabase");function se(t,e){return t.find(r=>r.value===e)?.label??e}p(se,"labelFor$1");function ne(t,e){return e.length===0?"None":e.map(r=>se(t,r)).join(", ")}p(ne,"labelsFor");const ar=p(({onConfirm:t,state:e})=>{X((o,n)=>{n.return&&t()});const r={"nest-api":"NestJS API","nest-gateway":"NestJS API Gateway","nest-microservice":"NestJS Microservice"},s=[{label:"Project",value:Z(e.projectName)},{label:"Package manager",value:e.packageManager?se(ct,e.packageManager):"\u2014"},{label:"Formatter",value:e.formatter?se(Me,e.formatter):"\u2014"},{label:"HTTP provider",value:e.httpProvider?se(lt,e.httpProvider):"\u2014"},{label:"Project type",value:e.projectType?se(pt,e.projectType):"\u2014"},{label:"Architecture",value:e.architecture?r[e.architecture]??e.architecture:"\u2014"},{label:"Database",value:ne(dt,e.database)}];return Se(e.database)||s.push({label:"ORM",value:ne(De,e.orm)}),s.push({label:"API layer",value:ne(mt,e.api)}),e.architecture==="nest-gateway"&&s.push({label:"Microservices",value:ne([{label:"Redis",value:"redis"},{label:"MQTT",value:"mqtt"},{label:"NATS",value:"nats"},{label:"RabbitMQ",value:"rabbitmq"},{label:"Kafka",value:"kafka"},{label:"gRPC",value:"grpc"}],e.microservices)}),s.push({label:"Auth",value:e.auth?se(ht,e.auth):"\u2014"},{label:"Extras",value:ne(Ge,e.extras)},{label:"Addons",value:ne($e,e.addons)},{label:"Git",value:e.initGit==="yes"?"Initialize repository":"Skip"}),b(R,{children:[i(f,{flexDirection:"column",marginBottom:1,children:b(c,{children:[i(c,{color:S,children:"\u2726 "}),i(c,{color:G,children:"Review your selections"})]})}),i(f,{flexDirection:"column",rowGap:1,overflow:"hidden",children:s.map(o=>b(f,{flexDirection:"row",columnGap:1,children:[i(c,{color:we,children:`${o.label}:`}),i(c,{color:ve,children:o.value})]},o.label))})]})},"SummaryStep");function or(t,e){return t.find(r=>r.value===e)?.label??e}p(or,"labelFor");const cr=p(({onConfirm:t,state:e})=>{X((n,a)=>{a.return&&t()});const r=(()=>{switch(e.formatter){case"biome":return"biome";case"eslint-prettier":return"eslint";default:return"oxlint"}})(),s=[];e.addons.includes("husky")&&s.push("husky");const o=[{label:"Linter",value:`${r} (from ${or(Me,e.formatter??"oxlint-oxfmt")})`},{label:"Package manager",value:e.packageManager??"pnpm"},{label:"Frameworks",value:"nestjs"},{label:"Integrations",value:s.length>0?s.join(", "):"none"},{label:"Flags",value:"--quiet"}];return b(R,{children:[b(f,{flexDirection:"column",marginBottom:1,children:[b(c,{children:[i(c,{color:S,children:"\u2726 "}),i(c,{color:G,children:"Ultracite Configuration"})]}),i(c,{color:we,children:"The following configuration will be applied:"})]}),b(f,{flexDirection:"column",rowGap:1,overflow:"hidden",children:[o.map(n=>b(f,{flexDirection:"row",columnGap:1,children:[i(c,{color:we,children:`${n.label}:`}),i(c,{color:ve,children:n.value})]},n.label)),i(f,{marginTop:1,children:b(c,{color:we,children:["Command: npx ultracite init --quiet --pm ",e.packageManager," ","--linter ",r," --frameworks nestjs",s.length>0?` --integrations ${s.join(",")}`:""]})})]})]})},"UltraciteSetupStep"),Le=Nt({emptyStringAsUndefined:!0,runtimeEnv:process.env,server:{APP_MAX_WIDTH:re.string().pipe(re.coerce.number()).default(95),NEST_ARCH_BETA_MODE:re.enum(["true","false"]).default("false").transform(t=>t==="true"),NEST_ARCH_SCHEMA_URL:re.string().default("./schema.json"),NEST_ARCH_VERSION:re.string().default("0.0.1"),NODE_ENV:re.enum(["development","production","test"]).default("development")}});function Fe(t){return t.length===0?"\u2014":t.join(", ")}p(Fe,"formatList");const lr=p(({state:t,stepId:e})=>{const r=[];if(e!=="projectName"&&t.projectName.trim()&&r.push(Z(t.projectName)),t.packageManager&&r.push(t.packageManager),t.httpProvider&&r.push(t.httpProvider),t.projectType&&r.push(t.projectType==="monorepo"?"Monorepo":"Single"),t.architecture){const n={"nest-api":"Nest API","nest-gateway":"API Gateway","nest-microservice":"Microservice"};r.push(n[t.architecture]??t.architecture)}if(t.database.length>0&&r.push(Fe(t.database)),t.orm.length>0&&r.push(Fe(t.orm)),t.api.length>0&&r.push(Fe(t.api)),t.auth&&r.push(t.auth),t.extras.length>0&&r.push(`+${t.extras.length} extras`),t.addons.length>0&&!me(e)&&r.push(`+${t.addons.length} addons`),t.initGit&&r.push(t.initGit==="yes"?"git init":"no git"),r.length===0)return b(c,{children:[i(c,{color:S,children:"\u25C6 "}),i(c,{color:S,children:"Create a new NestJS project"})]});const[s,...o]=r;return b(R,{children:[b(c,{children:[i(c,{color:S,children:"\u25C6 "}),i(c,{color:S,children:"Create a new NestJS project"})]}),e!=="summary"&&i(f,{borderStyle:"single",borderColor:pe,width:Le.APP_MAX_WIDTH,children:b(c,{children:[i(c,{children:"Project Name: "}),i(c,{color:S,children:s}),i(c,{color:P,children:" Selected: "}),o.length>0?i(c,{color:P,children:`${o.filter(n=>n!=="none").join(" \xB7 ")}`}):null]})})]})},"WizardContextBar"),pr=p(({displayStep:t,stepId:e,subProgress:r,totalSteps:s})=>b(f,{paddingLeft:2,paddingTop:e==="summary"?2:1,marginBottom:1,children:[i(c,{color:I,children:"Create project"}),i(c,{color:P,children:` \u2014 step ${t}/${s}`}),r?i(c,{color:G,children:` \xB7 Ultracite configuration (${r.current}/${r.total} \xB7 ${r.percent}%)`}):i(c,{color:G,children:` \xB7 ${Yt[e]}`})]}),"WizardTitle$1"),Ue=J(Ye(),".nestarch"),ze=J(Ue,"last-used.json");function ur(){try{if(!Oe(ze))return null;const t=Rt(ze,"utf-8");return JSON.parse(t)}catch{return null}}p(ur,"getLastUsedConfig");function jt(t){try{Oe(Ue)||Mt(Ue,{recursive:!0}),Dt(ze,JSON.stringify(t,null,2),"utf-8")}catch{}}p(jt,"saveLastUsedConfig");function dr(t){const e=[t.packageManager];t.httpProvider&&e.push(t.httpProvider),t.api.length>0&&e.push(t.api.join(", ")),t.projectType&&e.push(t.projectType);const r=new Date,s=r.toLocaleString("en-US",{month:"short"}),o=r.getDate(),n=r.getFullYear(),a=`${s} ${o}, ${n}`;return`${e.join(", ")} (last used ${a})`}p(dr,"buildLastUsedDescription");class Ke{static{p(this,"TemplateEngine")}cache={};cacheEnabled;templatesDir;constructor(e,r={}){this.templatesDir=e,this.cacheEnabled=r.cache??!0,Ke.registerHelpers(r.helpers)}static registerHelpers(e){if(D.registerHelper("eq",(r,s)=>r===s),D.registerHelper("ne",(r,s)=>r!==s),D.registerHelper("lt",(r,s)=>r<s),D.registerHelper("gt",(r,s)=>r>s),D.registerHelper("and",(r,s)=>r&&s),D.registerHelper("or",(r,s)=>r||s),D.registerHelper("uppercase",r=>r?.toUpperCase?.()),D.registerHelper("lowercase",r=>r?.toLowerCase?.()),D.registerHelper("capitalize",r=>r?r.charAt(0).toUpperCase()+r.slice(1):""),D.registerHelper("camelCase",r=>r?.split("-").map((s,o)=>o===0?s.toLowerCase():s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()).join("")),D.registerHelper("pascalCase",r=>r?.split("-").map(s=>s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()).join("")),D.registerHelper("snakeCase",r=>r?.replaceAll(/([A-Z])/gu,"_$1").toLowerCase()),e)for(const[r,s]of Object.entries(e))D.registerHelper(r,s)}async loadTemplate(e){const r=e;if(this.cacheEnabled&&this.cache[r])return this.cache[r];const s=M.join(this.templatesDir,e),o=await F.readFile(s,"utf-8"),n=D.compile(o);return this.cacheEnabled&&(this.cache[r]=n),n}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 mr{static{p(this,"FileWriter")}baseDir;writtenFiles=new Set;constructor(e){this.baseDir=e}getBaseDir(){return this.baseDir}async writeFile(e,r={}){const s=M.join(this.baseDir,e.filePath),o=M.dirname(s);try{await F.mkdir(o,{recursive:!0});let n=!1;try{await F.stat(s),n=!0}catch{n=!1}if(n&&!r.overwrite)return{backed:!1,error:"File already exists and overwrite is disabled",filePath:s,written:!1};let a=!1;if(n&&r.createBackups&&!r.dryRun){const l=`${s}.bak`;await F.copyFile(s,l),a=!0}return r.dryRun||(await F.writeFile(s,e.content,"utf-8"),this.writtenFiles.add(s)),{backed:a,filePath:s,written:!r.dryRun}}catch(n){return{backed:!1,error:n instanceof Error?n.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=M.join(this.baseDir,e);try{return await F.stat(r),!0}catch{return!1}}getWrittenFiles(){return[...this.writtenFiles]}clearWrittenFiles(){this.writtenFiles.clear()}async copyDirectory(e,r){const s=[],o=M.join(this.baseDir,e),n=M.join(this.baseDir,r);await F.mkdir(n,{recursive:!0});const a=await F.readdir(o,{withFileTypes:!0});for(const l of a){const u=M.join(o,l.name),h=M.join(n,l.name);if(l.isDirectory()){const y=await this.copyDirectory(M.relative(this.baseDir,u),M.relative(this.baseDir,h));s.push(...y)}else{const y=await F.readFile(u,"utf-8");await F.writeFile(h,y,"utf-8"),s.push(h),this.writtenFiles.add(h)}}return s}}const He=Xe(Gt);class hr{static{p(this,"GitInitializer")}baseDir;constructor(e){this.baseDir=e}async initGit(){try{const e=M.join(this.baseDir,".git");try{return await F.access(e),{success:!0}}catch{}return await He("git",["init"],{cwd:this.baseDir}),await He("git",["add","."],{cwd:this.baseDir}),await He("git",["commit","-m","init"],{cwd:this.baseDir}),{success:!0}}catch(e){return{error:e instanceof Error?e.message:String(e),success:!1}}}}class gr{static{p(this,"TemplateRegistry")}templates=new Map;groups=new Map;registerTemplate(e){this.templates.set(e.id,e)}registerTemplates(e){for(const r of e)this.registerTemplate(r)}registerGroup(e){this.groups.set(e.id,e);for(const r of e.templates)this.registerTemplate(r)}getTemplate(e){return this.templates.get(e)}getGroup(e){return this.groups.get(e)}getAllTemplates(){return[...this.templates.values()]}getAllGroups(){return[...this.groups.values()]}getTemplatesByGroup(e){return this.groups.get(e)?.templates||[]}getTemplatesByFormat(e){return[...this.templates.values()].filter(r=>r.format===e)}async loadFromDirectory(e,r){const s=[];try{const o=await F.readdir(e,{withFileTypes:!0});for(const n of o){if(!n.isFile())continue;const{name:a}=n,l=M.extname(a);if(l===".hbs"){const u=M.basename(a,l),h={description:`Template: ${u}`,format:"handlebars",id:u,name:u.replaceAll(/[-_]/gu," "),optional:a.startsWith("_"),path:M.join(M.relative(M.dirname(e),e),a)};s.push(h),this.registerTemplate(h)}}if(r&&s.length>0){const n={description:`Templates from ${e}`,id:r,name:r,templates:s};this.registerGroup(n)}}catch(o){console.error(`Failed to load templates from ${e}:`,o)}return s}clear(){this.templates.clear(),this.groups.clear()}getStats(){return{groupCount:this.groups.size,templateCount:this.templates.size}}}function x(t,e,r){const s="[ultracite-inject]";if(r){const o=r instanceof Error?r.message:String(r);console.error(`${s} ${t}: ${e} \u2014 ${o}`)}else console.error(`${s} ${t}: ${e}`)}p(x,"log");const We={biome:{complexity:{noStaticOnlyClass:"off",noUselessConstructor:"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/consistent-type-imports":"off","typescript/no-extraneous-class":"off","typescript/parameter-properties":"off","unicorn/no-static-only-class":"off","vitest/consistent-test-filename":"off"}};async function fr(t){const e=J(t,"oxlint.config.ts");let r;try{r=await Ie(e,"utf-8"),x("read",`Read ${e}`)}catch(n){x("error",`Cannot read ${e}`,n);return}let s=r;/import vitest from "ultracite\/oxlint\/vitest"/u.test(r)||(s=s.replace(/(import nestjs from "ultracite\/oxlint\/nestjs";)/u,`$1
18
+ import vitest from "ultracite/oxlint/vitest";`),x("add-import","Added vitest import"));const o=Object.entries(We.oxlint).map(([n,a])=>{const l=Array.isArray(a)?JSON.stringify(a):`"${a}"`;return` "${n}": ${l}`}).join(`,
19
+ `);s=s.replace(/export default defineConfig\(\{([\s\S]*?)\}\);/u,(n,a)=>{const l=a.includes("vitest"),u=a.includes("ignorePatterns"),h=a.includes("rules:");let y=a;return l||(y=y.replace(/(extends:\s*\[[\s\S]*?)(\],)/u,`$1 vitest,
20
+ $2`),x("add-extends","Added vitest to extends array")),u||(y=y.replace(/(extends:\s*\[[\s\S]*?\],?)/u,`$1
21
+ ignorePatterns: core.ignorePatterns,`),x("add-ignorePatterns","Added ignorePatterns")),h||(y=`${y} rules: {
22
+ ${o},
23
+ },
24
+ `,x("add-rules","Added custom NestJS rules")),`export default defineConfig({${y}});`});try{await ge(e,s,"utf-8"),x("write",`Written ${e}`)}catch(n){x("error",`Cannot write ${e}`,n)}}p(fr,"injectOxlintRules");async function br(t){const e=J(t,"biome.jsonc");let r;try{r=await Ie(e,"utf-8"),x("read",`Read ${e}`)}catch(a){x("error",`Cannot read ${e}`,a);return}const s=We.biome,o=r.includes('"linter"'),n=r.includes('"rules"');if(o&&n){const a=Object.entries(s).flatMap(([u,h])=>Object.entries(h).map(([y,j])=>` "${u}": {
25
+ "${y}": "${j}"
26
+ }`)).join(`,
27
+ `),l=r.replace(/("linter"\s*:\s*\{[\s\S]*?"rules"\s*:\s*\{)([\s\S]*?)(\})/u,(u,h,y,j)=>{const k=y.trim().endsWith(",")?"":",";return`${h}${y}${k}
28
+ ${a}
29
+ ${j}`});try{await ge(e,l,"utf-8"),x("write",`Written ${e} (existing linter block)`)}catch(u){x("error",`Cannot write ${e}`,u)}}else{const l=` "linter": {
30
+ "rules": {
31
+ ${Object.entries(s).map(([h,y])=>{const j=Object.entries(y).map(([k,N])=>` "${k}": "${N}"`).join(`,
32
+ `);return` "${h}": {
33
+ ${j}
34
+ }`}).join(`,
35
+ `)}
36
+ }
37
+ }`,u=r.replace(/(\}\s*)$/u,h=>`,
38
+ ${l}
39
+ ${h}`);try{await ge(e,u,"utf-8"),x("write",`Written ${e} (new linter block)`)}catch(h){x("error",`Cannot write ${e}`,h)}}}p(br,"injectBiomeRules");async function yr(t){const e=J(t,"eslint.config.mjs");let r;try{r=await Ie(e,"utf-8"),x("read",`Read ${e}`)}catch(n){x("error",`Cannot read ${e}`,n);return}if(r.includes("rules:")){x("skip","Rules already present in eslint.config.mjs");return}const s=Object.entries(We.eslint).map(([n,a])=>{const l=Array.isArray(a)?JSON.stringify(a):`"${a}"`;return` "${n}": ${l}`}).join(`,
40
+ `),o=r.replace(/\];?$/u,` {
41
+ rules: {
42
+ ${s},
43
+ },
44
+ },
45
+ ];`);try{await ge(e,o,"utf-8"),x("write",`Written ${e}`)}catch(n){x("error",`Cannot write ${e}`,n)}}p(yr,"injectEslintRules");async function vr(t,e){switch(x("start",`Injecting rules for formatter: ${e}`),e){case"oxlint-oxfmt":return await fr(t),x("done","Oxlint configuration updated"),{success:!0};case"biome":return await br(t),x("done","Biome configuration updated"),{success:!0};case"eslint-prettier":return await yr(t),x("done","ESLint configuration updated"),{success:!0};default:return x("skip",`No injection for formatter: ${e}`),{message:"No injection needed",success:!0}}}p(vr,"injectUltraciteRules");const wr="single-project/architecture/nest-api",jr="single-project/architecture/nest-gateway",kr="single-project/architecture/nest-microservice",Sr="monorepo/root",Ar="monorepo/apps/api-gateway",Er="monorepo/packages",Pr="addons/husky",Tr="extras/docker",Cr="extras/swagger",xr=[{conditions:{architecture:"nest-api",projectType:"single"},id:"single-nest-api",name:"Single NestJS API",priority:10,templateGroups:[wr]},{conditions:{architecture:"nest-gateway",projectType:"single"},id:"single-nest-gateway",name:"Single NestJS Gateway",priority:10,templateGroups:[jr]},{conditions:{architecture:"nest-microservice",projectType:"single"},id:"single-nest-microservice",name:"Single NestJS Microservice",priority:10,templateGroups:[kr]},{conditions:{projectType:"monorepo"},id:"monorepo-root",name:"Monorepo Root",priority:10,templateGroups:[Sr,Ar,Er]},{conditions:{addons:["husky"]},id:"addon-husky",name:"Husky Git Hooks",priority:5,templateGroups:[Pr]},{conditions:{extras:["docker"]},id:"extra-docker",name:"Docker Support",priority:5,templateGroups:[Tr]},{conditions:{extras:["swagger"]},id:"extra-swagger",name:"Swagger Documentation",priority:5,templateGroups:[Cr]}];function _r(t){t.registerAll(xr)}p(_r,"initializeTemplateMappings");class Ee{static{p(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)Ee.matches(a.conditions,e)&&r.push(a);const s=[],o={},n=[];for(const a of r){for(const l of a.templateGroups)s.includes(l)||s.push(l);Object.assign(o,a.extraVariables),n.push(a.id)}return{extraVariables:o,matchedMappings:n,templateGroups:s}}findFirst(e){return this.mappings.find(r=>Ee.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 Or(t){return t.replaceAll(/([a-z])([A-Z])/gu,"$1-$2").replaceAll(/\s+/gu,"-").toLowerCase()}p(Or,"toKebabCase");function Ir(t){return t.replaceAll(/[-_\s](.)/gu,(e,r)=>r.toUpperCase()).replace(/^(.)/u,e=>e.toLowerCase())}p(Ir,"toCamelCase");function Nr(t){return t.replaceAll(/[-_\s](.)/gu,(e,r)=>r.toUpperCase()).replace(/^(.)/u,e=>e.toUpperCase())}p(Nr,"toPascalCase");function Rr(t){return{addons:[...t.addons],apiType:t.api[0]??null,apis:[...t.api],architecture:t.architecture,auth:t.auth,databaseType:t.database[0]??null,databases:[...t.database],description:t.description||"A NestJS application",docker:t.extras.includes("docker"),extras:[...t.extras],hasAuth:t.auth!=="none",hasDatabase:t.database.length>0,hasOrm:t.orm.length>0,httpProvider:t.httpProvider,initGit:t.initGit,isBun:t.packageManager==="bun",isMonorepo:t.projectType==="monorepo",isNpm:t.packageManager==="npm",isPnpm:t.packageManager==="pnpm",isSingle:t.projectType==="single",isYarn:t.packageManager==="yarn",microservices:[...t.microservices],ormType:t.orm[0]??null,orms:[...t.orm],packageManager:t.packageManager,projectName:t.projectName,projectNameCamelCase:Ir(t.projectName),projectNameKebab:Or(t.projectName),projectNamePascalCase:Nr(t.projectName),projectType:t.projectType,supportsCatalog:["pnpm","yarn","bun"].includes(t.packageManager),swagger:t.extras.includes("swagger"),year:new Date().getFullYear()}}p(Rr,"buildTemplateVariables");function Mr(t,e){return{...t,...e}}p(Mr,"mergeTemplateExtras");const Dr={name:"@nest-arch/dependencies-reference",version:"0.0.0",private:!0,description:"Single source of truth for dependency versions used across all generated templates. Do not install this package.",dependencies:{"@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.7.13","@nestjs/apollo":"^13.0.0","@nestjs/common":"next","@nestjs/core":"next","@nestjs/graphql":"^13.0.0","@nestjs/jwt":"next","@nestjs/microservices":"next","@nestjs/passport":"next","@nestjs/platform-express":"next","@nestjs/platform-fastify":"next","@nestjs/swagger":"next","@nestjs/terminus":"next","@nestjs/throttler":"next","@nestjs/typeorm":"next","@prisma/client":"^6.5.0","@scalar/nestjs":"^0.3.0","@t3-oss/env-core":"^0.13.11","@trpc/client":"^11.0.0","@trpc/server":"^11.0.0",amqplib:"^0.10.5","apollo-server-express":"^3.13.0","better-auth":"^1.2.0",dotenv:"^17.2.2","drizzle-orm":"^0.41.0",graphql:"^16.10.0",ioredis:"^5.6.0",kafkajs:"^2.2.4",mqtt:"^5.10.0",nats:"^2.28.0","nestjs-zod":"^3.1.0",passport:"^0.7.0","passport-jwt":"^5.0.0","passport-local":"^1.0.0",pg:"^8.13.0","reflect-metadata":"^0.2.2",rxjs:"^7.8.1",typeorm:"^0.3.20",zod:"^4.4.3"},devDependencies:{"@nestjs/cli":"next","@nestjs/schematics":"next","@nestjs/testing":"next","@types/amqplib":"^0.10.6","@types/express":"^5.0.0","@types/node":"^22.13.14","@types/passport-jwt":"^4.0.1","@types/passport-local":"^1.0.38","@types/pg":"^8.11.11","@types/supertest":"^7.0.0","@vitest/coverage-v8":"4.1.6","drizzle-kit":"^0.30.0",husky:"^9.1.7",oxfmt:"^0.52.0",oxlint:"^1.67.0",prisma:"^6.5.0","source-map-support":"^0.5.21",supertest:"^7.0.0",turbo:"^2.8.12",typescript:"^6.0.2",ultracite:"7.8.0",vitest:"^4.1.2"},catalog:{"@types/node":"^22.13.14",dotenv:"^17.2.2",typescript:"^6.0.2",zod:"^4.4.3"}};function kt(){return Dr}p(kt,"loadReference");function m(t){const e=kt(),r=e.dependencies[t]??e.devDependencies[t];if(!r)throw new Error(`Dependency "${t}" not found in reference package.json`);return r}p(m,"getDependencyVersion");function Gr(){return{...kt().catalog}}p(Gr,"getCatalogDependencies");const $r=[{dest:"tsconfig.json",src:"base/tsconfig.json.hbs"},{dest:"tsconfig.build.json",src:"base/tsconfig.build.json.hbs"},{dest:"nest-cli.json",src:"base/nest-cli.json.hbs"},{dest:".gitignore",src:"base/.gitignore.hbs"},{dest:".env",src:"base/.env.hbs"},{dest:"README.md",src:"base/README.md.hbs"},{dest:"vitest.config.ts",src:"base/vitest.config.ts.hbs"},{dest:"vitest.config.e2e.ts",src:"base/vitest.config.e2e.ts.hbs"},{dest:"src/main.ts",src:"base/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"base/src/app.module.ts.hbs"},{dest:"src/app.service.ts",src:"base/src/app.service.ts.hbs"},{dest:"src/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:"src/config/env.ts",src:"single-project/shared/config/env.ts.hbs"},{dest:"test/app.e2e-spec.ts",src:"base/test/app.e2e-spec.ts.hbs"}],Lr={dest:"pnpm-workspace.yaml",src:"base/pnpm-workspace.yaml.hbs"},Fr={dest:".yarnrc.yml",src:"base/.yarnrc.yml.hbs"},Ur=[{dest:".husky/pre-commit",src:"addons/husky/pre-commit.hbs"}],zr=[{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"}],Hr={"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"}]},St=[{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"}],Wr="package.json",Br=[{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.controller.ts",src:"monorepo/apps/api-gateway/src/app.controller.ts.hbs"},{dest:"apps/api-gateway/src/app.service.ts",src:"monorepo/apps/api-gateway/src/app.service.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"},{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"}],Jr=[{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"}],Be={"addons/husky":Ur,"extras/docker":zr,"extras/swagger":[],"monorepo/apps/api-gateway":Br,"monorepo/packages":Jr,"monorepo/root":St};function At(t,e,r){t.auth==="jwt"||t.auth==="passport"?(e["@nestjs/jwt"]=m("@nestjs/jwt"),e["@nestjs/passport"]=m("@nestjs/passport"),e.passport=m("passport"),e["passport-jwt"]=m("passport-jwt"),r["@types/passport-jwt"]=m("@types/passport-jwt"),t.auth==="passport"&&(e["passport-local"]=m("passport-local"),r["@types/passport-local"]=m("@types/passport-local"))):t.auth==="better-auth"&&(e["better-auth"]=m("better-auth"));for(const s of t.orm)s==="prisma"?(e["@prisma/client"]=m("@prisma/client"),r.prisma=m("prisma")):s==="typeorm"?(e.typeorm=m("typeorm"),e["@nestjs/typeorm"]=m("@nestjs/typeorm"),e.pg=m("pg")):s==="drizzle"&&(e["drizzle-orm"]=m("drizzle-orm"),r["drizzle-kit"]=m("drizzle-kit"),e.pg=m("pg"));for(const s of t.api)s==="graphql"?(e["@nestjs/graphql"]=m("@nestjs/graphql"),e["@nestjs/apollo"]=m("@nestjs/apollo"),e.graphql=m("graphql"),e["apollo-server-express"]=m("apollo-server-express")):s==="trpc"&&(e["@trpc/server"]=m("@trpc/server"),e["@trpc/client"]=m("@trpc/client"));t.extras.includes("swagger")&&(e["@nestjs/swagger"]=m("@nestjs/swagger")),t.extras.includes("health-check")&&(e["@nestjs/terminus"]=m("@nestjs/terminus")),t.extras.includes("rate-limiting")&&(e["@nestjs/throttler"]=m("@nestjs/throttler"));for(const s of t.microservices)s==="redis"?e.ioredis=m("ioredis"):s==="mqtt"?e.mqtt=m("mqtt"):s==="nats"?e.nats=m("nats"):s==="rabbitmq"?(e.amqplib=m("amqplib"),r["@types/amqplib"]=m("@types/amqplib")):s==="kafka"?e.kafkajs=m("kafkajs"):s==="grpc"&&(e["@grpc/grpc-js"]=m("@grpc/grpc-js"),e["@grpc/proto-loader"]=m("@grpc/proto-loader"));t.addons.includes("nestjs-zod")&&(e["nestjs-zod"]=m("nestjs-zod")),t.addons.includes("scalar-ui")&&(e["@scalar/nestjs"]=m("@scalar/nestjs"))}p(At,"addConditionalDependencies");async function qr(t,e,r,s,o,n){try{const a=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",l={"@nestjs/common":m("@nestjs/common"),"@nestjs/core":m("@nestjs/core"),[a]:m(a),"@t3-oss/env-core":m("@t3-oss/env-core"),dotenv:m("dotenv"),"reflect-metadata":m("reflect-metadata"),rxjs:m("rxjs"),zod:m("zod")},u={"@nestjs/cli":m("@nestjs/cli"),"@nestjs/schematics":m("@nestjs/schematics"),"@nestjs/testing":m("@nestjs/testing"),"@types/express":m("@types/express"),"@types/node":m("@types/node"),"@types/supertest":m("@types/supertest"),"@vitest/coverage-v8":m("@vitest/coverage-v8"),"source-map-support":m("source-map-support"),supertest:m("supertest"),typescript:m("typescript"),vitest:m("vitest")},h={build:"nest build",dev:"nest start --watch",start:"nest start","start:debug":"nest start --debug --watch","start:dev":"nest start --watch","start:prod":"node dist/main",test:"vitest run","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts","test:watch":"vitest"};At(t,l,u),t.addons.includes("ultracite")&&(u.ultracite=m("ultracite"),h.check="ultracite check",h.fix="ultracite fix"),t.addons.includes("husky")&&(u.husky=m("husky"),h.prepare="husky");const y={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:h,dependencies:l,devDependencies:u},j=JSON.stringify(y,null,2),k=await r.writeFile({content:j,filePath:"package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});k.written&&o.push(k.filePath)}catch(a){const l=a instanceof Error?a.message:String(a);n.push(`Failed to generate package.json: ${l}`),console.error("Failed to generate package.json:",a)}}p(qr,"generateSingleProjectPackageJson");async function Vr(t,e,r,s,o,n){try{const a={build:"turbo build","check-types":"turbo check-types",dev:"turbo dev"},l={"@repo/env":"workspace:*",dotenv:"catalog:",zod:"catalog:"},u={"@repo/config":"workspace:*","@types/node":"catalog:",turbo:m("turbo"),typescript:"catalog:"};t.addons.includes("ultracite")&&(a.check="ultracite check"),t.addons.includes("husky")&&(u.husky=m("husky"),a.prepare="husky");const y={bun:"bun@1.3.14",npm:void 0,pnpm:"pnpm@11.5.0",yarn:"yarn@4.6.0"}[t.packageManager],j={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,workspaces:["apps/*","packages/*"],type:"module",...y?{packageManager:y}:{},...t.packageManager==="bun"?{catalog:Gr()}:{},scripts:a,dependencies:l,devDependencies:u},k=JSON.stringify(j,null,2),N=await r.writeFile({content:k,filePath:Wr,isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});N.written&&o.push(N.filePath)}catch(a){const l=a instanceof Error?a.message:String(a);n.push(`Failed to generate monorepo root package.json: ${l}`),console.error("Failed to generate monorepo root package.json:",a)}}p(Vr,"generateMonorepoRootPackageJson");async function Kr(t,e,r,s,o,n){try{const a=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",l={"@nestjs/common":m("@nestjs/common"),"@nestjs/core":m("@nestjs/core"),[a]:m(a),"@repo/env":"workspace:*","reflect-metadata":m("reflect-metadata"),rxjs:m("rxjs"),zod:"catalog:"},u={"@nestjs/cli":m("@nestjs/cli"),"@nestjs/schematics":m("@nestjs/schematics"),"@nestjs/testing":m("@nestjs/testing"),"@repo/config":"workspace:*","@types/express":m("@types/express"),"@types/node":"catalog:","@types/supertest":m("@types/supertest"),"@vitest/coverage-v8":m("@vitest/coverage-v8"),"source-map-support":m("source-map-support"),supertest:m("supertest"),typescript:"catalog:",vitest:m("vitest")},h={build:"nest build",dev:"nest start --watch",start:"nest start","start:debug":"nest start --debug --watch","start:dev":"nest start --watch","start:prod":"node dist/main",test:"vitest run","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts","test:watch":"vitest"};At(t,l,u),t.addons.includes("ultracite")&&(u.ultracite=m("ultracite"),h.check="ultracite check",h.fix="ultracite fix"),t.addons.includes("husky")&&(u.husky=m("husky"),h.prepare="husky");const y={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:h,dependencies:l,devDependencies:u},j=JSON.stringify(y,null,2),k=await r.writeFile({content:j,filePath:"apps/api-gateway/package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});k.written&&o.push(k.filePath)}catch(a){const l=a instanceof Error?a.message:String(a);n.push(`Failed to generate monorepo app package.json: ${l}`),console.error("Failed to generate monorepo app package.json:",a)}}p(Kr,"generateMonorepoAppPackageJson");class Qr{static{p(this,"ProjectGenerator")}templateEngine;fileWriter;registry;options;mapper;constructor(e,r){this.options=r,this.fileWriter=new mr(e),this.templateEngine=new Ke(r.templatesDir,{cache:r.cacheTemplates??!0}),this.registry=new gr,this.mapper=new Ee,_r(this.mapper)}getMapper(){return this.mapper}async generate(e){const r=Date.now(),s=[],o=[];try{const n=this.mapper.resolve(e);let a=Rr(e);a=Mr(a,n.extraVariables),a.hasUltracite=e.addons.includes("ultracite"),a.hasHusky=e.addons.includes("husky"),await(e.projectType==="monorepo"?this.generateMonorepo(e,a,n.templateGroups,s,o):this.generateSingleProject(e,a,n.templateGroups,s,o));const l=Date.now()-r,u=o.length===0;if(u&&await this.generateMetadata(e,a,s,o),e.initGit){const y=await new hr(this.fileWriter.getBaseDir()).initGit();y.success||o.push(`Failed to initialize git: ${y.error}`)}return console.log(`\u2705 Project generated in ${l}ms`),{error:u&&o.length===0?void 0:o.join(`
46
+ `),filesCount:s.length,generatedFiles:s,success:u&&o.length===0}}catch(n){return{error:n instanceof Error?n.message:"Unknown error",filesCount:0,generatedFiles:s,success:!1}}}async generateSingleProject(e,r,s,o,n){const a={dryRun:this.options.dryRun,overwrite:this.options.overwrite},l=[...$r];r.packageManager==="pnpm"?l.push(Lr):r.packageManager==="yarn"&&l.push(Fr),await qr(e,r,this.fileWriter,a,o,n);for(const u of l)await this.renderAndWrite(u.src,u.dest,r,o,n);for(const u of s){const h=Hr[u];if(h){for(const j of h)j.dest==="package.json"||j.dest==="pnpm-workspace.yaml"||j.dest===".yarnrc.yml"||await this.renderAndWrite(j.src,j.dest,r,o,n);continue}const y=Be[u];if(y)for(const j of y)await this.renderAndWrite(j.src,j.dest,r,o,n)}e.extras.includes("swagger")&&console.log("Swagger support added to project")}async generateMonorepo(e,r,s,o,n){const a={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await Vr(e,r,this.fileWriter,a,o,n),await Kr(e,r,this.fileWriter,a,o,n);for(const l of s){if(l==="monorepo/root"){for(const h of St)await this.renderAndWrite(h.src,h.dest,r,o,n);r.packageManager==="pnpm"?await this.renderAndWrite("monorepo/root/pnpm-workspace.yaml.hbs","pnpm-workspace.yaml",r,o,n):r.packageManager==="yarn"&&await this.renderAndWrite("monorepo/root/.yarnrc.yml.hbs",".yarnrc.yml",r,o,n);continue}const u=Be[l];if(u)for(const h of u)await this.renderAndWrite(h.src,h.dest,r,o,n)}for(const l of s){const u=Be[l];if(u)for(const h of u)await this.renderAndWrite(h.src,h.dest,r,o,n)}}async generateMetadata(e,r,s,o){try{const{buildMetadata:n,serializeMetadata:a,buildSchemaContent:l}=await import("./index-CtVIAGtc.js"),u=n(e),h=a(u),y=await this.fileWriter.writeFile({content:h,filePath:"nest-arch.jsonc",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});y.written&&s.push(y.filePath);const j=l(),k=await this.fileWriter.writeFile({content:j,filePath:"schema.json",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});k.written&&s.push(k.filePath)}catch(n){const a=n instanceof Error?n.message:String(n);o.push(`Failed to generate nest-arch.jsonc/schema.json: ${a}`)}}async renderAndWrite(e,r,s,o,n){try{const a=await this.templateEngine.renderToFile(e,r,{context:s}),l=await this.fileWriter.writeFile(a,{dryRun:this.options.dryRun,overwrite:this.options.overwrite});l.written&&o.push(l.filePath)}catch(a){const l=a instanceof Error?a.message:String(a);n.push(`Failed to generate ${r}: ${l}`),console.error(`Failed to generate ${r}:`,a)}}clearCaches(){this.templateEngine.clearCache(),this.registry.clear()}}function Yr(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",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}}p(Yr,"buildGeneratorContext");function Je(t){return Le.NEST_ARCH_BETA_MODE?J(Ye(),"test-projects",t):J(process.cwd(),t)}p(Je,"getOutputDir");function Xr(t){switch(t){case"biome":return"biome";case"eslint-prettier":return"eslint";case"oxlint-oxfmt":return"oxlint";case"none":return"none";default:return"oxlint"}}p(Xr,"mapFormatterToLinter");async function Zr(t,e){const r=Xr(e.formatter);if(r==="none")return{message:"Skipping ultracite init (no formatter selected)",success:!0};const s=[];e.addons.includes("husky")&&s.push("husky");const o=["ultracite","init","--quiet","--skip-install","--pm",e.packageManager,"--linter",r,"--frameworks","nestjs"];s.length>0&&o.push("--integrations",...s),e.addons.includes("ultracite")&&(e.ultraciteEditors.length>0&&o.push("--editors",...e.ultraciteEditors),e.ultraciteAgents.length>0&&o.push("--agents",...e.ultraciteAgents),e.ultraciteHooks.length>0&&o.push("--hooks",...e.ultraciteHooks),e.ultraciteInstallSkill==="yes"&&o.push("--install-skill"));const n=`npx ${o.join(" ")}`,a=Xe($t);try{const{stderr:l}=await a(n,{cwd:t,timeout:12e4});return l?.trim()&&console.error(`[ultracite-init] stderr: ${l.trim()}`),{message:"Ultracite setup completed",success:!0}}catch(l){let u=l instanceof Error?l.message:String(l);if(l&&typeof l=="object"&&"stderr"in l){const h=l.stderr?.trim();h&&(u=`${u}
47
+ ${h}`)}return console.error(`[ultracite-init] Failed: ${u}`),{message:`Ultracite setup failed: ${u}`,success:!1}}}p(Zr,"runUltraciteSetup");function es(){const t=import.meta.dirname;if(t){const r=J(t,"templates");if(Oe(r))return r}return J(t??process.cwd(),"..","..","..","..","packages","core","templates")}p(es,"getTemplatesDir");async function Et(t){const e=Je(t.projectName),r=Yr(t),s=es(),o=new Qr(e,{cacheTemplates:!0,templatesDir:s});try{const n=await o.generate(r);if(!n.success)return{message:n.error||"Unknown error",outputDir:e,success:!1};if(t.formatter!=="none"){const a=await Zr(e,t);if(!a.success)return{message:a.message,outputDir:e,success:!1};const l=await vr(e,t.formatter);if(!l.success)return{message:l.message??"Rule injection failed",outputDir:e,success:!1}}return{message:`Project created with ${n.generatedFiles.length} files`,outputDir:e,success:!0}}catch(n){return{message:`Failed to generate project: ${n instanceof Error?n.message:String(n)}`,outputDir:e,success:!1}}}p(Et,"generateProject");const ts=p(()=>({addons:[],api:[],architecture:null,auth:null,database:[],extras:[],formatter:null,httpProvider:null,initGit:null,microservices:[],orm:[],packageManager:null,projectName:"",projectType:null,ultraciteAgents:[],ultraciteEditors:[],ultraciteHooks:[],ultraciteInstallSkill:null}),"initialState");function rs(t){return!t.packageManager||!t.formatter||!t.httpProvider||!t.projectType||!t.architecture||!t.auth||!t.initGit?null:{addons:t.addons,api:t.api,architecture:t.architecture,auth:t.auth,database:t.database,extras:t.extras,formatter:t.formatter,httpProvider:t.httpProvider,initGit:t.initGit,microservices:t.architecture==="nest-gateway"?t.microservices:[],orm:Se(t.database)?[]:t.orm,packageManager:t.packageManager,projectName:Z(t.projectName),projectType:t.projectType,ultraciteAgents:t.ultraciteAgents,ultraciteEditors:t.ultraciteEditors,ultraciteHooks:t.ultraciteHooks,ultraciteInstallSkill:t.ultraciteInstallSkill??"no"}}p(rs,"buildResult");const ss=p(({onBack:t,onExit:e,onStepChange:r})=>{const[s,o]=O("projectName"),[n,a]=O(ts),[l,u]=O(null),[h,y]=O(null),j=B(()=>bt(n),[n]),k=B(()=>rr(s,n),[s,n]),N=B(()=>tr(s,n),[s,n]),v=w(g=>{const d=sr(s,g);d&&(o(d),r?.(d))},[s,r]),W=w(()=>{const g=nr(s,n);if(g){o(g),r?.(g);return}t()},[t,n,s,r]),$=w(()=>{const g=ke(n.projectName);if(g){u(g);return}const d={...n,projectName:Z(n.projectName)};a(d),v(d)},[v,n]),A=w(g=>{const d={...n,packageManager:g};a(d),v(d)},[v,n]),E=w(g=>{const d={...n,formatter:g};a(d),v(d)},[v,n]),T=w(g=>{const d={...n,httpProvider:g};a(d),v(d)},[v,n]),H=w(g=>{const d=g==="single"&&n.architecture==="nest-gateway"?vt():n.architecture??vt(),Y={...n,architecture:d,extras:g==="single"?n.extras.filter(Tt=>Tt!=="packages/shared"):n.extras,microservices:d==="nest-gateway"?n.microservices:[],projectType:g};a(Y),v(Y)},[v,n]),K=w(g=>{const d={...n,architecture:g,microservices:g==="nest-gateway"?n.microservices:[]};a(d),v(d)},[v,n]),ie=w(g=>{const d=wt(n.orm,g),Y={...n,database:g,orm:d};a(Y),v(Y)},[v,n]),ae=w(g=>{const d={...n,orm:wt(g,n.database)};a(d),v(d)},[v,n]),oe=w(g=>{const d={...n,api:g};a(d),v(d)},[v,n]),ce=w(g=>{const d={...n,auth:g};a(d),v(d)},[v,n]),ee=w(g=>{const d={...n,extras:g};a(d),v(d)},[v,n]),he=B(()=>n.projectType==="monorepo"?Ge:Ge.filter(g=>g.value!=="packages/shared"),[n.projectType]),C=w(g=>{const d={...n,microservices:g};a(d),v(d)},[v,n]),U=w(g=>{const d={...n,addons:g};a(d),v(d)},[v,n]),te=w(g=>{const d={...n,ultraciteEditors:g};a(d),v(d)},[v,n]),Q=w(g=>{const d={...n,ultraciteAgents:g};a(d),v(d)},[v,n]),z=w(g=>{const d={...n,ultraciteHooks:g};a(d),v(d)},[v,n]),Pe=w(g=>{const d={...n,ultraciteInstallSkill:g};a(d),v(d)},[v,n]),L=w(g=>{const d={...n,initGit:g};a(d),v(d)},[v,n]),Te=w(()=>{v(n)},[v,n]),Ce=w(async()=>{const g=rs(n);if(g){o("installing"),r?.("installing"),y({isError:!1,message:"Scaffolding your project"});try{const d=await Et(g);y({isError:!d.success,message:d.message}),d.success&&(jt(g),setTimeout(()=>{o("done"),r?.("done")},1e3))}catch(d){y({isError:!0,message:`Error: ${d instanceof Error?d.message:String(d)}`})}}},[n,r]),_=w(()=>{o("summary"),r?.("summary"),y(null)},[r]),xe=B(()=>s==="projectName"||s==="summary"||s==="ultraciteSetup"?"confirm":s==="database"||s==="orm"||s==="apiLayer"||s==="extras"||s==="microservices"||s==="addons"||s==="ultraciteEditors"||s==="ultraciteAgents"||s==="ultraciteHooks"?"multi-select":s==="installing"&&h?.isError?"confirm":"select",[s,h?.isError]);return{architectureOpts:B(()=>ir(n.projectType),[n.projectType]),displayStep:k,extrasStepOptions:he,generationStatus:h,goBack:W,handleAddons:U,handleApi:oe,handleArchitecture:K,handleAuth:ce,handleDatabase:ie,handleExtras:ee,handleFormatter:E,handleHttpProvider:T,handleInitGit:L,handleMicroservices:C,handleOrm:ae,handlePackageManager:A,handleProjectNameSubmit:$,handleProjectType:H,handleRetry:_,handleSummaryConfirm:Ce,handleUltraciteAgents:Q,handleUltraciteEditors:te,handleUltraciteHooks:z,handleUltraciteInstallSkill:Pe,handleUltraciteSetupConfirm:Te,projectNameError:l,setProjectNameError:u,setState:a,state:n,statusAction:xe,stepId:s,subProgress:N,totalSteps:j}},"useCreateProjectWizard"),ns=p(({onBack:t,onDone:e,onExit:r,onStepChange:s})=>{const{architectureOpts:o,displayStep:n,extrasStepOptions:a,generationStatus:l,goBack:u,handleProjectNameSubmit:h,handlePackageManager:y,handleFormatter:j,handleHttpProvider:k,handleProjectType:N,handleArchitecture:v,handleDatabase:W,handleOrm:$,handleApi:A,handleAuth:E,handleExtras:T,handleMicroservices:H,handleAddons:K,handleUltraciteEditors:ie,handleUltraciteAgents:ae,handleUltraciteHooks:oe,handleUltraciteInstallSkill:ce,handleInitGit:ee,handleRetry:he,handleSummaryConfirm:C,handleUltraciteSetupConfirm:U,projectNameError:te,setProjectNameError:Q,setState:z,statusAction:Pe,stepId:L,subProgress:Te,totalSteps:Ce,state:_}=ss({onBack:t,onExit:r,onStepChange:s});le(()=>{L==="done"&&e()},[L,e]),X((g,d)=>{if(d.ctrl&&g==="c"){r();return}if(d.ctrl&&g==="b"&&L!=="done"){u();return}if(L==="done"&&d.return){r();return}L==="installing"&&l?.isError&&d.return&&he()});const xe=p(()=>{switch(L){case"projectName":return i(ot,{error:te,onChange:p(g=>{z(d=>({...d,projectName:g})),Q(ke(g))},"onChange"),onSubmit:h,value:_.projectName});case"packageManager":return i(V,{onConfirm:y,options:ct,prompt:"Choose a package manager"},"packageManager");case"formatter":return i(V,{onConfirm:j,options:Me,prompt:"Choose a formatter-linter (with ultracite preset) setup"},"formatter");case"httpProvider":return i(V,{onConfirm:k,options:lt,prompt:"Choose an HTTP provider"},"httpProvider");case"projectType":return i(V,{onConfirm:N,options:pt,prompt:"Choose a project layout"},"projectType");case"architecture":return i(V,{onConfirm:v,options:o,prompt:"Choose an application architecture"},"architecture");case"database":return i(q,{initialSelected:_.database,onConfirm:W,options:dt,prompt:"Select databases for your project"},"database");case"orm":return i(q,{initialSelected:_.orm,onConfirm:$,options:yt(_.database),prompt:"Select ORMs to include"},"orm");case"apiLayer":{const g=_.architecture==="nest-api"&&_.api.length===0?["rest"]:_.api;return i(q,{initialSelected:g,onConfirm:A,options:mt,prompt:"Select API layers"},"apiLayer")}case"auth":return i(V,{onConfirm:E,options:ht,prompt:"Choose an authentication strategy"},"auth");case"extras":return i(q,{initialSelected:_.extras,onConfirm:T,options:a,prompt:"Select extras"},"extras");case"microservices":return i(q,{initialSelected:_.microservices,onConfirm:H,options:Jt,prompt:"Select microservice communication protocols"},"microservices");case"addons":{const g=_.formatter==="none"?$e.filter(d=>d.value!=="ultracite"):$e;return i(q,{initialSelected:_.addons,onConfirm:K,options:g,prompt:"Select addons"},"addons")}case"ultraciteEditors":return i(q,{initialSelected:_.ultraciteEditors,onConfirm:ie,options:qt,prompt:"Select Ultracite editors",minified:!0},"ultraciteEditors");case"ultraciteAgents":return i(q,{initialSelected:_.ultraciteAgents,onConfirm:ae,options:Vt,prompt:"Select Ultracite agents",minified:!0},"ultraciteAgents");case"ultraciteHooks":return i(q,{initialSelected:_.ultraciteHooks,onConfirm:oe,options:Kt,prompt:"Select Ultracite hooks"},"ultraciteHooks");case"ultraciteInstallSkill":return i(V,{onConfirm:ce,options:Qt,prompt:"Install Ultracite skill?"},"ultraciteInstallSkill");case"initGit":return i(V,{onConfirm:ee,options:gt,prompt:"Initialize a git repository?"},"initGit");case"summary":return i(ar,{onConfirm:C,state:_});case"ultraciteSetup":return i(cr,{onConfirm:U,state:_});case"installing":return b(f,{flexDirection:"column",children:[i(st,{message:l?.message||"Scaffolding your project",isError:l?.isError??!1}),l?.isError?i(f,{marginTop:1,children:b(c,{color:P,children:["Press ",i(c,{color:S,children:"Enter"})," to go back to Summary and retry, or ",i(c,{color:P,children:"Ctrl+B"})," to go back"]})}):null]});case"done":{const g=Z(_.projectName),d=_.initGit==="yes",Y=Je(g);return i(nt,{architecture:_.architecture||"nest-api",projectName:g,packageManager:_.packageManager||"pnpm",isGitInitialized:d,outputDir:Y})}default:return null}},"renderStep"),_e=L!=="installing"&&L!=="done";return b(f,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[_e?b(R,{children:[i(lr,{state:_,stepId:L}),i(f,{height:0}),i(pr,{displayStep:n,stepId:L,subProgress:Te??void 0,totalSteps:Ce}),i(f,{height:2})]}):null,xe(),i(f,{flexGrow:1}),_e?b(R,{children:[i(ue,{}),i(f,{height:1}),i(Re,{action:Pe,showBack:!0})]}):null]})},"CreateProjectWizardScreen"),qe=` _ _ ___ ___ _____ _ ___ ___ _ _
48
+ | \\| | __/ __|_ _| /_\\ | _ \\/ __| || |
49
+ | .\` | _|\\__ \\ | | / _ \\| / (__| __ |
50
+ |_|\\_|___|___/ |_| /_/ \\_\\_|_\\\\___|_||_|`,is=12,as=4,Pt=p(({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?i(f,{flexDirection:"column",alignItems:"center",children:i(c,{bold:!0,color:S,children:Ze})}):i(f,{flexDirection:"column",alignItems:"center",children:i(c,{color:S,children:Ne})}):s<15||r<38?b(f,{flexDirection:"column",alignItems:"center",rowGap:0,children:[i(c,{bold:!0,color:S,children:Ze}),i(c,{color:P,children:be}),i(c,{color:G,children:fe})]}):s<15+as||r<55?b(f,{flexDirection:"column",alignItems:"center",rowGap:0,children:[i(c,{color:S,children:qe}),i(c,{color:P,children:be}),i(c,{color:G,children:fe})]}):s<15+is||r<80?b(f,{flexDirection:"column",alignItems:"center",rowGap:0,children:[i(c,{color:S,children:Ne}),i(c,{color:S,children:qe}),i(c,{color:P,children:be}),i(c,{color:G,children:fe})]}):b(f,{flexDirection:"row",columnGap:2,alignItems:"flex-start",children:[i(c,{color:S,children:Ne}),b(f,{flexDirection:"column",children:[i(c,{color:S,children:qe}),b(c,{color:P,children:[" ",be]}),b(c,{color:G,children:[" ",fe]})]})]})},"Header"),Ve={addons:["ultracite","husky"],api:["rest"],architecture:"nest-api",auth:"none",database:[],extras:[],formatter:"oxlint-oxfmt",httpProvider:"express",microservices:[],orm:[],packageManager:"pnpm",projectType:"single",ultraciteAgents:[],ultraciteEditors:[],ultraciteHooks:[],ultraciteInstallSkill:"no"},os=p(({onSelect:t,options:e})=>{const[r,s]=O(0),o=w(()=>{const n=e[r];n&&!n.disabled&&t(n)},[t,e,r]);return je((n,a)=>{a.upArrow||n==="k"?s(l=>Math.max(0,l-1)):a.downArrow||n==="j"?s(l=>Math.min(e.length-1,l+1)):a.return&&o()}),b(f,{flexDirection:"column",children:[i(c,{color:P,children:"Choose a project preset"}),i(f,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((n,a)=>b(f,{flexDirection:"column",children:[i(c,{children:a===r?b(R,{children:[i(c,{color:n.disabled?pe:S,children:"> "}),i(c,{color:n.disabled?pe:S,children:n.name})]}):i(c,{color:n.disabled?pe:ye,children:` ${n.name}`})}),a===r&&n.description?i(c,{color:P,children:n.description}):null]},n.name))})]})},"PresetStep"),cs={done:"Done",initGit:"Git repository",installing:"Installing",preset:"Project preset",projectName:"Project name"},ls=p(({step:t})=>b(c,{children:[i(c,{color:S,children:"\u2727 "}),i(c,{color:I,children:cs[t]})]}),"WizardTitle"),ps=p(({onBack:t,onDone:e,onExit:r,onStepChange:s})=>{const[o,n]=O("preset"),[a,l]=O(""),[u,h]=O(null),[y,j]=O(null),[k,N]=O(null),[v,W]=O("");le(()=>{o==="done"&&e()},[o,e]);const $=B(()=>ur(),[]),A=B(()=>{const C=[{description:"REST API with standard NestJS modules and structure",name:"Basic NestJS API"},{description:"Microservice support with gateway routing",name:"API Gateway"}];return $?C.push({description:dr($),name:"Last Used"}):C.push({description:"",disabled:!0,name:"Last Used"}),C},[$]),[E,T]=O(Ve),H=w(()=>{switch(o){case"projectName":{n("preset"),s?.("preset"),h(null);return}case"initGit":{n("projectName"),s?.("projectName");return}default:t()}},[t,o,s]),K=w(C=>{if(C.name==="Last Used"&&$){const{projectName:U,initGit:te,...Q}=$;T(Q)}else C.name==="API Gateway"?T({...Ve,architecture:"nest-gateway",projectType:"monorepo"}):T(Ve);n("projectName"),s?.("projectName")},[$,s]),ie=w(C=>{l(C),h(ke(C))},[]),ae=w(()=>{const C=ke(a);if(C){h(C);return}n("initGit"),s?.("initGit")},[a,s]),oe=w(async C=>{j(C);const U=Z(a),te=Je(U);W(te),n("installing"),s?.("installing");const Q={...E,initGit:C,projectName:U};try{const z=await Et(Q);N({isError:!z.success,message:z.message}),z.success&&(jt(Q),setTimeout(()=>{n("done"),s?.("done")},1e3))}catch(z){N({isError:!0,message:`Error: ${z instanceof Error?z.message:String(z)}`})}},[a,E,s]);X((C,U)=>{if(U.ctrl&&C==="c"){r();return}if(U.ctrl&&C==="b"&&o!=="done"){H();return}o==="done"&&U.return&&r()});const ce=B(()=>o==="projectName"?"confirm":"select",[o]),ee=o!=="installing"&&o!=="done";return b(f,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[ee?b(R,{children:[i(Pt,{}),i(ue,{}),i(f,{height:1}),i(ls,{step:o}),i(f,{height:2})]}):null,p(()=>{switch(o){case"preset":return i(os,{onSelect:K,options:A});case"projectName":return i(ot,{error:u,onChange:ie,onSubmit:ae,value:a});case"initGit":return i(V,{onConfirm:oe,options:gt,prompt:"Initialize a git repository?"});case"installing":return b(f,{flexDirection:"column",children:[i(st,{message:k?.message||"Scaffolding your project",isError:k?.isError??!1}),k?.isError?i(f,{marginTop:1,children:b(c,{color:P,children:["Press ",i(c,{color:S,children:"Enter"})," to go back to Summary and retry, or ",i(c,{color:P,children:"Ctrl+B"})," to go back"]})}):null]});case"done":{const C=Z(a);return i(nt,{architecture:E.architecture||"nest-api",projectName:C,packageManager:E.packageManager||"pnpm",isGitInitialized:y==="yes",outputDir:v})}default:return null}},"renderStep")(),i(f,{flexGrow:1}),ee?b(R,{children:[i(ue,{}),i(f,{height:1}),i(Re,{action:ce,showBack:!0})]}):null]})},"ProjectPresetWizardScreen"),Ae=[{description:"Scaffold a new project with best practices",name:"Create a new NestJS project"},{description:"Choose from predefined configurations",name:"Use a project preset"},{description:"Browse the Nest Arch docs",name:"View documentation"},{description:"Close Nest Arch",name:"Exit"}],us=p(({onSelect:t})=>{const[e,r]=O(0),s=w(()=>{const a=Ae[e]??null;a?.disabled||t(e,a)},[t,e]),o=[];for(let a=0;a<Ae.length;a+=1)Ae[a].disabled||o.push(a);const n=o.indexOf(e);return je((a,l)=>{if(l.upArrow||a==="k"){const u=o[n-1];u!==void 0&&r(u)}else if(l.downArrow||a==="j"){const u=o[n+1];u!==void 0&&r(u)}else l.return&&s()}),b(f,{flexDirection:"column",children:[i(c,{color:P,children:" What would you like to do?"}),i(f,{marginTop:1,flexDirection:"column",rowGap:1,children:Ae.map((a,l)=>i(c,{children:l===e&&!a.disabled?b(R,{children:[i(c,{color:S,children:"> "}),i(c,{color:S,children:a.name})]}):i(c,{color:ye,children:` ${a.name}`})},a.name))})]})},"MainMenu"),ds=p(()=>b(c,{children:[i(c,{color:S,children:"\u2727 "}),i(c,{color:I,children:" Welcome to "}),i(c,{color:S,children:"Nest Arch"}),i(c,{color:I,children:" \u2013 Let's build something amazing."})]}),"WelcomeMessage"),ms=p(({onCreateProject:t,onExit:e,onUsePreset:r})=>{const s=w(async()=>{const n="https://github.com/Angel-Mario";try{await Lt(n,{wait:!1})}catch{}},[]),o=w((n,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 X((n,a)=>{a.ctrl&&n==="c"&&e()}),b(f,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[i(Pt,{}),i(ue,{}),i(f,{height:1}),i(ds,{}),i(f,{height:2}),i(us,{onSelect:o}),i(f,{flexGrow:1}),i(ue,{borderTop:!1}),i(f,{height:1}),i(Re,{})]})},"WelcomeScreen"),hs=p(({onDone:t})=>{const[e,r]=O("welcome"),{stdout:s}=Qe(),{exit:o}=_t(),[n,a]=O(s?.rows??24);le(()=>{if(!s)return;const k=p(()=>{a(s.rows)},"handleResize");return s.on("resize",k),()=>{s.off("resize",k)}},[s]);const l=w(()=>{o()},[o]),u=w(()=>{r("preset-wizard")},[]),h=w(()=>{r("create-wizard")},[]),y=w(()=>{r("welcome")},[]);return i(f,{height:n,flexDirection:"column",children:p(()=>e==="create-wizard"?i(ns,{onBack:y,onDone:t,onExit:l}):e==="preset-wizard"?i(ps,{onBack:y,onDone:t,onExit:l}):i(ms,{onCreateProject:h,onExit:l,onUsePreset:u}),"renderScreen")()})},"App");async function gs(){process.stdout.write("\x1B[?1049h");let t=!1;try{await xt(i(hs,{onDone:p(()=>{process.stdout.write("\x1B[?1049l"),t=!0},"onDone")})).waitUntilExit()}finally{t||process.stdout.write("\x1B[?1049l")}}p(gs,"main");try{await gs()}catch(t){console.error("Error:",t),process.exit(1)}export{Le as e};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import"react/jsx-runtime";import"ink";import"react";import"./index-B1adwhS2.js";import"@t3-oss/env-nextjs";import"zod";import"ink-text-input";import"node:fs";import"node:os";import"node:path";import"node:fs/promises";import"handlebars";import"node:child_process";import"node:util";import"ts-morph";import"open";
1
+ import"react/jsx-runtime";import"ink";import"react";import"./index-D8EatQzo.js";import"ink-text-input";import"@t3-oss/env-nextjs";import"zod";import"node:fs";import"node:os";import"node:path";import"node:child_process";import"node:util";import"node:fs/promises";import"handlebars";import"ts-morph";import"open";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nest-arch/tui",
3
- "version": "0.1.35",
3
+ "version": "0.1.38",
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.1.35",
51
+ "@nest-arch/core": "0.1.38",
52
52
  "@nest-arch/env": "0.0.0",
53
53
  "@nest-arch/shared": "0.0.0"
54
54
  },
@@ -57,7 +57,9 @@
57
57
  },
58
58
  "scripts": {
59
59
  "dev": "tsx src/index.tsx",
60
- "dev:watch": "tsx watch src/index.tsx",
60
+ "dev:bun": "bun run --watch src/index.tsx",
61
+ "dev:bunwatch": "bun run --watch src/index.tsx",
62
+ "dev:watch": "node --import tsx --watch src/index.tsx",
61
63
  "build": "pkgroll --minify --target=node18 && node scripts/copy-templates.js",
62
64
  "copy-templates": "node -e \"import('node:fs').then(({cpSync})=>cpSync('../../packages/core/templates','dist/templates',{recursive:true}))\"",
63
65
  "test": "vitest run",
@@ -1,50 +0,0 @@
1
- var bt=Object.defineProperty;var p=(r,e)=>bt(r,"name",{value:e,configurable:!0});import{jsx as a,jsxs as g,Fragment as E}from"react/jsx-runtime";import{Box as b,Text as l,useInput as F,render as yt}from"ink";import{useState as P,useEffect as Me,useCallback as w,useMemo as W}from"react";import{createEnv as vt}from"@t3-oss/env-nextjs";import{z}from"zod";import wt from"ink-text-input";import{readFileSync as Re,existsSync as be,mkdirSync as jt,writeFileSync as St}from"node:fs";import{homedir as De}from"node:os";import x,{join as R}from"node:path";import M,{readFile as ye,writeFile as re}from"node:fs/promises";import I from"handlebars";import{execFile as kt}from"node:child_process";import{promisify as At}from"node:util";import"ts-morph";import Ct from"open";const se=vt({emptyStringAsUndefined:!0,runtimeEnv:process.env,server:{APP_MAX_WIDTH:z.string().pipe(z.coerce.number()).default(95),NEST_ARCH_BETA_MODE:z.enum(["true","false"]).default("false").transform(r=>r==="true"),NEST_ARCH_SCHEMA_URL:z.string().default("./schema.json"),NEST_ARCH_VERSION:z.string().default("0.0.1"),NODE_ENV:z.enum(["development","production","test"]).default("development")}}),Pt="v1.0.0",Et="The comfy way to build NestJS projects",S="#e54545",j="#A0A0A0",ne="#6B6B6B",N="#E5E5E5",ie="#61AFEF",Y="#3A3A3A",ve="#E8C468",Tt="#e96142ff",q=p(()=>a(b,{borderStyle:"single",borderBottom:!0,borderColor:Y,height:1,width:se.APP_MAX_WIDTH}),"Divider"),_t=` _ _ ___ ___ _____ _ ___ ___ _ _
2
- | \\| | __/ __|_ _| /_\\ | _ \\/ __| || |
3
- | .\` | _|\\__ \\ | | / _ \\| / (__| __ |
4
- |_|\\_|___|___/ |_| /_/ \\_\\_|_\\\\___|_||_|`,xt=` \uFF0Fl\u3001
5
- \uFF08\uFF9F\uFF64 \uFF61\uFF17
6
- l\u3001\uFF9E ~\u30FD
7
- \u3058\u3057(_,)\u30CE
8
- `,Ge=` ,-. _,---._ __ /\\
9
- / ) .-' \`./ / \\
10
- ( ( ,' \` / /|
11
- \\ \`-" \\'\\ / |
12
- \`. , \\ \\ / |
13
- /\`. ,'-\`----Y |
14
- ( ; | '
15
- | ,-. ,-' Angel's | /
16
- | | ( | Stuff | /
17
- ) | \\ \`.___________|/
18
- \`--' \`--'
19
- `,ae=p(({onlyCat:r=!1})=>r?a(b,{flexDirection:"row",columnGap:2,children:a(b,{children:a(l,{color:S,children:Ge})})}):g(b,{flexDirection:"row",columnGap:2,children:[a(b,{children:a(l,{color:S,children:Ge})}),g(b,{flexDirection:"column",children:[a(l,{color:S,children:_t}),g(l,{color:j,children:[" ",Et]}),g(l,{color:ie,children:[" ",Pt]})]})]}),"Header"),$e=[{col:14,row:0},{col:16,row:1},{col:15,row:2},{col:13,row:3},{col:11,row:2},{col:10,row:1}],Fe=["",".","..","..."],Le=p(({message:r,isError:e})=>{const[t,i]=P(0),[n,s]=P(0);Me(()=>{const d=setInterval(()=>{i(f=>(f+1)%$e.length)},200),y=setInterval(()=>{s(f=>(f+1)%Fe.length)},400);return()=>{clearInterval(d),clearInterval(y)}},[]);const o=xt.trimEnd().split(`
20
- `),c=$e[t];return g(b,{flexDirection:"column",paddingX:2,children:[a(b,{flexDirection:"column",children:o.map((d,y)=>{if(c&&y===c.row){const f=c.col,T=d.slice(0,f),O=d.slice(f+1);return g(b,{flexDirection:"row",children:[a(l,{children:T}),a(l,{color:ve,children:"\u25CF"}),a(l,{children:O})]},y)}return a(l,{color:S,children:d},y)})}),g(l,{color:e?N:j,children:[r,e?"":Fe[n]]})]})},"ScaffoldingAnimation"),we=p(({action:r="select",showBack:e=!1})=>g(l,{children:[r==="select"||r==="multi-select"?a(l,{color:j,children:"Use \u2191/\u2193 to navigate \u2022 "}):null,a(l,{color:j,children:r==="confirm"?g(E,{children:[a(l,{color:N,children:"Enter "}),"to confirm"]}):r==="multi-select"?g(E,{children:[a(l,{color:N,children:"Space "}),"to toggle \u2022",a(l,{color:N,children:" Enter "}),"to confirm"]}):g(E,{children:[a(l,{color:N,children:"Enter "}),"to select"]})}),g(l,{color:j,children:[e?g(E,{children:[" ","\u2022",a(l,{color:N,children:" Ctrl+B "}),"to go back"]}):"",g(E,{children:[" ","\u2022",a(l,{color:N,children:" Ctrl+C "}),"to exit"]})]})]}),"StatusBar"),L=p(({initialSelected:r,onConfirm:e,options:t,prompt:i,minified:n=!1})=>{const[s,o]=P(0),[c,d]=P(r);Me(()=>{d(r),o(0)},[r]);const y=w(h=>c.includes(h),[c]),f=w(h=>{const C=t[h];C&&d(_=>_.includes(C.value)?_.filter(D=>D!==C.value):[..._,C.value])},[t]),T=w(()=>{e(c)},[e,c]);F((h,C)=>{C.upArrow||h==="k"?o(_=>Math.max(0,_-1)):C.downArrow||h==="j"?o(_=>Math.min(t.length-1,_+1)):C.return?T():(h===" "||h==="x")&&f(s)});const O=c.length;return g(b,{flexDirection:"column",children:[a(l,{color:j,children:i}),a(l,{color:ve,children:O===0?"No options selected yet \u2014 pick what you need":`${O} selected`}),a(b,{marginTop:1,flexDirection:"column",rowGap:n?0:1,overflow:"hidden",children:t.map((h,C)=>{const _=y(h.value),D=C===s,H=_?"\u25CF":"\u25CB";return g(b,{flexDirection:"column",children:[a(l,{children:D?g(E,{children:[a(l,{color:S,children:"> "}),a(l,{color:_?S:j,children:`${H} `}),a(l,{color:_?S:N,children:h.label})]}):g(E,{children:[a(l,{color:_?S:j,children:` ${H}`}),a(l,{color:ne,children:` ${h.label}`})]})}),D&&!n?a(l,{color:j,children:h.description}):null]},h.value)})})]})},"MultiSelectStep"),Ue="my-nest-app",He=64,Ot=/^[a-z][a-z0-9-]*$/u;function J(r){return r.trim()||Ue}p(J,"resolveProjectName");function oe(r){const e=r.trim();return e?e.length>He?`Project name must be at most ${He} characters`:Ot.test(e)?null:"Use lowercase letters, numbers, and hyphens; must start with a letter":null}p(oe,"validateProjectName");const We=p(({error:r,onChange:e,onSubmit:t,value:i})=>(F((n,s)=>{s.return&&t()}),g(b,{flexDirection:"column",children:[a(l,{color:j,children:"Enter a name for your project"}),g(b,{marginTop:1,flexDirection:"row",alignItems:"center",columnGap:1,children:[a(l,{color:N,children:"Project name:"}),a(wt,{placeholder:Ue,value:i,onChange:e})]}),r?a(l,{color:S,children:r}):null]})),"ProjectNameStep"),U=p(({onConfirm:r,options:e,prompt:t})=>{const[i,n]=P(0),s=w(()=>{const o=e[i];o&&r(o.value)},[r,e,i]);return F((o,c)=>{c.upArrow||o==="k"?n(d=>Math.max(0,d-1)):c.downArrow||o==="j"?n(d=>Math.min(e.length-1,d+1)):c.return&&s()}),g(b,{flexDirection:"column",children:[a(l,{color:j,children:t}),a(b,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((o,c)=>{const d=c===i;return g(b,{flexDirection:"column",children:[a(l,{children:d?g(E,{children:[a(l,{color:S,children:"> "}),a(l,{color:S,children:o.label})]}):a(l,{color:ne,children:` ${o.label}`})}),d?a(l,{color:j,children:o.description}):null]},o.value)})})]})},"SingleSelectStep"),Je=[{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"}],Be=[{description:"The modern, all-in-one toolchain written in Rust",label:"Biome",value:"biome"},{description:"The most mature and comprehensive linting ecosystem",label:"ESLint + Prettier",value:"eslint-prettier"},{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"}],ze=[{description:"Default NestJS HTTP adapter",label:"Express",value:"express"},{description:"High-performance HTTP adapter",label:"Fastify",value:"fastify"}],Ve=[{description:"Standalone NestJS application",label:"Single project",value:"single"},{description:"Multiple apps and shared packages",label:"Monorepo (Turborepo)",value:"monorepo"}],Ke=[{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"}],Qe=[{description:"Relational database with strong ecosystem",label:"PostgreSQL",value:"postgresql"},{description:"Popular relational database",label:"MySQL",value:"mysql"},{description:"Embedded database for local development",label:"SQLite",value:"sqlite"},{description:"Document database",label:"MongoDB",value:"mongodb"}],je=[{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 (not available with MongoDB)",label:"Drizzle",value:"drizzle"}],Ye=[{description:"RESTful HTTP endpoints",label:"REST",value:"rest"},{description:"End-to-end typesafe APIs",label:"tRPC",value:"trpc"},{description:"GraphQL schema and resolvers",label:"GraphQL",value:"graphql"}],qe=[{description:"No authentication scaffolding",label:"None",value:"none"},{description:"JSON Web Token authentication",label:"JWT",value:"jwt"},{description:"Flexible authentication middleware",label:"Passport",value:"passport"},{description:"Modern auth library integration",label:"Better Auth",value:"better-auth"}],Se=[{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"}],Xe=[{description:"Cursor agent skills library (.agents/skills)",label:"Agent Skills",value:"agent-skills"},{description:"Git hooks for pre-commit checks",label:"Husky",value:"husky"},{description:"Configurate ultracite for your developer tools",label:"Ultracite",value:"ultracite"},{description:"Zod-based DTO validation",label:"NestJS-Zod",value:"nestjs-zod"},{description:"Modern OpenAPI documentation UI",label:"Scalar UI (Recommended)",value:"scalar-ui"}],Nt=[{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"}],Ze=[{description:"Run git init and create initial commit",label:"Yes",value:"yes"},{description:"Skip git initialization",label:"No",value:"no"}],It=[{description:"Write .vscode/settings.json for every VS Code-based editor",label:"Universal",value:"universal"},{description:"Visual Studio Code",label:"VS Code",value:"vscode"},{description:"Cursor AI code editor",label:"Cursor",value:"cursor"},{description:"Windsurf AI code editor",label:"Windsurf",value:"windsurf"},{description:"Antigravity code editor",label:"Antigravity",value:"antigravity"},{description:"Kiro AI IDE",label:"Kiro",value:"kiro"},{description:"Trae AI IDE",label:"Trae",value:"trae"},{description:"Void code editor",label:"Void",value:"void"},{description:"Bob code editor",label:"Bob",value:"bob"},{description:"CodeBuddy code editor",label:"CodeBuddy",value:"codebuddy"},{description:"Zed code editor",label:"Zed",value:"zed"}],Mt=[{description:"Configure for all AI agents",label:"Universal",value:"universal"},{description:"Anthropic Claude",label:"Claude",value:"claude"},{description:"OpenAI Codex",label:"Codex",value:"codex"},{description:"Google Jules",label:"Jules",value:"jules"},{description:"Replit AI",label:"Replit",value:"replit"},{description:"Devin AI",label:"Devin",value:"devin"},{description:"Lovable AI",label:"Lovable",value:"lovable"},{description:"Zencoder AI",label:"Zencoder",value:"zencoder"},{description:"Ona AI",label:"Ona",value:"ona"},{description:"OpenClaw AI",label:"OpenClaw",value:"openclaw"},{description:"Continue AI",label:"Continue",value:"continue"},{description:"Snowflake Cortex",label:"Snowflake Cortex",value:"snowflake-cortex"},{description:"DeepAgents AI",label:"DeepAgents",value:"deepagents"},{description:"Qoder AI",label:"Qoder",value:"qoder"},{description:"Kimi CLI",label:"Kimi CLI",value:"kimi-cli"},{description:"MCPJam AI",label:"MCPJam",value:"mcpjam"},{description:"Mux AI",label:"Mux",value:"mux"},{description:"Pi AI",label:"Pi",value:"pi"},{description:"Adal AI",label:"Adal",value:"adal"},{description:"GitHub Copilot",label:"Copilot",value:"copilot"},{description:"Cline AI",label:"Cline",value:"cline"},{description:"Amp AI",label:"Amp",value:"amp"},{description:"Aider AI",label:"Aider",value:"aider"},{description:"Firebase Studio",label:"Firebase Studio",value:"firebase-studio"},{description:"OpenHands AI",label:"OpenHands",value:"open-hands"},{description:"Google Gemini",label:"Gemini",value:"gemini"},{description:"JetBrains Junie",label:"Junie",value:"junie"},{description:"Augment Code",label:"Augment",value:"augmentcode"},{description:"Kilo Code",label:"Kilo Code",value:"kilo-code"},{description:"Goose AI",label:"Goose",value:"goose"},{description:"Roo Code",label:"Roo Code",value:"roo-code"},{description:"Warp AI",label:"Warp",value:"warp"},{description:"Droid AI",label:"Droid",value:"droid"},{description:"OpenCode AI",label:"OpenCode",value:"opencode"},{description:"Crush AI",label:"Crush",value:"crush"},{description:"Qwen AI",label:"Qwen",value:"qwen"},{description:"Amazon Q CLI",label:"Amazon Q",value:"amazon-q-cli"},{description:"Firebender AI",label:"Firebender",value:"firebender"},{description:"Cursor CLI",label:"Cursor CLI",value:"cursor-cli"},{description:"Mistral Vibe",label:"Mistral Vibe",value:"mistral-vibe"},{description:"Vercel AI",label:"Vercel",value:"vercel"}],Rt=[{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"}],Dt=[{description:"Install the reusable Ultracite skill after setup",label:"Yes",value:"yes"},{description:"Skip installing the Ultracite skill",label:"No",value:"no"}],Gt={addons:"Addons",apiLayer:"API layer",architecture:"Architecture",auth:"Authentication",database:"Database",done:"Done",extras:"Extras",formatter:"Formatter",httpProvider:"HTTP provider",initGit:"Git repository",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"},$t=["projectName","packageManager","formatter","httpProvider","projectType","architecture","database","orm","apiLayer","auth","extras","microservices","addons","ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill","initGit","summary","installing","done"];function Ft(r){return r.includes("mongodb")}p(Ft,"databaseIncludesMongodb");function Lt(r){return r.length===0}p(Lt,"databaseIsEmpty");function ce(r){return Lt(r)}p(ce,"shouldSkipOrmStep");function X(r){return $t.filter(e=>!(e==="orm"&&ce(r.database)||e==="microservices"&&r.architecture!=="nest-gateway"||(e==="ultraciteEditors"||e==="ultraciteAgents"||e==="ultraciteHooks"||e==="ultraciteInstallSkill")&&!r.addons.includes("ultracite")))}p(X,"getVisibleSteps");const et=["ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill"];function Z(r){return et.includes(r)}p(Z,"isUltraciteSubStep");function Ut(r,e){if(!Z(r))return null;const t=et.filter(c=>X(e).includes(c)),i=t.indexOf(r);if(i===-1)return null;const n=t.length,s=i+1,o=Math.round(s/n*100);return{current:s,percent:o,total:n}}p(Ut,"getUltraciteSubStepInfo");function tt(r){return X(r).filter(e=>!(e==="installing"||e==="done"||Z(e))).length+(r.addons.includes("ultracite")?1:0)}p(tt,"getTotalSteps");function Ht(r,e){const t=X(e).filter(s=>s!=="installing"&&s!=="done");if(r==="installing"||r==="done")return tt(e);if(Z(r)){const s=t.indexOf("addons");return s===-1?1:s+1}const n=t.filter(s=>!Z(s)).indexOf(r);return n===-1?1:n+1}p(Ht,"getDisplayStepNumber");function Wt(r,e){const t=X(e),i=t.indexOf(r);return i===-1||i>=t.length-1?null:t[i+1]??null}p(Wt,"getNextStepId");function Jt(r,e){const t=X(e),i=t.indexOf(r);return i<=0?null:t[i-1]??null}p(Jt,"getPreviousStepId");function Bt(r){return r==="monorepo"?Ke:Ke.filter(e=>e.value!=="nest-gateway")}p(Bt,"filterArchitectureOptions");function rt(r){return Ft(r)?je.filter(e=>e.value!=="drizzle"):je}p(rt,"filterOrmOptions");function st(r){return"nest-api"}p(st,"defaultArchitecture");function nt(r,e){if(ce(e))return[];const t=new Set(rt(e).map(i=>i.value));return r.filter(i=>t.has(i))}p(nt,"sanitizeOrmForDatabase");function V(r,e){return r.find(t=>t.value===e)?.label??e}p(V,"labelFor");function K(r,e){return e.length===0?"None":e.map(t=>V(r,t)).join(", ")}p(K,"labelsFor");const zt=p(({onConfirm:r,state:e})=>{F((n,s)=>{s.return&&r()});const t={"nest-api":"NestJS API","nest-gateway":"NestJS API Gateway","nest-microservice":"NestJS Microservice"},i=[{label:"Project",value:J(e.projectName)},{label:"Package manager",value:e.packageManager?V(Je,e.packageManager):"\u2014"},{label:"Formatter",value:e.formatter?V(Be,e.formatter):"\u2014"},{label:"HTTP provider",value:e.httpProvider?V(ze,e.httpProvider):"\u2014"},{label:"Project type",value:e.projectType?V(Ve,e.projectType):"\u2014"},{label:"Architecture",value:e.architecture?t[e.architecture]??e.architecture:"\u2014"},{label:"Database",value:K(Qe,e.database)}];return ce(e.database)||i.push({label:"ORM",value:K(je,e.orm)}),i.push({label:"API layer",value:K(Ye,e.api)}),e.architecture==="nest-gateway"&&i.push({label:"Microservices",value:K([{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)}),i.push({label:"Auth",value:e.auth?V(qe,e.auth):"\u2014"},{label:"Extras",value:K(Se,e.extras)},{label:"Addons",value:K(Xe,e.addons)},{label:"Git",value:e.initGit==="yes"?"Initialize repository":"Skip"}),g(E,{children:[a(b,{flexDirection:"column",marginBottom:1,children:g(l,{children:[a(l,{color:S,children:"\u2726 "}),a(l,{color:ie,children:"Review your selections"})]})}),a(b,{flexDirection:"column",rowGap:1,overflow:"hidden",children:i.map(n=>g(b,{flexDirection:"row",columnGap:1,children:[a(l,{color:Tt,children:`${n.label}:`}),a(l,{color:ve,children:n.value})]},n.label))})]})},"SummaryStep");function ke(r){return r.length===0?"\u2014":r.join(", ")}p(ke,"formatList");const Vt=p(({state:r,stepId:e})=>{const t=[];if(e!=="projectName"&&r.projectName.trim()&&t.push(J(r.projectName)),r.packageManager&&t.push(r.packageManager),r.httpProvider&&t.push(r.httpProvider),r.projectType&&t.push(r.projectType==="monorepo"?"Monorepo":"Single"),r.architecture){const s={"nest-api":"Nest API","nest-gateway":"API Gateway","nest-microservice":"Microservice"};t.push(s[r.architecture]??r.architecture)}if(r.database.length>0&&t.push(ke(r.database)),r.orm.length>0&&t.push(ke(r.orm)),r.api.length>0&&t.push(ke(r.api)),r.auth&&t.push(r.auth),r.extras.length>0&&t.push(`+${r.extras.length} extras`),r.addons.length>0&&!Z(e)&&t.push(`+${r.addons.length} addons`),r.initGit&&t.push(r.initGit==="yes"?"git init":"no git"),t.length===0)return g(l,{children:[a(l,{color:S,children:"\u25C6 "}),a(l,{color:S,children:"Create a new NestJS project"})]});const[i,...n]=t;return g(E,{children:[g(l,{children:[a(l,{color:S,children:"\u25C6 "}),a(l,{color:S,children:"Create a new NestJS project"})]}),e!=="summary"&&a(b,{borderStyle:"single",borderColor:Y,width:se.APP_MAX_WIDTH,children:g(l,{children:[a(l,{children:"Project Name: "}),a(l,{color:S,children:i}),a(l,{color:j,children:" Selected: "}),n.length>0?a(l,{color:j,children:`${n.filter(s=>s!=="none").join(" \xB7 ")}`}):null]})})]})},"WizardContextBar"),Kt=p(({displayStep:r,stepId:e,subProgress:t,totalSteps:i})=>g(b,{paddingLeft:2,paddingTop:e==="summary"?2:1,marginBottom:1,children:[a(l,{color:N,children:"Create project"}),a(l,{color:j,children:` \u2014 step ${r}/${i}`}),t?a(l,{color:ie,children:` \xB7 Ultracite configuration (${t.current}/${t.total} \xB7 ${t.percent}%)`}):a(l,{color:ie,children:` \xB7 ${Gt[e]}`})]}),"WizardTitle$1");class Oe{static{p(this,"TemplateEngine")}cache={};cacheEnabled;templatesDir;constructor(e,t={}){this.templatesDir=e,this.cacheEnabled=t.cache??!0,Oe.registerHelpers(t.helpers)}static registerHelpers(e){if(I.registerHelper("eq",(t,i)=>t===i),I.registerHelper("ne",(t,i)=>t!==i),I.registerHelper("lt",(t,i)=>t<i),I.registerHelper("gt",(t,i)=>t>i),I.registerHelper("and",(t,i)=>t&&i),I.registerHelper("or",(t,i)=>t||i),I.registerHelper("uppercase",t=>t?.toUpperCase?.()),I.registerHelper("lowercase",t=>t?.toLowerCase?.()),I.registerHelper("capitalize",t=>t?t.charAt(0).toUpperCase()+t.slice(1):""),I.registerHelper("camelCase",t=>t?.split("-").map((i,n)=>n===0?i.toLowerCase():i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join("")),I.registerHelper("pascalCase",t=>t?.split("-").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join("")),I.registerHelper("snakeCase",t=>t?.replaceAll(/([A-Z])/gu,"_$1").toLowerCase()),e)for(const[t,i]of Object.entries(e))I.registerHelper(t,i)}async loadTemplate(e){const t=e;if(this.cacheEnabled&&this.cache[t])return this.cache[t];const i=x.join(this.templatesDir,e),n=await M.readFile(i,"utf-8"),s=I.compile(n);return this.cacheEnabled&&(this.cache[t]=s),s}async renderTemplate(e,t){return(await this.loadTemplate(e))(t.context)}async renderToFile(e,t,i){return{content:await this.renderTemplate(e,i),filePath:t,isBinary:!1}}clearCache(){this.cache={}}getCacheStats(){return{enabled:this.cacheEnabled,size:Object.keys(this.cache).length}}}class Qt{static{p(this,"FileWriter")}baseDir;writtenFiles=new Set;constructor(e){this.baseDir=e}getBaseDir(){return this.baseDir}async writeFile(e,t={}){const i=x.join(this.baseDir,e.filePath),n=x.dirname(i);try{await M.mkdir(n,{recursive:!0});let s=!1;try{await M.stat(i),s=!0}catch{s=!1}if(s&&!t.overwrite)return{backed:!1,error:"File already exists and overwrite is disabled",filePath:i,written:!1};let o=!1;if(s&&t.createBackups&&!t.dryRun){const c=`${i}.bak`;await M.copyFile(i,c),o=!0}return t.dryRun||(await M.writeFile(i,e.content,"utf-8"),this.writtenFiles.add(i)),{backed:o,filePath:i,written:!t.dryRun}}catch(s){return{backed:!1,error:s instanceof Error?s.message:"Unknown error",filePath:i,written:!1}}}writeFiles(e,t={}){return Promise.all(e.map(i=>this.writeFile(i,t)))}async fileExists(e){const t=x.join(this.baseDir,e);try{return await M.stat(t),!0}catch{return!1}}getWrittenFiles(){return[...this.writtenFiles]}clearWrittenFiles(){this.writtenFiles.clear()}async copyDirectory(e,t){const i=[],n=x.join(this.baseDir,e),s=x.join(this.baseDir,t);await M.mkdir(s,{recursive:!0});const o=await M.readdir(n,{withFileTypes:!0});for(const c of o){const d=x.join(n,c.name),y=x.join(s,c.name);if(c.isDirectory()){const f=await this.copyDirectory(x.relative(this.baseDir,d),x.relative(this.baseDir,y));i.push(...f)}else{const f=await M.readFile(d,"utf-8");await M.writeFile(y,f,"utf-8"),i.push(y),this.writtenFiles.add(y)}}return i}}const Ae=At(kt);class Yt{static{p(this,"GitInitializer")}baseDir;constructor(e){this.baseDir=e}async initGit(){try{const e=x.join(this.baseDir,".git");try{return await M.access(e),{success:!0}}catch{}return await Ae("git",["init"],{cwd:this.baseDir}),await Ae("git",["add","."],{cwd:this.baseDir}),await Ae("git",["commit","-m","init"],{cwd:this.baseDir}),{success:!0}}catch(e){return{error:e instanceof Error?e.message:String(e),success:!1}}}}class qt{static{p(this,"TemplateRegistry")}templates=new Map;groups=new Map;registerTemplate(e){this.templates.set(e.id,e)}registerTemplates(e){for(const t of e)this.registerTemplate(t)}registerGroup(e){this.groups.set(e.id,e);for(const t of e.templates)this.registerTemplate(t)}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(t=>t.format===e)}async loadFromDirectory(e,t){const i=[];try{const n=await M.readdir(e,{withFileTypes:!0});for(const s of n){if(!s.isFile())continue;const{name:o}=s,c=x.extname(o);if(c===".hbs"){const d=x.basename(o,c),y={description:`Template: ${d}`,format:"handlebars",id:d,name:d.replaceAll(/[-_]/gu," "),optional:o.startsWith("_"),path:x.join(x.relative(x.dirname(e),e),o)};i.push(y),this.registerTemplate(y)}}if(t&&i.length>0){const s={description:`Templates from ${e}`,id:t,name:t,templates:i};this.registerGroup(s)}}catch(n){console.error(`Failed to load templates from ${e}:`,n)}return i}clear(){this.templates.clear(),this.groups.clear()}getStats(){return{groupCount:this.groups.size,templateCount:this.templates.size}}}function k(r,e,t){const i="[ultracite-inject]";if(t){const n=t instanceof Error?t.message:String(t);console.error(`${i} ${r}: ${e} \u2014 ${n}`)}else console.error(`${i} ${r}: ${e}`)}p(k,"log");const Ce={biome:{complexity:{noStaticOnlyClass:"off",noUselessConstructor:"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/consistent-type-imports":"off","typescript/no-extraneous-class":"off","typescript/parameter-properties":"off","unicorn/no-static-only-class":"off","vitest/consistent-test-filename":"off"}};async function Xt(r){const e=R(r,"oxlint.config.ts");let t;try{t=await ye(e,"utf-8"),k("read",`Read ${e}`)}catch(s){k("error",`Cannot read ${e}`,s);return}let i=t;/import vitest from "ultracite\/oxlint\/vitest"/u.test(t)||(i=i.replace(/(import nestjs from "ultracite\/oxlint\/nestjs";)/u,`$1
21
- import vitest from "ultracite/oxlint/vitest";`),k("add-import","Added vitest import"));const n=Object.entries(Ce.oxlint).map(([s,o])=>{const c=Array.isArray(o)?JSON.stringify(o):`"${o}"`;return` "${s}": ${c}`}).join(`,
22
- `);i=i.replace(/export default defineConfig\(\{([\s\S]*?)\}\);/u,(s,o)=>{const c=o.includes("vitest"),d=o.includes("ignorePatterns"),y=o.includes("rules:");let f=o;return c||(f=f.replace(/(extends:\s*\[[\s\S]*?)(\],)/u,`$1 vitest,
23
- $2`),k("add-extends","Added vitest to extends array")),d||(f=f.replace(/(extends:\s*\[[\s\S]*?\],?)/u,`$1
24
- ignorePatterns: core.ignorePatterns,`),k("add-ignorePatterns","Added ignorePatterns")),y||(f=`${f} rules: {
25
- ${n},
26
- },
27
- `,k("add-rules","Added custom NestJS rules")),`export default defineConfig({${f}});`});try{await re(e,i,"utf-8"),k("write",`Written ${e}`)}catch(s){k("error",`Cannot write ${e}`,s)}}p(Xt,"injectOxlintRules");async function Zt(r){const e=R(r,"biome.jsonc");let t;try{t=await ye(e,"utf-8"),k("read",`Read ${e}`)}catch(o){k("error",`Cannot read ${e}`,o);return}const i=Ce.biome,n=t.includes('"linter"'),s=t.includes('"rules"');if(n&&s){const o=Object.entries(i).flatMap(([d,y])=>Object.entries(y).map(([f,T])=>` "${d}": {
28
- "${f}": "${T}"
29
- }`)).join(`,
30
- `),c=t.replace(/("linter"\s*:\s*\{[\s\S]*?"rules"\s*:\s*\{)([\s\S]*?)(\})/u,(d,y,f,T)=>{const O=f.trim().endsWith(",")?"":",";return`${y}${f}${O}
31
- ${o}
32
- ${T}`});try{await re(e,c,"utf-8"),k("write",`Written ${e} (existing linter block)`)}catch(d){k("error",`Cannot write ${e}`,d)}}else{const c=` "linter": {
33
- "rules": {
34
- ${Object.entries(i).map(([y,f])=>{const T=Object.entries(f).map(([O,h])=>` "${O}": "${h}"`).join(`,
35
- `);return` "${y}": {
36
- ${T}
37
- }`}).join(`,
38
- `)}
39
- }
40
- }`,d=t.replace(/(\}\s*)$/u,y=>`,
41
- ${c}
42
- ${y}`);try{await re(e,d,"utf-8"),k("write",`Written ${e} (new linter block)`)}catch(y){k("error",`Cannot write ${e}`,y)}}}p(Zt,"injectBiomeRules");async function er(r){const e=R(r,"eslint.config.mjs");let t;try{t=await ye(e,"utf-8"),k("read",`Read ${e}`)}catch(s){k("error",`Cannot read ${e}`,s);return}if(t.includes("rules:")){k("skip","Rules already present in eslint.config.mjs");return}const i=Object.entries(Ce.eslint).map(([s,o])=>{const c=Array.isArray(o)?JSON.stringify(o):`"${o}"`;return` "${s}": ${c}`}).join(`,
43
- `),n=t.replace(/\];?$/u,` {
44
- rules: {
45
- ${i},
46
- },
47
- },
48
- ];`);try{await re(e,n,"utf-8"),k("write",`Written ${e}`)}catch(s){k("error",`Cannot write ${e}`,s)}}p(er,"injectEslintRules");async function tr(r,e){switch(k("start",`Injecting rules for formatter: ${e}`),e){case"oxlint-oxfmt":return await Xt(r),k("done","Oxlint configuration updated"),{success:!0};case"biome":return await Zt(r),k("done","Biome configuration updated"),{success:!0};case"eslint-prettier":return await er(r),k("done","ESLint configuration updated"),{success:!0};default:return k("skip",`No injection for formatter: ${e}`),{message:"No injection needed",success:!0}}}p(tr,"injectUltraciteRules");const rr=import.meta.dirname;let le=null;function it(){if(le)return le;const r=R(rr,"..","references","package.json");return le=JSON.parse(Re(r,"utf-8")),le}p(it,"loadReference");function v(r){const e=it(),t=e.dependencies[r]??e.devDependencies[r];if(!t)throw new Error(`Dependency "${r}" not found in reference package.json`);return t}p(v,"getDependencyVersion");function sr(){return{...it().catalog}}p(sr,"getCatalogDependencies");const nr="single-project/architecture/nest-api",ir="single-project/architecture/nest-gateway",ar="single-project/architecture/nest-microservice",or="monorepo/root",cr="monorepo/apps/api-gateway",lr="monorepo/packages",pr="addons/husky",ur="extras/docker",dr="extras/swagger",mr=[{conditions:{architecture:"nest-api",projectType:"single"},id:"single-nest-api",name:"Single NestJS API",priority:10,templateGroups:[nr]},{conditions:{architecture:"nest-gateway",projectType:"single"},id:"single-nest-gateway",name:"Single NestJS Gateway",priority:10,templateGroups:[ir]},{conditions:{architecture:"nest-microservice",projectType:"single"},id:"single-nest-microservice",name:"Single NestJS Microservice",priority:10,templateGroups:[ar]},{conditions:{projectType:"monorepo"},id:"monorepo-root",name:"Monorepo Root",priority:10,templateGroups:[or,cr,lr]},{conditions:{addons:["husky"]},id:"addon-husky",name:"Husky Git Hooks",priority:5,templateGroups:[pr]},{conditions:{extras:["docker"]},id:"extra-docker",name:"Docker Support",priority:5,templateGroups:[ur]},{conditions:{extras:["swagger"]},id:"extra-swagger",name:"Swagger Documentation",priority:5,templateGroups:[dr]}];function hr(r){r.registerAll(mr)}p(hr,"initializeTemplateMappings");class pe{static{p(this,"TemplateMapper")}mappings=[];register(e){this.mappings.push(e),this.mappings.sort((t,i)=>(i.priority??0)-(t.priority??0))}registerAll(e){for(const t of e)this.register(t)}resolve(e){const t=[];for(const o of this.mappings)pe.matches(o.conditions,e)&&t.push(o);const i=[],n={},s=[];for(const o of t){for(const c of o.templateGroups)i.includes(c)||i.push(c);Object.assign(n,o.extraVariables),s.push(o.id)}return{extraVariables:n,matchedMappings:s,templateGroups:i}}findFirst(e){return this.mappings.find(t=>pe.matches(t.conditions,e))}getAll(){return[...this.mappings]}getById(e){return this.mappings.find(t=>t.id===e)}clear(){this.mappings=[]}static matches(e,t){return!(e.architecture!==void 0&&e.architecture!==t.architecture||e.projectType!==void 0&&e.projectType!==t.projectType||e.database!==void 0&&!e.database.some(i=>t.database.includes(i))||e.orm!==void 0&&!e.orm.some(i=>t.orm.includes(i))||e.api!==void 0&&!e.api.some(i=>t.api.includes(i))||e.extras!==void 0&&!e.extras.some(i=>t.extras.includes(i))||e.addons!==void 0&&!e.addons.some(i=>t.addons.includes(i))||e.microservices!==void 0&&!e.microservices.some(i=>t.microservices.includes(i)))}}function gr(r){return r.replaceAll(/([a-z])([A-Z])/gu,"$1-$2").replaceAll(/\s+/gu,"-").toLowerCase()}p(gr,"toKebabCase");function fr(r){return r.replaceAll(/[-_\s](.)/gu,(e,t)=>t.toUpperCase()).replace(/^(.)/u,e=>e.toLowerCase())}p(fr,"toCamelCase");function br(r){return r.replaceAll(/[-_\s](.)/gu,(e,t)=>t.toUpperCase()).replace(/^(.)/u,e=>e.toUpperCase())}p(br,"toPascalCase");function yr(r){return{addons:[...r.addons],apiType:r.api[0]??null,apis:[...r.api],architecture:r.architecture,auth:r.auth,databaseType:r.database[0]??null,databases:[...r.database],description:r.description||"A NestJS application",docker:r.extras.includes("docker"),extras:[...r.extras],hasAuth:r.auth!=="none",hasDatabase:r.database.length>0,hasOrm:r.orm.length>0,httpProvider:r.httpProvider,initGit:r.initGit,isBun:r.packageManager==="bun",isMonorepo:r.projectType==="monorepo",isNpm:r.packageManager==="npm",isPnpm:r.packageManager==="pnpm",isSingle:r.projectType==="single",isYarn:r.packageManager==="yarn",microservices:[...r.microservices],ormType:r.orm[0]??null,orms:[...r.orm],packageManager:r.packageManager,projectName:r.projectName,projectNameCamelCase:fr(r.projectName),projectNameKebab:gr(r.projectName),projectNamePascalCase:br(r.projectName),projectType:r.projectType,supportsCatalog:["pnpm","yarn","bun"].includes(r.packageManager),swagger:r.extras.includes("swagger"),year:new Date().getFullYear()}}p(yr,"buildTemplateVariables");function vr(r,e){return{...r,...e}}p(vr,"mergeTemplateExtras");const wr=[{dest:"tsconfig.json",src:"base/tsconfig.json.hbs"},{dest:"tsconfig.build.json",src:"base/tsconfig.build.json.hbs"},{dest:"nest-cli.json",src:"base/nest-cli.json.hbs"},{dest:".gitignore",src:"base/.gitignore.hbs"},{dest:".env",src:"base/.env.hbs"},{dest:"README.md",src:"base/README.md.hbs"},{dest:"vitest.config.ts",src:"base/vitest.config.ts.hbs"},{dest:"vitest.config.e2e.ts",src:"base/vitest.config.e2e.ts.hbs"},{dest:"src/main.ts",src:"base/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"base/src/app.module.ts.hbs"},{dest:"src/app.service.ts",src:"base/src/app.service.ts.hbs"},{dest:"src/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:"src/config/env.ts",src:"single-project/shared/config/env.ts.hbs"},{dest:"test/app.e2e-spec.ts",src:"base/test/app.e2e-spec.ts.hbs"}],jr={dest:"pnpm-workspace.yaml",src:"base/pnpm-workspace.yaml.hbs"},Sr={dest:".yarnrc.yml",src:"base/.yarnrc.yml.hbs"},kr=[{dest:".husky/pre-commit",src:"addons/husky/pre-commit.hbs"}],Ar=[{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"}],Cr={"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"}]},at=[{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"}],Pr="package.json",Er=[{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.controller.ts",src:"monorepo/apps/api-gateway/src/app.controller.ts.hbs"},{dest:"apps/api-gateway/src/app.service.ts",src:"monorepo/apps/api-gateway/src/app.service.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"},{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"}],Tr=[{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"}],Pe={"addons/husky":kr,"extras/docker":Ar,"extras/swagger":[],"monorepo/apps/api-gateway":Er,"monorepo/packages":Tr,"monorepo/root":at};class _r{static{p(this,"ProjectGenerator")}templateEngine;fileWriter;registry;options;mapper;constructor(e,t){this.options=t,this.fileWriter=new Qt(e),this.templateEngine=new Oe(t.templatesDir,{cache:t.cacheTemplates??!0}),this.registry=new qt,this.mapper=new pe,hr(this.mapper)}getMapper(){return this.mapper}async generate(e){const t=Date.now(),i=[],n=[];try{const s=this.mapper.resolve(e);let o=yr(e);o=vr(o,s.extraVariables),o.hasUltracite=e.addons.includes("ultracite"),o.hasHusky=e.addons.includes("husky"),await(e.projectType==="monorepo"?this.generateMonorepo(e,o,s.templateGroups,i,n):this.generateSingleProject(e,o,s.templateGroups,i,n));const c=Date.now()-t,d=n.length===0;if(d&&await this.generateMetadata(e,o,i,n),e.initGit){const f=await new Yt(this.fileWriter.getBaseDir()).initGit();f.success||n.push(`Failed to initialize git: ${f.error}`)}return console.log(`\u2705 Project generated in ${c}ms`),{error:d&&n.length===0?void 0:n.join(`
49
- `),filesCount:i.length,generatedFiles:i,success:d&&n.length===0}}catch(s){return{error:s instanceof Error?s.message:"Unknown error",filesCount:0,generatedFiles:i,success:!1}}}async generateSingleProject(e,t,i,n,s){const o=[...wr];t.packageManager==="pnpm"?o.push(jr):t.packageManager==="yarn"&&o.push(Sr),await this.generateSingleProjectPackageJson(e,t,n,s);for(const c of o)await this.renderAndWrite(c.src,c.dest,t,n,s);for(const c of i){const d=Cr[c];if(d){for(const f of d)f.dest==="package.json"||f.dest==="pnpm-workspace.yaml"||f.dest===".yarnrc.yml"||await this.renderAndWrite(f.src,f.dest,t,n,s);continue}const y=Pe[c];if(y)for(const f of y)await this.renderAndWrite(f.src,f.dest,t,n,s)}e.extras.includes("swagger")&&console.log("Swagger support added to project")}async generateMonorepo(e,t,i,n,s){await this.generateMonorepoRootPackageJson(e,t,n,s),await this.generateMonorepoAppPackageJson(e,t,n,s);for(const o of i){if(o==="monorepo/root"){for(const d of at)await this.renderAndWrite(d.src,d.dest,t,n,s);t.packageManager==="pnpm"?await this.renderAndWrite("monorepo/root/pnpm-workspace.yaml.hbs","pnpm-workspace.yaml",t,n,s):t.packageManager==="yarn"&&await this.renderAndWrite("monorepo/root/.yarnrc.yml.hbs",".yarnrc.yml",t,n,s);continue}const c=Pe[o];if(c)for(const d of c)await this.renderAndWrite(d.src,d.dest,t,n,s)}for(const o of i){const c=Pe[o];if(c)for(const d of c)await this.renderAndWrite(d.src,d.dest,t,n,s)}}async generateSingleProjectPackageJson(e,t,i,n){try{const s={name:t.projectName,version:"0.0.1",description:t.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:{build:"nest build",dev:"nest start --watch",start:"nest start","start:dev":"nest start --watch","start:debug":"nest start --debug --watch","start:prod":"node dist/main",test:"vitest run","test:watch":"vitest","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts"},dependencies:{"@nestjs/common":v("@nestjs/common"),"@nestjs/core":v("@nestjs/core"),[`@nestjs/platform-${t.httpProvider}`]:v("@nestjs/platform-express"),"@t3-oss/env-core":v("@t3-oss/env-core"),dotenv:v("dotenv"),"reflect-metadata":v("reflect-metadata"),rxjs:v("rxjs"),zod:v("zod")},devDependencies:{"@nestjs/cli":v("@nestjs/cli"),"@nestjs/schematics":v("@nestjs/schematics"),"@nestjs/testing":v("@nestjs/testing"),"@types/express":v("@types/express"),"@types/node":v("@types/node"),"@types/supertest":v("@types/supertest"),"@vitest/coverage-v8":v("@vitest/coverage-v8"),"source-map-support":v("source-map-support"),supertest:v("supertest"),typescript:v("typescript"),vitest:v("vitest")}};e.addons.includes("ultracite")&&(s.devDependencies.ultracite=v("ultracite"),s.scripts.check="ultracite check",s.scripts.fix="ultracite fix"),e.addons.includes("husky")&&(s.devDependencies.husky=v("husky"),s.scripts.prepare="husky");const o=JSON.stringify(s,null,2),c=await this.fileWriter.writeFile({content:o,filePath:"package.json",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});c.written&&i.push(c.filePath)}catch(s){const o=s instanceof Error?s.message:String(s);n.push(`Failed to generate package.json: ${o}`),console.error("Failed to generate package.json:",s)}}async generateMonorepoRootPackageJson(e,t,i,n){try{const s={name:t.projectName,private:!0,workspaces:["apps/*","packages/*"],type:"module",scripts:{build:"turbo build",dev:"turbo dev","check-types":"turbo check-types"},dependencies:{"@repo/env":"workspace:*",dotenv:"catalog:",zod:"catalog:"},devDependencies:{"@repo/config":"workspace:*","@types/node":"catalog:",turbo:v("turbo"),typescript:"catalog:"}};e.packageManager==="bun"&&(s.catalog=sr());const c={bun:"bun@1.3.14",npm:void 0,pnpm:"pnpm@11.5.0",yarn:"yarn@4.6.0"}[e.packageManager];c&&(s.packageManager=c),e.addons.includes("ultracite")&&(s.scripts.check="ultracite check"),e.addons.includes("husky")&&(s.devDependencies.husky=v("husky"),s.scripts.prepare="husky");const d=JSON.stringify(s,null,2),y=await this.fileWriter.writeFile({content:d,filePath:Pr,isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});y.written&&i.push(y.filePath)}catch(s){const o=s instanceof Error?s.message:String(s);n.push(`Failed to generate monorepo root package.json: ${o}`),console.error("Failed to generate monorepo root package.json:",s)}}async generateMonorepoAppPackageJson(e,t,i,n){try{const s={name:t.projectName,version:"0.0.1",private:!0,description:t.description,license:"UNLICENSED",author:"",type:"module",scripts:{build:"nest build",dev:"nest start --watch",start:"nest start","start:dev":"nest start --watch","start:debug":"nest start --debug --watch","start:prod":"node dist/main",test:"vitest run","test:watch":"vitest","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts"},dependencies:{"@nestjs/common":v("@nestjs/common"),"@nestjs/core":v("@nestjs/core"),[`@nestjs/platform-${t.httpProvider}`]:v("@nestjs/platform-express"),"@repo/env":"workspace:*","reflect-metadata":v("reflect-metadata"),rxjs:v("rxjs"),zod:"catalog:"},devDependencies:{"@nestjs/cli":v("@nestjs/cli"),"@nestjs/schematics":v("@nestjs/schematics"),"@nestjs/testing":v("@nestjs/testing"),"@repo/config":"workspace:*","@types/express":v("@types/express"),"@types/node":"catalog:","@types/supertest":v("@types/supertest"),"@vitest/coverage-v8":v("@vitest/coverage-v8"),"source-map-support":v("source-map-support"),supertest:v("supertest"),typescript:"catalog:",vitest:v("vitest")}};e.addons.includes("ultracite")&&(s.devDependencies.ultracite=v("ultracite"),s.scripts.check="ultracite check",s.scripts.fix="ultracite fix"),e.addons.includes("husky")&&(s.devDependencies.husky=v("husky"),s.scripts.prepare="husky");const o=JSON.stringify(s,null,2),c=await this.fileWriter.writeFile({content:o,filePath:"apps/api-gateway/package.json",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});c.written&&i.push(c.filePath)}catch(s){const o=s instanceof Error?s.message:String(s);n.push(`Failed to generate monorepo app package.json: ${o}`),console.error("Failed to generate monorepo app package.json:",s)}}async generateMetadata(e,t,i,n){try{const{buildMetadata:s,serializeMetadata:o,buildSchemaContent:c}=await import("./index-CoH_mnzn.js"),d=s(e),y=o(d),f=await this.fileWriter.writeFile({content:y,filePath:"nest-arch.jsonc",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});f.written&&i.push(f.filePath);const T=c(),O=await this.fileWriter.writeFile({content:T,filePath:"schema.json",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});O.written&&i.push(O.filePath)}catch(s){const o=s instanceof Error?s.message:String(s);n.push(`Failed to generate nest-arch.jsonc/schema.json: ${o}`)}}async renderAndWrite(e,t,i,n,s){try{const o=await this.templateEngine.renderToFile(e,t,{context:i}),c=await this.fileWriter.writeFile(o,{dryRun:this.options.dryRun,overwrite:this.options.overwrite});c.written&&n.push(c.filePath)}catch(o){const c=o instanceof Error?o.message:String(o);s.push(`Failed to generate ${t}: ${c}`),console.error(`Failed to generate ${t}:`,o)}}clearCaches(){this.templateEngine.clearCache(),this.registry.clear()}}function xr(r){return{addons:r.addons,api:r.api,architecture:r.architecture,auth:r.auth,database:r.database,description:`${r.projectName} NestJS application`,extras:r.extras,formatter:r.formatter,httpProvider:r.httpProvider,initGit:r.initGit==="yes",microservices:r.microservices,orm:r.orm,packageManager:r.packageManager,projectName:r.projectName,projectType:r.projectType,ultraciteAgents:r.ultraciteAgents,ultraciteEditors:r.ultraciteEditors,ultraciteHooks:r.ultraciteHooks,ultraciteInstallSkill:r.ultraciteInstallSkill}}p(xr,"buildGeneratorContext");function ot(r){return se.NEST_ARCH_BETA_MODE?R(De(),"test-projects",r):R(process.cwd(),r)}p(ot,"getOutputDir");function Or(r){switch(r){case"biome":return"biome";case"eslint-prettier":return"eslint";case"oxlint-oxfmt":return"oxlint";case"none":return"none";default:return"oxlint"}}p(Or,"mapFormatterToLinter");async function Nr(r,e){const t=Or(e.formatter);if(t==="none")return{message:"Skipping ultracite init (no formatter selected)",success:!0};const i=[];e.addons.includes("husky")&&i.push("husky");const n=["ultracite","init","--quiet","--skip-install","--pm",e.packageManager,"--linter",t,"--frameworks","nestjs"];i.length>0&&n.push("--integrations",...i),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 s=`npx ${n.join(" ")}`;try{const{execSync:o}=await import("node:child_process"),d=o(s,{cwd:r,stdio:"pipe",timeout:12e4}).toString().trim();return d&&console.error(`[ultracite-init] stderr: ${d}`),{message:"Ultracite setup completed",success:!0}}catch(o){let c=o instanceof Error?o.message:String(o);if(o&&typeof o=="object"&&"stderr"in o){const d=o.stderr?.toString().trim();d&&(c=`${c}
50
- ${d}`)}return console.error(`[ultracite-init] Failed: ${c}`),{message:`Ultracite setup failed: ${c}`,success:!1}}}p(Nr,"runUltraciteSetup");function Ir(){const r=import.meta.dirname;if(r){const t=R(r,"templates");if(be(t))return t}return R(r??process.cwd(),"..","..","..","..","packages","core","templates")}p(Ir,"getTemplatesDir");async function ct(r){const e=ot(r.projectName),t=xr(r),i=Ir(),n=new _r(e,{cacheTemplates:!0,templatesDir:i});try{const s=await n.generate(t);if(!s.success)return{message:s.error||"Unknown error",outputDir:e,success:!1};if(r.addons.includes("ultracite")){const o=await Nr(e,r);if(!o.success)return{message:o.message,outputDir:e,success:!1};const c=await tr(e,r.formatter);if(!c.success)return{message:c.message??"Rule injection failed",outputDir:e,success:!1}}return{message:`Project created with ${s.generatedFiles.length} files`,outputDir:e,success:!0}}catch(s){return{message:`Failed to generate project: ${s instanceof Error?s.message:String(s)}`,outputDir:e,success:!1}}}p(ct,"generateProject");const Mr=p(()=>({addons:[],api:[],architecture:null,auth:null,database:[],extras:[],formatter:null,httpProvider:null,initGit:null,microservices:[],orm:[],packageManager:null,projectName:"",projectType:null,ultraciteAgents:[],ultraciteEditors:[],ultraciteHooks:[],ultraciteInstallSkill:null}),"initialState");function Rr(r){return!r.packageManager||!r.formatter||!r.httpProvider||!r.projectType||!r.architecture||!r.auth||!r.initGit?null:{addons:r.addons,api:r.api,architecture:r.architecture,auth:r.auth,database:r.database,extras:r.extras,formatter:r.formatter,httpProvider:r.httpProvider,initGit:r.initGit,microservices:r.architecture==="nest-gateway"?r.microservices:[],orm:ce(r.database)?[]:r.orm,packageManager:r.packageManager,projectName:J(r.projectName),projectType:r.projectType,ultraciteAgents:r.ultraciteAgents,ultraciteEditors:r.ultraciteEditors,ultraciteHooks:r.ultraciteHooks,ultraciteInstallSkill:r.ultraciteInstallSkill??"no"}}p(Rr,"buildResult");const Dr=p(({onBack:r,onExit:e})=>{const[t,i]=P("projectName"),[n,s]=P(Mr),[o,c]=P(null),[d,y]=P(null),f=W(()=>tt(n),[n]),T=W(()=>Ht(t,n),[t,n]),O=W(()=>Ut(t,n),[t,n]),h=w(m=>{const u=Wt(t,m);u&&i(u)},[t]),C=w(()=>{const m=Jt(t,n);if(m){i(m);return}r()},[r,n,t]),_=w(()=>{const m=oe(n.projectName);if(m){c(m);return}const u={...n,projectName:J(n.projectName)};s(u),h(u)},[h,n]),D=w(m=>{const u={...n,packageManager:m};s(u),h(u)},[h,n]),H=w(m=>{const u={...n,formatter:m};s(u),h(u)},[h,n]),ue=w(m=>{const u={...n,httpProvider:m};s(u),h(u)},[h,n]),de=w(m=>{const u=m==="single"&&n.architecture==="nest-gateway"?st():n.architecture??st(),Q={...n,architecture:u,extras:m==="single"?n.extras.filter(ft=>ft!=="packages/shared"):n.extras,microservices:u==="nest-gateway"?n.microservices:[],projectType:m};s(Q),h(Q)},[h,n]),me=w(m=>{const u={...n,architecture:m,microservices:m==="nest-gateway"?n.microservices:[]};s(u),h(u)},[h,n]),he=w(m=>{const u=nt(n.orm,m),Q={...n,database:m,orm:u};s(Q),h(Q)},[h,n]),ge=w(m=>{const u={...n,orm:nt(m,n.database)};s(u),h(u)},[h,n]),fe=w(m=>{const u={...n,api:m};s(u),h(u)},[h,n]),ee=w(m=>{const u={...n,auth:m};s(u),h(u)},[h,n]),Ne=w(m=>{const u={...n,extras:m};s(u),h(u)},[h,n]),A=W(()=>n.projectType==="monorepo"?Se:Se.filter(m=>m.value!=="packages/shared"),[n.projectType]),G=w(m=>{const u={...n,microservices:m};s(u),h(u)},[h,n]),te=w(m=>{const u={...n,addons:m};s(u),h(u)},[h,n]),B=w(m=>{const u={...n,ultraciteEditors:m};s(u),h(u)},[h,n]),$=w(m=>{const u={...n,ultraciteAgents:m};s(u),h(u)},[h,n]),lt=w(m=>{const u={...n,ultraciteHooks:m};s(u),h(u)},[h,n]),pt=w(m=>{const u={...n,ultraciteInstallSkill:m};s(u),h(u)},[h,n]),ut=w(m=>{const u={...n,initGit:m};s(u),h(u)},[h,n]),dt=w(async()=>{const m=Rr(n);if(m){i("installing"),y({isError:!1,message:"Scaffolding your project\u2026"});try{const u=await ct(m);y({isError:!u.success,message:u.message}),u.success&&setTimeout(()=>{i("done")},1e3)}catch(u){y({isError:!0,message:`Error: ${u instanceof Error?u.message:String(u)}`})}}},[n]);F((m,u)=>{if(u.ctrl&&m==="c"){e();return}if(u.ctrl&&m==="b"){C();return}t==="done"&&u.return&&e()});const mt=W(()=>t==="projectName"||t==="summary"?"confirm":t==="database"||t==="orm"||t==="apiLayer"||t==="extras"||t==="microservices"||t==="addons"||t==="ultraciteEditors"||t==="ultraciteAgents"||t==="ultraciteHooks"?"multi-select":"select",[t]),ht=Bt(n.projectType),gt=p(()=>{switch(t){case"projectName":return a(We,{error:o,onChange:p(m=>{s(u=>({...u,projectName:m})),c(oe(m))},"onChange"),onSubmit:_,value:n.projectName});case"packageManager":return a(U,{onConfirm:D,options:Je,prompt:"Choose a package manager"},"packageManager");case"formatter":return a(U,{onConfirm:H,options:Be,prompt:"Choose a formatter-linter setup"},"formatter");case"httpProvider":return a(U,{onConfirm:ue,options:ze,prompt:"Choose an HTTP provider"},"httpProvider");case"projectType":return a(U,{onConfirm:de,options:Ve,prompt:"Choose a project layout"},"projectType");case"architecture":return a(U,{onConfirm:me,options:ht,prompt:"Choose an application architecture"},"architecture");case"database":return a(L,{initialSelected:n.database,onConfirm:he,options:Qe,prompt:"Select databases for your project"},"database");case"orm":return a(L,{initialSelected:n.orm,onConfirm:ge,options:rt(n.database),prompt:"Select ORMs to include"},"orm");case"apiLayer":return a(L,{initialSelected:n.api,onConfirm:fe,options:Ye,prompt:"Select API layers"},"apiLayer");case"auth":return a(U,{onConfirm:ee,options:qe,prompt:"Choose an authentication strategy"},"auth");case"extras":return a(L,{initialSelected:n.extras,onConfirm:Ne,options:A,prompt:"Select extras"},"extras");case"microservices":return a(L,{initialSelected:n.microservices,onConfirm:G,options:Nt,prompt:"Select microservice communication protocols"},"microservices");case"addons":return a(L,{initialSelected:n.addons,onConfirm:te,options:Xe,prompt:"Select addons"},"addons");case"ultraciteEditors":return a(L,{initialSelected:n.ultraciteEditors,onConfirm:B,options:It,prompt:"Select Ultracite editors",minified:!0},"ultraciteEditors");case"ultraciteAgents":return a(L,{initialSelected:n.ultraciteAgents,onConfirm:$,options:Mt,prompt:"Select Ultracite agents",minified:!0},"ultraciteAgents");case"ultraciteHooks":return a(L,{initialSelected:n.ultraciteHooks,onConfirm:lt,options:Rt,prompt:"Select Ultracite hooks"},"ultraciteHooks");case"ultraciteInstallSkill":return a(U,{onConfirm:pt,options:Dt,prompt:"Install Ultracite skill?"},"ultraciteInstallSkill");case"initGit":return a(U,{onConfirm:ut,options:Ze,prompt:"Initialize a git repository?"},"initGit");case"summary":return a(zt,{onConfirm:dt,state:n});case"installing":return a(Le,{message:d?.message||"Scaffolding your project\u2026",isError:d?.isError??!1});case"done":{const m=J(n.projectName),u=n.initGit==="yes";return g(E,{children:[a(ae,{onlyCat:!0}),g(b,{flexDirection:"column",children:[a(l,{color:N,children:"Project scaffold completed!"}),u?a(l,{color:j,children:"Git repository initialized with initial commit."}):null,g(l,{color:j,children:["Next steps: cd ",m," && ",n.packageManager," install"]}),g(l,{color:j,children:["Then: ",n.packageManager," run dev"]}),a(l,{color:j,children:"(Press enter to exit)"})]})]})}default:return null}},"renderStep"),Ie=t!=="installing"&&t!=="done";return g(b,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[Ie?g(E,{children:[a(Vt,{state:n,stepId:t}),a(b,{height:0}),a(Kt,{displayStep:T,stepId:t,subProgress:O??void 0,totalSteps:f}),a(b,{height:2})]}):null,gt(),a(b,{flexGrow:1}),Ie?g(E,{children:[a(q,{}),a(b,{height:1}),a(we,{action:mt,showBack:!0})]}):null]})},"CreateProjectWizardScreen"),Ee=R(De(),".nestarch"),Te=R(Ee,"last-used.json");function Gr(){try{if(!be(Te))return null;const r=Re(Te,"utf-8");return JSON.parse(r)}catch{return null}}p(Gr,"getLastUsedConfig");function $r(r){try{be(Ee)||jt(Ee,{recursive:!0}),St(Te,JSON.stringify(r,null,2),"utf-8")}catch{}}p($r,"saveLastUsedConfig");function Fr(r){const e=[r.packageManager];r.httpProvider&&e.push(r.httpProvider),r.api.length>0&&e.push(r.api.join(", ")),r.projectType&&e.push(r.projectType);const t=new Date,i=t.toLocaleString("en-US",{month:"short"}),n=t.getDate(),s=t.getFullYear(),o=`${i} ${n}, ${s}`;return`${e.join(", ")} (last used ${o})`}p(Fr,"buildLastUsedDescription");const _e={addons:["ultracite","husky"],api:["rest"],architecture:"nest-api",auth:"none",database:[],extras:[],formatter:"oxlint-oxfmt",httpProvider:"express",microservices:[],orm:[],packageManager:"pnpm",projectType:"single",ultraciteAgents:[],ultraciteEditors:[],ultraciteHooks:[],ultraciteInstallSkill:"no"},Lr=p(({onSelect:r,options:e})=>{const[t,i]=P(0),n=w(()=>{const s=e[t];s&&!s.disabled&&r(s)},[r,e,t]);return F((s,o)=>{o.upArrow||s==="k"?i(c=>Math.max(0,c-1)):o.downArrow||s==="j"?i(c=>Math.min(e.length-1,c+1)):o.return&&n()}),g(b,{flexDirection:"column",children:[a(l,{color:j,children:"Choose a project preset"}),a(b,{marginTop:1,flexDirection:"column",rowGap:1,children:e.map((s,o)=>g(b,{flexDirection:"column",children:[a(l,{children:o===t?g(E,{children:[a(l,{color:s.disabled?Y:S,children:"> "}),a(l,{color:s.disabled?Y:S,children:s.name})]}):a(l,{color:s.disabled?Y:ne,children:` ${s.name}`})}),o===t&&s.description?a(l,{color:j,children:s.description}):null]},s.name))})]})},"PresetStep"),Ur={done:"Done",initGit:"Git repository",installing:"Installing",preset:"Project preset",projectName:"Project name"},Hr=p(({step:r})=>g(l,{children:[a(l,{color:S,children:"\u2727 "}),a(l,{color:N,children:Ur[r]})]}),"WizardTitle"),Wr=p(({onBack:r,onExit:e})=>{const[t,i]=P("preset"),[n,s]=P(""),[o,c]=P(null),[d,y]=P(null),[f,T]=P(null),[O,h]=P(""),C=W(()=>Gr(),[]),_=W(()=>{const A=[{description:"REST API with standard NestJS modules and structure",name:"Basic NestJS API"},{description:"Microservice support with gateway routing",name:"API Gateway"}];return C?A.push({description:Fr(C),name:"Last Used"}):A.push({description:"",disabled:!0,name:"Last Used"}),A},[C]),[D,H]=P(_e),ue=w(()=>{switch(t){case"projectName":{i("preset"),c(null);return}case"initGit":{i("projectName");return}default:r()}},[r,t]),de=w(A=>{if(A.name==="Last Used"&&C){const{projectName:G,initGit:te,...B}=C;H(B)}else A.name==="API Gateway"?H({..._e,architecture:"nest-gateway",projectType:"monorepo"}):H(_e);i("projectName")},[C]),me=w(A=>{s(A),c(oe(A))},[]),he=w(()=>{const A=oe(n);if(A){c(A);return}i("initGit")},[n]),ge=w(async A=>{y(A);const G=J(n),te=ot(G);h(te),i("installing");const B={...D,initGit:A,projectName:G};try{const $=await ct(B);T({isError:!$.success,message:$.message}),$.success&&($r(B),setTimeout(()=>{i("done")},1e3))}catch($){T({isError:!0,message:`Error: ${$ instanceof Error?$.message:String($)}`})}},[n,D]);F((A,G)=>{if(G.ctrl&&A==="c"){e();return}if(G.ctrl&&A==="b"){ue();return}t==="done"&&G.return&&e()});const fe=W(()=>t==="projectName"?"confirm":"select",[t]),ee=t!=="installing"&&t!=="done";return g(b,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[ee?g(E,{children:[a(ae,{}),a(q,{}),a(b,{height:1}),a(Hr,{step:t}),a(b,{height:2})]}):null,p(()=>{switch(t){case"preset":return a(Lr,{onSelect:de,options:_});case"projectName":return a(We,{error:o,onChange:me,onSubmit:he,value:n});case"initGit":return a(U,{onConfirm:ge,options:Ze,prompt:"Initialize a git repository?"});case"installing":return a(Le,{message:f?.message||"Scaffolding your project\u2026",isError:f?.isError??!1});case"done":return g(E,{children:[a(ae,{onlyCat:!0}),g(b,{flexDirection:"column",children:[a(l,{color:N,children:"Project scaffold completed!"}),g(l,{color:j,children:["Next steps: cd ",J(n)," && pnpm install"]}),a(l,{color:j,children:"Then: pnpm run dev"}),d==="yes"?g(l,{color:j,children:["Git repository initialized at ",O]}):null,a(l,{color:j,children:"(Press enter to exit)"})]})]});default:return null}},"renderStep")(),a(b,{flexGrow:1}),ee?g(E,{children:[a(q,{}),a(b,{height:1}),a(we,{action:fe,showBack:!0})]}):null]})},"ProjectPresetWizardScreen"),xe=[{description:"Scaffold a new project with best practices",name:"Create a new NestJS project"},{description:"Choose from predefined configurations",name:"Use a project preset"},{description:"Load and manage an existing project",name:"Open an existing project"},{description:"Browse the Nest Arch docs",name:"View documentation"},{description:"Close Nest Arch",name:"Exit"}],Jr=p(({onSelect:r})=>{const[e,t]=P(0),i=w(()=>{r(e,xe[e]??null)},[r,e]);return F((n,s)=>{s.upArrow||n==="k"?t(o=>Math.max(0,o-1)):s.downArrow||n==="j"?t(o=>Math.min(xe.length-1,o+1)):s.return&&i()}),g(b,{flexDirection:"column",children:[a(l,{color:j,children:" What would you like to do?"}),a(b,{marginTop:1,flexDirection:"column",rowGap:1,children:xe.map((n,s)=>a(l,{children:s===e?g(E,{children:[a(l,{color:S,children:"> "}),a(l,{color:S,children:n.name})]}):a(l,{color:ne,children:` ${n.name}`})},n.name))})]})},"MainMenu"),Br=p(()=>g(l,{children:[a(l,{color:S,children:"\u2727 "}),a(l,{color:N,children:" Welcome to "}),a(l,{color:S,children:"Nest Arch"}),a(l,{color:N,children:" \u2013 Let's build something amazing."})]}),"WelcomeMessage"),zr=p(({onCreateProject:r,onExit:e,onUsePreset:t})=>{const i=w(async()=>{const s="https://github.com/Angel-Mario";try{await Ct(s,{wait:!1})}catch{}},[]),n=w((s,o)=>{o?.name==="Exit"?e():o?.name==="Create a new NestJS project"?r():o?.name==="Use a project preset"?t():o?.name==="View documentation"&&i()},[r,e,t,i]);return F((s,o)=>{o.ctrl&&s==="c"&&e()}),g(b,{flexDirection:"column",flexGrow:1,paddingX:2,paddingY:1,children:[a(ae,{}),a(q,{}),a(b,{height:1}),a(Br,{}),a(b,{height:2}),a(Jr,{onSelect:n}),a(b,{flexGrow:1}),a(q,{}),a(b,{height:1}),a(we,{})]})},"WelcomeScreen"),Vr=p(({onExit:r})=>{const[e,t]=P("welcome"),i=w(()=>{t("preset-wizard")},[]),n=w(()=>{t("create-wizard")},[]),s=w(()=>{t("welcome")},[]);return e==="create-wizard"?a(Dr,{onBack:s,onExit:r}):e==="preset-wizard"?a(Wr,{onBack:s,onExit:r}):a(zr,{onCreateProject:n,onExit:r,onUsePreset:i})},"App");yt(a(Vr,{onExit:p(()=>{process.exit(0)},"onExit")}));export{se as e};