better-ts-stack 0.1.1 → 1.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 (118) hide show
  1. package/README.md +12 -6
  2. package/dist/builder/configGenerator.d.ts.map +1 -1
  3. package/dist/builder/configGenerator.js +30 -24
  4. package/dist/builder/configGenerator.js.map +1 -1
  5. package/dist/builder/dependencyInstaller.d.ts.map +1 -1
  6. package/dist/builder/dependencyInstaller.js +1 -10
  7. package/dist/builder/dependencyInstaller.js.map +1 -1
  8. package/dist/builder/index.d.ts.map +1 -1
  9. package/dist/builder/index.js +3 -7
  10. package/dist/builder/index.js.map +1 -1
  11. package/dist/builder/moduleSelector.d.ts.map +1 -1
  12. package/dist/builder/moduleSelector.js +1 -1
  13. package/dist/builder/moduleSelector.js.map +1 -1
  14. package/dist/builder/templateContext.d.ts +2 -2
  15. package/dist/builder/templateContext.d.ts.map +1 -1
  16. package/dist/builder/templateContext.js +1 -3
  17. package/dist/builder/templateContext.js.map +1 -1
  18. package/dist/modules/registry.d.ts.map +1 -1
  19. package/dist/modules/registry.js +2 -5
  20. package/dist/modules/registry.js.map +1 -1
  21. package/dist/output/nextSteps.d.ts.map +1 -1
  22. package/dist/output/nextSteps.js +7 -34
  23. package/dist/output/nextSteps.js.map +1 -1
  24. package/dist/prompts/index.d.ts.map +1 -1
  25. package/dist/prompts/index.js +3 -14
  26. package/dist/prompts/index.js.map +1 -1
  27. package/dist/prompts/stack.d.ts +3 -0
  28. package/dist/prompts/stack.d.ts.map +1 -0
  29. package/dist/prompts/stack.js +77 -0
  30. package/dist/prompts/stack.js.map +1 -0
  31. package/dist/types/index.d.ts +12 -10
  32. package/dist/types/index.d.ts.map +1 -1
  33. package/dist/types/index.js +6 -10
  34. package/dist/types/index.js.map +1 -1
  35. package/dist/validators/index.d.ts +1 -1
  36. package/dist/validators/index.d.ts.map +1 -1
  37. package/dist/validators/index.js +1 -1
  38. package/package.json +12 -12
  39. package/templates/backend/express/config.json +44 -42
  40. package/templates/backend/express/eslint.config.mjs +40 -31
  41. package/templates/backend/express/src/index.ts +61 -46
  42. package/templates/backend/express/src/routes/health.ts +12 -12
  43. package/templates/backend/express/tsconfig.json +25 -23
  44. package/templates/frontend/nextjs/config.json +33 -27
  45. package/templates/frontend/nextjs/eslint.config.mjs +11 -11
  46. package/templates/frontend/nextjs/proxy.ts.hbs +9 -8
  47. package/templates/frontend/nextjs/tsconfig.json +34 -21
  48. package/templates/frontend/tanstack/components.json +18 -0
  49. package/templates/frontend/tanstack/config.json +49 -0
  50. package/templates/frontend/tanstack/eslint.config.mjs +23 -0
  51. package/templates/frontend/tanstack/gitignore +38 -0
  52. package/templates/frontend/tanstack/public/favicon.svg +7 -0
  53. package/templates/frontend/tanstack/src/components/ui/button.tsx +51 -0
  54. package/templates/frontend/tanstack/src/components/ui/card.tsx +60 -0
  55. package/templates/frontend/tanstack/src/components/ui/field.tsx +67 -0
  56. package/templates/frontend/tanstack/src/components/ui/input.tsx +18 -0
  57. package/templates/frontend/tanstack/src/lib/utils.ts +6 -0
  58. package/templates/frontend/tanstack/src/routeTree.gen.ts +68 -0
  59. package/templates/frontend/tanstack/src/router.tsx +32 -0
  60. package/templates/frontend/tanstack/src/routes/__root.tsx +70 -0
  61. package/templates/frontend/tanstack/src/routes/index.tsx.hbs +102 -0
  62. package/templates/frontend/tanstack/src/styles/app.css +85 -0
  63. package/templates/frontend/tanstack/tsconfig.json +22 -0
  64. package/templates/frontend/tanstack/vite.config.ts +14 -0
  65. package/templates/modules/auth/express/config.json +26 -1
  66. package/templates/modules/auth/express/src/routes/auth.ts.hbs +1 -1
  67. package/templates/modules/auth/express/src/services/userStore.ts.hbs +95 -107
  68. package/templates/modules/auth/nextjs/config.json +6 -6
  69. package/templates/modules/auth/nextjs/lib/auth.ts.hbs +34 -32
  70. package/templates/modules/auth/tanstack/config.json +33 -0
  71. package/templates/modules/auth/tanstack/src/components/auth/sign-in-form.tsx +135 -0
  72. package/templates/modules/auth/tanstack/src/components/auth/sign-out-button.tsx +49 -0
  73. package/templates/modules/auth/tanstack/src/components/auth/sign-up-form.tsx +153 -0
  74. package/templates/modules/auth/tanstack/src/lib/auth-client.ts +3 -0
  75. package/templates/modules/auth/tanstack/src/lib/auth-functions.ts +12 -0
  76. package/templates/modules/auth/tanstack/src/lib/auth-schema.ts +39 -0
  77. package/templates/modules/auth/tanstack/src/lib/auth.ts.hbs +38 -0
  78. package/templates/modules/auth/tanstack/src/routeTree.gen.ts +140 -0
  79. package/templates/modules/auth/tanstack/src/routes/api/auth/$.ts +16 -0
  80. package/templates/modules/auth/tanstack/src/routes/dashboard.tsx +111 -0
  81. package/templates/modules/auth/tanstack/src/routes/sign-in.tsx +37 -0
  82. package/templates/modules/auth/tanstack/src/routes/sign-up.tsx +37 -0
  83. package/templates/modules/docker/.dockerignore +14 -13
  84. package/templates/modules/docker/Dockerfile.hbs +64 -9
  85. package/templates/modules/docker/config.json +19 -16
  86. package/templates/modules/docker/docker-compose.yml.hbs +9 -9
  87. package/templates/modules/drizzle/express/config.json +27 -0
  88. package/templates/modules/drizzle/express/drizzle.config.ts +13 -0
  89. package/templates/modules/drizzle/express/src/lib/db.ts +13 -0
  90. package/templates/modules/drizzle/express/src/lib/schema.ts +10 -0
  91. package/templates/modules/drizzle/nextjs/config.json +27 -19
  92. package/templates/modules/drizzle/nextjs/lib/db.ts +3 -1
  93. package/templates/modules/drizzle/nextjs/lib/schema.ts.hbs +84 -84
  94. package/templates/modules/drizzle/tanstack/config.json +26 -0
  95. package/templates/modules/drizzle/tanstack/drizzle.config.ts +13 -0
  96. package/templates/modules/drizzle/tanstack/src/lib/db.ts +13 -0
  97. package/templates/modules/drizzle/tanstack/src/lib/schema.ts.hbs +84 -0
  98. package/templates/modules/mongoose/config.json +16 -16
  99. package/templates/modules/mongoose/src/lib/db.ts.hbs +0 -13
  100. package/templates/modules/mongoose/src/models/User.ts +48 -47
  101. package/templates/modules/prisma/express/config.json +27 -21
  102. package/templates/modules/prisma/express/prisma/schema.prisma +3 -2
  103. package/templates/modules/prisma/express/prisma.config.ts +12 -13
  104. package/templates/modules/prisma/express/src/lib/prisma.ts +24 -37
  105. package/templates/modules/prisma/nextjs/config.json +28 -23
  106. package/templates/modules/prisma/nextjs/prisma/schema.prisma.hbs +91 -90
  107. package/templates/modules/prisma/tanstack/config.json +28 -0
  108. package/templates/modules/prisma/tanstack/prisma/schema.prisma.hbs +91 -0
  109. package/templates/modules/prisma/tanstack/prisma.config.ts +12 -0
  110. package/templates/modules/prisma/tanstack/src/lib/prisma.ts +18 -0
  111. package/dist/prompts/backend/index.d.ts +0 -3
  112. package/dist/prompts/backend/index.d.ts.map +0 -1
  113. package/dist/prompts/backend/index.js +0 -128
  114. package/dist/prompts/backend/index.js.map +0 -1
  115. package/dist/prompts/frontend/index.d.ts +0 -3
  116. package/dist/prompts/frontend/index.d.ts.map +0 -1
  117. package/dist/prompts/frontend/index.js +0 -111
  118. package/dist/prompts/frontend/index.js.map +0 -1
@@ -1,90 +1,91 @@
1
- // Prisma schema file
2
- // Learn more: https://pris.ly/d/prisma-schema
3
-
4
- generator client {
5
- provider = "prisma-client-js"
6
- output = "../generated/client"
7
- }
8
-
9
- datasource db {
10
- provider = "postgresql"
11
- }
12
-
13
- {{#if useAuth}}
14
-
15
- model User {
16
- id String @id
17
- name String
18
- email String
19
- emailVerified Boolean @default(false)
20
- image String?
21
- createdAt DateTime @default(now())
22
- updatedAt DateTime @updatedAt
23
- sessions Session[]
24
- accounts Account[]
25
-
26
- @@unique([email])
27
- @@map("user")
28
- }
29
-
30
- model Session {
31
- id String @id
32
- expiresAt DateTime
33
- token String
34
- createdAt DateTime @default(now())
35
- updatedAt DateTime @updatedAt
36
- ipAddress String?
37
- userAgent String?
38
- userId String
39
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
40
-
41
- @@unique([token])
42
- @@index([userId])
43
- @@map("session")
44
- }
45
-
46
- model Account {
47
- id String @id
48
- accountId String
49
- providerId String
50
- userId String
51
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
52
- accessToken String?
53
- refreshToken String?
54
- idToken String?
55
- accessTokenExpiresAt DateTime?
56
- refreshTokenExpiresAt DateTime?
57
- scope String?
58
- password String?
59
- createdAt DateTime @default(now())
60
- updatedAt DateTime @updatedAt
61
-
62
- @@index([userId])
63
- @@map("account")
64
- }
65
-
66
- model Verification {
67
- id String @id
68
- identifier String
69
- value String
70
- expiresAt DateTime
71
- createdAt DateTime @default(now())
72
- updatedAt DateTime @updatedAt
73
-
74
- @@index([identifier])
75
- @@map("verification")
76
- }
77
-
78
- {{else}}
79
- // Sample User model
80
- model User {
81
- id String @id @default(uuid())
82
- email String @unique
83
- name String?
84
- password String
85
- createdAt DateTime @default(now())
86
- updatedAt DateTime @updatedAt
87
-
88
- @@map("users")
89
- }
90
- {{/if}}
1
+ // Prisma schema file
2
+ // Learn more: https://pris.ly/d/prisma-schema
3
+
4
+ generator client {
5
+ provider = "prisma-client"
6
+ output = "../generated"
7
+ }
8
+
9
+ datasource db {
10
+ provider = "postgresql"
11
+ }
12
+
13
+ {{#if useAuth}}
14
+
15
+ model User {
16
+ id String @id
17
+ name String
18
+ email String
19
+ emailVerified Boolean @default(false)
20
+ image String?
21
+ createdAt DateTime @default(now())
22
+ updatedAt DateTime @updatedAt
23
+ sessions Session[]
24
+ accounts Account[]
25
+
26
+ @@unique([email])
27
+ @@map("user")
28
+ }
29
+
30
+ model Session {
31
+ id String @id
32
+ expiresAt DateTime
33
+ token String
34
+ createdAt DateTime @default(now())
35
+ updatedAt DateTime @updatedAt
36
+ ipAddress String?
37
+ userAgent String?
38
+ userId String
39
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
40
+
41
+ @@unique([token])
42
+ @@index([userId])
43
+ @@map("session")
44
+ }
45
+
46
+ model Account {
47
+ id String @id
48
+ accountId String
49
+ providerId String
50
+ userId String
51
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
52
+ accessToken String?
53
+ refreshToken String?
54
+ idToken String?
55
+ accessTokenExpiresAt DateTime?
56
+ refreshTokenExpiresAt DateTime?
57
+ scope String?
58
+ password String?
59
+ createdAt DateTime @default(now())
60
+ updatedAt DateTime @updatedAt
61
+
62
+ @@index([userId])
63
+ @@unique([providerId, accountId])
64
+ @@map("account")
65
+ }
66
+
67
+ model Verification {
68
+ id String @id
69
+ identifier String
70
+ value String
71
+ expiresAt DateTime
72
+ createdAt DateTime @default(now())
73
+ updatedAt DateTime @updatedAt
74
+
75
+ @@index([identifier])
76
+ @@map("verification")
77
+ }
78
+
79
+ {{else}}
80
+ // Sample User model
81
+ model User {
82
+ id String @id @default(uuid())
83
+ email String @unique
84
+ name String?
85
+ password String
86
+ createdAt DateTime @default(now())
87
+ updatedAt DateTime @updatedAt
88
+
89
+ @@map("users")
90
+ }
91
+ {{/if}}
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "prisma",
3
+ "name": "Prisma ORM",
4
+ "description": "Prisma ORM for TanStack Start with PostgreSQL",
5
+ "type": "database",
6
+ "dependencies": {
7
+ "@prisma/client": "^7.10.0",
8
+ "@prisma/adapter-pg": "^7.10.0"
9
+ },
10
+ "devDependencies": {
11
+ "prisma": "^7.10.0",
12
+ "dotenv": "^17.4.2"
13
+ },
14
+ "scripts": {
15
+ "prisma:generate": "prisma generate",
16
+ "prisma:migrate": "prisma migrate dev",
17
+ "prisma:studio": "prisma studio",
18
+ "prebuild": "prisma generate"
19
+ },
20
+ "envVars": {
21
+ "DATABASE_URL": "postgresql://postgres:postgres@localhost:5432/postgres?schema=public"
22
+ },
23
+ "templateFiles": ["prisma/schema.prisma.hbs"],
24
+ "overrides": {
25
+ "deepmerge-ts": "^8.0.2",
26
+ "mysql2": "^3.24.3"
27
+ }
28
+ }
@@ -0,0 +1,91 @@
1
+ // Prisma schema file
2
+ // Learn more: https://pris.ly/d/prisma-schema
3
+
4
+ generator client {
5
+ provider = "prisma-client"
6
+ output = "../generated"
7
+ }
8
+
9
+ datasource db {
10
+ provider = "postgresql"
11
+ }
12
+
13
+ {{#if useAuth}}
14
+
15
+ model User {
16
+ id String @id
17
+ name String
18
+ email String
19
+ emailVerified Boolean @default(false)
20
+ image String?
21
+ createdAt DateTime @default(now())
22
+ updatedAt DateTime @updatedAt
23
+ sessions Session[]
24
+ accounts Account[]
25
+
26
+ @@unique([email])
27
+ @@map("user")
28
+ }
29
+
30
+ model Session {
31
+ id String @id
32
+ expiresAt DateTime
33
+ token String
34
+ createdAt DateTime @default(now())
35
+ updatedAt DateTime @updatedAt
36
+ ipAddress String?
37
+ userAgent String?
38
+ userId String
39
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
40
+
41
+ @@unique([token])
42
+ @@index([userId])
43
+ @@map("session")
44
+ }
45
+
46
+ model Account {
47
+ id String @id
48
+ accountId String
49
+ providerId String
50
+ userId String
51
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
52
+ accessToken String?
53
+ refreshToken String?
54
+ idToken String?
55
+ accessTokenExpiresAt DateTime?
56
+ refreshTokenExpiresAt DateTime?
57
+ scope String?
58
+ password String?
59
+ createdAt DateTime @default(now())
60
+ updatedAt DateTime @updatedAt
61
+
62
+ @@index([userId])
63
+ @@unique([providerId, accountId])
64
+ @@map("account")
65
+ }
66
+
67
+ model Verification {
68
+ id String @id
69
+ identifier String
70
+ value String
71
+ expiresAt DateTime
72
+ createdAt DateTime @default(now())
73
+ updatedAt DateTime @updatedAt
74
+
75
+ @@index([identifier])
76
+ @@map("verification")
77
+ }
78
+
79
+ {{else}}
80
+ // Sample User model
81
+ model User {
82
+ id String @id @default(uuid())
83
+ email String @unique
84
+ name String?
85
+ password String
86
+ createdAt DateTime @default(now())
87
+ updatedAt DateTime @updatedAt
88
+
89
+ @@map("users")
90
+ }
91
+ {{/if}}
@@ -0,0 +1,12 @@
1
+ import "dotenv/config";
2
+ import { defineConfig, env } from "prisma/config";
3
+
4
+ export default defineConfig({
5
+ schema: "prisma/schema.prisma",
6
+ migrations: {
7
+ path: "prisma/migrations",
8
+ },
9
+ datasource: {
10
+ url: env("DATABASE_URL"),
11
+ },
12
+ });
@@ -0,0 +1,18 @@
1
+ import { PrismaPg } from "@prisma/adapter-pg";
2
+
3
+ import { PrismaClient } from "../../generated/client";
4
+
5
+ const globalForPrisma = global as unknown as {
6
+ prisma: PrismaClient;
7
+ };
8
+ const adapter = new PrismaPg({
9
+ connectionString: process.env.DATABASE_URL,
10
+ });
11
+ const prisma =
12
+ globalForPrisma.prisma ||
13
+ new PrismaClient({
14
+ adapter,
15
+ });
16
+ if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
17
+
18
+ export default prisma;
@@ -1,3 +0,0 @@
1
- import { PromptChoices } from "../../types";
2
- export declare const collectBackendChoices: () => Promise<PromptChoices>;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,128 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/prompts/backend/index.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { PromptChoices } from "../../types";
2
- export declare const collectFrontendChoices: () => Promise<PromptChoices>;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,111 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.collectFrontendChoices = void 0;
4
- const prompts_1 = require("@clack/prompts");
5
- const types_1 = require("../../types");
6
- const collectFrontendChoices = async () => {
7
- const project = await (0, prompts_1.group)({
8
- framework: async () => {
9
- // Auto-select Next.js since it's the only option
10
- return Promise.resolve("nextjs");
11
- },
12
- databaseType: async () => {
13
- const selection = await (0, prompts_1.select)({
14
- message: "Select a database:",
15
- options: types_1.databaseTypeOptions,
16
- initialValue: "none",
17
- });
18
- if ((0, prompts_1.isCancel)(selection)) {
19
- (0, prompts_1.cancel)("Operation cancelled.");
20
- process.exit(0);
21
- }
22
- return selection;
23
- },
24
- orm: async ({ results }) => {
25
- // Type guard to narrow the databaseType from unknown to DatabaseType
26
- const dbType = results.databaseType;
27
- // Skip ORM selection if no database type was selected
28
- if (dbType === "none") {
29
- return "none";
30
- }
31
- // Select ORM based on database type
32
- if (dbType !== "mongodb" && dbType !== "postgresql") {
33
- return "none";
34
- }
35
- const ormOptions = dbType === "mongodb" ? types_1.mongodbOrmOptions : types_1.postgresqlOrmOptions;
36
- const selection = await (0, prompts_1.select)({
37
- message: `Select an ORM for ${dbType}:`,
38
- options: ormOptions,
39
- initialValue: "prisma",
40
- });
41
- if ((0, prompts_1.isCancel)(selection)) {
42
- (0, prompts_1.cancel)("Operation cancelled.");
43
- process.exit(0);
44
- }
45
- return selection;
46
- },
47
- packageManager: async () => {
48
- const selection = await (0, prompts_1.select)({
49
- message: "Select a package manager:",
50
- options: types_1.packageManagerOptions,
51
- initialValue: "npm",
52
- });
53
- if ((0, prompts_1.isCancel)(selection)) {
54
- (0, prompts_1.cancel)("Operation cancelled.");
55
- process.exit(0);
56
- }
57
- return selection;
58
- },
59
- useDocker: () => (0, prompts_1.confirm)({
60
- message: "Use Docker?",
61
- initialValue: false,
62
- }),
63
- useAuth: async ({ results }) => {
64
- // Better Auth template requires a database-backed adapter
65
- if (results.databaseType === "none") {
66
- return false;
67
- }
68
- const selection = await (0, prompts_1.select)({
69
- message: "Add Better Auth?",
70
- options: types_1.authOptions,
71
- initialValue: false,
72
- });
73
- if ((0, prompts_1.isCancel)(selection)) {
74
- (0, prompts_1.cancel)("Operation cancelled.");
75
- process.exit(0);
76
- }
77
- return selection;
78
- },
79
- initGit: () => (0, prompts_1.confirm)({
80
- message: "Initialize a git repository?",
81
- initialValue: true,
82
- }),
83
- installDeps: () => (0, prompts_1.confirm)({
84
- message: "Install dependencies now?",
85
- initialValue: false,
86
- }),
87
- }, {
88
- onCancel: () => {
89
- (0, prompts_1.cancel)("Operation cancelled.");
90
- process.exit(0);
91
- },
92
- });
93
- // Transform the group result into the proper typed object
94
- // Validate orm using type guard
95
- if (!(0, types_1.isValidOrmOption)(project.orm)) {
96
- throw new Error(`Invalid ORM option: ${String(project.orm)}`);
97
- }
98
- const result = {
99
- framework: project.framework,
100
- databaseType: project.databaseType,
101
- orm: project.orm,
102
- packageManager: project.packageManager,
103
- useDocker: Boolean(project.useDocker),
104
- useAuth: Boolean(project.useAuth),
105
- initGit: Boolean(project.initGit),
106
- installDeps: Boolean(project.installDeps),
107
- };
108
- return result;
109
- };
110
- exports.collectFrontendChoices = collectFrontendChoices;
111
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/prompts/frontend/index.ts"],"names":[],"mappings":"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"}