nestjs-ddd-cli 2.2.1 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +24 -5
- 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,14 +11,30 @@ exports.toPlural = toPlural;
|
|
|
11
11
|
exports.toSingular = toSingular;
|
|
12
12
|
exports.toTableName = toTableName;
|
|
13
13
|
const pluralize_1 = __importDefault(require("pluralize"));
|
|
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
|
|
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
|
+
}
|
|
14
28
|
function toPascalCase(str) {
|
|
29
|
+
const sanitized = sanitizeInput(str);
|
|
15
30
|
// If the string is already PascalCase (starts with uppercase and has no separators), return as-is
|
|
16
|
-
if (/^[A-Z][a-zA-Z0-9]*$/.test(
|
|
17
|
-
return
|
|
31
|
+
if (/^[A-Z][a-zA-Z0-9]*$/.test(sanitized) && !/[-_ ]/.test(sanitized)) {
|
|
32
|
+
return sanitized;
|
|
18
33
|
}
|
|
19
|
-
return
|
|
34
|
+
return sanitized
|
|
20
35
|
.split(/[-_ ]/)
|
|
21
|
-
.
|
|
36
|
+
.filter(word => word.length > 0)
|
|
37
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
22
38
|
.join('');
|
|
23
39
|
}
|
|
24
40
|
function toCamelCase(str) {
|
|
@@ -26,9 +42,12 @@ function toCamelCase(str) {
|
|
|
26
42
|
return pascal.charAt(0).toLowerCase() + pascal.slice(1);
|
|
27
43
|
}
|
|
28
44
|
function toKebabCase(str) {
|
|
29
|
-
|
|
45
|
+
const sanitized = sanitizeInput(str);
|
|
46
|
+
return sanitized
|
|
30
47
|
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
31
48
|
.replace(/[\s_]+/g, '-')
|
|
49
|
+
.replace(/-+/g, '-') // Collapse multiple hyphens
|
|
50
|
+
.replace(/^-|-$/g, '') // Trim leading/trailing hyphens
|
|
32
51
|
.toLowerCase();
|
|
33
52
|
}
|
|
34
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 {};
|