@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.
- 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,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"}
|