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.
- package/README.md +247 -408
- package/ddd.schema.json +111 -0
- package/dist/commands/aggregate-validator.d.ts +9 -0
- package/dist/commands/aggregate-validator.js +953 -0
- package/dist/commands/aggregate-validator.js.map +1 -0
- package/dist/commands/ai-assist.d.ts +8 -0
- package/dist/commands/ai-assist.js +337 -0
- package/dist/commands/ai-assist.js.map +1 -0
- package/dist/commands/api-contracts.d.ts +9 -0
- package/dist/commands/api-contracts.js +1368 -0
- package/dist/commands/api-contracts.js.map +1 -0
- package/dist/commands/api-docs.d.ts +8 -0
- package/dist/commands/api-docs.js +408 -0
- package/dist/commands/api-docs.js.map +1 -0
- package/dist/commands/api-versioning.d.ts +11 -0
- package/dist/commands/api-versioning.js +643 -0
- package/dist/commands/api-versioning.js.map +1 -0
- package/dist/commands/audit-logging.d.ts +9 -0
- package/dist/commands/audit-logging.js +1129 -0
- package/dist/commands/audit-logging.js.map +1 -0
- package/dist/commands/batch-generate.d.ts +10 -0
- package/dist/commands/batch-generate.js +405 -0
- package/dist/commands/batch-generate.js.map +1 -0
- package/dist/commands/caching-strategies.d.ts +9 -0
- package/dist/commands/caching-strategies.js +874 -0
- package/dist/commands/caching-strategies.js.map +1 -0
- package/dist/commands/code-analyzer.d.ts +42 -0
- package/dist/commands/code-analyzer.js +474 -0
- package/dist/commands/code-analyzer.js.map +1 -0
- package/dist/commands/database-seeding.d.ts +6 -0
- package/dist/commands/database-seeding.js +621 -0
- package/dist/commands/database-seeding.js.map +1 -0
- package/dist/commands/db-optimization.d.ts +7 -0
- package/dist/commands/db-optimization.js +687 -0
- package/dist/commands/db-optimization.js.map +1 -0
- package/dist/commands/dependency-graph.d.ts +6 -0
- package/dist/commands/dependency-graph.js +329 -0
- package/dist/commands/dependency-graph.js.map +1 -0
- package/dist/commands/doctor-enhanced.d.ts +22 -0
- package/dist/commands/doctor-enhanced.js +543 -0
- package/dist/commands/doctor-enhanced.js.map +1 -0
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.js +151 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/env-manager.d.ts +6 -0
- package/dist/commands/env-manager.js +419 -0
- package/dist/commands/env-manager.js.map +1 -0
- package/dist/commands/event-sourcing-full.d.ts +10 -0
- package/dist/commands/event-sourcing-full.js +1107 -0
- package/dist/commands/event-sourcing-full.js.map +1 -0
- package/dist/commands/feature-flags.d.ts +9 -0
- package/dist/commands/feature-flags.js +824 -0
- package/dist/commands/feature-flags.js.map +1 -0
- package/dist/commands/filter-dsl.d.ts +10 -0
- package/dist/commands/filter-dsl.js +1407 -0
- package/dist/commands/filter-dsl.js.map +1 -0
- package/dist/commands/generate-all.js +485 -32
- package/dist/commands/generate-all.js.map +1 -1
- package/dist/commands/generate-deployment.d.ts +8 -0
- package/dist/commands/generate-deployment.js +746 -0
- package/dist/commands/generate-deployment.js.map +1 -0
- package/dist/commands/generate-domain-service.d.ts +14 -0
- package/dist/commands/generate-domain-service.js +796 -0
- package/dist/commands/generate-domain-service.js.map +1 -0
- package/dist/commands/generate-entity.js +82 -24
- package/dist/commands/generate-entity.js.map +1 -1
- package/dist/commands/generate-from-schema.d.ts +56 -0
- package/dist/commands/generate-from-schema.js +222 -0
- package/dist/commands/generate-from-schema.js.map +1 -0
- package/dist/commands/generate-orchestrator.d.ts +14 -0
- package/dist/commands/generate-orchestrator.js +887 -0
- package/dist/commands/generate-orchestrator.js.map +1 -0
- package/dist/commands/generate-repository.d.ts +14 -0
- package/dist/commands/generate-repository.js +1019 -0
- package/dist/commands/generate-repository.js.map +1 -0
- package/dist/commands/generate-shared.d.ts +4 -0
- package/dist/commands/generate-shared.js +388 -0
- package/dist/commands/generate-shared.js.map +1 -0
- package/dist/commands/generate-value-object.d.ts +32 -0
- package/dist/commands/generate-value-object.js +700 -0
- package/dist/commands/generate-value-object.js.map +1 -0
- package/dist/commands/graphql-subscriptions.d.ts +6 -0
- package/dist/commands/graphql-subscriptions.js +607 -0
- package/dist/commands/graphql-subscriptions.js.map +1 -0
- package/dist/commands/graphql-types.d.ts +5 -0
- package/dist/commands/graphql-types.js +423 -0
- package/dist/commands/graphql-types.js.map +1 -0
- package/dist/commands/health-probes-advanced.d.ts +6 -0
- package/dist/commands/health-probes-advanced.js +655 -0
- package/dist/commands/health-probes-advanced.js.map +1 -0
- package/dist/commands/i18n-setup.d.ts +10 -0
- package/dist/commands/i18n-setup.js +677 -0
- package/dist/commands/i18n-setup.js.map +1 -0
- package/dist/commands/init-config.d.ts +6 -0
- package/dist/commands/init-config.js +370 -0
- package/dist/commands/init-config.js.map +1 -0
- package/dist/commands/init-project.js +56 -6
- package/dist/commands/init-project.js.map +1 -1
- package/dist/commands/interactive-scaffold.d.ts +5 -0
- package/dist/commands/interactive-scaffold.js +271 -0
- package/dist/commands/interactive-scaffold.js.map +1 -0
- package/dist/commands/metrics-prometheus.d.ts +6 -0
- package/dist/commands/metrics-prometheus.js +681 -0
- package/dist/commands/metrics-prometheus.js.map +1 -0
- package/dist/commands/migration-engine.d.ts +6 -0
- package/dist/commands/migration-engine.js +446 -0
- package/dist/commands/migration-engine.js.map +1 -0
- package/dist/commands/migration.d.ts +12 -0
- package/dist/commands/migration.js +484 -0
- package/dist/commands/migration.js.map +1 -0
- package/dist/commands/monorepo.d.ts +8 -0
- package/dist/commands/monorepo.js +483 -0
- package/dist/commands/monorepo.js.map +1 -0
- package/dist/commands/multi-database.d.ts +5 -0
- package/dist/commands/multi-database.js +439 -0
- package/dist/commands/multi-database.js.map +1 -0
- package/dist/commands/observability-tracing.d.ts +10 -0
- package/dist/commands/observability-tracing.js +740 -0
- package/dist/commands/observability-tracing.js.map +1 -0
- package/dist/commands/openapi-export.d.ts +8 -0
- package/dist/commands/openapi-export.js +359 -0
- package/dist/commands/openapi-export.js.map +1 -0
- package/dist/commands/perf-analyzer.d.ts +8 -0
- package/dist/commands/perf-analyzer.js +423 -0
- package/dist/commands/perf-analyzer.js.map +1 -0
- package/dist/commands/rate-limiting.d.ts +10 -0
- package/dist/commands/rate-limiting.js +953 -0
- package/dist/commands/rate-limiting.js.map +1 -0
- package/dist/commands/recipe-plugin.d.ts +56 -0
- package/dist/commands/recipe-plugin.js +315 -0
- package/dist/commands/recipe-plugin.js.map +1 -0
- package/dist/commands/recipe.d.ts +6 -0
- package/dist/commands/recipe.js +3941 -0
- package/dist/commands/recipe.js.map +1 -0
- package/dist/commands/recipes/elasticsearch.recipe.d.ts +1 -0
- package/dist/commands/recipes/elasticsearch.recipe.js +761 -0
- package/dist/commands/recipes/elasticsearch.recipe.js.map +1 -0
- package/dist/commands/recipes/event-sourcing.recipe.d.ts +1 -0
- package/dist/commands/recipes/event-sourcing.recipe.js +889 -0
- package/dist/commands/recipes/event-sourcing.recipe.js.map +1 -0
- package/dist/commands/recipes/index.d.ts +7 -0
- package/dist/commands/recipes/index.js +24 -0
- package/dist/commands/recipes/index.js.map +1 -0
- package/dist/commands/recipes/message-queue.recipe.d.ts +1 -0
- package/dist/commands/recipes/message-queue.recipe.js +706 -0
- package/dist/commands/recipes/message-queue.recipe.js.map +1 -0
- package/dist/commands/recipes/middleware.recipe.d.ts +1 -0
- package/dist/commands/recipes/middleware.recipe.js +383 -0
- package/dist/commands/recipes/middleware.recipe.js.map +1 -0
- package/dist/commands/recipes/multi-tenancy.recipe.d.ts +1 -0
- package/dist/commands/recipes/multi-tenancy.recipe.js +520 -0
- package/dist/commands/recipes/multi-tenancy.recipe.js.map +1 -0
- package/dist/commands/recipes/oauth2.recipe.d.ts +1 -0
- package/dist/commands/recipes/oauth2.recipe.js +472 -0
- package/dist/commands/recipes/oauth2.recipe.js.map +1 -0
- package/dist/commands/recipes/websocket.recipe.d.ts +1 -0
- package/dist/commands/recipes/websocket.recipe.js +453 -0
- package/dist/commands/recipes/websocket.recipe.js.map +1 -0
- package/dist/commands/resilience-patterns.d.ts +13 -0
- package/dist/commands/resilience-patterns.js +1029 -0
- package/dist/commands/resilience-patterns.js.map +1 -0
- package/dist/commands/security-patterns.d.ts +11 -0
- package/dist/commands/security-patterns.js +2233 -0
- package/dist/commands/security-patterns.js.map +1 -0
- package/dist/commands/template-debug.d.ts +27 -0
- package/dist/commands/template-debug.js +388 -0
- package/dist/commands/template-debug.js.map +1 -0
- package/dist/commands/test-factory-full.d.ts +9 -0
- package/dist/commands/test-factory-full.js +1570 -0
- package/dist/commands/test-factory-full.js.map +1 -0
- package/dist/commands/test-scaffold.d.ts +7 -0
- package/dist/commands/test-scaffold.js +621 -0
- package/dist/commands/test-scaffold.js.map +1 -0
- package/dist/index.js +1088 -0
- package/dist/index.js.map +1 -1
- package/dist/templates/ai-context/CLAUDE.md.hbs +158 -0
- package/dist/templates/ai-context/conventions.md.hbs +154 -0
- package/dist/templates/command/create-command.hbs +6 -14
- package/dist/templates/command/delete-command.hbs +19 -0
- package/dist/templates/command/update-command.hbs +24 -0
- package/dist/templates/controller/controller.hbs +64 -17
- package/dist/templates/dto/create-dto.hbs +29 -5
- package/dist/templates/dto/filter-dto.hbs +52 -0
- package/dist/templates/dto/filter-query.dto.hbs +148 -0
- package/dist/templates/dto/paginated-response.dto.hbs +29 -0
- package/dist/templates/dto/pagination-query.dto.hbs +30 -0
- package/dist/templates/dto/response-dto.hbs +38 -0
- package/dist/templates/dto/update-dto.hbs +11 -0
- package/dist/templates/entity/entity.hbs +32 -1
- package/dist/templates/event/domain-event.hbs +33 -7
- package/dist/templates/event/event-handler.hbs +40 -0
- package/dist/templates/exception/base-exceptions.hbs +69 -0
- package/dist/templates/exception/entity-not-found.exception.hbs +7 -0
- package/dist/templates/mapper/mapper.hbs +49 -24
- package/dist/templates/module/module.hbs +34 -10
- package/dist/templates/orm-entity/orm-entity.hbs +63 -12
- package/dist/templates/prisma/prisma-mapper.hbs +71 -0
- package/dist/templates/prisma/prisma-repository.hbs +114 -0
- package/dist/templates/prisma/prisma-schema.hbs +20 -0
- package/dist/templates/prisma/prisma-service.hbs +51 -0
- package/dist/templates/query/get-all.query.hbs +50 -0
- package/dist/templates/query/get-by-id.query.hbs +31 -0
- package/dist/templates/repository/repository.hbs +55 -13
- package/dist/templates/resolver/graphql-input.hbs +54 -0
- package/dist/templates/resolver/graphql-type.hbs +58 -0
- package/dist/templates/resolver/pagination-args.hbs +33 -0
- package/dist/templates/resolver/resolver.hbs +62 -0
- package/dist/templates/shared/prisma-query-builder.util.hbs +189 -0
- package/dist/templates/shared/query-builder.util.hbs +218 -0
- package/dist/templates/test/controller.spec.hbs +124 -0
- package/dist/templates/test/repository.spec.hbs +158 -0
- package/dist/templates/test/usecase.spec.hbs +116 -0
- package/dist/templates/usecase/create-usecase.hbs +19 -7
- package/dist/templates/usecase/delete-usecase.hbs +17 -0
- package/dist/templates/usecase/update-usecase.hbs +31 -0
- package/dist/utils/config.utils.d.ts +45 -0
- package/dist/utils/config.utils.js +211 -0
- package/dist/utils/config.utils.js.map +1 -0
- package/dist/utils/error.utils.d.ts +145 -0
- package/dist/utils/error.utils.js +422 -0
- package/dist/utils/error.utils.js.map +1 -0
- package/dist/utils/field.utils.d.ts +54 -0
- package/dist/utils/field.utils.js +389 -0
- package/dist/utils/field.utils.js.map +1 -0
- package/dist/utils/file.utils.d.ts +19 -8
- package/dist/utils/file.utils.js +135 -4
- package/dist/utils/file.utils.js.map +1 -1
- package/dist/utils/idempotency.utils.d.ts +123 -0
- package/dist/utils/idempotency.utils.js +444 -0
- package/dist/utils/idempotency.utils.js.map +1 -0
- package/dist/utils/naming.utils.js +26 -3
- package/dist/utils/naming.utils.js.map +1 -1
- package/dist/utils/performance.utils.d.ts +37 -0
- package/dist/utils/performance.utils.js +158 -0
- package/dist/utils/performance.utils.js.map +1 -0
- package/dist/utils/relation.utils.d.ts +92 -0
- package/dist/utils/relation.utils.js +388 -0
- package/dist/utils/relation.utils.js.map +1 -0
- package/dist/utils/rollback.utils.d.ts +49 -0
- package/dist/utils/rollback.utils.js +306 -0
- package/dist/utils/rollback.utils.js.map +1 -0
- package/dist/utils/schema.utils.d.ts +123 -0
- package/dist/utils/schema.utils.js +419 -0
- package/dist/utils/schema.utils.js.map +1 -0
- package/dist/utils/security.utils.d.ts +57 -0
- package/dist/utils/security.utils.js +315 -0
- package/dist/utils/security.utils.js.map +1 -0
- package/dist/utils/template-engine.utils.d.ts +80 -0
- package/dist/utils/template-engine.utils.js +463 -0
- package/dist/utils/template-engine.utils.js.map +1 -0
- package/dist/utils/validation-registry.utils.d.ts +160 -0
- package/dist/utils/validation-registry.utils.js +526 -0
- package/dist/utils/validation-registry.utils.js.map +1 -0
- 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
|
-
|
|
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
|
-
.
|
|
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
|
-
|
|
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":";;;;;
|
|
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 {};
|