better-ts-stack 1.1.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +113 -82
  2. package/dist/args.d.ts +12 -0
  3. package/dist/args.d.ts.map +1 -0
  4. package/dist/args.js +90 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/builder/configGenerator.d.ts.map +1 -1
  7. package/dist/builder/configGenerator.js +10 -3
  8. package/dist/builder/configGenerator.js.map +1 -1
  9. package/dist/builder/dependencyInstaller.d.ts.map +1 -1
  10. package/dist/builder/dependencyInstaller.js +8 -14
  11. package/dist/builder/dependencyInstaller.js.map +1 -1
  12. package/dist/builder/gitInitializer.d.ts.map +1 -1
  13. package/dist/builder/gitInitializer.js +8 -41
  14. package/dist/builder/gitInitializer.js.map +1 -1
  15. package/dist/builder/index.d.ts.map +1 -1
  16. package/dist/builder/index.js +24 -63
  17. package/dist/builder/index.js.map +1 -1
  18. package/dist/builder/moduleSelector.d.ts +1 -4
  19. package/dist/builder/moduleSelector.d.ts.map +1 -1
  20. package/dist/builder/moduleSelector.js +11 -15
  21. package/dist/builder/moduleSelector.js.map +1 -1
  22. package/dist/builder/templateContext.d.ts +2 -17
  23. package/dist/builder/templateContext.d.ts.map +1 -1
  24. package/dist/builder/templateContext.js +6 -5
  25. package/dist/builder/templateContext.js.map +1 -1
  26. package/dist/index.js +45 -20
  27. package/dist/index.js.map +1 -1
  28. package/dist/output/nextSteps.d.ts +1 -2
  29. package/dist/output/nextSteps.d.ts.map +1 -1
  30. package/dist/output/nextSteps.js +10 -19
  31. package/dist/output/nextSteps.js.map +1 -1
  32. package/dist/prompts/index.d.ts +3 -3
  33. package/dist/prompts/index.d.ts.map +1 -1
  34. package/dist/prompts/index.js +22 -58
  35. package/dist/prompts/index.js.map +1 -1
  36. package/dist/prompts/stack.d.ts +3 -2
  37. package/dist/prompts/stack.d.ts.map +1 -1
  38. package/dist/prompts/stack.js +81 -70
  39. package/dist/prompts/stack.js.map +1 -1
  40. package/dist/types/index.d.ts +20 -42
  41. package/dist/types/index.d.ts.map +1 -1
  42. package/dist/types/index.js +40 -38
  43. package/dist/types/index.js.map +1 -1
  44. package/dist/ui/index.d.ts +3 -0
  45. package/dist/ui/index.d.ts.map +1 -0
  46. package/dist/ui/index.js +19 -0
  47. package/dist/ui/index.js.map +1 -0
  48. package/dist/ui/messages.d.ts +9 -0
  49. package/dist/ui/messages.d.ts.map +1 -0
  50. package/dist/ui/messages.js +100 -0
  51. package/dist/ui/messages.js.map +1 -0
  52. package/dist/ui/prompts.d.ts +20 -0
  53. package/dist/ui/prompts.d.ts.map +1 -0
  54. package/dist/ui/prompts.js +71 -0
  55. package/dist/ui/prompts.js.map +1 -0
  56. package/dist/ui/theme.d.ts +9 -0
  57. package/dist/ui/theme.d.ts.map +1 -0
  58. package/dist/ui/theme.js +24 -0
  59. package/dist/ui/theme.js.map +1 -0
  60. package/dist/validators/index.d.ts +1 -0
  61. package/dist/validators/index.d.ts.map +1 -1
  62. package/dist/validators/index.js +6 -0
  63. package/dist/validators/index.js.map +1 -1
  64. package/package.json +70 -66
  65. package/templates/backend/express/config.json +44 -44
  66. package/templates/backend/express/eslint.config.mjs +40 -40
  67. package/templates/backend/express/gitignore +36 -36
  68. package/templates/backend/express/src/index.ts +76 -76
  69. package/templates/backend/express/src/routes/health.ts +12 -12
  70. package/templates/backend/express/tsconfig.json +25 -25
  71. package/templates/backend/nestjs/.prettierignore +52 -0
  72. package/templates/backend/nestjs/.prettierrc +16 -0
  73. package/templates/backend/nestjs/config.json +44 -0
  74. package/templates/backend/nestjs/eslint.config.mjs +40 -0
  75. package/templates/backend/nestjs/gitignore +36 -0
  76. package/templates/backend/nestjs/nest-cli.json +9 -0
  77. package/templates/backend/nestjs/src/app.module.ts.hbs +34 -0
  78. package/templates/backend/nestjs/src/health/health.controller.ts +12 -0
  79. package/templates/backend/nestjs/src/main.ts +23 -0
  80. package/templates/backend/nestjs/tsconfig.eslint.json +9 -0
  81. package/templates/backend/nestjs/tsconfig.json +25 -0
  82. package/templates/frontend/nextjs/app/layout.tsx +13 -13
  83. package/templates/frontend/nextjs/app/page.tsx.hbs +97 -97
  84. package/templates/frontend/nextjs/components/ui/button.tsx +51 -51
  85. package/templates/frontend/nextjs/components/ui/card.tsx +60 -60
  86. package/templates/frontend/nextjs/components/ui/field.tsx +67 -67
  87. package/templates/frontend/nextjs/components/ui/input.tsx +18 -18
  88. package/templates/frontend/nextjs/components.json +19 -19
  89. package/templates/frontend/nextjs/config.json +38 -38
  90. package/templates/frontend/nextjs/eslint.config.mjs +11 -11
  91. package/templates/frontend/nextjs/gitignore +42 -42
  92. package/templates/frontend/nextjs/lib/utils.ts +6 -6
  93. package/templates/frontend/nextjs/next.config.ts.hbs +12 -12
  94. package/templates/frontend/nextjs/proxy.ts.hbs +24 -24
  95. package/templates/frontend/nextjs/tsconfig.json +34 -34
  96. package/templates/frontend/tanstack/config.json +48 -48
  97. package/templates/frontend/tanstack/src/routeTree.gen.ts +68 -68
  98. package/templates/frontend/tanstack/src/styles/app.css +85 -85
  99. package/templates/modules/auth/express/config.json +27 -26
  100. package/templates/modules/auth/express/src/controllers/authController.ts.hbs +116 -130
  101. package/templates/modules/auth/express/src/middleware/requireAuth.ts.hbs +26 -26
  102. package/templates/modules/auth/express/src/services/userStore.ts.hbs +117 -117
  103. package/templates/modules/auth/nestjs/config.json +24 -0
  104. package/templates/modules/auth/nestjs/src/auth/auth.controller.ts +46 -0
  105. package/templates/modules/auth/nestjs/src/auth/auth.guard.ts +36 -0
  106. package/templates/modules/auth/nestjs/src/auth/auth.module.ts.hbs +22 -0
  107. package/templates/modules/auth/nestjs/src/auth/auth.schemas.ts +35 -0
  108. package/templates/modules/auth/nestjs/src/auth/auth.service.ts +70 -0
  109. package/templates/modules/auth/nestjs/src/auth/jwt.ts +27 -0
  110. package/templates/modules/auth/nestjs/src/auth/users.service.ts.hbs +144 -0
  111. package/templates/modules/auth/nestjs/src/auth/zod-validation.pipe.ts +16 -0
  112. package/templates/modules/auth/nextjs/app/dashboard/page.tsx +96 -96
  113. package/templates/modules/auth/nextjs/app/sign-in/page.tsx +35 -35
  114. package/templates/modules/auth/nextjs/app/sign-up/page.tsx +35 -35
  115. package/templates/modules/auth/nextjs/components/auth/sign-in-form.tsx +132 -132
  116. package/templates/modules/auth/nextjs/components/auth/sign-out-button.tsx +50 -50
  117. package/templates/modules/auth/nextjs/components/auth/sign-up-form.tsx +152 -152
  118. package/templates/modules/auth/nextjs/config.json +31 -31
  119. package/templates/modules/auth/nextjs/lib/auth-schema.ts +39 -39
  120. package/templates/modules/auth/nextjs/lib/auth.ts.hbs +37 -37
  121. package/templates/modules/auth/tanstack/src/lib/auth-functions.ts +4 -4
  122. package/templates/modules/auth/tanstack/src/routeTree.gen.ts +140 -140
  123. package/templates/modules/docker/.dockerignore +14 -14
  124. package/templates/modules/docker/Dockerfile.hbs +137 -133
  125. package/templates/modules/docker/config.json +19 -19
  126. package/templates/modules/docker/docker-compose.yml.hbs +9 -9
  127. package/templates/modules/drizzle/express/config.json +27 -27
  128. package/templates/modules/drizzle/express/drizzle.config.ts +13 -13
  129. package/templates/modules/drizzle/express/src/lib/db.ts +13 -13
  130. package/templates/modules/drizzle/express/src/lib/schema.ts +10 -10
  131. package/templates/modules/drizzle/nestjs/config.json +27 -0
  132. package/templates/modules/drizzle/nestjs/drizzle.config.ts +13 -0
  133. package/templates/modules/drizzle/nestjs/src/database/database.module.ts +30 -0
  134. package/templates/modules/drizzle/nestjs/src/database/schema.ts +10 -0
  135. package/templates/modules/drizzle/nextjs/config.json +29 -29
  136. package/templates/modules/drizzle/nextjs/lib/db.ts +13 -13
  137. package/templates/modules/drizzle/nextjs/lib/schema.ts.hbs +84 -84
  138. package/templates/modules/mongoose/express/config.json +16 -16
  139. package/templates/modules/mongoose/nestjs/config.json +16 -0
  140. package/templates/modules/mongoose/nestjs/src/users/user.schema.ts +21 -0
  141. package/templates/modules/mongoose/nextjs/config.json +16 -16
  142. package/templates/modules/mongoose/nextjs/lib/db.ts +36 -36
  143. package/templates/modules/mongoose/tanstack/config.json +17 -17
  144. package/templates/modules/mongoose/tanstack/src/lib/db.ts +37 -37
  145. package/templates/modules/prisma/express/config.json +28 -28
  146. package/templates/modules/prisma/express/prisma/schema.prisma +1 -1
  147. package/templates/modules/prisma/express/prisma.config.ts +12 -12
  148. package/templates/modules/prisma/express/src/lib/prisma.ts +24 -24
  149. package/templates/modules/prisma/nestjs/config.json +28 -0
  150. package/templates/modules/prisma/nestjs/prisma/schema.prisma +23 -0
  151. package/templates/modules/prisma/nestjs/prisma.config.ts +12 -0
  152. package/templates/modules/prisma/nestjs/src/prisma/prisma.module.ts +11 -0
  153. package/templates/modules/prisma/nestjs/src/prisma/prisma.service.ts +17 -0
  154. package/templates/modules/prisma/nextjs/config.json +29 -29
  155. package/templates/modules/prisma/nextjs/prisma/schema.prisma.hbs +91 -91
  156. package/templates/modules/prisma/tanstack/config.json +5 -5
  157. package/dist/intro.d.ts +0 -2
  158. package/dist/intro.d.ts.map +0 -1
  159. package/dist/intro.js +0 -27
  160. package/dist/intro.js.map +0 -1
  161. package/templates/backend/express/.eslintrc.js +0 -24
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.build = build;
7
- const consola_1 = __importDefault(require("consola"));
8
7
  const fs_extra_1 = __importDefault(require("fs-extra"));
9
8
  const registry_1 = require("../modules/registry");
10
9
  const nextSteps_1 = require("../output/nextSteps");
@@ -18,107 +17,69 @@ const moduleSelector_1 = require("./moduleSelector");
18
17
  const templateContext_1 = require("./templateContext");
19
18
  // Main function to orchestrate the project construction process
20
19
  async function build(config, targetDir) {
21
- consola_1.default.start("Starting project building...");
20
+ // 1. Validate target directory
21
+ const validationResult = await (0, validators_1.validateDirectoryEmpty)(targetDir);
22
+ if (validationResult)
23
+ throw (0, types_1.buildError)(validationResult, "DIRECTORY_NOT_EMPTY");
24
+ const didDirectoryExist = await fs_extra_1.default.pathExists(targetDir);
22
25
  try {
23
- // 1. Validate target directory
24
- consola_1.default.info("Validating target directory...");
25
- const validationResult = await (0, validators_1.validateDirectoryEmpty)(targetDir);
26
- if (validationResult)
27
- throw (0, types_1.buildError)(validationResult, "DIRECTORY_NOT_EMPTY");
28
26
  // 2. Create target directory
29
- consola_1.default.info("Creating project directory...");
30
27
  await fs_extra_1.default.ensureDir(targetDir).catch((e) => {
31
28
  throw (0, types_1.buildError)(e, "DIRECTORY_CREATE_ERROR", "Failed to create directory");
32
29
  });
33
- // 3. Select modules
34
- consola_1.default.info("Selecting modules...");
30
+ // 3. Select and load modules
35
31
  const selection = (0, moduleSelector_1.selectModules)(config);
36
- // 4. Load modules
37
- consola_1.default.info("Loading module configurations...");
38
32
  const modules = [];
39
33
  try {
40
- const baseModule = await (0, registry_1.getModule)(selection.base);
41
- modules.push({ ...baseModule, framework: config.framework });
42
- for (const moduleWithFramework of selection.modules) {
43
- const module = await (0, registry_1.getModule)(moduleWithFramework.id);
44
- modules.push({ ...module, framework: moduleWithFramework.framework });
34
+ for (const id of [selection.base, ...selection.modules]) {
35
+ modules.push(await (0, registry_1.getModule)(id));
45
36
  }
46
37
  }
47
38
  catch (e) {
48
39
  throw (0, types_1.buildError)(e, "MODULE_LOADING_ERROR", "Failed to load modules");
49
40
  }
50
- consola_1.default.success(`Selected ${modules.length} modules: ${modules.map((m) => m.config.id).join(", ")}`);
51
- // 5. Build template context
52
- consola_1.default.info("Building template context...");
41
+ // 4. Build template context and merge module configurations
53
42
  const templateContext = (0, templateContext_1.buildTemplateContext)(config);
54
- // 6. Merge configurations
55
43
  const mergedConfig = (0, configGenerator_1.mergeConfigurations)(modules.map((m) => m.config), templateContext);
56
- // 7. Copy module files
57
- consola_1.default.info("Copying module files...");
44
+ // 5. Copy module files
58
45
  try {
59
46
  for (const module of modules) {
60
- consola_1.default.debug(` - Copying ${module.config.id}...`);
61
47
  await (0, fileProcessor_1.copyModuleFiles)(module.path, targetDir);
62
48
  }
63
- consola_1.default.success("Module files copied");
64
49
  }
65
50
  catch (e) {
66
51
  throw (0, types_1.buildError)(e, "FILE_COPY_ERROR", "Failed to copy module files");
67
52
  }
68
- // 8. Process Handlebars templates
69
- consola_1.default.info("Processing template files...");
53
+ // 6. Process Handlebars templates
70
54
  try {
71
- const allTemplateFiles = modules.flatMap((m) => m.config.templateFiles);
72
- if (allTemplateFiles.length > 0) {
73
- await (0, fileProcessor_1.processTemplateFiles)(targetDir, templateContext, allTemplateFiles);
74
- consola_1.default.success(`Processed ${allTemplateFiles.length} template file(s)`);
75
- }
76
- else {
77
- consola_1.default.info(" No template files to process");
78
- }
55
+ await (0, fileProcessor_1.processTemplateFiles)(targetDir, templateContext, modules.flatMap((m) => m.config.templateFiles));
79
56
  }
80
57
  catch (e) {
81
58
  throw (0, types_1.buildError)(e, "TEMPLATE_PROCESSING_ERROR", "Failed to process template files");
82
59
  }
83
- // 9. Generate package.json
84
- consola_1.default.info("Generating package.json...");
60
+ // 7. Generate package.json
85
61
  await (0, configGenerator_1.generatePackageJson)(targetDir, mergedConfig, config);
86
62
  if (config.packageManager === "pnpm") {
87
63
  await (0, configGenerator_1.generatePnpmWorkspace)(targetDir, mergedConfig.overrides);
88
64
  }
89
- consola_1.default.success("package.json generated");
90
- // 10. Generate environment files
91
- consola_1.default.info("Generating environment files...");
65
+ // 8. Generate environment files
92
66
  await (0, configGenerator_1.generateEnvFile)(targetDir, mergedConfig.envVars);
93
- consola_1.default.success("Environment files generated");
94
- // 11. Install dependencies (optional)
95
- let depsInstalled = false;
96
- if (config.installDeps) {
97
- try {
98
- depsInstalled = (0, dependencyInstaller_1.installDependencies)(config.packageManager, targetDir);
99
- }
100
- catch {
101
- consola_1.default.warn("Continuing despite dependency installation issues");
102
- }
103
- }
104
- // 12. Initialize git (optional)
105
- if (config.initGit) {
106
- try {
107
- (0, gitInitializer_1.initializeGitRepository)(targetDir);
108
- }
109
- catch {
110
- consola_1.default.warn("Continuing despite git initialization issues");
111
- }
112
- }
113
- // 13. Done!
114
- consola_1.default.success("Project building completed successfully!");
67
+ // 9. Install dependencies and initialize git (both optional); a failure
68
+ // in either is reported as a warning and does not fail the build
69
+ const depsInstalled = config.installDeps &&
70
+ (0, dependencyInstaller_1.installDependencies)(config.packageManager, targetDir);
71
+ if (config.initGit)
72
+ (0, gitInitializer_1.initializeGitRepository)(targetDir);
115
73
  return {
116
74
  success: true,
117
75
  projectPath: targetDir,
118
- nextSteps: (0, nextSteps_1.generateNextSteps)(config, depsInstalled),
76
+ nextSteps: (0, nextSteps_1.generateNextSteps)(config, targetDir, depsInstalled),
119
77
  };
120
78
  }
121
79
  catch (error) {
80
+ // Remove the partial project so a retry is not blocked by a non-empty
81
+ // directory; a directory that already existed is emptied, not deleted
82
+ await (didDirectoryExist ? fs_extra_1.default.emptyDir(targetDir) : fs_extra_1.default.remove(targetDir)).catch(() => undefined);
122
83
  throw (0, types_1.buildError)(error, "BUILDING_ERROR", "Building failed");
123
84
  }
124
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,6 @@
1
1
  import { ProjectConfig } from "../types";
2
2
  export declare function selectModules(config: ProjectConfig): {
3
3
  base: string;
4
- modules: {
5
- id: string;
6
- framework: string;
7
- }[];
4
+ modules: string[];
8
5
  };
9
6
  //# sourceMappingURL=moduleSelector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"moduleSelector.d.ts","sourceRoot":"","sources":["../../src/builder/moduleSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa;;;YAUtB,MAAM;mBAAa,MAAM;;EAiBrD"}
1
+ {"version":3,"file":"moduleSelector.d.ts","sourceRoot":"","sources":["../../src/builder/moduleSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa;;;EAmBlD"}
@@ -3,24 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.selectModules = selectModules;
4
4
  // Determines which base and feature modules to include based on user configuration
5
5
  function selectModules(config) {
6
- // Determine framework for module integration
7
- const framework = config.framework;
6
+ const { framework } = config;
8
7
  // Select base template based on app type
9
8
  const base = config.applicationType === "backend"
10
- ? `backend/${config.framework}`
11
- : `frontend/${config.framework}`;
9
+ ? `backend/${framework}`
10
+ : `frontend/${framework}`;
12
11
  const modules = [];
13
- // Add database module if selected (compound ids: prisma/express, drizzle/nextjs, mongoose/tanstack, ...)
14
- if (config.database !== "none") {
15
- modules.push({ id: `${config.database}/${framework}`, framework });
16
- }
17
- // Add feature modules based on configuration
18
- if (config.useDocker) {
19
- modules.push({ id: "docker", framework });
20
- }
21
- if (config.useAuth) {
22
- modules.push({ id: `auth/${framework}`, framework });
23
- }
12
+ // Database and auth modules have one variant per framework (prisma/express,
13
+ // auth/nextjs, ...); the Docker module is shared
14
+ if (config.database !== "none")
15
+ modules.push(`${config.database}/${framework}`);
16
+ if (config.useDocker)
17
+ modules.push("docker");
18
+ if (config.useAuth)
19
+ modules.push(`auth/${framework}`);
24
20
  return { base, modules };
25
21
  }
26
22
  //# sourceMappingURL=moduleSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"moduleSelector.js","sourceRoot":"","sources":["../../src/builder/moduleSelector.ts"],"names":[],"mappings":";;AAGA,sCA2BC;AA5BD,mFAAmF;AACnF,SAAgB,aAAa,CAAC,MAAqB;IACjD,6CAA6C;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAEnC,yCAAyC;IACzC,MAAM,IAAI,GACR,MAAM,CAAC,eAAe,KAAK,SAAS;QAClC,CAAC,CAAC,WAAW,MAAM,CAAC,SAAS,EAAE;QAC/B,CAAC,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC;IAErC,MAAM,OAAO,GAA6C,EAAE,CAAC;IAE7D,yGAAyG;IACzG,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,6CAA6C;IAC7C,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"moduleSelector.js","sourceRoot":"","sources":["../../src/builder/moduleSelector.ts"],"names":[],"mappings":";;AAGA,sCAmBC;AApBD,mFAAmF;AACnF,SAAgB,aAAa,CAAC,MAAqB;IACjD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAE7B,yCAAyC;IACzC,MAAM,IAAI,GACR,MAAM,CAAC,eAAe,KAAK,SAAS;QAClC,CAAC,CAAC,WAAW,SAAS,EAAE;QACxB,CAAC,CAAC,YAAY,SAAS,EAAE,CAAC;IAE9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,4EAA4E;IAC5E,iDAAiD;IACjD,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM;QAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC;IAEtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
@@ -1,21 +1,6 @@
1
- import { ProjectConfig } from "../types";
1
+ import { ProjectConfig, TemplateContext } from "../types";
2
2
  export declare function lowercase(str: string): string;
3
3
  export declare function uppercase(str: string): string;
4
4
  export declare function kebabCase(str: string): string;
5
- export declare function buildTemplateContext(config: ProjectConfig): {
6
- projectName: string;
7
- packageManager: import("../types").PackageManager;
8
- database: import("../types").DatabaseOption;
9
- framework: import("../types").BackendFramework | import("../types").FrontendFramework;
10
- port: number;
11
- useDocker: boolean;
12
- useAuth: boolean;
13
- helpers: {
14
- lowercase: typeof lowercase;
15
- uppercase: typeof uppercase;
16
- kebabCase: typeof kebabCase;
17
- eq: (a: string, b: string) => boolean;
18
- runner: () => "bun" | "node";
19
- };
20
- };
5
+ export declare function buildTemplateContext(config: ProjectConfig): TemplateContext;
21
6
  //# sourceMappingURL=templateContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templateContext.d.ts","sourceRoot":"","sources":["../../src/builder/templateContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAGD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAGD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK7C;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;gBAc5C,MAAM,KAAK,MAAM;;;EAO9B"}
1
+ {"version":3,"file":"templateContext.d.ts","sourceRoot":"","sources":["../../src/builder/templateContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGxE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAGD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAGD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK7C;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,CAoB3E"}
@@ -4,6 +4,8 @@ exports.lowercase = lowercase;
4
4
  exports.uppercase = uppercase;
5
5
  exports.kebabCase = kebabCase;
6
6
  exports.buildTemplateContext = buildTemplateContext;
7
+ // Context builder for Handlebars, providing variables and helpers for templates
8
+ const types_1 = require("../types");
7
9
  // Converts string to lowercase
8
10
  function lowercase(str) {
9
11
  return str.toLowerCase();
@@ -20,14 +22,13 @@ function kebabCase(str) {
20
22
  .toLowerCase();
21
23
  }
22
24
  function buildTemplateContext(config) {
23
- const framework = config.framework;
24
25
  return {
25
26
  projectName: config.projectName,
26
27
  packageManager: config.packageManager,
27
- database: config.database ?? "none",
28
- framework,
29
- port: 3000, // Default port
30
- useDocker: config.useDocker ?? false,
28
+ database: config.database,
29
+ framework: config.framework,
30
+ port: types_1.DEFAULT_PORT,
31
+ useDocker: config.useDocker,
31
32
  useAuth: config.useAuth,
32
33
  helpers: {
33
34
  lowercase,
@@ -1 +1 @@
1
- {"version":3,"file":"templateContext.js","sourceRoot":"","sources":["../../src/builder/templateContext.ts"],"names":[],"mappings":";;AAIA,8BAEC;AAGD,8BAEC;AAGD,8BAKC;AAED,oDAqBC;AAvCD,+BAA+B;AAC/B,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED,+BAA+B;AAC/B,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED,gCAAgC;AAChC,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,0BAA0B;SAC9D,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,oCAAoC;SAC5D,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAAqB;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM;QACnC,SAAS;QACT,IAAI,EAAE,IAAI,EAAE,eAAe;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QACpC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE;YACP,SAAS;YACT,SAAS;YACT,SAAS;YACT,EAAE,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC;YACrC,MAAM,EAAE,GAAG,EAAE;gBACX,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK;oBAAE,OAAO,KAAK,CAAC;gBAClD,OAAO,MAAM,CAAC;YAChB,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"templateContext.js","sourceRoot":"","sources":["../../src/builder/templateContext.ts"],"names":[],"mappings":";;AAIA,8BAEC;AAGD,8BAEC;AAGD,8BAKC;AAED,oDAoBC;AAzCD,gFAAgF;AAChF,oCAAwE;AAExE,+BAA+B;AAC/B,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED,+BAA+B;AAC/B,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED,gCAAgC;AAChC,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,0BAA0B;SAC9D,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,oCAAoC;SAC5D,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAAqB;IACxD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,IAAI,EAAE,oBAAY;QAClB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE;YACP,SAAS;YACT,SAAS;YACT,SAAS;YACT,EAAE,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC;YACrC,MAAM,EAAE,GAAG,EAAE;gBACX,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK;oBAAE,OAAO,KAAK,CAAC;gBAClD,OAAO,MAAM,CAAC;YAChB,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
package/dist/index.js CHANGED
@@ -4,31 +4,56 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- const prompts_1 = require("@clack/prompts");
8
- const consola_1 = __importDefault(require("consola"));
9
- const path_1 = __importDefault(require("path"));
10
- const process_1 = require("process");
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_process_1 = require("node:process");
10
+ const args_1 = require("./args");
11
11
  const builder_1 = require("./builder");
12
- const intro_1 = require("./intro");
13
- const nextSteps_1 = require("./output/nextSteps");
14
- const prompts_2 = require("./prompts");
12
+ const prompts_1 = require("./prompts");
13
+ const types_1 = require("./types");
14
+ const ui_1 = require("./ui");
15
+ const validators_1 = require("./validators");
15
16
  // Main entry point for the CLI tool
16
17
  async function main() {
17
- // Show interactive intro
18
- await (0, intro_1.showInteractiveIntro)();
19
- const config = await (0, prompts_2.collectUserChoices)();
20
- const targetDir = path_1.default.resolve((0, process_1.cwd)(), config.projectName);
21
- await (0, prompts_2.confirmBuild)(config, targetDir);
22
- const result = await (0, builder_1.build)(config, targetDir);
23
- if (result.success) {
24
- const nextStepsMessage = (0, nextSteps_1.displayNextSteps)(config.projectName, result.nextSteps);
25
- consola_1.default.success(nextStepsMessage);
26
- (0, prompts_1.outro)("Happy coding!");
27
- process.exit(0);
18
+ const args = (0, args_1.parseCliArgs)(process.argv.slice(2));
19
+ if (args.help) {
20
+ console.log(args_1.HELP_TEXT);
21
+ return;
22
+ }
23
+ const { version } = (await fs_extra_1.default.readJson(node_path_1.default.join(__dirname, "../package.json")));
24
+ if (args.version) {
25
+ console.log(version);
26
+ return;
28
27
  }
28
+ (0, ui_1.showBanner)(version, !args.yes);
29
+ const projectPath = await (0, prompts_1.collectProjectPath)(args.projectPath, args.yes);
30
+ const targetDir = node_path_1.default.resolve((0, node_process_1.cwd)(), projectPath);
31
+ // Fail before the remaining prompts when the directory cannot be used
32
+ const directoryError = await (0, validators_1.validateDirectoryEmpty)(targetDir);
33
+ if (directoryError)
34
+ throw (0, types_1.buildError)(directoryError, "DIRECTORY_NOT_EMPTY");
35
+ const choices = await (0, prompts_1.collectStackChoices)(args.yes ? { ...types_1.DEFAULT_CHOICES, ...args.choices } : args.choices);
36
+ const config = {
37
+ projectName: node_path_1.default.basename(targetDir),
38
+ applicationType: (0, types_1.getApplicationType)(choices.framework),
39
+ ...choices,
40
+ };
41
+ (0, ui_1.showSummary)(config, targetDir);
42
+ if (args.dryRun) {
43
+ (0, ui_1.info)("Dry run: no files were written.");
44
+ return;
45
+ }
46
+ if (!args.yes)
47
+ await (0, prompts_1.confirmBuild)();
48
+ const result = await (0, builder_1.build)(config, targetDir);
49
+ (0, ui_1.success)("Project created");
50
+ (0, ui_1.showNextSteps)(result.nextSteps);
29
51
  }
30
- main().catch((err) => {
31
- consola_1.default.error("❌ Error:", err);
52
+ main()
53
+ .then(() => process.exit(0))
54
+ .catch((err) => {
55
+ // Errors raised by the CLI carry a code and a message meant for the user
56
+ (0, ui_1.error)(err instanceof Error && "code" in err ? err.message : String(err));
32
57
  process.exit(1);
33
58
  });
34
59
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,4CAAuC;AACvC,sDAA8B;AAC9B,gDAAwB;AACxB,qCAA8B;AAE9B,uCAAkC;AAClC,mCAA+C;AAC/C,kDAAsD;AACtD,uCAA6D;AAE7D,oCAAoC;AACpC,KAAK,UAAU,IAAI;IACjB,yBAAyB;IACzB,MAAM,IAAA,4BAAoB,GAAE,CAAC;IAE7B,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAkB,GAAE,CAAC;IAE1C,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,IAAA,aAAG,GAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAE1D,MAAM,IAAA,sBAAY,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,MAAM,IAAA,eAAK,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE9C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,gBAAgB,GAAG,IAAA,4BAAgB,EACvC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,SAAS,CACjB,CAAC;QACF,iBAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAClC,IAAA,eAAK,EAAC,eAAe,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,iBAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,wDAA0B;AAC1B,0DAA6B;AAC7B,+CAAmC;AAEnC,iCAAiD;AACjD,uCAAkC;AAClC,uCAImB;AACnB,mCAKiB;AACjB,6BAOc;AACd,6CAAsD;AAEtD,oCAAoC;AACpC,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,IAAA,mBAAY,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,gBAAS,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,kBAAE,CAAC,QAAQ,CACpC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CACxC,CAAwB,CAAC;IAE1B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAA,eAAU,EAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/B,MAAM,WAAW,GAAG,MAAM,IAAA,4BAAkB,EAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAA,kBAAG,GAAE,EAAE,WAAW,CAAC,CAAC;IAEnD,sEAAsE;IACtE,MAAM,cAAc,GAAG,MAAM,IAAA,mCAAsB,EAAC,SAAS,CAAC,CAAC;IAC/D,IAAI,cAAc;QAAE,MAAM,IAAA,kBAAU,EAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;IAE5E,MAAM,OAAO,GAAG,MAAM,IAAA,6BAAmB,EACvC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,uBAAe,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAClE,CAAC;IAEF,MAAM,MAAM,GAAkB;QAC5B,WAAW,EAAE,mBAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACrC,eAAe,EAAE,IAAA,0BAAkB,EAAC,OAAO,CAAC,SAAS,CAAC;QACtD,GAAG,OAAO;KACX,CAAC;IAEF,IAAA,gBAAW,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAA,SAAI,EAAC,iCAAiC,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAA,sBAAY,GAAE,CAAC;IAEpC,MAAM,MAAM,GAAG,MAAM,IAAA,eAAK,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE9C,IAAA,YAAO,EAAC,iBAAiB,CAAC,CAAC;IAC3B,IAAA,kBAAa,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE;KACH,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC3B,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACb,yEAAyE;IACzE,IAAA,UAAK,EAAC,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,4 +1,3 @@
1
1
  import { ProjectConfig } from "../types";
2
- export declare function generateNextSteps(config: ProjectConfig, depsInstalled: boolean): string[];
3
- export declare function displayNextSteps(_projectName: string, steps: string[]): string;
2
+ export declare function generateNextSteps(config: ProjectConfig, targetDir: string, depsInstalled: boolean): string[];
4
3
  //# sourceMappingURL=nextSteps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nextSteps.d.ts","sourceRoot":"","sources":["../../src/output/nextSteps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAmBzC,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,OAAO,GACrB,MAAM,EAAE,CAwEV;AAGD,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EAAE,GACd,MAAM,CAeR"}
1
+ {"version":3,"file":"nextSteps.d.ts","sourceRoot":"","sources":["../../src/output/nextSteps.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAmBzC,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,GACrB,MAAM,EAAE,CAyEV"}
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.generateNextSteps = generateNextSteps;
4
- exports.displayNextSteps = displayNextSteps;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const node_process_1 = require("node:process");
5
9
  const MONGODB_AUTH_SETUP_URL = "https://better-ts-stack.abdullahtech.me/docs/modules/database#mongoose-and-mongodb";
6
10
  // Node 24 releases before 24.20 report mismatched file stats on Windows, which
7
11
  // makes srvx (TanStack's production server) reject every static asset
@@ -13,11 +17,13 @@ function isNodeBelow([major, minor]) {
13
17
  return (currentMajor < major || (currentMajor === major && currentMinor < minor));
14
18
  }
15
19
  // Generates a list of instructions for the user to follow after project creation
16
- function generateNextSteps(config, depsInstalled) {
20
+ function generateNextSteps(config, targetDir, depsInstalled) {
17
21
  const steps = [];
18
22
  const isFullstack = config.applicationType === "fullstack";
19
- // Step 1: cd into project directory
20
- steps.push(`cd ${config.projectName}`);
23
+ // Step 1: cd into project directory, unless it was created in place
24
+ const relativeDir = node_path_1.default.relative((0, node_process_1.cwd)(), targetDir);
25
+ if (relativeDir)
26
+ steps.push(`cd ${relativeDir}`);
21
27
  // Step 2: Set environment variables
22
28
  if (config.database !== "none") {
23
29
  steps.push("Review the generated .env and set your database connection details");
@@ -64,19 +70,4 @@ function generateNextSteps(config, depsInstalled) {
64
70
  }
65
71
  return steps;
66
72
  }
67
- // Formats the next steps into a success message string
68
- function displayNextSteps(_projectName, steps) {
69
- const formattedSteps = steps
70
- .map((step, index) => ` ${index + 1}. ${step}`)
71
- .join("\n");
72
- const message = `
73
- ✨ Project created successfully!
74
-
75
- Next steps:
76
- ${formattedSteps}
77
-
78
- Your server will be running at http://localhost:3000
79
- `;
80
- return message;
81
- }
82
73
  //# sourceMappingURL=nextSteps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nextSteps.js","sourceRoot":"","sources":["../../src/output/nextSteps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nextSteps.js","sourceRoot":"","sources":["../../src/output/nextSteps.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ProjectConfig } from "../types";
2
- export declare function collectUserChoices(): Promise<ProjectConfig>;
3
- export declare function confirmBuild(config: ProjectConfig, targetDir: string): Promise<void>;
1
+ export { collectStackChoices } from "./stack";
2
+ export declare function collectProjectPath(preset: string | undefined, isNonInteractive: boolean): Promise<string>;
3
+ export declare function confirmBuild(): Promise<void>;
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,aAAa,EACd,MAAM,UAAU,CAAC;AAKlB,wBAAsB,kBAAkB,2BAoCvC;AAGD,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAiC1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAG9C,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAGD,wBAAsB,YAAY,kBAQjC"}
@@ -1,70 +1,34 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.collectUserChoices = collectUserChoices;
3
+ exports.collectStackChoices = void 0;
4
+ exports.collectProjectPath = collectProjectPath;
7
5
  exports.confirmBuild = confirmBuild;
8
- const prompts_1 = require("@clack/prompts");
9
- const consola_1 = __importDefault(require("consola"));
10
6
  const types_1 = require("../types");
7
+ const ui_1 = require("../ui");
11
8
  const validators_1 = require("../validators");
12
9
  const stack_1 = require("./stack");
13
- // Collects user input via interactive prompts
14
- async function collectUserChoices() {
15
- const projectName = await (0, prompts_1.text)({
16
- message: "Project name:",
17
- placeholder: "my-awesome-project",
18
- validate: (value) => (0, validators_1.validateProjectName)(value ?? ""),
19
- });
20
- if ((0, prompts_1.isCancel)(projectName)) {
21
- (0, prompts_1.cancel)("Operation cancelled.");
22
- process.exit(0);
10
+ var stack_2 = require("./stack");
11
+ Object.defineProperty(exports, "collectStackChoices", { enumerable: true, get: function () { return stack_2.collectStackChoices; } });
12
+ // Returns the project path from the command line, or asks for it
13
+ async function collectProjectPath(preset, isNonInteractive) {
14
+ if (preset !== undefined) {
15
+ const error = (0, validators_1.validateProjectPath)(preset);
16
+ if (error)
17
+ throw (0, types_1.buildError)(error, "INVALID_ARGUMENT");
23
18
  }
24
- const applicationType = await (0, prompts_1.select)({
25
- message: "Application type:",
26
- options: types_1.applicationTypeOptions,
27
- initialValue: "backend",
28
- });
29
- if ((0, prompts_1.isCancel)(applicationType)) {
30
- (0, prompts_1.cancel)("Operation cancelled.");
31
- process.exit(0);
19
+ else if (isNonInteractive) {
20
+ throw (0, types_1.buildError)("A project path is required with --yes, for example: better-ts-stack my-app --yes", "INVALID_ARGUMENT");
32
21
  }
33
- const userChoices = await (0, stack_1.collectStackChoices)(applicationType);
34
- // Derive database field from databaseType + orm for backward compatibility
35
- const database = (0, types_1.deriveDatabase)(userChoices.databaseType, userChoices.orm);
36
- const choices = {
37
- projectName,
38
- applicationType,
39
- ...userChoices,
40
- database,
41
- };
42
- return choices;
22
+ return (0, stack_1.ask)(preset, () => (0, ui_1.text)({
23
+ message: "Project name",
24
+ placeholder: "my-awesome-project",
25
+ validate: (value) => (0, validators_1.validateProjectPath)(value ?? ""),
26
+ }));
43
27
  }
44
- // Displays a summary and asks for final confirmation before building
45
- async function confirmBuild(config, targetDir) {
46
- consola_1.default.info("Project Summary:");
47
- const appTypeLabel = config.applicationType === "backend" ? "Backend API" : "Full-stack App";
48
- consola_1.default.box(`Project Name: ${config.projectName}\n` +
49
- `Target Dir: ${targetDir}\n` +
50
- `App Type: ${appTypeLabel}\n` +
51
- `Framework: ${config.framework}\n` +
52
- `Database: ${config.database}\n` +
53
- `Auth: ${config.useAuth ? "Yes" : "No"}\n` +
54
- `Docker: ${config.useDocker ? "Yes" : "No"}\n` +
55
- `Package Mgr: ${config.packageManager}\n` +
56
- `Git Init: ${config.initGit ? "Yes" : "No"}\n` +
57
- `Install Deps: ${config.installDeps ? "Yes" : "No"}`);
58
- const shouldContinue = await (0, prompts_1.confirm)({
59
- message: "Looks good? Ready to build?",
60
- initialValue: true,
61
- });
62
- if ((0, prompts_1.isCancel)(shouldContinue)) {
63
- (0, prompts_1.cancel)("Operation cancelled.");
64
- process.exit(0);
65
- }
66
- if (!shouldContinue) {
67
- (0, prompts_1.cancel)("Building cancelled by user.");
28
+ // Asks for final confirmation before building; declining ends the session
29
+ async function confirmBuild() {
30
+ const shouldBuild = await (0, stack_1.ask)(undefined, () => (0, ui_1.confirm)({ message: "Create this project?", initialValue: true }));
31
+ if (!shouldBuild) {
68
32
  process.exit(0);
69
33
  }
70
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":";;;AAQA,gDAqBC;AAGD,oCAQC;AAxCD,oCAAsC;AACtC,8BAAsC;AACtC,8CAAoD;AACpD,mCAA8B;AAE9B,iCAA8C;AAArC,4GAAA,mBAAmB,OAAA;AAE5B,iEAAiE;AAC1D,KAAK,UAAU,kBAAkB,CACtC,MAA0B,EAC1B,gBAAyB;IAEzB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAA,gCAAmB,EAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,KAAK;YAAE,MAAM,IAAA,kBAAU,EAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACzD,CAAC;SAAM,IAAI,gBAAgB,EAAE,CAAC;QAC5B,MAAM,IAAA,kBAAU,EACd,kFAAkF,EAClF,kBAAkB,CACnB,CAAC;IACJ,CAAC;IAED,OAAO,IAAA,WAAG,EAAC,MAAM,EAAE,GAAG,EAAE,CACtB,IAAA,SAAI,EAAC;QACH,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,gCAAmB,EAAC,KAAK,IAAI,EAAE,CAAC;KACtD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,0EAA0E;AACnE,KAAK,UAAU,YAAY;IAChC,MAAM,WAAW,GAAG,MAAM,IAAA,WAAG,EAAC,SAAS,EAAE,GAAG,EAAE,CAC5C,IAAA,YAAO,EAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CACjE,CAAC;IAEF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1,3 +1,4 @@
1
- import { ApplicationType, PromptChoices } from "../types";
2
- export declare function collectStackChoices(applicationType: ApplicationType): Promise<PromptChoices>;
1
+ import { StackChoices } from "../types";
2
+ export declare function ask<T>(preset: T | undefined, prompt: () => Promise<T | symbol>): Promise<T>;
3
+ export declare function collectStackChoices(preset: Partial<StackChoices>): Promise<StackChoices>;
3
4
  //# sourceMappingURL=stack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/prompts/stack.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EAaf,aAAa,EACd,MAAM,UAAU,CAAC;AAElB,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,aAAa,CAAC,CA6ExB"}
1
+ {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/prompts/stack.ts"],"names":[],"mappings":"AAEA,OAAO,EAaL,YAAY,EACb,MAAM,UAAU,CAAC;AAIlB,wBAAsB,GAAG,CAAC,CAAC,EACzB,MAAM,EAAE,CAAC,GAAG,SAAS,EACrB,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,GAChC,OAAO,CAAC,CAAC,CAAC,CASZ;AAyCD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAC5B,OAAO,CAAC,YAAY,CAAC,CAgDvB"}