better-ts-stack 1.1.2 → 1.1.4

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 (36) hide show
  1. package/README.md +16 -27
  2. package/dist/builder/configGenerator.d.ts +1 -0
  3. package/dist/builder/configGenerator.d.ts.map +1 -1
  4. package/dist/builder/configGenerator.js +41 -4
  5. package/dist/builder/configGenerator.js.map +1 -1
  6. package/dist/builder/index.d.ts.map +1 -1
  7. package/dist/builder/index.js +3 -0
  8. package/dist/builder/index.js.map +1 -1
  9. package/dist/builder/moduleSelector.d.ts.map +1 -1
  10. package/dist/builder/moduleSelector.js +2 -5
  11. package/dist/builder/moduleSelector.js.map +1 -1
  12. package/dist/output/nextSteps.d.ts.map +1 -1
  13. package/dist/output/nextSteps.js +22 -0
  14. package/dist/output/nextSteps.js.map +1 -1
  15. package/package.json +1 -1
  16. package/templates/backend/express/config.json +3 -3
  17. package/templates/backend/express/src/index.ts +19 -4
  18. package/templates/frontend/nextjs/config.json +1 -2
  19. package/templates/frontend/nextjs/next.config.ts.hbs +12 -0
  20. package/templates/frontend/tanstack/config.json +48 -49
  21. package/templates/modules/auth/express/src/controllers/authController.ts.hbs +62 -13
  22. package/templates/modules/auth/express/src/middleware/requireAuth.ts.hbs +26 -26
  23. package/templates/modules/auth/express/src/services/userStore.ts.hbs +22 -0
  24. package/templates/modules/docker/Dockerfile.hbs +133 -125
  25. package/templates/modules/docker/config.json +1 -1
  26. package/templates/modules/mongoose/{config.json → express/config.json} +2 -2
  27. package/templates/modules/mongoose/{src → express/src}/models/User.ts +48 -48
  28. package/templates/modules/mongoose/nextjs/config.json +16 -0
  29. package/templates/modules/mongoose/nextjs/lib/db.ts +36 -0
  30. package/templates/modules/mongoose/nextjs/models/User.ts +48 -0
  31. package/templates/modules/mongoose/tanstack/config.json +17 -0
  32. package/templates/modules/mongoose/tanstack/src/lib/db.ts +37 -0
  33. package/templates/modules/mongoose/tanstack/src/models/User.ts +48 -0
  34. package/templates/frontend/nextjs/next.config.ts +0 -8
  35. package/templates/modules/mongoose/src/lib/db.ts.hbs +0 -43
  36. /package/templates/modules/mongoose/{src → express/src}/lib/db.ts +0 -0
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # better-ts-stack
2
2
 
3
- > Generate production-ready TypeScript apps from an interactive CLI
3
+ > An interactive CLI that scaffolds TypeScript backend and full-stack projects.
4
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.
5
+ `better-ts-stack` creates an Express, Next.js, or TanStack Start project with TypeScript, ESLint, and Prettier set up. Database, authentication, Docker, and git are optional.
6
6
 
7
7
  ## Quick Start
8
8
 
@@ -15,30 +15,29 @@ npm install -g better-ts-stack
15
15
  better-ts-stack
16
16
  ```
17
17
 
18
- Run the command, answer the prompts, and the CLI generates a ready-to-work project for you.
18
+ Run the command and answer the prompts. The CLI creates the project folder.
19
19
 
20
20
  ## What It Can Scaffold
21
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 |
22
+ | Project type | Stack | Optional setup |
23
+ | -------------- | --------------------------------------- | ------------------------------------------------------------------------ |
24
+ | Backend API | Express 5 + TypeScript | PostgreSQL, MongoDB, Prisma, Drizzle, Mongoose, JWT auth, Docker, git |
25
+ | Full-stack app | Next.js 16 or TanStack Start + React 19 | PostgreSQL, MongoDB, Prisma, Drizzle, Mongoose, Better Auth, Docker, git |
26
26
 
27
27
  Notes:
28
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.
29
+ - Express is the only backend framework for now. NestJS is listed in the prompt as "coming soon".
30
+ - Better Auth is only offered for full-stack projects that use a database.
32
31
 
33
32
  ## Interactive Prompt Flow
34
33
 
35
- The CLI is fully interactive. There are no subcommands or flags.
36
-
37
- You will be guided through:
34
+ The CLI has no subcommands or flags. It asks, in order:
38
35
 
39
36
  1. Project name
40
37
  2. Application type: `Backend API` or `Full-stack App`
41
- 3. Backend framework for backend apps: `Express` (`NestJS` is coming soon)
38
+ 3. Framework
39
+ - Backend: `Express` (`NestJS` is coming soon)
40
+ - Full-stack: `Next.js` or `TanStack Start`
42
41
  4. Database: `none`, `PostgreSQL`, or `MongoDB`
43
42
  5. ORM/ODM when a database is selected
44
43
  - PostgreSQL: `Prisma` or `Drizzle`
@@ -47,7 +46,7 @@ You will be guided through:
47
46
  7. Docker setup
48
47
  8. Authentication
49
48
  - Express apps: JWT-based auth
50
- - Next.js apps: Better Auth when a database is enabled
49
+ - Next.js and TanStack Start apps: Better Auth, only when a database is selected
51
50
  9. Git initialization
52
51
  10. Dependency installation
53
52
 
@@ -55,14 +54,14 @@ The CLI does not ask for a port. Backend projects default to `PORT=3000`.
55
54
 
56
55
  ## What You Get
57
56
 
58
- Every generated project includes the essentials:
57
+ Every generated project includes:
59
58
 
60
59
  - TypeScript with strict mode enabled
61
60
  - ESLint and Prettier pre-configured
62
61
  - `.env.example` and `.env` setup
63
62
  - Ready-to-run project scripts
64
63
  - Health check endpoint at `/health` for backend projects
65
- - shadcn-compatible UI foundation for Next.js projects
64
+ - shadcn-compatible UI components for Next.js and TanStack Start projects
66
65
  - Database wiring and schema setup when selected
67
66
  - Authentication scaffolding when selected
68
67
  - Docker files when selected
@@ -81,13 +80,3 @@ Every generated project includes the essentials:
81
80
  ## License
82
81
 
83
82
  MIT
84
-
85
- ## Release 1.1.2
86
-
87
- Frontend starters now allow committing `.env.example`, and Express starters allow committing lockfiles. Setup instructions follow installation, database preparation, and server startup before account creation. Git documentation now accurately describes repository initialization.
88
-
89
- ## Release 1.0.8
90
-
91
- Requires Node.js 24+. Dependencies and templates use current stable releases, with TypeScript 6.0.3 held for typescript-eslint compatibility and Node.js types aligned to 24.x. Express and Next.js support PostgreSQL with Prisma or Drizzle and MongoDB with Mongoose. Prisma generation runs before builds; Docker uses Node.js 24 and Compose v2.
92
-
93
- See [upgrade notes](https://better-ts-stack.abdullahtech.me/docs/upgrade-notes) for compatibility changes and maintainer publishing commands.
@@ -2,5 +2,6 @@ import { MergedConfig, ModuleConfig, ProjectConfig, TemplateContext } from "../t
2
2
  export declare function processScriptVariables(scripts: Record<string, string>, context: TemplateContext): Record<string, string>;
3
3
  export declare function mergeConfigurations(modules: ModuleConfig[], context: TemplateContext): MergedConfig;
4
4
  export declare function generatePackageJson(targetDir: string, mergedConfig: MergedConfig, config: ProjectConfig): Promise<void>;
5
+ export declare function generatePnpmWorkspace(targetDir: string, overrides: Record<string, string>): Promise<void>;
5
6
  export declare function generateEnvFile(targetDir: string, envVars: Record<string, string>): Promise<void>;
6
7
  //# sourceMappingURL=configGenerator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"configGenerator.d.ts","sourceRoot":"","sources":["../../src/builder/configGenerator.ts"],"names":[],"mappings":"AAMA,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,CAmBxB;AAGD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,eAAe,GACvB,YAAY,CAuBd;AAGD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAGD,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAgCf"}
1
+ {"version":3,"file":"configGenerator.d.ts","sourceRoot":"","sources":["../../src/builder/configGenerator.ts"],"names":[],"mappings":"AAMA,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,CAmBxB;AAGD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,eAAe,GACvB,YAAY,CAuBd;AAGD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAcD,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAkCf;AAGD,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.processScriptVariables = processScriptVariables;
7
7
  exports.mergeConfigurations = mergeConfigurations;
8
8
  exports.generatePackageJson = generatePackageJson;
9
+ exports.generatePnpmWorkspace = generatePnpmWorkspace;
9
10
  exports.generateEnvFile = generateEnvFile;
10
11
  // Utilities for merging module configurations and generating project files
11
12
  const fs_extra_1 = __importDefault(require("fs-extra"));
@@ -60,7 +61,11 @@ async function generatePackageJson(targetDir, mergedConfig, config) {
60
61
  name: config.projectName,
61
62
  version: "1.0.0",
62
63
  private: true,
63
- engines: { node: ">=24.0.0" },
64
+ // TanStack's srvx static serving needs Node 24.20+ on Windows (earlier
65
+ // 24.x reports mismatched file stats there, so every asset 404s)
66
+ engines: {
67
+ node: config.framework === "tanstack" ? ">=24.20.0" : ">=24.0.0",
68
+ },
64
69
  description: `Project created with better-ts-stack using ${config.database !== "none" ? config.database : "no database"}`,
65
70
  ...(config.framework === "tanstack" ? { type: "module" } : {}),
66
71
  ...(isFullstack ? {} : { main: "dist/index.js" }),
@@ -75,9 +80,6 @@ async function generatePackageJson(targetDir, mergedConfig, config) {
75
80
  dependencies: mergedConfig.dependencies,
76
81
  devDependencies: mergedConfig.devDependencies,
77
82
  overrides,
78
- pnpm: config.packageManager === "pnpm" && overrides
79
- ? { overrides }
80
- : undefined,
81
83
  };
82
84
  const packageJsonPath = path_1.default.join(targetDir, "package.json");
83
85
  await fs_extra_1.default.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n", "utf-8");
@@ -86,6 +88,41 @@ async function generatePackageJson(targetDir, mergedConfig, config) {
86
88
  throw (0, types_1.buildError)(error, "PACKAGE_JSON_ERROR", "Failed to generate package.json");
87
89
  }
88
90
  }
91
+ // Template dependencies with install scripts. pnpm 11+ fails the install when
92
+ // these are not approved; entries for packages a project lacks are ignored.
93
+ const PNPM_BUILD_DEPENDENCIES = [
94
+ "@prisma/engines",
95
+ "bcrypt",
96
+ "esbuild",
97
+ "prisma",
98
+ "unrs-resolver",
99
+ ];
100
+ // Writes pnpm-workspace.yaml, where pnpm 11+ reads overrides and build approvals
101
+ // (it ignores the "pnpm" field in package.json)
102
+ async function generatePnpmWorkspace(targetDir, overrides) {
103
+ const lines = [];
104
+ if (Object.keys(overrides).length > 0) {
105
+ lines.push("overrides:");
106
+ for (const [name, version] of Object.entries(overrides)) {
107
+ lines.push(` "${name}": "${version}"`);
108
+ }
109
+ }
110
+ lines.push("allowBuilds:");
111
+ for (const name of PNPM_BUILD_DEPENDENCIES) {
112
+ lines.push(` "${name}": true`);
113
+ }
114
+ // pnpm 10 reads build approvals from this key instead
115
+ lines.push("onlyBuiltDependencies:");
116
+ for (const name of PNPM_BUILD_DEPENDENCIES) {
117
+ lines.push(` - "${name}"`);
118
+ }
119
+ try {
120
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, "pnpm-workspace.yaml"), lines.join("\n") + "\n", "utf-8");
121
+ }
122
+ catch (error) {
123
+ throw (0, types_1.buildError)(error, "PNPM_WORKSPACE_ERROR", "Failed to generate pnpm-workspace.yaml");
124
+ }
125
+ }
89
126
  // Generates .env and .env.example files from merged environment variables
90
127
  async function generateEnvFile(targetDir, envVars) {
91
128
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"configGenerator.js","sourceRoot":"","sources":["../../src/builder/configGenerator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configGenerator.js","sourceRoot":"","sources":["../../src/builder/configGenerator.ts"],"names":[],"mappings":"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"}
@@ -1 +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,CAyItB"}
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;AAehF,wBAAsB,KAAK,CACzB,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CA4ItB"}
@@ -83,6 +83,9 @@ async function build(config, targetDir) {
83
83
  // 9. Generate package.json
84
84
  consola_1.default.info("Generating package.json...");
85
85
  await (0, configGenerator_1.generatePackageJson)(targetDir, mergedConfig, config);
86
+ if (config.packageManager === "pnpm") {
87
+ await (0, configGenerator_1.generatePnpmWorkspace)(targetDir, mergedConfig.overrides);
88
+ }
86
89
  consola_1.default.success("package.json generated");
87
90
  // 10. Generate environment files
88
91
  consola_1.default.info("Generating environment files...");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"moduleSelector.d.ts","sourceRoot":"","sources":["../../src/builder/moduleSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa;;;YAUtB,MAAM;mBAAa,MAAM;;EAqBrD"}
1
+ {"version":3,"file":"moduleSelector.d.ts","sourceRoot":"","sources":["../../src/builder/moduleSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa;;;YAUtB,MAAM;mBAAa,MAAM;;EAiBrD"}
@@ -10,12 +10,9 @@ function selectModules(config) {
10
10
  ? `backend/${config.framework}`
11
11
  : `frontend/${config.framework}`;
12
12
  const modules = [];
13
- // Add database module if selected (compound ids: prisma/express, prisma/nextjs, drizzle/nextjs, or mongoose)
13
+ // Add database module if selected (compound ids: prisma/express, drizzle/nextjs, mongoose/tanstack, ...)
14
14
  if (config.database !== "none") {
15
- const dbId = config.database === "mongoose"
16
- ? "mongoose"
17
- : `${config.database}/${framework}`;
18
- modules.push({ id: dbId, framework });
15
+ modules.push({ id: `${config.database}/${framework}`, framework });
19
16
  }
20
17
  // Add feature modules based on configuration
21
18
  if (config.useDocker) {
@@ -1 +1 @@
1
- {"version":3,"file":"moduleSelector.js","sourceRoot":"","sources":["../../src/builder/moduleSelector.ts"],"names":[],"mappings":";;AAGA,sCA+BC;AAhCD,mFAAmF;AACnF,SAAgB,aAAa,CAAC,MAAqB;IACjD,6CAA6C;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAEnC,yCAAyC;IACzC,MAAM,IAAI,GACR,MAAM,CAAC,eAAe,KAAK,SAAS;QAClC,CAAC,CAAC,WAAW,MAAM,CAAC,SAAS,EAAE;QAC/B,CAAC,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC;IAErC,MAAM,OAAO,GAA6C,EAAE,CAAC;IAE7D,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"}
1
+ {"version":3,"file":"moduleSelector.js","sourceRoot":"","sources":["../../src/builder/moduleSelector.ts"],"names":[],"mappings":";;AAGA,sCA2BC;AA5BD,mFAAmF;AACnF,SAAgB,aAAa,CAAC,MAAqB;IACjD,6CAA6C;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAEnC,yCAAyC;IACzC,MAAM,IAAI,GACR,MAAM,CAAC,eAAe,KAAK,SAAS;QAClC,CAAC,CAAC,WAAW,MAAM,CAAC,SAAS,EAAE;QAC/B,CAAC,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC;IAErC,MAAM,OAAO,GAA6C,EAAE,CAAC;IAE7D,yGAAyG;IACzG,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,6CAA6C;IAC7C,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
@@ -1 +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,CAoDV;AAGD,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EAAE,GACd,MAAM,CAeR"}
1
+ {"version":3,"file":"nextSteps.d.ts","sourceRoot":"","sources":["../../src/output/nextSteps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAmBzC,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,OAAO,GACrB,MAAM,EAAE,CAwEV;AAGD,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EAAE,GACd,MAAM,CAeR"}
@@ -2,6 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateNextSteps = generateNextSteps;
4
4
  exports.displayNextSteps = displayNextSteps;
5
+ const MONGODB_AUTH_SETUP_URL = "https://better-ts-stack.abdullahtech.me/docs/modules/database#mongoose-and-mongodb";
6
+ // Node 24 releases before 24.20 report mismatched file stats on Windows, which
7
+ // makes srvx (TanStack's production server) reject every static asset
8
+ const MIN_TANSTACK_WINDOWS_NODE = [24, 20];
9
+ function isNodeBelow([major, minor]) {
10
+ const [currentMajor, currentMinor] = process.versions.node
11
+ .split(".")
12
+ .map(Number);
13
+ return (currentMajor < major || (currentMajor === major && currentMinor < minor));
14
+ }
5
15
  // Generates a list of instructions for the user to follow after project creation
6
16
  function generateNextSteps(config, depsInstalled) {
7
17
  const steps = [];
@@ -17,6 +27,12 @@ function generateNextSteps(config, depsInstalled) {
17
27
  ? "Review BETTER_AUTH_SECRET and BETTER_AUTH_URL in .env"
18
28
  : "Review the generated JWT_SECRET in .env");
19
29
  }
30
+ if (config.framework === "tanstack" &&
31
+ process.platform === "win32" &&
32
+ isNodeBelow(MIN_TANSTACK_WINDOWS_NODE)) {
33
+ steps.push(`Upgrade Node.js to ${MIN_TANSTACK_WINDOWS_NODE.join(".")} or newer: on Windows, ` +
34
+ `Node ${process.versions.node} makes "npm start" return 404 for CSS, JS, and other static files`);
35
+ }
20
36
  // Step 3: Install dependencies if not already done
21
37
  if (!depsInstalled) {
22
38
  steps.push(`${config.packageManager} install`);
@@ -32,6 +48,12 @@ function generateNextSteps(config, depsInstalled) {
32
48
  }
33
49
  else if (config.database === "mongoose") {
34
50
  steps.push("Ensure MongoDB is running locally or update MONGODB_URI in .env");
51
+ // Better Auth's MongoDB adapter uses transactions, which need a replica set
52
+ if (config.useAuth && isFullstack) {
53
+ steps.push("Better Auth uses MongoDB transactions: run MongoDB as a replica set (or use Atlas) " +
54
+ 'and create the "user", "session", "account", and "verification" collections before signing up. ' +
55
+ `See ${MONGODB_AUTH_SETUP_URL}`);
56
+ }
35
57
  }
36
58
  // Step 5: Start dev server
37
59
  steps.push(`${config.packageManager} run dev`);
@@ -1 +1 @@
1
- {"version":3,"file":"nextSteps.js","sourceRoot":"","sources":["../../src/output/nextSteps.ts"],"names":[],"mappings":";;AAGA,8CAuDC;AAGD,4CAkBC;AA7ED,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,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CACR,oEAAoE,CACrE,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CACR,WAAW;YACT,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,yCAAyC,CAC9C,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,cAAc,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,kCAAkC;IAClC,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,cAAc,sBAAsB,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,cAAc,qBAAqB,CAAC,CAAC;IAC5D,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,cAAc,kBAAkB,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,cAAc,iBAAiB,CAAC,CAAC;IACxD,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,MAAM,CAAC,cAAc,UAAU,CAAC,CAAC;IAE/C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CACR,WAAW;YACT,CAAC,CAAC,6CAA6C;YAC/C,CAAC,CAAC,mEAAmE,CACxE,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,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"}
1
+ {"version":3,"file":"nextSteps.js","sourceRoot":"","sources":["../../src/output/nextSteps.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-ts-stack",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "A powerful CLI tool that generates fully configured TypeScript projects with backend, frontend, database integration, Docker support, and more--all through an interactive setup.",
5
5
  "keywords": [
6
6
  "cli",
@@ -4,9 +4,9 @@
4
4
  "description": "Base Express server with TypeScript, middleware, and best practices",
5
5
  "type": "base",
6
6
  "scripts": {
7
- "dev": "{{#if (eq packageManager 'bun')}}bun --watch src/index.ts{{else}}tsx watch src/index.ts{{/if}}",
7
+ "dev": "cross-env NODE_ENV=development {{#if (eq packageManager 'bun')}}bun --watch src/index.ts{{else}}tsx watch src/index.ts{{/if}}",
8
8
  "build": "tsc",
9
- "start": "{{runner}} dist/index.js",
9
+ "start": "cross-env NODE_ENV=production {{runner}} dist/index.js",
10
10
  "lint": "eslint src",
11
11
  "lint:fix": "eslint src --fix",
12
12
  "format": "prettier --write \"src/**/*.ts\"",
@@ -16,6 +16,7 @@
16
16
  "express": "^5.2.1",
17
17
  "dotenv": "^17.4.2",
18
18
  "cors": "^2.8.6",
19
+ "cross-env": "^10.1.0",
19
20
  "helmet": "^8.3.0",
20
21
  "morgan": "^1.12.0"
21
22
  },
@@ -35,7 +36,6 @@
35
36
  "typescript-eslint": "^8.69.0"
36
37
  },
37
38
  "envVars": {
38
- "NODE_ENV": "development",
39
39
  "PORT": "3000"
40
40
  },
41
41
  "templateFiles": [
@@ -35,10 +35,25 @@ app.use((_req: Request, res: Response) => {
35
35
  });
36
36
 
37
37
  // Error handler
38
- app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => {
39
- console.error(err.stack);
40
- res.status(500).json({ error: 'Internal Server Error' });
41
- });
38
+ app.use(
39
+ (
40
+ err: Error & { status?: number; statusCode?: number; expose?: boolean },
41
+ _req: Request,
42
+ res: Response,
43
+ _next: NextFunction,
44
+ ) => {
45
+ // Middleware such as express.json() sets 4xx statuses (bad JSON, body too large)
46
+ const status = err.status ?? err.statusCode ?? 500;
47
+
48
+ if (status >= 400 && status < 500) {
49
+ res.status(status).json({ error: err.expose ? err.message : 'Bad Request' });
50
+ return;
51
+ }
52
+
53
+ console.error(err.stack);
54
+ res.status(500).json({ error: 'Internal Server Error' });
55
+ },
56
+ );
42
57
 
43
58
  {{#if (eq database 'mongoose')}}
44
59
  void awaitDatabase().catch((error: unknown) => {
@@ -32,8 +32,7 @@
32
32
  "@eslint/compat": "^2.1.1"
33
33
  },
34
34
  "envVars": {
35
- "NODE_ENV": "development",
36
35
  "PORT": "3000"
37
36
  },
38
- "templateFiles": ["app/page.tsx.hbs", "proxy.ts.hbs"]
37
+ "templateFiles": ["app/page.tsx.hbs", "proxy.ts.hbs", "next.config.ts.hbs"]
39
38
  }
@@ -0,0 +1,12 @@
1
+ import type { NextConfig } from "next";
2
+
3
+ {{#if useDocker}}
4
+ const nextConfig: NextConfig = {
5
+ // Standalone output is what the Docker image runs (node server.js)
6
+ output: "standalone",
7
+ };
8
+ {{else}}
9
+ const nextConfig: NextConfig = {};
10
+ {{/if}}
11
+
12
+ export default nextConfig;
@@ -1,49 +1,48 @@
1
- {
2
- "id": "tanstack",
3
- "name": "TanStack Start",
4
- "description": "TanStack Start with TanStack Router, React 19, and Tailwind CSS v4",
5
- "type": "base",
6
- "scripts": {
7
- "dev": "vite dev",
8
- "build": "vite build",
9
- "start": "srvx --prod -s ../client dist/server/server.js",
10
- "preview": "vite preview",
11
- "type:check": "tsc --noEmit",
12
- "lint": "eslint src"
13
- },
14
- "dependencies": {
15
- "@tanstack/react-query": "^5.102.8",
16
- "@tanstack/react-query-devtools": "^5.102.8",
17
- "@tanstack/react-router": "^1.170.36",
18
- "@tanstack/react-router-devtools": "^1.167.2",
19
- "@tanstack/react-router-ssr-query": "^1.167.2",
20
- "@tanstack/react-start": "^1.168.53",
21
- "class-variance-authority": "^0.7.1",
22
- "clsx": "^2.1.1",
23
- "lucide-react": "^1.41.0",
24
- "react": "^19.2.8",
25
- "react-dom": "^19.2.8",
26
- "srvx": "^1.0.4",
27
- "tailwind-merge": "^3.6.0"
28
- },
29
- "devDependencies": {
30
- "@eslint/js": "^10.0.1",
31
- "@tailwindcss/vite": "^4.3.3",
32
- "@types/node": "^24.13.3",
33
- "@types/react": "^19.2.18",
34
- "@types/react-dom": "^19.2.7",
35
- "@vitejs/plugin-react": "^6.1.1",
36
- "eslint": "^10.10.0",
37
- "tailwindcss": "^4.3.3",
38
- "typescript": "^6.0.3",
39
- "typescript-eslint": "^8.69.0",
40
- "vite": "^8.3.0"
41
- },
42
- "envVars": {
43
- "NODE_ENV": "development",
44
- "PORT": "3000"
45
- },
46
- "templateFiles": [
47
- "src/routes/index.tsx.hbs"
48
- ]
49
- }
1
+ {
2
+ "id": "tanstack",
3
+ "name": "TanStack Start",
4
+ "description": "TanStack Start with TanStack Router, React 19, and Tailwind CSS v4",
5
+ "type": "base",
6
+ "scripts": {
7
+ "dev": "vite dev",
8
+ "build": "vite build",
9
+ "start": "srvx --prod -s ../client dist/server/server.js",
10
+ "preview": "vite preview",
11
+ "type:check": "tsc --noEmit",
12
+ "lint": "eslint src"
13
+ },
14
+ "dependencies": {
15
+ "@tanstack/react-query": "^5.102.8",
16
+ "@tanstack/react-query-devtools": "^5.102.8",
17
+ "@tanstack/react-router": "^1.170.36",
18
+ "@tanstack/react-router-devtools": "^1.167.2",
19
+ "@tanstack/react-router-ssr-query": "^1.167.2",
20
+ "@tanstack/react-start": "^1.168.53",
21
+ "class-variance-authority": "^0.7.1",
22
+ "clsx": "^2.1.1",
23
+ "lucide-react": "^1.41.0",
24
+ "react": "^19.2.8",
25
+ "react-dom": "^19.2.8",
26
+ "srvx": "^1.0.4",
27
+ "tailwind-merge": "^3.6.0"
28
+ },
29
+ "devDependencies": {
30
+ "@eslint/js": "^10.0.1",
31
+ "@tailwindcss/vite": "^4.3.3",
32
+ "@types/node": "^24.13.3",
33
+ "@types/react": "^19.2.18",
34
+ "@types/react-dom": "^19.2.7",
35
+ "@vitejs/plugin-react": "^6.1.1",
36
+ "eslint": "^10.10.0",
37
+ "tailwindcss": "^4.3.3",
38
+ "typescript": "^6.0.3",
39
+ "typescript-eslint": "^8.69.0",
40
+ "vite": "^8.3.0"
41
+ },
42
+ "envVars": {
43
+ "PORT": "3000"
44
+ },
45
+ "templateFiles": [
46
+ "src/routes/index.tsx.hbs"
47
+ ]
48
+ }