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
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # better-ts-stack
2
+
3
+ > Generate production-ready TypeScript apps from an interactive CLI
4
+
5
+ `better-ts-stack` scaffolds backend and full-stack TypeScript projects with sensible defaults, batteries-included tooling, and optional database, auth, Docker, and git setup.
6
+
7
+ ## Quick Start
8
+
9
+ ```bash
10
+ # Run instantly with npx
11
+ npx better-ts-stack
12
+
13
+ # Or install globally
14
+ npm install -g better-ts-stack
15
+ better-ts-stack
16
+ ```
17
+
18
+ Run the command, answer the prompts, and the CLI generates a ready-to-work project for you.
19
+
20
+ ## What It Can Scaffold
21
+
22
+ | Project type | Stack | Optional setup |
23
+ | --- | --- | --- |
24
+ | Backend API | Express + TypeScript | PostgreSQL, MongoDB, Prisma, Drizzle, Mongoose, JWT auth, Docker, git |
25
+ | Full-stack app | Next.js 16 + React 19 + TypeScript | PostgreSQL, MongoDB, Prisma, Better Auth, Docker, git |
26
+
27
+ Notes:
28
+
29
+ - Express is the current backend implementation.
30
+ - NestJS appears in the prompt flow as "Coming Soon".
31
+ - Better Auth is only available for full-stack projects when a database is selected.
32
+
33
+ ## Interactive Prompt Flow
34
+
35
+ The CLI is fully interactive. There are no subcommands or flags.
36
+
37
+ You will be guided through:
38
+
39
+ 1. Project name
40
+ 2. Application type: `Backend API` or `Full-stack App`
41
+ 3. Backend framework for backend apps: `Express` (`NestJS` is coming soon)
42
+ 4. Database: `none`, `PostgreSQL`, or `MongoDB`
43
+ 5. ORM/ODM when a database is selected
44
+ - PostgreSQL: `Prisma` or `Drizzle`
45
+ - MongoDB: `Prisma` or `Mongoose`
46
+ 6. Package manager: `npm`, `pnpm`, or `bun`
47
+ 7. Docker setup
48
+ 8. Authentication
49
+ - Express apps: JWT-based auth
50
+ - Next.js apps: Better Auth when a database is enabled
51
+ 9. Git initialization
52
+ 10. Dependency installation
53
+
54
+ The CLI does not ask for a port. Backend projects default to `PORT=3000`.
55
+
56
+ ## What You Get
57
+
58
+ Every generated project includes the essentials:
59
+
60
+ - TypeScript with strict mode enabled
61
+ - ESLint and Prettier pre-configured
62
+ - `.env.example` and `.env` setup
63
+ - Ready-to-run project scripts
64
+ - Health check endpoint at `/health` for backend projects
65
+ - shadcn-compatible UI foundation for Next.js projects
66
+ - Database wiring and schema setup when selected
67
+ - Authentication scaffolding when selected
68
+ - Docker files when selected
69
+ - Optional git repository initialization
70
+
71
+ ## Requirements
72
+
73
+ - Node.js 18 or later
74
+
75
+ ## Links
76
+
77
+ - [Documentation](https://better-ts-stack.abdullahtech.me/docs)
78
+ - [GitHub Repository](https://github.com/Abdullah-dev0/better-ts-stack)
79
+ - [Issue Tracker](https://github.com/Abdullah-dev0/better-ts-stack/issues)
80
+
81
+ ## License
82
+
83
+ MIT
@@ -0,0 +1,6 @@
1
+ import { MergedConfig, ModuleConfig, ProjectConfig, TemplateContext } from "../types";
2
+ export declare function processScriptVariables(scripts: Record<string, string>, context: TemplateContext): Record<string, string>;
3
+ export declare function mergeConfigurations(modules: ModuleConfig[], context: TemplateContext): MergedConfig;
4
+ export declare function generatePackageJson(targetDir: string, mergedConfig: MergedConfig, config: ProjectConfig): Promise<void>;
5
+ export declare function generateEnvFile(targetDir: string, envVars: Record<string, string>): Promise<void>;
6
+ //# sourceMappingURL=configGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configGenerator.d.ts","sourceRoot":"","sources":["../../src/builder/configGenerator.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,eAAe,EAChB,MAAM,UAAU,CAAC;AAGlB,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE,eAAe,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBxB;AAGD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,eAAe,GACvB,YAAY,CAkCd;AAGD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAGD,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -0,0 +1,110 @@
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.processScriptVariables = processScriptVariables;
7
+ exports.mergeConfigurations = mergeConfigurations;
8
+ exports.generatePackageJson = generatePackageJson;
9
+ exports.generateEnvFile = generateEnvFile;
10
+ // Utilities for merging module configurations and generating project files
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ const handlebars_1 = __importDefault(require("handlebars"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const types_1 = require("../types");
15
+ // Replaces Handlebars variables within script command strings
16
+ function processScriptVariables(scripts, context) {
17
+ const helpers = {
18
+ ...context.helpers,
19
+ };
20
+ const processedScripts = {};
21
+ for (const [scriptName, scriptCommand] of Object.entries(scripts)) {
22
+ try {
23
+ const template = handlebars_1.default.compile(scriptCommand, { noEscape: true });
24
+ processedScripts[scriptName] = template(context, { helpers });
25
+ }
26
+ catch (error) {
27
+ throw (0, types_1.buildError)(error, "TEMPLATE_SCRIPT_ERROR", `Failed to process script "${scriptName}"`);
28
+ }
29
+ }
30
+ return processedScripts;
31
+ }
32
+ // Merges configurations from multiple modules, processing script variables
33
+ function mergeConfigurations(modules, context) {
34
+ const merged = {
35
+ dependencies: {},
36
+ devDependencies: {},
37
+ scripts: {},
38
+ envVars: {},
39
+ };
40
+ // Merge each module's configuration
41
+ // Later modules override earlier ones
42
+ for (const module of modules) {
43
+ // Merge dependencies
44
+ if (module.dependencies) {
45
+ Object.assign(merged.dependencies, module.dependencies);
46
+ }
47
+ // Merge devDependencies
48
+ if (module.devDependencies) {
49
+ Object.assign(merged.devDependencies, module.devDependencies);
50
+ }
51
+ // Merge scripts - process variables before merging
52
+ if (module.scripts) {
53
+ const processedScripts = processScriptVariables(module.scripts, context);
54
+ Object.assign(merged.scripts, processedScripts);
55
+ }
56
+ // Merge environment variables
57
+ if (module.envVars) {
58
+ Object.assign(merged.envVars, module.envVars);
59
+ }
60
+ }
61
+ return merged;
62
+ }
63
+ // Generates the final package.json file from the merged configuration
64
+ async function generatePackageJson(targetDir, mergedConfig, config) {
65
+ try {
66
+ const isFullstack = config.applicationType === "fullstack";
67
+ const packageJson = {
68
+ name: config.projectName,
69
+ version: "1.0.0",
70
+ description: `Project created with better-ts-stack using ${config.database !== "none" ? config.database : "no database"}`,
71
+ ...(isFullstack ? {} : { main: "dist/index.js" }),
72
+ scripts: mergedConfig.scripts,
73
+ keywords: isFullstack
74
+ ? ["nextjs", "react", "typescript"]
75
+ : ["backend", "typescript", "express"],
76
+ author: "",
77
+ license: "MIT",
78
+ dependencies: mergedConfig.dependencies,
79
+ devDependencies: mergedConfig.devDependencies,
80
+ };
81
+ const packageJsonPath = path_1.default.join(targetDir, "package.json");
82
+ await fs_extra_1.default.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n", "utf-8");
83
+ }
84
+ catch (error) {
85
+ throw (0, types_1.buildError)(error, "PACKAGE_JSON_ERROR", "Failed to generate package.json");
86
+ }
87
+ }
88
+ // Generates .env and .env.example files from merged environment variables
89
+ async function generateEnvFile(targetDir, envVars) {
90
+ try {
91
+ // Build .env.example content with comments
92
+ let envContent = "# Environment Variables\n";
93
+ envContent +=
94
+ "# Copy this file to .env and update with your actual values\n\n";
95
+ // Add each environment variable
96
+ for (const [key, value] of Object.entries(envVars)) {
97
+ envContent += `${key}=${value}\n`;
98
+ }
99
+ // Write .env.example
100
+ const envExamplePath = path_1.default.join(targetDir, ".env.example");
101
+ await fs_extra_1.default.writeFile(envExamplePath, envContent, "utf-8");
102
+ // Copy .env.example to .env
103
+ const envPath = path_1.default.join(targetDir, ".env");
104
+ await fs_extra_1.default.copy(envExamplePath, envPath);
105
+ }
106
+ catch (error) {
107
+ throw (0, types_1.buildError)(error, "ENV_FILE_ERROR", "Failed to generate environment files");
108
+ }
109
+ }
110
+ //# sourceMappingURL=configGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configGenerator.js","sourceRoot":"","sources":["../../src/builder/configGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PackageManager } from "../types";
2
+ export declare function installDependencies(packageManager: PackageManager, cwd: string): boolean;
3
+ //# sourceMappingURL=dependencyInstaller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyInstaller.d.ts","sourceRoot":"","sources":["../../src/builder/dependencyInstaller.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAc/C,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,cAAc,EAC9B,GAAG,EAAE,MAAM,GACV,OAAO,CAyBT"}
@@ -0,0 +1,39 @@
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.installDependencies = installDependencies;
7
+ const child_process_1 = require("child_process");
8
+ const consola_1 = __importDefault(require("consola"));
9
+ // Returns the installation command for the given package manager
10
+ function getInstallCommand(packageManager) {
11
+ const commands = {
12
+ npm: "npm install",
13
+ pnpm: "pnpm install",
14
+ bun: "bun install",
15
+ };
16
+ return commands[packageManager];
17
+ }
18
+ // Installs project dependencies in the target directory
19
+ function installDependencies(packageManager, cwd) {
20
+ const command = getInstallCommand(packageManager);
21
+ consola_1.default.info(`Installing dependencies with ${packageManager}...`);
22
+ consola_1.default.debug(`Running: ${command}`);
23
+ try {
24
+ (0, child_process_1.execSync)(command, {
25
+ cwd,
26
+ stdio: "inherit", // Show installation progress in real-time
27
+ });
28
+ consola_1.default.success("Dependencies installed successfully");
29
+ return true;
30
+ }
31
+ catch (error) {
32
+ // Display helpful error message but don't throw - allow building to continue
33
+ consola_1.default.warn("Failed to install dependencies");
34
+ consola_1.default.debug(`Error: ${error instanceof Error ? error.message : String(error)}`);
35
+ consola_1.default.info(`You can install dependencies manually later by running: ${command}`);
36
+ return false;
37
+ }
38
+ }
39
+ //# sourceMappingURL=dependencyInstaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyInstaller.js","sourceRoot":"","sources":["../../src/builder/dependencyInstaller.ts"],"names":[],"mappings":";;;;;AAiBA,kDA4BC;AA7CD,iDAAyC;AACzC,sDAA8B;AAI9B,iEAAiE;AACjE,SAAS,iBAAiB,CAAC,cAA8B;IACvD,MAAM,QAAQ,GAAmC;QAC/C,GAAG,EAAE,aAAa;QAClB,IAAI,EAAE,cAAc;QACpB,GAAG,EAAE,aAAa;KACnB,CAAC;IAEF,OAAO,QAAQ,CAAC,cAAc,CAAC,CAAC;AAClC,CAAC;AAED,wDAAwD;AACxD,SAAgB,mBAAmB,CACjC,cAA8B,EAC9B,GAAW;IAEX,MAAM,OAAO,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAElD,iBAAO,CAAC,IAAI,CAAC,gCAAgC,cAAc,KAAK,CAAC,CAAC;IAClE,iBAAO,CAAC,KAAK,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,OAAO,EAAE;YAChB,GAAG;YACH,KAAK,EAAE,SAAS,EAAE,0CAA0C;SAC7D,CAAC,CAAC;QAEH,iBAAO,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6EAA6E;QAC7E,iBAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC/C,iBAAO,CAAC,KAAK,CACX,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;QACF,iBAAO,CAAC,IAAI,CACV,2DAA2D,OAAO,EAAE,CACrE,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { TemplateContext } from "../types";
2
+ export declare function copyModuleFiles(moduleDir: string, targetDir: string): Promise<void>;
3
+ export declare function compileTemplate(content: string, context: TemplateContext): string;
4
+ export declare function processTemplateFiles(targetDir: string, context: TemplateContext, templateFiles: string[]): Promise<void>;
5
+ export declare function processTemplateFile(filePath: string, context: TemplateContext): Promise<void>;
6
+ //# sourceMappingURL=fileProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileProcessor.d.ts","sourceRoot":"","sources":["../../src/builder/fileProcessor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,eAAe,EAAE,MAAM,UAAU,CAAC;AA0BvD,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAGD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,eAAe,GACvB,MAAM,CAmBR;AAGD,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,EACxB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CAIf;AAGD,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAuCf"}
@@ -0,0 +1,108 @@
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.copyModuleFiles = copyModuleFiles;
7
+ exports.compileTemplate = compileTemplate;
8
+ exports.processTemplateFiles = processTemplateFiles;
9
+ exports.processTemplateFile = processTemplateFile;
10
+ // Utilities for copying files and processing Handlebars templates
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ const handlebars_1 = __importDefault(require("handlebars"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const types_1 = require("../types");
15
+ async function restoreGitignore(targetDir) {
16
+ const templateGitignorePath = path_1.default.join(targetDir, "gitignore");
17
+ const npmIgnorePath = path_1.default.join(targetDir, ".npmignore");
18
+ const gitIgnorePath = path_1.default.join(targetDir, ".gitignore");
19
+ const [hasTemplateGitignore, hasNpmIgnore, hasGitIgnore] = await Promise.all([
20
+ fs_extra_1.default.pathExists(templateGitignorePath),
21
+ fs_extra_1.default.pathExists(npmIgnorePath),
22
+ fs_extra_1.default.pathExists(gitIgnorePath),
23
+ ]);
24
+ // Prefer a plain "gitignore" template file because npm packaging preserves
25
+ // it reliably, then fall back to ".npmignore" for already-published builds.
26
+ if (hasTemplateGitignore && !hasGitIgnore) {
27
+ await fs_extra_1.default.move(templateGitignorePath, gitIgnorePath);
28
+ return;
29
+ }
30
+ if (hasNpmIgnore && !hasGitIgnore) {
31
+ await fs_extra_1.default.move(npmIgnorePath, gitIgnorePath);
32
+ }
33
+ }
34
+ // Copies files from a module to the destination, skipping config.json
35
+ async function copyModuleFiles(moduleDir, targetDir) {
36
+ try {
37
+ // Ensure target directory exists
38
+ await fs_extra_1.default.ensureDir(targetDir);
39
+ // Copy all files from module to target
40
+ await fs_extra_1.default.copy(moduleDir, targetDir, {
41
+ overwrite: true,
42
+ filter: (src) => {
43
+ // Skip config.json files
44
+ const basename = path_1.default.basename(src);
45
+ return basename !== "config.json";
46
+ },
47
+ });
48
+ await restoreGitignore(targetDir);
49
+ }
50
+ catch (error) {
51
+ throw (0, types_1.buildError)(error, "FILE_COPY_ERROR", `Failed to copy module files from ${moduleDir}`);
52
+ }
53
+ }
54
+ // Compiles and renders template content with Handlebars and provided context
55
+ function compileTemplate(content, context) {
56
+ try {
57
+ // Register helper functions with Handlebars
58
+ Object.entries(context.helpers).forEach(([name, fn]) => {
59
+ handlebars_1.default.registerHelper(name, fn);
60
+ });
61
+ // Compile the template
62
+ const template = handlebars_1.default.compile(content);
63
+ // Render with context
64
+ return template(context);
65
+ }
66
+ catch (error) {
67
+ throw (0, types_1.buildError)(error, "TEMPLATE_SYNTAX_ERROR", "Failed to compile Handlebars template");
68
+ }
69
+ }
70
+ // Processes multiple template files by replacing variables and handling extensions
71
+ async function processTemplateFiles(targetDir, context, templateFiles) {
72
+ for (const templateFile of templateFiles) {
73
+ await processTemplateFile(path_1.default.join(targetDir, templateFile), context);
74
+ }
75
+ }
76
+ // Processes a single template file, replaces variables, and renames/deletes .hbs files
77
+ async function processTemplateFile(filePath, context) {
78
+ try {
79
+ // Check if file exists
80
+ const exists = await fs_extra_1.default.pathExists(filePath);
81
+ if (!exists) {
82
+ return; // Skip if file doesn't exist
83
+ }
84
+ // Read template file
85
+ const content = await fs_extra_1.default.readFile(filePath, "utf-8");
86
+ // Compile and render template with Handlebars
87
+ const rendered = compileTemplate(content, context);
88
+ // Determine output path (remove .hbs extension if present)
89
+ const outputPath = filePath.endsWith(".hbs")
90
+ ? filePath.slice(0, -4)
91
+ : filePath;
92
+ // Write processed content
93
+ await fs_extra_1.default.writeFile(outputPath, rendered, "utf-8");
94
+ // Remove original .hbs file if it was renamed
95
+ if (outputPath !== filePath) {
96
+ await fs_extra_1.default.remove(filePath);
97
+ }
98
+ }
99
+ catch (error) {
100
+ // Re-throw BuildErrors as-is
101
+ if (error && typeof error === "object" && "code" in error) {
102
+ throw error;
103
+ }
104
+ // Wrap other errors
105
+ throw (0, types_1.buildError)(error, "TEMPLATE_WRITE_ERROR", `Failed to process template file ${filePath}`);
106
+ }
107
+ }
108
+ //# sourceMappingURL=fileProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileProcessor.js","sourceRoot":"","sources":["../../src/builder/fileProcessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function initializeGitRepository(cwd: string): boolean;
2
+ //# sourceMappingURL=gitInitializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitInitializer.d.ts","sourceRoot":"","sources":["../../src/builder/gitInitializer.ts"],"names":[],"mappings":"AAiCA,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAkB5D"}
@@ -0,0 +1,52 @@
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.initializeGitRepository = initializeGitRepository;
7
+ const child_process_1 = require("child_process");
8
+ const consola_1 = __importDefault(require("consola"));
9
+ // Checks if git is installed and available in the system PATH
10
+ function isGitAvailable() {
11
+ try {
12
+ (0, child_process_1.execSync)("git --version", { stdio: "ignore" });
13
+ return true;
14
+ }
15
+ catch {
16
+ consola_1.default.warn("Git is not installed or not available in PATH");
17
+ return false;
18
+ }
19
+ }
20
+ // Initializes a new git repository in the given directory
21
+ function initGit(cwd) {
22
+ consola_1.default.info("Initializing git repository...");
23
+ try {
24
+ (0, child_process_1.execSync)("git init", {
25
+ cwd,
26
+ stdio: "ignore",
27
+ });
28
+ consola_1.default.success("Git repository initialized");
29
+ return true;
30
+ }
31
+ catch {
32
+ consola_1.default.warn("Failed to initialize git repository");
33
+ return false;
34
+ }
35
+ }
36
+ // Coordinates the git initialization process
37
+ function initializeGitRepository(cwd) {
38
+ // Check if git is available
39
+ if (!isGitAvailable()) {
40
+ consola_1.default.warn("Git is not installed or not available in PATH");
41
+ consola_1.default.info("Skipping git initialization. You can initialize git manually later.");
42
+ return false;
43
+ }
44
+ // Initialize git repository
45
+ const gitInitSuccess = initGit(cwd);
46
+ if (!gitInitSuccess) {
47
+ consola_1.default.info("Continuing with building...");
48
+ return false;
49
+ }
50
+ return true;
51
+ }
52
+ //# sourceMappingURL=gitInitializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitInitializer.js","sourceRoot":"","sources":["../../src/builder/gitInitializer.ts"],"names":[],"mappings":";;;;;AAiCA,0DAkBC;AAnDD,iDAAyC;AACzC,sDAA8B;AAE9B,8DAA8D;AAC9D,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,iBAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,SAAS,OAAO,CAAC,GAAW;IAC1B,iBAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,UAAU,EAAE;YACnB,GAAG;YACH,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QAEH,iBAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,iBAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,6CAA6C;AAC7C,SAAgB,uBAAuB,CAAC,GAAW;IACjD,4BAA4B;IAC5B,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QACtB,iBAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC9D,iBAAO,CAAC,IAAI,CACV,qEAAqE,CACtE,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4BAA4B;IAC5B,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,iBAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { BuildResult, ProjectConfig } from "../types";
2
+ export declare function build(config: ProjectConfig, targetDir: string): Promise<BuildResult>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,WAAW,EAAgB,aAAa,EAAE,MAAM,UAAU,CAAC;AAchF,wBAAsB,KAAK,CACzB,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CAuJtB"}
@@ -0,0 +1,126 @@
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.build = build;
7
+ const consola_1 = __importDefault(require("consola"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const registry_1 = require("../modules/registry");
10
+ const nextSteps_1 = require("../output/nextSteps");
11
+ const types_1 = require("../types");
12
+ const validators_1 = require("../validators");
13
+ const configGenerator_1 = require("./configGenerator");
14
+ const dependencyInstaller_1 = require("./dependencyInstaller");
15
+ const fileProcessor_1 = require("./fileProcessor");
16
+ const gitInitializer_1 = require("./gitInitializer");
17
+ const moduleSelector_1 = require("./moduleSelector");
18
+ const templateContext_1 = require("./templateContext");
19
+ // Main function to orchestrate the project construction process
20
+ async function build(config, targetDir) {
21
+ consola_1.default.start("Starting project building...");
22
+ 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
+ // 2. Create target directory
29
+ consola_1.default.info("Creating project directory...");
30
+ await fs_extra_1.default.ensureDir(targetDir).catch((e) => {
31
+ throw (0, types_1.buildError)(e, "DIRECTORY_CREATE_ERROR", "Failed to create directory");
32
+ });
33
+ // 3. Select modules
34
+ consola_1.default.info("Selecting modules...");
35
+ const selection = (0, moduleSelector_1.selectModules)(config);
36
+ // 4. Load modules
37
+ consola_1.default.info("Loading module configurations...");
38
+ const modules = [];
39
+ 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 });
45
+ }
46
+ }
47
+ catch (e) {
48
+ throw (0, types_1.buildError)(e, "MODULE_LOADING_ERROR", "Failed to load modules");
49
+ }
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...");
53
+ const templateContext = (0, templateContext_1.buildTemplateContext)(config);
54
+ // 6. Merge configurations
55
+ 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...");
58
+ try {
59
+ for (const module of modules) {
60
+ consola_1.default.debug(` - Copying ${module.config.id}...`);
61
+ await (0, fileProcessor_1.copyModuleFiles)(module.path, targetDir);
62
+ }
63
+ consola_1.default.success("Module files copied");
64
+ }
65
+ catch (e) {
66
+ throw (0, types_1.buildError)(e, "FILE_COPY_ERROR", "Failed to copy module files");
67
+ }
68
+ // 8. Process Handlebars templates
69
+ consola_1.default.info("Processing template files...");
70
+ 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
+ }
79
+ }
80
+ catch (e) {
81
+ throw (0, types_1.buildError)(e, "TEMPLATE_PROCESSING_ERROR", "Failed to process template files");
82
+ }
83
+ // 9. Generate package.json
84
+ consola_1.default.info("Generating package.json...");
85
+ await (0, configGenerator_1.generatePackageJson)(targetDir, mergedConfig, config).catch((e) => {
86
+ throw (0, types_1.buildError)(e, "PACKAGE_JSON_ERROR", "Failed to generate package.json");
87
+ });
88
+ consola_1.default.success("package.json generated");
89
+ // 10. Generate environment files
90
+ consola_1.default.info("Generating environment files...");
91
+ await (0, configGenerator_1.generateEnvFile)(targetDir, mergedConfig.envVars).catch((e) => {
92
+ throw (0, types_1.buildError)(e, "ENV_FILE_ERROR", "Failed to generate environment files");
93
+ });
94
+ consola_1.default.success("Environment files generated");
95
+ // 11. Install dependencies (optional)
96
+ let depsInstalled = false;
97
+ if (config.installDeps) {
98
+ try {
99
+ depsInstalled = (0, dependencyInstaller_1.installDependencies)(config.packageManager, targetDir);
100
+ }
101
+ catch {
102
+ consola_1.default.warn("Continuing despite dependency installation issues");
103
+ }
104
+ }
105
+ // 12. Initialize git (optional)
106
+ if (config.initGit) {
107
+ try {
108
+ (0, gitInitializer_1.initializeGitRepository)(targetDir);
109
+ }
110
+ catch {
111
+ consola_1.default.warn("Continuing despite git initialization issues");
112
+ }
113
+ }
114
+ // 13. Done!
115
+ consola_1.default.success("Project building completed successfully!");
116
+ return {
117
+ success: true,
118
+ projectPath: targetDir,
119
+ nextSteps: (0, nextSteps_1.generateNextSteps)(config, depsInstalled),
120
+ };
121
+ }
122
+ catch (error) {
123
+ throw (0, types_1.buildError)(error, "BUILDING_ERROR", "Building failed");
124
+ }
125
+ }
126
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ProjectConfig } from "../types";
2
+ export declare function selectModules(config: ProjectConfig): {
3
+ base: string;
4
+ modules: {
5
+ id: string;
6
+ framework: string;
7
+ }[];
8
+ };
9
+ //# sourceMappingURL=moduleSelector.d.ts.map
@@ -0,0 +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;;;YAWtB,MAAM;mBAAa,MAAM;;EAqBrD"}