@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,305 @@
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
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { GeneratorError, GeneratorErrorCode } from '../types.js';
13
+ import { analyzeFile, applyModifications, createAddExport, createAddImport, createAddToArray, createAddToObject, } from './ast-helpers.js';
14
+ // ============================================================================
15
+ // Pattern Detection
16
+ // ============================================================================
17
+ /**
18
+ * Detect the router pattern used in a project
19
+ */
20
+ export function detectRouterPattern(projectRoot) {
21
+ // Common entry point locations
22
+ const indexPaths = [
23
+ join(projectRoot, 'src/index.ts'),
24
+ join(projectRoot, 'src/server.ts'),
25
+ join(projectRoot, 'src/app.ts'),
26
+ join(projectRoot, 'index.ts'),
27
+ ];
28
+ // Find index file
29
+ let indexPath = null;
30
+ for (const path of indexPaths) {
31
+ if (existsSync(path)) {
32
+ indexPath = path;
33
+ break;
34
+ }
35
+ }
36
+ if (!indexPath) {
37
+ return { type: 'unknown', indexPath: null };
38
+ }
39
+ // Check for centralized exports pattern (src/procedures/index.ts)
40
+ const proceduresIndexPath = join(projectRoot, 'src/procedures/index.ts');
41
+ if (existsSync(proceduresIndexPath)) {
42
+ const proceduresContent = readFileSync(proceduresIndexPath, 'utf-8');
43
+ // Check if it has re-exports like: export { userProcedures } from './users.js';
44
+ if (proceduresContent.includes('export {') && proceduresContent.includes('Procedures')) {
45
+ return { type: 'centralized', indexPath, proceduresIndexPath };
46
+ }
47
+ }
48
+ // Read index file to detect pattern
49
+ const indexContent = readFileSync(indexPath, 'utf-8');
50
+ // Check for array-based pattern (const collections = [...])
51
+ if (/const\s+collections\s*=\s*\[/.test(indexContent)) {
52
+ return { type: 'array-based', indexPath };
53
+ }
54
+ // Check for object-based pattern (const router = {...})
55
+ if (/const\s+router\s*=\s*\{/.test(indexContent)) {
56
+ return { type: 'object-based', indexPath };
57
+ }
58
+ return { type: 'unknown', indexPath };
59
+ }
60
+ // ============================================================================
61
+ // Registration Logic
62
+ // ============================================================================
63
+ /**
64
+ * Register procedures in detected router pattern
65
+ *
66
+ * @param projectRoot - Project root directory
67
+ * @param entityName - Entity name (e.g., 'post', 'users')
68
+ * @param procedureVar - Procedure variable name (e.g., 'postProcedures')
69
+ * @param dryRun - If true, don't write files
70
+ */
71
+ export function registerProcedures(projectRoot, entityName, procedureVar, dryRun = false) {
72
+ const pattern = detectRouterPattern(projectRoot);
73
+ switch (pattern.type) {
74
+ case 'centralized':
75
+ return registerCentralized(pattern, entityName, procedureVar, dryRun);
76
+ case 'array-based':
77
+ return registerArrayBased(pattern, entityName, procedureVar, dryRun);
78
+ case 'object-based':
79
+ return registerObjectBased(pattern, entityName, procedureVar, dryRun);
80
+ case 'unknown':
81
+ return {
82
+ success: false,
83
+ modifiedFiles: [],
84
+ registrations: {
85
+ importAdded: false,
86
+ addedToArray: false,
87
+ addedToObject: false,
88
+ exportAdded: false,
89
+ },
90
+ error: 'Could not detect router pattern. Manual registration required.',
91
+ };
92
+ }
93
+ }
94
+ /**
95
+ * Register procedures in centralized pattern
96
+ *
97
+ * 1. Add export to src/procedures/index.ts
98
+ * 2. Import from procedures/index.ts in src/index.ts (if needed)
99
+ * 3. Add to collections array in src/index.ts
100
+ */
101
+ function registerCentralized(pattern, entityName, procedureVar, dryRun) {
102
+ const modifiedFiles = [];
103
+ const registrations = {
104
+ importAdded: false,
105
+ addedToArray: false,
106
+ addedToObject: false,
107
+ exportAdded: false,
108
+ };
109
+ try {
110
+ // 1. Add export to procedures/index.ts
111
+ const proceduresAnalysis = analyzeFile(pattern.proceduresIndexPath);
112
+ const exportMod = createAddExport(proceduresAnalysis, procedureVar, `./${entityName}.js`);
113
+ if (exportMod) {
114
+ const newContent = applyModifications(proceduresAnalysis.content, [exportMod]);
115
+ if (!dryRun) {
116
+ writeFileSync(pattern.proceduresIndexPath, newContent, 'utf-8');
117
+ }
118
+ modifiedFiles.push(pattern.proceduresIndexPath);
119
+ registrations.exportAdded = true;
120
+ }
121
+ // 2. Update src/index.ts
122
+ const indexAnalysis = analyzeFile(pattern.indexPath);
123
+ const indexMods = [];
124
+ // Check if import from procedures/index.ts exists
125
+ // In centralized pattern, imports come from './procedures/index.js'
126
+ // We need to ensure the new procedure is imported
127
+ const importMod = createAddImport(indexAnalysis, procedureVar, './procedures/index.js');
128
+ if (importMod) {
129
+ indexMods.push(importMod);
130
+ registrations.importAdded = true;
131
+ }
132
+ // Add to collections array
133
+ const arrayMod = createAddToArray(indexAnalysis, 'collections', procedureVar);
134
+ if (arrayMod) {
135
+ indexMods.push(arrayMod);
136
+ registrations.addedToArray = true;
137
+ }
138
+ // Add to router object (for types)
139
+ const objectMod = createAddToObject(indexAnalysis, 'router', entityName, procedureVar);
140
+ if (objectMod) {
141
+ indexMods.push(objectMod);
142
+ registrations.addedToObject = true;
143
+ }
144
+ if (indexMods.length > 0) {
145
+ const newContent = applyModifications(indexAnalysis.content, indexMods);
146
+ if (!dryRun) {
147
+ writeFileSync(pattern.indexPath, newContent, 'utf-8');
148
+ }
149
+ modifiedFiles.push(pattern.indexPath);
150
+ }
151
+ return { success: true, modifiedFiles, registrations };
152
+ }
153
+ catch (err) {
154
+ return {
155
+ success: false,
156
+ modifiedFiles,
157
+ registrations,
158
+ error: err instanceof Error ? err.message : String(err),
159
+ };
160
+ }
161
+ }
162
+ /**
163
+ * Register procedures in array-based pattern
164
+ *
165
+ * 1. Add import to src/index.ts
166
+ * 2. Add to collections array
167
+ * 3. Add to router object (if exists)
168
+ */
169
+ function registerArrayBased(pattern, entityName, procedureVar, dryRun) {
170
+ const modifiedFiles = [];
171
+ const registrations = {
172
+ importAdded: false,
173
+ addedToArray: false,
174
+ addedToObject: false,
175
+ exportAdded: false,
176
+ };
177
+ try {
178
+ const analysis = analyzeFile(pattern.indexPath);
179
+ const modifications = [];
180
+ // Add import
181
+ const importMod = createAddImport(analysis, procedureVar, `./procedures/${entityName}.js`);
182
+ if (importMod) {
183
+ modifications.push(importMod);
184
+ registrations.importAdded = true;
185
+ }
186
+ // Add to collections array
187
+ const arrayMod = createAddToArray(analysis, 'collections', procedureVar);
188
+ if (arrayMod) {
189
+ modifications.push(arrayMod);
190
+ registrations.addedToArray = true;
191
+ }
192
+ // Add to router object (if exists)
193
+ const objectMod = createAddToObject(analysis, 'router', entityName, procedureVar);
194
+ if (objectMod) {
195
+ modifications.push(objectMod);
196
+ registrations.addedToObject = true;
197
+ }
198
+ if (modifications.length > 0) {
199
+ const newContent = applyModifications(analysis.content, modifications);
200
+ if (!dryRun) {
201
+ writeFileSync(pattern.indexPath, newContent, 'utf-8');
202
+ }
203
+ modifiedFiles.push(pattern.indexPath);
204
+ }
205
+ return { success: true, modifiedFiles, registrations };
206
+ }
207
+ catch (err) {
208
+ return {
209
+ success: false,
210
+ modifiedFiles,
211
+ registrations,
212
+ error: err instanceof Error ? err.message : String(err),
213
+ };
214
+ }
215
+ }
216
+ /**
217
+ * Register procedures in object-based pattern
218
+ *
219
+ * 1. Add import to src/index.ts
220
+ * 2. Add to router object
221
+ */
222
+ function registerObjectBased(pattern, entityName, procedureVar, dryRun) {
223
+ const modifiedFiles = [];
224
+ const registrations = {
225
+ importAdded: false,
226
+ addedToArray: false,
227
+ addedToObject: false,
228
+ exportAdded: false,
229
+ };
230
+ try {
231
+ const analysis = analyzeFile(pattern.indexPath);
232
+ const modifications = [];
233
+ // Add import
234
+ const importMod = createAddImport(analysis, procedureVar, `./procedures/${entityName}.js`);
235
+ if (importMod) {
236
+ modifications.push(importMod);
237
+ registrations.importAdded = true;
238
+ }
239
+ // Add to router object
240
+ const objectMod = createAddToObject(analysis, 'router', entityName, procedureVar);
241
+ if (objectMod) {
242
+ modifications.push(objectMod);
243
+ registrations.addedToObject = true;
244
+ }
245
+ if (modifications.length > 0) {
246
+ const newContent = applyModifications(analysis.content, modifications);
247
+ if (!dryRun) {
248
+ writeFileSync(pattern.indexPath, newContent, 'utf-8');
249
+ }
250
+ modifiedFiles.push(pattern.indexPath);
251
+ }
252
+ return { success: true, modifiedFiles, registrations };
253
+ }
254
+ catch (err) {
255
+ return {
256
+ success: false,
257
+ modifiedFiles,
258
+ registrations,
259
+ error: err instanceof Error ? err.message : String(err),
260
+ };
261
+ }
262
+ }
263
+ // ============================================================================
264
+ // Validation
265
+ // ============================================================================
266
+ /**
267
+ * Check if procedures are already registered
268
+ */
269
+ export function isProcedureRegistered(projectRoot, procedureVar) {
270
+ const pattern = detectRouterPattern(projectRoot);
271
+ if (pattern.type === 'unknown' || !pattern.indexPath) {
272
+ return false;
273
+ }
274
+ try {
275
+ const analysis = analyzeFile(pattern.indexPath);
276
+ // Check if imported
277
+ const isImported = analysis.imports.some((imp) => imp.namedImports.includes(procedureVar));
278
+ if (!isImported)
279
+ return false;
280
+ // Check if in collections array
281
+ const collectionsVar = analysis.variables.find((v) => v.name === 'collections' && v.isArray);
282
+ if (collectionsVar?.arrayElements.includes(procedureVar)) {
283
+ return true;
284
+ }
285
+ // Check if in router object
286
+ const routerVar = analysis.variables.find((v) => v.name === 'router' && v.isObject);
287
+ if (routerVar?.objectProperties.some((p) => analysis.content.includes(`${p}: ${procedureVar}`))) {
288
+ return true;
289
+ }
290
+ return false;
291
+ }
292
+ catch {
293
+ return false;
294
+ }
295
+ }
296
+ /**
297
+ * Validate that registration is possible
298
+ */
299
+ export function validateCanRegister(projectRoot) {
300
+ const pattern = detectRouterPattern(projectRoot);
301
+ if (pattern.type === 'unknown') {
302
+ throw new GeneratorError(GeneratorErrorCode.PROJECT_STRUCTURE, 'Could not detect router pattern in project', 'Ensure src/index.ts exists with a router or collections variable.');
303
+ }
304
+ }
305
+ //# sourceMappingURL=router-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-integration.js","sourceRoot":"","sources":["../../../src/generators/utils/router-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Snapshot and Rollback System
3
+ *
4
+ * Creates snapshots of files before modification and enables rollback
5
+ * if any operation fails. Provides transaction-like safety for file operations.
6
+ */
7
+ /**
8
+ * Snapshot of file states before modification
9
+ *
10
+ * Note: These properties are intentionally mutable since the snapshot
11
+ * is populated incrementally as files are created/modified.
12
+ */
13
+ export interface FileSnapshot {
14
+ /** Files that were created (didn't exist before) - mutated by trackCreated() */
15
+ createdFiles: string[];
16
+ /** Files that were modified (original content saved) - mutated by saveOriginal() */
17
+ modifiedFiles: Map<string, string>;
18
+ }
19
+ /**
20
+ * Options for snapshot operations
21
+ */
22
+ export interface SnapshotOptions {
23
+ /** Whether to log rollback actions */
24
+ readonly verbose?: boolean;
25
+ }
26
+ /**
27
+ * Create a new empty snapshot
28
+ */
29
+ export declare function createSnapshot(): FileSnapshot;
30
+ /**
31
+ * Save original file content before modification
32
+ *
33
+ * Call this before modifying any existing file.
34
+ */
35
+ export declare function saveOriginal(snapshot: FileSnapshot, filePath: string): void;
36
+ /**
37
+ * Track a newly created file
38
+ *
39
+ * Call this after creating a new file.
40
+ */
41
+ export declare function trackCreated(snapshot: FileSnapshot, filePath: string): void;
42
+ /**
43
+ * Rollback all changes from a snapshot
44
+ *
45
+ * - Deletes files that were created
46
+ * - Restores files that were modified to their original state
47
+ */
48
+ export declare function rollback(snapshot: FileSnapshot, options?: SnapshotOptions): RollbackResult;
49
+ /**
50
+ * Result of a rollback operation
51
+ */
52
+ export interface RollbackResult {
53
+ /** Whether rollback completed without errors */
54
+ readonly success: boolean;
55
+ /** Files that were deleted */
56
+ readonly deletedFiles: string[];
57
+ /** Files that were restored */
58
+ readonly restoredFiles: string[];
59
+ /** Errors encountered during rollback */
60
+ readonly errors: string[];
61
+ }
62
+ /**
63
+ * Execute an operation with automatic rollback on failure
64
+ *
65
+ * @example
66
+ * const result = await executeWithRollback(async (snapshot) => {
67
+ * // Save originals before modifying
68
+ * saveOriginal(snapshot, 'prisma/schema.prisma');
69
+ *
70
+ * // Modify files...
71
+ * writeFileSync('prisma/schema.prisma', newContent);
72
+ *
73
+ * // Track newly created files
74
+ * trackCreated(snapshot, 'src/procedures/post.ts');
75
+ *
76
+ * // If any error is thrown, all changes are rolled back
77
+ * return { success: true };
78
+ * });
79
+ */
80
+ export declare function executeWithRollback<T>(operation: (snapshot: FileSnapshot) => Promise<T>, options?: SnapshotOptions): Promise<T>;
81
+ /**
82
+ * Clear a snapshot (for manual cleanup after success)
83
+ */
84
+ export declare function clearSnapshot(snapshot: FileSnapshot): void;
85
+ /**
86
+ * Get summary of changes tracked in snapshot
87
+ */
88
+ export declare function getSnapshotSummary(snapshot: FileSnapshot): string;
89
+ /**
90
+ * Check if snapshot has any tracked changes
91
+ */
92
+ export declare function hasChanges(snapshot: FileSnapshot): boolean;
93
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/generators/utils/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oFAAoF;IACpF,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAMD;;GAEG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAK7C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAW3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAK3E;AAMD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,GAAE,eAAoB,GAAG,cAAc,CA0C9F;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAChC,+BAA+B;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IACjC,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC3B;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,SAAS,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,EACjD,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,CAAC,CAAC,CAwBZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAG1D;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAkBjE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Snapshot and Rollback System
3
+ *
4
+ * Creates snapshots of files before modification and enables rollback
5
+ * if any operation fails. Provides transaction-like safety for file operations.
6
+ */
7
+ import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
8
+ import pc from 'picocolors';
9
+ // ============================================================================
10
+ // Snapshot Management
11
+ // ============================================================================
12
+ /**
13
+ * Create a new empty snapshot
14
+ */
15
+ export function createSnapshot() {
16
+ return {
17
+ createdFiles: [],
18
+ modifiedFiles: new Map(),
19
+ };
20
+ }
21
+ /**
22
+ * Save original file content before modification
23
+ *
24
+ * Call this before modifying any existing file.
25
+ */
26
+ export function saveOriginal(snapshot, filePath) {
27
+ // Don't save if already tracked
28
+ if (snapshot.modifiedFiles.has(filePath)) {
29
+ return;
30
+ }
31
+ // Only save if file exists
32
+ if (existsSync(filePath)) {
33
+ const content = readFileSync(filePath, 'utf-8');
34
+ snapshot.modifiedFiles.set(filePath, content);
35
+ }
36
+ }
37
+ /**
38
+ * Track a newly created file
39
+ *
40
+ * Call this after creating a new file.
41
+ */
42
+ export function trackCreated(snapshot, filePath) {
43
+ // Only track if not already tracked as modified
44
+ if (!snapshot.modifiedFiles.has(filePath) && !snapshot.createdFiles.includes(filePath)) {
45
+ snapshot.createdFiles.push(filePath);
46
+ }
47
+ }
48
+ // ============================================================================
49
+ // Rollback Operations
50
+ // ============================================================================
51
+ /**
52
+ * Rollback all changes from a snapshot
53
+ *
54
+ * - Deletes files that were created
55
+ * - Restores files that were modified to their original state
56
+ */
57
+ export function rollback(snapshot, options = {}) {
58
+ const { verbose = false } = options;
59
+ const deletedFiles = [];
60
+ const restoredFiles = [];
61
+ const errors = [];
62
+ // Delete created files
63
+ for (const filePath of snapshot.createdFiles) {
64
+ try {
65
+ if (existsSync(filePath)) {
66
+ unlinkSync(filePath);
67
+ deletedFiles.push(filePath);
68
+ if (verbose) {
69
+ console.log(pc.dim(` Deleted: ${filePath}`));
70
+ }
71
+ }
72
+ }
73
+ catch (err) {
74
+ const message = err instanceof Error ? err.message : String(err);
75
+ errors.push(`Failed to delete ${filePath}: ${message}`);
76
+ }
77
+ }
78
+ // Restore modified files
79
+ for (const [filePath, originalContent] of snapshot.modifiedFiles) {
80
+ try {
81
+ writeFileSync(filePath, originalContent, 'utf-8');
82
+ restoredFiles.push(filePath);
83
+ if (verbose) {
84
+ console.log(pc.dim(` Restored: ${filePath}`));
85
+ }
86
+ }
87
+ catch (err) {
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ errors.push(`Failed to restore ${filePath}: ${message}`);
90
+ }
91
+ }
92
+ return {
93
+ success: errors.length === 0,
94
+ deletedFiles,
95
+ restoredFiles,
96
+ errors,
97
+ };
98
+ }
99
+ // ============================================================================
100
+ // Transaction-like Operations
101
+ // ============================================================================
102
+ /**
103
+ * Execute an operation with automatic rollback on failure
104
+ *
105
+ * @example
106
+ * const result = await executeWithRollback(async (snapshot) => {
107
+ * // Save originals before modifying
108
+ * saveOriginal(snapshot, 'prisma/schema.prisma');
109
+ *
110
+ * // Modify files...
111
+ * writeFileSync('prisma/schema.prisma', newContent);
112
+ *
113
+ * // Track newly created files
114
+ * trackCreated(snapshot, 'src/procedures/post.ts');
115
+ *
116
+ * // If any error is thrown, all changes are rolled back
117
+ * return { success: true };
118
+ * });
119
+ */
120
+ export async function executeWithRollback(operation, options = {}) {
121
+ const snapshot = createSnapshot();
122
+ try {
123
+ return await operation(snapshot);
124
+ }
125
+ catch (error) {
126
+ // Rollback on error
127
+ if (options.verbose) {
128
+ console.log(pc.yellow('\n Rolling back changes...'));
129
+ }
130
+ const result = rollback(snapshot, options);
131
+ if (!result.success) {
132
+ console.error(pc.red(' Warning: Some files could not be restored:'));
133
+ for (const err of result.errors) {
134
+ console.error(pc.red(` - ${err}`));
135
+ }
136
+ }
137
+ else if (options.verbose) {
138
+ console.log(pc.dim(' Rollback complete.'));
139
+ }
140
+ throw error;
141
+ }
142
+ }
143
+ /**
144
+ * Clear a snapshot (for manual cleanup after success)
145
+ */
146
+ export function clearSnapshot(snapshot) {
147
+ snapshot.createdFiles.length = 0;
148
+ snapshot.modifiedFiles.clear();
149
+ }
150
+ // ============================================================================
151
+ // Utility Functions
152
+ // ============================================================================
153
+ /**
154
+ * Get summary of changes tracked in snapshot
155
+ */
156
+ export function getSnapshotSummary(snapshot) {
157
+ const lines = [];
158
+ if (snapshot.createdFiles.length > 0) {
159
+ lines.push(`Created files (${snapshot.createdFiles.length}):`);
160
+ for (const file of snapshot.createdFiles) {
161
+ lines.push(` - ${file}`);
162
+ }
163
+ }
164
+ if (snapshot.modifiedFiles.size > 0) {
165
+ lines.push(`Modified files (${snapshot.modifiedFiles.size}):`);
166
+ for (const file of snapshot.modifiedFiles.keys()) {
167
+ lines.push(` - ${file}`);
168
+ }
169
+ }
170
+ return lines.join('\n');
171
+ }
172
+ /**
173
+ * Check if snapshot has any tracked changes
174
+ */
175
+ export function hasChanges(snapshot) {
176
+ return snapshot.createdFiles.length > 0 || snapshot.modifiedFiles.size > 0;
177
+ }
178
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/generators/utils/snapshot.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -23,7 +23,12 @@ export declare const CLI_VERSION: string;
23
23
  */
24
24
  export { createDbCommand } from './commands/db.js';
25
25
  export { createDevCommand } from './commands/dev.js';
26
+ export { createIntrospectCommand } from './commands/introspect.js';
26
27
  export { createMigrateCommand } from './commands/migrate.js';
28
+ /**
29
+ * Export error system
30
+ */
31
+ export * from './errors/index.js';
27
32
  /**
28
33
  * Export migration runner
29
34
  */
@@ -37,4 +42,5 @@ export * from './seeding/index.js';
37
42
  */
38
43
  export * from './utils/output.js';
39
44
  export * from './utils/paths.js';
45
+ export * from './utils/schema-patterns.js';
40
46
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,0BAA0B;AAC1B,eAAO,MAAM,WAAW,EAAE,MAA+C,CAAC;AAE1E;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D;;GAEG;AACH,cAAc,uBAAuB,CAAC;AACtC;;GAEG;AACH,cAAc,oBAAoB,CAAC;AACnC;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,0BAA0B;AAC1B,eAAO,MAAM,WAAW,EAAE,MAA+C,CAAC;AAE1E;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC;;GAEG;AACH,cAAc,uBAAuB,CAAC;AACtC;;GAEG;AACH,cAAc,oBAAoB,CAAC;AACnC;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -27,7 +27,12 @@ export const CLI_VERSION = packageJson.version ?? '0.0.0-unknown';
27
27
  */
28
28
  export { createDbCommand } from './commands/db.js';
29
29
  export { createDevCommand } from './commands/dev.js';
30
+ export { createIntrospectCommand } from './commands/introspect.js';
30
31
  export { createMigrateCommand } from './commands/migrate.js';
32
+ /**
33
+ * Export error system
34
+ */
35
+ export * from './errors/index.js';
31
36
  /**
32
37
  * Export migration runner
33
38
  */
@@ -41,4 +46,5 @@ export * from './seeding/index.js';
41
46
  */
42
47
  export * from './utils/output.js';
43
48
  export * from './utils/paths.js';
49
+ export * from './utils/schema-patterns.js';
44
50
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,WAAW,GAAW,WAAW,CAAC,OAAO,IAAI,eAAe,CAAC;AAE1E;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D;;GAEG;AACH,cAAc,uBAAuB,CAAC;AACtC;;GAEG;AACH,cAAc,oBAAoB,CAAC;AACnC;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,WAAW,GAAW,WAAW,CAAC,OAAO,IAAI,eAAe,CAAC;AAE1E;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC;;GAEG;AACH,cAAc,uBAAuB,CAAC;AACtC;;GAEG;AACH,cAAc,oBAAoB,CAAC;AACnC;;GAEG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC"}