create-velox-app 0.4.2 → 0.4.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 (174) hide show
  1. package/dist/cli.js +0 -0
  2. package/dist/index.js +21 -14
  3. package/dist/index.js.map +1 -1
  4. package/dist/templates/auth.d.ts +6 -3
  5. package/dist/templates/auth.d.ts.map +1 -1
  6. package/dist/templates/auth.js +56 -1110
  7. package/dist/templates/auth.js.map +1 -1
  8. package/dist/templates/compiler.d.ts +68 -0
  9. package/dist/templates/compiler.d.ts.map +1 -0
  10. package/dist/templates/compiler.js +149 -0
  11. package/dist/templates/compiler.js.map +1 -0
  12. package/dist/templates/default.d.ts +5 -2
  13. package/dist/templates/default.d.ts.map +1 -1
  14. package/dist/templates/default.js +51 -508
  15. package/dist/templates/default.js.map +1 -1
  16. package/dist/templates/index.d.ts.map +1 -1
  17. package/dist/templates/index.js +19 -10
  18. package/dist/templates/index.js.map +1 -1
  19. package/dist/templates/placeholders.d.ts +70 -0
  20. package/dist/templates/placeholders.d.ts.map +1 -0
  21. package/dist/templates/placeholders.js +145 -0
  22. package/dist/templates/placeholders.js.map +1 -0
  23. package/dist/templates/shared/index.d.ts +9 -0
  24. package/dist/templates/shared/index.d.ts.map +1 -0
  25. package/dist/templates/shared/index.js +9 -0
  26. package/dist/templates/shared/index.js.map +1 -0
  27. package/dist/templates/shared/root.d.ts +14 -0
  28. package/dist/templates/shared/root.d.ts.map +1 -0
  29. package/dist/templates/shared/root.js +43 -0
  30. package/dist/templates/shared/root.js.map +1 -0
  31. package/dist/templates/shared/web-base.d.ts +18 -0
  32. package/dist/templates/shared/web-base.d.ts.map +1 -0
  33. package/dist/templates/shared/web-base.js +63 -0
  34. package/dist/templates/shared/web-base.js.map +1 -0
  35. package/dist/templates/shared/web-styles.d.ts +10 -0
  36. package/dist/templates/shared/web-styles.d.ts.map +1 -0
  37. package/dist/templates/shared/web-styles.js +26 -0
  38. package/dist/templates/shared/web-styles.js.map +1 -0
  39. package/dist/templates/shared.d.ts +3 -14
  40. package/dist/templates/shared.d.ts.map +1 -1
  41. package/dist/templates/shared.js +7 -290
  42. package/dist/templates/shared.js.map +1 -1
  43. package/dist/templates/source/api/config/app.d.ts +13 -0
  44. package/dist/templates/source/api/config/app.d.ts.map +1 -0
  45. package/dist/templates/source/api/config/app.js +14 -0
  46. package/dist/templates/source/api/config/app.js.map +1 -0
  47. package/dist/templates/source/api/config/auth.d.ts +34 -0
  48. package/dist/templates/source/api/config/auth.d.ts.map +1 -0
  49. package/dist/templates/source/api/config/auth.js +165 -0
  50. package/dist/templates/source/api/config/auth.js.map +1 -0
  51. package/dist/templates/source/api/config/index.auth.d.ts +6 -0
  52. package/dist/templates/source/api/config/index.auth.d.ts.map +1 -0
  53. package/dist/templates/source/api/config/index.auth.js +6 -0
  54. package/dist/templates/source/api/config/index.auth.js.map +1 -0
  55. package/dist/templates/source/api/config/index.default.d.ts +5 -0
  56. package/dist/templates/source/api/config/index.default.d.ts.map +1 -0
  57. package/dist/templates/source/api/config/index.default.js +5 -0
  58. package/dist/templates/source/api/config/index.default.js.map +1 -0
  59. package/dist/templates/source/api/database/index.d.ts +9 -0
  60. package/dist/templates/source/api/database/index.d.ts.map +1 -0
  61. package/dist/templates/source/api/database/index.js +18 -0
  62. package/dist/templates/source/api/database/index.js.map +1 -0
  63. package/dist/templates/source/api/index.auth.d.ts +5 -0
  64. package/dist/templates/source/api/index.auth.d.ts.map +1 -0
  65. package/dist/templates/source/api/index.auth.js +59 -0
  66. package/dist/templates/source/api/index.auth.js.map +1 -0
  67. package/dist/templates/source/api/index.default.d.ts +5 -0
  68. package/dist/templates/source/api/index.default.d.ts.map +1 -0
  69. package/dist/templates/source/api/index.default.js +56 -0
  70. package/dist/templates/source/api/index.default.js.map +1 -0
  71. package/dist/templates/source/api/prisma.config.d.ts +9 -0
  72. package/dist/templates/source/api/prisma.config.d.ts.map +1 -0
  73. package/dist/templates/source/api/prisma.config.js +15 -0
  74. package/dist/templates/source/api/prisma.config.js.map +1 -0
  75. package/dist/templates/source/api/procedures/auth.d.ts +14 -0
  76. package/dist/templates/source/api/procedures/auth.d.ts.map +1 -0
  77. package/dist/templates/source/api/procedures/auth.js +221 -0
  78. package/dist/templates/source/api/procedures/auth.js.map +1 -0
  79. package/dist/templates/source/api/procedures/health.d.ts +5 -0
  80. package/dist/templates/source/api/procedures/health.d.ts.map +1 -0
  81. package/dist/templates/source/api/procedures/health.js +21 -0
  82. package/dist/templates/source/api/procedures/health.js.map +1 -0
  83. package/dist/templates/source/api/procedures/index.auth.d.ts +7 -0
  84. package/dist/templates/source/api/procedures/index.auth.d.ts.map +1 -0
  85. package/dist/templates/source/api/procedures/index.auth.js +7 -0
  86. package/dist/templates/source/api/procedures/index.auth.js.map +1 -0
  87. package/dist/templates/source/api/procedures/index.default.d.ts +6 -0
  88. package/dist/templates/source/api/procedures/index.default.d.ts.map +1 -0
  89. package/dist/templates/source/api/procedures/index.default.js +6 -0
  90. package/dist/templates/source/api/procedures/index.default.js.map +1 -0
  91. package/dist/templates/source/api/procedures/users.auth.d.ts +7 -0
  92. package/dist/templates/source/api/procedures/users.auth.d.ts.map +1 -0
  93. package/dist/templates/source/api/procedures/users.auth.js +111 -0
  94. package/dist/templates/source/api/procedures/users.auth.js.map +1 -0
  95. package/dist/templates/source/api/procedures/users.default.d.ts +5 -0
  96. package/dist/templates/source/api/procedures/users.default.d.ts.map +1 -0
  97. package/dist/templates/source/api/procedures/users.default.js +86 -0
  98. package/dist/templates/source/api/procedures/users.default.js.map +1 -0
  99. package/dist/templates/source/api/schemas/index.d.ts +5 -0
  100. package/dist/templates/source/api/schemas/index.d.ts.map +1 -0
  101. package/dist/templates/source/api/schemas/index.js +5 -0
  102. package/dist/templates/source/api/schemas/index.js.map +1 -0
  103. package/dist/templates/source/api/schemas/user.d.ts +11 -0
  104. package/dist/templates/source/api/schemas/user.d.ts.map +1 -0
  105. package/dist/templates/source/api/schemas/user.js +20 -0
  106. package/dist/templates/source/api/schemas/user.js.map +1 -0
  107. package/dist/templates/source/api/tsup.config.d.ts +3 -0
  108. package/dist/templates/source/api/tsup.config.d.ts.map +1 -0
  109. package/dist/templates/source/api/tsup.config.js +10 -0
  110. package/dist/templates/source/api/tsup.config.js.map +1 -0
  111. package/dist/templates/source/web/main.d.ts +9 -0
  112. package/dist/templates/source/web/main.d.ts.map +1 -0
  113. package/dist/templates/source/web/main.js +27 -0
  114. package/dist/templates/source/web/main.js.map +1 -0
  115. package/dist/templates/source/web/routes/__root.d.ts +2 -0
  116. package/dist/templates/source/web/routes/__root.d.ts.map +1 -0
  117. package/dist/templates/source/web/routes/__root.js +28 -0
  118. package/dist/templates/source/web/routes/__root.js.map +1 -0
  119. package/dist/templates/source/web/routes/about.d.ts +2 -0
  120. package/dist/templates/source/web/routes/about.d.ts.map +1 -0
  121. package/dist/templates/source/web/routes/about.js +33 -0
  122. package/dist/templates/source/web/routes/about.js.map +1 -0
  123. package/dist/templates/source/web/routes/index.auth.d.ts +2 -0
  124. package/dist/templates/source/web/routes/index.auth.d.ts.map +1 -0
  125. package/dist/templates/source/web/routes/index.auth.js +159 -0
  126. package/dist/templates/source/web/routes/index.auth.js.map +1 -0
  127. package/dist/templates/source/web/routes/index.default.d.ts +2 -0
  128. package/dist/templates/source/web/routes/index.default.d.ts.map +1 -0
  129. package/dist/templates/source/web/routes/index.default.js +60 -0
  130. package/dist/templates/source/web/routes/index.default.js.map +1 -0
  131. package/dist/templates/source/web/vite.config.d.ts +3 -0
  132. package/dist/templates/source/web/vite.config.d.ts.map +1 -0
  133. package/dist/templates/source/web/vite.config.js +22 -0
  134. package/dist/templates/source/web/vite.config.js.map +1 -0
  135. package/package.json +11 -9
  136. package/src/templates/source/api/config/app.ts +13 -0
  137. package/src/templates/source/api/config/auth.ts +202 -0
  138. package/src/templates/source/api/config/database.ts +22 -0
  139. package/src/templates/source/api/env.auth +22 -0
  140. package/src/templates/source/api/env.default +13 -0
  141. package/src/templates/source/api/index.auth.ts +30 -0
  142. package/src/templates/source/api/index.default.ts +27 -0
  143. package/src/templates/source/api/package.auth.json +40 -0
  144. package/src/templates/source/api/package.default.json +38 -0
  145. package/src/templates/source/api/prisma/schema.auth.prisma +30 -0
  146. package/src/templates/source/api/prisma/schema.default.prisma +28 -0
  147. package/src/templates/source/api/prisma.config.ts +15 -0
  148. package/src/templates/source/api/procedures/auth.ts +285 -0
  149. package/src/templates/source/api/procedures/health.ts +24 -0
  150. package/src/templates/source/api/procedures/users.auth.ts +170 -0
  151. package/src/templates/source/api/procedures/users.default.ts +119 -0
  152. package/src/templates/source/api/schemas/user.ts +29 -0
  153. package/src/templates/source/api/tsconfig.json +12 -0
  154. package/src/templates/source/api/tsup.config.ts +10 -0
  155. package/src/templates/source/root/CLAUDE.auth.md +148 -0
  156. package/src/templates/source/root/CLAUDE.default.md +128 -0
  157. package/src/templates/source/root/README.md +72 -0
  158. package/src/templates/source/root/gitignore +37 -0
  159. package/src/templates/source/root/package.json +17 -0
  160. package/src/templates/source/root/pnpm-workspace.yaml +2 -0
  161. package/src/templates/source/root/tsconfig.json +19 -0
  162. package/src/templates/source/web/App.module.css +282 -0
  163. package/src/templates/source/web/favicon.svg +12 -0
  164. package/src/templates/source/web/index.html +13 -0
  165. package/src/templates/source/web/main.tsx +38 -0
  166. package/src/templates/source/web/package.json +26 -0
  167. package/src/templates/source/web/routes/__root.tsx +31 -0
  168. package/src/templates/source/web/routes/about.tsx +36 -0
  169. package/src/templates/source/web/routes/index.auth.tsx +230 -0
  170. package/src/templates/source/web/routes/index.default.tsx +79 -0
  171. package/src/templates/source/web/styles/global.css +90 -0
  172. package/src/templates/source/web/tsconfig.json +24 -0
  173. package/src/templates/source/web/vite.config.ts +22 -0
  174. package/LICENSE +0 -21
@@ -1,538 +1,81 @@
1
1
  /**
2
- * Default Template (API Only)
2
+ * Default Template (Full-Stack)
3
+ *
4
+ * Full-stack workspace template with:
5
+ * - apps/api: REST API with user CRUD operations
6
+ * - apps/web: React frontend with TanStack Router
3
7
  *
4
- * Basic REST API template with user CRUD operations.
5
8
  * No authentication - suitable for internal APIs or as a starting point.
6
9
  */
7
- import { generateSharedFiles, VELOXTS_VERSION } from './shared.js';
10
+ import { compileTemplate } from './compiler.js';
11
+ import { DEFAULT_CONFIG } from './placeholders.js';
12
+ import { generateRootFiles, generateWebBaseFiles, generateWebStyleFiles } from './shared/index.js';
8
13
  // ============================================================================
9
- // Package.json
14
+ // API Template Compilation
10
15
  // ============================================================================
11
- function generatePackageJson(config) {
12
- return JSON.stringify({
13
- name: config.projectName,
14
- version: '0.0.1',
15
- description: 'A VeloxTS application',
16
- type: 'module',
17
- main: 'dist/index.js',
18
- scripts: {
19
- build: 'tsup',
20
- start: 'node dist/index.js',
21
- dev: 'tsx watch src/index.ts',
22
- 'type-check': 'tsc --noEmit',
23
- clean: "node -e \"require('fs').rmSync('dist',{recursive:true,force:true});require('fs').rmSync('tsconfig.tsbuildinfo',{force:true})\"",
24
- 'db:generate': 'prisma generate',
25
- 'db:push': 'prisma db push',
26
- 'db:studio': 'prisma studio',
27
- postinstall: 'prisma generate',
28
- },
29
- dependencies: {
30
- '@fastify/static': '^8.3.0',
31
- '@prisma/adapter-better-sqlite3': '^7.1.0',
32
- '@prisma/client': '^7.1.0',
33
- '@veloxts/velox': `^${VELOXTS_VERSION}`,
34
- 'better-sqlite3': '^12.5.0',
35
- dotenv: '^17.2.3',
36
- zod: '^3.24.4',
37
- },
38
- devDependencies: {
39
- prisma: '^7.1.0',
40
- tsup: '^8.5.1',
41
- tsx: '^4.21.0',
42
- typescript: '^5.9.3',
43
- },
44
- }, null, 2);
16
+ function generateApiPackageJson(config) {
17
+ return compileTemplate('api/package.default.json', config);
45
18
  }
46
- // ============================================================================
47
- // Environment Files
48
- // ============================================================================
49
- function generateEnvExample() {
50
- return `# Database URL
51
- # SQLite (local development):
52
- DATABASE_URL="file:./dev.db"
53
- # PostgreSQL (production):
54
- # DATABASE_URL="postgresql://user:password@localhost:5432/myapp"
55
-
56
- # Server Configuration
57
- PORT=3210
58
- HOST=0.0.0.0
59
- NODE_ENV=development
60
-
61
- # API Configuration
62
- API_PREFIX=/api
63
- `;
19
+ function generateApiTsConfig() {
20
+ return compileTemplate('api/tsconfig.json', DEFAULT_CONFIG);
64
21
  }
65
- // ============================================================================
66
- // Prisma Schema
67
- // ============================================================================
68
- function generatePrismaSchema() {
69
- return `// Prisma Schema
70
- //
71
- // This schema defines the database structure.
72
- // Using SQLite for simplicity - easily swap to PostgreSQL for production.
73
-
74
- generator client {
75
- provider = "prisma-client"
76
- output = "../src/generated/prisma"
22
+ function generateApiTsupConfig() {
23
+ return compileTemplate('api/tsup.config.ts', DEFAULT_CONFIG);
77
24
  }
78
-
79
- datasource db {
80
- provider = "sqlite"
25
+ function generateEnvExample(config) {
26
+ return compileTemplate('api/env.default', config);
81
27
  }
82
-
83
- // ============================================================================
84
- // User Model
85
- // ============================================================================
86
-
87
- /// User model for basic CRUD demonstration
88
- model User {
89
- id String @id @default(uuid())
90
- name String
91
- email String @unique
92
- createdAt DateTime @default(now())
93
- updatedAt DateTime @updatedAt
94
-
95
- @@map("users")
28
+ function generatePrismaSchema() {
29
+ return compileTemplate('api/prisma/schema.default.prisma', DEFAULT_CONFIG);
96
30
  }
97
- `;
31
+ function generatePrismaConfig() {
32
+ return compileTemplate('api/prisma.config.ts', DEFAULT_CONFIG);
98
33
  }
99
- // ============================================================================
100
- // Source Files
101
- // ============================================================================
102
34
  function generateIndexTs() {
103
- return `/**
104
- * Application Entry Point
105
- */
106
-
107
- import 'dotenv/config';
108
-
109
- import fastifyStatic from '@fastify/static';
110
- import {
111
- veloxApp,
112
- VELOX_VERSION,
113
- databasePlugin,
114
- rest,
115
- getRouteSummary,
116
- } from '@veloxts/velox';
117
- import path from 'node:path';
118
-
119
- import { config } from './config/index.js';
120
- import { prisma } from './database/index.js';
121
- import { healthProcedures, userProcedures } from './procedures/index.js';
122
-
123
- // ============================================================================
124
- // Application Bootstrap
125
- // ============================================================================
126
-
127
- async function createApp() {
128
- const app = await veloxApp({
129
- port: config.port,
130
- host: config.host,
131
- logger: config.logger,
132
- });
133
-
134
- // Register database plugin
135
- await app.register(databasePlugin({ client: prisma }));
136
-
137
- // Register static file serving for frontend
138
- await app.server.register(fastifyStatic, {
139
- root: path.join(process.cwd(), 'public'),
140
- prefix: '/',
141
- });
142
-
143
- // Register REST API routes
144
- const collections = [userProcedures, healthProcedures];
145
- app.routes(rest(collections, { prefix: config.apiPrefix }));
146
-
147
- return { app, collections };
35
+ return compileTemplate('api/index.default.ts', DEFAULT_CONFIG);
148
36
  }
149
-
150
- function printBanner(collections: Parameters<typeof getRouteSummary>[0]) {
151
- const divider = '═'.repeat(50);
152
-
153
- console.log(\`\\n\${divider}\`);
154
- console.log(\` VeloxTS Application v\${VELOX_VERSION}\`);
155
- console.log(\` Environment: \${config.env}\`);
156
- console.log(divider);
157
-
158
- // Print registered routes
159
- const routes = getRouteSummary(collections);
160
- console.log('\\n📍 Registered Routes:\\n');
161
-
162
- for (const route of routes) {
163
- const method = route.method.padEnd(6);
164
- const path = route.path.padEnd(25);
165
- console.log(\` \${method} \${path} → \${route.namespace}.\${route.procedure}\`);
166
- }
167
-
168
- console.log(\`\\n\${divider}\`);
169
- console.log(\` Frontend: http://localhost:\${config.port}\`);
170
- console.log(\` REST API: http://localhost:\${config.port}\${config.apiPrefix}\`);
171
- console.log(\`\${divider}\\n\`);
37
+ function generateConfigApp(config) {
38
+ return compileTemplate('api/config/app.ts', config);
172
39
  }
173
-
174
- async function main() {
175
- try {
176
- const { app, collections } = await createApp();
177
- await app.start();
178
- printBanner(collections);
179
- } catch (error) {
180
- console.error('Failed to start application:', error);
181
- process.exit(1);
182
- }
40
+ function generateConfigDatabase() {
41
+ return compileTemplate('api/config/database.ts', DEFAULT_CONFIG);
183
42
  }
184
-
185
- main();
186
- `;
187
- }
188
- function generateDatabaseIndex() {
189
- return `/**
190
- * Database Client (Prisma 7.x)
191
- *
192
- * Prisma 7 requires:
193
- * - Generated client from custom output path
194
- * - Driver adapter for database connections
195
- */
196
-
197
- import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
198
-
199
- import { PrismaClient } from '../generated/prisma/client.js';
200
-
201
- // Validate DATABASE_URL is set
202
- if (!process.env.DATABASE_URL) {
203
- throw new Error('DATABASE_URL environment variable is required');
204
- }
205
-
206
- // Create SQLite adapter with database URL from environment
207
- const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL });
208
-
209
- // Export configured Prisma client
210
- export const prisma = new PrismaClient({ adapter });
211
- `;
212
- }
213
- function generateProceduresIndex() {
214
- return `/**
215
- * Procedure Exports
216
- */
217
-
218
- export * from './health.js';
219
- export * from './users.js';
220
- `;
43
+ function generateHealthProcedures() {
44
+ return compileTemplate('api/procedures/health.ts', DEFAULT_CONFIG);
221
45
  }
222
46
  function generateUserProcedures() {
223
- return `/**
224
- * User Procedures
225
- */
226
-
227
- import { defineProcedures, procedure, paginationInputSchema, z } from '@veloxts/velox';
228
-
229
- import { CreateUserInput, UpdateUserInput, UserSchema } from '../schemas/user.js';
230
-
231
- // Database types
232
- interface DbUser {
233
- id: string;
234
- name: string;
235
- email: string;
236
- createdAt: Date;
237
- updatedAt: Date;
238
- }
239
-
240
- interface DbClient {
241
- user: {
242
- findUnique: (args: { where: { id: string } }) => Promise<DbUser | null>;
243
- findMany: (args?: { skip?: number; take?: number }) => Promise<DbUser[]>;
244
- create: (args: { data: { name: string; email: string } }) => Promise<DbUser>;
245
- update: (args: { where: { id: string }; data: { name?: string; email?: string } }) => Promise<DbUser>;
246
- delete: (args: { where: { id: string } }) => Promise<DbUser>;
247
- count: () => Promise<number>;
248
- };
249
- }
250
-
251
- function getDb(ctx: { db: unknown }): DbClient {
252
- return ctx.db as DbClient;
253
- }
254
-
255
- function toUserResponse(dbUser: DbUser) {
256
- return {
257
- id: dbUser.id,
258
- name: dbUser.name,
259
- email: dbUser.email,
260
- createdAt: dbUser.createdAt.toISOString(),
261
- updatedAt: dbUser.updatedAt.toISOString(),
262
- };
263
- }
264
-
265
- export const userProcedures = defineProcedures('users', {
266
- getUser: procedure()
267
- .input(z.object({ id: z.string().uuid() }))
268
- .output(UserSchema.nullable())
269
- .query(async ({ input, ctx }) => {
270
- const db = getDb(ctx);
271
- const user = await db.user.findUnique({ where: { id: input.id } });
272
- return user ? toUserResponse(user) : null;
273
- }),
274
-
275
- listUsers: procedure()
276
- .input(paginationInputSchema.optional())
277
- .output(
278
- z.object({
279
- data: z.array(UserSchema),
280
- meta: z.object({
281
- page: z.number(),
282
- limit: z.number(),
283
- total: z.number(),
284
- }),
285
- })
286
- )
287
- .query(async ({ input, ctx }) => {
288
- const db = getDb(ctx);
289
- const page = input?.page ?? 1;
290
- const limit = input?.limit ?? 10;
291
- const skip = (page - 1) * limit;
292
-
293
- const [dbUsers, total] = await Promise.all([
294
- db.user.findMany({ skip, take: limit }),
295
- db.user.count(),
296
- ]);
297
-
298
- return {
299
- data: dbUsers.map(toUserResponse),
300
- meta: { page, limit, total },
301
- };
302
- }),
303
-
304
- createUser: procedure()
305
- .input(CreateUserInput)
306
- .output(UserSchema)
307
- .mutation(async ({ input, ctx }) => {
308
- const db = getDb(ctx);
309
- const user = await db.user.create({ data: input });
310
- return toUserResponse(user);
311
- }),
312
-
313
- updateUser: procedure()
314
- .input(z.object({ id: z.string().uuid() }).merge(UpdateUserInput))
315
- .output(UserSchema)
316
- .mutation(async ({ input, ctx }) => {
317
- const db = getDb(ctx);
318
- const { id, ...data } = input;
319
- const user = await db.user.update({ where: { id }, data });
320
- return toUserResponse(user);
321
- }),
322
-
323
- patchUser: procedure()
324
- .input(z.object({ id: z.string().uuid() }).merge(UpdateUserInput))
325
- .output(UserSchema)
326
- .mutation(async ({ input, ctx }) => {
327
- const db = getDb(ctx);
328
- const { id, ...data } = input;
329
- const user = await db.user.update({ where: { id }, data });
330
- return toUserResponse(user);
331
- }),
332
-
333
- deleteUser: procedure()
334
- .input(z.object({ id: z.string().uuid() }))
335
- .output(z.object({ success: z.boolean() }))
336
- .mutation(async ({ input, ctx }) => {
337
- const db = getDb(ctx);
338
- await db.user.delete({ where: { id: input.id } });
339
- return { success: true };
340
- }),
341
- });
342
- `;
343
- }
344
- function generateSchemasIndex() {
345
- return `/**
346
- * Schema Exports
347
- */
348
-
349
- export * from './user.js';
350
- `;
47
+ return compileTemplate('api/procedures/users.default.ts', DEFAULT_CONFIG);
351
48
  }
352
49
  function generateUserSchema() {
353
- return `/**
354
- * User Schemas
355
- */
356
-
357
- import { createIdSchema, emailSchema, z } from '@veloxts/velox';
358
-
359
- export const UserSchema = z.object({
360
- id: createIdSchema('uuid'),
361
- name: z.string().min(1).max(100),
362
- email: emailSchema,
363
- createdAt: z.coerce.date().transform((d) => d.toISOString()),
364
- updatedAt: z.coerce.date().transform((d) => d.toISOString()),
365
- });
366
-
367
- export type User = z.infer<typeof UserSchema>;
368
-
369
- export const CreateUserInput = z.object({
370
- name: z.string().min(1).max(100),
371
- email: emailSchema,
372
- });
373
-
374
- export type CreateUserData = z.infer<typeof CreateUserInput>;
375
-
376
- export const UpdateUserInput = z.object({
377
- name: z.string().min(1).max(100).optional(),
378
- email: emailSchema.optional(),
379
- });
380
-
381
- export type UpdateUserData = z.infer<typeof UpdateUserInput>;
382
- `;
383
- }
384
- // ============================================================================
385
- // CLAUDE.md
386
- // ============================================================================
387
- function generateClaudeMd(config) {
388
- return `# CLAUDE.md
389
-
390
- This file provides guidance to Claude Code and other AI assistants when working with this VeloxTS project.
391
-
392
- ## Project Overview
393
-
394
- **${config.projectName}** is a VeloxTS application - a TypeScript full-stack framework built on Fastify, tRPC, Prisma, and Zod.
395
-
396
- **Key Characteristics:**
397
- - Type safety without code generation (direct type imports)
398
- - Hybrid API: tRPC for internal, REST for external
399
- - Convention over configuration
400
- - Laravel-inspired developer experience
401
-
402
- ## Commands
403
-
404
- \`\`\`bash
405
- ${config.packageManager} dev # Start development server with hot reload
406
- ${config.packageManager} build # Build for production
407
- ${config.packageManager} start # Run production server
408
- ${config.packageManager} db:push # Push database schema changes
409
- ${config.packageManager} db:generate # Regenerate Prisma client
410
- ${config.packageManager} db:studio # Open Prisma Studio GUI
411
- ${config.packageManager} type-check # Run TypeScript type checking
412
- \`\`\`
413
-
414
- ## Project Structure
415
-
416
- \`\`\`
417
- src/
418
- ├── config/ # Application configuration
419
- ├── database/ # Prisma client setup
420
- ├── procedures/ # API procedures (business logic)
421
- ├── schemas/ # Zod validation schemas
422
- ├── generated/ # Generated Prisma client (git-ignored)
423
- └── index.ts # Application entry point
424
-
425
- prisma/
426
- └── schema.prisma # Database schema
427
-
428
- public/ # Static files served at /
429
- \`\`\`
430
-
431
- ## Procedure Naming Conventions
432
-
433
- Procedure names automatically map to HTTP methods and routes:
434
-
435
- | Procedure Name | HTTP Method | Route | Status Code |
436
- |----------------|-------------|-------|-------------|
437
- | \`getUser\` | GET | \`/users/:id\` | 200 |
438
- | \`listUsers\` | GET | \`/users\` | 200 |
439
- | \`findUsers\` | GET | \`/users\` | 200 |
440
- | \`createUser\` | POST | \`/users\` | 201 |
441
- | \`addUser\` | POST | \`/users\` | 201 |
442
- | \`updateUser\` | PUT | \`/users/:id\` | 200 |
443
- | \`editUser\` | PUT | \`/users/:id\` | 200 |
444
- | \`patchUser\` | PATCH | \`/users/:id\` | 200 |
445
- | \`deleteUser\` | DELETE | \`/users/:id\` | 200/204 |
446
- | \`removeUser\` | DELETE | \`/users/:id\` | 200/204 |
447
-
448
- ## Creating a New Procedure
449
-
450
- \`\`\`typescript
451
- // src/procedures/posts.ts
452
- import { defineProcedures, procedure, z } from '@veloxts/velox';
453
-
454
- export const postProcedures = defineProcedures('posts', {
455
- // GET /api/posts/:id
456
- getPost: procedure()
457
- .input(z.object({ id: z.string().uuid() }))
458
- .output(PostSchema)
459
- .query(async ({ input, ctx }) => {
460
- return ctx.db.post.findUnique({ where: { id: input.id } });
461
- }),
462
-
463
- // POST /api/posts
464
- createPost: procedure()
465
- .input(CreatePostSchema)
466
- .output(PostSchema)
467
- .mutation(async ({ input, ctx }) => {
468
- return ctx.db.post.create({ data: input });
469
- }),
470
- });
471
- \`\`\`
472
-
473
- Then register in \`src/procedures/index.ts\` and add to collections in \`src/index.ts\`.
474
-
475
- ## Type Safety
476
-
477
- VeloxTS provides end-to-end type safety without code generation:
478
-
479
- - **Zod schemas** define validation and infer TypeScript types
480
- - **Procedures** chain \`.input()\` and \`.output()\` for full type inference
481
- - **Context** provides typed access to database (\`ctx.db\`)
482
- - Import types directly: \`import type { User } from './schemas/user.js'\`
483
-
484
- ## Database (Prisma)
485
-
486
- - Schema: \`prisma/schema.prisma\`
487
- - Config: \`prisma.config.ts\` (Prisma 7.x style)
488
- - Client: Generated to \`src/generated/prisma/\`
489
- - Access via context: \`ctx.db.user.findMany()\`
490
-
491
- After schema changes:
492
- \`\`\`bash
493
- ${config.packageManager} db:push # Apply changes to database
494
- ${config.packageManager} db:generate # Regenerate client types
495
- \`\`\`
496
-
497
- ## Environment Variables
498
-
499
- Configured in \`.env\`:
500
- - \`DATABASE_URL\` - Database connection string
501
- - \`PORT\` - Server port (default: 3210)
502
- - \`HOST\` - Server host (default: 0.0.0.0)
503
- - \`NODE_ENV\` - Environment (development/production)
504
- - \`API_PREFIX\` - API route prefix (default: /api)
505
-
506
- ## Code Style
507
-
508
- - Use Zod for all input/output validation
509
- - Keep procedures focused - one operation per procedure
510
- - Use descriptive names following conventions
511
- - Colocate schemas with their procedures when simple
512
- - Extract to \`src/schemas/\` when shared across procedures
513
- `;
50
+ return compileTemplate('api/schemas/user.ts', DEFAULT_CONFIG);
514
51
  }
515
52
  // ============================================================================
516
53
  // Default Template Generator
517
54
  // ============================================================================
518
55
  export function generateDefaultTemplate(config) {
519
56
  const files = [
520
- // Root files
521
- { path: 'package.json', content: generatePackageJson(config) },
522
- { path: '.env.example', content: generateEnvExample() },
523
- { path: '.env', content: generateEnvExample() },
524
- { path: 'CLAUDE.md', content: generateClaudeMd(config) },
57
+ // API package files
58
+ { path: 'apps/api/package.json', content: generateApiPackageJson(config) },
59
+ { path: 'apps/api/tsconfig.json', content: generateApiTsConfig() },
60
+ { path: 'apps/api/tsup.config.ts', content: generateApiTsupConfig() },
61
+ { path: 'apps/api/prisma.config.ts', content: generatePrismaConfig() },
62
+ { path: 'apps/api/.env.example', content: generateEnvExample(config) },
63
+ { path: 'apps/api/.env', content: generateEnvExample(config) },
525
64
  // Prisma
526
- { path: 'prisma/schema.prisma', content: generatePrismaSchema() },
527
- // Source files
528
- { path: 'src/index.ts', content: generateIndexTs() },
529
- { path: 'src/database/index.ts', content: generateDatabaseIndex() },
530
- { path: 'src/procedures/index.ts', content: generateProceduresIndex() },
531
- { path: 'src/procedures/users.ts', content: generateUserProcedures() },
532
- { path: 'src/schemas/index.ts', content: generateSchemasIndex() },
533
- { path: 'src/schemas/user.ts', content: generateUserSchema() },
65
+ { path: 'apps/api/prisma/schema.prisma', content: generatePrismaSchema() },
66
+ // API Source files
67
+ { path: 'apps/api/src/index.ts', content: generateIndexTs() },
68
+ { path: 'apps/api/src/config/app.ts', content: generateConfigApp(config) },
69
+ { path: 'apps/api/src/config/database.ts', content: generateConfigDatabase() },
70
+ { path: 'apps/api/src/procedures/health.ts', content: generateHealthProcedures() },
71
+ { path: 'apps/api/src/procedures/users.ts', content: generateUserProcedures() },
72
+ { path: 'apps/api/src/schemas/user.ts', content: generateUserSchema() },
534
73
  ];
535
- // Add shared files
536
- return [...files, ...generateSharedFiles(config)];
74
+ // Add root workspace files
75
+ const rootFiles = generateRootFiles(config, false);
76
+ // Add web package files
77
+ const webBaseFiles = generateWebBaseFiles(config, false);
78
+ const webStyleFiles = generateWebStyleFiles();
79
+ return [...files, ...rootFiles, ...webBaseFiles, ...webStyleFiles];
537
80
  }
538
81
  //# sourceMappingURL=default.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"default.js","sourceRoot":"","sources":["../../src/templates/default.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../../src/templates/default.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,CAAC;AAMF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,EAAE,CAO5E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,YAAY,GAAG,MAAM,EAAE,CAaxE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,CAAC;AAMF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,EAAE,CAO5E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,YAAY,GAAG,MAAM,EAAE,CAuBxE"}
@@ -30,16 +30,25 @@ export function generateTemplateFiles(config) {
30
30
  * Get directories that need to be created for the template
31
31
  */
32
32
  export function getTemplateDirectories(_template) {
33
- const baseDirectories = [
34
- 'src',
35
- 'src/config',
36
- 'src/database',
37
- 'src/procedures',
38
- 'src/schemas',
39
- 'prisma',
40
- 'public',
33
+ // Workspace-based directory structure
34
+ return [
35
+ // Root
36
+ 'apps',
37
+ // API package
38
+ 'apps/api',
39
+ 'apps/api/src',
40
+ 'apps/api/src/config',
41
+ 'apps/api/src/database',
42
+ 'apps/api/src/procedures',
43
+ 'apps/api/src/schemas',
44
+ 'apps/api/prisma',
45
+ // Web package
46
+ 'apps/web',
47
+ 'apps/web/src',
48
+ 'apps/web/src/routes',
49
+ 'apps/web/src/styles',
50
+ 'apps/web/src/components',
51
+ 'apps/web/public',
41
52
  ];
42
- // All templates use the same directory structure currently
43
- return baseDirectories;
44
53
  }
45
54
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EAAE,eAAe,EAAE,CAAC;AAU3B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,CAAC;AAEF,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAsB;IAC1D,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC;YACE,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAuB;IAC5D,MAAM,eAAe,GAAG;QACtB,KAAK;QACL,YAAY;QACZ,cAAc;QACd,gBAAgB;QAChB,aAAa;QACb,QAAQ;QACR,QAAQ;KACT,CAAC;IAEF,2DAA2D;IAC3D,OAAO,eAAe,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EAAE,eAAe,EAAE,CAAC;AAU3B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,CAAC;AAEF,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAsB;IAC1D,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC;YACE,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAuB;IAC5D,sCAAsC;IACtC,OAAO;QACL,OAAO;QACP,MAAM;QAEN,cAAc;QACd,UAAU;QACV,cAAc;QACd,qBAAqB;QACrB,uBAAuB;QACvB,yBAAyB;QACzB,sBAAsB;QACtB,iBAAiB;QAEjB,cAAc;QACd,UAAU;QACV,cAAc;QACd,qBAAqB;QACrB,qBAAqB;QACrB,yBAAyB;QACzB,iBAAiB;KAClB,CAAC;AACJ,CAAC"}