@nest-arch/tui 0.1.45 → 0.1.46
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-
|
|
2
|
+
import"./index-lnGBhuOD.js";import"react/jsx-runtime";import"ink";import"react";import"ink-text-input";import"@t3-oss/env-nextjs";import"zod";import"node:fs";import"node:os";import"node:path";import"node:fs/promises";import"handlebars";import"node:child_process";import"node:util";import"ts-morph";import"node:events";import"open";
|
|
@@ -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-
|
|
1
|
+
var i=Object.defineProperty;var r=(e,a)=>i(e,"name",{value:a,configurable:!0});import{e as t}from"./index-lnGBhuOD.js";import"react/jsx-runtime";import"ink";import"react";import"ink-text-input";import"@t3-oss/env-nextjs";import"zod";import"node:fs";import"node:os";import"node:path";import"node:fs/promises";import"handlebars";import"node:child_process";import"node:util";import"ts-morph";import"node:events";import"open";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:["passport","better-auth","better-auth:stateless","none"]},createdAt:{format:"date-time",type:"string"},database:{items:{enum:["postgresql","mysql","sqlite","mongodb"]},type:"array"},description:{type:"string"},extras:{items:{enum:["docker","health-check","rate-limiting","swagger","packages/shared"]},type:"array"},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};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Vt=Object.defineProperty;var u=(t,e)=>Vt(t,"name",{value:e,configurable:!0});import{jsx as i,jsxs as b,Fragment as z}from"react/jsx-runtime";import{Box as y,Text as d,useInput as ae,useStdout as Fe,render as Qt,useApp as Xt}from"ink";import{useState as C,useEffect as ne,useMemo as J,useRef as Be,useCallback as S}from"react";import Zt from"ink-text-input";import{createEnv as er}from"@t3-oss/env-nextjs";import{z as pe}from"zod";import{existsSync as Se,readFileSync as tr,mkdirSync as rr,writeFileSync as sr}from"node:fs";import{homedir as ut}from"node:os";import k,{join as Y}from"node:path";import Z,{access as ar,readFile as ke,writeFile as he,rm as nr}from"node:fs/promises";import B from"handlebars";import{execFile as dt,exec as or,spawn as Ae}from"node:child_process";import{promisify as Ue}from"node:util";import{Project as ir,Scope as mt}from"ts-morph";import{once as se}from"node:events";import cr from"open";const ht="Nest Arch",Pe="v0.1.
|
|
1
|
+
var Vt=Object.defineProperty;var u=(t,e)=>Vt(t,"name",{value:e,configurable:!0});import{jsx as i,jsxs as b,Fragment as z}from"react/jsx-runtime";import{Box as y,Text as d,useInput as ae,useStdout as Fe,render as Qt,useApp as Xt}from"ink";import{useState as C,useEffect as ne,useMemo as J,useRef as Be,useCallback as S}from"react";import Zt from"ink-text-input";import{createEnv as er}from"@t3-oss/env-nextjs";import{z as pe}from"zod";import{existsSync as Se,readFileSync as tr,mkdirSync as rr,writeFileSync as sr}from"node:fs";import{homedir as ut}from"node:os";import k,{join as Y}from"node:path";import Z,{access as ar,readFile as ke,writeFile as he,rm as nr}from"node:fs/promises";import B from"handlebars";import{execFile as dt,exec as or,spawn as Ae}from"node:child_process";import{promisify as Ue}from"node:util";import{Project as ir,Scope as mt}from"ts-morph";import{once as se}from"node:events";import cr from"open";const ht="Nest Arch",Pe="v0.1.46",Ee="The comfy way to build NestJS projects",A="#e54545",R="#A0A0A0",ge="#6B6B6B",q="#E5E5E5",U="#61AFEF",ue="#3A3A3A",gt="#7FD99A",oe="#E8C468",Re="#e96142ff",fe=u(({borderTop:t=!0})=>i(y,{borderStyle:"single",borderBottom:!t,borderLeft:!1,borderRight:!1,borderTop:t,borderColor:ue,height:1,width:"full"}),"Divider"),lr=` \uFF0Fl\u3001
|
|
2
2
|
\uFF08\uFF9F\uFF64 \uFF61\uFF17
|
|
3
3
|
l\u3001\uFF9E ~\u30FD
|
|
4
4
|
\u3058\u3057(_,)\u30CE
|
|
@@ -19,9 +19,9 @@ var Vt=Object.defineProperty;var u=(t,e)=>Vt(t,"name",{value:e,configurable:!0})
|
|
|
19
19
|
`),npm:["npm is not installed or not found in your PATH.",""," Install npm: https://nodejs.org/en/download",""," Then restart your terminal and try again."].join(`
|
|
20
20
|
`),pnpm:["pnpm is not installed or not found in your PATH.",""," Install pnpm: npm install -g pnpm"," Or enable Corepack: corepack enable && corepack prepare pnpm@latest --activate",""," Then restart your terminal and try again."].join(`
|
|
21
21
|
`),yarn:["Yarn is not installed or not found in your PATH.",""," Install Yarn: npm install -g yarn",""," Then restart your terminal and try again."].join(`
|
|
22
|
-
`)};function Qr(t){switch(t){case"pnpm":return["pnpm",["dlx","ultracite","fix","--unsafe"]];case"npm":return["npx",["ultracite","fix","--unsafe"]];case"yarn":return["yarn",["dlx","ultracite","fix","--unsafe"]];case"bun":return["bunx",["ultracite","fix","--unsafe"]];default:{const e=t;throw new Error(`Unsupported package manager: ${e}`)}}}u(Qr,"getFormatterCommand");function Xr(t){return t instanceof Error&&"code"in t&&(t.code==="ENOENT"||t.code==="EINVAL")}u(Xr,"isNodeNotFoundError");async function Zr(t,e){const[r,s]=Qr(t);try{return await Kr(r,s,{cwd:e,shell:!0,timeout:12e4}),{success:!0}}catch(o){return Xr(o)?{error:Vr[t],success:!1}:{success:!0}}}u(Zr,"runFormatter");const es=Ue(or);function ts(t){switch(t){case"biome":return"biome";case"eslint-prettier-stylelint":case"eslint-prettier-no-stylelint":return"eslint";case"oxlint-oxfmt":return"oxlint";case"none":return"none";default:return"oxlint"}}u(ts,"mapFormatterToLinter");async function rs(t){const e=Y(t,"package.json");try{const s=await ke(e,"utf-8"),o=JSON.parse(s);o.devDependencies&&(o.devDependencies=Object.fromEntries(Object.entries(o.devDependencies).filter(([a])=>!a.startsWith("stylelint")))),await he(e,`${JSON.stringify(o,null,2)}
|
|
23
|
-
`,"utf-8")}catch{}const r=[".stylelintrc",".stylelintrc.json",".stylelintrc.js",".stylelintrc.yaml",".stylelintrc.yml","stylelint.config.js","stylelint.config.mjs","stylelint.config.cjs"];for(const s of r){const o=Y(t,s);Se(o)&&await nr(o,{force:!0})}}u(rs,"removeStylelint");async function ss(t,e){const r=ts(e.formatter);if(r==="none")return{message:"Skipping ultracite init (no formatter selected)",success:!0};const s=[];e.addons.includes("husky")&&s.push("husky");const o=["ultracite","init","--quiet","--skip-install","--pm",e.packageManager,"--linter",r,"--frameworks","nestjs"];s.length>0&&o.push("--integrations",...s),e.addons.includes("ultracite")&&(e.ultraciteEditors.length>0&&o.push("--editors",...e.ultraciteEditors),e.ultraciteAgents.length>0&&o.push("--agents",...e.ultraciteAgents),e.ultraciteHooks.length>0&&o.push("--hooks",...e.ultraciteHooks),e.ultraciteInstallSkill==="yes"&&o.push("--install-skill"));const a=`npx ${o.join(" ")}`;try{const{stderr:n}=await es(a,{cwd:t,timeout:12e4});return n?.trim()&&console.error(`[ultracite-init] stderr: ${n.trim()}`),e.formatter==="eslint-prettier-no-stylelint"&&await rs(t),{message:"Ultracite setup completed",success:!0}}catch(n){let c=n instanceof Error?n.message:String(n);if(n&&typeof n=="object"&&"stderr"in n){const l=n.stderr?.trim();l&&(c=`${c}
|
|
24
|
-
${l}`)}return console.error(`[ultracite-init] Failed: ${c}`),{message:`Ultracite setup failed: ${c}`,success:!1}}}u(ss,"runUltraciteInit");class as{static{u(this,"TemplateRegistry")}templates=new Map;groups=new Map;registerTemplate(e){this.templates.set(e.id,e)}registerTemplates(e){for(const r of e)this.registerTemplate(r)}registerGroup(e){this.groups.set(e.id,e);for(const r of e.templates)this.registerTemplate(r)}getTemplate(e){return this.templates.get(e)}getGroup(e){return this.groups.get(e)}getAllTemplates(){return[...this.templates.values()]}getAllGroups(){return[...this.groups.values()]}getTemplatesByGroup(e){return this.groups.get(e)?.templates||[]}getTemplatesByFormat(e){return[...this.templates.values()].filter(r=>r.format===e)}async loadFromDirectory(e,r){const s=[];try{const o=await Z.readdir(e,{withFileTypes:!0});for(const a of o){if(!a.isFile())continue;const{name:n}=a,c=k.extname(n);if(c===".hbs"){const l=k.basename(n,c),p={description:`Template: ${l}`,format:"handlebars",id:l,name:l.replaceAll(/[-_]/gu," "),optional:n.startsWith("_"),path:k.join(k.relative(k.dirname(e),e),n)};s.push(p),this.registerTemplate(p)}}if(r&&s.length>0){const a={description:`Templates from ${e}`,id:r,name:r,templates:s};this.registerGroup(a)}}catch(o){console.error(`Failed to load templates from ${e}:`,o)}return s}clear(){this.templates.clear(),this.groups.clear()}getStats(){return{groupCount:this.groups.size,templateCount:this.templates.size}}}function 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}`)}u(x,"log");const nt={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"}};async function ns(t){const e=Y(t,"oxlint.config.ts");let r;try{r=await ke(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
|
|
22
|
+
`)};function Qr(t){switch(t){case"pnpm":return["pnpm",["dlx","ultracite","fix","--unsafe"]];case"npm":return["npx",["--yes","ultracite","fix","--unsafe"]];case"yarn":return["yarn",["dlx","ultracite","fix","--unsafe"]];case"bun":return["bunx",["ultracite","fix","--unsafe"]];default:{const e=t;throw new Error(`Unsupported package manager: ${e}`)}}}u(Qr,"getFormatterCommand");function Xr(t){return t instanceof Error&&"code"in t&&(t.code==="ENOENT"||t.code==="EINVAL")}u(Xr,"isNodeNotFoundError");async function Zr(t,e){const[r,s]=Qr(t);try{return await Kr(r,s,{cwd:e,shell:!0,timeout:12e4}),{success:!0}}catch(o){return Xr(o)?{error:Vr[t],success:!1}:{success:!0}}}u(Zr,"runFormatter");const es=Ue(or);function ts(t){switch(t){case"biome":return"biome";case"eslint-prettier-stylelint":case"eslint-prettier-no-stylelint":return"eslint";case"oxlint-oxfmt":return"oxlint";case"none":return"none";default:return"oxlint"}}u(ts,"mapFormatterToLinter");async function rs(t){const e=Y(t,"package.json");try{const s=await ke(e,"utf-8"),o=JSON.parse(s);o.devDependencies&&(o.devDependencies=Object.fromEntries(Object.entries(o.devDependencies).filter(([a])=>!a.startsWith("stylelint")))),await he(e,`${JSON.stringify(o,null,2)}
|
|
23
|
+
`,"utf-8")}catch{}const r=[".stylelintrc",".stylelintrc.json",".stylelintrc.js",".stylelintrc.yaml",".stylelintrc.yml","stylelint.config.js","stylelint.config.mjs","stylelint.config.cjs"];for(const s of r){const o=Y(t,s);Se(o)&&await nr(o,{force:!0})}}u(rs,"removeStylelint");async function ss(t,e){const r=ts(e.formatter);if(r==="none")return{message:"Skipping ultracite init (no formatter selected)",success:!0};const s=[];e.addons.includes("husky")&&s.push("husky");const o=["ultracite","init","--quiet","--skip-install","--pm",e.packageManager,"--linter",r,"--frameworks","nestjs"];s.length>0&&o.push("--integrations",...s),e.addons.includes("ultracite")&&(e.ultraciteEditors.length>0&&o.push("--editors",...e.ultraciteEditors),e.ultraciteAgents.length>0&&o.push("--agents",...e.ultraciteAgents),e.ultraciteHooks.length>0&&o.push("--hooks",...e.ultraciteHooks),e.ultraciteInstallSkill==="yes"&&o.push("--install-skill"));const a=`npx --yes ${o.join(" ")}`;try{const{stderr:n}=await es(a,{cwd:t,timeout:12e4});return n?.trim()&&console.error(`[ultracite-init] stderr: ${n.trim()}`),e.formatter==="eslint-prettier-no-stylelint"&&await rs(t),{message:"Ultracite setup completed",success:!0}}catch(n){let c=n instanceof Error?n.message:String(n);if(n&&typeof n=="object"&&"stderr"in n){const l=n.stderr?.trim();l&&(c=`${c}
|
|
24
|
+
${l}`)}return console.error(`[ultracite-init] Failed: ${c}`),{message:`Ultracite setup failed: ${c}`,success:!1}}}u(ss,"runUltraciteInit");class as{static{u(this,"TemplateRegistry")}templates=new Map;groups=new Map;registerTemplate(e){this.templates.set(e.id,e)}registerTemplates(e){for(const r of e)this.registerTemplate(r)}registerGroup(e){this.groups.set(e.id,e);for(const r of e.templates)this.registerTemplate(r)}getTemplate(e){return this.templates.get(e)}getGroup(e){return this.groups.get(e)}getAllTemplates(){return[...this.templates.values()]}getAllGroups(){return[...this.groups.values()]}getTemplatesByGroup(e){return this.groups.get(e)?.templates||[]}getTemplatesByFormat(e){return[...this.templates.values()].filter(r=>r.format===e)}async loadFromDirectory(e,r){const s=[];try{const o=await Z.readdir(e,{withFileTypes:!0});for(const a of o){if(!a.isFile())continue;const{name:n}=a,c=k.extname(n);if(c===".hbs"){const l=k.basename(n,c),p={description:`Template: ${l}`,format:"handlebars",id:l,name:l.replaceAll(/[-_]/gu," "),optional:n.startsWith("_"),path:k.join(k.relative(k.dirname(e),e),n)};s.push(p),this.registerTemplate(p)}}if(r&&s.length>0){const a={description:`Templates from ${e}`,id:r,name:r,templates:s};this.registerGroup(a)}}catch(o){console.error(`Failed to load templates from ${e}:`,o)}return s}clear(){this.templates.clear(),this.groups.clear()}getStats(){return{groupCount:this.groups.size,templateCount:this.templates.size}}}function 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}`)}u(x,"log");const nt={biome:{complexity:{noStaticOnlyClass:"off",noUselessConstructor:"off"},performance:{noNamespaceImport:"off"},style:{noParameterProperties:"off",useImportType:"off"}},eslint:{"@typescript-eslint/consistent-type-imports":"off","@typescript-eslint/no-extraneous-class":"off","@typescript-eslint/parameter-properties":"off","class-methods-use-this":"off","func-style":["off"],"no-useless-constructor":"off","unicorn/no-static-only-class":"off","vitest/consistent-test-filename":"off"},oxlint:{"class-methods-use-this":"off","func-style":["off"],"no-useless-constructor":"off","oxc/no-const-enum":"off","typescript/consistent-type-imports":"off","typescript/no-extraneous-class":"off","typescript/parameter-properties":"off","unicorn/no-static-only-class":"off"}};async function ns(t){const e=Y(t,"oxlint.config.ts");let r;try{r=await ke(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
|
|
25
25
|
import vitest from "ultracite/oxlint/vitest";`),x("add-import","Added vitest import"));const o=Object.entries(nt.oxlint).map(([n,c])=>{const l=Array.isArray(c)?JSON.stringify(c):`"${c}"`;return` "${n}": ${l}`}).join(`,
|
|
26
26
|
`),a=JSON.stringify(["error",{pattern:".*\\.(test|spec)\\.[tj]sx?$"}]);s=s.replace(/export default defineConfig\(\{([\s\S]*?)\}\);/u,(n,c)=>{const l=c.includes("vitest"),p=c.includes("ignorePatterns"),h=c.includes("rules:"),m=c.includes("overrides:");let f=c;return l||(f=f.replace(/(extends:\s*\[)([\s\S]*?)(\s*\],)/u,(_,N,G,$)=>`${N}${G}
|
|
27
27
|
vitest,
|
|
@@ -98,7 +98,7 @@ ${s},
|
|
|
98
98
|
`),{overwrite:!0})}async save(){await this.project.save()}}class Gt{static{u(this,"PresetComposer")}presets=new Map;constructor(){this.registerDefaultPresets()}registerDefaultPresets(){this.registerPreset({architectures:["nest-api"],description:"RESTful API with JWT authentication and Swagger documentation",extras:["swagger"],generators:["auth"],id:"rest-api",name:"REST API"}),this.registerPreset({architectures:["nest-api"],description:"GraphQL API with Apollo Server and authentication",extras:["graphql","apollo"],generators:["auth"],id:"graphql-api",name:"GraphQL API"}),this.registerPreset({architectures:["nest-microservice"],description:"Microservice with messaging and inter-service communication",extras:["nats","rabbitmq"],generators:["auth"],id:"microservice",name:"Microservice"}),this.registerPreset({architectures:["nest-gateway"],description:"API Gateway for routing and load balancing",extras:["rate-limiting","load-balance"],generators:[],id:"gateway",name:"API Gateway"}),this.registerPreset({architectures:["nest-api"],description:"Complete application with database, auth, and all extras",extras:["swagger","docker","health-check","rate-limiting"],generators:["auth","config","database"],id:"fullstack",name:"Full Stack"})}registerPreset(e){this.presets.set(e.id,e)}getPreset(e){return this.presets.get(e)}getAllPresets(){return[...this.presets.values()]}getPresetsForArchitecture(e){return[...this.presets.values()].filter(r=>r.architectures.includes(e))}static composeGenerators(e){const r=new Set;return e.auth!=="none"&&r.add("auth"),e.database.length>0&&r.add("database"),[...r]}static composeExtras(e){const r=new Set(e.extras);return e.api.includes("rest")&&e.extras.includes("swagger")&&r.add("swagger"),e.orm.includes("prisma")&&r.add("prisma"),e.orm.includes("typeorm")&&r.add("typeorm"),[...r]}suggestPreset(e){if(this.getPresetsForArchitecture(e.architecture).length!==0)return e.api.includes("graphql")?this.presets.get("graphql-api"):e.architecture==="nest-microservice"?this.presets.get("microservice"):e.architecture==="nest-gateway"?this.presets.get("gateway"):e.database.length>0&&e.auth!=="none"?this.presets.get("fullstack")??this.presets.get("rest-api"):this.presets.get("rest-api")}validateContext(e,r){const s=this.getPreset(r);return s?s.architectures.includes(e.architecture):!1}}async function $t(t,e,r){const s=[];for(const o of r)try{if(o==="auth"){const a=new Rs({database:t.database,orm:t.orm,outputDir:`${e}/src`,strategy:t.auth});await a.generate(),await a.save(),s.push({filesCount:3,generatedFiles:[],success:!0})}else console.log(`Generator ${o} not yet implemented`)}catch(a){s.push({error:a instanceof Error?a.message:"Unknown error",filesCount:0,generatedFiles:[],success:!1})}return s}u($t,"executePresetGenerators");function Lt(t){const e=["services:",` ${t.projectName}:`," build:"," context: ."," dockerfile: Dockerfile"," ports:",` - "${t.httpProvider==="fastify"?"3001:3001":"3000:3000"}"`," environment:"," - NODE_ENV=development"],r=[],s=t.projectName;if(t.database.includes("postgresql")&&r.push("postgres"),t.database.includes("mysql")&&r.push("mysql"),t.database.includes("mongodb")&&r.push("mongodb"),r.length>0){e.push(" depends_on:");for(const a of r)e.push(` - ${a}`)}return e.push(" volumes:"),e.push(" - .:/app"),e.push(" - /app/node_modules"),t.database.includes("postgresql")&&(e.push(""),e.push(" postgres:"),e.push(" image: postgres:17-alpine"),e.push(" environment:"),e.push(" POSTGRES_USER: postgres"),e.push(" POSTGRES_PASSWORD: postgres"),e.push(` POSTGRES_DB: ${s}_db`),e.push(" ports:"),e.push(' - "5432:5432"'),e.push(" volumes:"),e.push(" - postgres_data:/var/lib/postgresql/data")),t.database.includes("mysql")&&(e.push(""),e.push(" mysql:"),e.push(" image: mysql:9"),e.push(" environment:"),e.push(" MYSQL_ROOT_PASSWORD: mysql"),e.push(` MYSQL_DATABASE: ${s}_db`),e.push(" ports:"),e.push(' - "3306:3306"'),e.push(" volumes:"),e.push(" - mysql_data:/var/lib/mysql")),t.database.includes("mongodb")&&(e.push(""),e.push(" mongodb:"),e.push(" image: mongo:8"),e.push(" environment:"),e.push(` MONGO_INITDB_DATABASE: ${s}_db`),e.push(" ports:"),e.push(' - "27017:27017"'),e.push(" volumes:"),e.push(" - mongo_data:/data/db")),t.database.some(a=>["postgresql","mysql","mongodb"].includes(a))&&(e.push(""),e.push("volumes:"),t.database.includes("postgresql")&&e.push(" postgres_data:"),t.database.includes("mysql")&&e.push(" mysql_data:"),t.database.includes("mongodb")&&e.push(" mongo_data:")),`${e.join(`
|
|
99
99
|
`)}
|
|
100
100
|
`}u(Lt,"generateDockerCompose");const _s={name:"@nest-arch/dependencies-reference",version:"0.0.0",description:"Single source of truth for dependency versions used across all generated templates. Do not install this package.",private:!0,catalog:{"@types/node":"^22.13.14",dotenv:"^17.2.2",typescript:"^6.0.2",zod:"^4.4.3"},dependencies:{"@better-auth/drizzle-adapter":"^1.2.0","@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.7.13","@nestjs/apollo":"^14.0.0-next.0","@nestjs/common":"next","@nestjs/core":"next","@nestjs/graphql":"^14.0.0-next.0","@nestjs/jwt":"next","@nestjs/microservices":"next","@nestjs/passport":"next","@nestjs/platform-express":"next","@nestjs/platform-fastify":"next","@nestjs/swagger":"next","@nestjs/terminus":"next","@nestjs/throttler":"next","@nestjs/typeorm":"11.0.1","@prisma/adapter-pg":"^7.8.0","@prisma/adapter-ppg":"^7.8.0","@prisma/client":"^7.8.0","@scalar/nestjs":"^0.3.0","@t3-oss/env-core":"^0.13.11","@thallesp/nestjs-better-auth":"^2.6.1","@trpc/client":"^11.0.0","@trpc/server":"^11.0.0",amqplib:"^0.10.5","apollo-server-express":"^3.13.0","apollo-server-fastify":"^3.13.0","better-auth":"^1.6.17","better-sqlite3":"^12.19.0",dotenv:"^17.2.2","drizzle-orm":"^0.45.2",graphql:"^16.10.0",ioredis:"^5.6.0",kafkajs:"^2.2.4",mongodb:"^6.13.0",mqtt:"^5.10.0",mysql2:"^3.12.0",nats:"^2.28.0","nestjs-zod":"^5.4.0",passport:"^0.7.0","passport-jwt":"^4.0.1","passport-local":"^1.0.0",pg:"^8.21.0","reflect-metadata":"^0.2.2",rxjs:"^7.8.1",typeorm:"^1.0.0",zod:"^4.4.3"},devDependencies:{"@nestjs/cli":"next","@nestjs/schematics":"next","@nestjs/testing":"next","@types/amqplib":"^0.10.6","@types/better-sqlite3":"^9.4.4","@types/express":"^5.0.0","@types/node":"^24.0.0","@types/passport-jwt":"^4.0.1","@types/passport-local":"^1.0.38","@types/pg":"^8.11.11","@types/supertest":"^7.0.0","@vitest/coverage-v8":"4.1.6","drizzle-kit":"^0.31.10",husky:"^9.1.7",oxfmt:"^0.52.0",oxlint:"^1.67.0",prisma:"^7.8.0","source-map-support":"^0.5.21",supertest:"^7.0.0",turbo:"^2.8.12",typescript:"^6.0.2",ultracite:"7.8.3",vitest:"^4.1.2"}};function Ft(){return _s}u(Ft,"loadReference");function g(t){const e=Ft(),r=e.dependencies[t]??e.devDependencies[t];if(!r)throw new Error(`Dependency "${t}" not found in reference package.json`);return r}u(g,"getDependencyVersion");function Ts(){return{...Ft().catalog}}u(Ts,"getCatalogDependencies");const Os=[{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"}],Cs={dest:"pnpm-workspace.yaml",src:"base/pnpm-workspace.yaml.hbs"},xs={dest:".yarnrc.yml",src:"base/.yarnrc.yml.hbs"},Ms=[{dest:".husky/pre-commit",src:"addons/husky/pre-commit.hbs"}],Is=[{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"}],Ds=[{dest:"src/database/adapters/interfaces/db-adapter.interface.ts",src:"base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs"},{dest:"src/database/adapters/sql/prisma-sql.adapter.ts",src:"base/src/database/adapters/sql/prisma-sql.adapter.ts.hbs"},{dest:"src/database/adapters/sql/drizzle-sql.adapter.ts",src:"base/src/database/adapters/sql/drizzle-sql.adapter.ts.hbs"},{dest:"src/database/adapters/sql/typeorm-sql.adapter.ts",src:"base/src/database/adapters/sql/typeorm-sql.adapter.ts.hbs"},{dest:"src/database/adapters/sql/raw-sql.adapter.ts",src:"base/src/database/adapters/sql/raw-sql.adapter.ts.hbs"},{dest:"src/database/adapters/mongo/prisma-mongo.adapter.ts",src:"base/src/database/adapters/mongo/prisma-mongo.adapter.ts.hbs"},{dest:"src/database/adapters/mongo/raw-mongo.adapter.ts",src:"base/src/database/adapters/mongo/raw-mongo.adapter.ts.hbs"},{dest:"src/database/db.service.ts",src:"base/src/database/db.service.ts.hbs"},{dest:"src/database/db.module.ts",src:"base/src/database/db.module.ts.hbs"},{dest:"src/database/index.ts",src:"base/src/database/index.ts.hbs"},{dest:"src/database/orm/drizzle/schema.ts",src:"base/src/database/orm/drizzle/schema.ts.hbs"},{dest:"src/database/orm/typeorm/data-source.ts",src:"base/src/database/orm/typeorm/data-source.ts.hbs"},{dest:"src/database/entities/todo.entity.ts",src:"base/src/database/entities/todo.entity.ts.hbs"}],Ns=[{dest:"packages/db/package.json",src:"monorepo/packages/db/package.json.hbs"},{dest:"packages/db/tsconfig.json",src:"monorepo/packages/db/tsconfig.json.hbs"},{dest:"packages/db/src/adapters/interfaces/db-adapter.interface.ts",src:"base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs"},{dest:"packages/db/src/adapters/sql/prisma-sql.adapter.ts",src:"base/src/database/adapters/sql/prisma-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/sql/drizzle-sql.adapter.ts",src:"base/src/database/adapters/sql/drizzle-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/sql/typeorm-sql.adapter.ts",src:"base/src/database/adapters/sql/typeorm-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/sql/raw-sql.adapter.ts",src:"base/src/database/adapters/sql/raw-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/mongo/prisma-mongo.adapter.ts",src:"base/src/database/adapters/mongo/prisma-mongo.adapter.ts.hbs"},{dest:"packages/db/src/adapters/mongo/raw-mongo.adapter.ts",src:"base/src/database/adapters/mongo/raw-mongo.adapter.ts.hbs"},{dest:"packages/db/src/db.service.ts",src:"base/src/database/db.service.ts.hbs"},{dest:"packages/db/src/db.module.ts",src:"base/src/database/db.module.ts.hbs"},{dest:"packages/db/src/index.ts",src:"base/src/database/index.ts.hbs"},{dest:"packages/db/src/orm/drizzle/schema.ts",src:"base/src/database/orm/drizzle/schema.ts.hbs"},{dest:"packages/db/src/orm/typeorm/data-source.ts",src:"base/src/database/orm/typeorm/data-source.ts.hbs"},{dest:"packages/db/src/entities/todo.entity.ts",src:"base/src/database/entities/todo.entity.ts.hbs"}],zs={"single-project/architecture/nest-api":[{dest:"src/main.ts",src:"single-project/architecture/nest-api/src/main.ts.hbs"},{dest:".env",src:"single-project/architecture/nest-api/.env.hbs"},{dest:"package.json",src:"single-project/architecture/nest-api/package.json.hbs"},{dest:"pnpm-workspace.yaml",src:"single-project/architecture/nest-api/pnpm-workspace.yaml.hbs"}],"single-project/architecture/nest-gateway":[{dest:"src/main.ts",src:"single-project/architecture/nest-gateway/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"single-project/architecture/nest-gateway/src/app.module.ts.hbs"},{dest:"src/app.controller.ts",src:"single-project/architecture/nest-gateway/src/app.controller.ts.hbs"},{dest:"src/app.service.ts",src:"single-project/architecture/nest-gateway/src/app.service.ts.hbs"},{dest:"package.json",src:"single-project/architecture/nest-api/package.json.hbs"},{dest:"pnpm-workspace.yaml",src:"single-project/architecture/nest-api/pnpm-workspace.yaml.hbs"}],"single-project/architecture/nest-microservice":[{dest:"src/main.ts",src:"single-project/architecture/nest-microservice/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"single-project/architecture/nest-microservice/src/app.module.ts.hbs"},{dest:"src/app.controller.ts",src:"single-project/architecture/nest-microservice/src/app.controller.ts.hbs"},{dest:"src/app.service.ts",src:"single-project/architecture/nest-microservice/src/app.service.ts.hbs"},{dest:".env",src:"single-project/architecture/nest-microservice/.env.hbs"},{dest:"package.json",src:"single-project/architecture/nest-api/package.json.hbs"},{dest:"pnpm-workspace.yaml",src:"single-project/architecture/nest-api/pnpm-workspace.yaml.hbs"}]},Bt=[{dest:"turbo.json",src:"monorepo/root/turbo.json.hbs"},{dest:"tsconfig.json",src:"monorepo/root/tsconfig.json.hbs"},{dest:".gitignore",src:"monorepo/root/.gitignore.hbs"},{dest:"README.md",src:"monorepo/root/README.md.hbs"}],qs="package.json",Gs=[{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"}],$s=[{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"}],Ut={"addons/husky":Ms,"extras/database":Ds,"extras/docker":Is,"extras/swagger":[],"monorepo/apps/api-gateway":Gs,"monorepo/packages":$s,"monorepo/packages/db":Ns,"monorepo/root":Bt};function Ht(t,e,r){t.auth==="passport"?(e["@nestjs/jwt"]=g("@nestjs/jwt"),e["@nestjs/passport"]=g("@nestjs/passport"),e.passport=g("passport"),e["passport-jwt"]=g("passport-jwt"),r["@types/passport-jwt"]=g("@types/passport-jwt"),t.database.length>0&&t.orm.includes("typeorm")&&(e["@nestjs/typeorm"]=g("@nestjs/typeorm"),e.typeorm=g("typeorm"))):(t.auth==="better-auth"||t.auth==="better-auth:stateless")&&(e["better-auth"]=g("better-auth"),e["@thallesp/nestjs-better-auth"]=g("@thallesp/nestjs-better-auth"),t.orm.includes("drizzle")&&(e["@better-auth/drizzle-adapter"]=g("@better-auth/drizzle-adapter")));for(const s of t.api)if(s==="graphql"){e["@nestjs/graphql"]=g("@nestjs/graphql"),e["@nestjs/apollo"]=g("@nestjs/apollo"),e.graphql=g("graphql");const o=t.httpProvider==="fastify"?"apollo-server-fastify":"apollo-server-express";e[o]=g(o)}else s==="trpc"&&(e["@trpc/server"]=g("@trpc/server"),e["@trpc/client"]=g("@trpc/client"));t.extras.includes("swagger")&&(e["@nestjs/swagger"]=g("@nestjs/swagger")),t.extras.includes("health-check")&&(e["@nestjs/terminus"]=g("@nestjs/terminus")),t.extras.includes("rate-limiting")&&(e["@nestjs/throttler"]=g("@nestjs/throttler"));for(const s of t.microservices)s==="redis"?e.ioredis=g("ioredis"):s==="mqtt"?e.mqtt=g("mqtt"):s==="nats"?e.nats=g("nats"):s==="rabbitmq"?(e.amqplib=g("amqplib"),r["@types/amqplib"]=g("@types/amqplib")):s==="kafka"?e.kafkajs=g("kafkajs"):s==="grpc"&&(e["@grpc/grpc-js"]=g("@grpc/grpc-js"),e["@grpc/proto-loader"]=g("@grpc/proto-loader"));t.addons.includes("nestjs-zod")&&(e["nestjs-zod"]=g("nestjs-zod")),t.addons.includes("scalar-ui")&&(e["@scalar/nestjs"]=g("@scalar/nestjs"))}u(Ht,"addConditionalDependencies");function Wt(t,e,r){const s=t.orm.includes("prisma"),o=t.orm.includes("drizzle"),a=t.orm.includes("typeorm"),n=t.database.length>0&&!s&&!o&&!a;for(const c of t.orm)c==="prisma"?(e["@prisma/client"]=g("@prisma/client"),r.prisma=g("prisma"),t.database.includes("postgresql")&&(e["@prisma/adapter-pg"]=g("@prisma/adapter-pg")),t.database.includes("mysql")&&(e["@prisma/adapter-mysql2"]=g("@prisma/adapter-mysql2")),t.database.includes("sqlite")&&(e["@prisma/adapter-better-sqlite3"]=g("@prisma/adapter-better-sqlite3"))):c==="typeorm"?(e.typeorm=g("typeorm"),e["@nestjs/typeorm"]=g("@nestjs/typeorm"),t.database.includes("postgresql")&&(e.pg=g("pg"),r["@types/pg"]=g("@types/pg"))):c==="drizzle"&&(e["drizzle-orm"]=g("drizzle-orm"),r["drizzle-kit"]=g("drizzle-kit"));t.database.includes("postgresql")&&o&&(e.pg=g("pg"),r["@types/pg"]=g("@types/pg")),t.database.includes("mysql")&&o&&(e.mysql2=g("mysql2")),t.database.includes("sqlite")&&o&&(e["better-sqlite3"]=g("better-sqlite3"),r["@types/better-sqlite3"]=g("@types/better-sqlite3")),t.database.includes("mongodb")&&n&&(e.mongodb=g("mongodb"))}u(Wt,"addDatabaseDependencies");async function Ls(t,e,r,s,o,a){try{const n=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",c={"@nestjs/common":g("@nestjs/common"),"@nestjs/core":g("@nestjs/core"),[n]:g(n),"@t3-oss/env-core":g("@t3-oss/env-core"),dotenv:g("dotenv"),"reflect-metadata":g("reflect-metadata"),rxjs:g("rxjs"),zod:g("zod")},l={"@nestjs/cli":g("@nestjs/cli"),"@nestjs/schematics":g("@nestjs/schematics"),"@nestjs/testing":g("@nestjs/testing"),"@types/node":g("@types/node"),"@types/supertest":g("@types/supertest"),"@vitest/coverage-v8":g("@vitest/coverage-v8"),"source-map-support":g("source-map-support"),supertest:g("supertest"),typescript:g("typescript"),vitest:g("vitest")};t.httpProvider==="express"&&(l["@types/express"]=g("@types/express"));const p={build:"nest build",dev:"nest start --watch",start:"nest start","start:debug":"nest start --debug --watch","start:dev":"nest start --watch","start:prod":"node dist/main",test:"vitest run","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts","test:watch":"vitest"};Ht(t,c,l),Wt(t,c,l),t.addons.includes("ultracite")&&(l.ultracite=g("ultracite"),p.check="ultracite check",p.fix="ultracite fix"),t.addons.includes("husky")&&(l.husky=g("husky"),p.prepare="husky"),t.orm.includes("prisma")&&(p["prisma:generate"]="prisma generate",p["prisma:push"]="prisma db push",p["prisma:studio"]="prisma studio",p["prisma:migrate"]="prisma migrate dev",p["prisma:migrate:deploy"]="prisma migrate deploy",p.postinstall="prisma generate"),t.orm.includes("drizzle")&&(p["db:generate"]="drizzle-kit generate",p["db:migrate"]="drizzle-kit migrate",p["db:studio"]="drizzle-kit studio",p["db:push"]="drizzle-kit push"),t.orm.includes("typeorm")&&(p["typeorm:run"]="typeorm migration:run -d src/database/orm/typeorm/data-source.ts",p["typeorm:revert"]="typeorm migration:revert -d src/database/orm/typeorm/data-source.ts",p["typeorm:generate"]="typeorm migration:generate -d src/database/orm/typeorm/data-source.ts",p["typeorm:create"]="typeorm migration:create");const h={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:p,dependencies:c,devDependencies:l},m=JSON.stringify(h,null,2),f=await r.writeFile({content:m,filePath:"package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});f.written&&o.push(f.filePath)}catch(n){const c=n instanceof Error?n.message:String(n);a.push(`Failed to generate package.json: ${c}`),console.error("Failed to generate package.json:",n)}}u(Ls,"generateSingleProjectPackageJson");async function Fs(t,e,r,s,o,a){try{const n={build:"turbo build","check-types":"turbo check-types",dev:"turbo dev"},c={"@repo/env":"workspace:*",dotenv:"catalog:",zod:"catalog:"},l={"@repo/config":"workspace:*","@types/node":"catalog:",turbo:g("turbo"),typescript:"catalog:"};t.addons.includes("ultracite")&&(n.check="ultracite check"),t.addons.includes("husky")&&(l.husky=g("husky"),n.prepare="husky");const h={bun:"bun@1.3.14",npm:void 0,pnpm:"pnpm@11.6.0",yarn:"yarn@4.6.0"}[t.packageManager],m={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,workspaces:["apps/*","packages/*"],type:"module",...h?{packageManager:h}:{},...t.packageManager==="bun"?{catalog:Ts()}:{},scripts:n,dependencies:c,devDependencies:l},f=JSON.stringify(m,null,2),_=await r.writeFile({content:f,filePath:qs,isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});_.written&&o.push(_.filePath)}catch(n){const c=n instanceof Error?n.message:String(n);a.push(`Failed to generate monorepo root package.json: ${c}`),console.error("Failed to generate monorepo root package.json:",n)}}u(Fs,"generateMonorepoRootPackageJson");async function Bs(t,e,r,s,o,a){try{const n=t.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",c={"@nestjs/common":g("@nestjs/common"),"@nestjs/core":g("@nestjs/core"),[n]:g(n),"@repo/env":"workspace:*","reflect-metadata":g("reflect-metadata"),rxjs:g("rxjs"),zod:"catalog:"};t.database.length>0&&(c["@repo/db"]="workspace:*");const l={"@nestjs/cli":g("@nestjs/cli"),"@nestjs/schematics":g("@nestjs/schematics"),"@nestjs/testing":g("@nestjs/testing"),"@repo/config":"workspace:*","@types/node":"catalog:","@types/supertest":g("@types/supertest"),"@vitest/coverage-v8":g("@vitest/coverage-v8"),"source-map-support":g("source-map-support"),supertest:g("supertest"),typescript:"catalog:",vitest:g("vitest")};t.httpProvider==="express"&&(l["@types/express"]=g("@types/express"));const p={build:"nest build",dev:"nest start --watch",start:"nest start","start:debug":"nest start --debug --watch","start:dev":"nest start --watch","start:prod":"node dist/main",test:"vitest run","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts","test:watch":"vitest"};Ht(t,c,l),t.addons.includes("ultracite")&&(l.ultracite=g("ultracite"),p.check="ultracite check",p.fix="ultracite fix"),t.addons.includes("husky")&&(l.husky=g("husky"),p.prepare="husky");const h={name:e.projectName,version:"0.0.1",description:e.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:p,dependencies:c,devDependencies:l},m=JSON.stringify(h,null,2),f=await r.writeFile({content:m,filePath:"apps/api-gateway/package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});f.written&&o.push(f.filePath)}catch(n){const c=n instanceof Error?n.message:String(n);a.push(`Failed to generate monorepo app package.json: ${c}`),console.error("Failed to generate monorepo app package.json:",n)}}u(Bs,"generateMonorepoAppPackageJson");async function Us(t,e,r,s,o,a){try{const n={"@nestjs/common":"catalog:","@nestjs/core":"catalog:","reflect-metadata":"catalog:",rxjs:"catalog:"},c={"@repo/config":"workspace:*","@types/node":"catalog:",typescript:"catalog:"};Wt(t,n,c);const l={};t.orm.includes("prisma")&&(l["prisma:generate"]="prisma generate",l["prisma:push"]="prisma db push",l["prisma:studio"]="prisma studio",l["prisma:migrate"]="prisma migrate dev",l["prisma:migrate:deploy"]="prisma migrate deploy",l.postinstall="prisma generate"),t.orm.includes("drizzle")&&(l["db:generate"]="drizzle-kit generate",l["db:migrate"]="drizzle-kit migrate",l["db:studio"]="drizzle-kit studio",l["db:push"]="drizzle-kit push"),t.orm.includes("typeorm")&&(l["typeorm:run"]="typeorm-ts esm migration:run -d src/database/orm/typeorm/data-source.ts",l["typeorm:revert"]="typeorm-ts esm migration:revert -d src/database/orm/typeorm/data-source.ts",l["typeorm:generate"]="typeorm-ts esm migration:generate -d src/database/orm/typeorm/data-source.ts",l["typeorm:create"]="typeorm migration:create");const p={name:"@repo/db",version:"0.0.1",private:!0,type:"module",main:"./src/index.ts",exports:{".":"./src/index.ts"},...Object.keys(l).length>0?{scripts:l}:{},dependencies:n,devDependencies:c},h=JSON.stringify(p,null,2),m=await r.writeFile({content:h,filePath:"packages/db/package.json",isBinary:!1},{dryRun:s.dryRun,overwrite:s.overwrite});m.written&&o.push(m.filePath)}catch(n){const c=n instanceof Error?n.message:String(n);a.push(`Failed to generate monorepo db package.json: ${c}`),console.error("Failed to generate monorepo db package.json:",n)}}u(Us,"generateMonorepoDbPackageJson");class Hs{static{u(this,"ProjectGenerator")}templateEngine;fileWriter;registry;options;mapper;constructor(e,r){this.options=r,this.fileWriter=new Hr(e),this.templateEngine=new lt(r.templatesDir,{cache:r.cacheTemplates??!0}),this.registry=new as,this.mapper=new Me,vs(this.mapper)}getMapper(){return this.mapper}async generate(e){const r=Date.now(),s=[],o=[];try{const a=this.mapper.resolve(e);let n=Ps(e);n=Es(n,a.extraVariables),n.hasUltracite=e.addons.includes("ultracite"),n.hasHusky=e.addons.includes("husky"),await(e.projectType==="monorepo"?this.generateMonorepo(e,n,a.templateGroups,s,o):this.generateSingleProject(e,n,a.templateGroups,s,o));const c=Date.now()-r,l=o.length===0;return l&&await this.generateMetadata(e,n,s,o),console.log(`\u2705 Project generated in ${c}ms`),{error:l&&o.length===0?void 0:o.join(`
|
|
101
|
-
`),filesCount:s.length,generatedFiles:s,success:l&&o.length===0}}catch(a){return{error:a instanceof Error?a.message:"Unknown error",filesCount:0,generatedFiles:s,success:!1}}}async generateSingleProject(e,r,s,o,a){const n={dryRun:this.options.dryRun,overwrite:this.options.overwrite},c=[...Os];r.packageManager==="pnpm"?c.push(Cs):r.packageManager==="yarn"&&c.push(xs),await Ls(e,r,this.fileWriter,n,o,a);for(const l of c)await this.renderAndWrite(l.src,l.dest,r,o,a);for(const l of s){if(l==="monorepo/packages/db")continue;const p=zs[l];if(p){for(const f of p)f.dest==="package.json"||f.dest==="pnpm-workspace.yaml"||f.dest===".yarnrc.yml"||await this.renderAndWrite(f.src,f.dest,r,o,a);continue}const h=Ut[l];if(!h)continue;const m=l==="extras/database"||l==="monorepo/packages/db"?this.filterDatabaseTemplates(h,r):h;for(const f of m)f.dest==="docker-compose.yml"&&e.database.length>0||await this.renderAndWrite(f.src,f.dest,r,o,a)}if(e.extras.includes("docker")&&e.database.length>0){const l=Lt(e),p=await this.fileWriter.writeFile({content:l,filePath:"docker-compose.yml",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});p.written&&o.push(p.filePath)}if(e.extras.includes("swagger")&&console.log("Swagger support added to project"),e.orm.includes("prisma")&&(await this.generatePrismaSchema(e,o,a),await this.renderAndWrite("base/prisma.config.ts.hbs","prisma.config.ts",r,o,a)),e.orm.includes("drizzle")&&await this.generateDrizzleConfig(e,o,a),e.auth!=="none"){const l=Gt.composeGenerators(e),p=await $t(e,this.fileWriter.getBaseDir(),l);for(const h of p)!h.success&&h.error&&a.push(h.error)}}async generateMonorepo(e,r,s,o,a){const n={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await Fs(e,r,this.fileWriter,n,o,a),await Bs(e,r,this.fileWriter,n,o,a),e.database.length>0&&await Us(e,r,this.fileWriter,n,o,a);for(const c of s){if(c==="monorepo/root"){for(const h of Bt)await this.renderAndWrite(h.src,h.dest,r,o,a);r.packageManager==="pnpm"?await this.renderAndWrite("monorepo/root/pnpm-workspace.yaml.hbs","pnpm-workspace.yaml",r,o,a):r.packageManager==="yarn"&&await this.renderAndWrite("monorepo/root/.yarnrc.yml.hbs",".yarnrc.yml",r,o,a);continue}const l=Ut[c];if(!l)continue;const p=c==="extras/database"||c==="monorepo/packages/db"?this.filterDatabaseTemplates(l,r):l;for(const h of p)h.dest!=="packages/db/package.json"&&(h.dest==="docker-compose.yml"&&e.database.length>0||await this.renderAndWrite(h.src,h.dest,r,o,a))}if(e.extras.includes("docker")&&e.database.length>0){const c=Lt(e),l=await this.fileWriter.writeFile({content:c,filePath:"docker-compose.yml",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});l.written&&o.push(l.filePath)}if(e.orm.includes("prisma")&&(await this.generatePrismaSchema(e,o,a),await this.renderAndWrite("base/prisma.config.ts.hbs","prisma.config.ts",r,o,a)),e.orm.includes("drizzle")&&await this.generateDrizzleConfig(e,o,a),e.auth!=="none"){const c=Gt.composeGenerators(e),l=await $t(e,this.fileWriter.getBaseDir(),c);for(const p of l)!p.success&&p.error&&a.push(p.error)}}async generateMetadata(e,r,s,o){try{const{buildMetadata:a,serializeMetadata:n,buildSchemaContent:c}=await import("./index-
|
|
101
|
+
`),filesCount:s.length,generatedFiles:s,success:l&&o.length===0}}catch(a){return{error:a instanceof Error?a.message:"Unknown error",filesCount:0,generatedFiles:s,success:!1}}}async generateSingleProject(e,r,s,o,a){const n={dryRun:this.options.dryRun,overwrite:this.options.overwrite},c=[...Os];r.packageManager==="pnpm"?c.push(Cs):r.packageManager==="yarn"&&c.push(xs),await Ls(e,r,this.fileWriter,n,o,a);for(const l of c)await this.renderAndWrite(l.src,l.dest,r,o,a);for(const l of s){if(l==="monorepo/packages/db")continue;const p=zs[l];if(p){for(const f of p)f.dest==="package.json"||f.dest==="pnpm-workspace.yaml"||f.dest===".yarnrc.yml"||await this.renderAndWrite(f.src,f.dest,r,o,a);continue}const h=Ut[l];if(!h)continue;const m=l==="extras/database"||l==="monorepo/packages/db"?this.filterDatabaseTemplates(h,r):h;for(const f of m)f.dest==="docker-compose.yml"&&e.database.length>0||await this.renderAndWrite(f.src,f.dest,r,o,a)}if(e.extras.includes("docker")&&e.database.length>0){const l=Lt(e),p=await this.fileWriter.writeFile({content:l,filePath:"docker-compose.yml",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});p.written&&o.push(p.filePath)}if(e.extras.includes("swagger")&&console.log("Swagger support added to project"),e.orm.includes("prisma")&&(await this.generatePrismaSchema(e,o,a),await this.renderAndWrite("base/prisma.config.ts.hbs","prisma.config.ts",r,o,a)),e.orm.includes("drizzle")&&await this.generateDrizzleConfig(e,o,a),e.auth!=="none"){const l=Gt.composeGenerators(e),p=await $t(e,this.fileWriter.getBaseDir(),l);for(const h of p)!h.success&&h.error&&a.push(h.error)}}async generateMonorepo(e,r,s,o,a){const n={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await Fs(e,r,this.fileWriter,n,o,a),await Bs(e,r,this.fileWriter,n,o,a),e.database.length>0&&await Us(e,r,this.fileWriter,n,o,a);for(const c of s){if(c==="monorepo/root"){for(const h of Bt)await this.renderAndWrite(h.src,h.dest,r,o,a);r.packageManager==="pnpm"?await this.renderAndWrite("monorepo/root/pnpm-workspace.yaml.hbs","pnpm-workspace.yaml",r,o,a):r.packageManager==="yarn"&&await this.renderAndWrite("monorepo/root/.yarnrc.yml.hbs",".yarnrc.yml",r,o,a);continue}const l=Ut[c];if(!l)continue;const p=c==="extras/database"||c==="monorepo/packages/db"?this.filterDatabaseTemplates(l,r):l;for(const h of p)h.dest!=="packages/db/package.json"&&(h.dest==="docker-compose.yml"&&e.database.length>0||await this.renderAndWrite(h.src,h.dest,r,o,a))}if(e.extras.includes("docker")&&e.database.length>0){const c=Lt(e),l=await this.fileWriter.writeFile({content:c,filePath:"docker-compose.yml",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});l.written&&o.push(l.filePath)}if(e.orm.includes("prisma")&&(await this.generatePrismaSchema(e,o,a),await this.renderAndWrite("base/prisma.config.ts.hbs","prisma.config.ts",r,o,a)),e.orm.includes("drizzle")&&await this.generateDrizzleConfig(e,o,a),e.auth!=="none"){const c=Gt.composeGenerators(e),l=await $t(e,this.fileWriter.getBaseDir(),c);for(const p of l)!p.success&&p.error&&a.push(p.error)}}async generateMetadata(e,r,s,o){try{const{buildMetadata:a,serializeMetadata:n,buildSchemaContent:c}=await import("./index-BQXvSdO-.js"),l=a(e),p=n(l),h=await this.fileWriter.writeFile({content:p,filePath:"nest-arch.jsonc",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});h.written&&s.push(h.filePath);const m=c(),f=await this.fileWriter.writeFile({content:m,filePath:"schema.json",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});f.written&&s.push(f.filePath)}catch(a){const n=a instanceof Error?a.message:String(a);o.push(`Failed to generate nest-arch.jsonc/schema.json: ${n}`)}}filterDatabaseTemplates(e,r){const s=!!r.usePrisma,o=!!r.useTypeorm,a=!!r.useDrizzle,n=!!r.useRawSql,c=!!r.hasPostgres,l=!!r.hasMysql,p=!!r.hasSqlite,h=!!r.hasMongodb;return e.filter(m=>{const{dest:f}=m;return f.includes("prisma-sql.adapter")?s&&(c||l||p):f.includes("prisma-mongo.adapter")?s&&h:f.includes("typeorm-sql.adapter")?o&&(c||l||p):f.includes("orm/typeorm/data-source")||f.includes("entities/")?o:f.includes("drizzle-sql.adapter")?a:f.includes("raw-sql.adapter")?n&&(c||l||p):f.includes("raw-mongo.adapter")?n&&h:f.includes("orm/drizzle/schema")?a:!0})}async generatePrismaSchema(e,r,s){let o="postgresql";e.database.includes("mysql")?o="mysql":e.database.includes("sqlite")?o="sqlite":e.database.includes("mongodb")&&(o="mongodb");const a=["generator client {",' provider = "prisma-client"',' output = "./generated"',"}","","datasource db {",` provider = "${o}"`,"}",""].join(`
|
|
102
102
|
`);try{const n=await this.fileWriter.writeFile({content:a,filePath:"src/database/orm/prisma/schema.prisma",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});n.written&&r.push(n.filePath)}catch(n){const c=n instanceof Error?n.message:String(n);s.push(`Failed to generate src/database/orm/prisma/schema.prisma: ${c}`)}}async generateDrizzleConfig(e,r,s){let o="postgresql";e.database.includes("mysql")?o="mysql":e.database.includes("sqlite")&&(o="sqlite");const a=e.projectType==="monorepo"?"./packages/db/src/orm/drizzle/schema.ts":"./src/database/orm/drizzle/schema.ts",n=a.replace("/schema.ts","/migrations");let c="process.env.POSTGRES_URL!";e.database.includes("mysql")?c="process.env.MYSQL_URL!":e.database.includes("sqlite")&&(c="process.env.SQLITE_PATH!");const l=[e.formatter==="oxlint-oxfmt"?"// oxlint-disable typescript/no-non-null-assertion":"","import 'dotenv/config';","import { defineConfig } from 'drizzle-kit';","","export default defineConfig({"," dbCredentials: {",` url: ${c},`," },",` dialect: '${o}',`,` out: '${n}',`,` schema: '${a}',`,"});",""].join(`
|
|
103
103
|
`);try{const p=await this.fileWriter.writeFile({content:l,filePath:"drizzle.config.ts",isBinary:!1},{dryRun:this.options.dryRun,overwrite:this.options.overwrite});p.written&&r.push(p.filePath)}catch(p){const h=p instanceof Error?p.message:String(p);s.push(`Failed to generate drizzle.config.ts: ${h}`)}}async renderAndWrite(e,r,s,o,a){try{const n=await this.templateEngine.renderToFile(e,r,{context:s}),c=await this.fileWriter.writeFile(n,{dryRun:this.options.dryRun,overwrite:this.options.overwrite});c.written&&o.push(c.filePath)}catch(n){const c=n instanceof Error?n.message:String(n);a.push(`Failed to generate ${r}: ${c}`),console.error(`Failed to generate ${r}:`,n)}}getBaseDir(){return this.fileWriter.getBaseDir()}clearCaches(){this.templateEngine.clearCache(),this.registry.clear()}}const Ws=/Resolved|Resolving/iu,Js=/Downloaded?|downloaded/iu,Ys=/Link(ed|ing)/iu,Ks=/saved (to )?(lockfile|bun)/iu;function Vs(t){const e=[],r=t.split(`
|
|
104
104
|
`);for(const s of r){const o=s.trim();if(o){if(Ws.test(o)){e.push({message:"Resolving packages...",phase:"resolve"});continue}if(Js.test(o)){e.push({message:"Downloading...",phase:"download"});continue}if(Ys.test(o)){e.push({message:"Linking packages...",phase:"link"});continue}if(o.includes("packages installed")){e.push({message:o,percentage:100,phase:"link"});continue}if(Ks.test(o)){e.push({message:"Saving lockfile...",phase:"postinstall"});continue}(o.includes("[script]")||o.includes("postinstall"))&&e.push({message:"Running postinstall scripts...",phase:"postinstall"})}}return e}u(Vs,"parseBunText");class Qs{static{u(this,"BunInstaller")}async install(e,r,s){const o=Ae("bun install",[],{cwd:e,shell:!0,signal:s,stdio:["ignore","pipe","pipe"]});let a="";const n=u(l=>{const p=l.toString();a+=p;const h=Vs(p);for(const m of h)r?.(m)},"handleData");o.stderr.on("data",n),o.stdout.on("data",n);const[c]=await Promise.race([se(o,"close"),se(o,"error").then(([l])=>{const p=l;throw p.code==="ENOENT"||p.code==="EINVAL"?new Error(["Bun is not installed or not found in your PATH.",""," Install Bun: https://bun.sh",""," Then restart your terminal and try again."].join(`
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"react/jsx-runtime";import"ink";import"react";import"./index-
|
|
1
|
+
import"react/jsx-runtime";import"ink";import"react";import"./index-lnGBhuOD.js";import"ink-text-input";import"@t3-oss/env-nextjs";import"zod";import"node:fs";import"node:os";import"node:path";import"node:fs/promises";import"handlebars";import"node:child_process";import"node:util";import"ts-morph";import"node:events";import"open";
|
|
@@ -13,7 +13,7 @@ if [ -z "$STAGED_FILES" ]; then
|
|
|
13
13
|
fi
|
|
14
14
|
|
|
15
15
|
# Run formatter
|
|
16
|
-
{{#if isPnpm}}pnpm dlx ultracite fix{{else if isYarn}}yarn dlx ultracite fix{{else if isBun}}bunx ultracite fix{{else}}npx ultracite fix{{/if}}
|
|
16
|
+
{{#if isPnpm}}pnpm dlx ultracite fix{{else if isYarn}}yarn dlx ultracite fix{{else if isBun}}bunx ultracite fix{{else}}npx --yes ultracite fix{{/if}}
|
|
17
17
|
FORMAT_EXIT_CODE=$?
|
|
18
18
|
|
|
19
19
|
# Re-stage files that were already staged
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nest-arch/tui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.46",
|
|
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.
|
|
51
|
+
"@nest-arch/core": "0.1.46",
|
|
52
52
|
"@nest-arch/env": "0.0.0",
|
|
53
53
|
"@nest-arch/shared": "0.0.0"
|
|
54
54
|
},
|