helix-lang 11.0.0
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 +168 -0
- package/dist/architect.d.ts +14 -0
- package/dist/architect.d.ts.map +1 -0
- package/dist/architect.js +127 -0
- package/dist/architect.js.map +1 -0
- package/dist/bin/helix.d.ts +20 -0
- package/dist/bin/helix.d.ts.map +1 -0
- package/dist/bin/helix.js +921 -0
- package/dist/bin/helix.js.map +1 -0
- package/dist/commands/collaborate/index.d.ts +2 -0
- package/dist/commands/collaborate/index.d.ts.map +1 -0
- package/dist/commands/collaborate/index.js +129 -0
- package/dist/commands/collaborate/index.js.map +1 -0
- package/dist/commands/collaborate/server.d.ts +31 -0
- package/dist/commands/collaborate/server.d.ts.map +1 -0
- package/dist/commands/collaborate/server.js +159 -0
- package/dist/commands/collaborate/server.js.map +1 -0
- package/dist/commands/deploy/index.d.ts +25 -0
- package/dist/commands/deploy/index.d.ts.map +1 -0
- package/dist/commands/deploy/index.js +130 -0
- package/dist/commands/deploy/index.js.map +1 -0
- package/dist/commands/deploy/platforms/fly.d.ts +9 -0
- package/dist/commands/deploy/platforms/fly.d.ts.map +1 -0
- package/dist/commands/deploy/platforms/fly.js +68 -0
- package/dist/commands/deploy/platforms/fly.js.map +1 -0
- package/dist/commands/deploy/platforms/railway.d.ts +9 -0
- package/dist/commands/deploy/platforms/railway.d.ts.map +1 -0
- package/dist/commands/deploy/platforms/railway.js +115 -0
- package/dist/commands/deploy/platforms/railway.js.map +1 -0
- package/dist/commands/deploy/platforms/vercel.d.ts +10 -0
- package/dist/commands/deploy/platforms/vercel.d.ts.map +1 -0
- package/dist/commands/deploy/platforms/vercel.js +126 -0
- package/dist/commands/deploy/platforms/vercel.js.map +1 -0
- package/dist/commands/deploy.d.ts +6 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +56 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/evolve/analyzers/performance.d.ts +13 -0
- package/dist/commands/evolve/analyzers/performance.d.ts.map +1 -0
- package/dist/commands/evolve/analyzers/performance.js +591 -0
- package/dist/commands/evolve/analyzers/performance.js.map +1 -0
- package/dist/commands/evolve/analyzers/security.d.ts +21 -0
- package/dist/commands/evolve/analyzers/security.d.ts.map +1 -0
- package/dist/commands/evolve/analyzers/security.js +280 -0
- package/dist/commands/evolve/analyzers/security.js.map +1 -0
- package/dist/commands/evolve/index.d.ts +2 -0
- package/dist/commands/evolve/index.d.ts.map +1 -0
- package/dist/commands/evolve/index.js +122 -0
- package/dist/commands/evolve/index.js.map +1 -0
- package/dist/commands/generate.d.ts +6 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +277 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +176 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/library/index.d.ts +27 -0
- package/dist/commands/library/index.d.ts.map +1 -0
- package/dist/commands/library/index.js +126 -0
- package/dist/commands/library/index.js.map +1 -0
- package/dist/commands/migrate.d.ts +5 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +258 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +6 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +195 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/preflight.d.ts +20 -0
- package/dist/commands/preflight.d.ts.map +1 -0
- package/dist/commands/preflight.js +182 -0
- package/dist/commands/preflight.js.map +1 -0
- package/dist/commands/preview.d.ts +13 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +260 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/run.d.ts +6 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +96 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/spawn.d.ts +11 -0
- package/dist/commands/spawn.d.ts.map +1 -0
- package/dist/commands/spawn.js +916 -0
- package/dist/commands/spawn.js.map +1 -0
- package/dist/compiler.d.ts +12 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +92 -0
- package/dist/compiler.js.map +1 -0
- package/dist/core/file-writer.d.ts +36 -0
- package/dist/core/file-writer.d.ts.map +1 -0
- package/dist/core/file-writer.js +268 -0
- package/dist/core/file-writer.js.map +1 -0
- package/dist/core/registry.d.ts +57 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +222 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/self-healing.d.ts +47 -0
- package/dist/core/self-healing.d.ts.map +1 -0
- package/dist/core/self-healing.js +250 -0
- package/dist/core/self-healing.js.map +1 -0
- package/dist/core/types.d.ts +126 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generators/databases/mongodb.d.ts +10 -0
- package/dist/generators/databases/mongodb.d.ts.map +1 -0
- package/dist/generators/databases/mongodb.js +83 -0
- package/dist/generators/databases/mongodb.js.map +1 -0
- package/dist/generators/databases/redis.d.ts +2 -0
- package/dist/generators/databases/redis.d.ts.map +1 -0
- package/dist/generators/databases/redis.js +140 -0
- package/dist/generators/databases/redis.js.map +1 -0
- package/dist/generators/flutter.d.ts +32 -0
- package/dist/generators/flutter.d.ts.map +1 -0
- package/dist/generators/flutter.js +628 -0
- package/dist/generators/flutter.js.map +1 -0
- package/dist/openrouter.d.ts +68 -0
- package/dist/openrouter.d.ts.map +1 -0
- package/dist/openrouter.js +241 -0
- package/dist/openrouter.js.map +1 -0
- package/dist/page-generator.d.ts +22 -0
- package/dist/page-generator.d.ts.map +1 -0
- package/dist/page-generator.js +192 -0
- package/dist/page-generator.js.map +1 -0
- package/dist/parser.d.ts +76 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +691 -0
- package/dist/parser.js.map +1 -0
- package/dist/prompts/master-architect.d.ts +9 -0
- package/dist/prompts/master-architect.d.ts.map +1 -0
- package/dist/prompts/master-architect.js +150 -0
- package/dist/prompts/master-architect.js.map +1 -0
- package/dist/researcher.d.ts +12 -0
- package/dist/researcher.d.ts.map +1 -0
- package/dist/researcher.js +85 -0
- package/dist/researcher.js.map +1 -0
- package/dist/self-heal.d.ts +29 -0
- package/dist/self-heal.d.ts.map +1 -0
- package/dist/self-heal.js +260 -0
- package/dist/self-heal.js.map +1 -0
- package/dist/services/SupabaseDeployer.d.ts +9 -0
- package/dist/services/SupabaseDeployer.d.ts.map +1 -0
- package/dist/services/SupabaseDeployer.js +50 -0
- package/dist/services/SupabaseDeployer.js.map +1 -0
- package/dist/test-generator.d.ts +18 -0
- package/dist/test-generator.d.ts.map +1 -0
- package/dist/test-generator.js +180 -0
- package/dist/test-generator.js.map +1 -0
- package/dist/themes/index.d.ts +52 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +273 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +81 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/constitutional-validator.d.ts +73 -0
- package/dist/utils/constitutional-validator.d.ts.map +1 -0
- package/dist/utils/constitutional-validator.js +249 -0
- package/dist/utils/constitutional-validator.js.map +1 -0
- package/library/auth-flow/app/api/auth/[...nextauth]/route.ts +31 -0
- package/library/auth-flow/app/api/auth/login/route.ts +90 -0
- package/library/auth-flow/app/api/auth/register/route.ts +91 -0
- package/library/auth-flow/components/auth/AuthMiddleware.tsx +139 -0
- package/library/auth-flow/components/auth/LoginForm.tsx +125 -0
- package/library/auth-flow/components/auth/RegisterForm.tsx +168 -0
- package/library/auth-flow/components/auth/nextauth-config.ts +99 -0
- package/library/auth-flow/manifest.json +29 -0
- package/library/auth-flow/schema.prisma +45 -0
- package/library/dashboard-analytics/components/dashboard/ActivityFeed.tsx +109 -0
- package/library/dashboard-analytics/components/dashboard/LineChart.tsx +180 -0
- package/library/dashboard-analytics/components/dashboard/StatsCard.tsx +47 -0
- package/library/dashboard-analytics/components/dashboard/SummaryGrid.tsx +39 -0
- package/library/dashboard-analytics/manifest.json +19 -0
- package/library/data-table/components/table/BulkActions.tsx +59 -0
- package/library/data-table/components/table/ColumnToggle.tsx +65 -0
- package/library/data-table/components/table/DataTable.tsx +318 -0
- package/library/data-table/components/table/ExportCSV.tsx +52 -0
- package/library/data-table/components/table/SearchFilter.tsx +48 -0
- package/library/data-table/manifest.json +20 -0
- package/library/file-upload/app/api/upload/route.ts +107 -0
- package/library/file-upload/components/upload/DropZone.tsx +268 -0
- package/library/file-upload/components/upload/FilePreview.tsx +82 -0
- package/library/file-upload/components/upload/UploadProgress.tsx +92 -0
- package/library/file-upload/components/upload/fileStorage.ts +142 -0
- package/library/file-upload/manifest.json +21 -0
- package/library/notification-system/app/api/notifications/route.ts +121 -0
- package/library/notification-system/components/notifications/NotificationBell.tsx +154 -0
- package/library/notification-system/components/notifications/NotificationProvider.tsx +161 -0
- package/library/notification-system/components/notifications/Toast.tsx +112 -0
- package/library/notification-system/manifest.json +20 -0
- package/package.json +66 -0
|
@@ -0,0 +1,591 @@
|
|
|
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
|
+
exports.autoFixPerformanceIssues = autoFixPerformanceIssues;
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs-extra"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
async function findFiles(dir, pattern) {
|
|
45
|
+
const results = [];
|
|
46
|
+
try {
|
|
47
|
+
const files = await fs.readdir(dir, { withFileTypes: true });
|
|
48
|
+
for (const file of files) {
|
|
49
|
+
const filePath = path.join(dir, file.name);
|
|
50
|
+
if (file.isDirectory() && !['node_modules', '.next', 'dist', '.git'].includes(file.name)) {
|
|
51
|
+
results.push(...await findFiles(filePath, pattern));
|
|
52
|
+
}
|
|
53
|
+
else if (file.isFile() && pattern.test(file.name)) {
|
|
54
|
+
results.push(filePath);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// Skip inaccessible directories
|
|
60
|
+
}
|
|
61
|
+
return results;
|
|
62
|
+
}
|
|
63
|
+
async function analyzePerformance(projectPath) {
|
|
64
|
+
console.log(chalk_1.default.cyan('\n Analyzing performance...\n'));
|
|
65
|
+
const issues = [];
|
|
66
|
+
// Find all TypeScript/JavaScript files
|
|
67
|
+
const codeFiles = await findFiles(projectPath, /\.(ts|tsx|js|jsx)$/);
|
|
68
|
+
// Find Prisma schema files
|
|
69
|
+
const prismaFiles = await findFiles(projectPath, /schema\.prisma$/);
|
|
70
|
+
for (const filePath of codeFiles) {
|
|
71
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
72
|
+
const lines = content.split('\n');
|
|
73
|
+
const relativePath = path.relative(projectPath, filePath);
|
|
74
|
+
// Detect N+1 queries (findMany inside loops)
|
|
75
|
+
issues.push(...detectNPlusOneQueries(relativePath, lines));
|
|
76
|
+
// Detect large components
|
|
77
|
+
issues.push(...detectLargeComponents(relativePath, lines, content));
|
|
78
|
+
// Detect unused imports
|
|
79
|
+
issues.push(...detectUnusedImports(relativePath, lines, content));
|
|
80
|
+
// Detect inefficient React renders
|
|
81
|
+
issues.push(...detectInefficientRenders(relativePath, lines));
|
|
82
|
+
}
|
|
83
|
+
// Detect missing indexes in Prisma schemas
|
|
84
|
+
for (const prismaFile of prismaFiles) {
|
|
85
|
+
const content = await fs.readFile(prismaFile, 'utf-8');
|
|
86
|
+
const relativePath = path.relative(projectPath, prismaFile);
|
|
87
|
+
// Gather all where-clause fields from code files
|
|
88
|
+
const whereFields = await gatherWhereClauseFields(codeFiles);
|
|
89
|
+
issues.push(...detectMissingIndexes(relativePath, content, whereFields));
|
|
90
|
+
}
|
|
91
|
+
// Report findings
|
|
92
|
+
if (issues.length > 0) {
|
|
93
|
+
console.log(chalk_1.default.yellow(`\n Found ${issues.length} performance issues:\n`));
|
|
94
|
+
issues.forEach((issue, index) => {
|
|
95
|
+
const severityColor = issue.severity === 'high' ? chalk_1.default.red :
|
|
96
|
+
issue.severity === 'medium' ? chalk_1.default.yellow :
|
|
97
|
+
chalk_1.default.gray;
|
|
98
|
+
const fixLabel = issue.autoFixable ? chalk_1.default.green(' [auto-fixable]') : chalk_1.default.gray(' [manual]');
|
|
99
|
+
console.log(severityColor(`${index + 1}. [${issue.severity.toUpperCase()}] ${issue.type}${fixLabel}`));
|
|
100
|
+
console.log(chalk_1.default.gray(` ${issue.file}:${issue.line}`));
|
|
101
|
+
console.log(chalk_1.default.white(` ${issue.description}`));
|
|
102
|
+
console.log(chalk_1.default.cyan(` Suggestion: ${issue.suggestion}\n`));
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.log(chalk_1.default.green(' No performance issues found.\n'));
|
|
107
|
+
}
|
|
108
|
+
return issues;
|
|
109
|
+
}
|
|
110
|
+
function detectNPlusOneQueries(file, lines) {
|
|
111
|
+
const issues = [];
|
|
112
|
+
lines.forEach((line, index) => {
|
|
113
|
+
// Detect loops with database queries inside them
|
|
114
|
+
if (line.includes('for') || line.includes('.map(') || line.includes('.forEach(')) {
|
|
115
|
+
const nextFewLines = lines.slice(index, Math.min(index + 10, lines.length)).join('\n');
|
|
116
|
+
// Check for prisma findMany/findUnique/findFirst inside the loop
|
|
117
|
+
const prismaMatch = nextFewLines.match(/prisma\.(\w+)\.(findMany|findUnique|findFirst)/);
|
|
118
|
+
if (prismaMatch) {
|
|
119
|
+
const model = prismaMatch[1];
|
|
120
|
+
const method = prismaMatch[2];
|
|
121
|
+
issues.push({
|
|
122
|
+
type: 'n+1-query',
|
|
123
|
+
file,
|
|
124
|
+
line: index + 1,
|
|
125
|
+
description: `N+1 query: prisma.${model}.${method} called inside a loop`,
|
|
126
|
+
suggestion: `Use prisma.${model}.findMany with a where/in clause outside the loop, or add include to the parent query`,
|
|
127
|
+
severity: 'high',
|
|
128
|
+
autoFixable: true,
|
|
129
|
+
fixData: { model, method },
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// Also catch generic db calls
|
|
133
|
+
if (!prismaMatch && nextFewLines.includes('await db.')) {
|
|
134
|
+
issues.push({
|
|
135
|
+
type: 'n+1-query',
|
|
136
|
+
file,
|
|
137
|
+
line: index + 1,
|
|
138
|
+
description: 'Potential N+1 query: Database call inside loop',
|
|
139
|
+
suggestion: 'Batch queries using findMany with where/in clause outside the loop',
|
|
140
|
+
severity: 'high',
|
|
141
|
+
autoFixable: false,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Detect findMany/findUnique without include when relations are accessed
|
|
146
|
+
if ((line.includes('findMany') || line.includes('findUnique')) &&
|
|
147
|
+
!line.includes('include')) {
|
|
148
|
+
const nextFewLines = lines.slice(index, Math.min(index + 10, lines.length)).join('\n');
|
|
149
|
+
// Check if relation access pattern exists (e.g., user.posts, item.category)
|
|
150
|
+
const relationMatch = nextFewLines.match(/\.(\w+)\.(\w+)/);
|
|
151
|
+
if (relationMatch) {
|
|
152
|
+
const relationName = relationMatch[1];
|
|
153
|
+
issues.push({
|
|
154
|
+
type: 'n+1-query',
|
|
155
|
+
file,
|
|
156
|
+
line: index + 1,
|
|
157
|
+
description: 'Query may trigger additional queries for relations',
|
|
158
|
+
suggestion: `Add include: { ${relationName}: true } to prevent N+1 queries`,
|
|
159
|
+
severity: 'medium',
|
|
160
|
+
autoFixable: true,
|
|
161
|
+
fixData: { relationName },
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
return issues;
|
|
167
|
+
}
|
|
168
|
+
async function gatherWhereClauseFields(codeFiles) {
|
|
169
|
+
const modelFields = new Map();
|
|
170
|
+
for (const filePath of codeFiles) {
|
|
171
|
+
try {
|
|
172
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
173
|
+
// Match prisma.model.findMany({ where: { field: ... } })
|
|
174
|
+
const whereRegex = /prisma\.(\w+)\.(?:findMany|findFirst|findUnique|count|deleteMany|updateMany)\(\s*\{[^}]*where\s*:\s*\{([^}]+)\}/g;
|
|
175
|
+
let match;
|
|
176
|
+
while ((match = whereRegex.exec(content)) !== null) {
|
|
177
|
+
const model = match[1];
|
|
178
|
+
const whereClause = match[2];
|
|
179
|
+
if (!modelFields.has(model)) {
|
|
180
|
+
modelFields.set(model, new Set());
|
|
181
|
+
}
|
|
182
|
+
// Extract field names from the where clause
|
|
183
|
+
const fieldRegex = /(\w+)\s*:/g;
|
|
184
|
+
let fieldMatch;
|
|
185
|
+
while ((fieldMatch = fieldRegex.exec(whereClause)) !== null) {
|
|
186
|
+
const field = fieldMatch[1];
|
|
187
|
+
// Skip Prisma operators
|
|
188
|
+
if (!['contains', 'startsWith', 'endsWith', 'equals', 'not', 'in', 'notIn', 'lt', 'lte', 'gt', 'gte', 'mode'].includes(field)) {
|
|
189
|
+
modelFields.get(model).add(field);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
// Skip unreadable files
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return modelFields;
|
|
199
|
+
}
|
|
200
|
+
function detectMissingIndexes(file, schemaContent, whereFields) {
|
|
201
|
+
const issues = [];
|
|
202
|
+
// Parse models from Prisma schema
|
|
203
|
+
const modelRegex = /model\s+(\w+)\s*\{([\s\S]*?)\n\}/g;
|
|
204
|
+
let modelMatch;
|
|
205
|
+
while ((modelMatch = modelRegex.exec(schemaContent)) !== null) {
|
|
206
|
+
const modelName = modelMatch[1];
|
|
207
|
+
const modelBody = modelMatch[2];
|
|
208
|
+
const modelStartLine = schemaContent.substring(0, modelMatch.index).split('\n').length;
|
|
209
|
+
// Find existing indexes
|
|
210
|
+
const existingIndexes = new Set();
|
|
211
|
+
// Check for @id
|
|
212
|
+
const idMatch = modelBody.match(/(\w+)\s+.*@id/);
|
|
213
|
+
if (idMatch) {
|
|
214
|
+
existingIndexes.add(idMatch[1]);
|
|
215
|
+
}
|
|
216
|
+
// Check for @unique
|
|
217
|
+
const uniqueRegex = /(\w+)\s+.*@unique/g;
|
|
218
|
+
let uniqueMatch;
|
|
219
|
+
while ((uniqueMatch = uniqueRegex.exec(modelBody)) !== null) {
|
|
220
|
+
existingIndexes.add(uniqueMatch[1]);
|
|
221
|
+
}
|
|
222
|
+
// Check for @@index
|
|
223
|
+
const indexRegex = /@@index\(\[([^\]]+)\]\)/g;
|
|
224
|
+
let indexMatch;
|
|
225
|
+
while ((indexMatch = indexRegex.exec(modelBody)) !== null) {
|
|
226
|
+
const indexFields = indexMatch[1].split(',').map(f => f.trim());
|
|
227
|
+
indexFields.forEach(f => existingIndexes.add(f));
|
|
228
|
+
}
|
|
229
|
+
// Convert model name to lowercase for matching (Prisma convention)
|
|
230
|
+
const modelNameLower = modelName.charAt(0).toLowerCase() + modelName.slice(1);
|
|
231
|
+
const queriedFields = whereFields.get(modelNameLower) || whereFields.get(modelName);
|
|
232
|
+
if (queriedFields) {
|
|
233
|
+
for (const field of queriedFields) {
|
|
234
|
+
if (!existingIndexes.has(field) && field !== 'id') {
|
|
235
|
+
// Find the line number for this field in the model
|
|
236
|
+
const fieldRegex = new RegExp(`^\\s+${field}\\s+`, 'm');
|
|
237
|
+
const fieldMatch = modelBody.match(fieldRegex);
|
|
238
|
+
const lineOffset = fieldMatch
|
|
239
|
+
? modelBody.substring(0, modelBody.indexOf(fieldMatch[0])).split('\n').length
|
|
240
|
+
: 1;
|
|
241
|
+
issues.push({
|
|
242
|
+
type: 'missing-index',
|
|
243
|
+
file,
|
|
244
|
+
line: modelStartLine + lineOffset,
|
|
245
|
+
description: `Field "${field}" on model "${modelName}" is used in where clauses but has no index`,
|
|
246
|
+
suggestion: `Add @@index([${field}]) to the ${modelName} model`,
|
|
247
|
+
severity: 'medium',
|
|
248
|
+
autoFixable: true,
|
|
249
|
+
fixData: { modelName, field },
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return issues;
|
|
256
|
+
}
|
|
257
|
+
function detectLargeComponents(file, lines, content) {
|
|
258
|
+
const issues = [];
|
|
259
|
+
if (!file.endsWith('.tsx') && !file.endsWith('.jsx')) {
|
|
260
|
+
return issues;
|
|
261
|
+
}
|
|
262
|
+
// Find React component definitions and measure their size
|
|
263
|
+
const componentPatterns = [
|
|
264
|
+
/^(?:export\s+)?(?:default\s+)?function\s+([A-Z]\w*)/,
|
|
265
|
+
/^(?:export\s+)?const\s+([A-Z]\w*)\s*[=:]/,
|
|
266
|
+
];
|
|
267
|
+
lines.forEach((line, index) => {
|
|
268
|
+
for (const pattern of componentPatterns) {
|
|
269
|
+
const match = line.match(pattern);
|
|
270
|
+
if (match) {
|
|
271
|
+
const componentName = match[1];
|
|
272
|
+
// Estimate component size by counting lines until the next component or end
|
|
273
|
+
let braceDepth = 0;
|
|
274
|
+
let componentEnd = lines.length;
|
|
275
|
+
let started = false;
|
|
276
|
+
for (let i = index; i < lines.length; i++) {
|
|
277
|
+
for (const ch of lines[i]) {
|
|
278
|
+
if (ch === '{') {
|
|
279
|
+
braceDepth++;
|
|
280
|
+
started = true;
|
|
281
|
+
}
|
|
282
|
+
if (ch === '}')
|
|
283
|
+
braceDepth--;
|
|
284
|
+
}
|
|
285
|
+
if (started && braceDepth <= 0) {
|
|
286
|
+
componentEnd = i;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const componentSize = componentEnd - index + 1;
|
|
291
|
+
if (componentSize > 200) {
|
|
292
|
+
issues.push({
|
|
293
|
+
type: 'large-component',
|
|
294
|
+
file,
|
|
295
|
+
line: index + 1,
|
|
296
|
+
description: `Component "${componentName}" is ${componentSize} lines long (threshold: 200)`,
|
|
297
|
+
suggestion: `Split "${componentName}" into smaller sub-components for better readability and performance`,
|
|
298
|
+
severity: 'medium',
|
|
299
|
+
autoFixable: false, // Suggest only, don't auto-split
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
break; // Only match first pattern per line
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
return issues;
|
|
307
|
+
}
|
|
308
|
+
function detectUnusedImports(file, lines, content) {
|
|
309
|
+
const issues = [];
|
|
310
|
+
// Only check TS/JS files
|
|
311
|
+
if (!file.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
312
|
+
return issues;
|
|
313
|
+
}
|
|
314
|
+
lines.forEach((line, index) => {
|
|
315
|
+
// Match named imports: import { Foo, Bar } from '...'
|
|
316
|
+
const namedImportMatch = line.match(/^import\s*\{([^}]+)\}\s*from\s/);
|
|
317
|
+
if (namedImportMatch) {
|
|
318
|
+
const importNames = namedImportMatch[1].split(',').map(s => {
|
|
319
|
+
// Handle aliased imports: Foo as Bar
|
|
320
|
+
const parts = s.trim().split(/\s+as\s+/);
|
|
321
|
+
return { original: parts[0].trim(), alias: (parts[1] || parts[0]).trim() };
|
|
322
|
+
});
|
|
323
|
+
// Get the rest of the file content after this import line
|
|
324
|
+
const restOfFile = lines.slice(index + 1).join('\n');
|
|
325
|
+
for (const { original, alias } of importNames) {
|
|
326
|
+
if (!alias)
|
|
327
|
+
continue;
|
|
328
|
+
// Check if the imported name is used anywhere after the import
|
|
329
|
+
// Use word boundary to avoid false matches (e.g., "useState" matching "useStateManager")
|
|
330
|
+
const usageRegex = new RegExp(`\\b${escapeRegex(alias)}\\b`);
|
|
331
|
+
if (!usageRegex.test(restOfFile)) {
|
|
332
|
+
issues.push({
|
|
333
|
+
type: 'unused-import',
|
|
334
|
+
file,
|
|
335
|
+
line: index + 1,
|
|
336
|
+
description: `Unused import: "${alias}" is imported but never used`,
|
|
337
|
+
suggestion: `Remove unused import "${alias}"`,
|
|
338
|
+
severity: 'low',
|
|
339
|
+
autoFixable: true,
|
|
340
|
+
fixData: { importName: alias, originalName: original },
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Match default imports: import Foo from '...'
|
|
346
|
+
const defaultImportMatch = line.match(/^import\s+([A-Za-z_$][\w$]*)\s+from\s/);
|
|
347
|
+
if (defaultImportMatch) {
|
|
348
|
+
const importName = defaultImportMatch[1];
|
|
349
|
+
const restOfFile = lines.slice(index + 1).join('\n');
|
|
350
|
+
const usageRegex = new RegExp(`\\b${escapeRegex(importName)}\\b`);
|
|
351
|
+
if (!usageRegex.test(restOfFile)) {
|
|
352
|
+
issues.push({
|
|
353
|
+
type: 'unused-import',
|
|
354
|
+
file,
|
|
355
|
+
line: index + 1,
|
|
356
|
+
description: `Unused import: "${importName}" is imported but never used`,
|
|
357
|
+
suggestion: `Remove unused import "${importName}"`,
|
|
358
|
+
severity: 'low',
|
|
359
|
+
autoFixable: true,
|
|
360
|
+
fixData: { importName },
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
return issues;
|
|
366
|
+
}
|
|
367
|
+
function escapeRegex(str) {
|
|
368
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
369
|
+
}
|
|
370
|
+
function detectInefficientRenders(file, lines) {
|
|
371
|
+
const issues = [];
|
|
372
|
+
if (!file.endsWith('.tsx') && !file.endsWith('.jsx')) {
|
|
373
|
+
return issues;
|
|
374
|
+
}
|
|
375
|
+
lines.forEach((line, index) => {
|
|
376
|
+
// Detect inline function definitions in JSX
|
|
377
|
+
if (line.includes('onClick={() =>') || line.includes('onChange={() =>')) {
|
|
378
|
+
issues.push({
|
|
379
|
+
type: 'inefficient-render',
|
|
380
|
+
file,
|
|
381
|
+
line: index + 1,
|
|
382
|
+
description: 'Inline function in JSX causes re-renders',
|
|
383
|
+
suggestion: 'Use useCallback or define function outside render',
|
|
384
|
+
severity: 'low',
|
|
385
|
+
autoFixable: false,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
// Detect missing React.memo on components that accept props
|
|
389
|
+
if (line.includes('export default function') || line.includes('export const')) {
|
|
390
|
+
const componentContent = lines.slice(index, Math.min(index + 50, lines.length)).join('\n');
|
|
391
|
+
if (componentContent.includes('props') && !componentContent.includes('memo')) {
|
|
392
|
+
issues.push({
|
|
393
|
+
type: 'inefficient-render',
|
|
394
|
+
file,
|
|
395
|
+
line: index + 1,
|
|
396
|
+
description: 'Component with props may benefit from React.memo',
|
|
397
|
+
suggestion: 'Wrap component with React.memo to prevent unnecessary re-renders',
|
|
398
|
+
severity: 'low',
|
|
399
|
+
autoFixable: false,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
return issues;
|
|
405
|
+
}
|
|
406
|
+
// =============================================================================
|
|
407
|
+
// AUTO-FIXER
|
|
408
|
+
// =============================================================================
|
|
409
|
+
async function autoFixPerformanceIssues(projectPath, issues) {
|
|
410
|
+
console.log(chalk_1.default.cyan('\n Auto-fixing performance issues...\n'));
|
|
411
|
+
const fixableIssues = issues.filter(i => i.autoFixable);
|
|
412
|
+
if (fixableIssues.length === 0) {
|
|
413
|
+
console.log(chalk_1.default.yellow(' No auto-fixable issues found.\n'));
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
// Group issues by file
|
|
417
|
+
const issuesByFile = fixableIssues.reduce((acc, issue) => {
|
|
418
|
+
if (!acc[issue.file])
|
|
419
|
+
acc[issue.file] = [];
|
|
420
|
+
acc[issue.file].push(issue);
|
|
421
|
+
return acc;
|
|
422
|
+
}, {});
|
|
423
|
+
let fixedCount = 0;
|
|
424
|
+
for (const [file, fileIssues] of Object.entries(issuesByFile)) {
|
|
425
|
+
const filePath = path.join(projectPath, file);
|
|
426
|
+
try {
|
|
427
|
+
let content = await fs.readFile(filePath, 'utf-8');
|
|
428
|
+
let lines = content.split('\n');
|
|
429
|
+
let modified = false;
|
|
430
|
+
// Sort issues by line number descending so we can fix from bottom up
|
|
431
|
+
// without shifting line numbers
|
|
432
|
+
const sortedIssues = [...fileIssues].sort((a, b) => b.line - a.line);
|
|
433
|
+
for (const issue of sortedIssues) {
|
|
434
|
+
switch (issue.type) {
|
|
435
|
+
case 'n+1-query': {
|
|
436
|
+
// Fix: Add include to Prisma queries
|
|
437
|
+
if (issue.fixData?.relationName) {
|
|
438
|
+
const lineIdx = issue.line - 1;
|
|
439
|
+
const currentLine = lines[lineIdx];
|
|
440
|
+
if (currentLine && (currentLine.includes('findMany') || currentLine.includes('findUnique'))) {
|
|
441
|
+
// Check if there's already an object argument
|
|
442
|
+
if (currentLine.includes('({')) {
|
|
443
|
+
// Add include to existing args
|
|
444
|
+
const insertLine = ` include: { ${issue.fixData.relationName}: true },`;
|
|
445
|
+
// Find the opening brace and insert after it
|
|
446
|
+
const braceIdx = currentLine.indexOf('({');
|
|
447
|
+
if (braceIdx !== -1) {
|
|
448
|
+
lines.splice(lineIdx + 1, 0, insertLine);
|
|
449
|
+
modified = true;
|
|
450
|
+
fixedCount++;
|
|
451
|
+
console.log(chalk_1.default.green(` Fixed: Added include for "${issue.fixData.relationName}" in ${file}:${issue.line}`));
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
else if (currentLine.includes('()')) {
|
|
455
|
+
// No args yet, add them
|
|
456
|
+
lines[lineIdx] = currentLine.replace(/\(\)/, `({ include: { ${issue.fixData.relationName}: true } })`);
|
|
457
|
+
modified = true;
|
|
458
|
+
fixedCount++;
|
|
459
|
+
console.log(chalk_1.default.green(` Fixed: Added include for "${issue.fixData.relationName}" in ${file}:${issue.line}`));
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
case 'missing-index': {
|
|
466
|
+
// Fix: Add @@index to Prisma schema
|
|
467
|
+
if (issue.fixData?.modelName && issue.fixData?.field) {
|
|
468
|
+
const modelName = issue.fixData.modelName;
|
|
469
|
+
const field = issue.fixData.field;
|
|
470
|
+
// Find the closing brace of the model
|
|
471
|
+
const modelRegex = new RegExp(`model\\s+${modelName}\\s*\\{`);
|
|
472
|
+
const modelMatch = content.match(modelRegex);
|
|
473
|
+
if (modelMatch && modelMatch.index !== undefined) {
|
|
474
|
+
const modelStart = modelMatch.index;
|
|
475
|
+
// Find the closing brace
|
|
476
|
+
let braceDepth = 0;
|
|
477
|
+
let closingBraceIdx = -1;
|
|
478
|
+
for (let i = modelStart; i < content.length; i++) {
|
|
479
|
+
if (content[i] === '{')
|
|
480
|
+
braceDepth++;
|
|
481
|
+
if (content[i] === '}') {
|
|
482
|
+
braceDepth--;
|
|
483
|
+
if (braceDepth === 0) {
|
|
484
|
+
closingBraceIdx = i;
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
if (closingBraceIdx !== -1) {
|
|
490
|
+
// Check if this index already exists
|
|
491
|
+
const modelContent = content.substring(modelStart, closingBraceIdx);
|
|
492
|
+
if (!modelContent.includes(`@@index([${field}])`)) {
|
|
493
|
+
// Insert @@index before the closing brace
|
|
494
|
+
const indexLine = ` @@index([${field}])\n`;
|
|
495
|
+
content = content.substring(0, closingBraceIdx) + indexLine + content.substring(closingBraceIdx);
|
|
496
|
+
lines = content.split('\n');
|
|
497
|
+
modified = true;
|
|
498
|
+
fixedCount++;
|
|
499
|
+
console.log(chalk_1.default.green(` Fixed: Added @@index([${field}]) to ${modelName} in ${file}`));
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
break;
|
|
505
|
+
}
|
|
506
|
+
case 'unused-import': {
|
|
507
|
+
// Fix: Remove unused imports
|
|
508
|
+
if (issue.fixData?.importName) {
|
|
509
|
+
const lineIdx = issue.line - 1;
|
|
510
|
+
const currentLine = lines[lineIdx];
|
|
511
|
+
if (currentLine) {
|
|
512
|
+
const importName = issue.fixData.importName;
|
|
513
|
+
const originalName = issue.fixData.originalName || importName;
|
|
514
|
+
// Check if it's a named import
|
|
515
|
+
const namedImportMatch = currentLine.match(/^import\s*\{([^}]+)\}\s*from\s/);
|
|
516
|
+
if (namedImportMatch) {
|
|
517
|
+
const imports = namedImportMatch[1].split(',').map(s => s.trim());
|
|
518
|
+
if (imports.length === 1) {
|
|
519
|
+
// Only import - remove the entire line
|
|
520
|
+
lines.splice(lineIdx, 1);
|
|
521
|
+
modified = true;
|
|
522
|
+
fixedCount++;
|
|
523
|
+
console.log(chalk_1.default.green(` Fixed: Removed unused import "${importName}" from ${file}:${issue.line}`));
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
// Multiple imports - remove just this one
|
|
527
|
+
const aliasPattern = originalName !== importName
|
|
528
|
+
? `${originalName}\\s+as\\s+${importName}`
|
|
529
|
+
: importName;
|
|
530
|
+
// Remove the import with possible trailing/leading comma
|
|
531
|
+
let newImports = namedImportMatch[1];
|
|
532
|
+
const patterns = [
|
|
533
|
+
new RegExp(`\\s*${escapeRegex(aliasPattern)}\\s*,`),
|
|
534
|
+
new RegExp(`,\\s*${escapeRegex(aliasPattern)}\\s*`),
|
|
535
|
+
new RegExp(`\\s*${escapeRegex(aliasPattern)}\\s*`),
|
|
536
|
+
];
|
|
537
|
+
for (const p of patterns) {
|
|
538
|
+
if (p.test(newImports)) {
|
|
539
|
+
newImports = newImports.replace(p, '');
|
|
540
|
+
break;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
lines[lineIdx] = currentLine.replace(namedImportMatch[1], ` ${newImports.trim()} `);
|
|
544
|
+
modified = true;
|
|
545
|
+
fixedCount++;
|
|
546
|
+
console.log(chalk_1.default.green(` Fixed: Removed unused import "${importName}" from ${file}:${issue.line}`));
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
// Check if it's a default import
|
|
550
|
+
const defaultImportMatch = currentLine.match(/^import\s+([A-Za-z_$][\w$]*)\s+from\s/);
|
|
551
|
+
if (defaultImportMatch && defaultImportMatch[1] === importName) {
|
|
552
|
+
lines.splice(lineIdx, 1);
|
|
553
|
+
modified = true;
|
|
554
|
+
fixedCount++;
|
|
555
|
+
console.log(chalk_1.default.green(` Fixed: Removed unused import "${importName}" from ${file}:${issue.line}`));
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
break;
|
|
560
|
+
}
|
|
561
|
+
case 'large-component': {
|
|
562
|
+
// Suggest only - don't auto-split
|
|
563
|
+
console.log(chalk_1.default.yellow(` Manual fix needed: ${issue.description}`));
|
|
564
|
+
console.log(chalk_1.default.gray(` Suggestion: ${issue.suggestion}`));
|
|
565
|
+
break;
|
|
566
|
+
}
|
|
567
|
+
case 'inefficient-render': {
|
|
568
|
+
// Suggest only
|
|
569
|
+
console.log(chalk_1.default.yellow(` Manual fix recommended for ${file}:${issue.line}`));
|
|
570
|
+
console.log(chalk_1.default.gray(` ${issue.suggestion}`));
|
|
571
|
+
break;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
if (modified) {
|
|
576
|
+
await fs.writeFile(filePath, lines.join('\n'), 'utf-8');
|
|
577
|
+
console.log(chalk_1.default.green(` Saved: ${file}`));
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
catch (error) {
|
|
581
|
+
console.log(chalk_1.default.red(` Error processing ${file}: ${error.message}`));
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
console.log(chalk_1.default.cyan(`\n Auto-fixed ${fixedCount} issues.`));
|
|
585
|
+
// Report manual fixes needed
|
|
586
|
+
const manualIssues = issues.filter(i => !i.autoFixable);
|
|
587
|
+
if (manualIssues.length > 0) {
|
|
588
|
+
console.log(chalk_1.default.yellow(` ${manualIssues.length} issues require manual attention.\n`));
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
//# sourceMappingURL=performance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../../src/commands/evolve/analyzers/performance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface SecurityIssue {
|
|
2
|
+
type: 'hardcoded-secret' | 'missing-auth' | 'no-rate-limiting' | 'no-input-validation';
|
|
3
|
+
file: string;
|
|
4
|
+
line: number;
|
|
5
|
+
description: string;
|
|
6
|
+
suggestion: string;
|
|
7
|
+
severity: 'low' | 'medium' | 'high' | 'critical';
|
|
8
|
+
}
|
|
9
|
+
export interface SecurityReport {
|
|
10
|
+
score: number;
|
|
11
|
+
issues: SecurityIssue[];
|
|
12
|
+
summary: {
|
|
13
|
+
critical: number;
|
|
14
|
+
high: number;
|
|
15
|
+
medium: number;
|
|
16
|
+
low: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare function analyzeSecurity(projectPath: string): Promise<SecurityReport>;
|
|
20
|
+
export declare function printSecurityReport(report: SecurityReport): void;
|
|
21
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../../src/commands/evolve/analyzers/security.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,kBAAkB,GAAG,cAAc,GAAG,kBAAkB,GAAG,qBAAqB,CAAC;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACpD;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACf,CAAC;CACL;AAuBD,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAkClF;AAwLD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAiChE"}
|