@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.
Files changed (62) hide show
  1. package/dist/checks/accessibility/accessibility-validation.d.ts.map +1 -1
  2. package/dist/checks/accessibility/accessibility-validation.js +131 -14
  3. package/dist/checks/accessibility/accessibility-validation.js.map +1 -1
  4. package/dist/checks/accessibility/wcag-advanced-validation.d.ts +10 -0
  5. package/dist/checks/accessibility/wcag-advanced-validation.d.ts.map +1 -0
  6. package/dist/checks/accessibility/wcag-advanced-validation.js +622 -0
  7. package/dist/checks/accessibility/wcag-advanced-validation.js.map +1 -0
  8. package/dist/checks/business/auto-approval-system-validation.d.ts +25 -0
  9. package/dist/checks/business/auto-approval-system-validation.d.ts.map +1 -0
  10. package/dist/checks/business/auto-approval-system-validation.js +458 -0
  11. package/dist/checks/business/auto-approval-system-validation.js.map +1 -0
  12. package/dist/checks/business/listing-submission-flow-validation.d.ts +21 -0
  13. package/dist/checks/business/listing-submission-flow-validation.d.ts.map +1 -0
  14. package/dist/checks/business/listing-submission-flow-validation.js +394 -0
  15. package/dist/checks/business/listing-submission-flow-validation.js.map +1 -0
  16. package/dist/checks/business/multi-user-sync-validation.d.ts +21 -0
  17. package/dist/checks/business/multi-user-sync-validation.d.ts.map +1 -0
  18. package/dist/checks/business/multi-user-sync-validation.js +383 -0
  19. package/dist/checks/business/multi-user-sync-validation.js.map +1 -0
  20. package/dist/checks/consolidated/ui-spacing-standards.js +59 -0
  21. package/dist/checks/consolidated/ui-spacing-standards.js.map +1 -1
  22. package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts +38 -0
  23. package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts.map +1 -0
  24. package/dist/checks/data-integrity/catalog-image-protection-validation.js +368 -0
  25. package/dist/checks/data-integrity/catalog-image-protection-validation.js.map +1 -0
  26. package/dist/checks/data-integrity/image-url-validation.d.ts +22 -0
  27. package/dist/checks/data-integrity/image-url-validation.d.ts.map +1 -0
  28. package/dist/checks/data-integrity/image-url-validation.js +310 -0
  29. package/dist/checks/data-integrity/image-url-validation.js.map +1 -0
  30. package/dist/checks/database/query-performance-validation.d.ts +10 -0
  31. package/dist/checks/database/query-performance-validation.d.ts.map +1 -0
  32. package/dist/checks/database/query-performance-validation.js +544 -0
  33. package/dist/checks/database/query-performance-validation.js.map +1 -0
  34. package/dist/checks/performance/async-batch-concurrency.d.ts +10 -0
  35. package/dist/checks/performance/async-batch-concurrency.d.ts.map +1 -0
  36. package/dist/checks/performance/async-batch-concurrency.js +352 -0
  37. package/dist/checks/performance/async-batch-concurrency.js.map +1 -0
  38. package/dist/checks/react/react-patterns-validation.d.ts +10 -0
  39. package/dist/checks/react/react-patterns-validation.d.ts.map +1 -0
  40. package/dist/checks/react/react-patterns-validation.js +559 -0
  41. package/dist/checks/react/react-patterns-validation.js.map +1 -0
  42. package/dist/checks/security/deprecated-node-apis-validation.d.ts +31 -0
  43. package/dist/checks/security/deprecated-node-apis-validation.d.ts.map +1 -0
  44. package/dist/checks/security/deprecated-node-apis-validation.js +324 -0
  45. package/dist/checks/security/deprecated-node-apis-validation.js.map +1 -0
  46. package/dist/checks/security/security-headers-validation.d.ts +10 -0
  47. package/dist/checks/security/security-headers-validation.d.ts.map +1 -0
  48. package/dist/checks/security/security-headers-validation.js +594 -0
  49. package/dist/checks/security/security-headers-validation.js.map +1 -0
  50. package/dist/reporters/github-reporter.d.ts +35 -0
  51. package/dist/reporters/github-reporter.d.ts.map +1 -0
  52. package/dist/reporters/github-reporter.js +397 -0
  53. package/dist/reporters/github-reporter.js.map +1 -0
  54. package/dist/reporters/html-report.d.ts +12 -0
  55. package/dist/reporters/html-report.d.ts.map +1 -0
  56. package/dist/reporters/html-report.js +469 -0
  57. package/dist/reporters/html-report.js.map +1 -0
  58. package/dist/reporters/index.d.ts +8 -0
  59. package/dist/reporters/index.d.ts.map +1 -0
  60. package/dist/reporters/index.js +18 -0
  61. package/dist/reporters/index.js.map +1 -0
  62. package/package.json +1 -1
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ /**
4
+ * Image URL Validation Preflight
5
+ *
6
+ * Ensures that:
7
+ * 1. Listing APIs validate imageUrls are proper R2 URLs (not base64)
8
+ * 2. R2 storage utilities include base64 detection helpers
9
+ * 3. Frontend upload flows prefer cloud uploads over base64 fallbacks
10
+ * 4. No listings in database contain base64 imageUrls (data integrity)
11
+ *
12
+ * This prevents the issue where base64 image data gets stored in listings,
13
+ * causing image approval to fail since moveApprovedListingImages expects R2 URLs.
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
50
+ exports.run = main;
51
+ const fs = __importStar(require("node:fs"));
52
+ const path = __importStar(require("node:path"));
53
+ const console_chars_1 = require("../../utils/console-chars");
54
+ const universal_progress_reporter_1 = require("../system/universal-progress-reporter");
55
+ // PREFLIGHT METADATA
56
+ exports.id = "data/image-url-validation";
57
+ exports.name = "Image URL Validation";
58
+ exports.description = "Validates that imageUrls in listings are proper R2 URLs, not base64 data. Prevents image approval failures.";
59
+ exports.category = "data";
60
+ exports.blocking = true;
61
+ exports.tags = ["data", "images", "r2", "base64", "listings", "upload", "validation"];
62
+ const results = [];
63
+ const TRADING_CARD_SYSTEM_PATH = path.resolve(__dirname, "../../../../trading-card-system");
64
+ function addResult(result) {
65
+ results.push(result);
66
+ const icon = result.passed ? console_chars_1.emoji.success : (result.severity === "warning" ? console_chars_1.emoji.warning : console_chars_1.emoji.error);
67
+ const location = result.file ? ` (${result.file}${result.line ? `:${result.line}` : ""})` : "";
68
+ console.log(` ${icon} ${result.message}${location}`);
69
+ }
70
+ function fileExists(filePath) {
71
+ const fullPath = path.join(TRADING_CARD_SYSTEM_PATH, filePath);
72
+ return fs.existsSync(fullPath);
73
+ }
74
+ function fileContains(filePath, pattern) {
75
+ const fullPath = path.join(TRADING_CARD_SYSTEM_PATH, filePath);
76
+ if (!fs.existsSync(fullPath)) {
77
+ return { found: false };
78
+ }
79
+ const content = fs.readFileSync(fullPath, "utf8");
80
+ const lines = content.split("\n");
81
+ for (let i = 0; i < lines.length; i++) {
82
+ if (pattern.test(lines[i] || "")) {
83
+ return { found: true, line: i + 1, content: lines[i] };
84
+ }
85
+ }
86
+ // Check full content for multi-line patterns
87
+ if (pattern.test(content)) {
88
+ return { found: true, content: content.slice(0, 200) };
89
+ }
90
+ return { found: false };
91
+ }
92
+ function getFileContent(filePath) {
93
+ const fullPath = path.join(TRADING_CARD_SYSTEM_PATH, filePath);
94
+ if (!fs.existsSync(fullPath)) {
95
+ return null;
96
+ }
97
+ return fs.readFileSync(fullPath, "utf8");
98
+ }
99
+ async function main() {
100
+ const reporter = (0, universal_progress_reporter_1.createUniversalProgressReporter)(exports.name);
101
+ console.log(`\n${console_chars_1.emoji.rocket} IMAGE URL VALIDATION PREFLIGHT`);
102
+ console.log((0, console_chars_1.createDivider)(60, "heavy"));
103
+ console.log(`${console_chars_1.emoji.info} Validating that imageUrls are proper R2 URLs...\n`);
104
+ // ---
105
+ // 1. R2 Storage Utilities - Base64 Detection Helpers
106
+ // ---
107
+ console.log(`${console_chars_1.emoji.folder} Checking R2 storage utilities...`);
108
+ const r2StoragePath = "lib/r2-storage.ts";
109
+ if (!fileExists(r2StoragePath)) {
110
+ addResult({
111
+ passed: false,
112
+ message: "Missing R2 storage utilities module",
113
+ file: r2StoragePath,
114
+ });
115
+ }
116
+ else {
117
+ addResult({
118
+ passed: true,
119
+ message: "R2 storage utilities module exists",
120
+ file: r2StoragePath,
121
+ });
122
+ // Check for base64 detection helpers
123
+ const requiredHelpers = [
124
+ { pattern: /isBase64ImageUrl/, name: "isBase64ImageUrl helper" },
125
+ { pattern: /isValidR2ImageUrl/, name: "isValidR2ImageUrl helper" },
126
+ { pattern: /uploadBase64ToR2/, name: "uploadBase64ToR2 helper" },
127
+ { pattern: /validateAndUploadImageUrls/, name: "validateAndUploadImageUrls helper" },
128
+ ];
129
+ for (const helper of requiredHelpers) {
130
+ const result = fileContains(r2StoragePath, helper.pattern);
131
+ addResult({
132
+ passed: result.found,
133
+ message: result.found ? `Has ${helper.name}` : `Missing ${helper.name}`,
134
+ file: r2StoragePath,
135
+ line: result.line,
136
+ });
137
+ }
138
+ }
139
+ // ---
140
+ // 2. Submit Single API - Image URL Validation
141
+ // ---
142
+ console.log(`\n${console_chars_1.emoji.folder} Checking submit-single API...`);
143
+ const submitSinglePath = "app/api/listings/submit-single/route.ts";
144
+ if (!fileExists(submitSinglePath)) {
145
+ addResult({
146
+ passed: false,
147
+ message: "Missing submit-single API route",
148
+ file: submitSinglePath,
149
+ });
150
+ }
151
+ else {
152
+ // Check for validateAndUploadImageUrls import
153
+ const hasImport = fileContains(submitSinglePath, /validateAndUploadImageUrls/);
154
+ addResult({
155
+ passed: hasImport.found,
156
+ message: hasImport.found
157
+ ? "Imports validateAndUploadImageUrls helper"
158
+ : "Missing validateAndUploadImageUrls import - base64 images may reach database",
159
+ file: submitSinglePath,
160
+ line: hasImport.line,
161
+ });
162
+ // Check for image validation before listing creation
163
+ const hasValidation = fileContains(submitSinglePath, /IMAGE URL VALIDATION/);
164
+ addResult({
165
+ passed: hasValidation.found,
166
+ message: hasValidation.found
167
+ ? "Has image URL validation section"
168
+ : "Missing image URL validation section",
169
+ file: submitSinglePath,
170
+ line: hasValidation.line,
171
+ });
172
+ }
173
+ // ---
174
+ // 3. Bulk Create API - Image URL Handling
175
+ // ---
176
+ console.log(`\n${console_chars_1.emoji.folder} Checking bulk-create API...`);
177
+ const bulkCreatePath = "app/api/listings/bulk-create/route.ts";
178
+ if (!fileExists(bulkCreatePath)) {
179
+ addResult({
180
+ passed: false,
181
+ message: "Missing bulk-create API route",
182
+ file: bulkCreatePath,
183
+ });
184
+ }
185
+ else {
186
+ // Check for base64 upload handling
187
+ const hasBase64Handling = fileContains(bulkCreatePath, /startsWith\("data:image\/"\)/);
188
+ addResult({
189
+ passed: hasBase64Handling.found,
190
+ message: hasBase64Handling.found
191
+ ? "Has base64 image detection"
192
+ : "Missing base64 image detection",
193
+ file: bulkCreatePath,
194
+ line: hasBase64Handling.line,
195
+ });
196
+ // Check for R2 upload in bulk create
197
+ const hasR2Upload = fileContains(bulkCreatePath, /PutObjectCommand|uploadToR2/);
198
+ addResult({
199
+ passed: hasR2Upload.found,
200
+ message: hasR2Upload.found
201
+ ? "Has R2 upload logic for base64 images"
202
+ : "Missing R2 upload logic - base64 images may reach database",
203
+ file: bulkCreatePath,
204
+ line: hasR2Upload.line,
205
+ });
206
+ }
207
+ // ---
208
+ // 4. Frontend - Image Operations
209
+ // ---
210
+ console.log(`\n${console_chars_1.emoji.folder} Checking frontend image operations...`);
211
+ const imageOpsPath = "lib/image-operations.ts";
212
+ if (!fileExists(imageOpsPath)) {
213
+ addResult({
214
+ passed: false,
215
+ message: "Missing image-operations.ts",
216
+ file: imageOpsPath,
217
+ });
218
+ }
219
+ else {
220
+ // Check for cloud upload preference
221
+ const hasCloudPreference = fileContains(imageOpsPath, /preferCloud.*=.*true/);
222
+ addResult({
223
+ passed: hasCloudPreference.found,
224
+ message: hasCloudPreference.found
225
+ ? "Cloud upload is preferred by default"
226
+ : "Cloud upload may not be preferred by default",
227
+ file: imageOpsPath,
228
+ line: hasCloudPreference.line,
229
+ severity: hasCloudPreference.found ? undefined : "warning",
230
+ });
231
+ // Check for base64 fallback warning
232
+ const hasFallbackWarning = fileContains(imageOpsPath, /Cloud upload failed.*falling back to base64/);
233
+ addResult({
234
+ passed: hasFallbackWarning.found,
235
+ message: hasFallbackWarning.found
236
+ ? "Has base64 fallback warning logging"
237
+ : "Missing base64 fallback warning - silent failures possible",
238
+ file: imageOpsPath,
239
+ line: hasFallbackWarning.line,
240
+ severity: hasFallbackWarning.found ? undefined : "warning",
241
+ });
242
+ }
243
+ // ---
244
+ // 5. Auto-Approval - Image Processing
245
+ // ---
246
+ console.log(`\n${console_chars_1.emoji.folder} Checking auto-approval image processing...`);
247
+ const autoApprovalPath = "lib/auto-approval.ts";
248
+ if (fileExists(autoApprovalPath)) {
249
+ // Check for moveApprovedListingImages usage
250
+ const hasImageProcessing = fileContains(autoApprovalPath, /moveApprovedListingImages/);
251
+ addResult({
252
+ passed: hasImageProcessing.found,
253
+ message: hasImageProcessing.found
254
+ ? "Auto-approval uses moveApprovedListingImages"
255
+ : "Auto-approval missing image processing",
256
+ file: autoApprovalPath,
257
+ line: hasImageProcessing.line,
258
+ });
259
+ }
260
+ // ---
261
+ // SUMMARY
262
+ // ---
263
+ console.log("\n" + (0, console_chars_1.createDivider)(60, "heavy"));
264
+ console.log(`${console_chars_1.emoji.chart} VALIDATION SUMMARY`);
265
+ console.log((0, console_chars_1.createDivider)(60, "heavy"));
266
+ const passed = results.filter((r) => r.passed).length;
267
+ const failed = results.filter((r) => !r.passed && r.severity !== "warning").length;
268
+ const warnings = results.filter((r) => !r.passed && r.severity === "warning").length;
269
+ const total = results.length;
270
+ console.log(`${console_chars_1.emoji.success} Passed: ${passed}/${total}`);
271
+ if (failed > 0) {
272
+ console.log(`${console_chars_1.emoji.error} Failed: ${failed}`);
273
+ }
274
+ if (warnings > 0) {
275
+ console.log(`${console_chars_1.emoji.warning} Warnings: ${warnings}`);
276
+ }
277
+ console.log((0, console_chars_1.createDivider)(60, "heavy"));
278
+ // Show summary
279
+ reporter.showSummary({
280
+ filesProcessed: total,
281
+ issuesFound: failed + warnings,
282
+ errors: failed,
283
+ warnings: warnings,
284
+ });
285
+ if (failed > 0) {
286
+ console.log(`\n${console_chars_1.emoji.error} IMAGE URL VALIDATION FAILED`);
287
+ console.log(`\n${console_chars_1.emoji.info} To fix:`);
288
+ console.log(` 1. Ensure lib/r2-storage.ts has base64 detection helpers`);
289
+ console.log(` 2. Ensure submit-single/route.ts validates imageUrls before storing`);
290
+ console.log(` 3. Ensure bulk-create/route.ts uploads base64 images to R2`);
291
+ console.log(` 4. Run: pnpm preflight:images to verify image processing pipeline`);
292
+ process.exit(1);
293
+ }
294
+ else if (warnings > 0) {
295
+ console.log(`\n${console_chars_1.emoji.warning} IMAGE URL VALIDATION PASSED WITH WARNINGS`);
296
+ process.exit(0);
297
+ }
298
+ else {
299
+ console.log(`\n${console_chars_1.emoji.success} IMAGE URL VALIDATION PASSED`);
300
+ process.exit(0);
301
+ }
302
+ }
303
+ // Run if called directly
304
+ if (require.main === module) {
305
+ main().catch((error) => {
306
+ console.error(`${console_chars_1.emoji.error} Fatal error:`, error);
307
+ process.exit(1);
308
+ });
309
+ }
310
+ //# sourceMappingURL=image-url-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-url-validation.js","sourceRoot":"","sources":["../../../src/checks/data-integrity/image-url-validation.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 = "database/query-performance-validation";
4
+ export declare const name = "Query Performance Validation";
5
+ export declare const description = "Validates database query patterns for N+1, missing indexes, and performance issues";
6
+ export declare const category = "database";
7
+ export declare const blocking = true;
8
+ export declare const tags: string[];
9
+ export declare function run(): Promise<PreflightCheckResult>;
10
+ //# sourceMappingURL=query-performance-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-performance-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/database/query-performance-validation.ts"],"names":[],"mappings":";AAgCA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAG1E,eAAO,MAAM,EAAE,0CAA0C,CAAC;AAC1D,eAAO,MAAM,IAAI,iCAAiC,CAAC;AACnD,eAAO,MAAM,WAAW,uFAAuF,CAAC;AAChH,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAqE,CAAC;AA8avF,wBAAsB,GAAG,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAoCzD"}