nestjs-ddd-cli 2.2.1 → 3.2.2

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 (262) hide show
  1. package/README.md +247 -408
  2. package/ddd.schema.json +111 -0
  3. package/dist/commands/aggregate-validator.d.ts +9 -0
  4. package/dist/commands/aggregate-validator.js +953 -0
  5. package/dist/commands/aggregate-validator.js.map +1 -0
  6. package/dist/commands/ai-assist.d.ts +8 -0
  7. package/dist/commands/ai-assist.js +337 -0
  8. package/dist/commands/ai-assist.js.map +1 -0
  9. package/dist/commands/api-contracts.d.ts +9 -0
  10. package/dist/commands/api-contracts.js +1368 -0
  11. package/dist/commands/api-contracts.js.map +1 -0
  12. package/dist/commands/api-docs.d.ts +8 -0
  13. package/dist/commands/api-docs.js +408 -0
  14. package/dist/commands/api-docs.js.map +1 -0
  15. package/dist/commands/api-versioning.d.ts +11 -0
  16. package/dist/commands/api-versioning.js +643 -0
  17. package/dist/commands/api-versioning.js.map +1 -0
  18. package/dist/commands/audit-logging.d.ts +9 -0
  19. package/dist/commands/audit-logging.js +1129 -0
  20. package/dist/commands/audit-logging.js.map +1 -0
  21. package/dist/commands/batch-generate.d.ts +10 -0
  22. package/dist/commands/batch-generate.js +405 -0
  23. package/dist/commands/batch-generate.js.map +1 -0
  24. package/dist/commands/caching-strategies.d.ts +9 -0
  25. package/dist/commands/caching-strategies.js +874 -0
  26. package/dist/commands/caching-strategies.js.map +1 -0
  27. package/dist/commands/code-analyzer.d.ts +42 -0
  28. package/dist/commands/code-analyzer.js +474 -0
  29. package/dist/commands/code-analyzer.js.map +1 -0
  30. package/dist/commands/database-seeding.d.ts +6 -0
  31. package/dist/commands/database-seeding.js +621 -0
  32. package/dist/commands/database-seeding.js.map +1 -0
  33. package/dist/commands/db-optimization.d.ts +7 -0
  34. package/dist/commands/db-optimization.js +687 -0
  35. package/dist/commands/db-optimization.js.map +1 -0
  36. package/dist/commands/dependency-graph.d.ts +6 -0
  37. package/dist/commands/dependency-graph.js +329 -0
  38. package/dist/commands/dependency-graph.js.map +1 -0
  39. package/dist/commands/doctor-enhanced.d.ts +22 -0
  40. package/dist/commands/doctor-enhanced.js +543 -0
  41. package/dist/commands/doctor-enhanced.js.map +1 -0
  42. package/dist/commands/doctor.d.ts +4 -0
  43. package/dist/commands/doctor.js +151 -0
  44. package/dist/commands/doctor.js.map +1 -0
  45. package/dist/commands/env-manager.d.ts +6 -0
  46. package/dist/commands/env-manager.js +419 -0
  47. package/dist/commands/env-manager.js.map +1 -0
  48. package/dist/commands/event-sourcing-full.d.ts +10 -0
  49. package/dist/commands/event-sourcing-full.js +1107 -0
  50. package/dist/commands/event-sourcing-full.js.map +1 -0
  51. package/dist/commands/feature-flags.d.ts +9 -0
  52. package/dist/commands/feature-flags.js +824 -0
  53. package/dist/commands/feature-flags.js.map +1 -0
  54. package/dist/commands/filter-dsl.d.ts +10 -0
  55. package/dist/commands/filter-dsl.js +1407 -0
  56. package/dist/commands/filter-dsl.js.map +1 -0
  57. package/dist/commands/generate-all.js +525 -36
  58. package/dist/commands/generate-all.js.map +1 -1
  59. package/dist/commands/generate-deployment.d.ts +8 -0
  60. package/dist/commands/generate-deployment.js +746 -0
  61. package/dist/commands/generate-deployment.js.map +1 -0
  62. package/dist/commands/generate-domain-service.d.ts +14 -0
  63. package/dist/commands/generate-domain-service.js +796 -0
  64. package/dist/commands/generate-domain-service.js.map +1 -0
  65. package/dist/commands/generate-entity.js +87 -25
  66. package/dist/commands/generate-entity.js.map +1 -1
  67. package/dist/commands/generate-from-schema.d.ts +56 -0
  68. package/dist/commands/generate-from-schema.js +222 -0
  69. package/dist/commands/generate-from-schema.js.map +1 -0
  70. package/dist/commands/generate-module.js +37 -29
  71. package/dist/commands/generate-module.js.map +1 -1
  72. package/dist/commands/generate-orchestrator.d.ts +14 -0
  73. package/dist/commands/generate-orchestrator.js +887 -0
  74. package/dist/commands/generate-orchestrator.js.map +1 -0
  75. package/dist/commands/generate-repository.d.ts +14 -0
  76. package/dist/commands/generate-repository.js +1019 -0
  77. package/dist/commands/generate-repository.js.map +1 -0
  78. package/dist/commands/generate-shared.d.ts +4 -0
  79. package/dist/commands/generate-shared.js +388 -0
  80. package/dist/commands/generate-shared.js.map +1 -0
  81. package/dist/commands/generate-value-object.d.ts +32 -0
  82. package/dist/commands/generate-value-object.js +700 -0
  83. package/dist/commands/generate-value-object.js.map +1 -0
  84. package/dist/commands/graphql-subscriptions.d.ts +6 -0
  85. package/dist/commands/graphql-subscriptions.js +607 -0
  86. package/dist/commands/graphql-subscriptions.js.map +1 -0
  87. package/dist/commands/graphql-types.d.ts +5 -0
  88. package/dist/commands/graphql-types.js +423 -0
  89. package/dist/commands/graphql-types.js.map +1 -0
  90. package/dist/commands/health-probes-advanced.d.ts +6 -0
  91. package/dist/commands/health-probes-advanced.js +655 -0
  92. package/dist/commands/health-probes-advanced.js.map +1 -0
  93. package/dist/commands/i18n-setup.d.ts +10 -0
  94. package/dist/commands/i18n-setup.js +677 -0
  95. package/dist/commands/i18n-setup.js.map +1 -0
  96. package/dist/commands/init-config.d.ts +6 -0
  97. package/dist/commands/init-config.js +370 -0
  98. package/dist/commands/init-config.js.map +1 -0
  99. package/dist/commands/init-project.js +56 -6
  100. package/dist/commands/init-project.js.map +1 -1
  101. package/dist/commands/interactive-scaffold.d.ts +5 -0
  102. package/dist/commands/interactive-scaffold.js +271 -0
  103. package/dist/commands/interactive-scaffold.js.map +1 -0
  104. package/dist/commands/metrics-prometheus.d.ts +6 -0
  105. package/dist/commands/metrics-prometheus.js +681 -0
  106. package/dist/commands/metrics-prometheus.js.map +1 -0
  107. package/dist/commands/migration-engine.d.ts +6 -0
  108. package/dist/commands/migration-engine.js +446 -0
  109. package/dist/commands/migration-engine.js.map +1 -0
  110. package/dist/commands/migration.d.ts +12 -0
  111. package/dist/commands/migration.js +484 -0
  112. package/dist/commands/migration.js.map +1 -0
  113. package/dist/commands/monorepo.d.ts +8 -0
  114. package/dist/commands/monorepo.js +483 -0
  115. package/dist/commands/monorepo.js.map +1 -0
  116. package/dist/commands/multi-database.d.ts +5 -0
  117. package/dist/commands/multi-database.js +439 -0
  118. package/dist/commands/multi-database.js.map +1 -0
  119. package/dist/commands/observability-tracing.d.ts +10 -0
  120. package/dist/commands/observability-tracing.js +740 -0
  121. package/dist/commands/observability-tracing.js.map +1 -0
  122. package/dist/commands/openapi-export.d.ts +8 -0
  123. package/dist/commands/openapi-export.js +359 -0
  124. package/dist/commands/openapi-export.js.map +1 -0
  125. package/dist/commands/perf-analyzer.d.ts +8 -0
  126. package/dist/commands/perf-analyzer.js +423 -0
  127. package/dist/commands/perf-analyzer.js.map +1 -0
  128. package/dist/commands/rate-limiting.d.ts +10 -0
  129. package/dist/commands/rate-limiting.js +953 -0
  130. package/dist/commands/rate-limiting.js.map +1 -0
  131. package/dist/commands/recipe-plugin.d.ts +56 -0
  132. package/dist/commands/recipe-plugin.js +315 -0
  133. package/dist/commands/recipe-plugin.js.map +1 -0
  134. package/dist/commands/recipe.d.ts +6 -0
  135. package/dist/commands/recipe.js +3988 -0
  136. package/dist/commands/recipe.js.map +1 -0
  137. package/dist/commands/recipes/elasticsearch.recipe.d.ts +1 -0
  138. package/dist/commands/recipes/elasticsearch.recipe.js +761 -0
  139. package/dist/commands/recipes/elasticsearch.recipe.js.map +1 -0
  140. package/dist/commands/recipes/event-sourcing.recipe.d.ts +1 -0
  141. package/dist/commands/recipes/event-sourcing.recipe.js +889 -0
  142. package/dist/commands/recipes/event-sourcing.recipe.js.map +1 -0
  143. package/dist/commands/recipes/index.d.ts +8 -0
  144. package/dist/commands/recipes/index.js +25 -0
  145. package/dist/commands/recipes/index.js.map +1 -0
  146. package/dist/commands/recipes/joi-env.recipe.d.ts +1 -0
  147. package/dist/commands/recipes/joi-env.recipe.js +301 -0
  148. package/dist/commands/recipes/joi-env.recipe.js.map +1 -0
  149. package/dist/commands/recipes/message-queue.recipe.d.ts +1 -0
  150. package/dist/commands/recipes/message-queue.recipe.js +706 -0
  151. package/dist/commands/recipes/message-queue.recipe.js.map +1 -0
  152. package/dist/commands/recipes/middleware.recipe.d.ts +1 -0
  153. package/dist/commands/recipes/middleware.recipe.js +383 -0
  154. package/dist/commands/recipes/middleware.recipe.js.map +1 -0
  155. package/dist/commands/recipes/multi-tenancy.recipe.d.ts +1 -0
  156. package/dist/commands/recipes/multi-tenancy.recipe.js +520 -0
  157. package/dist/commands/recipes/multi-tenancy.recipe.js.map +1 -0
  158. package/dist/commands/recipes/oauth2.recipe.d.ts +1 -0
  159. package/dist/commands/recipes/oauth2.recipe.js +472 -0
  160. package/dist/commands/recipes/oauth2.recipe.js.map +1 -0
  161. package/dist/commands/recipes/websocket.recipe.d.ts +1 -0
  162. package/dist/commands/recipes/websocket.recipe.js +453 -0
  163. package/dist/commands/recipes/websocket.recipe.js.map +1 -0
  164. package/dist/commands/resilience-patterns.d.ts +13 -0
  165. package/dist/commands/resilience-patterns.js +1029 -0
  166. package/dist/commands/resilience-patterns.js.map +1 -0
  167. package/dist/commands/security-patterns.d.ts +11 -0
  168. package/dist/commands/security-patterns.js +2233 -0
  169. package/dist/commands/security-patterns.js.map +1 -0
  170. package/dist/commands/template-debug.d.ts +27 -0
  171. package/dist/commands/template-debug.js +388 -0
  172. package/dist/commands/template-debug.js.map +1 -0
  173. package/dist/commands/test-factory-full.d.ts +9 -0
  174. package/dist/commands/test-factory-full.js +1570 -0
  175. package/dist/commands/test-factory-full.js.map +1 -0
  176. package/dist/commands/test-scaffold.d.ts +7 -0
  177. package/dist/commands/test-scaffold.js +621 -0
  178. package/dist/commands/test-scaffold.js.map +1 -0
  179. package/dist/index.js +1092 -1
  180. package/dist/index.js.map +1 -1
  181. package/dist/templates/ai-context/CLAUDE.md.hbs +173 -0
  182. package/dist/templates/ai-context/conventions.md.hbs +161 -0
  183. package/dist/templates/command/create-command.hbs +6 -14
  184. package/dist/templates/command/delete-command.hbs +19 -0
  185. package/dist/templates/command/update-command.hbs +24 -0
  186. package/dist/templates/controller/controller.hbs +64 -17
  187. package/dist/templates/dto/create-dto.hbs +29 -5
  188. package/dist/templates/dto/filter-dto.hbs +52 -0
  189. package/dist/templates/dto/filter-query.dto.hbs +148 -0
  190. package/dist/templates/dto/paginated-response.dto.hbs +29 -0
  191. package/dist/templates/dto/pagination-query.dto.hbs +30 -0
  192. package/dist/templates/dto/response-dto.hbs +38 -0
  193. package/dist/templates/dto/update-dto.hbs +11 -0
  194. package/dist/templates/entity/entity.hbs +32 -1
  195. package/dist/templates/event/domain-event.hbs +33 -7
  196. package/dist/templates/event/event-handler.hbs +40 -0
  197. package/dist/templates/exception/base-exceptions.hbs +69 -0
  198. package/dist/templates/exception/entity-not-found.exception.hbs +7 -0
  199. package/dist/templates/mapper/mapper.hbs +49 -24
  200. package/dist/templates/module/module.hbs +34 -10
  201. package/dist/templates/orm-entity/orm-entity.hbs +63 -12
  202. package/dist/templates/prisma/prisma-mapper.hbs +71 -0
  203. package/dist/templates/prisma/prisma-repository.hbs +114 -0
  204. package/dist/templates/prisma/prisma-schema.hbs +20 -0
  205. package/dist/templates/prisma/prisma-service.hbs +51 -0
  206. package/dist/templates/query/get-all.query.hbs +50 -0
  207. package/dist/templates/query/get-by-id.query.hbs +31 -0
  208. package/dist/templates/repository/repository.hbs +56 -14
  209. package/dist/templates/resolver/graphql-input.hbs +54 -0
  210. package/dist/templates/resolver/graphql-type.hbs +58 -0
  211. package/dist/templates/resolver/pagination-args.hbs +33 -0
  212. package/dist/templates/resolver/resolver.hbs +62 -0
  213. package/dist/templates/shared/prisma-query-builder.util.hbs +189 -0
  214. package/dist/templates/shared/query-builder.util.hbs +218 -0
  215. package/dist/templates/test/controller.spec.hbs +124 -0
  216. package/dist/templates/test/repository.spec.hbs +158 -0
  217. package/dist/templates/test/usecase.spec.hbs +116 -0
  218. package/dist/templates/usecase/create-usecase.hbs +20 -8
  219. package/dist/templates/usecase/delete-usecase.hbs +17 -0
  220. package/dist/templates/usecase/update-usecase.hbs +31 -0
  221. package/dist/utils/config.utils.d.ts +45 -0
  222. package/dist/utils/config.utils.js +211 -0
  223. package/dist/utils/config.utils.js.map +1 -0
  224. package/dist/utils/dependency.utils.d.ts +2 -0
  225. package/dist/utils/dependency.utils.js +44 -3
  226. package/dist/utils/dependency.utils.js.map +1 -1
  227. package/dist/utils/error.utils.d.ts +145 -0
  228. package/dist/utils/error.utils.js +422 -0
  229. package/dist/utils/error.utils.js.map +1 -0
  230. package/dist/utils/field.utils.d.ts +54 -0
  231. package/dist/utils/field.utils.js +401 -0
  232. package/dist/utils/field.utils.js.map +1 -0
  233. package/dist/utils/file.utils.d.ts +33 -8
  234. package/dist/utils/file.utils.js +237 -5
  235. package/dist/utils/file.utils.js.map +1 -1
  236. package/dist/utils/idempotency.utils.d.ts +123 -0
  237. package/dist/utils/idempotency.utils.js +444 -0
  238. package/dist/utils/idempotency.utils.js.map +1 -0
  239. package/dist/utils/naming.utils.js +24 -5
  240. package/dist/utils/naming.utils.js.map +1 -1
  241. package/dist/utils/performance.utils.d.ts +37 -0
  242. package/dist/utils/performance.utils.js +158 -0
  243. package/dist/utils/performance.utils.js.map +1 -0
  244. package/dist/utils/relation.utils.d.ts +92 -0
  245. package/dist/utils/relation.utils.js +388 -0
  246. package/dist/utils/relation.utils.js.map +1 -0
  247. package/dist/utils/rollback.utils.d.ts +49 -0
  248. package/dist/utils/rollback.utils.js +306 -0
  249. package/dist/utils/rollback.utils.js.map +1 -0
  250. package/dist/utils/schema.utils.d.ts +123 -0
  251. package/dist/utils/schema.utils.js +419 -0
  252. package/dist/utils/schema.utils.js.map +1 -0
  253. package/dist/utils/security.utils.d.ts +57 -0
  254. package/dist/utils/security.utils.js +315 -0
  255. package/dist/utils/security.utils.js.map +1 -0
  256. package/dist/utils/template-engine.utils.d.ts +80 -0
  257. package/dist/utils/template-engine.utils.js +478 -0
  258. package/dist/utils/template-engine.utils.js.map +1 -0
  259. package/dist/utils/validation-registry.utils.d.ts +160 -0
  260. package/dist/utils/validation-registry.utils.js +526 -0
  261. package/dist/utils/validation-registry.utils.js.map +1 -0
  262. package/package.json +12 -8
@@ -0,0 +1,444 @@
1
+ "use strict";
2
+ /**
3
+ * Idempotency & Consistency System
4
+ * Tracks generated files and ensures safe re-generation
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.loadManifest = loadManifest;
41
+ exports.createEmptyManifest = createEmptyManifest;
42
+ exports.saveManifest = saveManifest;
43
+ exports.calculateHash = calculateHash;
44
+ exports.isFileModified = isFileModified;
45
+ exports.planGeneration = planGeneration;
46
+ exports.executePlan = executePlan;
47
+ exports.backupFile = backupFile;
48
+ exports.restoreFile = restoreFile;
49
+ exports.registerEntity = registerEntity;
50
+ exports.wasEntityGenerated = wasEntityGenerated;
51
+ exports.getEntityManifest = getEntityManifest;
52
+ exports.cleanupBackups = cleanupBackups;
53
+ exports.summarizePlan = summarizePlan;
54
+ const fs = __importStar(require("fs"));
55
+ const path = __importStar(require("path"));
56
+ const crypto = __importStar(require("crypto"));
57
+ const MANIFEST_FILE = '.ddd/generation-manifest.json';
58
+ const HISTORY_DIR = '.ddd/history';
59
+ /**
60
+ * Load or create generation manifest
61
+ */
62
+ function loadManifest(basePath) {
63
+ const manifestPath = path.join(basePath, MANIFEST_FILE);
64
+ if (fs.existsSync(manifestPath)) {
65
+ return JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
66
+ }
67
+ return createEmptyManifest();
68
+ }
69
+ /**
70
+ * Create an empty manifest
71
+ */
72
+ function createEmptyManifest() {
73
+ return {
74
+ version: '1.0.0',
75
+ generatedAt: new Date().toISOString(),
76
+ lastModified: new Date().toISOString(),
77
+ generator: 'nestjs-ddd-cli',
78
+ entities: [],
79
+ files: [],
80
+ checksums: {},
81
+ };
82
+ }
83
+ /**
84
+ * Save manifest to disk
85
+ */
86
+ function saveManifest(basePath, manifest) {
87
+ const manifestPath = path.join(basePath, MANIFEST_FILE);
88
+ const manifestDir = path.dirname(manifestPath);
89
+ if (!fs.existsSync(manifestDir)) {
90
+ fs.mkdirSync(manifestDir, { recursive: true });
91
+ }
92
+ manifest.lastModified = new Date().toISOString();
93
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
94
+ }
95
+ /**
96
+ * Calculate file hash
97
+ */
98
+ function calculateHash(content) {
99
+ return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
100
+ }
101
+ /**
102
+ * Check if a file has been manually modified
103
+ */
104
+ function isFileModified(filePath, manifest) {
105
+ const fileManifest = manifest.files.find(f => f.path === filePath);
106
+ if (!fileManifest)
107
+ return false;
108
+ if (!fs.existsSync(filePath))
109
+ return false;
110
+ const currentContent = fs.readFileSync(filePath, 'utf-8');
111
+ const currentHash = calculateHash(currentContent);
112
+ return currentHash !== fileManifest.hash;
113
+ }
114
+ /**
115
+ * Plan generation operations with conflict detection
116
+ */
117
+ function planGeneration(basePath, filesToGenerate, manifest, options = {}) {
118
+ const plan = {
119
+ create: [],
120
+ update: [],
121
+ skip: [],
122
+ conflict: [],
123
+ };
124
+ const strategy = options.mergeStrategy || 'prompt';
125
+ for (const file of filesToGenerate) {
126
+ const absolutePath = path.join(basePath, file.path);
127
+ const newHash = calculateHash(file.content);
128
+ const existingManifest = manifest.files.find(f => f.path === file.path);
129
+ if (!fs.existsSync(absolutePath)) {
130
+ // New file - create it
131
+ plan.create.push({
132
+ path: file.path,
133
+ action: 'create',
134
+ content: file.content,
135
+ newHash,
136
+ });
137
+ }
138
+ else {
139
+ // File exists - check for conflicts
140
+ const existingContent = fs.readFileSync(absolutePath, 'utf-8');
141
+ const existingHash = calculateHash(existingContent);
142
+ if (existingHash === newHash) {
143
+ // Content is identical - skip
144
+ plan.skip.push({
145
+ path: file.path,
146
+ action: 'skip',
147
+ reason: 'Content unchanged',
148
+ });
149
+ }
150
+ else if (existingManifest && existingHash === existingManifest.hash) {
151
+ // File hasn't been modified since last generation - safe to update
152
+ plan.update.push({
153
+ path: file.path,
154
+ action: 'update',
155
+ content: file.content,
156
+ existingHash,
157
+ newHash,
158
+ });
159
+ }
160
+ else if (options.force) {
161
+ // Force overwrite
162
+ plan.update.push({
163
+ path: file.path,
164
+ action: 'update',
165
+ content: file.content,
166
+ reason: 'Forced overwrite',
167
+ existingHash,
168
+ newHash,
169
+ });
170
+ }
171
+ else {
172
+ // File has been manually modified - conflict
173
+ const operation = {
174
+ path: file.path,
175
+ action: 'conflict',
176
+ content: file.content,
177
+ reason: 'File has been manually modified',
178
+ existingHash,
179
+ newHash,
180
+ };
181
+ switch (strategy) {
182
+ case 'overwrite':
183
+ operation.action = 'update';
184
+ plan.update.push(operation);
185
+ break;
186
+ case 'skip':
187
+ operation.action = 'skip';
188
+ plan.skip.push(operation);
189
+ break;
190
+ case 'backup':
191
+ operation.action = 'backup';
192
+ plan.update.push(operation);
193
+ break;
194
+ default:
195
+ plan.conflict.push(operation);
196
+ }
197
+ }
198
+ }
199
+ }
200
+ return plan;
201
+ }
202
+ /**
203
+ * Execute a generation plan
204
+ */
205
+ function executePlan(basePath, plan, manifest) {
206
+ const result = { success: true, created: 0, updated: 0, skipped: 0, errors: [] };
207
+ // Handle creates
208
+ for (const op of plan.create) {
209
+ try {
210
+ const absolutePath = path.join(basePath, op.path);
211
+ const dir = path.dirname(absolutePath);
212
+ if (!fs.existsSync(dir)) {
213
+ fs.mkdirSync(dir, { recursive: true });
214
+ }
215
+ fs.writeFileSync(absolutePath, op.content);
216
+ // Update manifest
217
+ manifest.files.push({
218
+ path: op.path,
219
+ type: detectFileType(op.path),
220
+ hash: op.newHash,
221
+ generatedAt: new Date().toISOString(),
222
+ isModified: false,
223
+ mergeStrategy: 'prompt',
224
+ });
225
+ manifest.checksums[op.path] = op.newHash;
226
+ result.created++;
227
+ }
228
+ catch (error) {
229
+ result.errors.push(`Failed to create ${op.path}: ${error.message}`);
230
+ result.success = false;
231
+ }
232
+ }
233
+ // Handle updates
234
+ for (const op of plan.update) {
235
+ try {
236
+ const absolutePath = path.join(basePath, op.path);
237
+ // Backup if requested
238
+ if (op.action === 'backup') {
239
+ backupFile(basePath, op.path);
240
+ }
241
+ fs.writeFileSync(absolutePath, op.content);
242
+ // Update manifest
243
+ const existingManifest = manifest.files.find(f => f.path === op.path);
244
+ if (existingManifest) {
245
+ existingManifest.hash = op.newHash;
246
+ existingManifest.modifiedAt = new Date().toISOString();
247
+ existingManifest.isModified = false;
248
+ }
249
+ manifest.checksums[op.path] = op.newHash;
250
+ result.updated++;
251
+ }
252
+ catch (error) {
253
+ result.errors.push(`Failed to update ${op.path}: ${error.message}`);
254
+ result.success = false;
255
+ }
256
+ }
257
+ result.skipped = plan.skip.length;
258
+ return result;
259
+ }
260
+ /**
261
+ * Backup a file before overwriting
262
+ */
263
+ function backupFile(basePath, filePath) {
264
+ const historyDir = path.join(basePath, HISTORY_DIR);
265
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
266
+ const backupPath = path.join(historyDir, `${filePath}.${timestamp}.bak`);
267
+ const backupDir = path.dirname(backupPath);
268
+ if (!fs.existsSync(backupDir)) {
269
+ fs.mkdirSync(backupDir, { recursive: true });
270
+ }
271
+ const originalPath = path.join(basePath, filePath);
272
+ if (fs.existsSync(originalPath)) {
273
+ fs.copyFileSync(originalPath, backupPath);
274
+ }
275
+ return backupPath;
276
+ }
277
+ /**
278
+ * Restore a file from backup
279
+ */
280
+ function restoreFile(basePath, filePath, backupTimestamp) {
281
+ const historyDir = path.join(basePath, HISTORY_DIR);
282
+ if (backupTimestamp) {
283
+ const backupPath = path.join(historyDir, `${filePath}.${backupTimestamp}.bak`);
284
+ if (fs.existsSync(backupPath)) {
285
+ fs.copyFileSync(backupPath, path.join(basePath, filePath));
286
+ return true;
287
+ }
288
+ return false;
289
+ }
290
+ // Find most recent backup
291
+ const backupPattern = new RegExp(`^${escapeRegex(filePath)}\\..*\\.bak$`);
292
+ const backups = findBackups(historyDir, backupPattern);
293
+ if (backups.length > 0) {
294
+ const mostRecent = backups.sort().pop();
295
+ fs.copyFileSync(mostRecent, path.join(basePath, filePath));
296
+ return true;
297
+ }
298
+ return false;
299
+ }
300
+ /**
301
+ * Find backup files matching a pattern
302
+ */
303
+ function findBackups(dir, pattern) {
304
+ const backups = [];
305
+ function scan(d) {
306
+ if (!fs.existsSync(d))
307
+ return;
308
+ for (const entry of fs.readdirSync(d, { withFileTypes: true })) {
309
+ const fullPath = path.join(d, entry.name);
310
+ if (entry.isDirectory()) {
311
+ scan(fullPath);
312
+ }
313
+ else if (pattern.test(entry.name)) {
314
+ backups.push(fullPath);
315
+ }
316
+ }
317
+ }
318
+ scan(dir);
319
+ return backups;
320
+ }
321
+ /**
322
+ * Register an entity in the manifest
323
+ */
324
+ function registerEntity(manifest, entity) {
325
+ const hash = calculateHash(JSON.stringify({ ...entity, timestamp: Date.now() }));
326
+ const existingIndex = manifest.entities.findIndex(e => e.name === entity.name && e.module === entity.module);
327
+ const entityManifest = {
328
+ ...entity,
329
+ hash,
330
+ generatedAt: new Date().toISOString(),
331
+ };
332
+ if (existingIndex >= 0) {
333
+ manifest.entities[existingIndex] = entityManifest;
334
+ }
335
+ else {
336
+ manifest.entities.push(entityManifest);
337
+ }
338
+ }
339
+ /**
340
+ * Check if an entity was previously generated
341
+ */
342
+ function wasEntityGenerated(manifest, entityName, moduleName) {
343
+ return manifest.entities.some(e => e.name === entityName && e.module === moduleName);
344
+ }
345
+ /**
346
+ * Get entity manifest
347
+ */
348
+ function getEntityManifest(manifest, entityName, moduleName) {
349
+ return manifest.entities.find(e => e.name === entityName && e.module === moduleName);
350
+ }
351
+ /**
352
+ * Detect file type from path
353
+ */
354
+ function detectFileType(filePath) {
355
+ if (filePath.includes('.entity.ts'))
356
+ return 'entity';
357
+ if (filePath.includes('.dto.ts'))
358
+ return 'dto';
359
+ if (filePath.includes('.service.ts'))
360
+ return 'service';
361
+ if (filePath.includes('.controller.ts'))
362
+ return 'controller';
363
+ if (filePath.includes('.repository.ts'))
364
+ return 'repository';
365
+ if (filePath.includes('.module.ts'))
366
+ return 'module';
367
+ if (filePath.includes('.spec.ts') || filePath.includes('.test.ts'))
368
+ return 'test';
369
+ return 'other';
370
+ }
371
+ /**
372
+ * Escape regex special characters
373
+ */
374
+ function escapeRegex(str) {
375
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
376
+ }
377
+ /**
378
+ * Clean up old backups (keep last N)
379
+ */
380
+ function cleanupBackups(basePath, keepLast = 10) {
381
+ const historyDir = path.join(basePath, HISTORY_DIR);
382
+ if (!fs.existsSync(historyDir))
383
+ return 0;
384
+ const backupsByFile = new Map();
385
+ function scan(dir) {
386
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
387
+ const fullPath = path.join(dir, entry.name);
388
+ if (entry.isDirectory()) {
389
+ scan(fullPath);
390
+ }
391
+ else if (entry.name.endsWith('.bak')) {
392
+ const originalName = entry.name.replace(/\.\d{4}-\d{2}-\d{2}T.*\.bak$/, '');
393
+ const existing = backupsByFile.get(originalName) || [];
394
+ existing.push(fullPath);
395
+ backupsByFile.set(originalName, existing);
396
+ }
397
+ }
398
+ }
399
+ scan(historyDir);
400
+ let deleted = 0;
401
+ for (const [, backups] of backupsByFile) {
402
+ const sorted = backups.sort().reverse();
403
+ for (const backup of sorted.slice(keepLast)) {
404
+ fs.unlinkSync(backup);
405
+ deleted++;
406
+ }
407
+ }
408
+ return deleted;
409
+ }
410
+ /**
411
+ * Generate a summary of what will change
412
+ */
413
+ function summarizePlan(plan) {
414
+ const lines = [];
415
+ if (plan.create.length > 0) {
416
+ lines.push(`Create ${plan.create.length} files:`);
417
+ for (const op of plan.create.slice(0, 5)) {
418
+ lines.push(` + ${op.path}`);
419
+ }
420
+ if (plan.create.length > 5) {
421
+ lines.push(` ... and ${plan.create.length - 5} more`);
422
+ }
423
+ }
424
+ if (plan.update.length > 0) {
425
+ lines.push(`Update ${plan.update.length} files:`);
426
+ for (const op of plan.update.slice(0, 5)) {
427
+ lines.push(` ~ ${op.path}`);
428
+ }
429
+ if (plan.update.length > 5) {
430
+ lines.push(` ... and ${plan.update.length - 5} more`);
431
+ }
432
+ }
433
+ if (plan.conflict.length > 0) {
434
+ lines.push(`Conflicts in ${plan.conflict.length} files:`);
435
+ for (const op of plan.conflict) {
436
+ lines.push(` ! ${op.path} (${op.reason})`);
437
+ }
438
+ }
439
+ if (plan.skip.length > 0) {
440
+ lines.push(`Skip ${plan.skip.length} unchanged files`);
441
+ }
442
+ return lines.join('\n');
443
+ }
444
+ //# sourceMappingURL=idempotency.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.utils.js","sourceRoot":"","sources":["../../src/utils/idempotency.utils.ts"],"names":[],"mappings":"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"}
@@ -11,14 +11,30 @@ exports.toPlural = toPlural;
11
11
  exports.toSingular = toSingular;
12
12
  exports.toTableName = toTableName;
13
13
  const pluralize_1 = __importDefault(require("pluralize"));
14
+ /**
15
+ * Sanitizes input string to prevent path traversal attacks
16
+ * Called before any naming transformation
17
+ */
18
+ function sanitizeInput(str) {
19
+ if (!str || typeof str !== 'string') {
20
+ throw new Error('Invalid input: must be a non-empty string');
21
+ }
22
+ // Remove path traversal attempts and path separators
23
+ return str
24
+ .replace(/\.{2,}/g, '') // Remove consecutive dots
25
+ .replace(/[\/\\]/g, '') // Remove path separators
26
+ .replace(/[\x00-\x1f]/g, ''); // Remove control characters
27
+ }
14
28
  function toPascalCase(str) {
29
+ const sanitized = sanitizeInput(str);
15
30
  // If the string is already PascalCase (starts with uppercase and has no separators), return as-is
16
- if (/^[A-Z][a-zA-Z0-9]*$/.test(str) && !/[-_ ]/.test(str)) {
17
- return str;
31
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(sanitized) && !/[-_ ]/.test(sanitized)) {
32
+ return sanitized;
18
33
  }
19
- return str
34
+ return sanitized
20
35
  .split(/[-_ ]/)
21
- .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
36
+ .filter(word => word.length > 0)
37
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
22
38
  .join('');
23
39
  }
24
40
  function toCamelCase(str) {
@@ -26,9 +42,12 @@ function toCamelCase(str) {
26
42
  return pascal.charAt(0).toLowerCase() + pascal.slice(1);
27
43
  }
28
44
  function toKebabCase(str) {
29
- return str
45
+ const sanitized = sanitizeInput(str);
46
+ return sanitized
30
47
  .replace(/([a-z])([A-Z])/g, '$1-$2')
31
48
  .replace(/[\s_]+/g, '-')
49
+ .replace(/-+/g, '-') // Collapse multiple hyphens
50
+ .replace(/^-|-$/g, '') // Trim leading/trailing hyphens
32
51
  .toLowerCase();
33
52
  }
34
53
  function toSnakeCase(str) {
@@ -1 +1 @@
1
- {"version":3,"file":"naming.utils.js","sourceRoot":"","sources":["../../src/utils/naming.utils.ts"],"names":[],"mappings":";;;;;AAEA,oCAUC;AAED,kCAGC;AAED,kCAKC;AAED,kCAKC;AAED,4BAEC;AAED,gCAEC;AAED,kCAIC;AA7CD,0DAAkC;AAElC,SAAgB,YAAY,CAAC,GAAW;IACtC,kGAAkG;IAClG,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,GAAG;SACP,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACvE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAW;IAClC,OAAO,IAAA,mBAAS,EAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,mBAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,WAAW,CAAC,UAAkB;IAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"naming.utils.js","sourceRoot":"","sources":["../../src/utils/naming.utils.ts"],"names":[],"mappings":";;;;;AAiBA,oCAaC;AAED,kCAGC;AAED,kCAQC;AAED,kCAKC;AAED,4BAEC;AAED,gCAEC;AAED,kCAIC;AAlED,0DAAkC;AAElC;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,qDAAqD;IACrD,OAAO,GAAG;SACP,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,0BAA0B;SACjD,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,yBAAyB;SAChD,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,4BAA4B;AAC9D,CAAC;AAED,SAAgB,YAAY,CAAC,GAAW;IACtC,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAErC,kGAAkG;IAClG,IAAI,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS;SACb,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACzE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACrC,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,SAAS;SACb,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,4BAA4B;SAChD,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,gCAAgC;SACtD,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAW;IAClC,OAAO,IAAA,mBAAS,EAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,mBAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,WAAW,CAAC,UAAkB;IAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,37 @@
1
+ export interface TimingEntry {
2
+ name: string;
3
+ startTime: number;
4
+ endTime?: number;
5
+ duration?: number;
6
+ children: TimingEntry[];
7
+ }
8
+ export interface PerformanceReport {
9
+ totalDuration: number;
10
+ entries: TimingEntry[];
11
+ slowOperations: Array<{
12
+ name: string;
13
+ duration: number;
14
+ }>;
15
+ }
16
+ declare class PerformanceTracker {
17
+ private entries;
18
+ private stack;
19
+ private enabled;
20
+ enable(): void;
21
+ disable(): void;
22
+ isEnabled(): boolean;
23
+ start(name: string): void;
24
+ end(name: string): number;
25
+ measure<T>(name: string, fn: () => Promise<T>): Promise<T>;
26
+ measureSync<T>(name: string, fn: () => T): T;
27
+ getReport(): PerformanceReport;
28
+ private findSlowOperations;
29
+ printReport(): void;
30
+ private printEntries;
31
+ reset(): void;
32
+ }
33
+ export declare const perf: PerformanceTracker;
34
+ export declare function Timed(name?: string): MethodDecorator;
35
+ export declare function timed<T>(name: string, fn: () => Promise<T>): Promise<T>;
36
+ export declare function timedSync<T>(name: string, fn: () => T): T;
37
+ export {};