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.
- package/README.md +83 -0
- package/dist/builder/configGenerator.d.ts +6 -0
- package/dist/builder/configGenerator.d.ts.map +1 -0
- package/dist/builder/configGenerator.js +110 -0
- package/dist/builder/configGenerator.js.map +1 -0
- package/dist/builder/dependencyInstaller.d.ts +3 -0
- package/dist/builder/dependencyInstaller.d.ts.map +1 -0
- package/dist/builder/dependencyInstaller.js +39 -0
- package/dist/builder/dependencyInstaller.js.map +1 -0
- package/dist/builder/fileProcessor.d.ts +6 -0
- package/dist/builder/fileProcessor.d.ts.map +1 -0
- package/dist/builder/fileProcessor.js +108 -0
- package/dist/builder/fileProcessor.js.map +1 -0
- package/dist/builder/gitInitializer.d.ts +2 -0
- package/dist/builder/gitInitializer.d.ts.map +1 -0
- package/dist/builder/gitInitializer.js +52 -0
- package/dist/builder/gitInitializer.js.map +1 -0
- package/dist/builder/index.d.ts +3 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +126 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/builder/moduleSelector.d.ts +9 -0
- package/dist/builder/moduleSelector.d.ts.map +1 -0
- package/dist/builder/moduleSelector.js +29 -0
- package/dist/builder/moduleSelector.js.map +1 -0
- package/dist/builder/templateContext.d.ts +21 -0
- package/dist/builder/templateContext.d.ts.map +1 -0
- package/dist/builder/templateContext.js +47 -0
- package/dist/builder/templateContext.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/intro.d.ts +2 -0
- package/dist/intro.d.ts.map +1 -0
- package/dist/intro.js +27 -0
- package/dist/intro.js.map +1 -0
- package/dist/modules/registry.d.ts +6 -0
- package/dist/modules/registry.d.ts.map +1 -0
- package/dist/modules/registry.js +64 -0
- package/dist/modules/registry.js.map +1 -0
- package/dist/output/nextSteps.d.ts +4 -0
- package/dist/output/nextSteps.d.ts.map +1 -0
- package/dist/output/nextSteps.js +87 -0
- package/dist/output/nextSteps.js.map +1 -0
- package/dist/prompts/backend/index.d.ts +3 -0
- package/dist/prompts/backend/index.d.ts.map +1 -0
- package/dist/prompts/backend/index.js +128 -0
- package/dist/prompts/backend/index.js.map +1 -0
- package/dist/prompts/frontend/index.d.ts +3 -0
- package/dist/prompts/frontend/index.d.ts.map +1 -0
- package/dist/prompts/frontend/index.js +111 -0
- package/dist/prompts/frontend/index.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +82 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/types/index.d.ts +157 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +81 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validators/index.d.ts +5 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +73 -0
- package/dist/validators/index.js.map +1 -0
- package/package.json +66 -0
- package/templates/backend/express/.eslintrc.js +24 -0
- package/templates/backend/express/.prettierignore +52 -0
- package/templates/backend/express/.prettierrc +16 -0
- package/templates/backend/express/config.json +42 -0
- package/templates/backend/express/eslint.config.mjs +31 -0
- package/templates/backend/express/gitignore +39 -0
- package/templates/backend/express/src/index.ts +46 -0
- package/templates/backend/express/src/routes/health.ts +12 -0
- package/templates/backend/express/tsconfig.eslint.json +9 -0
- package/templates/backend/express/tsconfig.json +23 -0
- package/templates/frontend/nextjs/app/globals.css +99 -0
- package/templates/frontend/nextjs/app/layout.tsx +34 -0
- package/templates/frontend/nextjs/app/page.tsx.hbs +98 -0
- package/templates/frontend/nextjs/components/ui/button.tsx +51 -0
- package/templates/frontend/nextjs/components/ui/card.tsx +60 -0
- package/templates/frontend/nextjs/components/ui/field.tsx +67 -0
- package/templates/frontend/nextjs/components/ui/input.tsx +18 -0
- package/templates/frontend/nextjs/components.json +19 -0
- package/templates/frontend/nextjs/config.json +33 -0
- package/templates/frontend/nextjs/eslint.config.mjs +11 -0
- package/templates/frontend/nextjs/gitignore +41 -0
- package/templates/frontend/nextjs/lib/utils.ts +6 -0
- package/templates/frontend/nextjs/next.config.ts +8 -0
- package/templates/frontend/nextjs/postcss.config.mjs +7 -0
- package/templates/frontend/nextjs/proxy.ts.hbs +23 -0
- package/templates/frontend/nextjs/public/file.svg +1 -0
- package/templates/frontend/nextjs/public/globe.svg +1 -0
- package/templates/frontend/nextjs/public/next.svg +1 -0
- package/templates/frontend/nextjs/public/vercel.svg +1 -0
- package/templates/frontend/nextjs/public/window.svg +1 -0
- package/templates/frontend/nextjs/tsconfig.json +21 -0
- package/templates/modules/auth/express/config.json +1 -0
- package/templates/modules/auth/express/src/controllers/authController.ts.hbs +81 -0
- package/templates/modules/auth/express/src/lib/jwt.ts.hbs +27 -0
- package/templates/modules/auth/express/src/middleware/requireAuth.ts.hbs +26 -0
- package/templates/modules/auth/express/src/routes/auth.ts.hbs +19 -0
- package/templates/modules/auth/express/src/services/userStore.ts.hbs +107 -0
- package/templates/modules/auth/nextjs/app/api/auth/[...all]/route.ts +4 -0
- package/templates/modules/auth/nextjs/app/dashboard/page.tsx +96 -0
- package/templates/modules/auth/nextjs/app/sign-in/page.tsx +35 -0
- package/templates/modules/auth/nextjs/app/sign-up/page.tsx +35 -0
- package/templates/modules/auth/nextjs/components/auth/sign-in-form.tsx +132 -0
- package/templates/modules/auth/nextjs/components/auth/sign-out-button.tsx +50 -0
- package/templates/modules/auth/nextjs/components/auth/sign-up-form.tsx +152 -0
- package/templates/modules/auth/nextjs/config.json +31 -0
- package/templates/modules/auth/nextjs/lib/auth-client.ts +3 -0
- package/templates/modules/auth/nextjs/lib/auth-schema.ts +39 -0
- package/templates/modules/auth/nextjs/lib/auth.ts.hbs +35 -0
- package/templates/modules/docker/.dockerignore +13 -0
- package/templates/modules/docker/Dockerfile.hbs +71 -0
- package/templates/modules/docker/config.json +16 -0
- package/templates/modules/docker/docker-compose.yml.hbs +10 -0
- package/templates/modules/drizzle/nextjs/config.json +21 -0
- package/templates/modules/drizzle/nextjs/drizzle.config.ts +13 -0
- package/templates/modules/drizzle/nextjs/lib/db.ts +11 -0
- package/templates/modules/drizzle/nextjs/lib/schema.ts.hbs +84 -0
- package/templates/modules/mongoose/config.json +16 -0
- package/templates/modules/mongoose/src/lib/db.ts +43 -0
- package/templates/modules/mongoose/src/lib/db.ts.hbs +56 -0
- package/templates/modules/mongoose/src/models/User.ts +47 -0
- package/templates/modules/prisma/express/config.json +21 -0
- package/templates/modules/prisma/express/prisma/schema.prisma +23 -0
- package/templates/modules/prisma/express/prisma.config.ts +13 -0
- package/templates/modules/prisma/express/src/lib/prisma.ts +37 -0
- package/templates/modules/prisma/nextjs/config.json +23 -0
- package/templates/modules/prisma/nextjs/lib/prisma.ts +18 -0
- package/templates/modules/prisma/nextjs/prisma/schema.prisma.hbs +90 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/intro.d.ts
ADDED
|
@@ -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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|