@nest-arch/tui 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +31 -0
  2. package/dist/cli.js +2 -1
  3. package/dist/{constants-DX5wiqrq.js → constants-CUTbfu9C.js} +1 -1
  4. package/dist/index.js +6 -417
  5. package/dist/nonInteractive-C1KZ0b_6.js +5 -0
  6. package/dist/nonInteractiveOptions-CIaoLAWg.js +24 -0
  7. package/dist/projectGeneratorService-CeWJK-HA.js +420 -0
  8. package/dist/projectName-CcE90t2V.js +1 -0
  9. package/dist/templates/base/.env.example.hbs +23 -0
  10. package/dist/templates/base/prisma.config.ts.hbs +6 -6
  11. package/dist/templates/base/src/app.controller.spec.ts.hbs +6 -0
  12. package/dist/templates/base/src/app.module.ts.hbs +1 -1
  13. package/dist/templates/base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs +5 -5
  14. package/dist/templates/base/src/database/adapters/mongo/raw-mongo.adapter.ts.hbs +2 -2
  15. package/dist/templates/base/src/database/adapters/mongo/typeorm-mongo.adapter.ts.hbs +27 -0
  16. package/dist/templates/base/src/database/db.module.ts.hbs +22 -16
  17. package/dist/templates/base/src/database/db.service.ts.hbs +7 -2
  18. package/dist/templates/base/src/database/entities/todo.entity.ts.hbs +15 -3
  19. package/dist/templates/base/src/database/orm/drizzle/schema.ts.hbs +38 -14
  20. package/dist/templates/base/src/database/orm/typeorm/data-source.ts.hbs +12 -6
  21. package/dist/templates/base/src/libs/middlewares/rate-limit.trpc.middleware.ts.hbs +2 -1
  22. package/dist/templates/base/test/app.e2e-spec.ts.hbs +14 -10
  23. package/dist/templates/extras/docker/Dockerfile.hbs +2 -2
  24. package/dist/templates/extras/health/src/health/health.controller.ts.hbs +5 -0
  25. package/dist/templates/feature/rest/todo-example/src/api/todo/todo.router.ts.hbs +4 -4
  26. package/dist/templates/feature/rest/todo-example/src/api/todo/todo.service.ts.hbs +135 -11
  27. package/dist/templates/single-project/architecture/nest-microservice/.env.hbs +24 -1
  28. package/dist/templates/single-project/architecture/nest-microservice/proto/app.proto.hbs +13 -0
  29. package/dist/templates/single-project/architecture/nest-microservice/src/app.controller.ts.hbs +24 -0
  30. package/dist/templates/single-project/architecture/nest-microservice/src/app.module.ts.hbs +33 -0
  31. package/dist/templates/single-project/architecture/nest-microservice/src/app.service.ts.hbs +16 -4
  32. package/dist/templates/single-project/architecture/nest-microservice/src/main.ts.hbs +25 -6
  33. package/dist/templates/single-project/architecture/nest-microservice/test/microservice.e2e-spec.ts.hbs +7 -122
  34. package/dist/templates/single-project/shared/config/env.ts.hbs +14 -14
  35. package/package.json +2 -1
@@ -0,0 +1,5 @@
1
+ var n=Object.defineProperty;var i=(o,t)=>n(o,"name",{value:t,configurable:!0});import{readdir as p}from"node:fs/promises";import{resolve as a}from"node:path";import{D as c,g as m,c as u}from"./projectGeneratorService-CeWJK-HA.js";import{resolveGenerationOptions as f}from"./nonInteractiveOptions-CIaoLAWg.js";import"node:fs";import"node:os";import"node:child_process";import"node:util";import"handlebars";import"ts-morph";import"node:crypto";import"node:events";import"@t3-oss/env-nextjs";import"zod";import"./constants-CUTbfu9C.js";import"node:net";import"jsonc-parser";import"./projectName-CcE90t2V.js";async function w(o){try{if((await p(o)).length>0)throw new Error(`Destination is not empty: ${o}. Choose another --output-dir.`)}catch(t){if(t instanceof Error&&"code"in t&&t.code==="ENOENT")return;throw t}}i(w,"assertEmptyDestination");async function d(o){const t=await f(o);c(t.context);const s=a(t.outputDir??m(t.context.projectName));await w(s);const r=await u(t.context,s,{onStageChange:i(e=>process.stdout.write(`[nest-arch] ${e}
2
+ `),"onStageChange")});if(!r.success)throw new Error(r.message);process.stdout.write(`${r.message}
3
+ ${r.outputDir}
4
+ `);for(const e of r.nextSteps)process.stdout.write(`${e.title}${e.description?`: ${e.description}`:""}
5
+ `)}i(d,"runNonInteractive");export{d as runNonInteractive};
@@ -0,0 +1,24 @@
1
+ var w=Object.defineProperty;var c=(n,t)=>w(n,"name",{value:t,configurable:!0});import{readFile as v}from"node:fs/promises";import{isIP as y}from"node:net";import{parse as b,printParseErrorCode as k}from"jsonc-parser";import{z as e}from"zod";import{M as x,P as E}from"./projectName-CcE90t2V.js";function j(n){const[t,r,s]=n.split("/");if(!t||s!==void 0)return!1;const a=y(t);if(a===0)return!1;if(r===void 0)return!0;const i=Number(r);return r!==""&&Number.isInteger(i)&&i>=0&&i<=(a===4?32:128)}c(j,"isTrustedProxyAddress");const h=e.object({addons:e.array(e.enum(["agent-skills","husky","ultracite","nestjs-zod","scalar-ui"])).default([]),api:e.array(e.enum(["rest","trpc","graphql"])).default(["rest"]),architecture:e.enum(["nest-api","nest-gateway","nest-microservice"]).default("nest-api"),auth:e.enum(["none","passport","better-auth","better-auth:stateless"]).default("none"),database:e.array(e.enum(["postgresql","mysql","sqlite","mongodb","sqlserver"])).default([]),description:e.string().optional(),extras:e.array(e.enum(["docker","health-check","rate-limiting","swagger","packages/shared","todo-example","typescript-7"])).default([]),formatter:e.enum(["biome","eslint-prettier-stylelint","eslint-prettier-no-stylelint","oxlint-oxfmt","none"]).default("none"),httpProvider:e.enum(["express","fastify"]).default("express"),initGit:e.boolean().default(!1),installDependencies:e.boolean().default(!1),microservices:e.array(e.enum(["redis","mqtt","nats","rabbitmq","kafka","grpc"])).default([]),orm:e.array(e.enum(["prisma","typeorm","drizzle"])).default([]),packageManager:e.enum(["pnpm","npm","yarn","bun"]).default("pnpm"),prismaVersion:e.enum(["6","7","8"]).optional(),projectName:e.string().min(1).max(x).regex(E),projectType:e.enum(["single","monorepo"]).default("single"),trustedProxyIps:e.array(e.string().refine(j,"Expected an IP address or CIDR")).optional(),ultraciteAgents:e.array(e.enum(["universal","claude","codex","jules","replit","devin","lovable","zencoder","ona","openclaw","continue","snowflake-cortex","deepagents","qoder","kimi-cli","mcpjam","mux","pi","adal","copilot","cline","amp","aider","firebase-studio","open-hands","gemini","junie","augmentcode","kilo-code","goose","roo-code","warp","droid","opencode","crush","qwen","amazon-q-cli","firebender","cursor-cli","mistral-vibe","vercel"])).default([]),ultraciteEditors:e.array(e.enum(["universal","vscode","cursor","windsurf","antigravity","kiro","trae","void","bob","codebuddy","zed"])).default([]),ultraciteHooks:e.array(e.enum(["cursor","windsurf","codebuddy","claude","copilot"])).default([]),ultraciteInstallSkill:e.enum(["yes","no"]).default("no")}),p={"--architecture":"architecture","--auth":"auth","--description":"description","--description-base64":"description","--formatter":"formatter","--http-provider":"httpProvider","--package-manager":"packageManager","--prisma-version":"prismaVersion","--project-type":"projectType","--ultracite-install-skill":"ultraciteInstallSkill"},f={"--addons":"addons","--api":"api","--database":"database","--extras":"extras","--microservices":"microservices","--orm":"orm","--trusted-proxy-ips":"trustedProxyIps","--ultracite-agents":"ultraciteAgents","--ultracite-editors":"ultraciteEditors","--ultracite-hooks":"ultraciteHooks"},$=`Usage: nest-arch [project-name] [options]
2
+ nest-arch --config nest-arch.jsonc [options]
3
+ nest-arch --ui
4
+
5
+ No arguments opens the interactive wizard. A project name or --config generates
6
+ without prompts. CLI options override configuration fields.
7
+
8
+ Scalar options:
9
+ ${Object.keys(p).join(`
10
+ `)}
11
+ List options (space-separated values; 'none' clears a list):
12
+ ${Object.keys(f).join(`
13
+ `)}
14
+ Other options:
15
+ --config <path> Read JSONC generation metadata
16
+ --output-dir <path> Exact destination directory
17
+ --install-dependencies yes|no (default: no)
18
+ --git | --no-git Initialize Git (default: no)
19
+ --help, -h Show help
20
+ --version, -v Show version
21
+
22
+ Defaults: single nest-api, Express, REST, pnpm, no database/auth/addons/formatter.
23
+ Existing nonempty destination directories are rejected.
24
+ `;function d(n,t){const r=n.shift();if(r===void 0||r.startsWith("--"))throw new Error(`${t} requires a value`);return r}c(d,"takeValue");function g(n,t){return Object.hasOwn(n,t)}c(g,"hasFlag");function P(n,t){const r=[];for(;n[0]!==void 0&&!n[0].startsWith("--");)r.push(d(n,t));if(r.length===0)throw new Error(`${t} requires at least one value (or none)`);if(r.includes("none")){if(r.length!==1)throw new Error(`${t}: none cannot be combined with other values`);return[]}return[...new Set(r)]}c(P,"takeList");function O(n){const t=Buffer.from(n,"base64");if(t.toString("base64")!==n)throw new Error("--description-base64 requires valid base64-encoded UTF-8");return new TextDecoder("utf-8",{fatal:!0}).decode(t)}c(O,"decodeDescription");function q(n){const t=[...n],r={overrides:{}},s=new Set;for(t[0]&&!t[0].startsWith("-")&&(r.overrides.projectName=t.shift());t.length>0;){const a=t.shift();if(!a)break;const i=a.indexOf("="),o=i===-1?a:a.slice(0,i),l=i===-1?void 0:a.slice(i+1),m=o==="--no-git"?"--git":o.replace("-base64","");if(s.has(m))throw new Error(`Duplicate option: ${o}`);if(s.add(m),g(p,o)){const u=l??d(t,o);r.overrides[p[o]]=o==="--description-base64"?O(u):u}else if(g(f,o))l!==void 0&&t.unshift(l),r.overrides[f[o]]=P(t,o);else if(o==="--git"||o==="--no-git"){if(l!==void 0)throw new Error(`${o} does not accept a value`);r.overrides.initGit=o==="--git"}else if(o==="--install-dependencies"){const u=l??d(t,o);if(u!=="yes"&&u!=="no")throw new Error(`${o} must be yes or no`);r.overrides.installDependencies=u==="yes"}else if(o==="--config")r.configPath=l??d(t,o);else if(o==="--output-dir")r.outputDir=l??d(t,o);else throw new Error(`Unknown option: ${o}. Use --help for usage.`)}if(r.configPath===""||r.outputDir==="")throw new Error("--config and --output-dir require nonempty paths");return r}c(q,"parseOptions");async function I(n){const t=[],r=b(await v(n,"utf-8"),t,{allowTrailingComma:!0});if(t.length>0)throw new Error(`Invalid JSONC in ${n}: ${t.map(i=>`${k(i.error)} at offset ${i.offset}`).join(", ")}`);const s=e.record(e.string(),e.unknown()).safeParse(r);if(!s.success)throw new Error(`Configuration must be an object: ${n}`);const a=new Set(["$schema","version","createdAt","reproducibleCommand"]);for(const i of Object.keys(s.data))if(!Object.hasOwn(h.shape,i)&&!a.has(i))throw new Error(`Unknown configuration field: ${i}`);return s.data}c(I,"readConfig");async function S(n){const{configPath:t,outputDir:r,overrides:s}=q(n),a=t?await I(t):{},i=h.safeParse({...a,...s});if(!i.success)throw new Error(`Invalid generation options: ${i.error.issues.map(o=>`${o.path.join(".")}: ${o.message}`).join("; ")}`);return{context:i.data,outputDir:r}}c(S,"resolveGenerationOptions");export{$ as CLI_HELP,S as resolveGenerationOptions};