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
@@ -0,0 +1,20 @@
1
+ export interface SelectOption<T> {
2
+ value: T;
3
+ label: string;
4
+ hint?: string;
5
+ }
6
+ export declare function text(options: {
7
+ message: string;
8
+ placeholder: string;
9
+ validate: (value: string | undefined) => string | undefined;
10
+ }): Promise<string | symbol>;
11
+ export declare function select<T>(options: {
12
+ message: string;
13
+ options: SelectOption<T>[];
14
+ initialValue: T;
15
+ }): Promise<T | symbol>;
16
+ export declare function confirm(options: {
17
+ message: string;
18
+ initialValue: boolean;
19
+ }): Promise<boolean | symbol>;
20
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAYD,wBAAgB,IAAI,CAAC,OAAO,EAAE;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7D,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAkB3B;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3B,YAAY,EAAE,CAAC,CAAC;CACjB,GAAG,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,CAqBtB;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAmB5B"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.text = text;
4
+ exports.select = select;
5
+ exports.confirm = confirm;
6
+ // Prompts built on @clack/core, which handles the keyboard while the render
7
+ // functions below draw each state
8
+ const core_1 = require("@clack/core");
9
+ const theme_1 = require("./theme");
10
+ // A prompt waiting for input: "$ Project name"
11
+ const question = (message) => `${(0, theme_1.lime)("$")} ${(0, theme_1.bold)(message)}`;
12
+ // An answered prompt, collapsed to one line: "✓ Project name my-app". The
13
+ // trailing newline leaves a blank line before the next prompt
14
+ const answered = (message, answer) => `${(0, theme_1.lime)("✓")} ${(0, theme_1.dim)(message)} ${answer}\n`;
15
+ const cancelled = (message) => `${(0, theme_1.red)("×")} ${(0, theme_1.dim)(message)}`;
16
+ function text(options) {
17
+ const { message, placeholder } = options;
18
+ return new core_1.TextPrompt({
19
+ validate: options.validate,
20
+ render() {
21
+ if (this.state === "submit")
22
+ return answered(message, this.value ?? "");
23
+ if (this.state === "cancel")
24
+ return cancelled(message);
25
+ // The inverse first character stands in for the cursor on an empty input
26
+ const input = this.userInput
27
+ ? this.userInputWithCursor
28
+ : (0, theme_1.inverse)(placeholder[0]) + (0, theme_1.dim)(placeholder.slice(1));
29
+ const error = this.state === "error" ? `\n ${(0, theme_1.red)(this.error)}` : "";
30
+ return `${question(message)}\n ${input}${error}\n`;
31
+ },
32
+ }).prompt();
33
+ }
34
+ function select(options) {
35
+ const { message } = options;
36
+ return new core_1.SelectPrompt({
37
+ options: options.options,
38
+ initialValue: options.initialValue,
39
+ render() {
40
+ if (this.state === "submit")
41
+ return answered(message, this.options[this.cursor].label);
42
+ if (this.state === "cancel")
43
+ return cancelled(message);
44
+ const rows = this.options.map((option, index) => {
45
+ const hint = option.hint ? ` ${(0, theme_1.dim)(option.hint)}` : "";
46
+ return index === this.cursor
47
+ ? ` ${(0, theme_1.lime)("›")} ${option.label}${hint}`
48
+ : ` ${(0, theme_1.dim)(option.label)}`;
49
+ });
50
+ return `${question(message)}\n${rows.join("\n")}\n`;
51
+ },
52
+ }).prompt();
53
+ }
54
+ function confirm(options) {
55
+ const { message } = options;
56
+ return new core_1.ConfirmPrompt({
57
+ active: "Yes",
58
+ inactive: "No",
59
+ initialValue: options.initialValue,
60
+ render() {
61
+ if (this.state === "submit")
62
+ return answered(message, this.value ? "Yes" : "No");
63
+ if (this.state === "cancel")
64
+ return cancelled(message);
65
+ // Both choices keep their column; only the marker and color move
66
+ const choice = (label, isActive) => isActive ? (0, theme_1.lime)(`› ${label}`) : (0, theme_1.dim)(` ${label}`);
67
+ return `${question(message)}\n ${choice("Yes", this.value === true)} ${choice("No", this.value === false)}\n`;
68
+ },
69
+ }).prompt();
70
+ }
71
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const amber: (text: string) => string;
2
+ export declare const lavender: (text: string) => string;
3
+ export declare const lime: (text: string) => string;
4
+ export declare const pink: (text: string) => string;
5
+ export declare const red: (text: string) => string;
6
+ export declare const bold: (text: string) => string;
7
+ export declare const dim: (text: string) => string;
8
+ export declare const inverse: (text: string) => string;
9
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,KAAK,SAJF,MAAM,WAIS,CAAC;AAChC,eAAO,MAAM,QAAQ,SALL,MAAM,WAKY,CAAC;AACnC,eAAO,MAAM,IAAI,SAND,MAAM,WAMQ,CAAC;AAC/B,eAAO,MAAM,IAAI,SAPD,MAAM,WAOQ,CAAC;AAC/B,eAAO,MAAM,GAAG,SARA,MAAM,WAQO,CAAC;AAE9B,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,WAA4B,CAAC;AAC9D,eAAO,MAAM,GAAG,GAAI,MAAM,MAAM,WAA2B,CAAC;AAC5D,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,WAA+B,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inverse = exports.dim = exports.bold = exports.red = exports.pink = exports.lime = exports.lavender = exports.amber = void 0;
4
+ // Colors and text styles shared by every piece of CLI output
5
+ const node_util_1 = require("node:util");
6
+ // Plain text is used when the output is piped, NO_COLOR is set, or the
7
+ // terminal has fewer than 256 colors
8
+ const hasColors = process.stdout.isTTY && process.stdout.hasColors(256);
9
+ // Wraps text in a color from the 256-color palette
10
+ function color(code) {
11
+ return (text) => hasColors ? `\x1b[38;5;${code}m${text}\x1b[39m` : text;
12
+ }
13
+ exports.amber = color(214); // Brand: wordmark and headings
14
+ exports.lavender = color(183); // Tagline
15
+ exports.lime = color(148); // Prompts, success, and commands to run
16
+ exports.pink = color(211); // Labels
17
+ exports.red = color(203); // Errors
18
+ const bold = (text) => (0, node_util_1.styleText)("bold", text);
19
+ exports.bold = bold;
20
+ const dim = (text) => (0, node_util_1.styleText)("dim", text);
21
+ exports.dim = dim;
22
+ const inverse = (text) => (0, node_util_1.styleText)("inverse", text);
23
+ exports.inverse = inverse;
24
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":";;;AAAA,6DAA6D;AAC7D,yCAAsC;AAEtC,uEAAuE;AACvE,qCAAqC;AACrC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAExE,mDAAmD;AACnD,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,CAAC,IAAY,EAAE,EAAE,CACtB,SAAS,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAEY,QAAA,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,+BAA+B;AACnD,QAAA,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;AACjC,QAAA,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,wCAAwC;AAC3D,QAAA,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;AAC5B,QAAA,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;AAEjC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAA,qBAAS,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAAjD,QAAA,IAAI,QAA6C;AACvD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAA,qBAAS,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAA/C,QAAA,GAAG,OAA4C;AACrD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAA,qBAAS,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAAvD,QAAA,OAAO,WAAgD"}
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  export declare const projectNameSchema: z.ZodString;
3
3
  export declare function validateProjectName(name: string): string | undefined;
4
+ export declare function validateProjectPath(projectPath: string): string | undefined;
4
5
  export declare function validateDirectoryEmpty(dirPath: string): Promise<string | null>;
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB,aAc3B,CAAC;AAGJ,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUpE;AAGD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,0BAgB3D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB,aAc3B,CAAC;AAGJ,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUpE;AAID,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE3E;AAGD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,0BAgB3D"}
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.projectNameSchema = void 0;
37
37
  exports.validateProjectName = validateProjectName;
38
+ exports.validateProjectPath = validateProjectPath;
38
39
  exports.validateDirectoryEmpty = validateDirectoryEmpty;
39
40
  const fs = __importStar(require("fs-extra"));
40
41
  const path = __importStar(require("path"));
@@ -56,6 +57,11 @@ function validateProjectName(name) {
56
57
  const firstError = result.error.issues[0];
57
58
  return firstError.message;
58
59
  }
60
+ // Checks a project path such as "my-app", "apps/api", or "."; the last folder
61
+ // name becomes the package name
62
+ function validateProjectPath(projectPath) {
63
+ return validateProjectName(path.basename(path.resolve(projectPath)));
64
+ }
59
65
  // Ensures a directory is empty or does not exist before starting build
60
66
  async function validateDirectoryEmpty(dirPath) {
61
67
  const exists = await fs.pathExists(dirPath);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,kDAUC;AAGD,wDAgBC;AAnDD,6CAA+B;AAC/B,2CAA6B;AAC7B,6BAAwB;AAExB,kEAAkE;AACrD,QAAA,iBAAiB,GAAG,OAAC;KAC/B,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;KAClC,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EACnC,mFAAmF,CACpF;KACA,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EACtD,gDAAgD,CACjD;KACA,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,EAC5B,sEAAsE,CACvE,CAAC;AAEJ,0DAA0D;AAC1D,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAG,yBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEjD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iCAAiC;IACjC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,UAAU,CAAC,OAAO,CAAC;AAC5B,CAAC;AAED,uEAAuE;AAChE,KAAK,UAAU,sBAAsB,CAAC,OAAe;IAC1D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,OAAO,SAAS,OAAO,iCAAiC,CAAC;IAC3D,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,OAAO,cAAc,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mCAAmC,CAAC;AACjF,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,kDAUC;AAID,kDAEC;AAGD,wDAgBC;AAzDD,6CAA+B;AAC/B,2CAA6B;AAC7B,6BAAwB;AAExB,kEAAkE;AACrD,QAAA,iBAAiB,GAAG,OAAC;KAC/B,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;KAClC,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EACnC,mFAAmF,CACpF;KACA,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EACtD,gDAAgD,CACjD;KACA,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,EAC5B,sEAAsE,CACvE,CAAC;AAEJ,0DAA0D;AAC1D,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAG,yBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEjD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iCAAiC;IACjC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,UAAU,CAAC,OAAO,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,SAAgB,mBAAmB,CAAC,WAAmB;IACrD,OAAO,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,uEAAuE;AAChE,KAAK,UAAU,sBAAsB,CAAC,OAAe;IAC1D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,OAAO,SAAS,OAAO,iCAAiC,CAAC;IAC3D,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,OAAO,cAAc,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mCAAmC,CAAC;AACjF,CAAC"}
package/package.json CHANGED
@@ -1,66 +1,70 @@
1
- {
2
- "name": "better-ts-stack",
3
- "version": "1.1.4",
4
- "description": "A powerful CLI tool that generates fully configured TypeScript projects with backend, frontend, database integration, Docker support, and more--all through an interactive setup.",
5
- "keywords": [
6
- "cli",
7
- "builder",
8
- "backend",
9
- "typescript",
10
- "express",
11
- "prisma",
12
- "template"
13
- ],
14
- "homepage": "https://better-ts-stack.abdullahtech.me",
15
- "bugs": {
16
- "url": "https://github.com/Abdullah-dev0/better-ts-stack/issues"
17
- },
18
- "repository": {
19
- "type": "git",
20
- "url": "git+https://github.com/Abdullah-dev0/better-ts-stack.git"
21
- },
22
- "license": "MIT",
23
- "author": "Abdullah",
24
- "type": "commonjs",
25
- "main": "dist/index.js",
26
- "bin": {
27
- "better-ts-stack": "dist/index.js"
28
- },
29
- "files": [
30
- "dist",
31
- "templates"
32
- ],
33
- "scripts": {
34
- "dev": "tsx src/index.ts",
35
- "build": "tsc",
36
- "postbuild": "node -e \"const fs=require('fs');const p='dist/index.js';fs.writeFileSync(p,'#!/usr/bin/env node\\n'+fs.readFileSync(p,'utf8'))\"",
37
- "prepack": "npm run build",
38
- "start": "node dist/index.js",
39
- "lint": "eslint src",
40
- "lint:fix": "eslint src --fix",
41
- "format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md,mdx,css}\"",
42
- "format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,md,mdx,css}\"",
43
- "type:check": "tsc --noEmit"
44
- },
45
- "dependencies": {
46
- "@clack/prompts": "^1.7.0",
47
- "consola": "^3.4.2",
48
- "fs-extra": "^11.4.0",
49
- "handlebars": "^4.7.9",
50
- "zod": "^4.5.4"
51
- },
52
- "devDependencies": {
53
- "@better-ts-stack/eslint-config": "*",
54
- "@better-ts-stack/prettier-config": "*",
55
- "@types/fs-extra": "^11.0.4",
56
- "@types/node": "^24.13.3",
57
- "eslint": "^10.10.0",
58
- "prettier": "^3.9.6",
59
- "tsx": "^4.23.13",
60
- "typescript": "^6.0.3"
61
- },
62
- "engines": {
63
- "node": ">=24.0.0"
64
- },
65
- "prettier": "@better-ts-stack/prettier-config"
66
- }
1
+ {
2
+ "name": "better-ts-stack",
3
+ "version": "2.0.0",
4
+ "description": "A CLI that scaffolds Express, NestJS, Next.js, and TanStack Start projects with a database, authentication, and Docker already set up.",
5
+ "keywords": [
6
+ "cli",
7
+ "builder",
8
+ "backend",
9
+ "typescript",
10
+ "express",
11
+ "nestjs",
12
+ "nextjs",
13
+ "tanstack-start",
14
+ "prisma",
15
+ "drizzle",
16
+ "mongoose",
17
+ "template"
18
+ ],
19
+ "homepage": "https://better-ts-stack.abdullahtech.me",
20
+ "bugs": {
21
+ "url": "https://github.com/Abdullah-dev0/better-ts-stack/issues"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/Abdullah-dev0/better-ts-stack.git"
26
+ },
27
+ "license": "MIT",
28
+ "author": "Abdullah",
29
+ "type": "commonjs",
30
+ "main": "dist/index.js",
31
+ "bin": {
32
+ "better-ts-stack": "dist/index.js"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "templates"
37
+ ],
38
+ "scripts": {
39
+ "dev": "tsx src/index.ts",
40
+ "build": "tsc",
41
+ "postbuild": "node -e \"const fs=require('fs');const p='dist/index.js';fs.writeFileSync(p,'#!/usr/bin/env node\\n'+fs.readFileSync(p,'utf8'))\"",
42
+ "prepack": "npm run build",
43
+ "start": "node dist/index.js",
44
+ "lint": "eslint src",
45
+ "lint:fix": "eslint src --fix",
46
+ "format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md,mdx,css}\"",
47
+ "format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,md,mdx,css}\"",
48
+ "type:check": "tsc --noEmit"
49
+ },
50
+ "dependencies": {
51
+ "@clack/core": "^1.4.3",
52
+ "fs-extra": "^11.4.0",
53
+ "handlebars": "^4.7.9",
54
+ "zod": "^4.5.4"
55
+ },
56
+ "devDependencies": {
57
+ "@better-ts-stack/eslint-config": "*",
58
+ "@better-ts-stack/prettier-config": "*",
59
+ "@types/fs-extra": "^11.0.4",
60
+ "@types/node": "^24.13.3",
61
+ "eslint": "^10.10.0",
62
+ "prettier": "^3.9.6",
63
+ "tsx": "^4.23.13",
64
+ "typescript": "^6.0.3"
65
+ },
66
+ "engines": {
67
+ "node": ">=24.0.0"
68
+ },
69
+ "prettier": "@better-ts-stack/prettier-config"
70
+ }
@@ -1,44 +1,44 @@
1
- {
2
- "id": "express",
3
- "name": "Express Base",
4
- "description": "Base Express server with TypeScript, middleware, and best practices",
5
- "type": "base",
6
- "scripts": {
7
- "dev": "cross-env NODE_ENV=development {{#if (eq packageManager 'bun')}}bun --watch src/index.ts{{else}}tsx watch src/index.ts{{/if}}",
8
- "build": "tsc",
9
- "start": "cross-env NODE_ENV=production {{runner}} dist/index.js",
10
- "lint": "eslint src",
11
- "lint:fix": "eslint src --fix",
12
- "format": "prettier --write \"src/**/*.ts\"",
13
- "type:check": "tsc --noEmit"
14
- },
15
- "dependencies": {
16
- "express": "^5.2.1",
17
- "dotenv": "^17.4.2",
18
- "cors": "^2.8.6",
19
- "cross-env": "^10.1.0",
20
- "helmet": "^8.3.0",
21
- "morgan": "^1.12.0"
22
- },
23
- "devDependencies": {
24
- "@eslint/js": "^10.0.1",
25
- "@trivago/prettier-plugin-sort-imports": "^6.0.2",
26
- "@types/cors": "^2.8.19",
27
- "@types/express": "^5.0.6",
28
- "@types/morgan": "^1.9.10",
29
- "@types/node": "^24.13.3",
30
- "eslint": "^10.10.0",
31
- "eslint-config-prettier": "^10.1.8",
32
- "prettier": "^3.9.6",
33
- "prettier-plugin-tailwindcss": "^0.8.1",
34
- "tsx": "^4.23.13",
35
- "typescript": "^6.0.3",
36
- "typescript-eslint": "^8.69.0"
37
- },
38
- "envVars": {
39
- "PORT": "3000"
40
- },
41
- "templateFiles": [
42
- "src/index.ts"
43
- ]
44
- }
1
+ {
2
+ "id": "express",
3
+ "name": "Express Base",
4
+ "description": "Base Express server with TypeScript, security headers, and a health check",
5
+ "type": "base",
6
+ "scripts": {
7
+ "dev": "cross-env NODE_ENV=development {{#if (eq packageManager 'bun')}}bun --watch src/index.ts{{else}}tsx watch src/index.ts{{/if}}",
8
+ "build": "tsc",
9
+ "start": "cross-env NODE_ENV=production {{runner}} dist/index.js",
10
+ "lint": "eslint src",
11
+ "lint:fix": "eslint src --fix",
12
+ "format": "prettier --write \"src/**/*.ts\"",
13
+ "type:check": "tsc --noEmit"
14
+ },
15
+ "dependencies": {
16
+ "express": "^5.2.1",
17
+ "dotenv": "^17.4.2",
18
+ "cors": "^2.8.6",
19
+ "cross-env": "^10.1.0",
20
+ "helmet": "^8.3.0",
21
+ "morgan": "^1.12.0"
22
+ },
23
+ "devDependencies": {
24
+ "@eslint/js": "^10.0.1",
25
+ "@trivago/prettier-plugin-sort-imports": "^6.0.2",
26
+ "@types/cors": "^2.8.19",
27
+ "@types/express": "^5.0.6",
28
+ "@types/morgan": "^1.9.10",
29
+ "@types/node": "^24.13.3",
30
+ "eslint": "^10.10.0",
31
+ "eslint-config-prettier": "^10.1.8",
32
+ "prettier": "^3.9.6",
33
+ "prettier-plugin-tailwindcss": "^0.8.1",
34
+ "tsx": "^4.23.13",
35
+ "typescript": "^6.0.3",
36
+ "typescript-eslint": "^8.69.0"
37
+ },
38
+ "envVars": {
39
+ "PORT": "3000"
40
+ },
41
+ "templateFiles": [
42
+ "src/index.ts"
43
+ ]
44
+ }
@@ -1,40 +1,40 @@
1
- import eslint from "@eslint/js";
2
- import path from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import tseslint from "typescript-eslint";
5
-
6
- const __filename = fileURLToPath(import.meta.url);
7
- const __dirname = path.dirname(__filename);
8
-
9
- export default tseslint.config(
10
- {
11
- ignores: [
12
- "dist",
13
- "node_modules",
14
- "templates/**/*",
15
- "bin/**/*",
16
- "src/generated/**",
17
- ],
18
- },
19
- eslint.configs.recommended,
20
- ...tseslint.configs.recommended,
21
- ...tseslint.configs.recommendedTypeChecked,
22
- {
23
- languageOptions: {
24
- parserOptions: {
25
- project: "./tsconfig.eslint.json",
26
- tsconfigRootDir: __dirname,
27
- },
28
- },
29
- rules: {
30
- "@typescript-eslint/explicit-function-return-type": "off",
31
- "@typescript-eslint/no-explicit-any": "warn",
32
- "@typescript-eslint/no-unused-vars": [
33
- "error",
34
- { argsIgnorePattern: "^_" },
35
- ],
36
- "@typescript-eslint/no-floating-promises": "error",
37
- "no-console": "off",
38
- },
39
- }
40
- );
1
+ import eslint from "@eslint/js";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import tseslint from "typescript-eslint";
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ export default tseslint.config(
10
+ {
11
+ ignores: [
12
+ "dist",
13
+ "node_modules",
14
+ "templates/**/*",
15
+ "bin/**/*",
16
+ "src/generated/**",
17
+ ],
18
+ },
19
+ eslint.configs.recommended,
20
+ ...tseslint.configs.recommended,
21
+ ...tseslint.configs.recommendedTypeChecked,
22
+ {
23
+ languageOptions: {
24
+ parserOptions: {
25
+ project: "./tsconfig.eslint.json",
26
+ tsconfigRootDir: __dirname,
27
+ },
28
+ },
29
+ rules: {
30
+ "@typescript-eslint/explicit-function-return-type": "off",
31
+ "@typescript-eslint/no-explicit-any": "warn",
32
+ "@typescript-eslint/no-unused-vars": [
33
+ "error",
34
+ { argsIgnorePattern: "^_" },
35
+ ],
36
+ "@typescript-eslint/no-floating-promises": "error",
37
+ "no-console": "off",
38
+ },
39
+ }
40
+ );
@@ -1,36 +1,36 @@
1
- # Dependencies
2
- node_modules/
3
-
4
- # Build output
5
- dist/
6
- build/
7
-
8
- # Environment variables
9
- .env
10
- .env.local
11
- .env.*.local
12
-
13
- # Logs
14
- logs/
15
- *.log
16
- npm-debug.log*
17
- yarn-debug.log*
18
- yarn-error.log*
19
-
20
- # IDE
21
- .vscode/
22
- .idea/
23
- *.swp
24
- *.swo
25
- *~
26
-
27
- # OS
28
- .DS_Store
29
- Thumbs.db
30
-
31
- # Testing
32
- coverage/
33
- .nyc_output/
34
-
35
- # Misc
36
- *.tsbuildinfo
1
+ # Dependencies
2
+ node_modules/
3
+
4
+ # Build output
5
+ dist/
6
+ build/
7
+
8
+ # Environment variables
9
+ .env
10
+ .env.local
11
+ .env.*.local
12
+
13
+ # Logs
14
+ logs/
15
+ *.log
16
+ npm-debug.log*
17
+ yarn-debug.log*
18
+ yarn-error.log*
19
+
20
+ # IDE
21
+ .vscode/
22
+ .idea/
23
+ *.swp
24
+ *.swo
25
+ *~
26
+
27
+ # OS
28
+ .DS_Store
29
+ Thumbs.db
30
+
31
+ # Testing
32
+ coverage/
33
+ .nyc_output/
34
+
35
+ # Misc
36
+ *.tsbuildinfo