@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,62 @@
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/image-deskew-system";
16
+ exports.name = "Image Deskew System Validation";
17
+ exports.description = "Validates that image deskew functionality is properly implemented";
18
+ exports.category = "card-processing";
19
+ exports.blocking = false;
20
+ exports.tags = ["card-processing", "images", "deskew", "rotation"];
21
+ /**
22
+ * Image Deskew System Validation
23
+ *
24
+ * Validates that image deskew functionality is properly implemented.
25
+ */
26
+ async function main() {
27
+ console.log(`\n${console_chars_1.emoji.ruler || "[RULER]"} IMAGE DESKEW SYSTEM VALIDATION`);
28
+ console.log((0, console_chars_1.createDivider)(60, "heavy"));
29
+ // Load centralized exclusions
30
+ appExclusions = await (0, exclusions_1.getExclusions)(exports.id);
31
+ const issues = [];
32
+ // Find image processing files
33
+ const allFiles = await (0, glob_1.glob)("lib/**/*image*.{ts,js}", {
34
+ ignore: ["node_modules/**", ".next/**"],
35
+ });
36
+ const files = allFiles.filter((file) => !(0, exclusions_1.shouldExcludeFile)(file, appExclusions));
37
+ for (const file of files) {
38
+ const content = fs_1.default.readFileSync(file, "utf-8");
39
+ // Check for deskew handling
40
+ const hasDeskew = /deskew|rotate|angle|straighten/i.test(content);
41
+ const hasCardProcessing = /card|trading/i.test(content);
42
+ if (hasCardProcessing && !hasDeskew) {
43
+ issues.push(`${file}: Card processing without deskew handling`);
44
+ }
45
+ }
46
+ console.log(`\n${console_chars_1.emoji.chart} Checked ${files.length} image processing files`);
47
+ if (issues.length === 0) {
48
+ console.log(`\n${console_chars_1.emoji.success} IMAGE DESKEW VALIDATION PASSED`);
49
+ process.exit(0);
50
+ }
51
+ console.log(`\n${console_chars_1.emoji.warning} Found ${issues.length} potential issues:`);
52
+ for (const issue of issues.slice(0, 5)) {
53
+ console.log(` ${issue}`);
54
+ }
55
+ console.log(`\n${console_chars_1.emoji.success} IMAGE DESKEW VALIDATION PASSED (warnings only)`);
56
+ process.exit(0);
57
+ }
58
+ main().catch((err) => {
59
+ console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
60
+ process.exit(1);
61
+ });
62
+ //# sourceMappingURL=image-deskew-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-deskew-system.js","sourceRoot":"","sources":["../../../src/checks/card-processing/image-deskew-system.ts"],"names":[],"mappings":";;;;;;;AACA,4CAAoB;AACpB,+BAA4B;AAC5B,6DAAiE;AACjE,wDAA2E;AAE3E,6CAA6C;AAC7C,IAAI,aAAa,GAAa,EAAE,CAAC;AAEjC,kDAAkD;AAErC,QAAA,EAAE,GAAG,qCAAqC,CAAC;AAC3C,QAAA,IAAI,GAAG,gCAAgC,CAAC;AACxC,QAAA,WAAW,GAAG,mEAAmE,CAAC;AAClF,QAAA,QAAQ,GAAG,iBAAiB,CAAC;AAC7B,QAAA,QAAQ,GAAG,KAAK,CAAC;AACjB,QAAA,IAAI,GAAG,CAAC,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAExE;;;;GAIG;AAEH,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,IAAI,SAAS,iCAAiC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,IAAA,6BAAa,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAExC,8BAA8B;IAC9B,aAAa,GAAG,MAAM,IAAA,0BAAa,EAAC,UAAE,CAAC,CAAC;IAExC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,MAAM,IAAA,WAAI,EAAC,wBAAwB,EAAE;QACpD,MAAM,EAAE,CAAC,iBAAiB,EAAE,UAAU,CAAC;KACxC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAA,8BAAiB,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IAEjF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE/C,4BAA4B;QAC5B,MAAM,SAAS,GAAG,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAExD,IAAI,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,2CAA2C,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,YAAY,KAAK,CAAC,MAAM,yBAAyB,CAAC,CAAC;IAE/E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,OAAO,WAAW,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAC5E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,OAAO,iDAAiD,CAAC,CAAC;IACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,qBAAK,CAAC,KAAK,oBAAoB,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export declare const id = "card-processing/image-filename-uniqueness";
3
+ export declare const name = "Image Filename Uniqueness";
4
+ export declare const description = "Validates image filenames include listing ID suffix to prevent collisions at scale";
5
+ export declare const category = "card-processing";
6
+ export declare const blocking = true;
7
+ export declare const tags: string[];
8
+ //# sourceMappingURL=image-filename-uniqueness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-filename-uniqueness.d.ts","sourceRoot":"","sources":["../../../src/checks/card-processing/image-filename-uniqueness.ts"],"names":[],"mappings":";AAsBA,eAAO,MAAM,EAAE,8CAA8C,CAAC;AAC9D,eAAO,MAAM,IAAI,8BAA8B,CAAC;AAChD,eAAO,MAAM,WAAW,uFAAuF,CAAC;AAChH,eAAO,MAAM,QAAQ,oBAAoB,CAAC;AAC1C,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAoE,CAAC"}
@@ -0,0 +1,229 @@
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 Filename Uniqueness Preflight
10
+ *
11
+ * Validates that image filenames include listing ID suffix to prevent
12
+ * collisions when multiple sellers list identical products.
13
+ *
14
+ * At scale (millions of listings), filename collisions are a critical issue.
15
+ * Without unique suffixes, two sellers listing "2024 Topps Mike Trout #100"
16
+ * would generate identical filenames, causing one to overwrite the other.
17
+ *
18
+ * This preflight ensures:
19
+ * 1. getListingIdSuffix() helper exists and extracts last 8 chars
20
+ * 2. All filename generators accept and use listingId parameter
21
+ * 3. generateFilename() dispatcher passes listingId to all handlers
22
+ * 4. handleMetadataAndUpload() passes listingId when generating filenames
23
+ */
24
+ const fs_1 = __importDefault(require("fs"));
25
+ const path_1 = __importDefault(require("path"));
26
+ const console_chars_1 = require("../../utils/console-chars");
27
+ // METADATA - Required for plugin loader discovery
28
+ exports.id = "card-processing/image-filename-uniqueness";
29
+ exports.name = "Image Filename Uniqueness";
30
+ exports.description = "Validates image filenames include listing ID suffix to prevent collisions at scale";
31
+ exports.category = "card-processing";
32
+ exports.blocking = true;
33
+ exports.tags = ["card-processing", "images", "filenames", "uniqueness", "scale"];
34
+ /**
35
+ * Required patterns in lib/image-management.ts
36
+ */
37
+ const REQUIRED_PATTERNS = [
38
+ // Helper function exists
39
+ {
40
+ name: "getListingIdSuffix helper",
41
+ pattern: /function getListingIdSuffix\(listingId\?: string\).*:\s*string\s*\|\s*null/s,
42
+ description: "Helper function to extract unique suffix from listing ID",
43
+ required: true,
44
+ },
45
+ {
46
+ name: "getListingIdSuffix implementation",
47
+ pattern: /listingId\.slice\(-8\)/,
48
+ description: "Uses last 8 characters of listing ID for uniqueness",
49
+ required: true,
50
+ },
51
+ // Card filename generator
52
+ {
53
+ name: "generateCardFilename accepts listingId",
54
+ pattern: /function generateCardFilename\([^)]*listingId\?: string[^)]*\)/,
55
+ description: "Card filename generator accepts listingId parameter",
56
+ required: true,
57
+ },
58
+ {
59
+ name: "generateCardFilename uses listingId",
60
+ pattern: /function generateCardFilename[\s\S]*?getListingIdSuffix\(listingId\)[\s\S]*?\.filter\(Boolean\)/,
61
+ description: "Card filename generator includes listingId suffix in parts array",
62
+ required: true,
63
+ },
64
+ // Video game filename generator
65
+ {
66
+ name: "generateVideoGameFilename accepts listingId",
67
+ pattern: /function generateVideoGameFilename\([^)]*listingId\?: string[^)]*\)/,
68
+ description: "Video game filename generator accepts listingId parameter",
69
+ required: true,
70
+ },
71
+ {
72
+ name: "generateVideoGameFilename uses listingId",
73
+ pattern: /function generateVideoGameFilename[\s\S]*?getListingIdSuffix\(listingId\)[\s\S]*?\.filter\(Boolean\)/,
74
+ description: "Video game filename generator includes listingId suffix",
75
+ required: true,
76
+ },
77
+ // TCG filename generator
78
+ {
79
+ name: "generateTCGFilename accepts listingId",
80
+ pattern: /function generateTCGFilename\([^)]*listingId\?: string[^)]*\)/,
81
+ description: "TCG filename generator accepts listingId parameter",
82
+ required: true,
83
+ },
84
+ {
85
+ name: "generateTCGFilename uses listingId",
86
+ pattern: /function generateTCGFilename[\s\S]*?getListingIdSuffix\(listingId\)[\s\S]*?\.filter\(Boolean\)/,
87
+ description: "TCG filename generator includes listingId suffix",
88
+ required: true,
89
+ },
90
+ // Dispatcher passes listingId
91
+ {
92
+ name: "generateFilename accepts listingId",
93
+ pattern: /function generateFilename\([^)]*listingId\?: string[^)]*\)/,
94
+ description: "Filename dispatcher accepts listingId parameter",
95
+ required: true,
96
+ },
97
+ {
98
+ name: "generateFilename passes listingId to card",
99
+ pattern: /generateCardFilename\([^,]+,\s*side,\s*listingId\)/,
100
+ description: "Dispatcher passes listingId to card filename generator",
101
+ required: true,
102
+ },
103
+ {
104
+ name: "generateFilename passes listingId to video game",
105
+ pattern: /generateVideoGameFilename\([^,]+,\s*side,\s*listingId\)/,
106
+ description: "Dispatcher passes listingId to video game filename generator",
107
+ required: true,
108
+ },
109
+ {
110
+ name: "generateFilename passes listingId to TCG",
111
+ pattern: /generateTCGFilename\([^,]+,\s*side,\s*listingId\)/,
112
+ description: "Dispatcher passes listingId to TCG filename generator",
113
+ required: true,
114
+ },
115
+ // handleMetadataAndUpload uses listingId
116
+ {
117
+ name: "handleMetadataAndUpload generates filename with listingId",
118
+ pattern: /generateFilename\(productData,\s*category,\s*side,\s*["']jpg["'],\s*listingId\)/,
119
+ description: "Upload handler passes listingId when generating base filename",
120
+ required: true,
121
+ },
122
+ ];
123
+ /**
124
+ * Forbidden patterns that would break uniqueness
125
+ */
126
+ const FORBIDDEN_PATTERNS = [
127
+ {
128
+ name: "generateFilename without listingId in default case",
129
+ pattern: /default:[\s\S]*?generateCardFilename\([^,]+,\s*side\s*\)[^,]/,
130
+ description: "Default case must pass listingId to prevent collisions",
131
+ required: false,
132
+ },
133
+ {
134
+ name: "handleMetadataAndUpload without listingId",
135
+ pattern: /generateFilename\(productData,\s*category,\s*side\)\.replace/,
136
+ description: "Upload handler must pass listingId parameter",
137
+ required: false,
138
+ },
139
+ ];
140
+ async function main() {
141
+ console.log(`\n${console_chars_1.emoji.ruler || "[RULER]"} IMAGE FILENAME UNIQUENESS VALIDATION`);
142
+ console.log((0, console_chars_1.createDivider)(65, "heavy"));
143
+ const issues = [];
144
+ const warnings = [];
145
+ const imageManagementPath = path_1.default.join(process.cwd(), "lib/image-management.ts");
146
+ // Check file exists
147
+ if (!fs_1.default.existsSync(imageManagementPath)) {
148
+ console.log(`\n${console_chars_1.emoji.error || "[ERROR]"} lib/image-management.ts not found`);
149
+ process.exit(1);
150
+ }
151
+ const content = fs_1.default.readFileSync(imageManagementPath, "utf-8");
152
+ // 1. Check required patterns
153
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking required patterns...`);
154
+ for (const check of REQUIRED_PATTERNS) {
155
+ const matches = check.pattern.test(content);
156
+ if (matches) {
157
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} ${check.name}`);
158
+ }
159
+ else {
160
+ issues.push(`Missing: ${check.name} - ${check.description}`);
161
+ console.log(` ${console_chars_1.emoji.error || "[ERROR]"} ${check.name}`);
162
+ }
163
+ }
164
+ // 2. Check forbidden patterns
165
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking for forbidden patterns...`);
166
+ for (const check of FORBIDDEN_PATTERNS) {
167
+ const matches = check.pattern.test(content);
168
+ if (matches) {
169
+ issues.push(`Found forbidden pattern: ${check.name} - ${check.description}`);
170
+ console.log(` ${console_chars_1.emoji.error || "[ERROR]"} ${check.name} (should not exist)`);
171
+ }
172
+ else {
173
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} No ${check.name}`);
174
+ }
175
+ }
176
+ // 3. Verify listingId is used in moveApprovedListingImages
177
+ console.log(`\n${console_chars_1.emoji.search || "[SEARCH]"} Checking moveApprovedListingImages integration...`);
178
+ const moveApprovedPattern = /moveAndOptimizeImage\([^)]*listingId[^)]*\)/;
179
+ if (moveApprovedPattern.test(content)) {
180
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} moveApprovedListingImages passes listingId to moveAndOptimizeImage`);
181
+ }
182
+ else {
183
+ issues.push("moveApprovedListingImages must pass listingId to moveAndOptimizeImage");
184
+ }
185
+ // 4. Verify moveAndOptimizeImage accepts listingId
186
+ const moveOptimizePattern = /async function moveAndOptimizeImage\([^)]*listingId\?: string[^)]*\)/;
187
+ if (moveOptimizePattern.test(content)) {
188
+ console.log(` ${console_chars_1.emoji.success || "[OK]"} moveAndOptimizeImage accepts listingId parameter`);
189
+ }
190
+ else {
191
+ issues.push("moveAndOptimizeImage must accept listingId parameter");
192
+ }
193
+ // Summary
194
+ console.log(`\n${console_chars_1.emoji.chart || "[CHART]"} Summary:`);
195
+ console.log(` Required patterns checked: ${REQUIRED_PATTERNS.length}`);
196
+ console.log(` Forbidden patterns checked: ${FORBIDDEN_PATTERNS.length}`);
197
+ if (warnings.length > 0) {
198
+ console.log(`\n${console_chars_1.emoji.warning || "[WARN]"} Warnings (${warnings.length}):`);
199
+ for (const warning of warnings) {
200
+ console.log(` - ${warning}`);
201
+ }
202
+ }
203
+ if (issues.length === 0) {
204
+ console.log(`\n${console_chars_1.emoji.success || "[OK]"} IMAGE FILENAME UNIQUENESS VALIDATION PASSED`);
205
+ console.log(`\nImage filenames include listing ID suffix to prevent collisions at scale.`);
206
+ console.log(`Example: 2024-topps-mike-trout-100-front-k3p4m5q6.jpg`);
207
+ process.exit(0);
208
+ }
209
+ console.log(`\n${console_chars_1.emoji.error || "[ERROR]"} Found ${issues.length} issues:`);
210
+ for (const issue of issues) {
211
+ console.log(` - ${issue}`);
212
+ }
213
+ console.log(`\n${console_chars_1.emoji.error || "[ERROR]"} IMAGE FILENAME UNIQUENESS VALIDATION FAILED`);
214
+ console.log(`\nWhy this matters:`);
215
+ console.log(` At scale (millions of listings), two sellers listing identical products`);
216
+ console.log(` (e.g., "2024 Topps Mike Trout #100") would generate the same filename,`);
217
+ console.log(` causing one seller's images to overwrite the other's.`);
218
+ console.log(`\nTo fix:`);
219
+ console.log(` 1. Ensure getListingIdSuffix() extracts last 8 chars of listing ID`);
220
+ console.log(` 2. All filename generators must accept and use listingId parameter`);
221
+ console.log(` 3. generateFilename() dispatcher must pass listingId to all handlers`);
222
+ console.log(` 4. handleMetadataAndUpload() must pass listingId when generating filenames`);
223
+ process.exit(1);
224
+ }
225
+ main().catch((err) => {
226
+ console.error(`${console_chars_1.emoji.error || "[ERROR]"} Preflight failed:`, err);
227
+ process.exit(1);
228
+ });
229
+ //# sourceMappingURL=image-filename-uniqueness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-filename-uniqueness.js","sourceRoot":"","sources":["../../../src/checks/card-processing/image-filename-uniqueness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export declare const id = "card-processing/image-processing-config-validation";
3
+ export declare const name = "Image Processing Configuration Validation";
4
+ export declare const description = "Validates image processing configuration consistency and integration";
5
+ export declare const category = "card-processing";
6
+ export declare const blocking = true;
7
+ export declare const tags: string[];
8
+ //# sourceMappingURL=image-processing-config-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-processing-config-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/card-processing/image-processing-config-validation.ts"],"names":[],"mappings":";AAkBA,eAAO,MAAM,EAAE,uDAAuD,CAAC;AACvE,eAAO,MAAM,IAAI,8CAA8C,CAAC;AAChE,eAAO,MAAM,WAAW,yEAAyE,CAAC;AAClG,eAAO,MAAM,QAAQ,oBAAoB,CAAC;AAC1C,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAwE,CAAC"}