better-ts-stack 0.1.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 (134) hide show
  1. package/README.md +83 -0
  2. package/dist/builder/configGenerator.d.ts +6 -0
  3. package/dist/builder/configGenerator.d.ts.map +1 -0
  4. package/dist/builder/configGenerator.js +110 -0
  5. package/dist/builder/configGenerator.js.map +1 -0
  6. package/dist/builder/dependencyInstaller.d.ts +3 -0
  7. package/dist/builder/dependencyInstaller.d.ts.map +1 -0
  8. package/dist/builder/dependencyInstaller.js +39 -0
  9. package/dist/builder/dependencyInstaller.js.map +1 -0
  10. package/dist/builder/fileProcessor.d.ts +6 -0
  11. package/dist/builder/fileProcessor.d.ts.map +1 -0
  12. package/dist/builder/fileProcessor.js +108 -0
  13. package/dist/builder/fileProcessor.js.map +1 -0
  14. package/dist/builder/gitInitializer.d.ts +2 -0
  15. package/dist/builder/gitInitializer.d.ts.map +1 -0
  16. package/dist/builder/gitInitializer.js +52 -0
  17. package/dist/builder/gitInitializer.js.map +1 -0
  18. package/dist/builder/index.d.ts +3 -0
  19. package/dist/builder/index.d.ts.map +1 -0
  20. package/dist/builder/index.js +126 -0
  21. package/dist/builder/index.js.map +1 -0
  22. package/dist/builder/moduleSelector.d.ts +9 -0
  23. package/dist/builder/moduleSelector.d.ts.map +1 -0
  24. package/dist/builder/moduleSelector.js +29 -0
  25. package/dist/builder/moduleSelector.js.map +1 -0
  26. package/dist/builder/templateContext.d.ts +21 -0
  27. package/dist/builder/templateContext.d.ts.map +1 -0
  28. package/dist/builder/templateContext.js +47 -0
  29. package/dist/builder/templateContext.js.map +1 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +34 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/intro.d.ts +2 -0
  35. package/dist/intro.d.ts.map +1 -0
  36. package/dist/intro.js +27 -0
  37. package/dist/intro.js.map +1 -0
  38. package/dist/modules/registry.d.ts +6 -0
  39. package/dist/modules/registry.d.ts.map +1 -0
  40. package/dist/modules/registry.js +64 -0
  41. package/dist/modules/registry.js.map +1 -0
  42. package/dist/output/nextSteps.d.ts +4 -0
  43. package/dist/output/nextSteps.d.ts.map +1 -0
  44. package/dist/output/nextSteps.js +87 -0
  45. package/dist/output/nextSteps.js.map +1 -0
  46. package/dist/prompts/backend/index.d.ts +3 -0
  47. package/dist/prompts/backend/index.d.ts.map +1 -0
  48. package/dist/prompts/backend/index.js +128 -0
  49. package/dist/prompts/backend/index.js.map +1 -0
  50. package/dist/prompts/frontend/index.d.ts +3 -0
  51. package/dist/prompts/frontend/index.d.ts.map +1 -0
  52. package/dist/prompts/frontend/index.js +111 -0
  53. package/dist/prompts/frontend/index.js.map +1 -0
  54. package/dist/prompts/index.d.ts +4 -0
  55. package/dist/prompts/index.d.ts.map +1 -0
  56. package/dist/prompts/index.js +82 -0
  57. package/dist/prompts/index.js.map +1 -0
  58. package/dist/types/index.d.ts +157 -0
  59. package/dist/types/index.d.ts.map +1 -0
  60. package/dist/types/index.js +81 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/dist/validators/index.d.ts +5 -0
  63. package/dist/validators/index.d.ts.map +1 -0
  64. package/dist/validators/index.js +73 -0
  65. package/dist/validators/index.js.map +1 -0
  66. package/package.json +66 -0
  67. package/templates/backend/express/.eslintrc.js +24 -0
  68. package/templates/backend/express/.prettierignore +52 -0
  69. package/templates/backend/express/.prettierrc +16 -0
  70. package/templates/backend/express/config.json +42 -0
  71. package/templates/backend/express/eslint.config.mjs +31 -0
  72. package/templates/backend/express/gitignore +39 -0
  73. package/templates/backend/express/src/index.ts +46 -0
  74. package/templates/backend/express/src/routes/health.ts +12 -0
  75. package/templates/backend/express/tsconfig.eslint.json +9 -0
  76. package/templates/backend/express/tsconfig.json +23 -0
  77. package/templates/frontend/nextjs/app/globals.css +99 -0
  78. package/templates/frontend/nextjs/app/layout.tsx +34 -0
  79. package/templates/frontend/nextjs/app/page.tsx.hbs +98 -0
  80. package/templates/frontend/nextjs/components/ui/button.tsx +51 -0
  81. package/templates/frontend/nextjs/components/ui/card.tsx +60 -0
  82. package/templates/frontend/nextjs/components/ui/field.tsx +67 -0
  83. package/templates/frontend/nextjs/components/ui/input.tsx +18 -0
  84. package/templates/frontend/nextjs/components.json +19 -0
  85. package/templates/frontend/nextjs/config.json +33 -0
  86. package/templates/frontend/nextjs/eslint.config.mjs +11 -0
  87. package/templates/frontend/nextjs/gitignore +41 -0
  88. package/templates/frontend/nextjs/lib/utils.ts +6 -0
  89. package/templates/frontend/nextjs/next.config.ts +8 -0
  90. package/templates/frontend/nextjs/postcss.config.mjs +7 -0
  91. package/templates/frontend/nextjs/proxy.ts.hbs +23 -0
  92. package/templates/frontend/nextjs/public/file.svg +1 -0
  93. package/templates/frontend/nextjs/public/globe.svg +1 -0
  94. package/templates/frontend/nextjs/public/next.svg +1 -0
  95. package/templates/frontend/nextjs/public/vercel.svg +1 -0
  96. package/templates/frontend/nextjs/public/window.svg +1 -0
  97. package/templates/frontend/nextjs/tsconfig.json +21 -0
  98. package/templates/modules/auth/express/config.json +1 -0
  99. package/templates/modules/auth/express/src/controllers/authController.ts.hbs +81 -0
  100. package/templates/modules/auth/express/src/lib/jwt.ts.hbs +27 -0
  101. package/templates/modules/auth/express/src/middleware/requireAuth.ts.hbs +26 -0
  102. package/templates/modules/auth/express/src/routes/auth.ts.hbs +19 -0
  103. package/templates/modules/auth/express/src/services/userStore.ts.hbs +107 -0
  104. package/templates/modules/auth/nextjs/app/api/auth/[...all]/route.ts +4 -0
  105. package/templates/modules/auth/nextjs/app/dashboard/page.tsx +96 -0
  106. package/templates/modules/auth/nextjs/app/sign-in/page.tsx +35 -0
  107. package/templates/modules/auth/nextjs/app/sign-up/page.tsx +35 -0
  108. package/templates/modules/auth/nextjs/components/auth/sign-in-form.tsx +132 -0
  109. package/templates/modules/auth/nextjs/components/auth/sign-out-button.tsx +50 -0
  110. package/templates/modules/auth/nextjs/components/auth/sign-up-form.tsx +152 -0
  111. package/templates/modules/auth/nextjs/config.json +31 -0
  112. package/templates/modules/auth/nextjs/lib/auth-client.ts +3 -0
  113. package/templates/modules/auth/nextjs/lib/auth-schema.ts +39 -0
  114. package/templates/modules/auth/nextjs/lib/auth.ts.hbs +35 -0
  115. package/templates/modules/docker/.dockerignore +13 -0
  116. package/templates/modules/docker/Dockerfile.hbs +71 -0
  117. package/templates/modules/docker/config.json +16 -0
  118. package/templates/modules/docker/docker-compose.yml.hbs +10 -0
  119. package/templates/modules/drizzle/nextjs/config.json +21 -0
  120. package/templates/modules/drizzle/nextjs/drizzle.config.ts +13 -0
  121. package/templates/modules/drizzle/nextjs/lib/db.ts +11 -0
  122. package/templates/modules/drizzle/nextjs/lib/schema.ts.hbs +84 -0
  123. package/templates/modules/mongoose/config.json +16 -0
  124. package/templates/modules/mongoose/src/lib/db.ts +43 -0
  125. package/templates/modules/mongoose/src/lib/db.ts.hbs +56 -0
  126. package/templates/modules/mongoose/src/models/User.ts +47 -0
  127. package/templates/modules/prisma/express/config.json +21 -0
  128. package/templates/modules/prisma/express/prisma/schema.prisma +23 -0
  129. package/templates/modules/prisma/express/prisma.config.ts +13 -0
  130. package/templates/modules/prisma/express/src/lib/prisma.ts +37 -0
  131. package/templates/modules/prisma/nextjs/config.json +23 -0
  132. package/templates/modules/prisma/nextjs/lib/prisma.ts +18 -0
  133. package/templates/modules/prisma/nextjs/prisma/schema.prisma.hbs +90 -0
  134. package/templates/modules/prisma/nextjs/prisma.config.ts +12 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.selectModules = selectModules;
4
+ // Determines which base and feature modules to include based on user configuration
5
+ function selectModules(config) {
6
+ // Determine framework for module integration
7
+ const framework = config.applicationType === "backend" ? config.framework : "nextjs";
8
+ // Select base template based on app type
9
+ const base = config.applicationType === "backend"
10
+ ? `backend/${config.framework}`
11
+ : `frontend/${config.framework}`;
12
+ const modules = [];
13
+ // Add database module if selected (compound ids: prisma/express, prisma/nextjs, drizzle/nextjs, or mongoose)
14
+ if (config.database !== "none") {
15
+ const dbId = config.database === "mongoose"
16
+ ? "mongoose"
17
+ : `${config.database}/${framework}`;
18
+ modules.push({ id: dbId, framework });
19
+ }
20
+ // Add feature modules based on configuration
21
+ if (config.useDocker) {
22
+ modules.push({ id: "docker", framework });
23
+ }
24
+ if (config.useAuth) {
25
+ modules.push({ id: `auth/${framework}`, framework });
26
+ }
27
+ return { base, modules };
28
+ }
29
+ //# sourceMappingURL=moduleSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleSelector.js","sourceRoot":"","sources":["../../src/builder/moduleSelector.ts"],"names":[],"mappings":";;AAGA,sCAgCC;AAjCD,mFAAmF;AACnF,SAAgB,aAAa,CAAC,MAAqB;IACjD,6CAA6C;IAC7C,MAAM,SAAS,GACb,MAAM,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAErE,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,6GAA6G;IAC7G,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,GACR,MAAM,CAAC,QAAQ,KAAK,UAAU;YAC5B,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACxC,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"}
@@ -0,0 +1,21 @@
1
+ import { ProjectConfig } from "../types";
2
+ export declare function lowercase(str: string): string;
3
+ export declare function uppercase(str: string): string;
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 | "nextjs";
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: () => "pnpm" | "bun" | "node";
19
+ };
20
+ };
21
+ //# sourceMappingURL=templateContext.d.ts.map
@@ -0,0 +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;;;;;;;;;;;;gBAe5C,MAAM,KAAK,MAAM;;;EAQ9B"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lowercase = lowercase;
4
+ exports.uppercase = uppercase;
5
+ exports.kebabCase = kebabCase;
6
+ exports.buildTemplateContext = buildTemplateContext;
7
+ // Converts string to lowercase
8
+ function lowercase(str) {
9
+ return str.toLowerCase();
10
+ }
11
+ // Converts string to uppercase
12
+ function uppercase(str) {
13
+ return str.toUpperCase();
14
+ }
15
+ // Converts string to kebab-case
16
+ function kebabCase(str) {
17
+ return str
18
+ .replace(/([a-z])([A-Z])/g, "$1-$2") // camelCase to kebab-case
19
+ .replace(/[\s_]+/g, "-") // spaces and underscores to hyphens
20
+ .toLowerCase();
21
+ }
22
+ function buildTemplateContext(config) {
23
+ const framework = config.applicationType === "backend" ? config.framework : "nextjs";
24
+ return {
25
+ projectName: config.projectName,
26
+ packageManager: config.packageManager,
27
+ database: config.database ?? "none",
28
+ framework,
29
+ port: 3000, // Default port
30
+ useDocker: config.useDocker ?? false,
31
+ useAuth: config.useAuth,
32
+ helpers: {
33
+ lowercase,
34
+ uppercase,
35
+ kebabCase,
36
+ eq: (a, b) => a === b,
37
+ runner: () => {
38
+ if (config.packageManager === "bun")
39
+ return "bun";
40
+ if (config.packageManager === "pnpm")
41
+ return "pnpm";
42
+ return "node";
43
+ },
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=templateContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateContext.js","sourceRoot":"","sources":["../../src/builder/templateContext.ts"],"names":[],"mappings":";;AAIA,8BAEC;AAGD,8BAEC;AAGD,8BAKC;AAED,oDAuBC;AAzCD,+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,GACb,MAAM,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrE,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,IAAI,MAAM,CAAC,cAAc,KAAK,MAAM;oBAAE,OAAO,MAAM,CAAC;gBACpD,OAAO,MAAM,CAAC;YAChB,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
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");
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");
15
+ // Main entry point for the CLI tool
16
+ 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);
28
+ }
29
+ }
30
+ main().catch((err) => {
31
+ consola_1.default.error("❌ Error:", err);
32
+ process.exit(1);
33
+ });
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ export declare function showInteractiveIntro(): Promise<void>;
2
+ //# sourceMappingURL=intro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intro.d.ts","sourceRoot":"","sources":["../src/intro.ts"],"names":[],"mappings":"AAKA,wBAAsB,oBAAoB,kBA6BzC"}
package/dist/intro.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.showInteractiveIntro = showInteractiveIntro;
7
+ // Better TS Stack - Interactive CLI Intro
8
+ const consola_1 = __importDefault(require("consola"));
9
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
10
+ async function showInteractiveIntro() {
11
+ console.clear();
12
+ // Subtle fade-in effect
13
+ console.log("\n");
14
+ await sleep(80);
15
+ consola_1.default.log(" \x1b[36m╭─────────────────────────────────────────╮\x1b[0m");
16
+ await sleep(50);
17
+ consola_1.default.log(" \x1b[36m│\x1b[0m \x1b[36m│\x1b[0m");
18
+ await sleep(50);
19
+ consola_1.default.log(" \x1b[36m│\x1b[0m \x1b[1m\x1b[96mBetter TS Stack\x1b[0m \x1b[36m│\x1b[0m");
20
+ await sleep(50);
21
+ consola_1.default.log(" \x1b[36m│\x1b[0m \x1b[36m│\x1b[0m");
22
+ await sleep(50);
23
+ consola_1.default.log(" \x1b[36m╰─────────────────────────────────────────╯\x1b[0m");
24
+ await sleep(150);
25
+ console.log("\n");
26
+ }
27
+ //# sourceMappingURL=intro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intro.js","sourceRoot":"","sources":["../src/intro.ts"],"names":[],"mappings":";;;;;AAKA,oDA6BC;AAlCD,0CAA0C;AAC1C,sDAA8B;AAE9B,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEzE,KAAK,UAAU,oBAAoB;IACxC,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,wBAAwB;IACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAEhB,iBAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAEhB,iBAAO,CAAC,GAAG,CACT,6EAA6E,CAC9E,CAAC;IACF,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAEhB,iBAAO,CAAC,GAAG,CACT,mGAAmG,CACpG,CAAC;IACF,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAEhB,iBAAO,CAAC,GAAG,CACT,6EAA6E,CAC9E,CAAC;IACF,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAEhB,iBAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAE5E,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ModuleConfig } from "../types";
2
+ export declare function getModule(id: string): Promise<{
3
+ config: ModuleConfig;
4
+ path: string;
5
+ }>;
6
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/modules/registry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,YAAY,EAAE,MAAM,UAAU,CAAC;AA+CpD,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM;;;GAiBzC"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getModule = getModule;
7
+ // Module registry for accessing base templates and feature modules
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const zod_1 = require("zod");
11
+ const types_1 = require("../types");
12
+ const moduleConfigSchema = zod_1.z.object({
13
+ id: zod_1.z.string().min(1),
14
+ name: zod_1.z.string().min(1),
15
+ description: zod_1.z.string().min(1),
16
+ type: zod_1.z.enum(["base", "database", "feature"]),
17
+ dependencies: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).default({}),
18
+ devDependencies: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).default({}),
19
+ scripts: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).default({}),
20
+ envVars: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).default({}),
21
+ templateFiles: zod_1.z.array(zod_1.z.string()).default([]),
22
+ });
23
+ // Determines the absolute filesystem path for a given module ID
24
+ function resolveModulePath(id) {
25
+ // Base templates: backend/express, frontend/nextjs
26
+ if (id.startsWith("backend/") || id.startsWith("frontend/")) {
27
+ return path_1.default.join(__dirname, `../../templates/${id}`);
28
+ }
29
+ // Compound module ids: auth/express, auth/nextjs, prisma/express, etc.
30
+ if (id.includes("/")) {
31
+ return path_1.default.join(__dirname, `../../templates/modules/${id}`);
32
+ }
33
+ // Simple module ids: docker, mongoose
34
+ return path_1.default.join(__dirname, `../../templates/modules/${id}`);
35
+ }
36
+ // Reads and parses a module's config.json file
37
+ async function loadModuleConfig(modulePath) {
38
+ const configPath = path_1.default.join(modulePath, "config.json");
39
+ try {
40
+ const configContent = await fs_extra_1.default.readFile(configPath, "utf-8");
41
+ const rawConfig = JSON.parse(configContent);
42
+ const config = moduleConfigSchema.parse(rawConfig);
43
+ return config;
44
+ }
45
+ catch (error) {
46
+ throw (0, types_1.buildError)(error, "MODULE_CONFIG_ERROR", `Failed to load module config from ${configPath}`);
47
+ }
48
+ }
49
+ // Retrieves a module's path and configuration by its ID
50
+ async function getModule(id) {
51
+ const modulePath = resolveModulePath(id);
52
+ // Check if module directory exists
53
+ const exists = await fs_extra_1.default.pathExists(modulePath);
54
+ if (!exists) {
55
+ throw (0, types_1.buildError)(`Module not found: ${id}`, "MODULE_NOT_FOUND");
56
+ }
57
+ // Load module configuration
58
+ const config = await loadModuleConfig(modulePath);
59
+ return {
60
+ config,
61
+ path: modulePath,
62
+ };
63
+ }
64
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/modules/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
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;
4
+ //# sourceMappingURL=nextSteps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextSteps.d.ts","sourceRoot":"","sources":["../../src/output/nextSteps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,OAAO,GACrB,MAAM,EAAE,CA+CV;AA+BD,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EAAE,GACd,MAAM,CAeR"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateNextSteps = generateNextSteps;
4
+ exports.displayNextSteps = displayNextSteps;
5
+ // Generates a list of instructions for the user to follow after project creation
6
+ function generateNextSteps(config, depsInstalled) {
7
+ const steps = [];
8
+ const isFullstack = config.applicationType === "fullstack";
9
+ // Step 1: cd into project directory
10
+ steps.push(`cd ${config.projectName}`);
11
+ // Step 2: Set environment variables
12
+ steps.push("Copy .env.example to .env and set your environment variables");
13
+ if (isFullstack) {
14
+ if (config.useAuth) {
15
+ steps.push("Set BETTER_AUTH_SECRET and BETTER_AUTH_URL in .env");
16
+ steps.push("Visit /sign-up to create your first account");
17
+ }
18
+ }
19
+ else {
20
+ if (config.useAuth) {
21
+ steps.push("Set JWT_SECRET in .env (required for auth)");
22
+ steps.push("Create a user via POST /auth/register then login with /auth/login");
23
+ }
24
+ }
25
+ // Step 3: Install dependencies if not already done
26
+ if (!depsInstalled) {
27
+ const installCmd = getInstallCommand(config.packageManager);
28
+ steps.push(installCmd);
29
+ }
30
+ // Step 4: Database-specific steps
31
+ if (config.database === "prisma") {
32
+ steps.push(`${getRunCommand(config.packageManager)} prisma:generate`);
33
+ steps.push(`${getRunCommand(config.packageManager)} prisma:migrate`);
34
+ }
35
+ else if (config.database === "drizzle") {
36
+ steps.push(`${getRunCommand(config.packageManager)} db:generate`);
37
+ steps.push(`${getRunCommand(config.packageManager)} db:migrate`);
38
+ }
39
+ else if (config.database === "mongoose") {
40
+ steps.push("Ensure MongoDB is running locally or update MONGODB_URI in .env");
41
+ }
42
+ // Step 5: Start dev server
43
+ steps.push(`${getRunCommand(config.packageManager)} dev`);
44
+ return steps;
45
+ }
46
+ // Returns the dependency installation command for a package manager
47
+ function getInstallCommand(packageManager) {
48
+ switch (packageManager) {
49
+ case "npm":
50
+ return "npm install";
51
+ case "pnpm":
52
+ return "pnpm install";
53
+ case "bun":
54
+ return "bun install";
55
+ default:
56
+ return "npm install";
57
+ }
58
+ }
59
+ // Returns the script execution prefix for a package manager
60
+ function getRunCommand(packageManager) {
61
+ switch (packageManager) {
62
+ case "npm":
63
+ return "npm run";
64
+ case "pnpm":
65
+ return "pnpm run";
66
+ case "bun":
67
+ return "bun run";
68
+ default:
69
+ return "npm run";
70
+ }
71
+ }
72
+ // Formats the next steps into a success message string
73
+ function displayNextSteps(_projectName, steps) {
74
+ const formattedSteps = steps
75
+ .map((step, index) => ` ${index + 1}. ${step}`)
76
+ .join("\n");
77
+ const message = `
78
+ ✨ Project created successfully!
79
+
80
+ Next steps:
81
+ ${formattedSteps}
82
+
83
+ Your server will be running at http://localhost:3000
84
+ `;
85
+ return message;
86
+ }
87
+ //# sourceMappingURL=nextSteps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextSteps.js","sourceRoot":"","sources":["../../src/output/nextSteps.ts"],"names":[],"mappings":";;AAGA,8CAkDC;AA+BD,4CAkBC;AApGD,iFAAiF;AACjF,SAAgB,iBAAiB,CAC/B,MAAqB,EACrB,aAAsB;IAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,KAAK,WAAW,CAAC;IAE3D,oCAAoC;IACpC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAEvC,oCAAoC;IACpC,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAE3E,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YACjE,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YACzD,KAAK,CAAC,IAAI,CACR,mEAAmE,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,kCAAkC;IAClC,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IACnE,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CACR,iEAAiE,CAClE,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAE1D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oEAAoE;AACpE,SAAS,iBAAiB,CAAC,cAAsB;IAC/C,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,aAAa,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,cAAc,CAAC;QACxB,KAAK,KAAK;YACR,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,SAAS,aAAa,CAAC,cAAsB;IAC3C,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,KAAK;YACR,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,SAAgB,gBAAgB,CAC9B,YAAoB,EACpB,KAAe;IAEf,MAAM,cAAc,GAAG,KAAK;SACzB,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;SAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,OAAO,GAAG;;;;EAIhB,cAAc;;;CAGf,CAAC;IAEA,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { PromptChoices } from "../../types";
2
+ export declare const collectBackendChoices: () => Promise<PromptChoices>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/prompts/backend/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAYL,aAAa,EACd,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,aAAa,CAkJnE,CAAC"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.collectBackendChoices = void 0;
7
+ const prompts_1 = require("@clack/prompts");
8
+ const consola_1 = __importDefault(require("consola"));
9
+ const types_1 = require("../../types");
10
+ const collectBackendChoices = async () => {
11
+ const project = await (0, prompts_1.group)({
12
+ framework: async () => {
13
+ let selection;
14
+ while (!selection) {
15
+ const result = await (0, prompts_1.select)({
16
+ message: "Select a backend framework:",
17
+ options: types_1.backendFrameworkOptions,
18
+ initialValue: "express",
19
+ });
20
+ if ((0, prompts_1.isCancel)(result)) {
21
+ (0, prompts_1.cancel)("Operation cancelled.");
22
+ process.exit(0);
23
+ }
24
+ if (result === "nestjs") {
25
+ consola_1.default.warn("This framework is coming soon! Please select another option.");
26
+ continue;
27
+ }
28
+ selection = result;
29
+ }
30
+ return selection;
31
+ },
32
+ databaseType: async () => {
33
+ const selection = await (0, prompts_1.select)({
34
+ message: "Select a database:",
35
+ options: types_1.databaseTypeOptions,
36
+ initialValue: "none",
37
+ });
38
+ if ((0, prompts_1.isCancel)(selection)) {
39
+ (0, prompts_1.cancel)("Operation cancelled.");
40
+ process.exit(0);
41
+ }
42
+ return selection;
43
+ },
44
+ orm: async ({ results }) => {
45
+ // Type guard to narrow the databaseType from unknown to DatabaseType
46
+ const dbType = results.databaseType;
47
+ // Skip ORM selection if no database type was selected
48
+ if (dbType === "none") {
49
+ return "none";
50
+ }
51
+ // Type guard: at this point, dbType must be mongodb or postgresql
52
+ if (dbType !== "mongodb" && dbType !== "postgresql") {
53
+ throw new Error(`Invalid database type: ${dbType}`);
54
+ }
55
+ // Select appropriate ORM options based on database type
56
+ const ormOptions = dbType === "mongodb" ? types_1.mongodbOrmOptions : types_1.postgresqlOrmOptions;
57
+ const selection = await (0, prompts_1.select)({
58
+ message: `Select an ORM for ${dbType}:`,
59
+ options: ormOptions,
60
+ initialValue: "prisma",
61
+ });
62
+ if ((0, prompts_1.isCancel)(selection)) {
63
+ (0, prompts_1.cancel)("Operation cancelled.");
64
+ process.exit(0);
65
+ }
66
+ return selection;
67
+ },
68
+ packageManager: async () => {
69
+ const selection = await (0, prompts_1.select)({
70
+ message: "Select a package manager:",
71
+ options: types_1.packageManagerOptions,
72
+ initialValue: "npm",
73
+ });
74
+ if ((0, prompts_1.isCancel)(selection)) {
75
+ (0, prompts_1.cancel)("Operation cancelled.");
76
+ process.exit(0);
77
+ }
78
+ return selection;
79
+ },
80
+ useDocker: () => (0, prompts_1.confirm)({
81
+ message: "Use Docker?",
82
+ initialValue: false,
83
+ }),
84
+ useAuth: async () => {
85
+ const selection = await (0, prompts_1.select)({
86
+ message: "Add authentication?",
87
+ options: types_1.authOptions,
88
+ initialValue: false,
89
+ });
90
+ if ((0, prompts_1.isCancel)(selection)) {
91
+ (0, prompts_1.cancel)("Operation cancelled.");
92
+ process.exit(0);
93
+ }
94
+ return selection;
95
+ },
96
+ initGit: () => (0, prompts_1.confirm)({
97
+ message: "Initialize a git repository?",
98
+ initialValue: true,
99
+ }),
100
+ installDeps: () => (0, prompts_1.confirm)({
101
+ message: "Install dependencies now?",
102
+ initialValue: false,
103
+ }),
104
+ }, {
105
+ onCancel: () => {
106
+ (0, prompts_1.cancel)("Operation cancelled.");
107
+ process.exit(0);
108
+ },
109
+ });
110
+ // Transform the group result into the proper typed object
111
+ // Validate orm using type guard
112
+ if (!(0, types_1.isValidOrmOption)(project.orm)) {
113
+ throw new Error(`Invalid ORM option: ${String(project.orm)}`);
114
+ }
115
+ const result = {
116
+ framework: project.framework,
117
+ databaseType: project.databaseType,
118
+ orm: project.orm,
119
+ packageManager: project.packageManager,
120
+ useDocker: Boolean(project.useDocker),
121
+ useAuth: Boolean(project.useAuth),
122
+ initGit: Boolean(project.initGit),
123
+ installDeps: Boolean(project.installDeps),
124
+ };
125
+ return result;
126
+ };
127
+ exports.collectBackendChoices = collectBackendChoices;
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/prompts/backend/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { PromptChoices } from "../../types";
2
+ export declare const collectFrontendChoices: () => Promise<PromptChoices>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/prompts/frontend/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAWL,aAAa,EACd,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,sBAAsB,QAAa,OAAO,CAAC,aAAa,CA+HpE,CAAC"}