@veloxts/cli 0.3.6 → 0.4.1
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/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/generate.d.ts +17 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +219 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/migrate.d.ts +8 -3
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +17 -123
- package/dist/commands/migrate.js.map +1 -1
- package/dist/generators/base.d.ts +76 -0
- package/dist/generators/base.d.ts.map +1 -0
- package/dist/generators/base.js +271 -0
- package/dist/generators/base.js.map +1 -0
- package/dist/generators/generators/index.d.ts +17 -0
- package/dist/generators/generators/index.d.ts.map +1 -0
- package/dist/generators/generators/index.js +43 -0
- package/dist/generators/generators/index.js.map +1 -0
- package/dist/generators/generators/migration.d.ts +43 -0
- package/dist/generators/generators/migration.d.ts.map +1 -0
- package/dist/generators/generators/migration.js +121 -0
- package/dist/generators/generators/migration.js.map +1 -0
- package/dist/generators/generators/model.d.ts +38 -0
- package/dist/generators/generators/model.d.ts.map +1 -0
- package/dist/generators/generators/model.js +108 -0
- package/dist/generators/generators/model.js.map +1 -0
- package/dist/generators/generators/procedure.d.ts +37 -0
- package/dist/generators/generators/procedure.d.ts.map +1 -0
- package/dist/generators/generators/procedure.js +99 -0
- package/dist/generators/generators/procedure.js.map +1 -0
- package/dist/generators/generators/resource.d.ts +29 -0
- package/dist/generators/generators/resource.d.ts.map +1 -0
- package/dist/generators/generators/resource.js +124 -0
- package/dist/generators/generators/resource.js.map +1 -0
- package/dist/generators/generators/schema.d.ts +28 -0
- package/dist/generators/generators/schema.d.ts.map +1 -0
- package/dist/generators/generators/schema.js +83 -0
- package/dist/generators/generators/schema.js.map +1 -0
- package/dist/generators/generators/test.d.ts +28 -0
- package/dist/generators/generators/test.d.ts.map +1 -0
- package/dist/generators/generators/test.js +96 -0
- package/dist/generators/generators/test.js.map +1 -0
- package/dist/generators/index.d.ts +16 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +16 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/registry.d.ts +97 -0
- package/dist/generators/registry.d.ts.map +1 -0
- package/dist/generators/registry.js +253 -0
- package/dist/generators/registry.js.map +1 -0
- package/dist/generators/templates/migration.d.ts +23 -0
- package/dist/generators/templates/migration.d.ts.map +1 -0
- package/dist/generators/templates/migration.js +389 -0
- package/dist/generators/templates/migration.js.map +1 -0
- package/dist/generators/templates/model.d.ts +37 -0
- package/dist/generators/templates/model.d.ts.map +1 -0
- package/dist/generators/templates/model.js +374 -0
- package/dist/generators/templates/model.js.map +1 -0
- package/dist/generators/templates/procedure.d.ts +25 -0
- package/dist/generators/templates/procedure.d.ts.map +1 -0
- package/dist/generators/templates/procedure.js +274 -0
- package/dist/generators/templates/procedure.js.map +1 -0
- package/dist/generators/templates/resource.d.ts +34 -0
- package/dist/generators/templates/resource.d.ts.map +1 -0
- package/dist/generators/templates/resource.js +550 -0
- package/dist/generators/templates/resource.js.map +1 -0
- package/dist/generators/templates/schema.d.ts +33 -0
- package/dist/generators/templates/schema.d.ts.map +1 -0
- package/dist/generators/templates/schema.js +248 -0
- package/dist/generators/templates/schema.js.map +1 -0
- package/dist/generators/templates/test.d.ts +31 -0
- package/dist/generators/templates/test.d.ts.map +1 -0
- package/dist/generators/templates/test.js +882 -0
- package/dist/generators/templates/test.js.map +1 -0
- package/dist/generators/types.d.ts +211 -0
- package/dist/generators/types.d.ts.map +1 -0
- package/dist/generators/types.js +54 -0
- package/dist/generators/types.js.map +1 -0
- package/dist/generators/utils/filesystem.d.ts +68 -0
- package/dist/generators/utils/filesystem.d.ts.map +1 -0
- package/dist/generators/utils/filesystem.js +217 -0
- package/dist/generators/utils/filesystem.js.map +1 -0
- package/dist/generators/utils/naming.d.ts +122 -0
- package/dist/generators/utils/naming.d.ts.map +1 -0
- package/dist/generators/utils/naming.js +198 -0
- package/dist/generators/utils/naming.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations/commands/fresh.d.ts +11 -0
- package/dist/migrations/commands/fresh.d.ts.map +1 -0
- package/dist/migrations/commands/fresh.js +164 -0
- package/dist/migrations/commands/fresh.js.map +1 -0
- package/dist/migrations/commands/index.d.ts +11 -0
- package/dist/migrations/commands/index.d.ts.map +1 -0
- package/dist/migrations/commands/index.js +11 -0
- package/dist/migrations/commands/index.js.map +1 -0
- package/dist/migrations/commands/reset.d.ts +11 -0
- package/dist/migrations/commands/reset.d.ts.map +1 -0
- package/dist/migrations/commands/reset.js +258 -0
- package/dist/migrations/commands/reset.js.map +1 -0
- package/dist/migrations/commands/rollback.d.ts +11 -0
- package/dist/migrations/commands/rollback.d.ts.map +1 -0
- package/dist/migrations/commands/rollback.js +241 -0
- package/dist/migrations/commands/rollback.js.map +1 -0
- package/dist/migrations/commands/run.d.ts +11 -0
- package/dist/migrations/commands/run.d.ts.map +1 -0
- package/dist/migrations/commands/run.js +183 -0
- package/dist/migrations/commands/run.js.map +1 -0
- package/dist/migrations/commands/status.d.ts +11 -0
- package/dist/migrations/commands/status.d.ts.map +1 -0
- package/dist/migrations/commands/status.js +154 -0
- package/dist/migrations/commands/status.js.map +1 -0
- package/dist/migrations/errors.d.ts +74 -0
- package/dist/migrations/errors.d.ts.map +1 -0
- package/dist/migrations/errors.js +155 -0
- package/dist/migrations/errors.js.map +1 -0
- package/dist/migrations/index.d.ts +13 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +17 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/loader.d.ts +44 -0
- package/dist/migrations/loader.d.ts.map +1 -0
- package/dist/migrations/loader.js +181 -0
- package/dist/migrations/loader.js.map +1 -0
- package/dist/migrations/prisma-wrapper.d.ts +60 -0
- package/dist/migrations/prisma-wrapper.d.ts.map +1 -0
- package/dist/migrations/prisma-wrapper.js +184 -0
- package/dist/migrations/prisma-wrapper.js.map +1 -0
- package/dist/migrations/rollback-runner.d.ts +40 -0
- package/dist/migrations/rollback-runner.d.ts.map +1 -0
- package/dist/migrations/rollback-runner.js +191 -0
- package/dist/migrations/rollback-runner.js.map +1 -0
- package/dist/migrations/types.d.ts +214 -0
- package/dist/migrations/types.d.ts.map +1 -0
- package/dist/migrations/types.js +19 -0
- package/dist/migrations/types.js.map +1 -0
- package/package.json +29 -8
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Generator Infrastructure
|
|
3
|
+
*
|
|
4
|
+
* Core utilities and base class for all VeloxTS code generators.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { join, resolve } from 'node:path';
|
|
8
|
+
import { GeneratorError, GeneratorErrorCode } from './types.js';
|
|
9
|
+
import { deriveEntityNames } from './utils/naming.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Project Detection
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Markers that indicate a VeloxTS project
|
|
15
|
+
*/
|
|
16
|
+
const VELOX_PROJECT_MARKERS = ['@veloxts/velox', '@veloxts/core', '@veloxts/router'];
|
|
17
|
+
/**
|
|
18
|
+
* Ensure the current directory is a VeloxTS project
|
|
19
|
+
*
|
|
20
|
+
* @throws GeneratorError if not in a VeloxTS project
|
|
21
|
+
*/
|
|
22
|
+
export async function ensureVeloxProject(cwd) {
|
|
23
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
24
|
+
if (!existsSync(packageJsonPath)) {
|
|
25
|
+
throw new GeneratorError(GeneratorErrorCode.NOT_IN_PROJECT, 'No package.json found. Are you in a VeloxTS project?', 'Run this command from the root of your VeloxTS project, or create a new project with: npx create-velox-app my-app');
|
|
26
|
+
}
|
|
27
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
28
|
+
const dependencies = {
|
|
29
|
+
...packageJson.dependencies,
|
|
30
|
+
...packageJson.devDependencies,
|
|
31
|
+
};
|
|
32
|
+
const hasVeloxMarker = VELOX_PROJECT_MARKERS.some((marker) => marker in dependencies);
|
|
33
|
+
if (!hasVeloxMarker) {
|
|
34
|
+
throw new GeneratorError(GeneratorErrorCode.NOT_IN_PROJECT, 'This does not appear to be a VeloxTS project.', 'VeloxTS packages not found in dependencies. Create a new project with: npx create-velox-app my-app');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Detect project configuration from package.json and velox config
|
|
39
|
+
*/
|
|
40
|
+
export async function detectProjectContext(cwd) {
|
|
41
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
42
|
+
if (!existsSync(packageJsonPath)) {
|
|
43
|
+
return {
|
|
44
|
+
name: 'unknown',
|
|
45
|
+
hasAuth: false,
|
|
46
|
+
database: 'sqlite',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
50
|
+
const dependencies = {
|
|
51
|
+
...packageJson.dependencies,
|
|
52
|
+
...packageJson.devDependencies,
|
|
53
|
+
};
|
|
54
|
+
// Detect auth package
|
|
55
|
+
const hasAuth = '@veloxts/auth' in dependencies;
|
|
56
|
+
// Detect database from Prisma schema or default to SQLite
|
|
57
|
+
const database = detectDatabase(cwd);
|
|
58
|
+
return {
|
|
59
|
+
name: packageJson.name ?? 'velox-app',
|
|
60
|
+
hasAuth,
|
|
61
|
+
database,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Detect database type from Prisma schema
|
|
66
|
+
*/
|
|
67
|
+
function detectDatabase(cwd) {
|
|
68
|
+
const prismaSchemaPath = join(cwd, 'prisma', 'schema.prisma');
|
|
69
|
+
if (!existsSync(prismaSchemaPath)) {
|
|
70
|
+
return 'sqlite';
|
|
71
|
+
}
|
|
72
|
+
const schema = readFileSync(prismaSchemaPath, 'utf-8');
|
|
73
|
+
if (schema.includes('provider = "postgresql"') || schema.includes('provider = "postgres"')) {
|
|
74
|
+
return 'postgresql';
|
|
75
|
+
}
|
|
76
|
+
if (schema.includes('provider = "mysql"')) {
|
|
77
|
+
return 'mysql';
|
|
78
|
+
}
|
|
79
|
+
return 'sqlite';
|
|
80
|
+
}
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// Entity Name Validation
|
|
83
|
+
// ============================================================================
|
|
84
|
+
/**
|
|
85
|
+
* Reserved words that cannot be used as entity names
|
|
86
|
+
*/
|
|
87
|
+
const RESERVED_WORDS = new Set([
|
|
88
|
+
// JavaScript/TypeScript keywords
|
|
89
|
+
'break',
|
|
90
|
+
'case',
|
|
91
|
+
'catch',
|
|
92
|
+
'class',
|
|
93
|
+
'const',
|
|
94
|
+
'continue',
|
|
95
|
+
'debugger',
|
|
96
|
+
'default',
|
|
97
|
+
'delete',
|
|
98
|
+
'do',
|
|
99
|
+
'else',
|
|
100
|
+
'enum',
|
|
101
|
+
'export',
|
|
102
|
+
'extends',
|
|
103
|
+
'false',
|
|
104
|
+
'finally',
|
|
105
|
+
'for',
|
|
106
|
+
'function',
|
|
107
|
+
'if',
|
|
108
|
+
'import',
|
|
109
|
+
'in',
|
|
110
|
+
'instanceof',
|
|
111
|
+
'let',
|
|
112
|
+
'new',
|
|
113
|
+
'null',
|
|
114
|
+
'return',
|
|
115
|
+
'static',
|
|
116
|
+
'super',
|
|
117
|
+
'switch',
|
|
118
|
+
'this',
|
|
119
|
+
'throw',
|
|
120
|
+
'true',
|
|
121
|
+
'try',
|
|
122
|
+
'typeof',
|
|
123
|
+
'var',
|
|
124
|
+
'void',
|
|
125
|
+
'while',
|
|
126
|
+
'with',
|
|
127
|
+
'yield',
|
|
128
|
+
'async',
|
|
129
|
+
'await',
|
|
130
|
+
'implements',
|
|
131
|
+
'interface',
|
|
132
|
+
'package',
|
|
133
|
+
'private',
|
|
134
|
+
'protected',
|
|
135
|
+
'public',
|
|
136
|
+
'type',
|
|
137
|
+
'any',
|
|
138
|
+
'unknown',
|
|
139
|
+
'never',
|
|
140
|
+
'object',
|
|
141
|
+
'string',
|
|
142
|
+
'number',
|
|
143
|
+
'boolean',
|
|
144
|
+
'symbol',
|
|
145
|
+
'bigint',
|
|
146
|
+
// VeloxTS reserved
|
|
147
|
+
'procedure',
|
|
148
|
+
'procedures',
|
|
149
|
+
'context',
|
|
150
|
+
'router',
|
|
151
|
+
'velox',
|
|
152
|
+
'api',
|
|
153
|
+
'query',
|
|
154
|
+
'mutation',
|
|
155
|
+
'input',
|
|
156
|
+
'output',
|
|
157
|
+
'guard',
|
|
158
|
+
'middleware',
|
|
159
|
+
]);
|
|
160
|
+
/**
|
|
161
|
+
* Validate entity name format
|
|
162
|
+
*
|
|
163
|
+
* @returns Error message if invalid, undefined if valid
|
|
164
|
+
*/
|
|
165
|
+
export function validateEntityNameDefault(name) {
|
|
166
|
+
// Must not be empty
|
|
167
|
+
if (!name || name.trim().length === 0) {
|
|
168
|
+
return 'Entity name cannot be empty';
|
|
169
|
+
}
|
|
170
|
+
// Must start with a letter
|
|
171
|
+
if (!/^[a-zA-Z]/.test(name)) {
|
|
172
|
+
return 'Entity name must start with a letter';
|
|
173
|
+
}
|
|
174
|
+
// Can only contain letters, numbers, hyphens, underscores
|
|
175
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {
|
|
176
|
+
return 'Entity name can only contain letters, numbers, hyphens, and underscores';
|
|
177
|
+
}
|
|
178
|
+
// Must not be too long
|
|
179
|
+
if (name.length > 64) {
|
|
180
|
+
return 'Entity name must be 64 characters or less';
|
|
181
|
+
}
|
|
182
|
+
// Must not be a reserved word
|
|
183
|
+
const lower = name.toLowerCase();
|
|
184
|
+
if (RESERVED_WORDS.has(lower)) {
|
|
185
|
+
return `"${name}" is a reserved word and cannot be used as an entity name`;
|
|
186
|
+
}
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
// ============================================================================
|
|
190
|
+
// Base Generator Class
|
|
191
|
+
// ============================================================================
|
|
192
|
+
/**
|
|
193
|
+
* Abstract base class for all generators.
|
|
194
|
+
* Provides common functionality and enforces the generator contract.
|
|
195
|
+
*/
|
|
196
|
+
export class BaseGenerator {
|
|
197
|
+
/**
|
|
198
|
+
* Default entity name validation.
|
|
199
|
+
* Override in subclasses for custom validation.
|
|
200
|
+
*/
|
|
201
|
+
validateEntityName(name) {
|
|
202
|
+
return validateEntityNameDefault(name);
|
|
203
|
+
}
|
|
204
|
+
// ============================================================================
|
|
205
|
+
// Helper Methods
|
|
206
|
+
// ============================================================================
|
|
207
|
+
/**
|
|
208
|
+
* Create a template context for generation
|
|
209
|
+
*/
|
|
210
|
+
createContext(config) {
|
|
211
|
+
return {
|
|
212
|
+
entity: deriveEntityNames(config.entityName),
|
|
213
|
+
project: config.project,
|
|
214
|
+
options: config.options,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Resolve output path relative to project root
|
|
219
|
+
*/
|
|
220
|
+
resolvePath(cwd, relativePath) {
|
|
221
|
+
return resolve(cwd, relativePath);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Check if a file would conflict (exists and shouldn't be overwritten)
|
|
225
|
+
*/
|
|
226
|
+
wouldConflict(filePath, strategy, force) {
|
|
227
|
+
if (force) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
if (!existsSync(filePath)) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
return strategy !== 'overwrite';
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Format a success message for generated files
|
|
237
|
+
*/
|
|
238
|
+
formatSuccessMessage(files, dryRun) {
|
|
239
|
+
const prefix = dryRun ? '[dry-run] Would create' : 'Created';
|
|
240
|
+
const fileList = files.map((f) => ` • ${f.path}`).join('\n');
|
|
241
|
+
return `${prefix}:\n${fileList}`;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// ============================================================================
|
|
245
|
+
// Configuration Helpers
|
|
246
|
+
// ============================================================================
|
|
247
|
+
/**
|
|
248
|
+
* Default generator configuration
|
|
249
|
+
*/
|
|
250
|
+
export function createDefaultConfig(entityName, options, project) {
|
|
251
|
+
return {
|
|
252
|
+
entityName,
|
|
253
|
+
options,
|
|
254
|
+
conflictStrategy: 'prompt',
|
|
255
|
+
dryRun: false,
|
|
256
|
+
force: false,
|
|
257
|
+
project,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Apply CLI flags to generator config
|
|
262
|
+
*/
|
|
263
|
+
export function applyCliFlags(config, flags) {
|
|
264
|
+
return {
|
|
265
|
+
...config,
|
|
266
|
+
dryRun: flags.dryRun ?? config.dryRun,
|
|
267
|
+
force: flags.force ?? config.force,
|
|
268
|
+
conflictStrategy: flags.force ? 'overwrite' : config.conflictStrategy,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/generators/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in Generators
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all built-in generators and provides auto-registration.
|
|
5
|
+
*/
|
|
6
|
+
export { createMigrationGenerator, MigrationGenerator } from './migration.js';
|
|
7
|
+
export { createModelGenerator, ModelGenerator } from './model.js';
|
|
8
|
+
export { createProcedureGenerator, ProcedureGenerator } from './procedure.js';
|
|
9
|
+
export { createResourceGenerator, ResourceGenerator } from './resource.js';
|
|
10
|
+
export { createSchemaGenerator, SchemaGenerator } from './schema.js';
|
|
11
|
+
export { createTestGenerator, TestGenerator } from './test.js';
|
|
12
|
+
/**
|
|
13
|
+
* Register all built-in generators with the global registry.
|
|
14
|
+
* Call this once during CLI initialization.
|
|
15
|
+
*/
|
|
16
|
+
export declare function registerBuiltinGenerators(): void;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generators/generators/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAM/D;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAkBhD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in Generators
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all built-in generators and provides auto-registration.
|
|
5
|
+
*/
|
|
6
|
+
import { registerGenerator } from '../registry.js';
|
|
7
|
+
import { createMigrationGenerator } from './migration.js';
|
|
8
|
+
import { createModelGenerator } from './model.js';
|
|
9
|
+
import { createProcedureGenerator } from './procedure.js';
|
|
10
|
+
import { createResourceGenerator } from './resource.js';
|
|
11
|
+
import { createSchemaGenerator } from './schema.js';
|
|
12
|
+
import { createTestGenerator } from './test.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Generator Exports
|
|
15
|
+
// ============================================================================
|
|
16
|
+
export { createMigrationGenerator, MigrationGenerator } from './migration.js';
|
|
17
|
+
export { createModelGenerator, ModelGenerator } from './model.js';
|
|
18
|
+
export { createProcedureGenerator, ProcedureGenerator } from './procedure.js';
|
|
19
|
+
export { createResourceGenerator, ResourceGenerator } from './resource.js';
|
|
20
|
+
export { createSchemaGenerator, SchemaGenerator } from './schema.js';
|
|
21
|
+
export { createTestGenerator, TestGenerator } from './test.js';
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Auto-Registration
|
|
24
|
+
// ============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Register all built-in generators with the global registry.
|
|
27
|
+
* Call this once during CLI initialization.
|
|
28
|
+
*/
|
|
29
|
+
export function registerBuiltinGenerators() {
|
|
30
|
+
// Register procedure generator
|
|
31
|
+
registerGenerator(createProcedureGenerator());
|
|
32
|
+
// Register model generator
|
|
33
|
+
registerGenerator(createModelGenerator());
|
|
34
|
+
// Register migration generator
|
|
35
|
+
registerGenerator(createMigrationGenerator());
|
|
36
|
+
// Register schema generator
|
|
37
|
+
registerGenerator(createSchemaGenerator());
|
|
38
|
+
// Register test generator
|
|
39
|
+
registerGenerator(createTestGenerator());
|
|
40
|
+
// Register resource generator (full stack)
|
|
41
|
+
registerGenerator(createResourceGenerator());
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generators/generators/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/D,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,yBAAyB;IACvC,+BAA+B;IAC/B,iBAAiB,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAE9C,2BAA2B;IAC3B,iBAAiB,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAE1C,+BAA+B;IAC/B,iBAAiB,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAE9C,4BAA4B;IAC5B,iBAAiB,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAE3C,0BAA0B;IAC1B,iBAAiB,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAEzC,2CAA2C;IAC3C,iBAAiB,CAAC,uBAAuB,EAAE,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates Prisma migration files with SQL scaffolding.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* velox generate migration <name> [options]
|
|
8
|
+
* velox g mig <name> [options]
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* velox generate migration create_posts
|
|
12
|
+
* velox generate migration add_email_to_users
|
|
13
|
+
* velox generate migration remove_name_from_users
|
|
14
|
+
* velox g mig rename_posts_to_articles
|
|
15
|
+
*/
|
|
16
|
+
import { BaseGenerator } from '../base.js';
|
|
17
|
+
import { type MigrationOptions } from '../templates/migration.js';
|
|
18
|
+
import type { GeneratorConfig, GeneratorMetadata, GeneratorOption, GeneratorOutput } from '../types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Migration generator - creates Prisma migration files
|
|
21
|
+
*/
|
|
22
|
+
export declare class MigrationGenerator extends BaseGenerator<MigrationOptions> {
|
|
23
|
+
readonly metadata: GeneratorMetadata;
|
|
24
|
+
readonly options: ReadonlyArray<GeneratorOption>;
|
|
25
|
+
/**
|
|
26
|
+
* Custom validation for migration names
|
|
27
|
+
* Migration names should be snake_case and descriptive
|
|
28
|
+
*/
|
|
29
|
+
validateEntityName(name: string): string | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Validate and transform raw options
|
|
32
|
+
*/
|
|
33
|
+
validateOptions(raw: Record<string, unknown>): MigrationOptions;
|
|
34
|
+
/**
|
|
35
|
+
* Generate migration files
|
|
36
|
+
*/
|
|
37
|
+
generate(config: GeneratorConfig<MigrationOptions>): Promise<GeneratorOutput>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create a new migration generator instance
|
|
41
|
+
*/
|
|
42
|
+
export declare function createMigrationGenerator(): MigrationGenerator;
|
|
43
|
+
//# sourceMappingURL=migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/generators/generators/migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAwB,MAAM,YAAY,CAAC;AACjE,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EAChB,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,gBAAgB,CAAC;IACrE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAsBlC;IAEF,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,CAS9C;IAEF;;;OAGG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAiBpD;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB;IAa/D;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAwBpF;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates Prisma migration files with SQL scaffolding.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* velox generate migration <name> [options]
|
|
8
|
+
* velox g mig <name> [options]
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* velox generate migration create_posts
|
|
12
|
+
* velox generate migration add_email_to_users
|
|
13
|
+
* velox generate migration remove_name_from_users
|
|
14
|
+
* velox g mig rename_posts_to_articles
|
|
15
|
+
*/
|
|
16
|
+
import { BaseGenerator, detectProjectContext } from '../base.js';
|
|
17
|
+
import { generateMigrationFiles, getMigrationInstructions, } from '../templates/migration.js';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Generator Implementation
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Migration generator - creates Prisma migration files
|
|
23
|
+
*/
|
|
24
|
+
export class MigrationGenerator extends BaseGenerator {
|
|
25
|
+
metadata = {
|
|
26
|
+
name: 'migration',
|
|
27
|
+
description: 'Generate a database migration file',
|
|
28
|
+
longDescription: `
|
|
29
|
+
Generate a Prisma-compatible migration file with SQL scaffolding.
|
|
30
|
+
|
|
31
|
+
The migration name determines the SQL template:
|
|
32
|
+
create_<table> → CREATE TABLE scaffold
|
|
33
|
+
add_<column>_to_<table> → ALTER TABLE ADD COLUMN
|
|
34
|
+
remove_<column>_from_<table> → ALTER TABLE DROP COLUMN
|
|
35
|
+
rename_<old>_to_<new> → RENAME TABLE
|
|
36
|
+
drop_<table> → DROP TABLE
|
|
37
|
+
<anything_else> → Custom migration template
|
|
38
|
+
|
|
39
|
+
Examples:
|
|
40
|
+
velox generate migration create_posts
|
|
41
|
+
velox generate migration add_slug_to_posts
|
|
42
|
+
velox generate migration remove_legacy_field_from_users
|
|
43
|
+
velox g mig rename_posts_to_articles
|
|
44
|
+
`,
|
|
45
|
+
aliases: ['mig'],
|
|
46
|
+
category: 'database',
|
|
47
|
+
};
|
|
48
|
+
options = [
|
|
49
|
+
{
|
|
50
|
+
name: 'database',
|
|
51
|
+
short: 'D',
|
|
52
|
+
description: 'Database type (sqlite, postgresql, mysql)',
|
|
53
|
+
type: 'string',
|
|
54
|
+
choices: ['sqlite', 'postgresql', 'mysql'],
|
|
55
|
+
default: 'sqlite',
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
/**
|
|
59
|
+
* Custom validation for migration names
|
|
60
|
+
* Migration names should be snake_case and descriptive
|
|
61
|
+
*/
|
|
62
|
+
validateEntityName(name) {
|
|
63
|
+
if (!name || name.trim().length === 0) {
|
|
64
|
+
return 'Migration name cannot be empty';
|
|
65
|
+
}
|
|
66
|
+
// Must be snake_case or kebab-case
|
|
67
|
+
if (!/^[a-z][a-z0-9_-]*$/.test(name)) {
|
|
68
|
+
return 'Migration name must be lowercase with underscores or hyphens (e.g., create_users)';
|
|
69
|
+
}
|
|
70
|
+
if (name.length > 100) {
|
|
71
|
+
return 'Migration name must be 100 characters or less';
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Validate and transform raw options
|
|
77
|
+
*/
|
|
78
|
+
validateOptions(raw) {
|
|
79
|
+
const database = raw.database;
|
|
80
|
+
// Validate database type
|
|
81
|
+
if (database && !['sqlite', 'postgresql', 'mysql'].includes(database)) {
|
|
82
|
+
throw new Error(`Invalid database type: ${database}. Use sqlite, postgresql, or mysql.`);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
database: database ?? 'sqlite',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Generate migration files
|
|
90
|
+
*/
|
|
91
|
+
async generate(config) {
|
|
92
|
+
// Auto-detect database type from project if not specified
|
|
93
|
+
let options = config.options;
|
|
94
|
+
if (!config.options.database || config.options.database === 'sqlite') {
|
|
95
|
+
const project = await detectProjectContext(config.cwd);
|
|
96
|
+
options = { ...config.options, database: project.database };
|
|
97
|
+
}
|
|
98
|
+
const context = this.createContext({
|
|
99
|
+
...config,
|
|
100
|
+
options,
|
|
101
|
+
});
|
|
102
|
+
// Generate migration files
|
|
103
|
+
const files = generateMigrationFiles(context);
|
|
104
|
+
// Generate post-creation instructions
|
|
105
|
+
const postInstructions = getMigrationInstructions(context.entity.snake);
|
|
106
|
+
return {
|
|
107
|
+
files,
|
|
108
|
+
postInstructions,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// ============================================================================
|
|
113
|
+
// Export
|
|
114
|
+
// ============================================================================
|
|
115
|
+
/**
|
|
116
|
+
* Create a new migration generator instance
|
|
117
|
+
*/
|
|
118
|
+
export function createMigrationGenerator() {
|
|
119
|
+
return new MigrationGenerator();
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../../src/generators/generators/migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,2BAA2B,CAAC;AAQnC,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,aAA+B;IAC5D,QAAQ,GAAsB;QACrC,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,oCAAoC;QACjD,eAAe,EAAE;;;;;;;;;;;;;;;;CAgBpB;QACG,OAAO,EAAE,CAAC,KAAK,CAAC;QAChB,QAAQ,EAAE,UAAU;KACrB,CAAC;IAEO,OAAO,GAAmC;QACjD;YACE,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,2CAA2C;YACxD,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC;YAC1C,OAAO,EAAE,QAAQ;SAClB;KACF,CAAC;IAEF;;;OAGG;IACH,kBAAkB,CAAC,IAAY;QAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,gCAAgC,CAAC;QAC1C,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,OAAO,mFAAmF,CAAC;QAC7F,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACtB,OAAO,+CAA+C,CAAC;QACzD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,GAA4B;QAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA8B,CAAC;QAEpD,yBAAyB;QACzB,IAAI,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,qCAAqC,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO;YACL,QAAQ,EAAG,QAAyC,IAAI,QAAQ;SACjE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAyC;QACtD,0DAA0D;QAC1D,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvD,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC9D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC;YACjC,GAAG,MAAM;YACT,OAAO;SACR,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAE9C,sCAAsC;QACtC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAExE,OAAO;YACL,KAAK;YACL,gBAAgB;SACjB,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,kBAAkB,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates Prisma model, Zod schema, and optionally procedures.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* velox generate model <name> [options]
|
|
8
|
+
* velox g m <name> [options]
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* velox generate model Post # Model + schema only
|
|
12
|
+
* velox generate model Comment --crud # Model + schema + procedures
|
|
13
|
+
* velox g m Order --crud --paginated # With pagination
|
|
14
|
+
* velox g m Article --soft-delete # With soft delete support
|
|
15
|
+
*/
|
|
16
|
+
import { BaseGenerator } from '../base.js';
|
|
17
|
+
import { type ModelOptions } from '../templates/model.js';
|
|
18
|
+
import type { GeneratorConfig, GeneratorMetadata, GeneratorOption, GeneratorOutput } from '../types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Model generator - creates Prisma model, Zod schema, and procedures
|
|
21
|
+
*/
|
|
22
|
+
export declare class ModelGenerator extends BaseGenerator<ModelOptions> {
|
|
23
|
+
readonly metadata: GeneratorMetadata;
|
|
24
|
+
readonly options: ReadonlyArray<GeneratorOption>;
|
|
25
|
+
/**
|
|
26
|
+
* Validate and transform raw options
|
|
27
|
+
*/
|
|
28
|
+
validateOptions(raw: Record<string, unknown>): ModelOptions;
|
|
29
|
+
/**
|
|
30
|
+
* Generate model files
|
|
31
|
+
*/
|
|
32
|
+
generate(config: GeneratorConfig<ModelOptions>): Promise<GeneratorOutput>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a new model generator instance
|
|
36
|
+
*/
|
|
37
|
+
export declare function createModelGenerator(): ModelGenerator;
|
|
38
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/generators/generators/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAA4C,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EAChB,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,qBAAa,cAAe,SAAQ,aAAa,CAAC,YAAY,CAAC;IAC7D,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAiBlC;IAEF,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,CA6B9C;IAEF;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;IAS3D;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAchF;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates Prisma model, Zod schema, and optionally procedures.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* velox generate model <name> [options]
|
|
8
|
+
* velox g m <name> [options]
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* velox generate model Post # Model + schema only
|
|
12
|
+
* velox generate model Comment --crud # Model + schema + procedures
|
|
13
|
+
* velox g m Order --crud --paginated # With pagination
|
|
14
|
+
* velox g m Article --soft-delete # With soft delete support
|
|
15
|
+
*/
|
|
16
|
+
import { BaseGenerator } from '../base.js';
|
|
17
|
+
import { generateModelFiles, getModelInstructions } from '../templates/model.js';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Generator Implementation
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Model generator - creates Prisma model, Zod schema, and procedures
|
|
23
|
+
*/
|
|
24
|
+
export class ModelGenerator extends BaseGenerator {
|
|
25
|
+
metadata = {
|
|
26
|
+
name: 'model',
|
|
27
|
+
description: 'Generate a Prisma model with Zod schema and optional procedures',
|
|
28
|
+
longDescription: `
|
|
29
|
+
Generate a complete model including:
|
|
30
|
+
- Prisma model definition (saved to prisma/models/ for easy copying)
|
|
31
|
+
- Zod validation schemas (input/output)
|
|
32
|
+
- CRUD procedures (with --crud flag)
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
velox generate model Post # Model + schema only
|
|
36
|
+
velox generate model Comment --crud # With CRUD procedures
|
|
37
|
+
velox g m Order --crud --paginated # With pagination
|
|
38
|
+
velox g m Article --soft-delete # With soft delete
|
|
39
|
+
`,
|
|
40
|
+
aliases: ['m'],
|
|
41
|
+
category: 'resource',
|
|
42
|
+
};
|
|
43
|
+
options = [
|
|
44
|
+
{
|
|
45
|
+
name: 'crud',
|
|
46
|
+
short: 'c',
|
|
47
|
+
description: 'Generate CRUD procedures alongside the model',
|
|
48
|
+
type: 'boolean',
|
|
49
|
+
default: false,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'paginated',
|
|
53
|
+
short: 'P',
|
|
54
|
+
description: 'Include pagination for list operation (with --crud)',
|
|
55
|
+
type: 'boolean',
|
|
56
|
+
default: false,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'soft-delete',
|
|
60
|
+
short: 's',
|
|
61
|
+
description: 'Add soft delete support (deletedAt field)',
|
|
62
|
+
type: 'boolean',
|
|
63
|
+
default: false,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'timestamps',
|
|
67
|
+
short: 't',
|
|
68
|
+
description: 'Include timestamps (createdAt, updatedAt)',
|
|
69
|
+
type: 'boolean',
|
|
70
|
+
default: true,
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
/**
|
|
74
|
+
* Validate and transform raw options
|
|
75
|
+
*/
|
|
76
|
+
validateOptions(raw) {
|
|
77
|
+
return {
|
|
78
|
+
crud: Boolean(raw.crud ?? false),
|
|
79
|
+
paginated: Boolean(raw.paginated ?? false),
|
|
80
|
+
softDelete: Boolean(raw['soft-delete'] ?? raw.softDelete ?? false),
|
|
81
|
+
timestamps: Boolean(raw.timestamps ?? true),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Generate model files
|
|
86
|
+
*/
|
|
87
|
+
async generate(config) {
|
|
88
|
+
const context = this.createContext(config);
|
|
89
|
+
// Generate all model files
|
|
90
|
+
const files = generateModelFiles(context);
|
|
91
|
+
// Generate post-creation instructions
|
|
92
|
+
const postInstructions = getModelInstructions(context);
|
|
93
|
+
return {
|
|
94
|
+
files,
|
|
95
|
+
postInstructions,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// ============================================================================
|
|
100
|
+
// Export
|
|
101
|
+
// ============================================================================
|
|
102
|
+
/**
|
|
103
|
+
* Create a new model generator instance
|
|
104
|
+
*/
|
|
105
|
+
export function createModelGenerator() {
|
|
106
|
+
return new ModelGenerator();
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=model.js.map
|