@empline/preflight 1.1.3 → 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 (77) hide show
  1. package/dist/checks/card-processing/dimension-variance-blocking.d.ts +8 -0
  2. package/dist/checks/card-processing/dimension-variance-blocking.d.ts.map +1 -0
  3. package/dist/checks/card-processing/dimension-variance-blocking.js +256 -0
  4. package/dist/checks/card-processing/dimension-variance-blocking.js.map +1 -0
  5. package/dist/checks/card-processing/edge-detection-integration.d.ts +8 -0
  6. package/dist/checks/card-processing/edge-detection-integration.d.ts.map +1 -0
  7. package/dist/checks/card-processing/edge-detection-integration.js +180 -0
  8. package/dist/checks/card-processing/edge-detection-integration.js.map +1 -0
  9. package/dist/checks/card-processing/front-back-detection-validation.d.ts +8 -0
  10. package/dist/checks/card-processing/front-back-detection-validation.d.ts.map +1 -0
  11. package/dist/checks/card-processing/front-back-detection-validation.js +83 -0
  12. package/dist/checks/card-processing/front-back-detection-validation.js.map +1 -0
  13. package/dist/checks/card-processing/image-deskew-system.d.ts +8 -0
  14. package/dist/checks/card-processing/image-deskew-system.d.ts.map +1 -0
  15. package/dist/checks/card-processing/image-deskew-system.js +62 -0
  16. package/dist/checks/card-processing/image-deskew-system.js.map +1 -0
  17. package/dist/checks/card-processing/image-filename-uniqueness.d.ts +8 -0
  18. package/dist/checks/card-processing/image-filename-uniqueness.d.ts.map +1 -0
  19. package/dist/checks/card-processing/image-filename-uniqueness.js +229 -0
  20. package/dist/checks/card-processing/image-filename-uniqueness.js.map +1 -0
  21. package/dist/checks/card-processing/image-processing-config-validation.d.ts +8 -0
  22. package/dist/checks/card-processing/image-processing-config-validation.d.ts.map +1 -0
  23. package/dist/checks/card-processing/image-processing-config-validation.js +440 -0
  24. package/dist/checks/card-processing/image-processing-config-validation.js.map +1 -0
  25. package/dist/checks/code-quality/price-formatting-consistency.d.ts +28 -0
  26. package/dist/checks/code-quality/price-formatting-consistency.d.ts.map +1 -0
  27. package/dist/checks/code-quality/price-formatting-consistency.js +230 -0
  28. package/dist/checks/code-quality/price-formatting-consistency.js.map +1 -0
  29. package/dist/checks/data/constants-validation.d.ts +19 -0
  30. package/dist/checks/data/constants-validation.d.ts.map +1 -0
  31. package/dist/checks/data/constants-validation.js +297 -0
  32. package/dist/checks/data/constants-validation.js.map +1 -0
  33. package/dist/checks/data/crockford-id-validation.d.ts +24 -0
  34. package/dist/checks/data/crockford-id-validation.d.ts.map +1 -0
  35. package/dist/checks/data/crockford-id-validation.js +227 -0
  36. package/dist/checks/data/crockford-id-validation.js.map +1 -0
  37. package/dist/checks/data/geographic-constants-validation.d.ts +16 -0
  38. package/dist/checks/data/geographic-constants-validation.d.ts.map +1 -0
  39. package/dist/checks/data/geographic-constants-validation.js +168 -0
  40. package/dist/checks/data/geographic-constants-validation.js.map +1 -0
  41. package/dist/checks/data/hardcoded-options-validation.d.ts +24 -0
  42. package/dist/checks/data/hardcoded-options-validation.d.ts.map +1 -0
  43. package/dist/checks/data/hardcoded-options-validation.js +362 -0
  44. package/dist/checks/data/hardcoded-options-validation.js.map +1 -0
  45. package/dist/checks/data/league-data-integrity-with-env.d.ts +14 -0
  46. package/dist/checks/data/league-data-integrity-with-env.d.ts.map +1 -0
  47. package/dist/checks/data/league-data-integrity-with-env.js +21 -0
  48. package/dist/checks/data/league-data-integrity-with-env.js.map +1 -0
  49. package/dist/checks/data/product-slug-architecture.d.ts +36 -0
  50. package/dist/checks/data/product-slug-architecture.d.ts.map +1 -0
  51. package/dist/checks/data/product-slug-architecture.js +167 -0
  52. package/dist/checks/data/product-slug-architecture.js.map +1 -0
  53. package/dist/checks/data/schema-fk-defaults-validation.d.ts +21 -0
  54. package/dist/checks/data/schema-fk-defaults-validation.d.ts.map +1 -0
  55. package/dist/checks/data/schema-fk-defaults-validation.js +168 -0
  56. package/dist/checks/data/schema-fk-defaults-validation.js.map +1 -0
  57. package/dist/checks/ui/admin-filter-patterns.d.ts +27 -0
  58. package/dist/checks/ui/admin-filter-patterns.d.ts.map +1 -0
  59. package/dist/checks/ui/admin-filter-patterns.js +225 -0
  60. package/dist/checks/ui/admin-filter-patterns.js.map +1 -0
  61. package/dist/checks/ui/form-field-variant-consistency.d.ts +28 -0
  62. package/dist/checks/ui/form-field-variant-consistency.d.ts.map +1 -0
  63. package/dist/checks/ui/form-field-variant-consistency.js +218 -0
  64. package/dist/checks/ui/form-field-variant-consistency.js.map +1 -0
  65. package/dist/checks/ui/integration-component-consolidation.d.ts +47 -0
  66. package/dist/checks/ui/integration-component-consolidation.d.ts.map +1 -0
  67. package/dist/checks/ui/integration-component-consolidation.js +383 -0
  68. package/dist/checks/ui/integration-component-consolidation.js.map +1 -0
  69. package/dist/checks/ui/notification-system-consistency.d.ts +42 -0
  70. package/dist/checks/ui/notification-system-consistency.d.ts.map +1 -0
  71. package/dist/checks/ui/notification-system-consistency.js +243 -0
  72. package/dist/checks/ui/notification-system-consistency.js.map +1 -0
  73. package/dist/utils/console-chars.d.ts +18 -10
  74. package/dist/utils/console-chars.d.ts.map +1 -1
  75. package/dist/utils/console-chars.js +19 -5
  76. package/dist/utils/console-chars.js.map +1 -1
  77. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export declare const id = "card-processing/dimension-variance-blocking";
3
+ export declare const name = "Dimension Variance Blocking Validation";
4
+ export declare const description = "Validates that dimension variance checking is implemented across ALL import paths to block mismatched front/back images";
5
+ export declare const category = "card-processing";
6
+ export declare const blocking = true;
7
+ export declare const tags: string[];
8
+ //# sourceMappingURL=dimension-variance-blocking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-variance-blocking.d.ts","sourceRoot":"","sources":["../../../src/checks/card-processing/dimension-variance-blocking.ts"],"names":[],"mappings":";AAWA,eAAO,MAAM,EAAE,gDAAgD,CAAC;AAChE,eAAO,MAAM,IAAI,2CAA2C,CAAC;AAC7D,eAAO,MAAM,WAAW,4HAA4H,CAAC;AACrJ,eAAO,MAAM,QAAQ,oBAAoB,CAAC;AAC1C,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAoF,CAAC"}
@@ -0,0 +1,256 @@
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
+ const fs_1 = __importDefault(require("fs"));
9
+ const glob_1 = require("glob");
10
+ const console_chars_1 = require("../../utils/console-chars");
11
+ const exclusions_1 = require("../../shared/exclusions");
12
+ // App-specific exclusions loaded from config
13
+ let appExclusions = [];
14
+ // METADATA - Required for plugin loader discovery
15
+ exports.id = "card-processing/dimension-variance-blocking";
16
+ exports.name = "Dimension Variance Blocking Validation";
17
+ exports.description = "Validates that dimension variance checking is implemented across ALL import paths to block mismatched front/back images";
18
+ exports.category = "card-processing";
19
+ exports.blocking = true;
20
+ exports.tags = ["card-processing", "images", "dimension-variance", "imports", "quality-control"];
21
+ // Import routes that MUST have dimension variance blocking
22
+ const IMPORT_ROUTES_WITH_FRONT_BACK_IMAGES = [
23
+ {
24
+ path: "app/api/store/integrations/woocommerce/preview-images/route.ts",
25
+ name: "WooCommerce Preview",
26
+ requiresBlocking: true,
27
+ },
28
+ {
29
+ path: "app/api/store/integrations/woocommerce/import/route.ts",
30
+ name: "WooCommerce Import",
31
+ requiresBlocking: true,
32
+ },
33
+ {
34
+ path: "app/api/store/integrations/shopify/preview-images/route.ts",
35
+ name: "Shopify Preview",
36
+ requiresBlocking: true,
37
+ },
38
+ {
39
+ path: "app/api/store/integrations/csv/import/route.ts",
40
+ name: "CSV Import",
41
+ requiresBlocking: true,
42
+ },
43
+ ];
44
+ // UI components that must use "blocked" mode (not "acknowledge" mode)
45
+ const UI_COMPONENTS_REQUIRING_BLOCKED_MODE = [
46
+ {
47
+ path: "components/upload/paired-card-slots/PairedCardSlots.tsx",
48
+ name: "Direct Upload (PairedCardSlots)",
49
+ // This is the direct upload component - must hard block
50
+ },
51
+ {
52
+ path: "components/woocommerce/steps/ImageReviewStep.tsx",
53
+ name: "WooCommerce Image Review",
54
+ },
55
+ {
56
+ path: "components/shopify/steps/ImageReviewStep.tsx",
57
+ name: "Shopify Image Review",
58
+ },
59
+ {
60
+ path: "components/shared/integration/ImageReviewStep.tsx",
61
+ name: "Shared Image Review",
62
+ },
63
+ ];
64
+ // Routes that don't process front/back pairs (can skip)
65
+ const ROUTES_WITHOUT_FRONT_BACK = [
66
+ "app/api/store/integrations/ebay/import/route.ts", // Placeholder
67
+ "app/api/store/integrations/shopify/import/route.ts", // Just fetches data
68
+ "app/api/store/integrations/amazon/route.ts", // Config management only
69
+ ];
70
+ async function main() {
71
+ console.log(`\n${console_chars_1.emoji.ruler || "[RULER]"} DIMENSION VARIANCE BLOCKING VALIDATION`);
72
+ console.log((0, console_chars_1.createDivider)(60, "heavy"));
73
+ // Load centralized exclusions
74
+ appExclusions = await (0, exclusions_1.getExclusions)(exports.id);
75
+ const issues = [];
76
+ const warnings = [];
77
+ // Check 1: Verify DIMENSION_VARIANCE_THRESHOLD constant exists
78
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking threshold constant...`);
79
+ const constantsPath = "lib/image-processing-constants.ts";
80
+ if (fs_1.default.existsSync(constantsPath)) {
81
+ const constantsContent = fs_1.default.readFileSync(constantsPath, "utf-8");
82
+ if (!constantsContent.includes("DIMENSION_VARIANCE_THRESHOLD")) {
83
+ issues.push(`${constantsPath}: Missing DIMENSION_VARIANCE_THRESHOLD constant`);
84
+ }
85
+ else {
86
+ // Extract the value
87
+ const match = constantsContent.match(/DIMENSION_VARIANCE_THRESHOLD\s*=\s*([\d.]+)/);
88
+ if (match) {
89
+ const threshold = parseFloat(match[1]);
90
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} DIMENSION_VARIANCE_THRESHOLD = ${threshold * 100}%`);
91
+ if (threshold > 0.05) {
92
+ warnings.push(`Threshold ${threshold * 100}% may be too permissive (recommended: 3%)`);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ else {
98
+ issues.push(`${constantsPath}: File not found!`);
99
+ }
100
+ // Check 2: Validate API routes have dimension variance checking
101
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking API routes for dimension variance...`);
102
+ for (const route of IMPORT_ROUTES_WITH_FRONT_BACK_IMAGES) {
103
+ if ((0, exclusions_1.shouldExcludeFile)(route.path, appExclusions)) {
104
+ console.log(` ${console_chars_1.emoji.skip || "[SKIP]"} ${route.name} (excluded)`);
105
+ continue;
106
+ }
107
+ if (!fs_1.default.existsSync(route.path)) {
108
+ warnings.push(`${route.path}: File not found`);
109
+ continue;
110
+ }
111
+ const content = fs_1.default.readFileSync(route.path, "utf-8");
112
+ // Check for threshold import or usage
113
+ const hasThresholdImport = /DIMENSION_VARIANCE_THRESHOLD/i.test(content);
114
+ // Check for variance calculation
115
+ const hasVarianceCalc = /calculateDimensionVariance|dimensionVariance|variancePercent|widthVariance.*heightVariance/i.test(content);
116
+ // Check for variance flagging
117
+ const hasVarianceFlag = /dimensionVarianceFlag|variance\.flag|varianceResult/i.test(content);
118
+ if (!hasThresholdImport) {
119
+ issues.push(`${route.name} (${route.path}): Missing DIMENSION_VARIANCE_THRESHOLD usage`);
120
+ }
121
+ if (!hasVarianceCalc) {
122
+ issues.push(`${route.name} (${route.path}): Missing dimension variance calculation`);
123
+ }
124
+ if (!hasVarianceFlag) {
125
+ issues.push(`${route.name} (${route.path}): Missing dimension variance flagging`);
126
+ }
127
+ if (hasThresholdImport && hasVarianceCalc && hasVarianceFlag) {
128
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${route.name}`);
129
+ }
130
+ }
131
+ // Check 3: Validate UI components use "blocked" mode (not "acknowledge")
132
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking UI components for hard blocking...`);
133
+ for (const component of UI_COMPONENTS_REQUIRING_BLOCKED_MODE) {
134
+ if ((0, exclusions_1.shouldExcludeFile)(component.path, appExclusions)) {
135
+ console.log(` ${console_chars_1.emoji.skip || "[SKIP]"} ${component.name} (excluded)`);
136
+ continue;
137
+ }
138
+ if (!fs_1.default.existsSync(component.path)) {
139
+ warnings.push(`${component.path}: File not found`);
140
+ continue;
141
+ }
142
+ const content = fs_1.default.readFileSync(component.path, "utf-8");
143
+ // Check if component handles dimension variance
144
+ const handlesDimensionVariance = /variancePercent|dimensionVariance|variance\.flag|variance\.percent/i.test(content);
145
+ if (!handlesDimensionVariance) {
146
+ // It's OK if component doesn't deal with variance at all
147
+ console.log(` ${console_chars_1.emoji.info || "[INFO]"} ${component.name} (no variance handling)`);
148
+ continue;
149
+ }
150
+ // If it handles variance, ensure it uses hard blocking (not acknowledgment)
151
+ const usesAcknowledgment = /acknowledgedVariance|mode\s*=\s*["']acknowledge["']|onAcknowledgeChange/i.test(content);
152
+ const usesBlockedMode = /mode\s*=\s*["']blocked["']|cannot be imported|Cannot Submit/i.test(content);
153
+ const hasVarianceGating = /disabled.*variance|variance.*disabled|\bsubmitDisabled\b/i.test(content);
154
+ if (usesAcknowledgment && !usesBlockedMode) {
155
+ issues.push(`${component.name} (${component.path}): Uses acknowledgment mode for dimension variance! ` +
156
+ `Must use mode="blocked" to prevent submission of mismatched images.`);
157
+ }
158
+ // Check for submit button disabling when variance detected
159
+ if (handlesDimensionVariance && !hasVarianceGating && !usesBlockedMode) {
160
+ warnings.push(`${component.name} (${component.path}): Handles variance but may not disable submit button. Verify manually.`);
161
+ }
162
+ if (handlesDimensionVariance && (usesBlockedMode || hasVarianceGating) && !usesAcknowledgment) {
163
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${component.name} (hard blocking)`);
164
+ }
165
+ else if (handlesDimensionVariance) {
166
+ console.log(` ${console_chars_1.emoji.warning || "[WARN]"} ${component.name} (needs review)`);
167
+ }
168
+ }
169
+ // Check 4: Verify DimensionVarianceWarning component supports "blocked" mode
170
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking shared warning component...`);
171
+ const warningComponentPath = "components/shared/integration/DimensionVarianceWarning.tsx";
172
+ if (fs_1.default.existsSync(warningComponentPath)) {
173
+ const content = fs_1.default.readFileSync(warningComponentPath, "utf-8");
174
+ const hasBlockedMode = /mode\s*[:=]\s*["']blocked["']/i.test(content);
175
+ const hasAcknowledgeMode = /mode\s*[:=]\s*["']acknowledge["']/i.test(content);
176
+ const hasDefaultBlocked = /defaultVariants.*blocked|mode\s*=\s*["']blocked["']/i.test(content);
177
+ if (!hasBlockedMode) {
178
+ issues.push(`${warningComponentPath}: Missing "blocked" mode support`);
179
+ }
180
+ else {
181
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} DimensionVarianceWarning supports blocked mode`);
182
+ }
183
+ // Warn if "acknowledge" mode is still the default
184
+ if (hasAcknowledgeMode && !hasDefaultBlocked) {
185
+ warnings.push(`${warningComponentPath}: "acknowledge" mode should not be the default. ` +
186
+ `Consider making "blocked" the default to enforce hard blocking.`);
187
+ }
188
+ }
189
+ else {
190
+ issues.push(`${warningComponentPath}: Shared component not found!`);
191
+ }
192
+ // Check 5: Scan for any NEW import routes that might need variance checking
193
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Scanning for potential new import routes...`);
194
+ const allImportRoutes = await (0, glob_1.glob)("app/api/**/import/**/route.ts", {
195
+ ignore: ["node_modules/**", ".next/**"],
196
+ });
197
+ const allPreviewRoutes = await (0, glob_1.glob)("app/api/**/preview-images/**/route.ts", {
198
+ ignore: ["node_modules/**", ".next/**"],
199
+ });
200
+ const allRoutes = [...new Set([...allImportRoutes, ...allPreviewRoutes])];
201
+ for (const routePath of allRoutes) {
202
+ // Skip known routes
203
+ if (IMPORT_ROUTES_WITH_FRONT_BACK_IMAGES.some(r => r.path === routePath))
204
+ continue;
205
+ if (ROUTES_WITHOUT_FRONT_BACK.includes(routePath))
206
+ continue;
207
+ if ((0, exclusions_1.shouldExcludeFile)(routePath, appExclusions))
208
+ continue;
209
+ const content = fs_1.default.readFileSync(routePath, "utf-8");
210
+ // Check if this route processes images (likely front/back pairs)
211
+ const hasImageProcessing = /generateMultipleImageVariants|ImageBorderResolution|processImage|frontImage.*backImage|backImage.*frontImage/i.test(content);
212
+ const hasMultipleImages = /images\[0\].*images\[1\]|frontImageUrl.*backImageUrl|\.images/i.test(content);
213
+ if (hasImageProcessing || hasMultipleImages) {
214
+ const hasVarianceCheck = /DIMENSION_VARIANCE_THRESHOLD|dimensionVariance|calculateDimensionVariance/i.test(content);
215
+ if (!hasVarianceCheck) {
216
+ warnings.push(`${routePath}: New import route with image processing but no dimension variance check! ` +
217
+ `Add variance checking or add to ROUTES_WITHOUT_FRONT_BACK if not applicable.`);
218
+ }
219
+ }
220
+ }
221
+ // Summary
222
+ console.log(`\n${console_chars_1.emoji.chart || "[CHART]"} Summary:`);
223
+ console.log(` API routes checked: ${IMPORT_ROUTES_WITH_FRONT_BACK_IMAGES.length}`);
224
+ console.log(` UI components checked: ${UI_COMPONENTS_REQUIRING_BLOCKED_MODE.length}`);
225
+ console.log(` Additional routes scanned: ${allRoutes.length}`);
226
+ if (warnings.length > 0) {
227
+ console.log(`\n${console_chars_1.emoji.warning || "[WARN]"} Warnings (${warnings.length}):`);
228
+ for (const warning of warnings) {
229
+ console.log(` - ${warning}`);
230
+ }
231
+ }
232
+ if (issues.length === 0) {
233
+ console.log(`\n${console_chars_1.emoji.success || "[OK]"} DIMENSION VARIANCE BLOCKING VALIDATION PASSED`);
234
+ console.log(`\nAll import paths enforce hard blocking when front/back dimensions don't match.`);
235
+ process.exit(0);
236
+ }
237
+ console.log(`\n${console_chars_1.emoji.error || "[ERROR]"} Found ${issues.length} issues:`);
238
+ for (const issue of issues) {
239
+ console.log(` - ${issue}`);
240
+ }
241
+ console.log(`\n${console_chars_1.emoji.error || "[ERROR]"} DIMENSION VARIANCE BLOCKING VALIDATION FAILED`);
242
+ console.log(`\nTo fix:`);
243
+ console.log(`1. Import DIMENSION_VARIANCE_THRESHOLD from @/lib/image-processing-constants`);
244
+ console.log(`2. Calculate dimension variance between front and back images after processing`);
245
+ console.log(`3. Flag products with variance > threshold (currently 3%)`);
246
+ console.log(`4. BLOCK submission of flagged products (no acknowledgment/bypass option)`);
247
+ console.log(`5. Use DimensionVarianceWarning with mode="blocked" in UI components`);
248
+ console.log(`\nPolicy: Users CANNOT import cards with mismatched front/back dimensions.`);
249
+ console.log(`This ensures image quality consistency in the catalog.`);
250
+ process.exit(1);
251
+ }
252
+ main().catch((err) => {
253
+ console.error(`${console_chars_1.emoji.error || "[ERROR]"} Preflight failed:`, err);
254
+ process.exit(1);
255
+ });
256
+ //# sourceMappingURL=dimension-variance-blocking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-variance-blocking.js","sourceRoot":"","sources":["../../../src/checks/card-processing/dimension-variance-blocking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export declare const id = "card-processing/edge-detection-integration";
3
+ export declare const name = "Edge Detection Integration Validation";
4
+ export declare const description = "Validates that edge detection is properly integrated across all image import flows";
5
+ export declare const category = "card-processing";
6
+ export declare const blocking = true;
7
+ export declare const tags: string[];
8
+ //# sourceMappingURL=edge-detection-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-detection-integration.d.ts","sourceRoot":"","sources":["../../../src/checks/card-processing/edge-detection-integration.ts"],"names":[],"mappings":";AAWA,eAAO,MAAM,EAAE,+CAA+C,CAAC;AAC/D,eAAO,MAAM,IAAI,0CAA0C,CAAC;AAC5D,eAAO,MAAM,WAAW,uFAAuF,CAAC;AAChH,eAAO,MAAM,QAAQ,oBAAoB,CAAC;AAC1C,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA4E,CAAC"}
@@ -0,0 +1,180 @@
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
+ const fs_1 = __importDefault(require("fs"));
9
+ const glob_1 = require("glob");
10
+ const console_chars_1 = require("../../utils/console-chars");
11
+ const exclusions_1 = require("../../shared/exclusions");
12
+ // App-specific exclusions loaded from config
13
+ let appExclusions = [];
14
+ // METADATA - Required for plugin loader discovery
15
+ exports.id = "card-processing/edge-detection-integration";
16
+ exports.name = "Edge Detection Integration Validation";
17
+ exports.description = "Validates that edge detection is properly integrated across all image import flows";
18
+ exports.category = "card-processing";
19
+ exports.blocking = true;
20
+ exports.tags = ["card-processing", "images", "edge-detection", "imports", "integration"];
21
+ /**
22
+ * Edge Detection Integration Validation
23
+ *
24
+ * Ensures that all import routes that process images also include edge detection analysis.
25
+ * This prevents regression where new import routes might skip edge detection.
26
+ *
27
+ * Required patterns in import routes with image processing:
28
+ * 1. Must import analyzeEdgeDetection from @/lib/edge-detection-analyzer
29
+ * 2. Must call analyzeEdgeDetection or analyzeEdgeDetectionForUrls
30
+ * 3. Must store edge warnings in metadata
31
+ */
32
+ // Import routes that should have edge detection
33
+ const IMPORT_ROUTES_WITH_IMAGE_PROCESSING = [
34
+ "app/api/store/integrations/woocommerce/import/route.ts",
35
+ "app/api/store/integrations/woocommerce/preview-images/route.ts",
36
+ "app/api/store/integrations/csv/import/route.ts",
37
+ ];
38
+ // Routes that are placeholders or don't process images (can skip)
39
+ const PLACEHOLDER_ROUTES = [
40
+ "app/api/store/integrations/ebay/import/route.ts", // Placeholder - returns empty array
41
+ "app/api/store/integrations/shopify/import/route.ts", // Just fetches data, doesn't create listings
42
+ "app/api/store/integrations/shopify/import-products/route.ts", // Edge detection TODO - preview step handles image quality
43
+ "app/api/store/integrations/amazon/route.ts", // Config management only
44
+ ];
45
+ async function main() {
46
+ console.log(`\n${console_chars_1.emoji.ruler || "[RULER]"} EDGE DETECTION INTEGRATION VALIDATION`);
47
+ console.log((0, console_chars_1.createDivider)(60, "heavy"));
48
+ // Load centralized exclusions
49
+ appExclusions = await (0, exclusions_1.getExclusions)(exports.id);
50
+ const issues = [];
51
+ const warnings = [];
52
+ // Check required import routes
53
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking import routes for edge detection...`);
54
+ for (const routePath of IMPORT_ROUTES_WITH_IMAGE_PROCESSING) {
55
+ if ((0, exclusions_1.shouldExcludeFile)(routePath, appExclusions)) {
56
+ console.log(` ${console_chars_1.emoji.skip || "[SKIP]"} ${routePath} (excluded)`);
57
+ continue;
58
+ }
59
+ if (!fs_1.default.existsSync(routePath)) {
60
+ warnings.push(`${routePath}: File not found`);
61
+ continue;
62
+ }
63
+ const content = fs_1.default.readFileSync(routePath, "utf-8");
64
+ // Check for edge detection import
65
+ const hasEdgeImport = /import.*analyzeEdgeDetection.*from.*edge-detection-analyzer/i.test(content);
66
+ // Check for edge detection call
67
+ const hasEdgeCall = /analyzeEdgeDetection\s*\(|analyzeEdgeDetectionForUrls\s*\(/i.test(content);
68
+ // Check for edge warnings storage
69
+ const hasEdgeStorage = /edgeDetectionWarnings|edgeWarnings|edgeAnalysis/i.test(content);
70
+ if (!hasEdgeImport) {
71
+ issues.push(`${routePath}: Missing edge detection import (analyzeEdgeDetection from @/lib/edge-detection-analyzer)`);
72
+ }
73
+ if (!hasEdgeCall) {
74
+ issues.push(`${routePath}: Missing edge detection analysis call`);
75
+ }
76
+ if (!hasEdgeStorage) {
77
+ issues.push(`${routePath}: Missing edge warnings storage in metadata`);
78
+ }
79
+ if (hasEdgeImport && hasEdgeCall && hasEdgeStorage) {
80
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${routePath}`);
81
+ }
82
+ }
83
+ // Check for new import routes that might need edge detection
84
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Scanning for potential new import routes...`);
85
+ const allImportRoutes = await (0, glob_1.glob)("app/api/**/import/**/route.ts", {
86
+ ignore: ["node_modules/**", ".next/**"],
87
+ });
88
+ const integrationRoutes = await (0, glob_1.glob)("app/api/store/integrations/**/route.ts", {
89
+ ignore: ["node_modules/**", ".next/**"],
90
+ });
91
+ const allRoutes = [...new Set([...allImportRoutes, ...integrationRoutes])];
92
+ for (const routePath of allRoutes) {
93
+ // Normalize path separators for cross-platform compatibility
94
+ const normalizedPath = routePath.replace(/\\/g, "/");
95
+ // Skip known routes
96
+ if (IMPORT_ROUTES_WITH_IMAGE_PROCESSING.includes(normalizedPath))
97
+ continue;
98
+ if (PLACEHOLDER_ROUTES.includes(normalizedPath))
99
+ continue;
100
+ if ((0, exclusions_1.shouldExcludeFile)(normalizedPath, appExclusions))
101
+ continue;
102
+ const content = fs_1.default.readFileSync(routePath, "utf-8");
103
+ // Check if this route processes images
104
+ const hasImageProcessing = /generateMultipleImageVariants|ImageBorderResolution|processImage/i.test(content);
105
+ const hasImageUrls = /imageUrls|imageUrl|\.images/i.test(content);
106
+ if (hasImageProcessing && hasImageUrls) {
107
+ const hasEdgeDetection = /analyzeEdgeDetection|edgeDetectionWarnings/i.test(content);
108
+ if (!hasEdgeDetection) {
109
+ issues.push(`${routePath}: New import route with image processing but no edge detection! Add edge detection or add to PLACEHOLDER_ROUTES if not applicable.`);
110
+ }
111
+ }
112
+ }
113
+ // Check that edge-detection-analyzer exists and has required exports
114
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Validating edge detection library...`);
115
+ const analyzerPath = "lib/edge-detection-analyzer.ts";
116
+ if (fs_1.default.existsSync(analyzerPath)) {
117
+ const analyzerContent = fs_1.default.readFileSync(analyzerPath, "utf-8");
118
+ const requiredExports = [
119
+ "analyzeEdgeDetection",
120
+ "EdgeAnalysisResult",
121
+ "EdgeReliability",
122
+ "EdgeConcernReason",
123
+ ];
124
+ for (const exportName of requiredExports) {
125
+ const hasExport = new RegExp(`export\\s+(async\\s+)?function\\s+${exportName}|export\\s+(type|interface)\\s+${exportName}`, "i").test(analyzerContent);
126
+ if (!hasExport) {
127
+ issues.push(`${analyzerPath}: Missing required export: ${exportName}`);
128
+ }
129
+ }
130
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} Edge detection library validated`);
131
+ }
132
+ else {
133
+ issues.push(`${analyzerPath}: Edge detection library not found!`);
134
+ }
135
+ // Check shared components exist
136
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Validating shared edge detection components...`);
137
+ const sharedComponents = [
138
+ "components/shared/integration/EdgeDetectionWarning.tsx",
139
+ "components/shared/integration/DimensionVarianceWarning.tsx",
140
+ ];
141
+ for (const componentPath of sharedComponents) {
142
+ if (fs_1.default.existsSync(componentPath)) {
143
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${componentPath}`);
144
+ }
145
+ else {
146
+ issues.push(`${componentPath}: Shared component not found!`);
147
+ }
148
+ }
149
+ // Summary
150
+ console.log(`\n${console_chars_1.emoji.chart || "[CHART]"} Summary:`);
151
+ console.log(` Import routes checked: ${IMPORT_ROUTES_WITH_IMAGE_PROCESSING.length}`);
152
+ console.log(` Additional routes scanned: ${allRoutes.length}`);
153
+ if (warnings.length > 0) {
154
+ console.log(`\n${console_chars_1.emoji.warning || "[WARN]"} Warnings (${warnings.length}):`);
155
+ for (const warning of warnings) {
156
+ console.log(` - ${warning}`);
157
+ }
158
+ }
159
+ if (issues.length === 0) {
160
+ console.log(`\n${console_chars_1.emoji.success || "[OK]"} EDGE DETECTION INTEGRATION VALIDATION PASSED`);
161
+ process.exit(0);
162
+ }
163
+ console.log(`\n${console_chars_1.emoji.error || "[ERROR]"} Found ${issues.length} issues:`);
164
+ for (const issue of issues) {
165
+ console.log(` - ${issue}`);
166
+ }
167
+ console.log(`\n${console_chars_1.emoji.error || "[ERROR]"} EDGE DETECTION INTEGRATION VALIDATION FAILED`);
168
+ console.log(`\nTo fix:`);
169
+ console.log(`1. Ensure all import routes that process images include edge detection`);
170
+ console.log(`2. Import analyzeEdgeDetection from @/lib/edge-detection-analyzer`);
171
+ console.log(`3. Call analyzeEdgeDetection(buffer) or analyzeEdgeDetectionForUrls(urls)`);
172
+ console.log(`4. Store results in metadata.edgeDetectionWarnings`);
173
+ console.log(`5. If route is a placeholder, add it to PLACEHOLDER_ROUTES in this preflight`);
174
+ process.exit(1);
175
+ }
176
+ main().catch((err) => {
177
+ console.error(`${console_chars_1.emoji.error || "[ERROR]"} Preflight failed:`, err);
178
+ process.exit(1);
179
+ });
180
+ //# sourceMappingURL=edge-detection-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-detection-integration.js","sourceRoot":"","sources":["../../../src/checks/card-processing/edge-detection-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export declare const id = "card-processing/front-back-detection-validation";
3
+ export declare const name = "Front/Back Detection Validation";
4
+ export declare const description = "Validates front/back detection is integrated into single AI call";
5
+ export declare const category = "card-processing";
6
+ export declare const blocking = true;
7
+ export declare const tags: string[];
8
+ //# sourceMappingURL=front-back-detection-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"front-back-detection-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/card-processing/front-back-detection-validation.ts"],"names":[],"mappings":";AAaA,eAAO,MAAM,EAAE,oDAAoD,CAAC;AACpE,eAAO,MAAM,IAAI,oCAAoC,CAAC;AACtD,eAAO,MAAM,WAAW,qEAAqE,CAAC;AAC9F,eAAO,MAAM,QAAQ,oBAAoB,CAAC;AAC1C,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAmD,CAAC"}
@@ -0,0 +1,83 @@
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
+ * Front/Back Detection Validation Preflight
10
+ *
11
+ * Enforces the "iron-clad" rule: when a back image exists, orientation detection
12
+ * must be integrated into the *same* AI call (no extra OpenAI calls).
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
+ // METADATA - Required for plugin loader discovery
18
+ exports.id = "card-processing/front-back-detection-validation";
19
+ exports.name = "Front/Back Detection Validation";
20
+ exports.description = "Validates front/back detection is integrated into single AI call";
21
+ exports.category = "card-processing";
22
+ exports.blocking = true;
23
+ exports.tags = ["card-processing", "ai", "images", "detection"];
24
+ function findFunctionBlock(content, functionName) {
25
+ const idx = content.indexOf(`async ${functionName}`);
26
+ if (idx === -1)
27
+ return null;
28
+ // Naive brace matching from first '{' after signature.
29
+ const startBrace = content.indexOf("{", idx);
30
+ if (startBrace === -1)
31
+ return null;
32
+ let depth = 0;
33
+ for (let i = startBrace; i < content.length; i++) {
34
+ const ch = content[i];
35
+ if (ch === "{")
36
+ depth++;
37
+ if (ch === "}")
38
+ depth--;
39
+ if (depth === 0) {
40
+ return content.slice(startBrace, i + 1);
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ function countOccurrences(haystack, needle) {
46
+ return (haystack.match(new RegExp(needle.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || [])
47
+ .length;
48
+ }
49
+ function main() {
50
+ console.log(`\n${console_chars_1.emoji.search} FRONT/BACK DETECTION VALIDATION`);
51
+ console.log((0, console_chars_1.createDivider)(60, "heavy"));
52
+ const visionServicePath = path_1.default.join(process.cwd(), "lib", "vision", "service.ts");
53
+ if (!fs_1.default.existsSync(visionServicePath)) {
54
+ console.error(`${console_chars_1.emoji.error} Missing lib/vision/service.ts`);
55
+ process.exit(1);
56
+ }
57
+ const content = fs_1.default.readFileSync(visionServicePath, "utf8");
58
+ const block = findFunctionBlock(content, "analyzeCard");
59
+ if (!block) {
60
+ console.error(`${console_chars_1.emoji.error} Could not locate analyzeCard() in lib/vision/service.ts`);
61
+ process.exit(1);
62
+ }
63
+ const openAiCallCount = countOccurrences(block, "openai.chat.completions.create");
64
+ if (openAiCallCount > 1) {
65
+ console.error(`${console_chars_1.emoji.error} analyzeCard() contains ${openAiCallCount} OpenAI calls. Must be exactly 1.`);
66
+ process.exit(1);
67
+ }
68
+ // Orientation must be included in the prompt/response contract.
69
+ const hasOrientationInstructions = /imageOrientation/.test(block);
70
+ if (!hasOrientationInstructions) {
71
+ console.warn(`${console_chars_1.emoji.warning} analyzeCard() does not reference imageOrientation in the prompt/parse path (verify orientation is still integrated).`);
72
+ }
73
+ console.log(`${console_chars_1.emoji.success} Front/back detection validation passed (single-call enforced).`);
74
+ process.exit(0);
75
+ }
76
+ try {
77
+ main();
78
+ }
79
+ catch (err) {
80
+ console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
81
+ process.exit(1);
82
+ }
83
+ //# sourceMappingURL=front-back-detection-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"front-back-detection-validation.js","sourceRoot":"","sources":["../../../src/checks/card-processing/front-back-detection-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export declare const id = "card-processing/image-deskew-system";
3
+ export declare const name = "Image Deskew System Validation";
4
+ export declare const description = "Validates that image deskew functionality is properly implemented";
5
+ export declare const category = "card-processing";
6
+ export declare const blocking = false;
7
+ export declare const tags: string[];
8
+ //# sourceMappingURL=image-deskew-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-deskew-system.d.ts","sourceRoot":"","sources":["../../../src/checks/card-processing/image-deskew-system.ts"],"names":[],"mappings":";AAWA,eAAO,MAAM,EAAE,wCAAwC,CAAC;AACxD,eAAO,MAAM,IAAI,mCAAmC,CAAC;AACrD,eAAO,MAAM,WAAW,sEAAsE,CAAC;AAC/F,eAAO,MAAM,QAAQ,oBAAoB,CAAC;AAC1C,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,IAAI,UAAsD,CAAC"}