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