@empline/preflight 1.1.58 → 1.1.60
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/dist/checks/accessibility/accessibility-validation.d.ts.map +1 -1
- package/dist/checks/accessibility/accessibility-validation.js +131 -14
- package/dist/checks/accessibility/accessibility-validation.js.map +1 -1
- package/dist/checks/accessibility/wcag-advanced-validation.d.ts +10 -0
- package/dist/checks/accessibility/wcag-advanced-validation.d.ts.map +1 -0
- package/dist/checks/accessibility/wcag-advanced-validation.js +622 -0
- package/dist/checks/accessibility/wcag-advanced-validation.js.map +1 -0
- package/dist/checks/business/auto-approval-system-validation.d.ts +25 -0
- package/dist/checks/business/auto-approval-system-validation.d.ts.map +1 -0
- package/dist/checks/business/auto-approval-system-validation.js +458 -0
- package/dist/checks/business/auto-approval-system-validation.js.map +1 -0
- package/dist/checks/business/listing-submission-flow-validation.d.ts +21 -0
- package/dist/checks/business/listing-submission-flow-validation.d.ts.map +1 -0
- package/dist/checks/business/listing-submission-flow-validation.js +394 -0
- package/dist/checks/business/listing-submission-flow-validation.js.map +1 -0
- package/dist/checks/business/multi-user-sync-validation.d.ts +21 -0
- package/dist/checks/business/multi-user-sync-validation.d.ts.map +1 -0
- package/dist/checks/business/multi-user-sync-validation.js +383 -0
- package/dist/checks/business/multi-user-sync-validation.js.map +1 -0
- package/dist/checks/consolidated/ui-spacing-standards.js +59 -0
- package/dist/checks/consolidated/ui-spacing-standards.js.map +1 -1
- package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts +38 -0
- package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/catalog-image-protection-validation.js +368 -0
- package/dist/checks/data-integrity/catalog-image-protection-validation.js.map +1 -0
- package/dist/checks/data-integrity/image-url-validation.d.ts +22 -0
- package/dist/checks/data-integrity/image-url-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/image-url-validation.js +310 -0
- package/dist/checks/data-integrity/image-url-validation.js.map +1 -0
- package/dist/checks/database/query-performance-validation.d.ts +10 -0
- package/dist/checks/database/query-performance-validation.d.ts.map +1 -0
- package/dist/checks/database/query-performance-validation.js +544 -0
- package/dist/checks/database/query-performance-validation.js.map +1 -0
- package/dist/checks/performance/async-batch-concurrency.d.ts +10 -0
- package/dist/checks/performance/async-batch-concurrency.d.ts.map +1 -0
- package/dist/checks/performance/async-batch-concurrency.js +352 -0
- package/dist/checks/performance/async-batch-concurrency.js.map +1 -0
- package/dist/checks/react/react-patterns-validation.d.ts +10 -0
- package/dist/checks/react/react-patterns-validation.d.ts.map +1 -0
- package/dist/checks/react/react-patterns-validation.js +559 -0
- package/dist/checks/react/react-patterns-validation.js.map +1 -0
- package/dist/checks/security/deprecated-node-apis-validation.d.ts +31 -0
- package/dist/checks/security/deprecated-node-apis-validation.d.ts.map +1 -0
- package/dist/checks/security/deprecated-node-apis-validation.js +324 -0
- package/dist/checks/security/deprecated-node-apis-validation.js.map +1 -0
- package/dist/checks/security/security-headers-validation.d.ts +10 -0
- package/dist/checks/security/security-headers-validation.d.ts.map +1 -0
- package/dist/checks/security/security-headers-validation.js +594 -0
- package/dist/checks/security/security-headers-validation.js.map +1 -0
- package/dist/reporters/github-reporter.d.ts +35 -0
- package/dist/reporters/github-reporter.d.ts.map +1 -0
- package/dist/reporters/github-reporter.js +397 -0
- package/dist/reporters/github-reporter.js.map +1 -0
- package/dist/reporters/html-report.d.ts +12 -0
- package/dist/reporters/html-report.d.ts.map +1 -0
- package/dist/reporters/html-report.js +469 -0
- package/dist/reporters/html-report.js.map +1 -0
- package/dist/reporters/index.d.ts +8 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +18 -0
- package/dist/reporters/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
|
|
38
|
+
exports.run = run;
|
|
39
|
+
/**
|
|
40
|
+
* Async Batch Concurrency Preflight
|
|
41
|
+
*
|
|
42
|
+
* Detects unbounded parallel async operations that can cause rate limiting (429 errors)
|
|
43
|
+
* or overwhelm external services. This check ensures batch operations use proper
|
|
44
|
+
* concurrency controls.
|
|
45
|
+
*
|
|
46
|
+
* Problematic patterns:
|
|
47
|
+
* ```tsx
|
|
48
|
+
* // All uploads fire at once - causes 429 errors
|
|
49
|
+
* const results = await Promise.all(files.map(f => uploadFile(f)));
|
|
50
|
+
*
|
|
51
|
+
* // Unbounded parallel API calls
|
|
52
|
+
* await Promise.all(items.map(async (item) => fetch(`/api/${item.id}`)));
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* Better patterns:
|
|
56
|
+
* ```tsx
|
|
57
|
+
* // Controlled concurrency (3 at a time)
|
|
58
|
+
* const results = await runWithConcurrency(
|
|
59
|
+
* files.map(f => () => uploadFile(f)),
|
|
60
|
+
* 3
|
|
61
|
+
* );
|
|
62
|
+
*
|
|
63
|
+
* // Or use p-limit, async-sema, etc.
|
|
64
|
+
* const limit = pLimit(3);
|
|
65
|
+
* const results = await Promise.all(files.map(f => limit(() => uploadFile(f))));
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
const fs = __importStar(require("node:fs"));
|
|
69
|
+
const path = __importStar(require("node:path"));
|
|
70
|
+
const glob_1 = require("glob");
|
|
71
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
72
|
+
// METADATA - Required for plugin loader discovery
|
|
73
|
+
exports.id = "performance/async-batch-concurrency";
|
|
74
|
+
exports.name = "Async Batch Concurrency";
|
|
75
|
+
exports.description = "Detects unbounded parallel async operations that can cause rate limiting";
|
|
76
|
+
exports.category = "performance";
|
|
77
|
+
exports.blocking = false; // Advisory - many existing cases, gradual migration
|
|
78
|
+
exports.tags = ["performance", "async", "rate-limiting", "concurrency", "batch"];
|
|
79
|
+
/**
|
|
80
|
+
* File patterns to check
|
|
81
|
+
*/
|
|
82
|
+
const FILE_PATTERNS = [
|
|
83
|
+
"app/**/*.ts",
|
|
84
|
+
"app/**/*.tsx",
|
|
85
|
+
"lib/**/*.ts",
|
|
86
|
+
"hooks/**/*.ts",
|
|
87
|
+
"components/**/*.tsx",
|
|
88
|
+
];
|
|
89
|
+
/**
|
|
90
|
+
* Files/directories to exclude
|
|
91
|
+
*/
|
|
92
|
+
const EXCLUDE_PATTERNS = [
|
|
93
|
+
"node_modules/**",
|
|
94
|
+
"**/*.test.ts",
|
|
95
|
+
"**/*.test.tsx",
|
|
96
|
+
"**/*.spec.ts",
|
|
97
|
+
"**/*.spec.tsx",
|
|
98
|
+
"**/*.stories.tsx",
|
|
99
|
+
".storybook/**",
|
|
100
|
+
"**/utils/async.ts", // The utility file itself
|
|
101
|
+
"**/__tests__/**",
|
|
102
|
+
];
|
|
103
|
+
/**
|
|
104
|
+
* Keywords that suggest network/IO operations (higher risk for rate limiting)
|
|
105
|
+
*/
|
|
106
|
+
const HIGH_RISK_KEYWORDS = [
|
|
107
|
+
"fetch",
|
|
108
|
+
"upload",
|
|
109
|
+
"download",
|
|
110
|
+
"api",
|
|
111
|
+
"request",
|
|
112
|
+
"http",
|
|
113
|
+
"post",
|
|
114
|
+
"put",
|
|
115
|
+
"delete",
|
|
116
|
+
"patch",
|
|
117
|
+
"send",
|
|
118
|
+
"r2",
|
|
119
|
+
"s3",
|
|
120
|
+
"storage",
|
|
121
|
+
"database",
|
|
122
|
+
"prisma",
|
|
123
|
+
"db",
|
|
124
|
+
];
|
|
125
|
+
/**
|
|
126
|
+
* Extract line number from content and position
|
|
127
|
+
*/
|
|
128
|
+
function getLineNumber(content, position) {
|
|
129
|
+
return content.substring(0, position).split("\n").length;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check if code contains high-risk keywords
|
|
133
|
+
*/
|
|
134
|
+
function assessRiskLevel(code) {
|
|
135
|
+
const lowerCode = code.toLowerCase();
|
|
136
|
+
const hasHighRiskKeyword = HIGH_RISK_KEYWORDS.some((kw) => lowerCode.includes(kw));
|
|
137
|
+
if (hasHighRiskKeyword) {
|
|
138
|
+
return "high";
|
|
139
|
+
}
|
|
140
|
+
// Check for array iteration keywords
|
|
141
|
+
if (lowerCode.includes(".map") || lowerCode.includes(".foreach")) {
|
|
142
|
+
return "medium";
|
|
143
|
+
}
|
|
144
|
+
return "low";
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Detect unbounded Promise.all patterns
|
|
148
|
+
*/
|
|
149
|
+
function detectUnboundedPromiseAll(content, filePath) {
|
|
150
|
+
const patterns = [];
|
|
151
|
+
// Pattern 1: Promise.all(items.map(async ...))
|
|
152
|
+
const promiseAllMapAsyncRegex = /Promise\.all\s*\(\s*[\w.]+\.map\s*\(\s*async\s*/g;
|
|
153
|
+
let match;
|
|
154
|
+
while ((match = promiseAllMapAsyncRegex.exec(content)) !== null) {
|
|
155
|
+
const lineNum = getLineNumber(content, match.index);
|
|
156
|
+
const lineStart = content.lastIndexOf("\n", match.index) + 1;
|
|
157
|
+
const lineEnd = content.indexOf("\n", match.index);
|
|
158
|
+
const codeLine = content.substring(lineStart, lineEnd > 0 ? lineEnd : undefined).trim();
|
|
159
|
+
// Check if this line or nearby has concurrency control
|
|
160
|
+
const contextStart = Math.max(0, match.index - 200);
|
|
161
|
+
const contextEnd = Math.min(content.length, match.index + 300);
|
|
162
|
+
const context = content.substring(contextStart, contextEnd);
|
|
163
|
+
// Skip if already using concurrency control
|
|
164
|
+
if (context.includes("runWithConcurrency") ||
|
|
165
|
+
context.includes("pLimit") ||
|
|
166
|
+
context.includes("Semaphore") ||
|
|
167
|
+
context.includes("asyncPool") ||
|
|
168
|
+
context.includes("BATCH_SIZE") ||
|
|
169
|
+
context.includes("concurrency") ||
|
|
170
|
+
context.includes("preflight-ignore")) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
patterns.push({
|
|
174
|
+
file: filePath,
|
|
175
|
+
line: lineNum,
|
|
176
|
+
pattern: "Promise.all with .map(async)",
|
|
177
|
+
code: codeLine.substring(0, 100),
|
|
178
|
+
riskLevel: assessRiskLevel(codeLine + context),
|
|
179
|
+
suggestion: "Use runWithConcurrency() or batch processing to limit parallel operations",
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// Pattern 2: Promise.all(items.map(() => fetch/upload/etc))
|
|
183
|
+
const promiseAllMapFetchRegex = /Promise\.all\s*\(\s*[\w.]+\.map\s*\([^)]*(?:fetch|upload|api|request)/gi;
|
|
184
|
+
while ((match = promiseAllMapFetchRegex.exec(content)) !== null) {
|
|
185
|
+
const lineNum = getLineNumber(content, match.index);
|
|
186
|
+
const lineStart = content.lastIndexOf("\n", match.index) + 1;
|
|
187
|
+
const lineEnd = content.indexOf("\n", match.index);
|
|
188
|
+
const codeLine = content.substring(lineStart, lineEnd > 0 ? lineEnd : undefined).trim();
|
|
189
|
+
const contextStart = Math.max(0, match.index - 200);
|
|
190
|
+
const contextEnd = Math.min(content.length, match.index + 300);
|
|
191
|
+
const context = content.substring(contextStart, contextEnd);
|
|
192
|
+
if (context.includes("runWithConcurrency") ||
|
|
193
|
+
context.includes("pLimit") ||
|
|
194
|
+
context.includes("BATCH_SIZE") ||
|
|
195
|
+
context.includes("preflight-ignore")) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
// Avoid duplicates
|
|
199
|
+
if (patterns.some((p) => p.file === filePath && p.line === lineNum)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
patterns.push({
|
|
203
|
+
file: filePath,
|
|
204
|
+
line: lineNum,
|
|
205
|
+
pattern: "Promise.all with network operation",
|
|
206
|
+
code: codeLine.substring(0, 100),
|
|
207
|
+
riskLevel: "high",
|
|
208
|
+
suggestion: "Network operations should use concurrency limits to avoid rate limiting (429 errors)",
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
// Pattern 3: Standalone .map(async ...) without await wrapper (fire-and-forget)
|
|
212
|
+
const mapAsyncNoAwaitRegex = /(?<!await\s+Promise\.all\s*\(\s*)[\w.]+\.map\s*\(\s*async\s+/g;
|
|
213
|
+
while ((match = mapAsyncNoAwaitRegex.exec(content)) !== null) {
|
|
214
|
+
const lineNum = getLineNumber(content, match.index);
|
|
215
|
+
const lineStart = content.lastIndexOf("\n", match.index) + 1;
|
|
216
|
+
const lineEnd = content.indexOf("\n", match.index);
|
|
217
|
+
const codeLine = content.substring(lineStart, lineEnd > 0 ? lineEnd : undefined).trim();
|
|
218
|
+
// Check for await on the same/previous line
|
|
219
|
+
const prevLineStart = content.lastIndexOf("\n", lineStart - 2) + 1;
|
|
220
|
+
const prevContext = content.substring(prevLineStart, match.index);
|
|
221
|
+
if (prevContext.includes("await") ||
|
|
222
|
+
prevContext.includes("Promise.all") ||
|
|
223
|
+
codeLine.includes("preflight-ignore")) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
// Avoid duplicates
|
|
227
|
+
if (patterns.some((p) => p.file === filePath && p.line === lineNum)) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
patterns.push({
|
|
231
|
+
file: filePath,
|
|
232
|
+
line: lineNum,
|
|
233
|
+
pattern: ".map(async) without await",
|
|
234
|
+
code: codeLine.substring(0, 100),
|
|
235
|
+
riskLevel: assessRiskLevel(codeLine),
|
|
236
|
+
suggestion: "Async map without await may cause unhandled promises. Use Promise.all() or runWithConcurrency()",
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
return patterns;
|
|
240
|
+
}
|
|
241
|
+
async function run() {
|
|
242
|
+
const startTime = Date.now();
|
|
243
|
+
const findings = [];
|
|
244
|
+
const allPatterns = [];
|
|
245
|
+
// Find all files
|
|
246
|
+
const allFiles = [];
|
|
247
|
+
for (const pattern of FILE_PATTERNS) {
|
|
248
|
+
const matches = await (0, glob_1.glob)(pattern, {
|
|
249
|
+
cwd: process.cwd(),
|
|
250
|
+
ignore: EXCLUDE_PATTERNS,
|
|
251
|
+
});
|
|
252
|
+
allFiles.push(...matches);
|
|
253
|
+
}
|
|
254
|
+
const uniqueFiles = [...new Set(allFiles)];
|
|
255
|
+
for (const relativePath of uniqueFiles) {
|
|
256
|
+
const filePath = path.join(process.cwd(), relativePath);
|
|
257
|
+
if (!fs.existsSync(filePath))
|
|
258
|
+
continue;
|
|
259
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
260
|
+
// Check for file-level ignore
|
|
261
|
+
if (/preflight-ignore.*async-batch/.test(content)) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const patterns = detectUnboundedPromiseAll(content, relativePath);
|
|
265
|
+
allPatterns.push(...patterns);
|
|
266
|
+
for (const pattern of patterns) {
|
|
267
|
+
findings.push({
|
|
268
|
+
level: pattern.riskLevel === "high" ? "warning" : "info",
|
|
269
|
+
message: `${pattern.pattern}: ${pattern.code}`,
|
|
270
|
+
file: pattern.file,
|
|
271
|
+
startLine: pattern.line,
|
|
272
|
+
ruleId: "async-batch-concurrency",
|
|
273
|
+
suggestion: pattern.suggestion,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const highRiskCount = allPatterns.filter((p) => p.riskLevel === "high").length;
|
|
278
|
+
const mediumRiskCount = allPatterns.filter((p) => p.riskLevel === "medium").length;
|
|
279
|
+
return {
|
|
280
|
+
passed: true, // Advisory check
|
|
281
|
+
findings,
|
|
282
|
+
duration: Date.now() - startTime,
|
|
283
|
+
metadata: {
|
|
284
|
+
filesScanned: uniqueFiles.length,
|
|
285
|
+
totalPatterns: allPatterns.length,
|
|
286
|
+
highRiskCount,
|
|
287
|
+
mediumRiskCount,
|
|
288
|
+
lowRiskCount: allPatterns.length - highRiskCount - mediumRiskCount,
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
async function main() {
|
|
293
|
+
console.log(`\n${console_chars_1.emoji.lightning} ASYNC BATCH CONCURRENCY CHECK`);
|
|
294
|
+
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
295
|
+
const result = await run();
|
|
296
|
+
const metadata = result.metadata || {};
|
|
297
|
+
const filesScanned = metadata.filesScanned;
|
|
298
|
+
const totalPatterns = metadata.totalPatterns;
|
|
299
|
+
const highRiskCount = metadata.highRiskCount;
|
|
300
|
+
const mediumRiskCount = metadata.mediumRiskCount;
|
|
301
|
+
console.log(`\n${console_chars_1.emoji.search} Scanned ${filesScanned} files for unbounded async patterns...`);
|
|
302
|
+
if (totalPatterns === 0) {
|
|
303
|
+
console.log(`\n${console_chars_1.emoji.success} No unbounded async patterns detected!`);
|
|
304
|
+
console.log(` All batch operations appear to have proper concurrency controls.`);
|
|
305
|
+
process.exit(0);
|
|
306
|
+
}
|
|
307
|
+
// Summary
|
|
308
|
+
console.log(`\n${console_chars_1.emoji.chart} Async Pattern Statistics:`);
|
|
309
|
+
console.log(` Total patterns found: ${totalPatterns}`);
|
|
310
|
+
console.log(` High risk (network ops): ${highRiskCount}`);
|
|
311
|
+
console.log(` Medium risk (batch ops): ${mediumRiskCount}`);
|
|
312
|
+
console.log(` Low risk (other): ${totalPatterns - highRiskCount - mediumRiskCount}`);
|
|
313
|
+
// Show high-risk findings
|
|
314
|
+
if (highRiskCount > 0) {
|
|
315
|
+
console.log(`\n${console_chars_1.emoji.warning} High-risk patterns (may cause 429 rate limiting):`);
|
|
316
|
+
const highRiskFindings = result.findings.filter((f) => f.level === "warning");
|
|
317
|
+
for (const finding of highRiskFindings.slice(0, 10)) {
|
|
318
|
+
console.log(`\n ${finding.file}:${finding.startLine}`);
|
|
319
|
+
console.log(` ${finding.message}`);
|
|
320
|
+
console.log(` ${console_chars_1.emoji.info} ${finding.suggestion}`);
|
|
321
|
+
}
|
|
322
|
+
if (highRiskFindings.length > 10) {
|
|
323
|
+
console.log(`\n ... and ${highRiskFindings.length - 10} more high-risk patterns`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Solution guide
|
|
327
|
+
console.log(`\n${console_chars_1.emoji.lightbulb} How to fix:`);
|
|
328
|
+
console.log(` 1. Import the utility:`);
|
|
329
|
+
console.log(` import { runWithConcurrency } from "@/lib/utils";`);
|
|
330
|
+
console.log(``);
|
|
331
|
+
console.log(` 2. Wrap your async operations:`);
|
|
332
|
+
console.log(` // Before (unbounded - causes 429 errors):`);
|
|
333
|
+
console.log(` await Promise.all(items.map(async (item) => upload(item)));`);
|
|
334
|
+
console.log(``);
|
|
335
|
+
console.log(` // After (controlled - 3 concurrent max):`);
|
|
336
|
+
console.log(` await runWithConcurrency(`);
|
|
337
|
+
console.log(` items.map((item) => () => upload(item)),`);
|
|
338
|
+
console.log(` 3 // max concurrent`);
|
|
339
|
+
console.log(` );`);
|
|
340
|
+
console.log(``);
|
|
341
|
+
console.log(` 3. Or use UPLOAD_LIMITS.MAX_CONCURRENT_UPLOADS from @/lib/constants/limits`);
|
|
342
|
+
console.log(`\n${console_chars_1.emoji.success} ASYNC BATCH CONCURRENCY CHECK COMPLETED (advisory)`);
|
|
343
|
+
console.log(` Consider fixing high-risk patterns to prevent rate limiting issues.`);
|
|
344
|
+
process.exit(0);
|
|
345
|
+
}
|
|
346
|
+
if (require.main === module) {
|
|
347
|
+
main().catch((err) => {
|
|
348
|
+
console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
|
|
349
|
+
process.exit(1);
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=async-batch-concurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-batch-concurrency.js","sourceRoot":"","sources":["../../../src/checks/performance/async-batch-concurrency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { PreflightCheckResult } from "../../core/types";
|
|
3
|
+
export declare const id = "react/react-patterns-validation";
|
|
4
|
+
export declare const name = "React Patterns Validation";
|
|
5
|
+
export declare const description = "Validates React patterns, hooks, Server Components, and performance best practices";
|
|
6
|
+
export declare const category = "react";
|
|
7
|
+
export declare const blocking = true;
|
|
8
|
+
export declare const tags: string[];
|
|
9
|
+
export declare function run(): Promise<PreflightCheckResult>;
|
|
10
|
+
//# sourceMappingURL=react-patterns-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-patterns-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/react/react-patterns-validation.ts"],"names":[],"mappings":";AAmCA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAG1E,eAAO,MAAM,EAAE,oCAAoC,CAAC;AACpD,eAAO,MAAM,IAAI,8BAA8B,CAAC;AAChD,eAAO,MAAM,WAAW,uFAAuF,CAAC;AAChH,eAAO,MAAM,QAAQ,UAAU,CAAC;AAChC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAqE,CAAC;AAkcvF,wBAAsB,GAAG,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAoCzD"}
|