@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
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Prisma Migration Runner
3
+ *
4
+ * Executes Prisma commands (db push, generate) with proper error handling
5
+ * and user feedback.
6
+ */
7
+ import { spawn } from 'node:child_process';
8
+ import * as p from '@clack/prompts';
9
+ import pc from 'picocolors';
10
+ import { GeneratorError, GeneratorErrorCode } from '../types.js';
11
+ // ============================================================================
12
+ // Command Execution
13
+ // ============================================================================
14
+ /**
15
+ * Execute a command and capture output
16
+ */
17
+ function execCommand(command, args, cwd, timeout = 60000) {
18
+ return new Promise((resolve) => {
19
+ let stdout = '';
20
+ let stderr = '';
21
+ let timedOut = false;
22
+ const proc = spawn(command, args, {
23
+ cwd,
24
+ stdio: 'pipe',
25
+ });
26
+ // Set timeout
27
+ const timeoutId = setTimeout(() => {
28
+ timedOut = true;
29
+ proc.kill('SIGTERM');
30
+ }, timeout);
31
+ proc.stdout?.on('data', (data) => {
32
+ stdout += data.toString();
33
+ });
34
+ proc.stderr?.on('data', (data) => {
35
+ stderr += data.toString();
36
+ });
37
+ proc.on('close', (code) => {
38
+ clearTimeout(timeoutId);
39
+ if (timedOut) {
40
+ resolve({
41
+ success: false,
42
+ exitCode: -1,
43
+ stdout,
44
+ stderr: `${stderr}\nCommand timed out`,
45
+ });
46
+ return;
47
+ }
48
+ resolve({
49
+ success: code === 0,
50
+ exitCode: code ?? 1,
51
+ stdout,
52
+ stderr,
53
+ });
54
+ });
55
+ proc.on('error', (err) => {
56
+ clearTimeout(timeoutId);
57
+ resolve({
58
+ success: false,
59
+ exitCode: 1,
60
+ stdout,
61
+ stderr: err.message,
62
+ });
63
+ });
64
+ });
65
+ }
66
+ // ============================================================================
67
+ // Prisma Commands
68
+ // ============================================================================
69
+ /**
70
+ * Run `prisma db push` to sync schema with database
71
+ */
72
+ export async function runPrismaDbPush(options) {
73
+ const { cwd, timeout = 60000 } = options;
74
+ const result = await execCommand('npx', ['prisma', 'db', 'push', '--skip-generate'], cwd, timeout);
75
+ return result;
76
+ }
77
+ /**
78
+ * Run `prisma generate` to regenerate Prisma Client
79
+ */
80
+ export async function runPrismaGenerate(options) {
81
+ const { cwd, timeout = 60000 } = options;
82
+ const result = await execCommand('npx', ['prisma', 'generate'], cwd, timeout);
83
+ return result;
84
+ }
85
+ /**
86
+ * Run `prisma format` to format schema file
87
+ */
88
+ export async function runPrismaFormat(options) {
89
+ const { cwd, timeout = 30000 } = options;
90
+ const result = await execCommand('npx', ['prisma', 'format'], cwd, timeout);
91
+ return result;
92
+ }
93
+ // ============================================================================
94
+ // Interactive Migration Flow
95
+ // ============================================================================
96
+ /**
97
+ * Prompt user and run database migration
98
+ *
99
+ * @returns true if migration was run and succeeded, false otherwise
100
+ */
101
+ export async function promptAndRunMigration(options) {
102
+ const { skip, autoRun } = options;
103
+ // Skip if requested
104
+ if (skip) {
105
+ return false;
106
+ }
107
+ // Prompt user unless autoRun is enabled
108
+ if (!autoRun) {
109
+ const shouldMigrate = await p.confirm({
110
+ message: 'Push schema changes to database?',
111
+ initialValue: true,
112
+ });
113
+ if (p.isCancel(shouldMigrate) || !shouldMigrate) {
114
+ console.log(pc.dim(' Skipped database migration'));
115
+ console.log(pc.dim(` Run manually: npx prisma db push`));
116
+ return false;
117
+ }
118
+ }
119
+ // Run db push with spinner
120
+ const s = p.spinner();
121
+ s.start('Pushing schema to database...');
122
+ const pushResult = await runPrismaDbPush(options);
123
+ if (!pushResult.success) {
124
+ s.stop(pc.red('Database push failed'));
125
+ console.log(pc.dim(`\n Error: ${pushResult.stderr}`));
126
+ console.log(pc.dim(` Run manually: npx prisma db push`));
127
+ return false;
128
+ }
129
+ s.stop(pc.green('Database schema updated'));
130
+ // Run generate with spinner
131
+ s.start('Generating Prisma Client...');
132
+ const generateResult = await runPrismaGenerate(options);
133
+ if (!generateResult.success) {
134
+ s.stop(pc.yellow('Prisma Client generation failed'));
135
+ console.log(pc.dim(`\n Error: ${generateResult.stderr}`));
136
+ console.log(pc.dim(` Run manually: npx prisma generate`));
137
+ return false;
138
+ }
139
+ s.stop(pc.green('Prisma Client generated'));
140
+ return true;
141
+ }
142
+ // ============================================================================
143
+ // Validation
144
+ // ============================================================================
145
+ /**
146
+ * Check if Prisma CLI is available
147
+ */
148
+ export async function checkPrismaAvailable(cwd) {
149
+ const result = await execCommand('npx', ['prisma', '--version'], cwd, 10000);
150
+ return result.success;
151
+ }
152
+ /**
153
+ * Validate schema before migration
154
+ */
155
+ export async function validatePrismaSchema(cwd) {
156
+ const result = await execCommand('npx', ['prisma', 'validate'], cwd, 30000);
157
+ if (!result.success) {
158
+ throw new GeneratorError(GeneratorErrorCode.MIGRATION_FAILED, 'Prisma schema validation failed', `Error: ${result.stderr}\n\nFix the schema errors and try again.`);
159
+ }
160
+ }
161
+ //# sourceMappingURL=prisma-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-migration.js","sourceRoot":"","sources":["../../../src/generators/utils/prisma-migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Prisma Schema Parser and Injector
3
+ *
4
+ * Parses Prisma schema files to find models/enums and enables safe injection
5
+ * of new definitions without breaking existing code.
6
+ */
7
+ /**
8
+ * Represents a parsed Prisma schema
9
+ */
10
+ export interface PrismaSchemaAnalysis {
11
+ /** Original file content */
12
+ readonly content: string;
13
+ /** File path */
14
+ readonly filePath: string;
15
+ /** All model names found */
16
+ readonly models: Set<string>;
17
+ /** All enum names found */
18
+ readonly enums: Set<string>;
19
+ /** Position after last model block */
20
+ readonly lastModelEnd: number;
21
+ /** Position after last enum block */
22
+ readonly lastEnumEnd: number;
23
+ /** Position where models start (after datasource/generator blocks) */
24
+ readonly modelSectionStart: number;
25
+ }
26
+ /**
27
+ * Model definition to inject
28
+ */
29
+ export interface PrismaModelDefinition {
30
+ /** Model name (PascalCase) */
31
+ readonly name: string;
32
+ /** Full Prisma model content (including `model Name { ... }`) */
33
+ readonly content: string;
34
+ }
35
+ /**
36
+ * Enum definition to inject
37
+ */
38
+ export interface PrismaEnumDefinition {
39
+ /** Enum name (PascalCase) */
40
+ readonly name: string;
41
+ /** Full Prisma enum content (including `enum Name { ... }`) */
42
+ readonly content: string;
43
+ }
44
+ /**
45
+ * Result of injecting into schema
46
+ */
47
+ export interface SchemaInjectionResult {
48
+ /** Modified schema content */
49
+ readonly content: string;
50
+ /** Models that were added */
51
+ readonly addedModels: string[];
52
+ /** Enums that were added */
53
+ readonly addedEnums: string[];
54
+ /** Models that were skipped (already exist) */
55
+ readonly skippedModels: string[];
56
+ /** Enums that were skipped (already exist) */
57
+ readonly skippedEnums: string[];
58
+ }
59
+ /**
60
+ * Find the Prisma schema file in a project
61
+ */
62
+ export declare function findPrismaSchema(projectRoot: string): string | null;
63
+ /**
64
+ * Parse a Prisma schema file
65
+ */
66
+ export declare function analyzePrismaSchema(filePath: string): PrismaSchemaAnalysis;
67
+ /**
68
+ * Check if a model exists in the schema
69
+ */
70
+ export declare function hasModel(analysis: PrismaSchemaAnalysis, modelName: string): boolean;
71
+ /**
72
+ * Check if an enum exists in the schema
73
+ */
74
+ export declare function hasEnum(analysis: PrismaSchemaAnalysis, enumName: string): boolean;
75
+ /**
76
+ * Inject models and enums into a Prisma schema
77
+ *
78
+ * - Enums are added before models (Prisma convention)
79
+ * - Models are added at the end of the file
80
+ * - Existing models/enums are skipped (not duplicated)
81
+ */
82
+ export declare function injectIntoSchema(analysis: PrismaSchemaAnalysis, models: PrismaModelDefinition[], enums?: PrismaEnumDefinition[]): SchemaInjectionResult;
83
+ /**
84
+ * Validate that required models/enums don't already exist
85
+ *
86
+ * Throws if any model or enum already exists (prevents accidental overwrites)
87
+ */
88
+ export declare function validateNoConflicts(analysis: PrismaSchemaAnalysis, models: PrismaModelDefinition[], enums?: PrismaEnumDefinition[]): void;
89
+ /**
90
+ * Generate a minimal Prisma model string
91
+ */
92
+ export declare function generatePrismaModel(name: string, fields: string[], tableName?: string): string;
93
+ /**
94
+ * Generate a Prisma enum string
95
+ */
96
+ export declare function generatePrismaEnum(name: string, values: string[]): string;
97
+ //# sourceMappingURL=prisma-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-schema.d.ts","sourceRoot":"","sources":["../../../src/generators/utils/prisma-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAC/B,4BAA4B;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CACjC;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,CA6D1E;AAqDD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEjF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,qBAAqB,EAAE,EAC/B,KAAK,GAAE,oBAAoB,EAAO,GACjC,qBAAqB,CAkEvB;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,qBAAqB,EAAE,EAC/B,KAAK,GAAE,oBAAoB,EAAO,GACjC,IAAI,CAoBN;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAO9F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAMzE"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Prisma Schema Parser and Injector
3
+ *
4
+ * Parses Prisma schema files to find models/enums and enables safe injection
5
+ * of new definitions without breaking existing code.
6
+ */
7
+ import { existsSync, readFileSync } from 'node:fs';
8
+ import { GeneratorError, GeneratorErrorCode } from '../types.js';
9
+ // ============================================================================
10
+ // Schema Parsing
11
+ // ============================================================================
12
+ /**
13
+ * Find the Prisma schema file in a project
14
+ */
15
+ export function findPrismaSchema(projectRoot) {
16
+ const possiblePaths = [
17
+ `${projectRoot}/prisma/schema.prisma`,
18
+ `${projectRoot}/schema.prisma`,
19
+ `${projectRoot}/prisma/schema/schema.prisma`,
20
+ ];
21
+ for (const path of possiblePaths) {
22
+ if (existsSync(path)) {
23
+ return path;
24
+ }
25
+ }
26
+ return null;
27
+ }
28
+ /**
29
+ * Parse a Prisma schema file
30
+ */
31
+ export function analyzePrismaSchema(filePath) {
32
+ if (!existsSync(filePath)) {
33
+ throw new GeneratorError(GeneratorErrorCode.PROJECT_STRUCTURE, `Prisma schema not found: ${filePath}`, 'Ensure prisma/schema.prisma exists in your project.');
34
+ }
35
+ const content = readFileSync(filePath, 'utf-8');
36
+ const models = new Set();
37
+ const enums = new Set();
38
+ let lastModelEnd = 0;
39
+ let lastEnumEnd = 0;
40
+ let modelSectionStart = 0;
41
+ // Find all models
42
+ const modelRegex = /^model\s+(\w+)\s*\{/gm;
43
+ for (const match of content.matchAll(modelRegex)) {
44
+ models.add(match[1]);
45
+ const blockEnd = findBlockEnd(content, match.index ?? 0);
46
+ lastModelEnd = Math.max(lastModelEnd, blockEnd);
47
+ // Track where models section starts
48
+ if (modelSectionStart === 0) {
49
+ modelSectionStart = match.index ?? 0;
50
+ }
51
+ }
52
+ // Find all enums
53
+ const enumRegex = /^enum\s+(\w+)\s*\{/gm;
54
+ for (const match of content.matchAll(enumRegex)) {
55
+ enums.add(match[1]);
56
+ const blockEnd = findBlockEnd(content, match.index ?? 0);
57
+ lastEnumEnd = Math.max(lastEnumEnd, blockEnd);
58
+ // Enums typically come before models, update section start if earlier
59
+ const matchIndex = match.index ?? 0;
60
+ if (matchIndex < modelSectionStart || modelSectionStart === 0) {
61
+ modelSectionStart = matchIndex;
62
+ }
63
+ }
64
+ // If no models/enums found, put section start after generator/datasource blocks
65
+ if (modelSectionStart === 0) {
66
+ modelSectionStart = findEndOfConfigBlocks(content);
67
+ }
68
+ return {
69
+ content,
70
+ filePath,
71
+ models,
72
+ enums,
73
+ lastModelEnd,
74
+ lastEnumEnd,
75
+ modelSectionStart,
76
+ };
77
+ }
78
+ /**
79
+ * Find the end of a Prisma block (matching closing brace)
80
+ */
81
+ function findBlockEnd(content, startIndex) {
82
+ let braceCount = 0;
83
+ let inBlock = false;
84
+ for (let i = startIndex; i < content.length; i++) {
85
+ const char = content[i];
86
+ if (char === '{') {
87
+ braceCount++;
88
+ inBlock = true;
89
+ }
90
+ else if (char === '}') {
91
+ braceCount--;
92
+ if (inBlock && braceCount === 0) {
93
+ return i + 1; // Position after closing brace
94
+ }
95
+ }
96
+ }
97
+ return content.length;
98
+ }
99
+ /**
100
+ * Find the end of datasource/generator config blocks
101
+ */
102
+ function findEndOfConfigBlocks(content) {
103
+ // Find the last generator or datasource block
104
+ const generatorRegex = /^generator\s+\w+\s*\{/gm;
105
+ const datasourceRegex = /^datasource\s+\w+\s*\{/gm;
106
+ let lastEnd = 0;
107
+ for (const match of content.matchAll(generatorRegex)) {
108
+ const blockEnd = findBlockEnd(content, match.index ?? 0);
109
+ lastEnd = Math.max(lastEnd, blockEnd);
110
+ }
111
+ for (const match of content.matchAll(datasourceRegex)) {
112
+ const blockEnd = findBlockEnd(content, match.index ?? 0);
113
+ lastEnd = Math.max(lastEnd, blockEnd);
114
+ }
115
+ return lastEnd;
116
+ }
117
+ // ============================================================================
118
+ // Schema Modification
119
+ // ============================================================================
120
+ /**
121
+ * Check if a model exists in the schema
122
+ */
123
+ export function hasModel(analysis, modelName) {
124
+ return analysis.models.has(modelName);
125
+ }
126
+ /**
127
+ * Check if an enum exists in the schema
128
+ */
129
+ export function hasEnum(analysis, enumName) {
130
+ return analysis.enums.has(enumName);
131
+ }
132
+ /**
133
+ * Inject models and enums into a Prisma schema
134
+ *
135
+ * - Enums are added before models (Prisma convention)
136
+ * - Models are added at the end of the file
137
+ * - Existing models/enums are skipped (not duplicated)
138
+ */
139
+ export function injectIntoSchema(analysis, models, enums = []) {
140
+ const addedModels = [];
141
+ const addedEnums = [];
142
+ const skippedModels = [];
143
+ const skippedEnums = [];
144
+ // Prepare content modifications
145
+ const modifications = [];
146
+ // Process enums (add before models)
147
+ for (const enumDef of enums) {
148
+ if (hasEnum(analysis, enumDef.name)) {
149
+ skippedEnums.push(enumDef.name);
150
+ continue;
151
+ }
152
+ // Insert enum before first model, or at model section start
153
+ const insertPos = analysis.lastEnumEnd > 0
154
+ ? analysis.lastEnumEnd
155
+ : analysis.modelSectionStart > 0
156
+ ? analysis.modelSectionStart
157
+ : analysis.content.length;
158
+ modifications.push({
159
+ position: insertPos,
160
+ content: `\n${enumDef.content}\n`,
161
+ });
162
+ addedEnums.push(enumDef.name);
163
+ }
164
+ // Process models (add at end)
165
+ for (const model of models) {
166
+ if (hasModel(analysis, model.name)) {
167
+ skippedModels.push(model.name);
168
+ continue;
169
+ }
170
+ // Insert model at end of file (or after last model)
171
+ const insertPos = analysis.lastModelEnd > 0 ? analysis.lastModelEnd : analysis.content.length;
172
+ modifications.push({
173
+ position: insertPos,
174
+ content: `\n${model.content}\n`,
175
+ });
176
+ addedModels.push(model.name);
177
+ }
178
+ // Apply modifications (sort by position descending to avoid offset issues)
179
+ let modifiedContent = analysis.content;
180
+ modifications.sort((a, b) => b.position - a.position);
181
+ for (const mod of modifications) {
182
+ modifiedContent =
183
+ modifiedContent.slice(0, mod.position) + mod.content + modifiedContent.slice(mod.position);
184
+ }
185
+ return {
186
+ content: modifiedContent,
187
+ addedModels,
188
+ addedEnums,
189
+ skippedModels,
190
+ skippedEnums,
191
+ };
192
+ }
193
+ // ============================================================================
194
+ // Validation
195
+ // ============================================================================
196
+ /**
197
+ * Validate that required models/enums don't already exist
198
+ *
199
+ * Throws if any model or enum already exists (prevents accidental overwrites)
200
+ */
201
+ export function validateNoConflicts(analysis, models, enums = []) {
202
+ for (const model of models) {
203
+ if (hasModel(analysis, model.name)) {
204
+ throw new GeneratorError(GeneratorErrorCode.FILE_ALREADY_EXISTS, `Model "${model.name}" already exists in Prisma schema`, `Use a different entity name or remove the existing model from prisma/schema.prisma`);
205
+ }
206
+ }
207
+ for (const enumDef of enums) {
208
+ if (hasEnum(analysis, enumDef.name)) {
209
+ throw new GeneratorError(GeneratorErrorCode.FILE_ALREADY_EXISTS, `Enum "${enumDef.name}" already exists in Prisma schema`, `Use a different enum name or remove the existing enum from prisma/schema.prisma`);
210
+ }
211
+ }
212
+ }
213
+ // ============================================================================
214
+ // Helpers
215
+ // ============================================================================
216
+ /**
217
+ * Generate a minimal Prisma model string
218
+ */
219
+ export function generatePrismaModel(name, fields, tableName) {
220
+ const mapDirective = tableName ? `\n @@map("${tableName}")` : '';
221
+ const fieldsString = fields.map((f) => ` ${f}`).join('\n');
222
+ return `model ${name} {
223
+ ${fieldsString}${mapDirective}
224
+ }`;
225
+ }
226
+ /**
227
+ * Generate a Prisma enum string
228
+ */
229
+ export function generatePrismaEnum(name, values) {
230
+ const valuesString = values.map((v) => ` ${v}`).join('\n');
231
+ return `enum ${name} {
232
+ ${valuesString}
233
+ }`;
234
+ }
235
+ //# sourceMappingURL=prisma-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-schema.js","sourceRoot":"","sources":["../../../src/generators/utils/prisma-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA8DjE,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,aAAa,GAAG;QACpB,GAAG,WAAW,uBAAuB;QACrC,GAAG,WAAW,gBAAgB;QAC9B,GAAG,WAAW,8BAA8B;KAC7C,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,iBAAiB,EACpC,4BAA4B,QAAQ,EAAE,EACtC,qDAAqD,CACtD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,kBAAkB;IAClB,MAAM,UAAU,GAAG,uBAAuB,CAAC;IAE3C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACzD,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAEhD,oCAAoC;QACpC,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;YAC5B,iBAAiB,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,MAAM,SAAS,GAAG,sBAAsB,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACzD,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE9C,sEAAsE;QACtE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACpC,IAAI,UAAU,GAAG,iBAAiB,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;YAC9D,iBAAiB,GAAG,UAAU,CAAC;QACjC,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;QAC5B,iBAAiB,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACL,OAAO;QACP,QAAQ;QACR,MAAM;QACN,KAAK;QACL,YAAY;QACZ,WAAW;QACX,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,OAAe,EAAE,UAAkB;IACvD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,UAAU,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,UAAU,EAAE,CAAC;YACb,IAAI,OAAO,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,+BAA+B;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,OAAe;IAC5C,8CAA8C;IAC9C,MAAM,cAAc,GAAG,yBAAyB,CAAC;IACjD,MAAM,eAAe,GAAG,0BAA0B,CAAC;IAEnD,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAA8B,EAAE,SAAiB;IACxE,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,QAA8B,EAAE,QAAgB;IACtE,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAA8B,EAC9B,MAA+B,EAC/B,QAAgC,EAAE;IAElC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,gCAAgC;IAChC,MAAM,aAAa,GAAiD,EAAE,CAAC;IAEvE,oCAAoC;IACpC,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QAED,4DAA4D;QAC5D,MAAM,SAAS,GACb,QAAQ,CAAC,WAAW,GAAG,CAAC;YACtB,CAAC,CAAC,QAAQ,CAAC,WAAW;YACtB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,GAAG,CAAC;gBAC9B,CAAC,CAAC,QAAQ,CAAC,iBAAiB;gBAC5B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QAEhC,aAAa,CAAC,IAAI,CAAC;YACjB,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,IAAI;SAClC,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,8BAA8B;IAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,oDAAoD;QACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QAE9F,aAAa,CAAC,IAAI,CAAC;YACjB,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,IAAI;SAChC,CAAC,CAAC;QAEH,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,2EAA2E;IAC3E,IAAI,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC;IACvC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEtD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,eAAe;YACb,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,WAAW;QACX,UAAU;QACV,aAAa;QACb,YAAY;KACb,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA8B,EAC9B,MAA+B,EAC/B,QAAgC,EAAE;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,mBAAmB,EACtC,UAAU,KAAK,CAAC,IAAI,mCAAmC,EACvD,oFAAoF,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,mBAAmB,EACtC,SAAS,OAAO,CAAC,IAAI,mCAAmC,EACxD,iFAAiF,CAClF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,MAAgB,EAAE,SAAkB;IACpF,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5D,OAAO,SAAS,IAAI;EACpB,YAAY,GAAG,YAAY;EAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,MAAgB;IAC/D,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5D,OAAO,QAAQ,IAAI;EACnB,YAAY;EACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Router Integration Utilities
3
+ *
4
+ * Detects project router patterns and registers new procedures automatically.
5
+ * Supports three patterns:
6
+ * - Object-based: const router = { users: userProcedures }
7
+ * - Array-based: const collections = [userProcedures]
8
+ * - Centralized: exports in src/procedures/index.ts
9
+ */
10
+ /**
11
+ * Detected router pattern in a project
12
+ */
13
+ export type RouterPattern = {
14
+ type: 'object-based';
15
+ indexPath: string;
16
+ } | {
17
+ type: 'array-based';
18
+ indexPath: string;
19
+ } | {
20
+ type: 'centralized';
21
+ indexPath: string;
22
+ proceduresIndexPath: string;
23
+ } | {
24
+ type: 'unknown';
25
+ indexPath: string | null;
26
+ };
27
+ /**
28
+ * Result of registering procedures
29
+ */
30
+ export interface RegistrationResult {
31
+ /** Whether registration was successful */
32
+ readonly success: boolean;
33
+ /** Files that were modified */
34
+ readonly modifiedFiles: string[];
35
+ /** What was registered */
36
+ readonly registrations: {
37
+ /** Import added to index.ts */
38
+ importAdded: boolean;
39
+ /** Added to collections array */
40
+ addedToArray: boolean;
41
+ /** Added to router object */
42
+ addedToObject: boolean;
43
+ /** Export added to procedures/index.ts */
44
+ exportAdded: boolean;
45
+ };
46
+ /** Error message if failed */
47
+ readonly error?: string;
48
+ }
49
+ /**
50
+ * Detect the router pattern used in a project
51
+ */
52
+ export declare function detectRouterPattern(projectRoot: string): RouterPattern;
53
+ /**
54
+ * Register procedures in detected router pattern
55
+ *
56
+ * @param projectRoot - Project root directory
57
+ * @param entityName - Entity name (e.g., 'post', 'users')
58
+ * @param procedureVar - Procedure variable name (e.g., 'postProcedures')
59
+ * @param dryRun - If true, don't write files
60
+ */
61
+ export declare function registerProcedures(projectRoot: string, entityName: string, procedureVar: string, dryRun?: boolean): RegistrationResult;
62
+ /**
63
+ * Check if procedures are already registered
64
+ */
65
+ export declare function isProcedureRegistered(projectRoot: string, procedureVar: string): boolean;
66
+ /**
67
+ * Validate that registration is possible
68
+ */
69
+ export declare function validateCanRegister(projectRoot: string): void;
70
+ //# sourceMappingURL=router-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-integration.d.ts","sourceRoot":"","sources":["../../../src/generators/utils/router-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IACjC,0BAA0B;IAC1B,QAAQ,CAAC,aAAa,EAAE;QACtB,+BAA+B;QAC/B,WAAW,EAAE,OAAO,CAAC;QACrB,iCAAiC;QACjC,YAAY,EAAE,OAAO,CAAC;QACtB,6BAA6B;QAC7B,aAAa,EAAE,OAAO,CAAC;QACvB,0CAA0C;QAC1C,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA8CtE;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,MAAM,UAAQ,GACb,kBAAkB,CA0BpB;AAiND;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAgCxF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAU7D"}