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,419 @@
1
+ "use strict";
2
+ /**
3
+ * Type-Safe Field Schema System
4
+ * Provides structured field definitions with validation guarantees
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.parseFieldString = parseFieldString;
8
+ exports.parseFieldStrings = parseFieldStrings;
9
+ exports.fieldToTypeScript = fieldToTypeScript;
10
+ exports.fieldToTypeORMDecorator = fieldToTypeORMDecorator;
11
+ exports.fieldToValidatorDecorators = fieldToValidatorDecorators;
12
+ exports.validateEntitySchema = validateEntitySchema;
13
+ exports.createEntitySchema = createEntitySchema;
14
+ exports.schemaToJSON = schemaToJSON;
15
+ exports.schemaFromJSON = schemaFromJSON;
16
+ /**
17
+ * Parse field string into structured FieldSchema
18
+ * Format: name:type:modifier1:modifier2
19
+ * Examples:
20
+ * - email:string:unique
21
+ * - age:number:optional
22
+ * - status:enum(active,inactive,pending)
23
+ * - price:decimal(10,2)
24
+ */
25
+ function parseFieldString(fieldStr) {
26
+ const parts = fieldStr.split(':');
27
+ const name = parts[0];
28
+ let typeStr = parts[1] || 'string';
29
+ const modifierStrs = parts.slice(2);
30
+ // Parse type with parameters
31
+ let type = 'string';
32
+ let enumValues;
33
+ let length;
34
+ let precision;
35
+ let scale;
36
+ const enumMatch = typeStr.match(/^enum\(([^)]+)\)$/i);
37
+ const decimalMatch = typeStr.match(/^decimal\((\d+),(\d+)\)$/i);
38
+ const stringMatch = typeStr.match(/^string\((\d+)\)$/i);
39
+ if (enumMatch) {
40
+ type = 'enum';
41
+ enumValues = enumMatch[1].split(',').map(v => v.trim());
42
+ }
43
+ else if (decimalMatch) {
44
+ type = 'decimal';
45
+ precision = parseInt(decimalMatch[1], 10);
46
+ scale = parseInt(decimalMatch[2], 10);
47
+ }
48
+ else if (stringMatch) {
49
+ type = 'string';
50
+ length = parseInt(stringMatch[1], 10);
51
+ }
52
+ else {
53
+ type = normalizeFieldType(typeStr);
54
+ }
55
+ // Parse modifiers
56
+ const modifiers = [];
57
+ const validation = { required: true };
58
+ for (const mod of modifierStrs) {
59
+ const normalizedMod = mod.toLowerCase();
60
+ if (isFieldModifier(normalizedMod)) {
61
+ modifiers.push(normalizedMod);
62
+ if (normalizedMod === 'optional' || normalizedMod === 'nullable') {
63
+ validation.required = false;
64
+ }
65
+ }
66
+ // Parse validation modifiers
67
+ const minLenMatch = mod.match(/^minLength\((\d+)\)$/i);
68
+ const maxLenMatch = mod.match(/^maxLength\((\d+)\)$/i);
69
+ const minMatch = mod.match(/^min\((\d+)\)$/i);
70
+ const maxMatch = mod.match(/^max\((\d+)\)$/i);
71
+ const patternMatch = mod.match(/^pattern\(([^)]+)\)$/i);
72
+ if (minLenMatch)
73
+ validation.minLength = parseInt(minLenMatch[1], 10);
74
+ if (maxLenMatch)
75
+ validation.maxLength = parseInt(maxLenMatch[1], 10);
76
+ if (minMatch)
77
+ validation.min = parseInt(minMatch[1], 10);
78
+ if (maxMatch)
79
+ validation.max = parseInt(maxMatch[1], 10);
80
+ if (patternMatch)
81
+ validation.pattern = patternMatch[1];
82
+ }
83
+ // Auto-set validation based on type
84
+ if (type === 'email')
85
+ validation.email = true;
86
+ if (type === 'url')
87
+ validation.url = true;
88
+ if (type === 'uuid')
89
+ validation.uuid = true;
90
+ if (enumValues)
91
+ validation.enum = enumValues;
92
+ return {
93
+ name,
94
+ type,
95
+ modifiers,
96
+ validation,
97
+ enumValues,
98
+ length,
99
+ precision,
100
+ scale,
101
+ };
102
+ }
103
+ /**
104
+ * Parse multiple field strings
105
+ */
106
+ function parseFieldStrings(fieldsStr) {
107
+ if (!fieldsStr)
108
+ return [];
109
+ return fieldsStr
110
+ .split(/\s+/)
111
+ .filter(f => f.trim())
112
+ .map(parseFieldString);
113
+ }
114
+ /**
115
+ * Normalize type string to FieldType
116
+ */
117
+ function normalizeFieldType(typeStr) {
118
+ const typeMap = {
119
+ 'string': 'string',
120
+ 'str': 'string',
121
+ 'varchar': 'string',
122
+ 'char': 'string',
123
+ 'number': 'number',
124
+ 'num': 'number',
125
+ 'int': 'integer',
126
+ 'integer': 'integer',
127
+ 'bigint': 'bigint',
128
+ 'float': 'float',
129
+ 'double': 'float',
130
+ 'decimal': 'decimal',
131
+ 'boolean': 'boolean',
132
+ 'bool': 'boolean',
133
+ 'date': 'date',
134
+ 'datetime': 'datetime',
135
+ 'timestamp': 'datetime',
136
+ 'text': 'text',
137
+ 'json': 'json',
138
+ 'jsonb': 'json',
139
+ 'uuid': 'uuid',
140
+ 'email': 'email',
141
+ 'url': 'url',
142
+ 'enum': 'enum',
143
+ };
144
+ return typeMap[typeStr.toLowerCase()] || 'string';
145
+ }
146
+ /**
147
+ * Check if string is a valid field modifier
148
+ */
149
+ function isFieldModifier(str) {
150
+ const modifiers = [
151
+ 'optional', 'unique', 'index', 'primary',
152
+ 'generated', 'nullable', 'readonly'
153
+ ];
154
+ return modifiers.includes(str);
155
+ }
156
+ /**
157
+ * Convert FieldSchema to TypeScript type
158
+ */
159
+ function fieldToTypeScript(field) {
160
+ const typeMap = {
161
+ 'string': 'string',
162
+ 'number': 'number',
163
+ 'boolean': 'boolean',
164
+ 'date': 'Date',
165
+ 'datetime': 'Date',
166
+ 'text': 'string',
167
+ 'json': 'Record<string, any>',
168
+ 'uuid': 'string',
169
+ 'email': 'string',
170
+ 'url': 'string',
171
+ 'enum': field.enumValues ? field.enumValues.map(v => `'${v}'`).join(' | ') : 'string',
172
+ 'decimal': 'number',
173
+ 'float': 'number',
174
+ 'integer': 'number',
175
+ 'bigint': 'bigint',
176
+ };
177
+ let tsType = typeMap[field.type] || 'any';
178
+ if (!field.validation.required) {
179
+ tsType += ' | null';
180
+ }
181
+ return tsType;
182
+ }
183
+ /**
184
+ * Convert FieldSchema to TypeORM column decorator
185
+ */
186
+ function fieldToTypeORMDecorator(field) {
187
+ const options = [];
188
+ // Type mapping
189
+ const typeMap = {
190
+ 'string': 'varchar',
191
+ 'number': 'int',
192
+ 'boolean': 'boolean',
193
+ 'date': 'date',
194
+ 'datetime': 'timestamp',
195
+ 'text': 'text',
196
+ 'json': 'jsonb',
197
+ 'uuid': 'uuid',
198
+ 'email': 'varchar',
199
+ 'url': 'varchar',
200
+ 'enum': 'enum',
201
+ 'decimal': 'decimal',
202
+ 'float': 'float',
203
+ 'integer': 'int',
204
+ 'bigint': 'bigint',
205
+ };
206
+ const dbType = typeMap[field.type];
207
+ options.push(`type: '${dbType}'`);
208
+ if (field.length)
209
+ options.push(`length: ${field.length}`);
210
+ if (field.precision)
211
+ options.push(`precision: ${field.precision}`);
212
+ if (field.scale)
213
+ options.push(`scale: ${field.scale}`);
214
+ if (field.enumValues)
215
+ options.push(`enum: [${field.enumValues.map(v => `'${v}'`).join(', ')}]`);
216
+ if (!field.validation.required)
217
+ options.push('nullable: true');
218
+ if (field.modifiers.includes('unique'))
219
+ options.push('unique: true');
220
+ if (field.defaultValue !== undefined) {
221
+ const defaultVal = typeof field.defaultValue === 'string'
222
+ ? `'${field.defaultValue}'`
223
+ : field.defaultValue;
224
+ options.push(`default: ${defaultVal}`);
225
+ }
226
+ return `@Column({ ${options.join(', ')} })`;
227
+ }
228
+ /**
229
+ * Convert FieldSchema to class-validator decorators
230
+ */
231
+ function fieldToValidatorDecorators(field) {
232
+ const decorators = [];
233
+ const v = field.validation;
234
+ if (v.required) {
235
+ decorators.push('@IsNotEmpty()');
236
+ }
237
+ else {
238
+ decorators.push('@IsOptional()');
239
+ }
240
+ switch (field.type) {
241
+ case 'string':
242
+ case 'text':
243
+ decorators.push('@IsString()');
244
+ if (v.minLength)
245
+ decorators.push(`@MinLength(${v.minLength})`);
246
+ if (v.maxLength)
247
+ decorators.push(`@MaxLength(${v.maxLength})`);
248
+ if (v.pattern)
249
+ decorators.push(`@Matches(/${v.pattern}/)`);
250
+ break;
251
+ case 'email':
252
+ decorators.push('@IsEmail()');
253
+ break;
254
+ case 'url':
255
+ decorators.push('@IsUrl()');
256
+ break;
257
+ case 'uuid':
258
+ decorators.push('@IsUUID()');
259
+ break;
260
+ case 'number':
261
+ case 'integer':
262
+ case 'float':
263
+ case 'decimal':
264
+ decorators.push('@IsNumber()');
265
+ if (v.min !== undefined)
266
+ decorators.push(`@Min(${v.min})`);
267
+ if (v.max !== undefined)
268
+ decorators.push(`@Max(${v.max})`);
269
+ break;
270
+ case 'boolean':
271
+ decorators.push('@IsBoolean()');
272
+ break;
273
+ case 'date':
274
+ case 'datetime':
275
+ decorators.push('@IsDate()');
276
+ decorators.push('@Type(() => Date)');
277
+ break;
278
+ case 'enum':
279
+ if (v.enum) {
280
+ decorators.push(`@IsIn([${v.enum.map(e => `'${e}'`).join(', ')}])`);
281
+ }
282
+ break;
283
+ case 'json':
284
+ decorators.push('@IsObject()');
285
+ break;
286
+ }
287
+ return decorators;
288
+ }
289
+ /**
290
+ * Validate an EntitySchema
291
+ */
292
+ function validateEntitySchema(schema) {
293
+ const errors = [];
294
+ const warnings = [];
295
+ // Validate entity name
296
+ if (!schema.name) {
297
+ errors.push({ path: 'name', message: 'Entity name is required', code: 'MISSING_NAME' });
298
+ }
299
+ else if (!/^[A-Z][a-zA-Z0-9]*$/.test(schema.name)) {
300
+ errors.push({ path: 'name', message: 'Entity name must be PascalCase', code: 'INVALID_NAME' });
301
+ }
302
+ // Validate fields
303
+ const fieldNames = new Set();
304
+ for (let i = 0; i < schema.fields.length; i++) {
305
+ const field = schema.fields[i];
306
+ const path = `fields[${i}]`;
307
+ if (!field.name) {
308
+ errors.push({ path: `${path}.name`, message: 'Field name is required', code: 'MISSING_FIELD_NAME' });
309
+ }
310
+ else {
311
+ if (fieldNames.has(field.name)) {
312
+ errors.push({ path: `${path}.name`, message: `Duplicate field name: ${field.name}`, code: 'DUPLICATE_FIELD' });
313
+ }
314
+ fieldNames.add(field.name);
315
+ if (!/^[a-z][a-zA-Z0-9]*$/.test(field.name)) {
316
+ warnings.push({
317
+ path: `${path}.name`,
318
+ message: `Field name should be camelCase: ${field.name}`,
319
+ suggestion: toCamelCase(field.name)
320
+ });
321
+ }
322
+ }
323
+ // Validate enum fields have values
324
+ if (field.type === 'enum' && (!field.enumValues || field.enumValues.length === 0)) {
325
+ errors.push({ path: `${path}.type`, message: 'Enum fields must have enumValues', code: 'MISSING_ENUM_VALUES' });
326
+ }
327
+ // Validate decimal fields have precision
328
+ if (field.type === 'decimal' && !field.precision) {
329
+ warnings.push({
330
+ path: `${path}.type`,
331
+ message: 'Decimal fields should specify precision and scale',
332
+ suggestion: 'Use decimal(10,2) format'
333
+ });
334
+ }
335
+ }
336
+ // Validate relations
337
+ for (let i = 0; i < schema.relations.length; i++) {
338
+ const relation = schema.relations[i];
339
+ const path = `relations[${i}]`;
340
+ if (!relation.name) {
341
+ errors.push({ path: `${path}.name`, message: 'Relation name is required', code: 'MISSING_RELATION_NAME' });
342
+ }
343
+ if (!relation.target) {
344
+ errors.push({ path: `${path}.target`, message: 'Relation target is required', code: 'MISSING_RELATION_TARGET' });
345
+ }
346
+ // Check for missing inverse side
347
+ if ((relation.type === 'one-to-many' || relation.type === 'many-to-many') && !relation.inverseSide) {
348
+ warnings.push({
349
+ path: `${path}.inverseSide`,
350
+ message: `${relation.type} relations should specify inverseSide`,
351
+ suggestion: `Add inverseSide property pointing to the relation on ${relation.target}`
352
+ });
353
+ }
354
+ }
355
+ // Check for common issues
356
+ if (!schema.fields.some(f => f.modifiers.includes('primary'))) {
357
+ warnings.push({
358
+ path: 'fields',
359
+ message: 'No primary key field defined',
360
+ suggestion: 'Add a field with "primary" modifier or use "id:uuid:primary:generated"'
361
+ });
362
+ }
363
+ return {
364
+ valid: errors.length === 0,
365
+ errors,
366
+ warnings,
367
+ };
368
+ }
369
+ /**
370
+ * Generate complete EntitySchema from field strings
371
+ */
372
+ function createEntitySchema(name, fieldsStr, options = {}) {
373
+ const fields = parseFieldStrings(fieldsStr);
374
+ // Add id field if not present
375
+ if (!fields.some(f => f.modifiers.includes('primary'))) {
376
+ fields.unshift({
377
+ name: 'id',
378
+ type: 'uuid',
379
+ modifiers: ['primary', 'generated'],
380
+ validation: { required: true },
381
+ });
382
+ }
383
+ // Add timestamp fields
384
+ if (options.timestamps !== false) {
385
+ fields.push({ name: 'createdAt', type: 'datetime', modifiers: ['readonly'], validation: { required: true } }, { name: 'updatedAt', type: 'datetime', modifiers: ['readonly'], validation: { required: true } });
386
+ }
387
+ // Add soft delete field
388
+ if (options.softDelete) {
389
+ fields.push({ name: 'deletedAt', type: 'datetime', modifiers: ['nullable'], validation: { required: false } });
390
+ }
391
+ // Add audit fields
392
+ if (options.audit) {
393
+ fields.push({ name: 'createdBy', type: 'string', modifiers: ['nullable'], validation: { required: false } }, { name: 'updatedBy', type: 'string', modifiers: ['nullable'], validation: { required: false } });
394
+ }
395
+ return {
396
+ name,
397
+ fields,
398
+ relations: options.relations || [],
399
+ timestamps: options.timestamps !== false,
400
+ softDelete: options.softDelete,
401
+ audit: options.audit,
402
+ };
403
+ }
404
+ function toCamelCase(str) {
405
+ return str.replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : '').replace(/^(.)/, c => c.toLowerCase());
406
+ }
407
+ /**
408
+ * Export schema to JSON format
409
+ */
410
+ function schemaToJSON(schema) {
411
+ return JSON.stringify(schema, null, 2);
412
+ }
413
+ /**
414
+ * Import schema from JSON
415
+ */
416
+ function schemaFromJSON(json) {
417
+ return JSON.parse(json);
418
+ }
419
+ //# sourceMappingURL=schema.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.utils.js","sourceRoot":"","sources":["../../src/utils/schema.utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Security utilities for the CLI
3
+ * Implements OWASP-recommended practices for input validation and path safety
4
+ */
5
+ /**
6
+ * Validates that a path does not escape the base directory
7
+ * Prevents path traversal attacks (OWASP A01:2021)
8
+ */
9
+ export declare function validateSafePath(basePath: string, targetPath: string): string;
10
+ /**
11
+ * Sanitizes entity/module names for safe file system operations
12
+ * Prevents directory traversal and special character injection
13
+ */
14
+ export declare function sanitizeEntityName(name: string): string;
15
+ /**
16
+ * Validates that field names are safe for use in SQL/ORM queries
17
+ * Only allows alphanumeric characters and underscores, starting with letter
18
+ */
19
+ export declare function validateFieldName(fieldName: string, allowedFields?: string[]): string;
20
+ /**
21
+ * Sanitizes input for use in shell commands
22
+ * Implements whitelist approach - only allows safe characters
23
+ */
24
+ export declare function sanitizeShellInput(input: string): string;
25
+ /**
26
+ * Validates numeric input is within safe bounds
27
+ */
28
+ export declare function validateNumericInput(value: number, options?: {
29
+ min?: number;
30
+ max?: number;
31
+ allowNegative?: boolean;
32
+ allowZero?: boolean;
33
+ }): number;
34
+ /**
35
+ * Sanitizes string for safe HTML output
36
+ * Prevents XSS attacks (OWASP A03:2021)
37
+ */
38
+ export declare function sanitizeHtmlOutput(input: string): string;
39
+ /**
40
+ * Masks sensitive data in strings (API keys, passwords, etc.)
41
+ * For safe logging
42
+ */
43
+ export declare function maskSensitiveData(input: string): string;
44
+ /**
45
+ * Validates URL is safe and uses allowed protocols
46
+ */
47
+ export declare function validateUrl(url: string, allowedProtocols?: string[]): string;
48
+ /**
49
+ * Creates a rate limit key from request data
50
+ * Sanitizes to prevent key injection
51
+ */
52
+ export declare function createRateLimitKey(prefix: string, identifier: string): string;
53
+ /**
54
+ * Validates JSON input for safe parsing
55
+ * Prevents prototype pollution
56
+ */
57
+ export declare function safeJsonParse<T>(input: string): T;