@veloxts/cli 0.4.14 → 0.6.23
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/README.md +2 -48
- package/dist/cli.d.ts +5 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +71 -7
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/introspect.d.ts +16 -0
- package/dist/commands/introspect.d.ts.map +1 -0
- package/dist/commands/introspect.js +559 -0
- package/dist/commands/introspect.js.map +1 -0
- package/dist/commands/make.d.ts.map +1 -1
- package/dist/commands/make.js +18 -8
- package/dist/commands/make.js.map +1 -1
- package/dist/commands/procedures.d.ts.map +1 -1
- package/dist/commands/procedures.js +16 -0
- package/dist/commands/procedures.js.map +1 -1
- package/dist/dev/error-parser.d.ts.map +1 -1
- package/dist/dev/error-parser.js +24 -8
- package/dist/dev/error-parser.js.map +1 -1
- package/dist/dev/hmr-runner.d.ts.map +1 -1
- package/dist/dev/hmr-runner.js +6 -1
- package/dist/dev/hmr-runner.js.map +1 -1
- package/dist/dev/index.d.ts +3 -3
- package/dist/dev/index.d.ts.map +1 -1
- package/dist/dev/index.js +3 -3
- package/dist/dev/index.js.map +1 -1
- package/dist/dev/reload-reporter.d.ts +2 -2
- package/dist/dev/reload-reporter.d.ts.map +1 -1
- package/dist/dev/reload-reporter.js +2 -2
- package/dist/dev/reload-reporter.js.map +1 -1
- package/dist/errors/catalog.d.ts +48 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +421 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/errors/index.d.ts +26 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +28 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/velox-error.d.ts +122 -0
- package/dist/errors/velox-error.d.ts.map +1 -0
- package/dist/errors/velox-error.js +216 -0
- package/dist/errors/velox-error.js.map +1 -0
- package/dist/generators/base.d.ts.map +1 -1
- package/dist/generators/base.js +26 -0
- package/dist/generators/base.js.map +1 -1
- package/dist/generators/fields/__tests__/helpers.d.ts +66 -0
- package/dist/generators/fields/__tests__/helpers.d.ts.map +1 -0
- package/dist/generators/fields/__tests__/helpers.js +142 -0
- package/dist/generators/fields/__tests__/helpers.js.map +1 -0
- package/dist/generators/fields/actions.d.ts +58 -0
- package/dist/generators/fields/actions.d.ts.map +1 -0
- package/dist/generators/fields/actions.js +230 -0
- package/dist/generators/fields/actions.js.map +1 -0
- package/dist/generators/fields/display.d.ts +28 -0
- package/dist/generators/fields/display.d.ts.map +1 -0
- package/dist/generators/fields/display.js +214 -0
- package/dist/generators/fields/display.js.map +1 -0
- package/dist/generators/fields/index.d.ts +12 -0
- package/dist/generators/fields/index.d.ts.map +1 -0
- package/dist/generators/fields/index.js +12 -0
- package/dist/generators/fields/index.js.map +1 -0
- package/dist/generators/fields/prompts.d.ts +31 -0
- package/dist/generators/fields/prompts.d.ts.map +1 -0
- package/dist/generators/fields/prompts.js +366 -0
- package/dist/generators/fields/prompts.js.map +1 -0
- package/dist/generators/fields/templates.d.ts +49 -0
- package/dist/generators/fields/templates.d.ts.map +1 -0
- package/dist/generators/fields/templates.js +230 -0
- package/dist/generators/fields/templates.js.map +1 -0
- package/dist/generators/fields/types.d.ts +95 -0
- package/dist/generators/fields/types.d.ts.map +1 -0
- package/dist/generators/fields/types.js +150 -0
- package/dist/generators/fields/types.js.map +1 -0
- package/dist/generators/generators/action.d.ts +37 -0
- package/dist/generators/generators/action.d.ts.map +1 -0
- package/dist/generators/generators/action.js +109 -0
- package/dist/generators/generators/action.js.map +1 -0
- package/dist/generators/generators/exception.d.ts +38 -0
- package/dist/generators/generators/exception.d.ts.map +1 -0
- package/dist/generators/generators/exception.js +109 -0
- package/dist/generators/generators/exception.js.map +1 -0
- package/dist/generators/generators/guard.d.ts +38 -0
- package/dist/generators/generators/guard.d.ts.map +1 -0
- package/dist/generators/generators/guard.js +109 -0
- package/dist/generators/generators/guard.js.map +1 -0
- package/dist/generators/generators/index.d.ts +8 -0
- package/dist/generators/generators/index.d.ts.map +1 -1
- package/dist/generators/generators/index.js +27 -0
- package/dist/generators/generators/index.js.map +1 -1
- package/dist/generators/generators/layout.d.ts +36 -0
- package/dist/generators/generators/layout.d.ts.map +1 -0
- package/dist/generators/generators/layout.js +111 -0
- package/dist/generators/generators/layout.js.map +1 -0
- package/dist/generators/generators/middleware.d.ts +38 -0
- package/dist/generators/generators/middleware.d.ts.map +1 -0
- package/dist/generators/generators/middleware.js +109 -0
- package/dist/generators/generators/middleware.js.map +1 -0
- package/dist/generators/generators/model.d.ts +16 -4
- package/dist/generators/generators/model.d.ts.map +1 -1
- package/dist/generators/generators/model.js +88 -7
- package/dist/generators/generators/model.js.map +1 -1
- package/dist/generators/generators/page.d.ts +36 -0
- package/dist/generators/generators/page.d.ts.map +1 -0
- package/dist/generators/generators/page.js +112 -0
- package/dist/generators/generators/page.js.map +1 -0
- package/dist/generators/generators/policy.d.ts +37 -0
- package/dist/generators/generators/policy.d.ts.map +1 -0
- package/dist/generators/generators/policy.js +100 -0
- package/dist/generators/generators/policy.js.map +1 -0
- package/dist/generators/generators/resource.d.ts +42 -4
- package/dist/generators/generators/resource.d.ts.map +1 -1
- package/dist/generators/generators/resource.js +450 -9
- package/dist/generators/generators/resource.js.map +1 -1
- package/dist/generators/generators/service.d.ts +38 -0
- package/dist/generators/generators/service.d.ts.map +1 -0
- package/dist/generators/generators/service.js +109 -0
- package/dist/generators/generators/service.js.map +1 -0
- package/dist/generators/registry.d.ts.map +1 -1
- package/dist/generators/registry.js +10 -1
- package/dist/generators/registry.js.map +1 -1
- package/dist/generators/templates/action.d.ts +28 -0
- package/dist/generators/templates/action.d.ts.map +1 -0
- package/dist/generators/templates/action.js +359 -0
- package/dist/generators/templates/action.js.map +1 -0
- package/dist/generators/templates/exception.d.ts +26 -0
- package/dist/generators/templates/exception.d.ts.map +1 -0
- package/dist/generators/templates/exception.js +671 -0
- package/dist/generators/templates/exception.js.map +1 -0
- package/dist/generators/templates/guard.d.ts +26 -0
- package/dist/generators/templates/guard.d.ts.map +1 -0
- package/dist/generators/templates/guard.js +555 -0
- package/dist/generators/templates/guard.js.map +1 -0
- package/dist/generators/templates/layout.d.ts +28 -0
- package/dist/generators/templates/layout.d.ts.map +1 -0
- package/dist/generators/templates/layout.js +147 -0
- package/dist/generators/templates/layout.js.map +1 -0
- package/dist/generators/templates/middleware.d.ts +26 -0
- package/dist/generators/templates/middleware.d.ts.map +1 -0
- package/dist/generators/templates/middleware.js +411 -0
- package/dist/generators/templates/middleware.js.map +1 -0
- package/dist/generators/templates/model.d.ts +3 -0
- package/dist/generators/templates/model.d.ts.map +1 -1
- package/dist/generators/templates/model.js +183 -28
- package/dist/generators/templates/model.js.map +1 -1
- package/dist/generators/templates/page.d.ts +36 -0
- package/dist/generators/templates/page.d.ts.map +1 -0
- package/dist/generators/templates/page.js +147 -0
- package/dist/generators/templates/page.js.map +1 -0
- package/dist/generators/templates/policy.d.ts +24 -0
- package/dist/generators/templates/policy.d.ts.map +1 -0
- package/dist/generators/templates/policy.js +499 -0
- package/dist/generators/templates/policy.js.map +1 -0
- package/dist/generators/templates/resource.d.ts +65 -0
- package/dist/generators/templates/resource.d.ts.map +1 -1
- package/dist/generators/templates/resource.js +228 -43
- package/dist/generators/templates/resource.js.map +1 -1
- package/dist/generators/templates/service.d.ts +26 -0
- package/dist/generators/templates/service.d.ts.map +1 -0
- package/dist/generators/templates/service.js +511 -0
- package/dist/generators/templates/service.js.map +1 -0
- package/dist/generators/types.d.ts +26 -14
- package/dist/generators/types.d.ts.map +1 -1
- package/dist/generators/types.js +8 -25
- package/dist/generators/types.js.map +1 -1
- package/dist/generators/utils/ast-helpers.d.ts +147 -0
- package/dist/generators/utils/ast-helpers.d.ts.map +1 -0
- package/dist/generators/utils/ast-helpers.js +350 -0
- package/dist/generators/utils/ast-helpers.js.map +1 -0
- package/dist/generators/utils/prisma-migration.d.ts +59 -0
- package/dist/generators/utils/prisma-migration.d.ts.map +1 -0
- package/dist/generators/utils/prisma-migration.js +161 -0
- package/dist/generators/utils/prisma-migration.js.map +1 -0
- package/dist/generators/utils/prisma-schema.d.ts +97 -0
- package/dist/generators/utils/prisma-schema.d.ts.map +1 -0
- package/dist/generators/utils/prisma-schema.js +235 -0
- package/dist/generators/utils/prisma-schema.js.map +1 -0
- package/dist/generators/utils/router-integration.d.ts +70 -0
- package/dist/generators/utils/router-integration.d.ts.map +1 -0
- package/dist/generators/utils/router-integration.js +305 -0
- package/dist/generators/utils/router-integration.js.map +1 -0
- package/dist/generators/utils/snapshot.d.ts +93 -0
- package/dist/generators/utils/snapshot.d.ts.map +1 -0
- package/dist/generators/utils/snapshot.js +178 -0
- package/dist/generators/utils/snapshot.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/seeding/errors.d.ts +11 -24
- package/dist/seeding/errors.d.ts.map +1 -1
- package/dist/seeding/errors.js +11 -50
- package/dist/seeding/errors.js.map +1 -1
- package/dist/utils/paths.d.ts +19 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +45 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/schema-patterns.d.ts +26 -0
- package/dist/utils/schema-patterns.d.ts.map +1 -0
- package/dist/utils/schema-patterns.js +40 -0
- package/dist/utils/schema-patterns.js.map +1 -0
- package/package.json +12 -10
|
@@ -3,9 +3,24 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Generates a complete resource with model, schema, procedures, and tests.
|
|
5
5
|
* This is the "full stack" generator for quickly scaffolding new entities.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Auto-injects Prisma models into schema.prisma
|
|
9
|
+
* - Auto-registers procedures in detected router pattern
|
|
10
|
+
* - Optional automatic Prisma migration
|
|
11
|
+
* - Snapshot/rollback for safe file operations
|
|
6
12
|
*/
|
|
13
|
+
import { writeFileSync } from 'node:fs';
|
|
14
|
+
import * as p from '@clack/prompts';
|
|
15
|
+
import pc from 'picocolors';
|
|
7
16
|
import { BaseGenerator } from '../base.js';
|
|
8
|
-
import {
|
|
17
|
+
import { collectFields } from '../fields/index.js';
|
|
18
|
+
import { generateInjectablePrismaContent, generateResourceFiles, } from '../templates/resource.js';
|
|
19
|
+
import { deriveEntityNames } from '../utils/naming.js';
|
|
20
|
+
import { promptAndRunMigration } from '../utils/prisma-migration.js';
|
|
21
|
+
import { analyzePrismaSchema, findPrismaSchema, hasModel, injectIntoSchema, } from '../utils/prisma-schema.js';
|
|
22
|
+
import { detectRouterPattern, isProcedureRegistered, registerProcedures, } from '../utils/router-integration.js';
|
|
23
|
+
import { createSnapshot, rollback, saveOriginal, trackCreated, } from '../utils/snapshot.js';
|
|
9
24
|
// ============================================================================
|
|
10
25
|
// Generator Metadata
|
|
11
26
|
// ============================================================================
|
|
@@ -75,10 +90,43 @@ const options = [
|
|
|
75
90
|
default: false,
|
|
76
91
|
flag: '--skip-procedure',
|
|
77
92
|
},
|
|
93
|
+
{
|
|
94
|
+
name: 'interactive',
|
|
95
|
+
type: 'boolean',
|
|
96
|
+
description: 'Interactively define fields',
|
|
97
|
+
default: false,
|
|
98
|
+
flag: '-i, --interactive',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'skipFields',
|
|
102
|
+
type: 'boolean',
|
|
103
|
+
description: 'Skip field prompts (generate skeleton only)',
|
|
104
|
+
default: false,
|
|
105
|
+
flag: '--skip-fields',
|
|
106
|
+
},
|
|
107
|
+
// Auto-registration options
|
|
108
|
+
{
|
|
109
|
+
name: 'skipRegistration',
|
|
110
|
+
type: 'boolean',
|
|
111
|
+
description: 'Skip auto-registering procedures in router',
|
|
112
|
+
default: false,
|
|
113
|
+
flag: '--skip-registration',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'skipMigration',
|
|
117
|
+
type: 'boolean',
|
|
118
|
+
description: 'Skip Prisma migration prompt',
|
|
119
|
+
default: false,
|
|
120
|
+
flag: '--skip-migration',
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: 'autoMigrate',
|
|
124
|
+
type: 'boolean',
|
|
125
|
+
description: 'Auto-run Prisma migration without prompting',
|
|
126
|
+
default: false,
|
|
127
|
+
flag: '--auto-migrate',
|
|
128
|
+
},
|
|
78
129
|
];
|
|
79
|
-
// ============================================================================
|
|
80
|
-
// Generator Class
|
|
81
|
-
// ============================================================================
|
|
82
130
|
/**
|
|
83
131
|
* Resource generator implementation
|
|
84
132
|
*/
|
|
@@ -98,19 +146,412 @@ export class ResourceGenerator extends BaseGenerator {
|
|
|
98
146
|
skipModel: Boolean(rawOptions.skipModel ?? false),
|
|
99
147
|
skipSchema: Boolean(rawOptions.skipSchema ?? false),
|
|
100
148
|
skipProcedure: Boolean(rawOptions.skipProcedure ?? false),
|
|
149
|
+
interactive: Boolean(rawOptions.interactive ?? false),
|
|
150
|
+
skipFields: Boolean(rawOptions.skipFields ?? false),
|
|
151
|
+
// Auto-registration options
|
|
152
|
+
skipRegistration: Boolean(rawOptions.skipRegistration ?? false),
|
|
153
|
+
skipMigration: Boolean(rawOptions.skipMigration ?? false),
|
|
154
|
+
autoMigrate: Boolean(rawOptions.autoMigrate ?? false),
|
|
101
155
|
};
|
|
102
156
|
}
|
|
103
157
|
/**
|
|
104
|
-
* Generate resource files
|
|
158
|
+
* Generate resource files with optional interactive field collection
|
|
159
|
+
* and automatic Prisma/router integration
|
|
105
160
|
*/
|
|
106
161
|
async generate(config) {
|
|
107
|
-
const
|
|
108
|
-
|
|
162
|
+
const { interactive, skipFields, skipRegistration, skipMigration, autoMigrate } = config.options;
|
|
163
|
+
// Collect fields interactively if not skipped and in interactive mode
|
|
164
|
+
let fields = [];
|
|
165
|
+
if (interactive && !skipFields && !config.dryRun) {
|
|
166
|
+
const fieldResult = await this.collectFieldsInteractively(config.entityName);
|
|
167
|
+
if (fieldResult.cancelled) {
|
|
168
|
+
// User cancelled - return empty output
|
|
169
|
+
return {
|
|
170
|
+
files: [],
|
|
171
|
+
postInstructions: 'Operation cancelled by user.',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
fields = fieldResult.fields;
|
|
175
|
+
// Field collection already shows summary and confirms with user
|
|
176
|
+
}
|
|
177
|
+
// Build template options (without CLI-only flags)
|
|
178
|
+
const templateOptions = {
|
|
179
|
+
crud: config.options.crud,
|
|
180
|
+
paginated: config.options.paginated,
|
|
181
|
+
softDelete: config.options.softDelete,
|
|
182
|
+
timestamps: config.options.timestamps,
|
|
183
|
+
withTests: config.options.withTests,
|
|
184
|
+
skipModel: config.options.skipModel,
|
|
185
|
+
skipSchema: config.options.skipSchema,
|
|
186
|
+
skipProcedure: config.options.skipProcedure,
|
|
187
|
+
fields,
|
|
188
|
+
};
|
|
189
|
+
// Create context with template options
|
|
190
|
+
const ctx = {
|
|
191
|
+
entity: deriveEntityNames(config.entityName),
|
|
192
|
+
project: config.project,
|
|
193
|
+
options: templateOptions,
|
|
194
|
+
};
|
|
195
|
+
// Show spinner during actual file generation
|
|
196
|
+
// Only show if we're in interactive mode (we collected fields or user opted to skip)
|
|
197
|
+
const showSpinner = interactive && !skipFields && !config.dryRun;
|
|
198
|
+
let generatedFiles;
|
|
199
|
+
if (showSpinner) {
|
|
200
|
+
const s = p.spinner();
|
|
201
|
+
s.start('Scaffolding resource...');
|
|
202
|
+
try {
|
|
203
|
+
generatedFiles = generateResourceFiles(ctx);
|
|
204
|
+
s.stop(`Scaffolded ${generatedFiles.length} file(s)`);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
s.stop('Scaffolding failed');
|
|
208
|
+
throw err;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
generatedFiles = generateResourceFiles(ctx);
|
|
213
|
+
}
|
|
214
|
+
// Auto-registration (skip in dry-run mode)
|
|
215
|
+
let autoResult = {
|
|
216
|
+
prismaInjected: false,
|
|
217
|
+
procedureRegistered: false,
|
|
218
|
+
migrationRun: false,
|
|
219
|
+
modifiedFiles: [],
|
|
220
|
+
errors: [],
|
|
221
|
+
};
|
|
222
|
+
if (!config.dryRun) {
|
|
223
|
+
autoResult = await this.performAutoRegistration(config.cwd, ctx.entity, templateOptions, {
|
|
224
|
+
skipRegistration,
|
|
225
|
+
skipMigration,
|
|
226
|
+
autoMigrate,
|
|
227
|
+
showSpinner: interactive,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
// Build post-instructions based on what was auto-done
|
|
231
|
+
const postInstructions = this.buildPostInstructions(ctx.entity.pascal, templateOptions, autoResult);
|
|
109
232
|
return {
|
|
110
|
-
files,
|
|
111
|
-
postInstructions
|
|
233
|
+
files: generatedFiles,
|
|
234
|
+
postInstructions,
|
|
112
235
|
};
|
|
113
236
|
}
|
|
237
|
+
/**
|
|
238
|
+
* Perform auto-registration of Prisma model and procedures
|
|
239
|
+
*/
|
|
240
|
+
async performAutoRegistration(projectRoot, entity, options, flags) {
|
|
241
|
+
const result = {
|
|
242
|
+
prismaInjected: false,
|
|
243
|
+
procedureRegistered: false,
|
|
244
|
+
migrationRun: false,
|
|
245
|
+
modifiedFiles: [],
|
|
246
|
+
errors: [],
|
|
247
|
+
};
|
|
248
|
+
// Create snapshot for rollback capability
|
|
249
|
+
const snapshot = createSnapshot();
|
|
250
|
+
try {
|
|
251
|
+
// Step 1: Inject Prisma model into schema.prisma
|
|
252
|
+
if (!options.skipModel) {
|
|
253
|
+
const prismaResult = await this.injectPrismaModel(projectRoot, entity, options, snapshot, flags.showSpinner);
|
|
254
|
+
if (prismaResult.success) {
|
|
255
|
+
result.prismaInjected = true;
|
|
256
|
+
if (prismaResult.schemaPath) {
|
|
257
|
+
result.modifiedFiles.push(prismaResult.schemaPath);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else if (prismaResult.error) {
|
|
261
|
+
result.errors.push(prismaResult.error);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Step 2: Auto-register procedures in router
|
|
265
|
+
if (!options.skipProcedure && !flags.skipRegistration) {
|
|
266
|
+
const regResult = await this.registerInRouter(projectRoot, entity, snapshot, flags.showSpinner);
|
|
267
|
+
if (regResult.success) {
|
|
268
|
+
result.procedureRegistered = true;
|
|
269
|
+
result.modifiedFiles.push(...regResult.modifiedFiles);
|
|
270
|
+
}
|
|
271
|
+
else if (regResult.error) {
|
|
272
|
+
result.errors.push(regResult.error);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Step 3: Run Prisma migration (if model was injected and migration not skipped)
|
|
276
|
+
if (result.prismaInjected && !flags.skipMigration) {
|
|
277
|
+
const migResult = await promptAndRunMigration({
|
|
278
|
+
cwd: projectRoot,
|
|
279
|
+
autoRun: flags.autoMigrate,
|
|
280
|
+
skip: false,
|
|
281
|
+
});
|
|
282
|
+
result.migrationRun = migResult;
|
|
283
|
+
}
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
// Rollback on critical error
|
|
288
|
+
if (flags.showSpinner) {
|
|
289
|
+
console.log(pc.yellow('\n Rolling back auto-registration changes...'));
|
|
290
|
+
}
|
|
291
|
+
rollback(snapshot, { verbose: flags.showSpinner });
|
|
292
|
+
result.errors.push(err instanceof Error ? err.message : String(err));
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Inject Prisma model into schema.prisma
|
|
298
|
+
*/
|
|
299
|
+
async injectPrismaModel(projectRoot, entity, options, snapshot, showSpinner) {
|
|
300
|
+
const schemaPath = findPrismaSchema(projectRoot);
|
|
301
|
+
if (!schemaPath) {
|
|
302
|
+
return {
|
|
303
|
+
success: false,
|
|
304
|
+
error: 'Prisma schema not found. Cannot auto-inject model.',
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
let s = null;
|
|
308
|
+
if (showSpinner) {
|
|
309
|
+
s = p.spinner();
|
|
310
|
+
s.start('Injecting Prisma model...');
|
|
311
|
+
}
|
|
312
|
+
try {
|
|
313
|
+
// Analyze existing schema
|
|
314
|
+
const analysis = analyzePrismaSchema(schemaPath);
|
|
315
|
+
// Check if model already exists
|
|
316
|
+
if (hasModel(analysis, entity.pascal)) {
|
|
317
|
+
if (s)
|
|
318
|
+
s.stop(pc.dim(`Model ${entity.pascal} already exists`));
|
|
319
|
+
return { success: false, error: `Model ${entity.pascal} already exists in schema` };
|
|
320
|
+
}
|
|
321
|
+
// Generate injectable content
|
|
322
|
+
const injectable = generateInjectablePrismaContent(entity, options);
|
|
323
|
+
// Prepare model and enum definitions
|
|
324
|
+
const models = [
|
|
325
|
+
{ name: injectable.modelName, content: injectable.modelContent },
|
|
326
|
+
];
|
|
327
|
+
// Use structured enum data directly (no fragile string splitting)
|
|
328
|
+
const enums = injectable.enums.map((e) => ({
|
|
329
|
+
name: e.name,
|
|
330
|
+
content: e.content,
|
|
331
|
+
}));
|
|
332
|
+
// Save original for rollback
|
|
333
|
+
saveOriginal(snapshot, schemaPath);
|
|
334
|
+
// Inject into schema
|
|
335
|
+
const injectionResult = injectIntoSchema(analysis, models, enums);
|
|
336
|
+
// Write modified schema
|
|
337
|
+
writeFileSync(schemaPath, injectionResult.content, 'utf-8');
|
|
338
|
+
if (s) {
|
|
339
|
+
const addedItems = [
|
|
340
|
+
...injectionResult.addedModels.map((m) => `model ${m}`),
|
|
341
|
+
...injectionResult.addedEnums.map((e) => `enum ${e}`),
|
|
342
|
+
];
|
|
343
|
+
s.stop(pc.green(`Injected ${addedItems.join(', ')} into schema.prisma`));
|
|
344
|
+
}
|
|
345
|
+
return { success: true, schemaPath };
|
|
346
|
+
}
|
|
347
|
+
catch (err) {
|
|
348
|
+
if (s)
|
|
349
|
+
s.stop(pc.red('Failed to inject Prisma model'));
|
|
350
|
+
return {
|
|
351
|
+
success: false,
|
|
352
|
+
error: err instanceof Error ? err.message : String(err),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Register procedures in router
|
|
358
|
+
*/
|
|
359
|
+
async registerInRouter(projectRoot, entity, snapshot, showSpinner) {
|
|
360
|
+
const procedureVar = `${entity.camel}Procedures`;
|
|
361
|
+
// Check if already registered
|
|
362
|
+
if (isProcedureRegistered(projectRoot, procedureVar)) {
|
|
363
|
+
if (showSpinner) {
|
|
364
|
+
console.log(pc.dim(` ${procedureVar} already registered`));
|
|
365
|
+
}
|
|
366
|
+
return { success: false, modifiedFiles: [], error: `${procedureVar} already registered` };
|
|
367
|
+
}
|
|
368
|
+
let s = null;
|
|
369
|
+
if (showSpinner) {
|
|
370
|
+
s = p.spinner();
|
|
371
|
+
s.start('Registering procedures in router...');
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
// Detect router pattern
|
|
375
|
+
const pattern = detectRouterPattern(projectRoot);
|
|
376
|
+
if (pattern.type === 'unknown') {
|
|
377
|
+
if (s)
|
|
378
|
+
s.stop(pc.dim('Could not detect router pattern'));
|
|
379
|
+
return {
|
|
380
|
+
success: false,
|
|
381
|
+
modifiedFiles: [],
|
|
382
|
+
error: 'Could not detect router pattern. Manual registration required.',
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
// Save originals for rollback
|
|
386
|
+
if (pattern.indexPath) {
|
|
387
|
+
saveOriginal(snapshot, pattern.indexPath);
|
|
388
|
+
}
|
|
389
|
+
if (pattern.type === 'centralized') {
|
|
390
|
+
saveOriginal(snapshot, pattern.proceduresIndexPath);
|
|
391
|
+
}
|
|
392
|
+
// Register procedures
|
|
393
|
+
const result = registerProcedures(projectRoot, entity.kebab, procedureVar);
|
|
394
|
+
if (result.success) {
|
|
395
|
+
// Track modified files
|
|
396
|
+
for (const file of result.modifiedFiles) {
|
|
397
|
+
if (!snapshot.modifiedFiles.has(file)) {
|
|
398
|
+
trackCreated(snapshot, file);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
if (s) {
|
|
402
|
+
const actions = [];
|
|
403
|
+
if (result.registrations.importAdded)
|
|
404
|
+
actions.push('import added');
|
|
405
|
+
if (result.registrations.addedToArray)
|
|
406
|
+
actions.push('added to collections');
|
|
407
|
+
if (result.registrations.addedToObject)
|
|
408
|
+
actions.push('added to router');
|
|
409
|
+
if (result.registrations.exportAdded)
|
|
410
|
+
actions.push('export added');
|
|
411
|
+
s.stop(pc.green(`Registered ${procedureVar} (${actions.join(', ')})`));
|
|
412
|
+
}
|
|
413
|
+
return { success: true, modifiedFiles: result.modifiedFiles };
|
|
414
|
+
}
|
|
415
|
+
if (s)
|
|
416
|
+
s.stop(pc.dim(result.error || 'Registration failed'));
|
|
417
|
+
return {
|
|
418
|
+
success: false,
|
|
419
|
+
modifiedFiles: [],
|
|
420
|
+
error: result.error || 'Registration failed',
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
catch (err) {
|
|
424
|
+
if (s)
|
|
425
|
+
s.stop(pc.red('Failed to register procedures'));
|
|
426
|
+
return {
|
|
427
|
+
success: false,
|
|
428
|
+
modifiedFiles: [],
|
|
429
|
+
error: err instanceof Error ? err.message : String(err),
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Build post-instructions based on what was auto-done
|
|
435
|
+
*/
|
|
436
|
+
buildPostInstructions(entityName, options, autoResult) {
|
|
437
|
+
const steps = [];
|
|
438
|
+
let stepNum = 1;
|
|
439
|
+
const lowerName = entityName.toLowerCase();
|
|
440
|
+
const camelName = entityName.charAt(0).toLowerCase() + entityName.slice(1);
|
|
441
|
+
const hasFields = options.fields && options.fields.length > 0;
|
|
442
|
+
const fieldCount = options.fields?.length ?? 0;
|
|
443
|
+
// Show what was auto-done
|
|
444
|
+
const autoDoneItems = [];
|
|
445
|
+
if (autoResult.prismaInjected) {
|
|
446
|
+
autoDoneItems.push('✓ Prisma model injected into schema.prisma');
|
|
447
|
+
}
|
|
448
|
+
if (autoResult.procedureRegistered) {
|
|
449
|
+
autoDoneItems.push('✓ Procedures registered in router');
|
|
450
|
+
}
|
|
451
|
+
if (autoResult.migrationRun) {
|
|
452
|
+
autoDoneItems.push('✓ Database schema updated');
|
|
453
|
+
}
|
|
454
|
+
if (autoDoneItems.length > 0) {
|
|
455
|
+
steps.push(`Auto-completed:\n ${autoDoneItems.join('\n ')}`);
|
|
456
|
+
}
|
|
457
|
+
// Show any errors
|
|
458
|
+
if (autoResult.errors.length > 0) {
|
|
459
|
+
const errorItems = autoResult.errors.map((e) => `⚠ ${e}`);
|
|
460
|
+
steps.push(`Notes:\n ${errorItems.join('\n ')}`);
|
|
461
|
+
}
|
|
462
|
+
// Manual steps still needed
|
|
463
|
+
const manualSteps = [];
|
|
464
|
+
// Prisma model (if not auto-injected)
|
|
465
|
+
if (!options.skipModel && !autoResult.prismaInjected) {
|
|
466
|
+
const fieldInfo = hasFields
|
|
467
|
+
? ` (${fieldCount} field${fieldCount === 1 ? '' : 's'} defined)`
|
|
468
|
+
: '';
|
|
469
|
+
manualSteps.push(`${stepNum}. Add the Prisma model to your schema${fieldInfo}:
|
|
470
|
+
|
|
471
|
+
Copy the contents of src/models/${lowerName}.prisma
|
|
472
|
+
into your prisma/schema.prisma file.`);
|
|
473
|
+
stepNum++;
|
|
474
|
+
}
|
|
475
|
+
// Migration (if model was injected but migration wasn't run)
|
|
476
|
+
if (autoResult.prismaInjected && !autoResult.migrationRun) {
|
|
477
|
+
manualSteps.push(`${stepNum}. Push schema changes to database:
|
|
478
|
+
|
|
479
|
+
npx prisma db push
|
|
480
|
+
# or
|
|
481
|
+
npx prisma migrate dev --name add_${lowerName}`);
|
|
482
|
+
stepNum++;
|
|
483
|
+
}
|
|
484
|
+
// Zod schema review
|
|
485
|
+
if (!options.skipSchema) {
|
|
486
|
+
if (hasFields) {
|
|
487
|
+
manualSteps.push(`${stepNum}. Review the Zod validation (optional):
|
|
488
|
+
|
|
489
|
+
The schema at src/schemas/${lowerName}.schema.ts
|
|
490
|
+
already includes your ${fieldCount} field${fieldCount === 1 ? '' : 's'}.
|
|
491
|
+
Customize validation rules if needed.`);
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
manualSteps.push(`${stepNum}. Add fields to the Zod schema:
|
|
495
|
+
|
|
496
|
+
Edit src/schemas/${lowerName}.schema.ts
|
|
497
|
+
to define your validation schema.`);
|
|
498
|
+
}
|
|
499
|
+
stepNum++;
|
|
500
|
+
}
|
|
501
|
+
// Register procedures (if not auto-registered)
|
|
502
|
+
if (!options.skipProcedure && !autoResult.procedureRegistered) {
|
|
503
|
+
manualSteps.push(`${stepNum}. Register the procedures in your router:
|
|
504
|
+
|
|
505
|
+
import { ${camelName}Procedures } from './procedures/${lowerName}.js';
|
|
506
|
+
|
|
507
|
+
// Add to your router
|
|
508
|
+
const router = createRouter({
|
|
509
|
+
${camelName}: ${camelName}Procedures,
|
|
510
|
+
});`);
|
|
511
|
+
stepNum++;
|
|
512
|
+
}
|
|
513
|
+
// Run tests
|
|
514
|
+
if (options.withTests) {
|
|
515
|
+
manualSteps.push(`${stepNum}. Run the tests:
|
|
516
|
+
|
|
517
|
+
pnpm test src/procedures/__tests__/${lowerName}.test.ts`);
|
|
518
|
+
stepNum++;
|
|
519
|
+
}
|
|
520
|
+
// API endpoints summary
|
|
521
|
+
manualSteps.push(`${stepNum}. Your ${entityName} API is ready:
|
|
522
|
+
|
|
523
|
+
GET /api/${lowerName}s - List all
|
|
524
|
+
GET /api/${lowerName}s/:id - Get by ID
|
|
525
|
+
POST /api/${lowerName}s - Create new
|
|
526
|
+
PUT /api/${lowerName}s/:id - Full update
|
|
527
|
+
PATCH /api/${lowerName}s/:id - Partial update
|
|
528
|
+
DELETE /api/${lowerName}s/:id - Delete`);
|
|
529
|
+
if (manualSteps.length > 0) {
|
|
530
|
+
steps.push(...manualSteps);
|
|
531
|
+
}
|
|
532
|
+
return `\n ${steps.join('\n\n ')}`;
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Collect fields interactively from user
|
|
536
|
+
*/
|
|
537
|
+
async collectFieldsInteractively(entityName) {
|
|
538
|
+
// Ask if user wants to define fields
|
|
539
|
+
const wantFields = await p.confirm({
|
|
540
|
+
message: `Do you want to define fields for ${entityName}?`,
|
|
541
|
+
initialValue: true,
|
|
542
|
+
});
|
|
543
|
+
if (p.isCancel(wantFields)) {
|
|
544
|
+
return { fields: [], cancelled: true };
|
|
545
|
+
}
|
|
546
|
+
if (!wantFields) {
|
|
547
|
+
return { fields: [], cancelled: false };
|
|
548
|
+
}
|
|
549
|
+
// Collect fields
|
|
550
|
+
return collectFields({
|
|
551
|
+
resourceName: entityName,
|
|
552
|
+
minFields: 0,
|
|
553
|
+
});
|
|
554
|
+
}
|
|
114
555
|
}
|
|
115
556
|
// ============================================================================
|
|
116
557
|
// Factory Function
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../src/generators/generators/resource.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../src/generators/generators/resource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Generator
|
|
3
|
+
*
|
|
4
|
+
* Scaffolds service class files for VeloxTS applications.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* velox make service <name> [options]
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* velox make service payment # Simple service
|
|
11
|
+
* velox make service user --crud # CRUD service with Prisma
|
|
12
|
+
* velox make service order --events # Service with event emission
|
|
13
|
+
* velox make service cache --cache # Service with caching
|
|
14
|
+
* velox make service auth --inject # Injectable service (DI)
|
|
15
|
+
*/
|
|
16
|
+
import { BaseGenerator } from '../base.js';
|
|
17
|
+
import { type ServiceOptions } from '../templates/service.js';
|
|
18
|
+
import type { GeneratorConfig, GeneratorMetadata, GeneratorOption, GeneratorOutput } from '../types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Service generator - creates service class files
|
|
21
|
+
*/
|
|
22
|
+
export declare class ServiceGenerator extends BaseGenerator<ServiceOptions> {
|
|
23
|
+
readonly metadata: GeneratorMetadata;
|
|
24
|
+
readonly options: ReadonlyArray<GeneratorOption>;
|
|
25
|
+
/**
|
|
26
|
+
* Validate and transform raw options
|
|
27
|
+
*/
|
|
28
|
+
validateOptions(raw: Record<string, unknown>): ServiceOptions;
|
|
29
|
+
/**
|
|
30
|
+
* Generate service files
|
|
31
|
+
*/
|
|
32
|
+
generate(config: GeneratorConfig<ServiceOptions>): Promise<GeneratorOutput>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Factory function for creating a ServiceGenerator instance
|
|
36
|
+
*/
|
|
37
|
+
export declare function createServiceGenerator(): ServiceGenerator;
|
|
38
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/generators/generators/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAEV,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EAChB,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,aAAa,CAAC,cAAc,CAAC;IACjE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAkBlC;IAEF,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,CA6B9C;IAEF;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc;IAS7D;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAgBlF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Generator
|
|
3
|
+
*
|
|
4
|
+
* Scaffolds service class files for VeloxTS applications.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* velox make service <name> [options]
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* velox make service payment # Simple service
|
|
11
|
+
* velox make service user --crud # CRUD service with Prisma
|
|
12
|
+
* velox make service order --events # Service with event emission
|
|
13
|
+
* velox make service cache --cache # Service with caching
|
|
14
|
+
* velox make service auth --inject # Injectable service (DI)
|
|
15
|
+
*/
|
|
16
|
+
import { BaseGenerator } from '../base.js';
|
|
17
|
+
import { getServiceInstructions, getServicePath, serviceTemplate, } from '../templates/service.js';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Generator Implementation
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Service generator - creates service class files
|
|
23
|
+
*/
|
|
24
|
+
export class ServiceGenerator extends BaseGenerator {
|
|
25
|
+
metadata = {
|
|
26
|
+
name: 'service',
|
|
27
|
+
description: 'Generate service classes for business logic',
|
|
28
|
+
longDescription: `
|
|
29
|
+
Scaffold service classes for VeloxTS applications.
|
|
30
|
+
|
|
31
|
+
Services encapsulate business logic separately from procedures,
|
|
32
|
+
allowing reuse across multiple endpoints and easier testing.
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
velox make service payment # Simple service
|
|
36
|
+
velox make service user --crud # CRUD service with Prisma
|
|
37
|
+
velox make service order --events # Service with event emission
|
|
38
|
+
velox make service cache --cache # Service with caching layer
|
|
39
|
+
velox make service auth --inject # Injectable service (DI)
|
|
40
|
+
`,
|
|
41
|
+
aliases: ['svc', 'srv'],
|
|
42
|
+
category: 'infrastructure',
|
|
43
|
+
};
|
|
44
|
+
options = [
|
|
45
|
+
{
|
|
46
|
+
name: 'crud',
|
|
47
|
+
short: 'c',
|
|
48
|
+
description: 'Generate CRUD service with Prisma integration',
|
|
49
|
+
type: 'boolean',
|
|
50
|
+
default: false,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'cache',
|
|
54
|
+
short: 'a',
|
|
55
|
+
description: 'Include caching layer',
|
|
56
|
+
type: 'boolean',
|
|
57
|
+
default: false,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'events',
|
|
61
|
+
short: 'e',
|
|
62
|
+
description: 'Include event emitter for side effects',
|
|
63
|
+
type: 'boolean',
|
|
64
|
+
default: false,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'inject',
|
|
68
|
+
short: 'i',
|
|
69
|
+
description: 'Generate injectable service for DI',
|
|
70
|
+
type: 'boolean',
|
|
71
|
+
default: false,
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
/**
|
|
75
|
+
* Validate and transform raw options
|
|
76
|
+
*/
|
|
77
|
+
validateOptions(raw) {
|
|
78
|
+
return {
|
|
79
|
+
crud: Boolean(raw.crud ?? false),
|
|
80
|
+
cache: Boolean(raw.cache ?? false),
|
|
81
|
+
events: Boolean(raw.events ?? false),
|
|
82
|
+
injectable: Boolean(raw.inject ?? false),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Generate service files
|
|
87
|
+
*/
|
|
88
|
+
async generate(config) {
|
|
89
|
+
const context = this.createContext(config);
|
|
90
|
+
const files = [];
|
|
91
|
+
// Generate service file
|
|
92
|
+
const serviceContent = serviceTemplate(context);
|
|
93
|
+
files.push({
|
|
94
|
+
path: getServicePath(config.entityName, config.project),
|
|
95
|
+
content: serviceContent,
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
files,
|
|
99
|
+
postInstructions: getServiceInstructions(config.entityName, config.options),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Factory function for creating a ServiceGenerator instance
|
|
105
|
+
*/
|
|
106
|
+
export function createServiceGenerator() {
|
|
107
|
+
return new ServiceGenerator();
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=service.js.map
|