nestjs-ddd-cli 2.2.0 → 3.2.1

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 (254) 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 +485 -32
  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 +82 -24
  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-orchestrator.d.ts +14 -0
  71. package/dist/commands/generate-orchestrator.js +887 -0
  72. package/dist/commands/generate-orchestrator.js.map +1 -0
  73. package/dist/commands/generate-repository.d.ts +14 -0
  74. package/dist/commands/generate-repository.js +1019 -0
  75. package/dist/commands/generate-repository.js.map +1 -0
  76. package/dist/commands/generate-shared.d.ts +4 -0
  77. package/dist/commands/generate-shared.js +388 -0
  78. package/dist/commands/generate-shared.js.map +1 -0
  79. package/dist/commands/generate-value-object.d.ts +32 -0
  80. package/dist/commands/generate-value-object.js +700 -0
  81. package/dist/commands/generate-value-object.js.map +1 -0
  82. package/dist/commands/graphql-subscriptions.d.ts +6 -0
  83. package/dist/commands/graphql-subscriptions.js +607 -0
  84. package/dist/commands/graphql-subscriptions.js.map +1 -0
  85. package/dist/commands/graphql-types.d.ts +5 -0
  86. package/dist/commands/graphql-types.js +423 -0
  87. package/dist/commands/graphql-types.js.map +1 -0
  88. package/dist/commands/health-probes-advanced.d.ts +6 -0
  89. package/dist/commands/health-probes-advanced.js +655 -0
  90. package/dist/commands/health-probes-advanced.js.map +1 -0
  91. package/dist/commands/i18n-setup.d.ts +10 -0
  92. package/dist/commands/i18n-setup.js +677 -0
  93. package/dist/commands/i18n-setup.js.map +1 -0
  94. package/dist/commands/init-config.d.ts +6 -0
  95. package/dist/commands/init-config.js +370 -0
  96. package/dist/commands/init-config.js.map +1 -0
  97. package/dist/commands/init-project.js +56 -6
  98. package/dist/commands/init-project.js.map +1 -1
  99. package/dist/commands/interactive-scaffold.d.ts +5 -0
  100. package/dist/commands/interactive-scaffold.js +271 -0
  101. package/dist/commands/interactive-scaffold.js.map +1 -0
  102. package/dist/commands/metrics-prometheus.d.ts +6 -0
  103. package/dist/commands/metrics-prometheus.js +681 -0
  104. package/dist/commands/metrics-prometheus.js.map +1 -0
  105. package/dist/commands/migration-engine.d.ts +6 -0
  106. package/dist/commands/migration-engine.js +446 -0
  107. package/dist/commands/migration-engine.js.map +1 -0
  108. package/dist/commands/migration.d.ts +12 -0
  109. package/dist/commands/migration.js +484 -0
  110. package/dist/commands/migration.js.map +1 -0
  111. package/dist/commands/monorepo.d.ts +8 -0
  112. package/dist/commands/monorepo.js +483 -0
  113. package/dist/commands/monorepo.js.map +1 -0
  114. package/dist/commands/multi-database.d.ts +5 -0
  115. package/dist/commands/multi-database.js +439 -0
  116. package/dist/commands/multi-database.js.map +1 -0
  117. package/dist/commands/observability-tracing.d.ts +10 -0
  118. package/dist/commands/observability-tracing.js +740 -0
  119. package/dist/commands/observability-tracing.js.map +1 -0
  120. package/dist/commands/openapi-export.d.ts +8 -0
  121. package/dist/commands/openapi-export.js +359 -0
  122. package/dist/commands/openapi-export.js.map +1 -0
  123. package/dist/commands/perf-analyzer.d.ts +8 -0
  124. package/dist/commands/perf-analyzer.js +423 -0
  125. package/dist/commands/perf-analyzer.js.map +1 -0
  126. package/dist/commands/rate-limiting.d.ts +10 -0
  127. package/dist/commands/rate-limiting.js +953 -0
  128. package/dist/commands/rate-limiting.js.map +1 -0
  129. package/dist/commands/recipe-plugin.d.ts +56 -0
  130. package/dist/commands/recipe-plugin.js +315 -0
  131. package/dist/commands/recipe-plugin.js.map +1 -0
  132. package/dist/commands/recipe.d.ts +6 -0
  133. package/dist/commands/recipe.js +3941 -0
  134. package/dist/commands/recipe.js.map +1 -0
  135. package/dist/commands/recipes/elasticsearch.recipe.d.ts +1 -0
  136. package/dist/commands/recipes/elasticsearch.recipe.js +761 -0
  137. package/dist/commands/recipes/elasticsearch.recipe.js.map +1 -0
  138. package/dist/commands/recipes/event-sourcing.recipe.d.ts +1 -0
  139. package/dist/commands/recipes/event-sourcing.recipe.js +889 -0
  140. package/dist/commands/recipes/event-sourcing.recipe.js.map +1 -0
  141. package/dist/commands/recipes/index.d.ts +7 -0
  142. package/dist/commands/recipes/index.js +24 -0
  143. package/dist/commands/recipes/index.js.map +1 -0
  144. package/dist/commands/recipes/message-queue.recipe.d.ts +1 -0
  145. package/dist/commands/recipes/message-queue.recipe.js +706 -0
  146. package/dist/commands/recipes/message-queue.recipe.js.map +1 -0
  147. package/dist/commands/recipes/middleware.recipe.d.ts +1 -0
  148. package/dist/commands/recipes/middleware.recipe.js +383 -0
  149. package/dist/commands/recipes/middleware.recipe.js.map +1 -0
  150. package/dist/commands/recipes/multi-tenancy.recipe.d.ts +1 -0
  151. package/dist/commands/recipes/multi-tenancy.recipe.js +520 -0
  152. package/dist/commands/recipes/multi-tenancy.recipe.js.map +1 -0
  153. package/dist/commands/recipes/oauth2.recipe.d.ts +1 -0
  154. package/dist/commands/recipes/oauth2.recipe.js +472 -0
  155. package/dist/commands/recipes/oauth2.recipe.js.map +1 -0
  156. package/dist/commands/recipes/websocket.recipe.d.ts +1 -0
  157. package/dist/commands/recipes/websocket.recipe.js +453 -0
  158. package/dist/commands/recipes/websocket.recipe.js.map +1 -0
  159. package/dist/commands/resilience-patterns.d.ts +13 -0
  160. package/dist/commands/resilience-patterns.js +1029 -0
  161. package/dist/commands/resilience-patterns.js.map +1 -0
  162. package/dist/commands/security-patterns.d.ts +11 -0
  163. package/dist/commands/security-patterns.js +2233 -0
  164. package/dist/commands/security-patterns.js.map +1 -0
  165. package/dist/commands/template-debug.d.ts +27 -0
  166. package/dist/commands/template-debug.js +388 -0
  167. package/dist/commands/template-debug.js.map +1 -0
  168. package/dist/commands/test-factory-full.d.ts +9 -0
  169. package/dist/commands/test-factory-full.js +1570 -0
  170. package/dist/commands/test-factory-full.js.map +1 -0
  171. package/dist/commands/test-scaffold.d.ts +7 -0
  172. package/dist/commands/test-scaffold.js +621 -0
  173. package/dist/commands/test-scaffold.js.map +1 -0
  174. package/dist/index.js +1088 -0
  175. package/dist/index.js.map +1 -1
  176. package/dist/templates/ai-context/CLAUDE.md.hbs +158 -0
  177. package/dist/templates/ai-context/conventions.md.hbs +154 -0
  178. package/dist/templates/command/create-command.hbs +6 -14
  179. package/dist/templates/command/delete-command.hbs +19 -0
  180. package/dist/templates/command/update-command.hbs +24 -0
  181. package/dist/templates/controller/controller.hbs +64 -17
  182. package/dist/templates/dto/create-dto.hbs +29 -5
  183. package/dist/templates/dto/filter-dto.hbs +52 -0
  184. package/dist/templates/dto/filter-query.dto.hbs +148 -0
  185. package/dist/templates/dto/paginated-response.dto.hbs +29 -0
  186. package/dist/templates/dto/pagination-query.dto.hbs +30 -0
  187. package/dist/templates/dto/response-dto.hbs +38 -0
  188. package/dist/templates/dto/update-dto.hbs +11 -0
  189. package/dist/templates/entity/entity.hbs +32 -1
  190. package/dist/templates/event/domain-event.hbs +33 -7
  191. package/dist/templates/event/event-handler.hbs +40 -0
  192. package/dist/templates/exception/base-exceptions.hbs +69 -0
  193. package/dist/templates/exception/entity-not-found.exception.hbs +7 -0
  194. package/dist/templates/mapper/mapper.hbs +49 -24
  195. package/dist/templates/module/module.hbs +34 -10
  196. package/dist/templates/orm-entity/orm-entity.hbs +63 -12
  197. package/dist/templates/prisma/prisma-mapper.hbs +71 -0
  198. package/dist/templates/prisma/prisma-repository.hbs +114 -0
  199. package/dist/templates/prisma/prisma-schema.hbs +20 -0
  200. package/dist/templates/prisma/prisma-service.hbs +51 -0
  201. package/dist/templates/query/get-all.query.hbs +50 -0
  202. package/dist/templates/query/get-by-id.query.hbs +31 -0
  203. package/dist/templates/repository/repository.hbs +55 -13
  204. package/dist/templates/resolver/graphql-input.hbs +54 -0
  205. package/dist/templates/resolver/graphql-type.hbs +58 -0
  206. package/dist/templates/resolver/pagination-args.hbs +33 -0
  207. package/dist/templates/resolver/resolver.hbs +62 -0
  208. package/dist/templates/shared/prisma-query-builder.util.hbs +189 -0
  209. package/dist/templates/shared/query-builder.util.hbs +218 -0
  210. package/dist/templates/test/controller.spec.hbs +124 -0
  211. package/dist/templates/test/repository.spec.hbs +158 -0
  212. package/dist/templates/test/usecase.spec.hbs +116 -0
  213. package/dist/templates/usecase/create-usecase.hbs +19 -7
  214. package/dist/templates/usecase/delete-usecase.hbs +17 -0
  215. package/dist/templates/usecase/update-usecase.hbs +31 -0
  216. package/dist/utils/config.utils.d.ts +45 -0
  217. package/dist/utils/config.utils.js +211 -0
  218. package/dist/utils/config.utils.js.map +1 -0
  219. package/dist/utils/error.utils.d.ts +145 -0
  220. package/dist/utils/error.utils.js +422 -0
  221. package/dist/utils/error.utils.js.map +1 -0
  222. package/dist/utils/field.utils.d.ts +54 -0
  223. package/dist/utils/field.utils.js +389 -0
  224. package/dist/utils/field.utils.js.map +1 -0
  225. package/dist/utils/file.utils.d.ts +19 -8
  226. package/dist/utils/file.utils.js +135 -4
  227. package/dist/utils/file.utils.js.map +1 -1
  228. package/dist/utils/idempotency.utils.d.ts +123 -0
  229. package/dist/utils/idempotency.utils.js +444 -0
  230. package/dist/utils/idempotency.utils.js.map +1 -0
  231. package/dist/utils/naming.utils.js +26 -3
  232. package/dist/utils/naming.utils.js.map +1 -1
  233. package/dist/utils/performance.utils.d.ts +37 -0
  234. package/dist/utils/performance.utils.js +158 -0
  235. package/dist/utils/performance.utils.js.map +1 -0
  236. package/dist/utils/relation.utils.d.ts +92 -0
  237. package/dist/utils/relation.utils.js +388 -0
  238. package/dist/utils/relation.utils.js.map +1 -0
  239. package/dist/utils/rollback.utils.d.ts +49 -0
  240. package/dist/utils/rollback.utils.js +306 -0
  241. package/dist/utils/rollback.utils.js.map +1 -0
  242. package/dist/utils/schema.utils.d.ts +123 -0
  243. package/dist/utils/schema.utils.js +419 -0
  244. package/dist/utils/schema.utils.js.map +1 -0
  245. package/dist/utils/security.utils.d.ts +57 -0
  246. package/dist/utils/security.utils.js +315 -0
  247. package/dist/utils/security.utils.js.map +1 -0
  248. package/dist/utils/template-engine.utils.d.ts +80 -0
  249. package/dist/utils/template-engine.utils.js +463 -0
  250. package/dist/utils/template-engine.utils.js.map +1 -0
  251. package/dist/utils/validation-registry.utils.d.ts +160 -0
  252. package/dist/utils/validation-registry.utils.js +526 -0
  253. package/dist/utils/validation-registry.utils.js.map +1 -0
  254. package/package.json +3 -1
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.perf = void 0;
7
+ exports.Timed = Timed;
8
+ exports.timed = timed;
9
+ exports.timedSync = timedSync;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ class PerformanceTracker {
12
+ constructor() {
13
+ this.entries = [];
14
+ this.stack = [];
15
+ this.enabled = false;
16
+ }
17
+ enable() {
18
+ this.enabled = true;
19
+ }
20
+ disable() {
21
+ this.enabled = false;
22
+ }
23
+ isEnabled() {
24
+ return this.enabled;
25
+ }
26
+ start(name) {
27
+ if (!this.enabled)
28
+ return;
29
+ const entry = {
30
+ name,
31
+ startTime: performance.now(),
32
+ children: [],
33
+ };
34
+ if (this.stack.length > 0) {
35
+ this.stack[this.stack.length - 1].children.push(entry);
36
+ }
37
+ else {
38
+ this.entries.push(entry);
39
+ }
40
+ this.stack.push(entry);
41
+ }
42
+ end(name) {
43
+ if (!this.enabled)
44
+ return 0;
45
+ const entry = this.stack.pop();
46
+ if (!entry || entry.name !== name) {
47
+ console.warn(`Performance timing mismatch: expected ${entry?.name}, got ${name}`);
48
+ return 0;
49
+ }
50
+ entry.endTime = performance.now();
51
+ entry.duration = entry.endTime - entry.startTime;
52
+ return entry.duration;
53
+ }
54
+ async measure(name, fn) {
55
+ this.start(name);
56
+ try {
57
+ return await fn();
58
+ }
59
+ finally {
60
+ this.end(name);
61
+ }
62
+ }
63
+ measureSync(name, fn) {
64
+ this.start(name);
65
+ try {
66
+ return fn();
67
+ }
68
+ finally {
69
+ this.end(name);
70
+ }
71
+ }
72
+ getReport() {
73
+ const totalDuration = this.entries.reduce((sum, e) => sum + (e.duration || 0), 0);
74
+ const slowOperations = this.findSlowOperations(this.entries, 100);
75
+ return {
76
+ totalDuration,
77
+ entries: this.entries,
78
+ slowOperations: slowOperations.sort((a, b) => b.duration - a.duration).slice(0, 10),
79
+ };
80
+ }
81
+ findSlowOperations(entries, threshold) {
82
+ const slow = [];
83
+ for (const entry of entries) {
84
+ if (entry.duration && entry.duration > threshold) {
85
+ slow.push({ name: entry.name, duration: entry.duration });
86
+ }
87
+ if (entry.children.length > 0) {
88
+ slow.push(...this.findSlowOperations(entry.children, threshold));
89
+ }
90
+ }
91
+ return slow;
92
+ }
93
+ printReport() {
94
+ if (!this.enabled || this.entries.length === 0)
95
+ return;
96
+ const report = this.getReport();
97
+ console.log(chalk_1.default.bold.blue('\n⏱️ Performance Report\n'));
98
+ console.log(chalk_1.default.gray('─'.repeat(50)));
99
+ this.printEntries(this.entries, 0);
100
+ console.log(chalk_1.default.gray('─'.repeat(50)));
101
+ console.log(chalk_1.default.bold(`Total: ${formatDuration(report.totalDuration)}`));
102
+ if (report.slowOperations.length > 0) {
103
+ console.log(chalk_1.default.yellow('\n⚠️ Slow Operations (>100ms):'));
104
+ for (const op of report.slowOperations.slice(0, 5)) {
105
+ console.log(chalk_1.default.yellow(` • ${op.name}: ${formatDuration(op.duration)}`));
106
+ }
107
+ }
108
+ console.log();
109
+ }
110
+ printEntries(entries, depth) {
111
+ const indent = ' '.repeat(depth);
112
+ for (const entry of entries) {
113
+ const duration = entry.duration || 0;
114
+ const color = duration > 500 ? chalk_1.default.red :
115
+ duration > 100 ? chalk_1.default.yellow : chalk_1.default.green;
116
+ console.log(`${indent}${entry.name}: ${color(formatDuration(duration))}`);
117
+ if (entry.children.length > 0) {
118
+ this.printEntries(entry.children, depth + 1);
119
+ }
120
+ }
121
+ }
122
+ reset() {
123
+ this.entries = [];
124
+ this.stack = [];
125
+ }
126
+ }
127
+ function formatDuration(ms) {
128
+ if (ms < 1) {
129
+ return `${(ms * 1000).toFixed(0)}μs`;
130
+ }
131
+ else if (ms < 1000) {
132
+ return `${ms.toFixed(1)}ms`;
133
+ }
134
+ else {
135
+ return `${(ms / 1000).toFixed(2)}s`;
136
+ }
137
+ }
138
+ // Singleton instance
139
+ exports.perf = new PerformanceTracker();
140
+ // Decorator for measuring method performance
141
+ function Timed(name) {
142
+ return function (target, propertyKey, descriptor) {
143
+ const originalMethod = descriptor.value;
144
+ const timerName = name || `${target.constructor.name}.${String(propertyKey)}`;
145
+ descriptor.value = async function (...args) {
146
+ return exports.perf.measure(timerName, () => originalMethod.apply(this, args));
147
+ };
148
+ return descriptor;
149
+ };
150
+ }
151
+ // Utility to wrap any async function with timing
152
+ async function timed(name, fn) {
153
+ return exports.perf.measure(name, fn);
154
+ }
155
+ function timedSync(name, fn) {
156
+ return exports.perf.measureSync(name, fn);
157
+ }
158
+ //# sourceMappingURL=performance.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.utils.js","sourceRoot":"","sources":["../../src/utils/performance.utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Relationship & Association Management Engine
3
+ * Handles entity relationships with validation and code generation
4
+ */
5
+ export type RelationType = 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many';
6
+ export interface Relation {
7
+ name: string;
8
+ type: RelationType;
9
+ sourceEntity: string;
10
+ targetEntity: string;
11
+ sourceModule?: string;
12
+ targetModule?: string;
13
+ inverseSide?: string;
14
+ joinColumn?: string;
15
+ joinTable?: {
16
+ name: string;
17
+ joinColumn: string;
18
+ inverseJoinColumn: string;
19
+ };
20
+ cascade?: CascadeOption[];
21
+ eager?: boolean;
22
+ nullable?: boolean;
23
+ orphanedRowAction?: 'nullify' | 'delete' | 'soft-delete' | 'disable';
24
+ onDelete?: 'CASCADE' | 'SET NULL' | 'NO ACTION' | 'RESTRICT';
25
+ onUpdate?: 'CASCADE' | 'SET NULL' | 'NO ACTION' | 'RESTRICT';
26
+ }
27
+ export type CascadeOption = 'insert' | 'update' | 'remove' | 'soft-remove' | 'recover';
28
+ export interface RelationValidationResult {
29
+ valid: boolean;
30
+ errors: string[];
31
+ warnings: string[];
32
+ }
33
+ export interface RelationGraph {
34
+ entities: Map<string, EntityNode>;
35
+ edges: RelationEdge[];
36
+ }
37
+ export interface EntityNode {
38
+ name: string;
39
+ module: string;
40
+ relations: Relation[];
41
+ }
42
+ export interface RelationEdge {
43
+ from: string;
44
+ to: string;
45
+ type: RelationType;
46
+ relation: Relation;
47
+ }
48
+ /**
49
+ * Parse relation string into Relation object
50
+ * Format: targetEntity:relationType[:inverseSide]
51
+ * Examples:
52
+ * - User:many-to-one:posts
53
+ * - Posts:one-to-many:author
54
+ * - Profile:one-to-one:user
55
+ */
56
+ export declare function parseRelationString(fieldName: string, relationStr: string, sourceEntity: string): Relation;
57
+ /**
58
+ * Generate inverse relation automatically
59
+ */
60
+ export declare function generateInverseRelation(relation: Relation): Relation;
61
+ /**
62
+ * Validate a relation definition
63
+ */
64
+ export declare function validateRelation(relation: Relation, existingEntities: Set<string>): RelationValidationResult;
65
+ /**
66
+ * Build a relation graph from entities
67
+ */
68
+ export declare function buildRelationGraph(modulesPath: string): RelationGraph;
69
+ /**
70
+ * Detect circular dependencies in relation graph
71
+ */
72
+ export declare function detectCircularDependencies(graph: RelationGraph): string[][];
73
+ /**
74
+ * Generate TypeORM relation decorator
75
+ */
76
+ export declare function generateRelationDecorator(relation: Relation): string;
77
+ /**
78
+ * Generate field type for relation
79
+ */
80
+ export declare function generateRelationFieldType(relation: Relation): string;
81
+ /**
82
+ * Generate imports needed for relations
83
+ */
84
+ export declare function generateRelationImports(relations: Relation[]): string[];
85
+ /**
86
+ * Generate join table name for many-to-many
87
+ */
88
+ export declare function generateJoinTableName(entity1: string, entity2: string): string;
89
+ /**
90
+ * Determine which side should own the relation
91
+ */
92
+ export declare function determineOwningSide(relation: Relation): 'source' | 'target';
@@ -0,0 +1,388 @@
1
+ "use strict";
2
+ /**
3
+ * Relationship & Association Management Engine
4
+ * Handles entity relationships with validation and code 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.parseRelationString = parseRelationString;
41
+ exports.generateInverseRelation = generateInverseRelation;
42
+ exports.validateRelation = validateRelation;
43
+ exports.buildRelationGraph = buildRelationGraph;
44
+ exports.detectCircularDependencies = detectCircularDependencies;
45
+ exports.generateRelationDecorator = generateRelationDecorator;
46
+ exports.generateRelationFieldType = generateRelationFieldType;
47
+ exports.generateRelationImports = generateRelationImports;
48
+ exports.generateJoinTableName = generateJoinTableName;
49
+ exports.determineOwningSide = determineOwningSide;
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ /**
53
+ * Parse relation string into Relation object
54
+ * Format: targetEntity:relationType[:inverseSide]
55
+ * Examples:
56
+ * - User:many-to-one:posts
57
+ * - Posts:one-to-many:author
58
+ * - Profile:one-to-one:user
59
+ */
60
+ function parseRelationString(fieldName, relationStr, sourceEntity) {
61
+ const parts = relationStr.split(':');
62
+ const targetEntity = parts[0];
63
+ const type = (parts[1] || 'many-to-one');
64
+ const inverseSide = parts[2];
65
+ return {
66
+ name: fieldName,
67
+ type,
68
+ sourceEntity,
69
+ targetEntity,
70
+ inverseSide,
71
+ nullable: true,
72
+ };
73
+ }
74
+ /**
75
+ * Generate inverse relation automatically
76
+ */
77
+ function generateInverseRelation(relation) {
78
+ const inverseTypeMap = {
79
+ 'one-to-one': 'one-to-one',
80
+ 'one-to-many': 'many-to-one',
81
+ 'many-to-one': 'one-to-many',
82
+ 'many-to-many': 'many-to-many',
83
+ };
84
+ return {
85
+ name: relation.inverseSide || toCamelCase(relation.sourceEntity) + 's',
86
+ type: inverseTypeMap[relation.type],
87
+ sourceEntity: relation.targetEntity,
88
+ targetEntity: relation.sourceEntity,
89
+ sourceModule: relation.targetModule,
90
+ targetModule: relation.sourceModule,
91
+ inverseSide: relation.name,
92
+ cascade: relation.type === 'one-to-many' ? ['insert', 'update'] : undefined,
93
+ };
94
+ }
95
+ /**
96
+ * Validate a relation definition
97
+ */
98
+ function validateRelation(relation, existingEntities) {
99
+ const errors = [];
100
+ const warnings = [];
101
+ // Check target entity exists
102
+ if (!existingEntities.has(relation.targetEntity)) {
103
+ errors.push(`Target entity '${relation.targetEntity}' does not exist`);
104
+ }
105
+ // Validate relation type
106
+ const validTypes = ['one-to-one', 'one-to-many', 'many-to-one', 'many-to-many'];
107
+ if (!validTypes.includes(relation.type)) {
108
+ errors.push(`Invalid relation type: ${relation.type}`);
109
+ }
110
+ // Warn about missing inverse side for bidirectional relations
111
+ if ((relation.type === 'one-to-many' || relation.type === 'many-to-many') && !relation.inverseSide) {
112
+ warnings.push(`Consider adding inverseSide for ${relation.type} relation to enable bidirectional navigation`);
113
+ }
114
+ // Validate cascade options
115
+ if (relation.cascade) {
116
+ const validCascade = ['insert', 'update', 'remove', 'soft-remove', 'recover'];
117
+ for (const opt of relation.cascade) {
118
+ if (!validCascade.includes(opt)) {
119
+ errors.push(`Invalid cascade option: ${opt}`);
120
+ }
121
+ }
122
+ }
123
+ // Warn about eager loading with many relations
124
+ if (relation.eager && (relation.type === 'one-to-many' || relation.type === 'many-to-many')) {
125
+ warnings.push(`Eager loading on ${relation.type} may cause performance issues`);
126
+ }
127
+ // Check for self-referential relation
128
+ if (relation.sourceEntity === relation.targetEntity) {
129
+ warnings.push(`Self-referential relation detected on ${relation.sourceEntity}`);
130
+ }
131
+ return {
132
+ valid: errors.length === 0,
133
+ errors,
134
+ warnings,
135
+ };
136
+ }
137
+ /**
138
+ * Build a relation graph from entities
139
+ */
140
+ function buildRelationGraph(modulesPath) {
141
+ const graph = {
142
+ entities: new Map(),
143
+ edges: [],
144
+ };
145
+ if (!fs.existsSync(modulesPath)) {
146
+ return graph;
147
+ }
148
+ const modules = fs.readdirSync(modulesPath).filter(f => fs.statSync(path.join(modulesPath, f)).isDirectory());
149
+ for (const moduleName of modules) {
150
+ const entitiesPath = path.join(modulesPath, moduleName, 'domain', 'entities');
151
+ if (!fs.existsSync(entitiesPath))
152
+ continue;
153
+ const entityFiles = fs.readdirSync(entitiesPath).filter(f => f.endsWith('.entity.ts'));
154
+ for (const file of entityFiles) {
155
+ const content = fs.readFileSync(path.join(entitiesPath, file), 'utf-8');
156
+ const entityName = extractEntityName(content);
157
+ if (!entityName)
158
+ continue;
159
+ const relations = extractRelations(content, entityName);
160
+ graph.entities.set(entityName, {
161
+ name: entityName,
162
+ module: moduleName,
163
+ relations,
164
+ });
165
+ for (const relation of relations) {
166
+ graph.edges.push({
167
+ from: entityName,
168
+ to: relation.targetEntity,
169
+ type: relation.type,
170
+ relation,
171
+ });
172
+ }
173
+ }
174
+ }
175
+ return graph;
176
+ }
177
+ /**
178
+ * Detect circular dependencies in relation graph
179
+ */
180
+ function detectCircularDependencies(graph) {
181
+ const cycles = [];
182
+ const visited = new Set();
183
+ const recursionStack = new Set();
184
+ const path = [];
185
+ function dfs(entity) {
186
+ visited.add(entity);
187
+ recursionStack.add(entity);
188
+ path.push(entity);
189
+ const node = graph.entities.get(entity);
190
+ if (node) {
191
+ for (const relation of node.relations) {
192
+ const target = relation.targetEntity;
193
+ if (!visited.has(target)) {
194
+ if (dfs(target)) {
195
+ return true;
196
+ }
197
+ }
198
+ else if (recursionStack.has(target)) {
199
+ // Found cycle
200
+ const cycleStart = path.indexOf(target);
201
+ cycles.push([...path.slice(cycleStart), target]);
202
+ }
203
+ }
204
+ }
205
+ path.pop();
206
+ recursionStack.delete(entity);
207
+ return false;
208
+ }
209
+ for (const entity of graph.entities.keys()) {
210
+ if (!visited.has(entity)) {
211
+ dfs(entity);
212
+ }
213
+ }
214
+ return cycles;
215
+ }
216
+ /**
217
+ * Generate TypeORM relation decorator
218
+ */
219
+ function generateRelationDecorator(relation) {
220
+ const decoratorMap = {
221
+ 'one-to-one': 'OneToOne',
222
+ 'one-to-many': 'OneToMany',
223
+ 'many-to-one': 'ManyToOne',
224
+ 'many-to-many': 'ManyToMany',
225
+ };
226
+ const decorator = decoratorMap[relation.type];
227
+ const options = [];
228
+ // Build options
229
+ if (relation.eager)
230
+ options.push('eager: true');
231
+ if (relation.nullable !== undefined)
232
+ options.push(`nullable: ${relation.nullable}`);
233
+ if (relation.onDelete)
234
+ options.push(`onDelete: '${relation.onDelete}'`);
235
+ if (relation.onUpdate)
236
+ options.push(`onUpdate: '${relation.onUpdate}'`);
237
+ if (relation.orphanedRowAction)
238
+ options.push(`orphanedRowAction: '${relation.orphanedRowAction}'`);
239
+ if (relation.cascade?.length) {
240
+ options.push(`cascade: [${relation.cascade.map(c => `'${c}'`).join(', ')}]`);
241
+ }
242
+ const optionsStr = options.length > 0 ? `, { ${options.join(', ')} }` : '';
243
+ const inverseStr = relation.inverseSide
244
+ ? `, (${toCamelCase(relation.targetEntity)}) => ${toCamelCase(relation.targetEntity)}.${relation.inverseSide}`
245
+ : '';
246
+ let result = `@${decorator}(() => ${relation.targetEntity}${inverseStr}${optionsStr})`;
247
+ // Add JoinColumn for owning side
248
+ if (relation.type === 'many-to-one' || (relation.type === 'one-to-one' && relation.joinColumn)) {
249
+ const joinColOptions = relation.joinColumn ? `{ name: '${relation.joinColumn}' }` : '';
250
+ result += `\n @JoinColumn(${joinColOptions})`;
251
+ }
252
+ // Add JoinTable for many-to-many owning side
253
+ if (relation.type === 'many-to-many' && relation.joinTable) {
254
+ result += `\n @JoinTable({
255
+ name: '${relation.joinTable.name}',
256
+ joinColumn: { name: '${relation.joinTable.joinColumn}' },
257
+ inverseJoinColumn: { name: '${relation.joinTable.inverseJoinColumn}' },
258
+ })`;
259
+ }
260
+ return result;
261
+ }
262
+ /**
263
+ * Generate field type for relation
264
+ */
265
+ function generateRelationFieldType(relation) {
266
+ switch (relation.type) {
267
+ case 'one-to-one':
268
+ case 'many-to-one':
269
+ return relation.nullable ? `${relation.targetEntity} | null` : relation.targetEntity;
270
+ case 'one-to-many':
271
+ case 'many-to-many':
272
+ return `${relation.targetEntity}[]`;
273
+ }
274
+ }
275
+ /**
276
+ * Generate imports needed for relations
277
+ */
278
+ function generateRelationImports(relations) {
279
+ const imports = new Set();
280
+ imports.add(`import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';`);
281
+ const decorators = new Set();
282
+ for (const rel of relations) {
283
+ switch (rel.type) {
284
+ case 'one-to-one':
285
+ decorators.add('OneToOne');
286
+ if (rel.joinColumn !== undefined)
287
+ decorators.add('JoinColumn');
288
+ break;
289
+ case 'one-to-many':
290
+ decorators.add('OneToMany');
291
+ break;
292
+ case 'many-to-one':
293
+ decorators.add('ManyToOne');
294
+ decorators.add('JoinColumn');
295
+ break;
296
+ case 'many-to-many':
297
+ decorators.add('ManyToMany');
298
+ if (rel.joinTable)
299
+ decorators.add('JoinTable');
300
+ break;
301
+ }
302
+ }
303
+ if (decorators.size > 0) {
304
+ const existing = [...decorators].filter(d => !['Entity', 'Column', 'PrimaryGeneratedColumn'].includes(d));
305
+ if (existing.length > 0) {
306
+ imports.add(`import { ${existing.join(', ')} } from 'typeorm';`);
307
+ }
308
+ }
309
+ // Add entity imports
310
+ for (const rel of relations) {
311
+ if (rel.targetModule && rel.targetModule !== rel.sourceModule) {
312
+ imports.add(`import { ${rel.targetEntity} } from '../../${rel.targetModule}/domain/entities/${toKebabCase(rel.targetEntity)}.entity';`);
313
+ }
314
+ else {
315
+ imports.add(`import { ${rel.targetEntity} } from './${toKebabCase(rel.targetEntity)}.entity';`);
316
+ }
317
+ }
318
+ return [...imports];
319
+ }
320
+ /**
321
+ * Extract entity name from file content
322
+ */
323
+ function extractEntityName(content) {
324
+ const match = content.match(/export\s+class\s+(\w+)/);
325
+ return match ? match[1] : null;
326
+ }
327
+ /**
328
+ * Extract relations from entity file content
329
+ */
330
+ function extractRelations(content, sourceEntity) {
331
+ const relations = [];
332
+ const relationPattern = /@(OneToOne|OneToMany|ManyToOne|ManyToMany)\s*\(\s*\(\)\s*=>\s*(\w+)/g;
333
+ let match;
334
+ while ((match = relationPattern.exec(content)) !== null) {
335
+ const decoratorType = match[1];
336
+ const targetEntity = match[2];
337
+ const typeMap = {
338
+ 'OneToOne': 'one-to-one',
339
+ 'OneToMany': 'one-to-many',
340
+ 'ManyToOne': 'many-to-one',
341
+ 'ManyToMany': 'many-to-many',
342
+ };
343
+ // Find the field name that follows
344
+ const afterDecorator = content.slice(match.index + match[0].length);
345
+ const fieldMatch = afterDecorator.match(/[\s\S]*?(\w+)\s*[?:]?\s*:/);
346
+ const fieldName = fieldMatch ? fieldMatch[1] : toCamelCase(targetEntity);
347
+ relations.push({
348
+ name: fieldName,
349
+ type: typeMap[decoratorType],
350
+ sourceEntity,
351
+ targetEntity,
352
+ });
353
+ }
354
+ return relations;
355
+ }
356
+ function toCamelCase(str) {
357
+ return str.charAt(0).toLowerCase() + str.slice(1);
358
+ }
359
+ function toKebabCase(str) {
360
+ return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
361
+ }
362
+ /**
363
+ * Generate join table name for many-to-many
364
+ */
365
+ function generateJoinTableName(entity1, entity2) {
366
+ const sorted = [entity1, entity2].sort();
367
+ return `${toSnakeCase(sorted[0])}_${toSnakeCase(sorted[1])}`;
368
+ }
369
+ function toSnakeCase(str) {
370
+ return str.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
371
+ }
372
+ /**
373
+ * Determine which side should own the relation
374
+ */
375
+ function determineOwningSide(relation) {
376
+ // Many-to-one: many side owns
377
+ if (relation.type === 'many-to-one')
378
+ return 'source';
379
+ if (relation.type === 'one-to-many')
380
+ return 'target';
381
+ // One-to-one: the side with joinColumn owns
382
+ if (relation.type === 'one-to-one') {
383
+ return relation.joinColumn ? 'source' : 'target';
384
+ }
385
+ // Many-to-many: either side can own, prefer alphabetically first
386
+ return relation.sourceEntity < relation.targetEntity ? 'source' : 'target';
387
+ }
388
+ //# sourceMappingURL=relation.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.utils.js","sourceRoot":"","sources":["../../src/utils/relation.utils.ts"],"names":[],"mappings":"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"}