@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.
Files changed (203) hide show
  1. package/README.md +2 -48
  2. package/dist/cli.d.ts +5 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +7 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/dev.d.ts.map +1 -1
  7. package/dist/commands/dev.js +71 -7
  8. package/dist/commands/dev.js.map +1 -1
  9. package/dist/commands/introspect.d.ts +16 -0
  10. package/dist/commands/introspect.d.ts.map +1 -0
  11. package/dist/commands/introspect.js +559 -0
  12. package/dist/commands/introspect.js.map +1 -0
  13. package/dist/commands/make.d.ts.map +1 -1
  14. package/dist/commands/make.js +18 -8
  15. package/dist/commands/make.js.map +1 -1
  16. package/dist/commands/procedures.d.ts.map +1 -1
  17. package/dist/commands/procedures.js +16 -0
  18. package/dist/commands/procedures.js.map +1 -1
  19. package/dist/dev/error-parser.d.ts.map +1 -1
  20. package/dist/dev/error-parser.js +24 -8
  21. package/dist/dev/error-parser.js.map +1 -1
  22. package/dist/dev/hmr-runner.d.ts.map +1 -1
  23. package/dist/dev/hmr-runner.js +6 -1
  24. package/dist/dev/hmr-runner.js.map +1 -1
  25. package/dist/dev/index.d.ts +3 -3
  26. package/dist/dev/index.d.ts.map +1 -1
  27. package/dist/dev/index.js +3 -3
  28. package/dist/dev/index.js.map +1 -1
  29. package/dist/dev/reload-reporter.d.ts +2 -2
  30. package/dist/dev/reload-reporter.d.ts.map +1 -1
  31. package/dist/dev/reload-reporter.js +2 -2
  32. package/dist/dev/reload-reporter.js.map +1 -1
  33. package/dist/errors/catalog.d.ts +48 -0
  34. package/dist/errors/catalog.d.ts.map +1 -0
  35. package/dist/errors/catalog.js +421 -0
  36. package/dist/errors/catalog.js.map +1 -0
  37. package/dist/errors/index.d.ts +26 -0
  38. package/dist/errors/index.d.ts.map +1 -0
  39. package/dist/errors/index.js +28 -0
  40. package/dist/errors/index.js.map +1 -0
  41. package/dist/errors/velox-error.d.ts +122 -0
  42. package/dist/errors/velox-error.d.ts.map +1 -0
  43. package/dist/errors/velox-error.js +216 -0
  44. package/dist/errors/velox-error.js.map +1 -0
  45. package/dist/generators/base.d.ts.map +1 -1
  46. package/dist/generators/base.js +26 -0
  47. package/dist/generators/base.js.map +1 -1
  48. package/dist/generators/fields/__tests__/helpers.d.ts +66 -0
  49. package/dist/generators/fields/__tests__/helpers.d.ts.map +1 -0
  50. package/dist/generators/fields/__tests__/helpers.js +142 -0
  51. package/dist/generators/fields/__tests__/helpers.js.map +1 -0
  52. package/dist/generators/fields/actions.d.ts +58 -0
  53. package/dist/generators/fields/actions.d.ts.map +1 -0
  54. package/dist/generators/fields/actions.js +230 -0
  55. package/dist/generators/fields/actions.js.map +1 -0
  56. package/dist/generators/fields/display.d.ts +28 -0
  57. package/dist/generators/fields/display.d.ts.map +1 -0
  58. package/dist/generators/fields/display.js +214 -0
  59. package/dist/generators/fields/display.js.map +1 -0
  60. package/dist/generators/fields/index.d.ts +12 -0
  61. package/dist/generators/fields/index.d.ts.map +1 -0
  62. package/dist/generators/fields/index.js +12 -0
  63. package/dist/generators/fields/index.js.map +1 -0
  64. package/dist/generators/fields/prompts.d.ts +31 -0
  65. package/dist/generators/fields/prompts.d.ts.map +1 -0
  66. package/dist/generators/fields/prompts.js +366 -0
  67. package/dist/generators/fields/prompts.js.map +1 -0
  68. package/dist/generators/fields/templates.d.ts +49 -0
  69. package/dist/generators/fields/templates.d.ts.map +1 -0
  70. package/dist/generators/fields/templates.js +230 -0
  71. package/dist/generators/fields/templates.js.map +1 -0
  72. package/dist/generators/fields/types.d.ts +95 -0
  73. package/dist/generators/fields/types.d.ts.map +1 -0
  74. package/dist/generators/fields/types.js +150 -0
  75. package/dist/generators/fields/types.js.map +1 -0
  76. package/dist/generators/generators/action.d.ts +37 -0
  77. package/dist/generators/generators/action.d.ts.map +1 -0
  78. package/dist/generators/generators/action.js +109 -0
  79. package/dist/generators/generators/action.js.map +1 -0
  80. package/dist/generators/generators/exception.d.ts +38 -0
  81. package/dist/generators/generators/exception.d.ts.map +1 -0
  82. package/dist/generators/generators/exception.js +109 -0
  83. package/dist/generators/generators/exception.js.map +1 -0
  84. package/dist/generators/generators/guard.d.ts +38 -0
  85. package/dist/generators/generators/guard.d.ts.map +1 -0
  86. package/dist/generators/generators/guard.js +109 -0
  87. package/dist/generators/generators/guard.js.map +1 -0
  88. package/dist/generators/generators/index.d.ts +8 -0
  89. package/dist/generators/generators/index.d.ts.map +1 -1
  90. package/dist/generators/generators/index.js +27 -0
  91. package/dist/generators/generators/index.js.map +1 -1
  92. package/dist/generators/generators/layout.d.ts +36 -0
  93. package/dist/generators/generators/layout.d.ts.map +1 -0
  94. package/dist/generators/generators/layout.js +111 -0
  95. package/dist/generators/generators/layout.js.map +1 -0
  96. package/dist/generators/generators/middleware.d.ts +38 -0
  97. package/dist/generators/generators/middleware.d.ts.map +1 -0
  98. package/dist/generators/generators/middleware.js +109 -0
  99. package/dist/generators/generators/middleware.js.map +1 -0
  100. package/dist/generators/generators/model.d.ts +16 -4
  101. package/dist/generators/generators/model.d.ts.map +1 -1
  102. package/dist/generators/generators/model.js +88 -7
  103. package/dist/generators/generators/model.js.map +1 -1
  104. package/dist/generators/generators/page.d.ts +36 -0
  105. package/dist/generators/generators/page.d.ts.map +1 -0
  106. package/dist/generators/generators/page.js +112 -0
  107. package/dist/generators/generators/page.js.map +1 -0
  108. package/dist/generators/generators/policy.d.ts +37 -0
  109. package/dist/generators/generators/policy.d.ts.map +1 -0
  110. package/dist/generators/generators/policy.js +100 -0
  111. package/dist/generators/generators/policy.js.map +1 -0
  112. package/dist/generators/generators/resource.d.ts +42 -4
  113. package/dist/generators/generators/resource.d.ts.map +1 -1
  114. package/dist/generators/generators/resource.js +450 -9
  115. package/dist/generators/generators/resource.js.map +1 -1
  116. package/dist/generators/generators/service.d.ts +38 -0
  117. package/dist/generators/generators/service.d.ts.map +1 -0
  118. package/dist/generators/generators/service.js +109 -0
  119. package/dist/generators/generators/service.js.map +1 -0
  120. package/dist/generators/registry.d.ts.map +1 -1
  121. package/dist/generators/registry.js +10 -1
  122. package/dist/generators/registry.js.map +1 -1
  123. package/dist/generators/templates/action.d.ts +28 -0
  124. package/dist/generators/templates/action.d.ts.map +1 -0
  125. package/dist/generators/templates/action.js +359 -0
  126. package/dist/generators/templates/action.js.map +1 -0
  127. package/dist/generators/templates/exception.d.ts +26 -0
  128. package/dist/generators/templates/exception.d.ts.map +1 -0
  129. package/dist/generators/templates/exception.js +671 -0
  130. package/dist/generators/templates/exception.js.map +1 -0
  131. package/dist/generators/templates/guard.d.ts +26 -0
  132. package/dist/generators/templates/guard.d.ts.map +1 -0
  133. package/dist/generators/templates/guard.js +555 -0
  134. package/dist/generators/templates/guard.js.map +1 -0
  135. package/dist/generators/templates/layout.d.ts +28 -0
  136. package/dist/generators/templates/layout.d.ts.map +1 -0
  137. package/dist/generators/templates/layout.js +147 -0
  138. package/dist/generators/templates/layout.js.map +1 -0
  139. package/dist/generators/templates/middleware.d.ts +26 -0
  140. package/dist/generators/templates/middleware.d.ts.map +1 -0
  141. package/dist/generators/templates/middleware.js +411 -0
  142. package/dist/generators/templates/middleware.js.map +1 -0
  143. package/dist/generators/templates/model.d.ts +3 -0
  144. package/dist/generators/templates/model.d.ts.map +1 -1
  145. package/dist/generators/templates/model.js +183 -28
  146. package/dist/generators/templates/model.js.map +1 -1
  147. package/dist/generators/templates/page.d.ts +36 -0
  148. package/dist/generators/templates/page.d.ts.map +1 -0
  149. package/dist/generators/templates/page.js +147 -0
  150. package/dist/generators/templates/page.js.map +1 -0
  151. package/dist/generators/templates/policy.d.ts +24 -0
  152. package/dist/generators/templates/policy.d.ts.map +1 -0
  153. package/dist/generators/templates/policy.js +499 -0
  154. package/dist/generators/templates/policy.js.map +1 -0
  155. package/dist/generators/templates/resource.d.ts +65 -0
  156. package/dist/generators/templates/resource.d.ts.map +1 -1
  157. package/dist/generators/templates/resource.js +228 -43
  158. package/dist/generators/templates/resource.js.map +1 -1
  159. package/dist/generators/templates/service.d.ts +26 -0
  160. package/dist/generators/templates/service.d.ts.map +1 -0
  161. package/dist/generators/templates/service.js +511 -0
  162. package/dist/generators/templates/service.js.map +1 -0
  163. package/dist/generators/types.d.ts +26 -14
  164. package/dist/generators/types.d.ts.map +1 -1
  165. package/dist/generators/types.js +8 -25
  166. package/dist/generators/types.js.map +1 -1
  167. package/dist/generators/utils/ast-helpers.d.ts +147 -0
  168. package/dist/generators/utils/ast-helpers.d.ts.map +1 -0
  169. package/dist/generators/utils/ast-helpers.js +350 -0
  170. package/dist/generators/utils/ast-helpers.js.map +1 -0
  171. package/dist/generators/utils/prisma-migration.d.ts +59 -0
  172. package/dist/generators/utils/prisma-migration.d.ts.map +1 -0
  173. package/dist/generators/utils/prisma-migration.js +161 -0
  174. package/dist/generators/utils/prisma-migration.js.map +1 -0
  175. package/dist/generators/utils/prisma-schema.d.ts +97 -0
  176. package/dist/generators/utils/prisma-schema.d.ts.map +1 -0
  177. package/dist/generators/utils/prisma-schema.js +235 -0
  178. package/dist/generators/utils/prisma-schema.js.map +1 -0
  179. package/dist/generators/utils/router-integration.d.ts +70 -0
  180. package/dist/generators/utils/router-integration.d.ts.map +1 -0
  181. package/dist/generators/utils/router-integration.js +305 -0
  182. package/dist/generators/utils/router-integration.js.map +1 -0
  183. package/dist/generators/utils/snapshot.d.ts +93 -0
  184. package/dist/generators/utils/snapshot.d.ts.map +1 -0
  185. package/dist/generators/utils/snapshot.js +178 -0
  186. package/dist/generators/utils/snapshot.js.map +1 -0
  187. package/dist/index.d.ts +6 -0
  188. package/dist/index.d.ts.map +1 -1
  189. package/dist/index.js +6 -0
  190. package/dist/index.js.map +1 -1
  191. package/dist/seeding/errors.d.ts +11 -24
  192. package/dist/seeding/errors.d.ts.map +1 -1
  193. package/dist/seeding/errors.js +11 -50
  194. package/dist/seeding/errors.js.map +1 -1
  195. package/dist/utils/paths.d.ts +19 -0
  196. package/dist/utils/paths.d.ts.map +1 -1
  197. package/dist/utils/paths.js +45 -0
  198. package/dist/utils/paths.js.map +1 -1
  199. package/dist/utils/schema-patterns.d.ts +26 -0
  200. package/dist/utils/schema-patterns.d.ts.map +1 -0
  201. package/dist/utils/schema-patterns.js +40 -0
  202. package/dist/utils/schema-patterns.js.map +1 -0
  203. 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 { generateResourceFiles, getResourceInstructions, } from '../templates/resource.js';
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 ctx = this.createContext(config);
108
- const files = generateResourceFiles(ctx);
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: getResourceInstructions(ctx.entity.pascal, config.options),
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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAwB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,+BAA+B,EAC/B,qBAAqB,GAEtB,MAAM,0BAA0B,CAAC;AAQlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GAGjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,cAAc,EAEd,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,MAAM,QAAQ,GAAsB;IAClC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,+DAA+D;IAC5E,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC;CACtB,CAAC;AAEF,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,OAAO,GAAsB;IACjC;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,+BAA+B;QAC5C,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,YAAY;KACnB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,wCAAwC;QACrD,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,iBAAiB;KACxB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,mBAAmB;KAC1B;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,iDAAiD;QAC9D,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,kBAAkB;KACzB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,qBAAqB;QAClC,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,kBAAkB;KACzB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,cAAc;KACrB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,4BAA4B;QACzC,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,eAAe;KACtB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,kBAAkB;KACzB;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,mBAAmB;KAC1B;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,6CAA6C;QAC1D,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,eAAe;KACtB;IACD,4BAA4B;IAC5B;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,qBAAqB;KAC5B;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,kBAAkB;KACzB;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,6CAA6C;QAC1D,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,gBAAgB;KACvB;CACF,CAAC;AAkCF;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,aAAiC;IAC7D,QAAQ,GAAsB,QAAQ,CAAC;IACvC,OAAO,GAAmC,OAAO,CAAC;IAE3D;;OAEG;IACH,eAAe,CAAC,UAAmC;QACjD,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC;YACtC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC;YAChD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;YACnD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC;YAClD,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC;YAChD,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS,IAAI,KAAK,CAAC;YACjD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;YACnD,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC;YACzD,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW,IAAI,KAAK,CAAC;YACrD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;YACnD,4BAA4B;YAC5B,gBAAgB,EAAE,OAAO,CAAC,UAAU,CAAC,gBAAgB,IAAI,KAAK,CAAC;YAC/D,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC;YACzD,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW,IAAI,KAAK,CAAC;SACtD,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,MAA2C;QACxD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,GAC7E,MAAM,CAAC,OAAO,CAAC;QAEjB,sEAAsE;QACtE,IAAI,MAAM,GAAsB,EAAE,CAAC;QAEnC,IAAI,WAAW,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAE7E,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC1B,uCAAuC;gBACvC,OAAO;oBACL,KAAK,EAAE,EAAE;oBACT,gBAAgB,EAAE,8BAA8B;iBACjD,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;YAC5B,gEAAgE;QAClE,CAAC;QAED,kDAAkD;QAClD,MAAM,eAAe,GAAoB;YACvC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;YACzB,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;YACnC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU;YACrC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU;YACrC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;YACnC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;YACnC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU;YACrC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;YAC3C,MAAM;SACP,CAAC;QAEF,uCAAuC;QACvC,MAAM,GAAG,GAAG;YACV,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC;YAC5C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,eAAe;SACzB,CAAC;QAEF,6CAA6C;QAC7C,qFAAqF;QACrF,MAAM,WAAW,GAAG,WAAW,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACjE,IAAI,cAAwC,CAAC;QAE7C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAEnC,IAAI,CAAC;gBACH,cAAc,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC,IAAI,CAAC,cAAc,cAAc,CAAC,MAAM,UAAU,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBAC7B,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,2CAA2C;QAC3C,IAAI,UAAU,GAA2B;YACvC,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,KAAK;YAC1B,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,EAAE;YACjB,MAAM,EAAE,EAAE;SACX,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,UAAU,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE;gBACvF,gBAAgB;gBAChB,aAAa;gBACb,WAAW;gBACX,WAAW,EAAE,WAAW;aACzB,CAAC,CAAC;QACL,CAAC;QAED,sDAAsD;QACtD,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CACjD,GAAG,CAAC,MAAM,CAAC,MAAM,EACjB,eAAe,EACf,UAAU,CACX,CAAC;QAEF,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CACnC,WAAmB,EACnB,MAAwD,EACxD,OAAwB,EACxB,KAKC;QAED,MAAM,MAAM,GAA2B;YACrC,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,KAAK;YAC1B,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,EAAE;YACjB,MAAM,EAAE,EAAE;SACX,CAAC;QAEF,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAElC,IAAI,CAAC;YACH,iDAAiD;YACjD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACvB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAC/C,WAAW,EACX,MAAM,EACN,OAAO,EACP,QAAQ,EACR,KAAK,CAAC,WAAW,CAClB,CAAC;gBACF,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC7B,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;wBAC5B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;qBAAM,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;oBAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAED,6CAA6C;YAC7C,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACtD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC3C,WAAW,EACX,MAAM,EACN,QAAQ,EACR,KAAK,CAAC,WAAW,CAClB,CAAC;gBACF,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;oBAClC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;gBACxD,CAAC;qBAAM,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;oBAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAED,iFAAiF;YACjF,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;gBAClD,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC;oBAC5C,GAAG,EAAE,WAAW;oBAChB,OAAO,EAAE,KAAK,CAAC,WAAW;oBAC1B,IAAI,EAAE,KAAK;iBACZ,CAAC,CAAC;gBACH,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;YAClC,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6BAA6B;YAC7B,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC,CAAC;YAC1E,CAAC;YACD,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAEnD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACrE,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAC7B,WAAmB,EACnB,MAAyC,EACzC,OAAwB,EACxB,QAAsB,EACtB,WAAoB;QAEpB,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAEjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oDAAoD;aAC5D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAwC,IAAI,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YAChB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAEjD,gCAAgC;YAChC,IAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC;oBAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,MAAM,iBAAiB,CAAC,CAAC,CAAC;gBAC/D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,MAAM,CAAC,MAAM,2BAA2B,EAAE,CAAC;YACtF,CAAC;YAED,8BAA8B;YAC9B,MAAM,UAAU,GAAG,+BAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAEpE,qCAAqC;YACrC,MAAM,MAAM,GAA4B;gBACtC,EAAE,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE;aACjE,CAAC;YAEF,kEAAkE;YAClE,MAAM,KAAK,GAA2B,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjE,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC,CAAC;YAEJ,6BAA6B;YAC7B,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAEnC,qBAAqB;YACrB,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAElE,wBAAwB;YACxB,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE5D,IAAI,CAAC,EAAE,CAAC;gBACN,MAAM,UAAU,GAAG;oBACjB,GAAG,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;oBACvD,GAAG,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;iBACtD,CAAC;gBACF,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC3E,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACvD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,WAAmB,EACnB,MAAwD,EACxD,QAAsB,EACtB,WAAoB;QAEpB,MAAM,YAAY,GAAG,GAAG,MAAM,CAAC,KAAK,YAAY,CAAC;QAEjD,8BAA8B;QAC9B,IAAI,qBAAqB,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;YACrD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,YAAY,qBAAqB,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,qBAAqB,EAAE,CAAC;QAC5F,CAAC;QAED,IAAI,CAAC,GAAwC,IAAI,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YAChB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAEjD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACzD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,aAAa,EAAE,EAAE;oBACjB,KAAK,EAAE,gEAAgE;iBACxE,CAAC;YACJ,CAAC;YAED,8BAA8B;YAC9B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACnC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACtD,CAAC;YAED,sBAAsB;YACtB,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAE3E,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,uBAAuB;gBACvB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oBACxC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBACtC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,EAAE,CAAC;oBACN,MAAM,OAAO,GAAa,EAAE,CAAC;oBAC7B,IAAI,MAAM,CAAC,aAAa,CAAC,WAAW;wBAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACnE,IAAI,MAAM,CAAC,aAAa,CAAC,YAAY;wBAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;oBAC5E,IAAI,MAAM,CAAC,aAAa,CAAC,aAAa;wBAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBACxE,IAAI,MAAM,CAAC,aAAa,CAAC,WAAW;wBAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACnE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzE,CAAC;gBAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;YAChE,CAAC;YAED,IAAI,CAAC;gBAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC,CAAC;YAC7D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,aAAa,EAAE,EAAE;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,qBAAqB;aAC7C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACvD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,aAAa,EAAE,EAAE;gBACjB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB,CAC3B,UAAkB,EAClB,OAAwB,EACxB,UAAkC;QAElC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;QAE/C,0BAA0B;QAC1B,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;YAC9B,aAAa,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,UAAU,CAAC,mBAAmB,EAAE,CAAC;YACnC,aAAa,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YAC5B,aAAa,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,yBAAyB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,kBAAkB;QAClB,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,4BAA4B;QAC5B,MAAM,WAAW,GAAa,EAAE,CAAC;QAEjC,sCAAsC;QACtC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,SAAS;gBACzB,CAAC,CAAC,KAAK,UAAU,SAAS,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW;gBAChE,CAAC,CAAC,EAAE,CAAC;YACP,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,wCAAwC,SAAS;;uCAE3C,SAAS;0CACN,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,6DAA6D;QAC7D,IAAI,UAAU,CAAC,cAAc,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YAC1D,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO;;;;yCAIQ,SAAS,EAAE,CAAC,CAAC;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACxB,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO;;iCAEF,SAAS;6BACb,UAAU,SAAS,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;2CAChC,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO;;wBAEX,SAAS;uCACM,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,+CAA+C;QAC/C,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;YAC9D,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO;;gBAEjB,SAAS,mCAAmC,SAAS;;;;SAI5D,SAAS,KAAK,SAAS;SACvB,CAAC,CAAC;YACL,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,YAAY;QACZ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO;;0CAES,SAAS,UAAU,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,wBAAwB;QACxB,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,UAAU;;mBAEhC,SAAS;mBACT,SAAS;mBACT,SAAS;mBACT,SAAS;mBACT,SAAS;mBACT,SAAS,iBAAiB,CAAC,CAAC;QAE3C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,0BAA0B,CACtC,UAAkB;QAElB,qCAAqC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YACjC,OAAO,EAAE,oCAAoC,UAAU,GAAG;YAC1D,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC1C,CAAC;QAED,iBAAiB;QACjB,OAAO,aAAa,CAAC;YACnB,YAAY,EAAE,UAAU;YACxB,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;IACL,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,iBAAiB,EAAE,CAAC;AACjC,CAAC"}
@@ -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