@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.
- package/dist/bin/sync-check.js +6 -4
- package/dist/bin/sync-check.js.map +1 -1
- package/dist/checks/card-processing/dimension-variance-blocking.d.ts +8 -0
- package/dist/checks/card-processing/dimension-variance-blocking.d.ts.map +1 -0
- package/dist/checks/card-processing/dimension-variance-blocking.js +256 -0
- package/dist/checks/card-processing/dimension-variance-blocking.js.map +1 -0
- package/dist/checks/card-processing/edge-detection-integration.d.ts +8 -0
- package/dist/checks/card-processing/edge-detection-integration.d.ts.map +1 -0
- package/dist/checks/card-processing/edge-detection-integration.js +180 -0
- package/dist/checks/card-processing/edge-detection-integration.js.map +1 -0
- package/dist/checks/card-processing/front-back-detection-validation.d.ts +8 -0
- package/dist/checks/card-processing/front-back-detection-validation.d.ts.map +1 -0
- package/dist/checks/card-processing/front-back-detection-validation.js +83 -0
- package/dist/checks/card-processing/front-back-detection-validation.js.map +1 -0
- package/dist/checks/card-processing/image-deskew-system.d.ts +8 -0
- package/dist/checks/card-processing/image-deskew-system.d.ts.map +1 -0
- package/dist/checks/card-processing/image-deskew-system.js +62 -0
- package/dist/checks/card-processing/image-deskew-system.js.map +1 -0
- package/dist/checks/card-processing/image-filename-uniqueness.d.ts +8 -0
- package/dist/checks/card-processing/image-filename-uniqueness.d.ts.map +1 -0
- package/dist/checks/card-processing/image-filename-uniqueness.js +229 -0
- package/dist/checks/card-processing/image-filename-uniqueness.js.map +1 -0
- package/dist/checks/card-processing/image-processing-config-validation.d.ts +8 -0
- package/dist/checks/card-processing/image-processing-config-validation.d.ts.map +1 -0
- package/dist/checks/card-processing/image-processing-config-validation.js +440 -0
- package/dist/checks/card-processing/image-processing-config-validation.js.map +1 -0
- package/dist/checks/code-quality/price-formatting-consistency.d.ts +28 -0
- package/dist/checks/code-quality/price-formatting-consistency.d.ts.map +1 -0
- package/dist/checks/code-quality/price-formatting-consistency.js +230 -0
- package/dist/checks/code-quality/price-formatting-consistency.js.map +1 -0
- package/dist/checks/data/constants-validation.d.ts +19 -0
- package/dist/checks/data/constants-validation.d.ts.map +1 -0
- package/dist/checks/data/constants-validation.js +297 -0
- package/dist/checks/data/constants-validation.js.map +1 -0
- package/dist/checks/data/crockford-id-validation.d.ts +24 -0
- package/dist/checks/data/crockford-id-validation.d.ts.map +1 -0
- package/dist/checks/data/crockford-id-validation.js +227 -0
- package/dist/checks/data/crockford-id-validation.js.map +1 -0
- package/dist/checks/data/geographic-constants-validation.d.ts +16 -0
- package/dist/checks/data/geographic-constants-validation.d.ts.map +1 -0
- package/dist/checks/data/geographic-constants-validation.js +168 -0
- package/dist/checks/data/geographic-constants-validation.js.map +1 -0
- package/dist/checks/data/hardcoded-options-validation.d.ts +24 -0
- package/dist/checks/data/hardcoded-options-validation.d.ts.map +1 -0
- package/dist/checks/data/hardcoded-options-validation.js +362 -0
- package/dist/checks/data/hardcoded-options-validation.js.map +1 -0
- package/dist/checks/data/league-data-integrity-with-env.d.ts +14 -0
- package/dist/checks/data/league-data-integrity-with-env.d.ts.map +1 -0
- package/dist/checks/data/league-data-integrity-with-env.js +21 -0
- package/dist/checks/data/league-data-integrity-with-env.js.map +1 -0
- package/dist/checks/data/product-slug-architecture.d.ts +36 -0
- package/dist/checks/data/product-slug-architecture.d.ts.map +1 -0
- package/dist/checks/data/product-slug-architecture.js +167 -0
- package/dist/checks/data/product-slug-architecture.js.map +1 -0
- package/dist/checks/data/schema-fk-defaults-validation.d.ts +21 -0
- package/dist/checks/data/schema-fk-defaults-validation.d.ts.map +1 -0
- package/dist/checks/data/schema-fk-defaults-validation.js +168 -0
- package/dist/checks/data/schema-fk-defaults-validation.js.map +1 -0
- package/dist/checks/ui/admin-filter-patterns.d.ts +27 -0
- package/dist/checks/ui/admin-filter-patterns.d.ts.map +1 -0
- package/dist/checks/ui/admin-filter-patterns.js +225 -0
- package/dist/checks/ui/admin-filter-patterns.js.map +1 -0
- package/dist/checks/ui/form-field-variant-consistency.d.ts +28 -0
- package/dist/checks/ui/form-field-variant-consistency.d.ts.map +1 -0
- package/dist/checks/ui/form-field-variant-consistency.js +218 -0
- package/dist/checks/ui/form-field-variant-consistency.js.map +1 -0
- package/dist/checks/ui/integration-component-consolidation.d.ts +47 -0
- package/dist/checks/ui/integration-component-consolidation.d.ts.map +1 -0
- package/dist/checks/ui/integration-component-consolidation.js +383 -0
- package/dist/checks/ui/integration-component-consolidation.js.map +1 -0
- package/dist/checks/ui/notification-system-consistency.d.ts +42 -0
- package/dist/checks/ui/notification-system-consistency.d.ts.map +1 -0
- package/dist/checks/ui/notification-system-consistency.js +243 -0
- package/dist/checks/ui/notification-system-consistency.js.map +1 -0
- package/dist/utils/console-chars.d.ts +18 -10
- package/dist/utils/console-chars.d.ts.map +1 -1
- package/dist/utils/console-chars.js +19 -5
- package/dist/utils/console-chars.js.map +1 -1
- 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"}
|