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,423 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.analyzePerformance = analyzePerformance;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
43
|
+
const file_utils_1 = require("../utils/file.utils");
|
|
44
|
+
async function analyzePerformance(basePath, options = {}) {
|
|
45
|
+
console.log(chalk_1.default.bold.blue('\nā” Performance Analysis\n'));
|
|
46
|
+
const report = {
|
|
47
|
+
timestamp: new Date(),
|
|
48
|
+
issues: [],
|
|
49
|
+
summary: { critical: 0, warnings: 0, info: 0 },
|
|
50
|
+
recommendations: [],
|
|
51
|
+
};
|
|
52
|
+
const modulesPath = path.join(basePath, 'src/modules');
|
|
53
|
+
if (!fs.existsSync(modulesPath)) {
|
|
54
|
+
console.log(chalk_1.default.yellow('No modules directory found.'));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Run analysis
|
|
58
|
+
console.log(chalk_1.default.cyan('Scanning for performance issues...\n'));
|
|
59
|
+
await checkN1Queries(modulesPath, report);
|
|
60
|
+
await checkMemoryLeaks(modulesPath, report);
|
|
61
|
+
await checkSlowPatterns(modulesPath, report);
|
|
62
|
+
await checkMissingIndexes(modulesPath, report);
|
|
63
|
+
await checkLargePayloads(modulesPath, report);
|
|
64
|
+
await checkSyncOperations(modulesPath, report);
|
|
65
|
+
// Generate recommendations
|
|
66
|
+
generateRecommendations(report);
|
|
67
|
+
// Update summary
|
|
68
|
+
for (const issue of report.issues) {
|
|
69
|
+
if (issue.severity === 'critical')
|
|
70
|
+
report.summary.critical++;
|
|
71
|
+
else if (issue.severity === 'warning')
|
|
72
|
+
report.summary.warnings++;
|
|
73
|
+
else
|
|
74
|
+
report.summary.info++;
|
|
75
|
+
}
|
|
76
|
+
// Output report
|
|
77
|
+
printReport(report);
|
|
78
|
+
if (options.output) {
|
|
79
|
+
const outputDir = path.join(basePath, path.dirname(options.output));
|
|
80
|
+
await (0, file_utils_1.ensureDir)(outputDir);
|
|
81
|
+
await (0, file_utils_1.writeFile)(path.join(basePath, options.output), JSON.stringify(report, null, 2));
|
|
82
|
+
console.log(chalk_1.default.green(`\nReport saved to ${options.output}`));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function checkN1Queries(modulesPath, report) {
|
|
86
|
+
const files = getAllTypeScriptFiles(modulesPath);
|
|
87
|
+
for (const file of files) {
|
|
88
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
89
|
+
const lines = content.split('\n');
|
|
90
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
91
|
+
// Pattern 1: Loop with await inside
|
|
92
|
+
const loopAwaitPattern = /for\s*\([^)]+\)\s*\{[\s\S]*?await\s+(?:this\.)?(?:\w+\.)?(?:find|query|get|fetch)/g;
|
|
93
|
+
let match;
|
|
94
|
+
while ((match = loopAwaitPattern.exec(content)) !== null) {
|
|
95
|
+
const lineNum = content.substring(0, match.index).split('\n').length;
|
|
96
|
+
report.issues.push({
|
|
97
|
+
type: 'n+1',
|
|
98
|
+
severity: 'critical',
|
|
99
|
+
file: relativePath,
|
|
100
|
+
line: lineNum,
|
|
101
|
+
message: 'Potential N+1 query: Database call inside loop',
|
|
102
|
+
suggestion: 'Use batch loading, eager loading, or DataLoader pattern',
|
|
103
|
+
codeSnippet: lines[lineNum - 1]?.trim(),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// Pattern 2: forEach with async callback
|
|
107
|
+
if (content.includes('.forEach(async')) {
|
|
108
|
+
const lineNum = content.indexOf('.forEach(async');
|
|
109
|
+
const lineNumber = content.substring(0, lineNum).split('\n').length;
|
|
110
|
+
report.issues.push({
|
|
111
|
+
type: 'n+1',
|
|
112
|
+
severity: 'warning',
|
|
113
|
+
file: relativePath,
|
|
114
|
+
line: lineNumber,
|
|
115
|
+
message: 'forEach with async callback may cause sequential queries',
|
|
116
|
+
suggestion: 'Use Promise.all with map() for parallel execution',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Pattern 3: Nested relation loading
|
|
120
|
+
const nestedLoadPattern = /\.find\w*\(\{[\s\S]*?relations:\s*\[[\s\S]*?\[/;
|
|
121
|
+
if (nestedLoadPattern.test(content)) {
|
|
122
|
+
report.issues.push({
|
|
123
|
+
type: 'n+1',
|
|
124
|
+
severity: 'warning',
|
|
125
|
+
file: relativePath,
|
|
126
|
+
message: 'Deep nested relations may cause performance issues',
|
|
127
|
+
suggestion: 'Consider using query builder with explicit joins or GraphQL DataLoader',
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async function checkMemoryLeaks(modulesPath, report) {
|
|
133
|
+
const files = getAllTypeScriptFiles(modulesPath);
|
|
134
|
+
for (const file of files) {
|
|
135
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
136
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
137
|
+
// Pattern 1: Event listeners without cleanup
|
|
138
|
+
if (content.includes('.on(') || content.includes('.addEventListener(')) {
|
|
139
|
+
if (!content.includes('.off(') && !content.includes('.removeEventListener(') &&
|
|
140
|
+
!content.includes('OnModuleDestroy') && !content.includes('onModuleDestroy')) {
|
|
141
|
+
report.issues.push({
|
|
142
|
+
type: 'memory-leak',
|
|
143
|
+
severity: 'warning',
|
|
144
|
+
file: relativePath,
|
|
145
|
+
message: 'Event listener without cleanup',
|
|
146
|
+
suggestion: 'Implement OnModuleDestroy to remove event listeners',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Pattern 2: Intervals without cleanup
|
|
151
|
+
if (content.includes('setInterval(')) {
|
|
152
|
+
if (!content.includes('clearInterval(')) {
|
|
153
|
+
report.issues.push({
|
|
154
|
+
type: 'memory-leak',
|
|
155
|
+
severity: 'warning',
|
|
156
|
+
file: relativePath,
|
|
157
|
+
message: 'setInterval without clearInterval',
|
|
158
|
+
suggestion: 'Store interval ID and clear in OnModuleDestroy',
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Pattern 3: Subscriptions without unsubscribe
|
|
163
|
+
if (content.includes('.subscribe(')) {
|
|
164
|
+
if (!content.includes('.unsubscribe(') && !content.includes('takeUntil(')) {
|
|
165
|
+
report.issues.push({
|
|
166
|
+
type: 'memory-leak',
|
|
167
|
+
severity: 'warning',
|
|
168
|
+
file: relativePath,
|
|
169
|
+
message: 'Observable subscription without unsubscribe',
|
|
170
|
+
suggestion: 'Use takeUntil pattern or store subscription for cleanup',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Pattern 4: Large arrays growing unbounded
|
|
175
|
+
const unboundedArrayPattern = /private\s+\w+:\s*\w+\[\]\s*=\s*\[\][\s\S]*?\.push\(/;
|
|
176
|
+
if (unboundedArrayPattern.test(content)) {
|
|
177
|
+
if (!content.includes('.splice(') && !content.includes('.shift(') &&
|
|
178
|
+
!content.includes('= []') && !content.includes('.length = ')) {
|
|
179
|
+
report.issues.push({
|
|
180
|
+
type: 'memory-leak',
|
|
181
|
+
severity: 'info',
|
|
182
|
+
file: relativePath,
|
|
183
|
+
message: 'Array that grows without bounds',
|
|
184
|
+
suggestion: 'Implement size limit or periodic cleanup',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async function checkSlowPatterns(modulesPath, report) {
|
|
191
|
+
const files = getAllTypeScriptFiles(modulesPath);
|
|
192
|
+
for (const file of files) {
|
|
193
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
194
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
195
|
+
// Pattern 1: SELECT * (implicit in findAll without select)
|
|
196
|
+
if (content.includes('.find()') || content.includes('.findAll()')) {
|
|
197
|
+
if (!content.includes('select:')) {
|
|
198
|
+
report.issues.push({
|
|
199
|
+
type: 'slow-query',
|
|
200
|
+
severity: 'info',
|
|
201
|
+
file: relativePath,
|
|
202
|
+
message: 'Fetching all columns (SELECT *)',
|
|
203
|
+
suggestion: 'Specify only needed columns with select option',
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Pattern 2: Missing pagination
|
|
208
|
+
if (content.includes('.find(') && !content.includes('take:') &&
|
|
209
|
+
!content.includes('limit:') && !content.includes('skip:')) {
|
|
210
|
+
if (content.includes('Repository') || content.includes('.repository')) {
|
|
211
|
+
report.issues.push({
|
|
212
|
+
type: 'slow-query',
|
|
213
|
+
severity: 'warning',
|
|
214
|
+
file: relativePath,
|
|
215
|
+
message: 'Query without pagination may return large datasets',
|
|
216
|
+
suggestion: 'Add take/skip or limit/offset for pagination',
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Pattern 3: Synchronous file operations
|
|
221
|
+
const syncOps = ['readFileSync', 'writeFileSync', 'existsSync', 'mkdirSync'];
|
|
222
|
+
for (const op of syncOps) {
|
|
223
|
+
if (content.includes(op) && !file.includes('.spec.') && !file.includes('.test.')) {
|
|
224
|
+
report.issues.push({
|
|
225
|
+
type: 'sync-operation',
|
|
226
|
+
severity: 'warning',
|
|
227
|
+
file: relativePath,
|
|
228
|
+
message: `Synchronous file operation: ${op}`,
|
|
229
|
+
suggestion: 'Use async version (readFile, writeFile, etc.) in production code',
|
|
230
|
+
});
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Pattern 4: JSON.parse without try-catch
|
|
235
|
+
if (content.includes('JSON.parse(') && !content.includes('try')) {
|
|
236
|
+
const lineNum = content.indexOf('JSON.parse(');
|
|
237
|
+
const lineNumber = content.substring(0, lineNum).split('\n').length;
|
|
238
|
+
report.issues.push({
|
|
239
|
+
type: 'slow-query',
|
|
240
|
+
severity: 'info',
|
|
241
|
+
file: relativePath,
|
|
242
|
+
line: lineNumber,
|
|
243
|
+
message: 'JSON.parse without error handling',
|
|
244
|
+
suggestion: 'Wrap in try-catch to handle malformed JSON',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async function checkMissingIndexes(modulesPath, report) {
|
|
250
|
+
const files = getAllTypeScriptFiles(modulesPath).filter(f => f.includes('.entity.ts'));
|
|
251
|
+
for (const file of files) {
|
|
252
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
253
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
254
|
+
// Check for columns that should be indexed
|
|
255
|
+
const searchableFields = ['email', 'username', 'slug', 'status', 'type', 'category'];
|
|
256
|
+
for (const field of searchableFields) {
|
|
257
|
+
const fieldPattern = new RegExp(`@Column[^)]*\\)\\s*${field}\\s*:`, 'i');
|
|
258
|
+
if (fieldPattern.test(content)) {
|
|
259
|
+
if (!content.includes(`@Index`) || !content.includes(field)) {
|
|
260
|
+
report.issues.push({
|
|
261
|
+
type: 'missing-index',
|
|
262
|
+
severity: 'info',
|
|
263
|
+
file: relativePath,
|
|
264
|
+
message: `Column "${field}" might benefit from an index`,
|
|
265
|
+
suggestion: `Add @Index() decorator if this column is frequently queried`,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Check foreign keys
|
|
271
|
+
if (content.includes('@ManyToOne') || content.includes('@OneToOne')) {
|
|
272
|
+
const fkPattern = /@(?:ManyToOne|OneToOne)[^)]*\)[\s\S]*?(\w+Id):/g;
|
|
273
|
+
let match;
|
|
274
|
+
while ((match = fkPattern.exec(content)) !== null) {
|
|
275
|
+
if (!content.includes(`@Index`) || !content.includes(match[1])) {
|
|
276
|
+
report.issues.push({
|
|
277
|
+
type: 'missing-index',
|
|
278
|
+
severity: 'warning',
|
|
279
|
+
file: relativePath,
|
|
280
|
+
message: `Foreign key "${match[1]}" should have an index`,
|
|
281
|
+
suggestion: 'Add @Index() to foreign key columns for better join performance',
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
async function checkLargePayloads(modulesPath, report) {
|
|
289
|
+
const files = getAllTypeScriptFiles(modulesPath).filter(f => f.includes('.controller.ts') || f.includes('.resolver.ts'));
|
|
290
|
+
for (const file of files) {
|
|
291
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
292
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
293
|
+
// Check for endpoints returning arrays without limits
|
|
294
|
+
if (content.includes('findAll') || content.includes('getAll') || content.includes('list')) {
|
|
295
|
+
if (!content.includes('pagination') && !content.includes('PaginatedResponse') &&
|
|
296
|
+
!content.includes('limit') && !content.includes('take')) {
|
|
297
|
+
report.issues.push({
|
|
298
|
+
type: 'large-payload',
|
|
299
|
+
severity: 'warning',
|
|
300
|
+
file: relativePath,
|
|
301
|
+
message: 'Endpoint may return unbounded array',
|
|
302
|
+
suggestion: 'Implement pagination to prevent large payloads',
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Check for returning full entities with relations
|
|
307
|
+
if (content.includes('relations:') && content.includes('return')) {
|
|
308
|
+
report.issues.push({
|
|
309
|
+
type: 'large-payload',
|
|
310
|
+
severity: 'info',
|
|
311
|
+
file: relativePath,
|
|
312
|
+
message: 'Returning entities with eager-loaded relations',
|
|
313
|
+
suggestion: 'Consider using DTOs to control response payload size',
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
async function checkSyncOperations(modulesPath, report) {
|
|
319
|
+
const files = getAllTypeScriptFiles(modulesPath);
|
|
320
|
+
for (const file of files) {
|
|
321
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
322
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
323
|
+
// Check for blocking crypto operations
|
|
324
|
+
if (content.includes('crypto.') && (content.includes('Sync') || content.includes('pbkdf2Sync'))) {
|
|
325
|
+
report.issues.push({
|
|
326
|
+
type: 'sync-operation',
|
|
327
|
+
severity: 'critical',
|
|
328
|
+
file: relativePath,
|
|
329
|
+
message: 'Synchronous crypto operation blocks event loop',
|
|
330
|
+
suggestion: 'Use async versions (scrypt, pbkdf2) or move to worker thread',
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
// Check for CPU-intensive operations
|
|
334
|
+
const intensiveOps = ['while (true)', 'for (;;)', '.sort()', '.reverse()'];
|
|
335
|
+
for (const op of intensiveOps) {
|
|
336
|
+
if (content.includes(op) && !file.includes('.spec.')) {
|
|
337
|
+
report.issues.push({
|
|
338
|
+
type: 'sync-operation',
|
|
339
|
+
severity: 'info',
|
|
340
|
+
file: relativePath,
|
|
341
|
+
message: `Potentially CPU-intensive operation: ${op}`,
|
|
342
|
+
suggestion: 'Consider using worker threads for CPU-bound tasks',
|
|
343
|
+
});
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
function generateRecommendations(report) {
|
|
350
|
+
const issueTypes = new Set(report.issues.map(i => i.type));
|
|
351
|
+
if (issueTypes.has('n+1')) {
|
|
352
|
+
report.recommendations.push('Install DataLoader for batching database queries', 'Use eager loading sparingly and prefer explicit joins', 'Consider implementing query result caching');
|
|
353
|
+
}
|
|
354
|
+
if (issueTypes.has('memory-leak')) {
|
|
355
|
+
report.recommendations.push('Implement OnModuleDestroy interface for cleanup', 'Use WeakMap/WeakSet for caches when appropriate', 'Consider using memory profiling tools in development');
|
|
356
|
+
}
|
|
357
|
+
if (issueTypes.has('missing-index')) {
|
|
358
|
+
report.recommendations.push('Review query execution plans with EXPLAIN ANALYZE', 'Add indexes to frequently queried columns', 'Consider composite indexes for multi-column queries');
|
|
359
|
+
}
|
|
360
|
+
if (issueTypes.has('large-payload')) {
|
|
361
|
+
report.recommendations.push('Implement cursor-based pagination for large datasets', 'Use DTOs to control response shape and size', 'Consider GraphQL for clients to request only needed fields');
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
function printReport(report) {
|
|
365
|
+
console.log(chalk_1.default.bold('š Performance Report\n'));
|
|
366
|
+
// Summary
|
|
367
|
+
console.log(chalk_1.default.cyan('Summary:'));
|
|
368
|
+
console.log(chalk_1.default.red(` Critical: ${report.summary.critical}`));
|
|
369
|
+
console.log(chalk_1.default.yellow(` Warnings: ${report.summary.warnings}`));
|
|
370
|
+
console.log(chalk_1.default.gray(` Info: ${report.summary.info}`));
|
|
371
|
+
// Issues by type
|
|
372
|
+
const byType = new Map();
|
|
373
|
+
for (const issue of report.issues) {
|
|
374
|
+
if (!byType.has(issue.type))
|
|
375
|
+
byType.set(issue.type, []);
|
|
376
|
+
byType.get(issue.type).push(issue);
|
|
377
|
+
}
|
|
378
|
+
if (report.issues.length > 0) {
|
|
379
|
+
console.log(chalk_1.default.bold('\nšØ Issues Found:\n'));
|
|
380
|
+
for (const [type, issues] of byType) {
|
|
381
|
+
const typeLabel = type.replace(/-/g, ' ').toUpperCase();
|
|
382
|
+
console.log(chalk_1.default.cyan(`${typeLabel} (${issues.length})`));
|
|
383
|
+
for (const issue of issues.slice(0, 5)) {
|
|
384
|
+
const color = issue.severity === 'critical' ? chalk_1.default.red :
|
|
385
|
+
issue.severity === 'warning' ? chalk_1.default.yellow : chalk_1.default.gray;
|
|
386
|
+
console.log(color(` ⢠${issue.file}${issue.line ? `:${issue.line}` : ''}`));
|
|
387
|
+
console.log(chalk_1.default.gray(` ${issue.message}`));
|
|
388
|
+
console.log(chalk_1.default.cyan(` š” ${issue.suggestion}`));
|
|
389
|
+
}
|
|
390
|
+
if (issues.length > 5) {
|
|
391
|
+
console.log(chalk_1.default.gray(` ... and ${issues.length - 5} more`));
|
|
392
|
+
}
|
|
393
|
+
console.log();
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
console.log(chalk_1.default.green('\nā
No performance issues found!'));
|
|
398
|
+
}
|
|
399
|
+
// Recommendations
|
|
400
|
+
if (report.recommendations.length > 0) {
|
|
401
|
+
console.log(chalk_1.default.bold('š” Recommendations:\n'));
|
|
402
|
+
for (const rec of report.recommendations) {
|
|
403
|
+
console.log(chalk_1.default.cyan(` ⢠${rec}`));
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
function getAllTypeScriptFiles(dir) {
|
|
408
|
+
const files = [];
|
|
409
|
+
function scan(d) {
|
|
410
|
+
if (!fs.existsSync(d))
|
|
411
|
+
return;
|
|
412
|
+
for (const e of fs.readdirSync(d, { withFileTypes: true })) {
|
|
413
|
+
const p = path.join(d, e.name);
|
|
414
|
+
if (e.isDirectory() && !e.name.startsWith('.') && e.name !== 'node_modules')
|
|
415
|
+
scan(p);
|
|
416
|
+
else if (e.name.endsWith('.ts') && !e.name.endsWith('.d.ts'))
|
|
417
|
+
files.push(p);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
scan(dir);
|
|
421
|
+
return files;
|
|
422
|
+
}
|
|
423
|
+
//# sourceMappingURL=perf-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-analyzer.js","sourceRoot":"","sources":["../../src/commands/perf-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiting & Throttling Framework Generator
|
|
3
|
+
* Generates comprehensive rate limiting infrastructure
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitingOptions {
|
|
6
|
+
path?: string;
|
|
7
|
+
strategy?: 'token-bucket' | 'sliding-window' | 'fixed-window';
|
|
8
|
+
storage?: 'memory' | 'redis';
|
|
9
|
+
}
|
|
10
|
+
export declare function setupRateLimiting(basePath: string, options?: RateLimitingOptions): Promise<void>;
|