@empline/preflight 1.1.2 → 1.1.4

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 (79) hide show
  1. package/dist/bin/sync-check.js +6 -4
  2. package/dist/bin/sync-check.js.map +1 -1
  3. package/dist/checks/card-processing/dimension-variance-blocking.d.ts +8 -0
  4. package/dist/checks/card-processing/dimension-variance-blocking.d.ts.map +1 -0
  5. package/dist/checks/card-processing/dimension-variance-blocking.js +256 -0
  6. package/dist/checks/card-processing/dimension-variance-blocking.js.map +1 -0
  7. package/dist/checks/card-processing/edge-detection-integration.d.ts +8 -0
  8. package/dist/checks/card-processing/edge-detection-integration.d.ts.map +1 -0
  9. package/dist/checks/card-processing/edge-detection-integration.js +180 -0
  10. package/dist/checks/card-processing/edge-detection-integration.js.map +1 -0
  11. package/dist/checks/card-processing/front-back-detection-validation.d.ts +8 -0
  12. package/dist/checks/card-processing/front-back-detection-validation.d.ts.map +1 -0
  13. package/dist/checks/card-processing/front-back-detection-validation.js +83 -0
  14. package/dist/checks/card-processing/front-back-detection-validation.js.map +1 -0
  15. package/dist/checks/card-processing/image-deskew-system.d.ts +8 -0
  16. package/dist/checks/card-processing/image-deskew-system.d.ts.map +1 -0
  17. package/dist/checks/card-processing/image-deskew-system.js +62 -0
  18. package/dist/checks/card-processing/image-deskew-system.js.map +1 -0
  19. package/dist/checks/card-processing/image-filename-uniqueness.d.ts +8 -0
  20. package/dist/checks/card-processing/image-filename-uniqueness.d.ts.map +1 -0
  21. package/dist/checks/card-processing/image-filename-uniqueness.js +229 -0
  22. package/dist/checks/card-processing/image-filename-uniqueness.js.map +1 -0
  23. package/dist/checks/card-processing/image-processing-config-validation.d.ts +8 -0
  24. package/dist/checks/card-processing/image-processing-config-validation.d.ts.map +1 -0
  25. package/dist/checks/card-processing/image-processing-config-validation.js +440 -0
  26. package/dist/checks/card-processing/image-processing-config-validation.js.map +1 -0
  27. package/dist/checks/code-quality/price-formatting-consistency.d.ts +28 -0
  28. package/dist/checks/code-quality/price-formatting-consistency.d.ts.map +1 -0
  29. package/dist/checks/code-quality/price-formatting-consistency.js +230 -0
  30. package/dist/checks/code-quality/price-formatting-consistency.js.map +1 -0
  31. package/dist/checks/data/constants-validation.d.ts +19 -0
  32. package/dist/checks/data/constants-validation.d.ts.map +1 -0
  33. package/dist/checks/data/constants-validation.js +297 -0
  34. package/dist/checks/data/constants-validation.js.map +1 -0
  35. package/dist/checks/data/crockford-id-validation.d.ts +24 -0
  36. package/dist/checks/data/crockford-id-validation.d.ts.map +1 -0
  37. package/dist/checks/data/crockford-id-validation.js +227 -0
  38. package/dist/checks/data/crockford-id-validation.js.map +1 -0
  39. package/dist/checks/data/geographic-constants-validation.d.ts +16 -0
  40. package/dist/checks/data/geographic-constants-validation.d.ts.map +1 -0
  41. package/dist/checks/data/geographic-constants-validation.js +168 -0
  42. package/dist/checks/data/geographic-constants-validation.js.map +1 -0
  43. package/dist/checks/data/hardcoded-options-validation.d.ts +24 -0
  44. package/dist/checks/data/hardcoded-options-validation.d.ts.map +1 -0
  45. package/dist/checks/data/hardcoded-options-validation.js +362 -0
  46. package/dist/checks/data/hardcoded-options-validation.js.map +1 -0
  47. package/dist/checks/data/league-data-integrity-with-env.d.ts +14 -0
  48. package/dist/checks/data/league-data-integrity-with-env.d.ts.map +1 -0
  49. package/dist/checks/data/league-data-integrity-with-env.js +21 -0
  50. package/dist/checks/data/league-data-integrity-with-env.js.map +1 -0
  51. package/dist/checks/data/product-slug-architecture.d.ts +36 -0
  52. package/dist/checks/data/product-slug-architecture.d.ts.map +1 -0
  53. package/dist/checks/data/product-slug-architecture.js +167 -0
  54. package/dist/checks/data/product-slug-architecture.js.map +1 -0
  55. package/dist/checks/data/schema-fk-defaults-validation.d.ts +21 -0
  56. package/dist/checks/data/schema-fk-defaults-validation.d.ts.map +1 -0
  57. package/dist/checks/data/schema-fk-defaults-validation.js +168 -0
  58. package/dist/checks/data/schema-fk-defaults-validation.js.map +1 -0
  59. package/dist/checks/ui/admin-filter-patterns.d.ts +27 -0
  60. package/dist/checks/ui/admin-filter-patterns.d.ts.map +1 -0
  61. package/dist/checks/ui/admin-filter-patterns.js +225 -0
  62. package/dist/checks/ui/admin-filter-patterns.js.map +1 -0
  63. package/dist/checks/ui/form-field-variant-consistency.d.ts +28 -0
  64. package/dist/checks/ui/form-field-variant-consistency.d.ts.map +1 -0
  65. package/dist/checks/ui/form-field-variant-consistency.js +218 -0
  66. package/dist/checks/ui/form-field-variant-consistency.js.map +1 -0
  67. package/dist/checks/ui/integration-component-consolidation.d.ts +47 -0
  68. package/dist/checks/ui/integration-component-consolidation.d.ts.map +1 -0
  69. package/dist/checks/ui/integration-component-consolidation.js +383 -0
  70. package/dist/checks/ui/integration-component-consolidation.js.map +1 -0
  71. package/dist/checks/ui/notification-system-consistency.d.ts +42 -0
  72. package/dist/checks/ui/notification-system-consistency.d.ts.map +1 -0
  73. package/dist/checks/ui/notification-system-consistency.js +243 -0
  74. package/dist/checks/ui/notification-system-consistency.js.map +1 -0
  75. package/dist/utils/console-chars.d.ts +18 -10
  76. package/dist/utils/console-chars.d.ts.map +1 -1
  77. package/dist/utils/console-chars.js +19 -5
  78. package/dist/utils/console-chars.js.map +1 -1
  79. package/package.json +1 -1
@@ -0,0 +1,440 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
8
+ /**
9
+ * Image Processing Configuration Validation Preflight
10
+ *
11
+ * Validates that image processing configuration is consistent across the codebase
12
+ * and that all required components are properly integrated.
13
+ */
14
+ const fs_1 = __importDefault(require("fs"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const console_chars_1 = require("../../utils/console-chars");
17
+ const exclusions_1 = require("../../shared/exclusions");
18
+ // App-specific exclusions loaded from config
19
+ let appExclusions = [];
20
+ // METADATA - Required for plugin loader discovery
21
+ exports.id = "card-processing/image-processing-config-validation";
22
+ exports.name = "Image Processing Configuration Validation";
23
+ exports.description = "Validates image processing configuration consistency and integration";
24
+ exports.category = "card-processing";
25
+ exports.blocking = true;
26
+ exports.tags = ["card-processing", "images", "config", "variance", "edge-detection"];
27
+ /**
28
+ * Expected configuration values and their locations
29
+ */
30
+ const CONFIG_CHECKS = {
31
+ dimensionVarianceThreshold: {
32
+ // Constants are now in image-processing-constants.ts (client-safe)
33
+ // and re-exported from image-processing-config.ts (server-only)
34
+ file: "lib/image-processing-constants.ts",
35
+ pattern: /DIMENSION_VARIANCE_THRESHOLD\s*=\s*([\d.]+)/,
36
+ expectedRange: [0.01, 0.2], // 1% to 20%
37
+ description: "Dimension variance threshold for front/back matching",
38
+ },
39
+ defaultStoreSettings: {
40
+ file: "app/api/store/settings/image-processing/route.ts",
41
+ pattern: /dimensionVarianceThreshold:\s*(\d+)/,
42
+ expectedRange: [1, 20],
43
+ description: "Default store variance threshold (percentage)",
44
+ },
45
+ hookDefault: {
46
+ file: "hooks/useStoreImageSettings.ts",
47
+ pattern: /dimensionVarianceThreshold:\s*(\d+)/,
48
+ expectedRange: [1, 20],
49
+ description: "Hook default variance threshold (percentage)",
50
+ },
51
+ };
52
+ /**
53
+ * Required exports from key modules
54
+ */
55
+ const REQUIRED_EXPORTS = {
56
+ "lib/edge-detection-analyzer.ts": [
57
+ "analyzeEdgeDetection",
58
+ "EdgeAnalysisResult",
59
+ "EdgeReliability",
60
+ ],
61
+ // Constants are defined in image-processing-constants.ts and re-exported from image-processing-config.ts
62
+ "lib/image-processing-constants.ts": [
63
+ "DIMENSION_VARIANCE_THRESHOLD",
64
+ "getBorderRemovalOptions",
65
+ "BORDER_REMOVAL_CONFIG",
66
+ ],
67
+ "lib/audit/audit-logger.ts": [
68
+ "IMAGE_ISSUE_DETECTED",
69
+ "IMAGE_ISSUE_RESOLVED",
70
+ "IMAGE_BATCH_FIX",
71
+ ],
72
+ };
73
+ /**
74
+ * Border detection consistency checks
75
+ * Ensures false positive protection for cards with dark interiors
76
+ */
77
+ const BORDER_DETECTION_CHECKS = {
78
+ interiorBrightnessAnalysis: {
79
+ file: "lib/image-border-resolution.ts",
80
+ requiredPatterns: [
81
+ /analyzeInteriorBrightness/,
82
+ /avgBrightness/,
83
+ /darkPixelRatio/,
84
+ ],
85
+ description: "Interior brightness analysis to prevent false border detection on dark cards",
86
+ },
87
+ recognitionVarianceBlocking: {
88
+ file: "components/upload/recognition-result/index.tsx",
89
+ requiredPatterns: [
90
+ /dimensionVarianceFlag/,
91
+ /canApproveResult.*&&.*!dimensionVarianceFlag|!dimensionVarianceFlag.*&&.*canApproveResult/,
92
+ ],
93
+ description: "Recognition result blocks submission when variance exceeds threshold",
94
+ },
95
+ variancePropsInTypes: {
96
+ file: "components/upload/recognition-result/types.ts",
97
+ requiredPatterns: [
98
+ /dimensionVarianceFlag\?:\s*boolean/,
99
+ /variancePercent\?:\s*number/,
100
+ ],
101
+ description: "Recognition result props include variance fields",
102
+ },
103
+ };
104
+ /**
105
+ * Formula-based BorderEngine checks
106
+ * Ensures dynamic calculations instead of hardcoded "magic numbers"
107
+ */
108
+ const BORDER_ENGINE_FORMULA_CHECKS = {
109
+ formulaFramework: {
110
+ file: "lib/border-removal-engine.ts",
111
+ requiredPatterns: [
112
+ /export interface BorderEngineFormulas/,
113
+ /export interface ComputedFormulas/,
114
+ /export function createFormulaContext/,
115
+ /export function calculateFormulas/,
116
+ ],
117
+ description: "Formula framework exports for dynamic border detection",
118
+ },
119
+ formulaIntegration: {
120
+ file: "lib/border-removal-engine.ts",
121
+ requiredPatterns: [
122
+ /const formulaContext = createFormulaContext/,
123
+ /const formulas = calculateFormulas/,
124
+ /formulas\.numSamples|formulas\.cornerSampleSize|formulas\.thresholdBuffer/,
125
+ ],
126
+ description: "Formula context is created and used in detection",
127
+ },
128
+ noFrontBackHardcoding: {
129
+ file: "lib/border-removal-engine.ts",
130
+ // These patterns should NOT exist - front/back should use identical processing
131
+ forbiddenPatterns: [
132
+ /if\s*\(.*front.*\)\s*\{[^}]*threshold/i,
133
+ /if\s*\(.*back.*\)\s*\{[^}]*threshold/i,
134
+ /frontThreshold|backThreshold/i,
135
+ ],
136
+ description: "No front/back specific hardcoding in BorderEngine",
137
+ },
138
+ };
139
+ /**
140
+ * Border resolution colored edges handling checks
141
+ * Ensures cards with colored dark edges (vintage tan borders, Pokemon backs, etc.)
142
+ * still get scanner border removal with ultra-conservative threshold
143
+ */
144
+ const COLORED_EDGES_HANDLING_CHECKS = {
145
+ coloredEdgesStillProcessed: {
146
+ file: "lib/image-border-resolution.ts",
147
+ requiredPatterns: [
148
+ /hasColoredDarkEdges.*removeBlackBorders/s, // Colored edges should still call removeBlackBorders
149
+ /blackThreshold:\s*12/, // Ultra-conservative threshold for colored edge cases
150
+ /skipAdaptiveThreshold:\s*true/, // Don't adjust threshold higher
151
+ ],
152
+ description: "Colored edges still get scanner border removal with conservative threshold",
153
+ },
154
+ coloredEdgesHighConfidence: {
155
+ file: "lib/image-border-resolution.ts",
156
+ requiredPatterns: [
157
+ // Colored edges MUST require high confidence (0.70+) to prevent false positives
158
+ // Pokemon backs, dark swirl patterns, etc. trigger low-confidence (40-50%) detections
159
+ // Real scanner borders have high confidence (80%+) due to consistent pure black
160
+ /hasColoredDarkEdges[\s\S]*?minConfidence:\s*0\.7/,
161
+ ],
162
+ description: "Colored edges require high minConfidence (0.70+) to prevent false positives on TCG card backs",
163
+ },
164
+ noColoredEdgesSkip: {
165
+ file: "lib/image-border-resolution.ts",
166
+ // This pattern should NOT exist - we should never skip BorderEngine entirely for colored edges
167
+ forbiddenPatterns: [
168
+ /hasColoredDarkEdges.*Skipping BorderEngine/s,
169
+ ],
170
+ description: "BorderEngine is not skipped when colored edges detected",
171
+ },
172
+ };
173
+ /**
174
+ * Files that should import and use edge detection
175
+ */
176
+ const EDGE_DETECTION_CONSUMERS = [
177
+ "app/api/store/integrations/woocommerce/import/route.ts",
178
+ "app/api/admin/listings/batch-fix-images/route.ts",
179
+ "app/api/images/analyze-edge/route.ts",
180
+ ];
181
+ async function main() {
182
+ console.log(`\n${console_chars_1.emoji.ruler || "[RULER]"} IMAGE PROCESSING CONFIGURATION VALIDATION`);
183
+ console.log((0, console_chars_1.createDivider)(65, "heavy"));
184
+ // Load centralized exclusions
185
+ appExclusions = await (0, exclusions_1.getExclusions)(exports.id);
186
+ const issues = [];
187
+ const warnings = [];
188
+ const configValues = {};
189
+ // 1. Check configuration consistency
190
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking configuration values...`);
191
+ for (const [configName, config] of Object.entries(CONFIG_CHECKS)) {
192
+ const filePath = path_1.default.join(process.cwd(), config.file);
193
+ if (!fs_1.default.existsSync(filePath)) {
194
+ issues.push(`${config.file}: File not found (required for ${configName})`);
195
+ continue;
196
+ }
197
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
198
+ const match = content.match(config.pattern);
199
+ if (!match) {
200
+ issues.push(`${config.file}: Could not find ${configName} configuration`);
201
+ continue;
202
+ }
203
+ const value = parseFloat(match[1]);
204
+ configValues[configName] = value;
205
+ if (value < config.expectedRange[0] || value > config.expectedRange[1]) {
206
+ issues.push(`${config.file}: ${configName} value ${value} outside expected range [${config.expectedRange[0]}, ${config.expectedRange[1]}]`);
207
+ }
208
+ else {
209
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${configName}: ${value} (${config.description})`);
210
+ }
211
+ }
212
+ // Check that store defaults match hook defaults
213
+ if (configValues.defaultStoreSettings && configValues.hookDefault) {
214
+ if (configValues.defaultStoreSettings !== configValues.hookDefault) {
215
+ warnings.push(`Store default (${configValues.defaultStoreSettings}) != hook default (${configValues.hookDefault})`);
216
+ }
217
+ }
218
+ // 1b. Check border detection consistency
219
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking border detection consistency...`);
220
+ for (const [checkName, check] of Object.entries(BORDER_DETECTION_CHECKS)) {
221
+ const filePath = path_1.default.join(process.cwd(), check.file);
222
+ if (!fs_1.default.existsSync(filePath)) {
223
+ issues.push(`${check.file}: File not found (required for ${checkName})`);
224
+ continue;
225
+ }
226
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
227
+ let allPatternsFound = true;
228
+ for (const pattern of check.requiredPatterns || []) {
229
+ if (!pattern.test(content)) {
230
+ issues.push(`${check.file}: Missing pattern for ${checkName}: ${pattern.source}`);
231
+ allPatternsFound = false;
232
+ }
233
+ }
234
+ if (allPatternsFound) {
235
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${checkName}: ${check.description}`);
236
+ }
237
+ }
238
+ // 1c. Check BorderEngine formula framework
239
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking BorderEngine formula framework...`);
240
+ for (const [checkName, check] of Object.entries(BORDER_ENGINE_FORMULA_CHECKS)) {
241
+ const filePath = path_1.default.join(process.cwd(), check.file);
242
+ if (!fs_1.default.existsSync(filePath)) {
243
+ issues.push(`${check.file}: File not found (required for ${checkName})`);
244
+ continue;
245
+ }
246
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
247
+ // Handle forbidden patterns (should NOT exist)
248
+ if (check.forbiddenPatterns) {
249
+ let foundForbidden = false;
250
+ for (const pattern of check.forbiddenPatterns) {
251
+ if (pattern.test(content)) {
252
+ issues.push(`${check.file}: Found forbidden pattern for ${checkName}: ${pattern.source}`);
253
+ foundForbidden = true;
254
+ }
255
+ }
256
+ if (!foundForbidden) {
257
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${checkName}: ${check.description}`);
258
+ }
259
+ continue;
260
+ }
261
+ // Handle required patterns
262
+ let allPatternsFound = true;
263
+ for (const pattern of check.requiredPatterns || []) {
264
+ if (!pattern.test(content)) {
265
+ issues.push(`${check.file}: Missing pattern for ${checkName}: ${pattern.source}`);
266
+ allPatternsFound = false;
267
+ }
268
+ }
269
+ if (allPatternsFound) {
270
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${checkName}: ${check.description}`);
271
+ }
272
+ }
273
+ // 1d. Check colored edges handling (scanner border removal for vintage cards, etc.)
274
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking colored edges handling...`);
275
+ for (const [checkName, check] of Object.entries(COLORED_EDGES_HANDLING_CHECKS)) {
276
+ const filePath = path_1.default.join(process.cwd(), check.file);
277
+ if (!fs_1.default.existsSync(filePath)) {
278
+ issues.push(`${check.file}: File not found (required for ${checkName})`);
279
+ continue;
280
+ }
281
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
282
+ // Handle forbidden patterns (should NOT exist)
283
+ if (check.forbiddenPatterns) {
284
+ let foundForbidden = false;
285
+ for (const pattern of check.forbiddenPatterns) {
286
+ if (pattern.test(content)) {
287
+ issues.push(`${check.file}: Found forbidden pattern for ${checkName}: ${pattern.source}`);
288
+ foundForbidden = true;
289
+ }
290
+ }
291
+ if (!foundForbidden) {
292
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${checkName}: ${check.description}`);
293
+ }
294
+ continue;
295
+ }
296
+ // Handle required patterns
297
+ let allPatternsFound = true;
298
+ for (const pattern of check.requiredPatterns || []) {
299
+ if (!pattern.test(content)) {
300
+ issues.push(`${check.file}: Missing pattern for ${checkName}: ${pattern.source}`);
301
+ allPatternsFound = false;
302
+ }
303
+ }
304
+ if (allPatternsFound) {
305
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${checkName}: ${check.description}`);
306
+ }
307
+ }
308
+ // 2. Check required exports
309
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking required module exports...`);
310
+ for (const [modulePath, exports] of Object.entries(REQUIRED_EXPORTS)) {
311
+ const filePath = path_1.default.join(process.cwd(), modulePath);
312
+ if (!fs_1.default.existsSync(filePath)) {
313
+ issues.push(`${modulePath}: Required module not found`);
314
+ continue;
315
+ }
316
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
317
+ for (const exportName of exports) {
318
+ // Check for function export, type export, or constant export
319
+ const hasExport = new RegExp(`export\\s+(async\\s+)?function\\s+${exportName}|` +
320
+ `export\\s+(const|let|var)\\s+${exportName}|` +
321
+ `export\\s+(type|interface)\\s+${exportName}|` +
322
+ `"${exportName}"`, "i").test(content);
323
+ if (!hasExport) {
324
+ issues.push(`${modulePath}: Missing required export: ${exportName}`);
325
+ }
326
+ }
327
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${modulePath}`);
328
+ }
329
+ // 3. Check edge detection integration
330
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking edge detection integration...`);
331
+ for (const consumerPath of EDGE_DETECTION_CONSUMERS) {
332
+ const filePath = path_1.default.join(process.cwd(), consumerPath);
333
+ if ((0, exclusions_1.shouldExcludeFile)(consumerPath, appExclusions)) {
334
+ console.log(` ${console_chars_1.emoji.skip || "[SKIP]"} ${consumerPath} (excluded)`);
335
+ continue;
336
+ }
337
+ if (!fs_1.default.existsSync(filePath)) {
338
+ warnings.push(`${consumerPath}: File not found`);
339
+ continue;
340
+ }
341
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
342
+ const hasEdgeImport = /import.*(?:analyzeEdgeDetection|EdgeAnalysisResult).*from.*edge-detection-analyzer/i.test(content);
343
+ const hasEdgeCall = /analyzeEdgeDetection\s*\(/i.test(content);
344
+ if (!hasEdgeImport || !hasEdgeCall) {
345
+ issues.push(`${consumerPath}: Missing edge detection integration`);
346
+ }
347
+ else {
348
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${consumerPath}`);
349
+ }
350
+ }
351
+ // 4. Check store settings API exists and has required endpoints
352
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking store settings API...`);
353
+ const storeSettingsPath = "app/api/store/settings/image-processing/route.ts";
354
+ const fullSettingsPath = path_1.default.join(process.cwd(), storeSettingsPath);
355
+ if (fs_1.default.existsSync(fullSettingsPath)) {
356
+ const content = fs_1.default.readFileSync(fullSettingsPath, "utf-8");
357
+ const hasGet = /export\s+async\s+function\s+GET/i.test(content);
358
+ const hasPost = /export\s+async\s+function\s+POST/i.test(content);
359
+ if (!hasGet) {
360
+ issues.push(`${storeSettingsPath}: Missing GET handler`);
361
+ }
362
+ if (!hasPost) {
363
+ issues.push(`${storeSettingsPath}: Missing POST handler`);
364
+ }
365
+ // Check for required settings fields
366
+ const requiredSettings = [
367
+ "edgeDetectionSensitivity",
368
+ "dimensionVarianceThreshold",
369
+ "autoSkipEdgeConcerns",
370
+ "requireVarianceAcknowledgment",
371
+ ];
372
+ for (const setting of requiredSettings) {
373
+ if (!content.includes(setting)) {
374
+ issues.push(`${storeSettingsPath}: Missing setting field: ${setting}`);
375
+ }
376
+ }
377
+ if (hasGet && hasPost) {
378
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} Store settings API validated`);
379
+ }
380
+ }
381
+ else {
382
+ issues.push(`${storeSettingsPath}: Store settings API not found`);
383
+ }
384
+ // 5. Check audit logging integration
385
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking audit logging for image issues...`);
386
+ const batchFixPath = "app/api/admin/listings/batch-fix-images/route.ts";
387
+ const fullBatchFixPath = path_1.default.join(process.cwd(), batchFixPath);
388
+ if (fs_1.default.existsSync(fullBatchFixPath)) {
389
+ const content = fs_1.default.readFileSync(fullBatchFixPath, "utf-8");
390
+ const hasAuditImport = /import.*auditLogger.*from.*@\/lib\/audit/i.test(content);
391
+ const hasAuditCall = /auditLogger\.log|auditLogger\.logImageIssue/i.test(content);
392
+ if (!hasAuditImport || !hasAuditCall) {
393
+ warnings.push(`${batchFixPath}: Missing audit logging integration (recommended)`);
394
+ }
395
+ else {
396
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} Batch fix audit logging configured`);
397
+ }
398
+ }
399
+ // 6. Check history API exists
400
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking image issues history API...`);
401
+ const historyApiPath = "app/api/admin/image-issues/history/route.ts";
402
+ const fullHistoryPath = path_1.default.join(process.cwd(), historyApiPath);
403
+ if (fs_1.default.existsSync(fullHistoryPath)) {
404
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} History API exists`);
405
+ }
406
+ else {
407
+ warnings.push(`${historyApiPath}: History API not found (optional)`);
408
+ }
409
+ // Summary
410
+ console.log(`\n${console_chars_1.emoji.chart || "[CHART]"} Summary:`);
411
+ console.log(` Configuration checks: ${Object.keys(CONFIG_CHECKS).length}`);
412
+ console.log(` Module export checks: ${Object.keys(REQUIRED_EXPORTS).length}`);
413
+ console.log(` Edge detection consumers: ${EDGE_DETECTION_CONSUMERS.length}`);
414
+ if (warnings.length > 0) {
415
+ console.log(`\n${console_chars_1.emoji.warning || "[WARN]"} Warnings (${warnings.length}):`);
416
+ for (const warning of warnings) {
417
+ console.log(` - ${warning}`);
418
+ }
419
+ }
420
+ if (issues.length === 0) {
421
+ console.log(`\n${console_chars_1.emoji.success || "[OK]"} IMAGE PROCESSING CONFIGURATION VALIDATION PASSED`);
422
+ process.exit(0);
423
+ }
424
+ console.log(`\n${console_chars_1.emoji.error || "[ERROR]"} Found ${issues.length} issues:`);
425
+ for (const issue of issues) {
426
+ console.log(` - ${issue}`);
427
+ }
428
+ console.log(`\n${console_chars_1.emoji.error || "[ERROR]"} IMAGE PROCESSING CONFIGURATION VALIDATION FAILED`);
429
+ console.log(`\nTo fix:`);
430
+ console.log(`1. Ensure configuration values are consistent across files`);
431
+ console.log(`2. Verify all required exports exist in their respective modules`);
432
+ console.log(`3. Check edge detection is integrated in all image processing routes`);
433
+ console.log(`4. Ensure store settings API has all required endpoints and fields`);
434
+ process.exit(1);
435
+ }
436
+ main().catch((err) => {
437
+ console.error(`${console_chars_1.emoji.error || "[ERROR]"} Preflight failed:`, err);
438
+ process.exit(1);
439
+ });
440
+ //# sourceMappingURL=image-processing-config-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-processing-config-validation.js","sourceRoot":"","sources":["../../../src/checks/card-processing/image-processing-config-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Price Formatting Consistency Preflight
4
+ *
5
+ * Detects inline price/currency formatting that should use centralized utilities.
6
+ *
7
+ * Anti-patterns detected:
8
+ * - .toFixed(2) near price/amount/cost variables
9
+ * - toLocaleString() with currency formatting options
10
+ * - Manual "$" + value patterns
11
+ * - Number formatting without formatCurrency/formatMoneyFixed
12
+ *
13
+ * Correct patterns:
14
+ * - formatCurrency() from @/lib/utils/format
15
+ * - formatMoneyFixed() from @/lib/utils/format
16
+ * - formatNumber() from @/lib/utils/format
17
+ *
18
+ * Usage:
19
+ * pnpm preflight:price-formatting
20
+ * pnpm preflight:price-formatting --verbose
21
+ */
22
+ export declare const id = "code-quality/price-formatting-consistency";
23
+ export declare const name = "Price Formatting Consistency";
24
+ export declare const description = "Detects inline price formatting - use formatCurrency instead";
25
+ export declare const category = "code-quality";
26
+ export declare const blocking = false;
27
+ export declare const tags: string[];
28
+ //# sourceMappingURL=price-formatting-consistency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"price-formatting-consistency.d.ts","sourceRoot":"","sources":["../../../src/checks/code-quality/price-formatting-consistency.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAUH,eAAO,MAAM,EAAE,8CAA8C,CAAC;AAC9D,eAAO,MAAM,IAAI,iCAAiC,CAAC;AACnD,eAAO,MAAM,WAAW,iEAAiE,CAAC;AAC1F,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AACvC,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,IAAI,UAAsD,CAAC"}