@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.
Files changed (139) hide show
  1. package/dist/cli.js +2 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/generate.d.ts +17 -0
  4. package/dist/commands/generate.d.ts.map +1 -0
  5. package/dist/commands/generate.js +219 -0
  6. package/dist/commands/generate.js.map +1 -0
  7. package/dist/commands/migrate.d.ts +8 -3
  8. package/dist/commands/migrate.d.ts.map +1 -1
  9. package/dist/commands/migrate.js +17 -123
  10. package/dist/commands/migrate.js.map +1 -1
  11. package/dist/generators/base.d.ts +76 -0
  12. package/dist/generators/base.d.ts.map +1 -0
  13. package/dist/generators/base.js +271 -0
  14. package/dist/generators/base.js.map +1 -0
  15. package/dist/generators/generators/index.d.ts +17 -0
  16. package/dist/generators/generators/index.d.ts.map +1 -0
  17. package/dist/generators/generators/index.js +43 -0
  18. package/dist/generators/generators/index.js.map +1 -0
  19. package/dist/generators/generators/migration.d.ts +43 -0
  20. package/dist/generators/generators/migration.d.ts.map +1 -0
  21. package/dist/generators/generators/migration.js +121 -0
  22. package/dist/generators/generators/migration.js.map +1 -0
  23. package/dist/generators/generators/model.d.ts +38 -0
  24. package/dist/generators/generators/model.d.ts.map +1 -0
  25. package/dist/generators/generators/model.js +108 -0
  26. package/dist/generators/generators/model.js.map +1 -0
  27. package/dist/generators/generators/procedure.d.ts +37 -0
  28. package/dist/generators/generators/procedure.d.ts.map +1 -0
  29. package/dist/generators/generators/procedure.js +99 -0
  30. package/dist/generators/generators/procedure.js.map +1 -0
  31. package/dist/generators/generators/resource.d.ts +29 -0
  32. package/dist/generators/generators/resource.d.ts.map +1 -0
  33. package/dist/generators/generators/resource.js +124 -0
  34. package/dist/generators/generators/resource.js.map +1 -0
  35. package/dist/generators/generators/schema.d.ts +28 -0
  36. package/dist/generators/generators/schema.d.ts.map +1 -0
  37. package/dist/generators/generators/schema.js +83 -0
  38. package/dist/generators/generators/schema.js.map +1 -0
  39. package/dist/generators/generators/test.d.ts +28 -0
  40. package/dist/generators/generators/test.d.ts.map +1 -0
  41. package/dist/generators/generators/test.js +96 -0
  42. package/dist/generators/generators/test.js.map +1 -0
  43. package/dist/generators/index.d.ts +16 -0
  44. package/dist/generators/index.d.ts.map +1 -0
  45. package/dist/generators/index.js +16 -0
  46. package/dist/generators/index.js.map +1 -0
  47. package/dist/generators/registry.d.ts +97 -0
  48. package/dist/generators/registry.d.ts.map +1 -0
  49. package/dist/generators/registry.js +253 -0
  50. package/dist/generators/registry.js.map +1 -0
  51. package/dist/generators/templates/migration.d.ts +23 -0
  52. package/dist/generators/templates/migration.d.ts.map +1 -0
  53. package/dist/generators/templates/migration.js +389 -0
  54. package/dist/generators/templates/migration.js.map +1 -0
  55. package/dist/generators/templates/model.d.ts +37 -0
  56. package/dist/generators/templates/model.d.ts.map +1 -0
  57. package/dist/generators/templates/model.js +374 -0
  58. package/dist/generators/templates/model.js.map +1 -0
  59. package/dist/generators/templates/procedure.d.ts +25 -0
  60. package/dist/generators/templates/procedure.d.ts.map +1 -0
  61. package/dist/generators/templates/procedure.js +274 -0
  62. package/dist/generators/templates/procedure.js.map +1 -0
  63. package/dist/generators/templates/resource.d.ts +34 -0
  64. package/dist/generators/templates/resource.d.ts.map +1 -0
  65. package/dist/generators/templates/resource.js +550 -0
  66. package/dist/generators/templates/resource.js.map +1 -0
  67. package/dist/generators/templates/schema.d.ts +33 -0
  68. package/dist/generators/templates/schema.d.ts.map +1 -0
  69. package/dist/generators/templates/schema.js +248 -0
  70. package/dist/generators/templates/schema.js.map +1 -0
  71. package/dist/generators/templates/test.d.ts +31 -0
  72. package/dist/generators/templates/test.d.ts.map +1 -0
  73. package/dist/generators/templates/test.js +882 -0
  74. package/dist/generators/templates/test.js.map +1 -0
  75. package/dist/generators/types.d.ts +211 -0
  76. package/dist/generators/types.d.ts.map +1 -0
  77. package/dist/generators/types.js +54 -0
  78. package/dist/generators/types.js.map +1 -0
  79. package/dist/generators/utils/filesystem.d.ts +68 -0
  80. package/dist/generators/utils/filesystem.d.ts.map +1 -0
  81. package/dist/generators/utils/filesystem.js +217 -0
  82. package/dist/generators/utils/filesystem.js.map +1 -0
  83. package/dist/generators/utils/naming.d.ts +122 -0
  84. package/dist/generators/utils/naming.d.ts.map +1 -0
  85. package/dist/generators/utils/naming.js +198 -0
  86. package/dist/generators/utils/naming.js.map +1 -0
  87. package/dist/index.d.ts +4 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +4 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/migrations/commands/fresh.d.ts +11 -0
  92. package/dist/migrations/commands/fresh.d.ts.map +1 -0
  93. package/dist/migrations/commands/fresh.js +164 -0
  94. package/dist/migrations/commands/fresh.js.map +1 -0
  95. package/dist/migrations/commands/index.d.ts +11 -0
  96. package/dist/migrations/commands/index.d.ts.map +1 -0
  97. package/dist/migrations/commands/index.js +11 -0
  98. package/dist/migrations/commands/index.js.map +1 -0
  99. package/dist/migrations/commands/reset.d.ts +11 -0
  100. package/dist/migrations/commands/reset.d.ts.map +1 -0
  101. package/dist/migrations/commands/reset.js +258 -0
  102. package/dist/migrations/commands/reset.js.map +1 -0
  103. package/dist/migrations/commands/rollback.d.ts +11 -0
  104. package/dist/migrations/commands/rollback.d.ts.map +1 -0
  105. package/dist/migrations/commands/rollback.js +241 -0
  106. package/dist/migrations/commands/rollback.js.map +1 -0
  107. package/dist/migrations/commands/run.d.ts +11 -0
  108. package/dist/migrations/commands/run.d.ts.map +1 -0
  109. package/dist/migrations/commands/run.js +183 -0
  110. package/dist/migrations/commands/run.js.map +1 -0
  111. package/dist/migrations/commands/status.d.ts +11 -0
  112. package/dist/migrations/commands/status.d.ts.map +1 -0
  113. package/dist/migrations/commands/status.js +154 -0
  114. package/dist/migrations/commands/status.js.map +1 -0
  115. package/dist/migrations/errors.d.ts +74 -0
  116. package/dist/migrations/errors.d.ts.map +1 -0
  117. package/dist/migrations/errors.js +155 -0
  118. package/dist/migrations/errors.js.map +1 -0
  119. package/dist/migrations/index.d.ts +13 -0
  120. package/dist/migrations/index.d.ts.map +1 -0
  121. package/dist/migrations/index.js +17 -0
  122. package/dist/migrations/index.js.map +1 -0
  123. package/dist/migrations/loader.d.ts +44 -0
  124. package/dist/migrations/loader.d.ts.map +1 -0
  125. package/dist/migrations/loader.js +181 -0
  126. package/dist/migrations/loader.js.map +1 -0
  127. package/dist/migrations/prisma-wrapper.d.ts +60 -0
  128. package/dist/migrations/prisma-wrapper.d.ts.map +1 -0
  129. package/dist/migrations/prisma-wrapper.js +184 -0
  130. package/dist/migrations/prisma-wrapper.js.map +1 -0
  131. package/dist/migrations/rollback-runner.d.ts +40 -0
  132. package/dist/migrations/rollback-runner.d.ts.map +1 -0
  133. package/dist/migrations/rollback-runner.js +191 -0
  134. package/dist/migrations/rollback-runner.js.map +1 -0
  135. package/dist/migrations/types.d.ts +214 -0
  136. package/dist/migrations/types.d.ts.map +1 -0
  137. package/dist/migrations/types.js +19 -0
  138. package/dist/migrations/types.js.map +1 -0
  139. 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