nestjs-ddd-cli 2.2.1 → 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 +24 -5
  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,543 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runEnhancedDoctor = runEnhancedDoctor;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ async function runEnhancedDoctor(basePath, options = {}) {
44
+ const report = {
45
+ passed: 0,
46
+ warnings: 0,
47
+ errors: 0,
48
+ results: [],
49
+ };
50
+ console.log(chalk_1.default.bold.blue('\n🩺 Running Enhanced DDD Doctor...\n'));
51
+ // Run all diagnostic checks
52
+ await checkProjectStructure(basePath, report);
53
+ await checkDddPatterns(basePath, report);
54
+ await checkTypeScriptStrictness(basePath, report);
55
+ await checkNamingConventions(basePath, report);
56
+ await checkTestCoverage(basePath, report);
57
+ await checkImportPatterns(basePath, report);
58
+ await checkEntityIntegrity(basePath, report);
59
+ await checkModuleBoundaries(basePath, report);
60
+ // Print results
61
+ printReport(report, options.verbose);
62
+ // Auto-fix if requested
63
+ if (options.fix) {
64
+ await applyFixes(report);
65
+ }
66
+ return report;
67
+ }
68
+ async function checkProjectStructure(basePath, report) {
69
+ const requiredDirs = [
70
+ 'src/modules',
71
+ 'src/shared',
72
+ ];
73
+ const recommendedDirs = [
74
+ 'src/shared/domain',
75
+ 'src/shared/infrastructure',
76
+ 'src/shared/application',
77
+ ];
78
+ for (const dir of requiredDirs) {
79
+ const fullPath = path.join(basePath, dir);
80
+ if (!fs.existsSync(fullPath)) {
81
+ report.errors++;
82
+ report.results.push({
83
+ category: 'Structure',
84
+ rule: 'required-directory',
85
+ severity: 'error',
86
+ message: `Missing required directory: ${dir}`,
87
+ suggestion: `Run: mkdir -p ${dir}`,
88
+ autoFixable: true,
89
+ });
90
+ }
91
+ else {
92
+ report.passed++;
93
+ }
94
+ }
95
+ for (const dir of recommendedDirs) {
96
+ const fullPath = path.join(basePath, dir);
97
+ if (!fs.existsSync(fullPath)) {
98
+ report.warnings++;
99
+ report.results.push({
100
+ category: 'Structure',
101
+ rule: 'recommended-directory',
102
+ severity: 'warning',
103
+ message: `Missing recommended directory: ${dir}`,
104
+ suggestion: `Consider adding ${dir} for better DDD organization`,
105
+ });
106
+ }
107
+ }
108
+ }
109
+ async function checkDddPatterns(basePath, report) {
110
+ const modulesPath = path.join(basePath, 'src/modules');
111
+ if (!fs.existsSync(modulesPath))
112
+ return;
113
+ const modules = fs.readdirSync(modulesPath).filter(f => fs.statSync(path.join(modulesPath, f)).isDirectory());
114
+ for (const moduleName of modules) {
115
+ const modulePath = path.join(modulesPath, moduleName);
116
+ // Check for domain layer
117
+ const domainPath = path.join(modulePath, 'domain');
118
+ if (!fs.existsSync(domainPath)) {
119
+ report.warnings++;
120
+ report.results.push({
121
+ category: 'DDD Pattern',
122
+ rule: 'missing-domain-layer',
123
+ severity: 'warning',
124
+ message: `Module "${moduleName}" missing domain layer`,
125
+ file: modulePath,
126
+ suggestion: 'Add domain/ directory with entities, value-objects, and domain services',
127
+ });
128
+ }
129
+ // Check for entity immutability patterns
130
+ const entitiesPath = path.join(domainPath, 'entities');
131
+ if (fs.existsSync(entitiesPath)) {
132
+ await checkEntityImmutability(entitiesPath, moduleName, report);
133
+ }
134
+ // Check for proper aggregate roots
135
+ await checkAggregateRoots(domainPath, moduleName, report);
136
+ // Check repository interface in domain layer
137
+ await checkRepositoryPattern(modulePath, moduleName, report);
138
+ }
139
+ }
140
+ async function checkEntityImmutability(entitiesPath, moduleName, report) {
141
+ const files = fs.readdirSync(entitiesPath).filter(f => f.endsWith('.ts'));
142
+ for (const file of files) {
143
+ const filePath = path.join(entitiesPath, file);
144
+ const content = fs.readFileSync(filePath, 'utf-8');
145
+ // Check for public setters (anti-pattern in DDD)
146
+ const publicSetterMatch = content.match(/public\s+set\s+\w+/g);
147
+ if (publicSetterMatch) {
148
+ report.warnings++;
149
+ report.results.push({
150
+ category: 'DDD Pattern',
151
+ rule: 'entity-immutability',
152
+ severity: 'warning',
153
+ message: `Entity has public setters (consider using methods for state changes)`,
154
+ file: filePath,
155
+ suggestion: 'Replace public setters with domain methods that enforce business rules',
156
+ });
157
+ }
158
+ // Check for direct property assignment patterns
159
+ if (content.includes('public ') && !content.includes('readonly')) {
160
+ const publicPropsMatch = content.match(/public\s+(?!readonly)\w+\s*[;:]/g);
161
+ if (publicPropsMatch && publicPropsMatch.length > 0) {
162
+ report.warnings++;
163
+ report.results.push({
164
+ category: 'DDD Pattern',
165
+ rule: 'entity-encapsulation',
166
+ severity: 'warning',
167
+ message: `Entity has mutable public properties`,
168
+ file: filePath,
169
+ suggestion: 'Use private/readonly properties with getter methods',
170
+ });
171
+ }
172
+ }
173
+ }
174
+ }
175
+ async function checkAggregateRoots(domainPath, moduleName, report) {
176
+ if (!fs.existsSync(domainPath))
177
+ return;
178
+ const files = getAllTypeScriptFiles(domainPath);
179
+ for (const file of files) {
180
+ const content = fs.readFileSync(file, 'utf-8');
181
+ // Check if entity extends AggregateRoot when it should
182
+ if (content.includes('class ') && content.includes('Entity')) {
183
+ const hasAggregateRoot = content.includes('extends AggregateRoot') ||
184
+ content.includes('extends BaseEntity');
185
+ const hasDomainEvents = content.includes('domainEvents') ||
186
+ content.includes('addDomainEvent');
187
+ if (hasDomainEvents && !hasAggregateRoot) {
188
+ report.warnings++;
189
+ report.results.push({
190
+ category: 'DDD Pattern',
191
+ rule: 'aggregate-root',
192
+ severity: 'warning',
193
+ message: `Entity uses domain events but doesn't extend AggregateRoot`,
194
+ file,
195
+ suggestion: 'Extend AggregateRoot base class for entities that emit domain events',
196
+ });
197
+ }
198
+ }
199
+ }
200
+ }
201
+ async function checkRepositoryPattern(modulePath, moduleName, report) {
202
+ const domainPath = path.join(modulePath, 'domain');
203
+ const infraPath = path.join(modulePath, 'infrastructure');
204
+ // Check for repository interface in domain layer
205
+ const domainRepoFiles = fs.existsSync(domainPath)
206
+ ? getAllTypeScriptFiles(domainPath).filter(f => f.includes('repository'))
207
+ : [];
208
+ const infraRepoFiles = fs.existsSync(infraPath)
209
+ ? getAllTypeScriptFiles(infraPath).filter(f => f.includes('repository'))
210
+ : [];
211
+ if (infraRepoFiles.length > 0 && domainRepoFiles.length === 0) {
212
+ report.warnings++;
213
+ report.results.push({
214
+ category: 'DDD Pattern',
215
+ rule: 'repository-interface',
216
+ severity: 'warning',
217
+ message: `Module "${moduleName}" has repository implementation but no interface in domain layer`,
218
+ suggestion: 'Define repository interface in domain layer, implement in infrastructure',
219
+ });
220
+ }
221
+ }
222
+ async function checkTypeScriptStrictness(basePath, report) {
223
+ const tsconfigPath = path.join(basePath, 'tsconfig.json');
224
+ if (!fs.existsSync(tsconfigPath)) {
225
+ report.errors++;
226
+ report.results.push({
227
+ category: 'TypeScript',
228
+ rule: 'tsconfig-exists',
229
+ severity: 'error',
230
+ message: 'Missing tsconfig.json',
231
+ suggestion: 'Run: npx tsc --init',
232
+ });
233
+ return;
234
+ }
235
+ try {
236
+ const tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, 'utf-8'));
237
+ const compilerOptions = tsconfig.compilerOptions || {};
238
+ const strictOptions = [
239
+ { option: 'strict', recommended: true },
240
+ { option: 'noImplicitAny', recommended: true },
241
+ { option: 'strictNullChecks', recommended: true },
242
+ { option: 'noUnusedLocals', recommended: true },
243
+ { option: 'noUnusedParameters', recommended: true },
244
+ ];
245
+ for (const { option, recommended } of strictOptions) {
246
+ if (compilerOptions[option] !== recommended) {
247
+ report.warnings++;
248
+ report.results.push({
249
+ category: 'TypeScript',
250
+ rule: `strict-${option}`,
251
+ severity: 'warning',
252
+ message: `TypeScript option "${option}" is not set to ${recommended}`,
253
+ file: tsconfigPath,
254
+ suggestion: `Add "${option}": ${recommended} to compilerOptions`,
255
+ autoFixable: true,
256
+ });
257
+ }
258
+ else {
259
+ report.passed++;
260
+ }
261
+ }
262
+ }
263
+ catch (error) {
264
+ report.errors++;
265
+ report.results.push({
266
+ category: 'TypeScript',
267
+ rule: 'tsconfig-valid',
268
+ severity: 'error',
269
+ message: 'Invalid tsconfig.json',
270
+ });
271
+ }
272
+ }
273
+ async function checkNamingConventions(basePath, report) {
274
+ const modulesPath = path.join(basePath, 'src/modules');
275
+ if (!fs.existsSync(modulesPath))
276
+ return;
277
+ const files = getAllTypeScriptFiles(modulesPath);
278
+ for (const file of files) {
279
+ const fileName = path.basename(file);
280
+ const content = fs.readFileSync(file, 'utf-8');
281
+ // Check file naming conventions
282
+ if (fileName.includes('Entity') && !fileName.endsWith('.entity.ts')) {
283
+ report.warnings++;
284
+ report.results.push({
285
+ category: 'Naming',
286
+ rule: 'file-naming',
287
+ severity: 'warning',
288
+ message: `Entity file should end with .entity.ts`,
289
+ file,
290
+ suggestion: `Rename to ${fileName.replace('.ts', '.entity.ts')}`,
291
+ });
292
+ }
293
+ // Check class naming
294
+ const classMatch = content.match(/export\s+class\s+(\w+)/g);
295
+ if (classMatch) {
296
+ for (const match of classMatch) {
297
+ const className = match.replace('export class ', '');
298
+ // Check PascalCase
299
+ if (className[0] !== className[0].toUpperCase()) {
300
+ report.errors++;
301
+ report.results.push({
302
+ category: 'Naming',
303
+ rule: 'class-pascal-case',
304
+ severity: 'error',
305
+ message: `Class name "${className}" should be PascalCase`,
306
+ file,
307
+ });
308
+ }
309
+ }
310
+ }
311
+ }
312
+ }
313
+ async function checkTestCoverage(basePath, report) {
314
+ const modulesPath = path.join(basePath, 'src/modules');
315
+ if (!fs.existsSync(modulesPath))
316
+ return;
317
+ const modules = fs.readdirSync(modulesPath).filter(f => fs.statSync(path.join(modulesPath, f)).isDirectory());
318
+ for (const moduleName of modules) {
319
+ const modulePath = path.join(modulesPath, moduleName);
320
+ const sourceFiles = getAllTypeScriptFiles(modulePath).filter(f => !f.includes('.spec.ts') && !f.includes('.test.ts'));
321
+ const testFiles = getAllTypeScriptFiles(modulePath).filter(f => f.includes('.spec.ts') || f.includes('.test.ts'));
322
+ // Check for service tests
323
+ const services = sourceFiles.filter(f => f.includes('.service.ts'));
324
+ for (const service of services) {
325
+ const testFile = service.replace('.service.ts', '.service.spec.ts');
326
+ if (!fs.existsSync(testFile)) {
327
+ report.warnings++;
328
+ report.results.push({
329
+ category: 'Testing',
330
+ rule: 'service-test',
331
+ severity: 'warning',
332
+ message: `Service missing unit test`,
333
+ file: service,
334
+ suggestion: `Create ${path.basename(testFile)}`,
335
+ });
336
+ }
337
+ }
338
+ // Check for domain entity tests
339
+ const entities = sourceFiles.filter(f => f.includes('.entity.ts'));
340
+ for (const entity of entities) {
341
+ const testFile = entity.replace('.entity.ts', '.entity.spec.ts');
342
+ if (!fs.existsSync(testFile)) {
343
+ report.results.push({
344
+ category: 'Testing',
345
+ rule: 'entity-test',
346
+ severity: 'info',
347
+ message: `Entity missing unit test (recommended for complex domain logic)`,
348
+ file: entity,
349
+ });
350
+ }
351
+ }
352
+ }
353
+ }
354
+ async function checkImportPatterns(basePath, report) {
355
+ const modulesPath = path.join(basePath, 'src/modules');
356
+ if (!fs.existsSync(modulesPath))
357
+ return;
358
+ const modules = fs.readdirSync(modulesPath).filter(f => fs.statSync(path.join(modulesPath, f)).isDirectory());
359
+ for (const moduleName of modules) {
360
+ const modulePath = path.join(modulesPath, moduleName);
361
+ const domainPath = path.join(modulePath, 'domain');
362
+ if (!fs.existsSync(domainPath))
363
+ continue;
364
+ const domainFiles = getAllTypeScriptFiles(domainPath);
365
+ for (const file of domainFiles) {
366
+ const content = fs.readFileSync(file, 'utf-8');
367
+ // Check for infrastructure imports in domain layer (violation)
368
+ if (content.includes("from '../infrastructure") ||
369
+ content.includes("from './infrastructure") ||
370
+ content.includes('from "@nestjs/typeorm"') ||
371
+ content.includes('from "typeorm"')) {
372
+ report.errors++;
373
+ report.results.push({
374
+ category: 'Architecture',
375
+ rule: 'domain-purity',
376
+ severity: 'error',
377
+ message: `Domain layer has infrastructure/ORM imports`,
378
+ file,
379
+ suggestion: 'Domain layer should not depend on infrastructure. Use interfaces/ports.',
380
+ });
381
+ }
382
+ // Check for direct HTTP/controller imports in domain
383
+ if (content.includes('@nestjs/common') &&
384
+ (content.includes('Controller') || content.includes('Get') || content.includes('Post'))) {
385
+ report.errors++;
386
+ report.results.push({
387
+ category: 'Architecture',
388
+ rule: 'domain-purity',
389
+ severity: 'error',
390
+ message: `Domain layer has HTTP/controller imports`,
391
+ file,
392
+ suggestion: 'Move HTTP-related code to application or presentation layer',
393
+ });
394
+ }
395
+ }
396
+ }
397
+ }
398
+ async function checkEntityIntegrity(basePath, report) {
399
+ const modulesPath = path.join(basePath, 'src/modules');
400
+ if (!fs.existsSync(modulesPath))
401
+ return;
402
+ const files = getAllTypeScriptFiles(modulesPath).filter(f => f.includes('.entity.ts'));
403
+ for (const file of files) {
404
+ const content = fs.readFileSync(file, 'utf-8');
405
+ // Check for ID field
406
+ if (!content.includes('@PrimaryGeneratedColumn') &&
407
+ !content.includes('@PrimaryColumn') &&
408
+ !content.includes('id:') &&
409
+ !content.includes('_id:')) {
410
+ report.warnings++;
411
+ report.results.push({
412
+ category: 'Entity',
413
+ rule: 'entity-id',
414
+ severity: 'warning',
415
+ message: `Entity may be missing primary key`,
416
+ file,
417
+ suggestion: 'Ensure entity has a primary key field',
418
+ });
419
+ }
420
+ // Check for createdAt/updatedAt
421
+ if (!content.includes('createdAt') && !content.includes('created_at')) {
422
+ report.results.push({
423
+ category: 'Entity',
424
+ rule: 'entity-timestamps',
425
+ severity: 'info',
426
+ message: `Entity missing createdAt timestamp`,
427
+ file,
428
+ suggestion: 'Consider adding createdAt/updatedAt for auditing',
429
+ });
430
+ }
431
+ }
432
+ }
433
+ async function checkModuleBoundaries(basePath, report) {
434
+ const modulesPath = path.join(basePath, 'src/modules');
435
+ if (!fs.existsSync(modulesPath))
436
+ return;
437
+ const modules = fs.readdirSync(modulesPath).filter(f => fs.statSync(path.join(modulesPath, f)).isDirectory());
438
+ for (const moduleName of modules) {
439
+ const modulePath = path.join(modulesPath, moduleName);
440
+ const files = getAllTypeScriptFiles(modulePath);
441
+ for (const file of files) {
442
+ const content = fs.readFileSync(file, 'utf-8');
443
+ // Check for cross-module imports (potential boundary violation)
444
+ for (const otherModule of modules) {
445
+ if (otherModule === moduleName)
446
+ continue;
447
+ const importPattern = new RegExp(`from ['"].*/${otherModule}/(?!.*\\.module)`, 'g');
448
+ if (importPattern.test(content)) {
449
+ // Check if it's importing from domain (allowed) or internal (violation)
450
+ const internalImport = content.includes(`/${otherModule}/application/`) ||
451
+ content.includes(`/${otherModule}/infrastructure/`);
452
+ if (internalImport) {
453
+ report.warnings++;
454
+ report.results.push({
455
+ category: 'Architecture',
456
+ rule: 'module-boundaries',
457
+ severity: 'warning',
458
+ message: `Cross-module import from internal layer of "${otherModule}"`,
459
+ file,
460
+ suggestion: `Import from module's public API or shared kernel instead`,
461
+ });
462
+ }
463
+ }
464
+ }
465
+ }
466
+ }
467
+ }
468
+ function getAllTypeScriptFiles(dir) {
469
+ const files = [];
470
+ if (!fs.existsSync(dir))
471
+ return files;
472
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
473
+ for (const entry of entries) {
474
+ const fullPath = path.join(dir, entry.name);
475
+ if (entry.isDirectory()) {
476
+ files.push(...getAllTypeScriptFiles(fullPath));
477
+ }
478
+ else if (entry.name.endsWith('.ts') && !entry.name.endsWith('.d.ts')) {
479
+ files.push(fullPath);
480
+ }
481
+ }
482
+ return files;
483
+ }
484
+ async function applyFixes(report) {
485
+ const fixableResults = report.results.filter(r => r.autoFixable);
486
+ if (fixableResults.length === 0) {
487
+ console.log(chalk_1.default.gray('\nNo auto-fixable issues found.'));
488
+ return;
489
+ }
490
+ console.log(chalk_1.default.yellow(`\nšŸ”§ Applying ${fixableResults.length} auto-fixes...`));
491
+ for (const result of fixableResults) {
492
+ if (result.rule === 'required-directory' && result.suggestion) {
493
+ const dir = result.suggestion.replace('Run: mkdir -p ', '');
494
+ fs.mkdirSync(dir, { recursive: true });
495
+ console.log(chalk_1.default.green(` āœ“ Created directory: ${dir}`));
496
+ }
497
+ }
498
+ }
499
+ function printReport(report, verbose) {
500
+ // Group by category
501
+ const byCategory = new Map();
502
+ for (const result of report.results) {
503
+ if (!byCategory.has(result.category)) {
504
+ byCategory.set(result.category, []);
505
+ }
506
+ byCategory.get(result.category).push(result);
507
+ }
508
+ for (const [category, results] of byCategory) {
509
+ console.log(chalk_1.default.bold(`\nšŸ“ ${category}`));
510
+ for (const result of results) {
511
+ const icon = result.severity === 'error' ? 'āŒ' :
512
+ result.severity === 'warning' ? 'āš ļø' : 'ā„¹ļø';
513
+ const color = result.severity === 'error' ? chalk_1.default.red :
514
+ result.severity === 'warning' ? chalk_1.default.yellow : chalk_1.default.gray;
515
+ console.log(color(` ${icon} ${result.message}`));
516
+ if (verbose) {
517
+ if (result.file) {
518
+ console.log(chalk_1.default.gray(` File: ${result.file}`));
519
+ }
520
+ if (result.suggestion) {
521
+ console.log(chalk_1.default.cyan(` šŸ’” ${result.suggestion}`));
522
+ }
523
+ }
524
+ }
525
+ }
526
+ // Summary
527
+ console.log(chalk_1.default.bold('\n─────────────────────────────────────'));
528
+ console.log(chalk_1.default.bold('Summary:'));
529
+ console.log(chalk_1.default.green(` āœ“ Passed: ${report.passed}`));
530
+ console.log(chalk_1.default.yellow(` ⚠ Warnings: ${report.warnings}`));
531
+ console.log(chalk_1.default.red(` āœ— Errors: ${report.errors}`));
532
+ console.log(chalk_1.default.bold('─────────────────────────────────────\n'));
533
+ if (report.errors > 0) {
534
+ console.log(chalk_1.default.red('āŒ Doctor found issues that should be addressed.'));
535
+ }
536
+ else if (report.warnings > 0) {
537
+ console.log(chalk_1.default.yellow('āš ļø Doctor found warnings. Consider addressing them.'));
538
+ }
539
+ else {
540
+ console.log(chalk_1.default.green('āœ… All checks passed! Your DDD structure looks healthy.'));
541
+ }
542
+ }
543
+ //# sourceMappingURL=doctor-enhanced.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-enhanced.js","sourceRoot":"","sources":["../../src/commands/doctor-enhanced.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export interface DoctorOptions {
2
+ path?: string;
3
+ }
4
+ export declare function runDoctor(options: DoctorOptions): Promise<boolean>;