@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,362 @@
|
|
|
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
|
+
/**
|
|
15
|
+
* Hardcoded Options Validation Preflight
|
|
16
|
+
*
|
|
17
|
+
* Detects hardcoded option arrays AND inline MenuItem patterns that should use centralized constants.
|
|
18
|
+
* These patterns indicate dummy/sample data that bypasses the single source of truth.
|
|
19
|
+
*
|
|
20
|
+
* BLOCKING: Yes - hardcoded options cause data inconsistency
|
|
21
|
+
*
|
|
22
|
+
* Run: pnpm preflight:hardcoded-options
|
|
23
|
+
*
|
|
24
|
+
* Detects:
|
|
25
|
+
* 1. const SAMPLE_CATEGORIES = [...] - Local constant definitions
|
|
26
|
+
* 2. <MenuItem value="BASEBALL">Baseball</MenuItem> - Inline enum-like values
|
|
27
|
+
* 3. <MenuItem value="PSA">PSA</MenuItem> - Grading companies
|
|
28
|
+
* 4. <MenuItem value="flat">Flat Rate</MenuItem> - Shipping types
|
|
29
|
+
*/
|
|
30
|
+
// METADATA - Required for plugin loader discovery
|
|
31
|
+
exports.id = "data/hardcoded-options-validation";
|
|
32
|
+
exports.name = "Hardcoded Options Validation";
|
|
33
|
+
exports.description = "Detects hardcoded option arrays that should use centralized constants";
|
|
34
|
+
exports.category = "data";
|
|
35
|
+
exports.blocking = true;
|
|
36
|
+
exports.tags = ["data", "constants", "forms", "options"];
|
|
37
|
+
// Patterns for local constant definitions
|
|
38
|
+
const LOCAL_CONSTANT_PATTERNS = [
|
|
39
|
+
{
|
|
40
|
+
name: "SAMPLE_CATEGORIES",
|
|
41
|
+
pattern: /const\s+SAMPLE_CATEGORIES\s*=\s*\[/,
|
|
42
|
+
suggestion: "Use PRODUCT_TYPE_OPTIONS from @/lib/constants/enums",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "CARD_CATEGORIES (local)",
|
|
46
|
+
pattern: /const\s+CARD_CATEGORIES\s*=\s*\[\s*\{/,
|
|
47
|
+
suggestion: "Use PRODUCT_TYPE_OPTIONS from @/lib/constants/enums",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "Hardcoded category array",
|
|
51
|
+
pattern: /\[\s*\{\s*value:\s*["'](?:BASEBALL|BASKETBALL|FOOTBALL|POKEMON|SPORTS_CARD)["']/,
|
|
52
|
+
suggestion: "Use PRODUCT_TYPE_OPTIONS or SPORT_OPTIONS from @/lib/constants/enums",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "Hardcoded status options",
|
|
56
|
+
pattern: /const\s+(?:STATUS_OPTIONS|ORDER_STATUS_OPTIONS|LISTING_STATUS_OPTIONS)\s*=\s*\[\s*\{/,
|
|
57
|
+
suggestion: "Import from @/lib/constants/enums",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "Hardcoded US states array",
|
|
61
|
+
pattern: /const\s+(?:US_STATES|STATES|STATE_OPTIONS)\s*=\s*\[\s*(?:\{|["'](?:AL|AK|AZ|AR|CA))/,
|
|
62
|
+
suggestion: "Use US_STATES from @/lib/constants/geographic",
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "Hardcoded countries array",
|
|
66
|
+
pattern: /const\s+(?:COUNTRIES|COUNTRY_OPTIONS)\s*=\s*\[\s*\{/,
|
|
67
|
+
suggestion: "Use COUNTRIES from @/lib/constants/geographic",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "Hardcoded shipping carriers",
|
|
71
|
+
pattern: /const\s+(?:CARRIERS|SHIPPING_CARRIERS)\s*=\s*\[\s*\{/,
|
|
72
|
+
suggestion: "Use SHIPPING_CARRIER_OPTIONS from @/lib/constants/shipping",
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
function isCommentLine(line) {
|
|
76
|
+
const trimmed = line.trim();
|
|
77
|
+
return (trimmed.startsWith("//") ||
|
|
78
|
+
trimmed.startsWith("/*") ||
|
|
79
|
+
trimmed.startsWith("*") ||
|
|
80
|
+
trimmed.startsWith("*/"));
|
|
81
|
+
}
|
|
82
|
+
function checkPlayerNameUtilsLexicon(filePath, lines) {
|
|
83
|
+
const issues = [];
|
|
84
|
+
const normalized = filePath.replace(/\\/g, "/");
|
|
85
|
+
if (!normalized.endsWith("lib/player-name-utils.ts")) {
|
|
86
|
+
return issues;
|
|
87
|
+
}
|
|
88
|
+
// Specifically catch regressions where AI re-introduces these lexicons inline
|
|
89
|
+
// instead of using lib/constants/player-name-parsing.ts
|
|
90
|
+
lines.forEach((line, index) => {
|
|
91
|
+
if (isCommentLine(line))
|
|
92
|
+
return;
|
|
93
|
+
if (/const\s+BRANDS\s*=\s*\[/.test(line)) {
|
|
94
|
+
issues.push({
|
|
95
|
+
file: filePath,
|
|
96
|
+
line: index + 1,
|
|
97
|
+
pattern: "BRANDS lexicon in player-name-utils",
|
|
98
|
+
suggestion: "Use PLAYER_NAME_PARSING_BRANDS from @/lib/constants/player-name-parsing",
|
|
99
|
+
code: line.trim().substring(0, 80),
|
|
100
|
+
type: "constant",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (/const\s+SERIES_WORDS\s*=\s*(?:new\s+Set\s*\(\s*)?\[/.test(line)) {
|
|
104
|
+
issues.push({
|
|
105
|
+
file: filePath,
|
|
106
|
+
line: index + 1,
|
|
107
|
+
pattern: "SERIES_WORDS lexicon in player-name-utils",
|
|
108
|
+
suggestion: "Use PLAYER_NAME_PARSING_SERIES_WORDS / PLAYER_NAME_PARSING_SERIES_WORD_SET from @/lib/constants/player-name-parsing",
|
|
109
|
+
code: line.trim().substring(0, 80),
|
|
110
|
+
type: "constant",
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return issues;
|
|
115
|
+
}
|
|
116
|
+
function checkOcrBrandLexicon(filePath, lines) {
|
|
117
|
+
const issues = [];
|
|
118
|
+
const normalized = filePath.replace(/\\/g, "/");
|
|
119
|
+
const isOcrFile = normalized.endsWith("lib/vision/ocr.ts");
|
|
120
|
+
const isImageResolutionFile = normalized.endsWith("lib/image-resolution.ts");
|
|
121
|
+
if (!isOcrFile && !isImageResolutionFile) {
|
|
122
|
+
return issues;
|
|
123
|
+
}
|
|
124
|
+
lines.forEach((line, index) => {
|
|
125
|
+
if (isCommentLine(line))
|
|
126
|
+
return;
|
|
127
|
+
if (/const\s+brands\s*=\s*\[/.test(line)) {
|
|
128
|
+
issues.push({
|
|
129
|
+
file: filePath,
|
|
130
|
+
line: index + 1,
|
|
131
|
+
pattern: "Inline OCR brands lexicon",
|
|
132
|
+
suggestion: "Use OCR_BRAND_KEYWORDS from @/lib/constants/ocr-brand-keywords",
|
|
133
|
+
code: line.trim().substring(0, 80),
|
|
134
|
+
type: "constant",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
return issues;
|
|
139
|
+
}
|
|
140
|
+
// Inline MenuItem patterns - detect hardcoded enum values in JSX
|
|
141
|
+
const INLINE_MENUITEM_PATTERNS = [
|
|
142
|
+
{
|
|
143
|
+
name: "Inline sport MenuItems",
|
|
144
|
+
pattern: /<MenuItem\s+value=["'](BASEBALL|BASKETBALL|FOOTBALL|HOCKEY|SOCCER|GOLF|TENNIS|BOXING|MMA|WRESTLING|RACING)["']/,
|
|
145
|
+
suggestion: "Use SPORT_OPTIONS from @/lib/constants/enums and map over them",
|
|
146
|
+
category: "sports",
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: "Inline TCG game MenuItems",
|
|
150
|
+
pattern: /<MenuItem\s+value=["'](POKEMON|MAGIC_THE_GATHERING|YU_GI_OH|ONE_PIECE|DRAGON_BALL|LORCANA)["']/,
|
|
151
|
+
suggestion: "Use TCG_GAME_OPTIONS from @/lib/constants/enums and map over them",
|
|
152
|
+
category: "tcg",
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: "Inline grading company MenuItems",
|
|
156
|
+
pattern: /<MenuItem\s+value=["'](PSA|BGS|SGC|CGC|CSG|HGA|TAG|AGS)["']>/,
|
|
157
|
+
suggestion: "Use GRADING_COMPANY_OPTIONS from @/lib/constants/enums and map over them",
|
|
158
|
+
category: "grading",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: "Inline business type MenuItems",
|
|
162
|
+
pattern: /<MenuItem\s+value=["'](INDIVIDUAL|BUSINESS)["']>/,
|
|
163
|
+
suggestion: "Use BUSINESS_TYPE_OPTIONS from @/lib/constants/enums and map over them",
|
|
164
|
+
category: "business",
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: "Inline fulfillment type MenuItems",
|
|
168
|
+
pattern: /<MenuItem\s+value=["'](FBM|FBA)["']>/,
|
|
169
|
+
suggestion: "Use FULFILLMENT_TYPE_OPTIONS from @/lib/constants/enums and map over them",
|
|
170
|
+
category: "fulfillment",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "Inline rate type MenuItems",
|
|
174
|
+
pattern: /<MenuItem\s+value=["'](flat|weight_based|price_based|free)["']>/,
|
|
175
|
+
suggestion: "Use RATE_CALCULATION_TYPE_OPTIONS from @/lib/constants/shipping and map over them",
|
|
176
|
+
category: "shipping",
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: "Inline zone type MenuItems",
|
|
180
|
+
pattern: /<MenuItem\s+value=["'](domestic|international|custom)["']>/,
|
|
181
|
+
suggestion: "Use ZONE_TYPE_OPTIONS from @/lib/constants/shipping and map over them",
|
|
182
|
+
category: "zone",
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
name: "Inline quantity discount MenuItems",
|
|
186
|
+
pattern: /<MenuItem\s+value=["'](PERCENTAGE|FIXED_AMOUNT|FREE_SHIPPING)["']>/,
|
|
187
|
+
suggestion: "Use QUANTITY_DISCOUNT_TYPE_OPTIONS from @/lib/constants/shipping and map over them",
|
|
188
|
+
category: "discount",
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: "Inline review status MenuItems",
|
|
192
|
+
pattern: /<MenuItem\s+value=["'](pending|approved|rejected)["']>(?:Pending|Approved|Rejected)/,
|
|
193
|
+
suggestion: "Use REVIEW_STATUS_OPTIONS from @/lib/constants/enums and map over them",
|
|
194
|
+
category: "review",
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: "Inline store sort MenuItems",
|
|
198
|
+
pattern: /<MenuItem\s+value=["'](featured|rating|sales|listings|newest)["']>(?:Featured|Highest|Most|Newest)/,
|
|
199
|
+
suggestion: "Use STORE_SORT_OPTIONS from @/lib/constants/enums and map over them",
|
|
200
|
+
category: "storesort",
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: "Inline condition MenuItems",
|
|
204
|
+
pattern: /<MenuItem\s+value=["'](UNGRADED|MINT|NEAR_MINT|EXCELLENT|VERY_GOOD|GOOD|FAIR|POOR)["']>/,
|
|
205
|
+
suggestion: "Use CONDITION_OPTIONS from @/lib/constants/enums and map over them",
|
|
206
|
+
category: "condition",
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
name: "Inline platform MenuItems",
|
|
210
|
+
pattern: /<MenuItem\s+value=["'](EBAY|AMAZON|TCGPLAYER|SHOPIFY|WOOCOMMERCE)["']>/,
|
|
211
|
+
suggestion: "Use PLATFORM_OPTIONS from @/lib/constants/enums and map over them",
|
|
212
|
+
category: "platform",
|
|
213
|
+
},
|
|
214
|
+
];
|
|
215
|
+
// Note: File exclusions are handled via centralized config in preflight.config.js
|
|
216
|
+
// using getExclusions() and shouldExcludeFile() from @empline/preflight
|
|
217
|
+
function checkFile(filePath) {
|
|
218
|
+
const issues = [];
|
|
219
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
220
|
+
const lines = content.split("\n");
|
|
221
|
+
// Check for local constant definitions
|
|
222
|
+
for (const { name, pattern, suggestion } of LOCAL_CONSTANT_PATTERNS) {
|
|
223
|
+
lines.forEach((line, index) => {
|
|
224
|
+
if (isCommentLine(line))
|
|
225
|
+
return;
|
|
226
|
+
if (pattern.test(line)) {
|
|
227
|
+
issues.push({
|
|
228
|
+
file: filePath,
|
|
229
|
+
line: index + 1,
|
|
230
|
+
pattern: name,
|
|
231
|
+
suggestion,
|
|
232
|
+
code: line.trim().substring(0, 80),
|
|
233
|
+
type: "constant",
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
issues.push(...checkPlayerNameUtilsLexicon(filePath, lines));
|
|
239
|
+
issues.push(...checkOcrBrandLexicon(filePath, lines));
|
|
240
|
+
// Check for inline MenuItem patterns - group by category
|
|
241
|
+
const menuItemGroups = new Map();
|
|
242
|
+
for (const { name, pattern, suggestion, category } of INLINE_MENUITEM_PATTERNS) {
|
|
243
|
+
lines.forEach((line, index) => {
|
|
244
|
+
if (isCommentLine(line))
|
|
245
|
+
return;
|
|
246
|
+
if (pattern.test(line)) {
|
|
247
|
+
const key = `${category}-${filePath}`;
|
|
248
|
+
if (!menuItemGroups.has(key)) {
|
|
249
|
+
menuItemGroups.set(key, {
|
|
250
|
+
name,
|
|
251
|
+
suggestion,
|
|
252
|
+
category,
|
|
253
|
+
lines: [],
|
|
254
|
+
firstLine: index + 1,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
menuItemGroups.get(key).lines.push(index + 1);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
// Convert grouped MenuItems to issues (one per category per file)
|
|
262
|
+
for (const [key, group] of menuItemGroups) {
|
|
263
|
+
if (group.lines.length >= 2) {
|
|
264
|
+
issues.push({
|
|
265
|
+
file: filePath,
|
|
266
|
+
line: group.firstLine,
|
|
267
|
+
pattern: group.name,
|
|
268
|
+
suggestion: group.suggestion,
|
|
269
|
+
code: `${group.lines.length} inline MenuItems found (lines: ${group.lines.slice(0, 5).join(", ")}${group.lines.length > 5 ? "..." : ""})`,
|
|
270
|
+
type: "inline",
|
|
271
|
+
count: group.lines.length,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return issues;
|
|
276
|
+
}
|
|
277
|
+
async function main() {
|
|
278
|
+
const args = process.argv.slice(2);
|
|
279
|
+
const verbose = args.includes("--verbose") || args.includes("-v");
|
|
280
|
+
const warnOnly = args.includes("--warn");
|
|
281
|
+
console.log(`${console_chars_1.emoji.search} Checking for hardcoded options arrays and inline MenuItems...\n`);
|
|
282
|
+
// Load app-specific exclusions from config
|
|
283
|
+
appExclusions = await (0, exclusions_1.getExclusions)(exports.id);
|
|
284
|
+
const allFiles = glob_1.glob.sync("**/*.{ts,tsx}", {
|
|
285
|
+
ignore: ["node_modules/**", ".next/**", "dist/**"],
|
|
286
|
+
});
|
|
287
|
+
const files = allFiles.filter((file) => !(0, exclusions_1.shouldExcludeFile)(file, appExclusions));
|
|
288
|
+
let totalIssues = [];
|
|
289
|
+
for (const file of files) {
|
|
290
|
+
const issues = checkFile(file);
|
|
291
|
+
if (issues.length > 0) {
|
|
292
|
+
totalIssues.push(...issues);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (totalIssues.length === 0) {
|
|
296
|
+
console.log(`${console_chars_1.emoji.success} No hardcoded options arrays or inline MenuItems found\n`);
|
|
297
|
+
process.exit(0);
|
|
298
|
+
}
|
|
299
|
+
const constantIssues = totalIssues.filter((i) => i.type === "constant");
|
|
300
|
+
const inlineIssues = totalIssues.filter((i) => i.type === "inline");
|
|
301
|
+
console.log(`${warnOnly ? "${emoji.warning}" : "${emoji.error}"} Found ${totalIssues.length} hardcoded option issue(s):\n`);
|
|
302
|
+
if (constantIssues.length > 0) {
|
|
303
|
+
console.log((0, console_chars_1.createDivider)(60, "heavy"));
|
|
304
|
+
console.log(`${console_chars_1.emoji.package} LOCAL CONSTANT DEFINITIONS (${constantIssues.length})`);
|
|
305
|
+
console.log((0, console_chars_1.createDivider)(60, "heavy"));
|
|
306
|
+
const byFile = {};
|
|
307
|
+
for (const issue of constantIssues) {
|
|
308
|
+
if (!byFile[issue.file])
|
|
309
|
+
byFile[issue.file] = [];
|
|
310
|
+
byFile[issue.file].push(issue);
|
|
311
|
+
}
|
|
312
|
+
for (const [file, issues] of Object.entries(byFile)) {
|
|
313
|
+
console.log(`\n${console_chars_1.emoji.file} ${file}`);
|
|
314
|
+
for (const issue of issues) {
|
|
315
|
+
console.log(` Line ${issue.line}: ${issue.pattern}`);
|
|
316
|
+
if (verbose)
|
|
317
|
+
console.log(` Code: ${issue.code}`);
|
|
318
|
+
console.log(` ${console_chars_1.emoji.hint} ${issue.suggestion}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (inlineIssues.length > 0) {
|
|
323
|
+
console.log("\n" + (0, console_chars_1.createDivider)(60, "heavy"));
|
|
324
|
+
console.log(`INLINE MENUITEM PATTERNS (${inlineIssues.length})`);
|
|
325
|
+
console.log((0, console_chars_1.createDivider)(60, "heavy"));
|
|
326
|
+
const byFile = {};
|
|
327
|
+
for (const issue of inlineIssues) {
|
|
328
|
+
if (!byFile[issue.file])
|
|
329
|
+
byFile[issue.file] = [];
|
|
330
|
+
byFile[issue.file].push(issue);
|
|
331
|
+
}
|
|
332
|
+
for (const [file, issues] of Object.entries(byFile)) {
|
|
333
|
+
console.log(`\n${console_chars_1.emoji.file} ${file}`);
|
|
334
|
+
for (const issue of issues) {
|
|
335
|
+
console.log(` ${issue.pattern}`);
|
|
336
|
+
console.log(` ${issue.code}`);
|
|
337
|
+
console.log(` ${console_chars_1.emoji.hint} ${issue.suggestion}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
console.log("\n" + (0, console_chars_1.createDivider)(60, "light"));
|
|
342
|
+
console.log(`\nTotal: ${totalIssues.length} issue(s)`);
|
|
343
|
+
console.log(` - ${constantIssues.length} local constant definition(s)`);
|
|
344
|
+
console.log(` - ${inlineIssues.length} inline MenuItem pattern(s)`);
|
|
345
|
+
console.log(`\n${console_chars_1.emoji.clipboard} How to fix inline MenuItems:\n`);
|
|
346
|
+
console.log("Instead of:");
|
|
347
|
+
console.log(' <MenuItem value="BASEBALL">Baseball</MenuItem>');
|
|
348
|
+
console.log(' <MenuItem value="BASKETBALL">Basketball</MenuItem>');
|
|
349
|
+
console.log("\nUse:");
|
|
350
|
+
console.log(' import { SPORT_OPTIONS } from "@/lib/constants/enums";');
|
|
351
|
+
console.log(" {SPORT_OPTIONS.map(option => (");
|
|
352
|
+
console.log(" <MenuItem key={option.value} value={option.value}>");
|
|
353
|
+
console.log(" {option.label}");
|
|
354
|
+
console.log(" </MenuItem>");
|
|
355
|
+
console.log(" ))}");
|
|
356
|
+
process.exit(warnOnly ? 0 : 1);
|
|
357
|
+
}
|
|
358
|
+
main().catch((err) => {
|
|
359
|
+
console.error("Error:", err);
|
|
360
|
+
process.exit(1);
|
|
361
|
+
});
|
|
362
|
+
//# sourceMappingURL=hardcoded-options-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hardcoded-options-validation.js","sourceRoot":"","sources":["../../../src/checks/data/hardcoded-options-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* League Data Integrity Check
|
|
4
|
+
*
|
|
5
|
+
* Validates league reference data integrity.
|
|
6
|
+
* This check is consolidated into the Database module.
|
|
7
|
+
*/
|
|
8
|
+
export declare const id = "data/league-data-integrity-with-env";
|
|
9
|
+
export declare const name = "League Data Integrity";
|
|
10
|
+
export declare const description = "Validates league reference data integrity (consolidated into Database module)";
|
|
11
|
+
export declare const category = "data";
|
|
12
|
+
export declare const blocking = false;
|
|
13
|
+
export declare const tags: string[];
|
|
14
|
+
//# sourceMappingURL=league-data-integrity-with-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"league-data-integrity-with-env.d.ts","sourceRoot":"","sources":["../../../src/checks/data/league-data-integrity-with-env.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAIH,eAAO,MAAM,EAAE,wCAAwC,CAAC;AACxD,eAAO,MAAM,IAAI,0BAA0B,CAAC;AAC5C,eAAO,MAAM,WAAW,kFAAkF,CAAC;AAC3G,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,IAAI,UAAuC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* League Data Integrity Check
|
|
5
|
+
*
|
|
6
|
+
* Validates league reference data integrity.
|
|
7
|
+
* This check is consolidated into the Database module.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
|
|
11
|
+
// METADATA - Required for plugin loader discovery
|
|
12
|
+
exports.id = "data/league-data-integrity-with-env";
|
|
13
|
+
exports.name = "League Data Integrity";
|
|
14
|
+
exports.description = "Validates league reference data integrity (consolidated into Database module)";
|
|
15
|
+
exports.category = "data";
|
|
16
|
+
exports.blocking = false;
|
|
17
|
+
exports.tags = ["data", "league", "reference-data"];
|
|
18
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
19
|
+
console.log(`${console_chars_1.emoji.success} League Data integrity check passed (consolidated into Database module)`);
|
|
20
|
+
process.exit(0);
|
|
21
|
+
//# sourceMappingURL=league-data-integrity-with-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"league-data-integrity-with-env.js","sourceRoot":"","sources":["../../../src/checks/data/league-data-integrity-with-env.ts"],"names":[],"mappings":";;AAEA;;;;;GAKG;;;AAEH,kDAAkD;AAErC,QAAA,EAAE,GAAG,qCAAqC,CAAC;AAC3C,QAAA,IAAI,GAAG,uBAAuB,CAAC;AAC/B,QAAA,WAAW,GAAG,+EAA+E,CAAC;AAC9F,QAAA,QAAQ,GAAG,MAAM,CAAC;AAClB,QAAA,QAAQ,GAAG,KAAK,CAAC;AACjB,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AAEzD,6DAAkD;AAClD,OAAO,CAAC,GAAG,CACT,GAAG,qBAAK,CAAC,OAAO,yEAAyE,CAC1F,CAAC;AACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Product Slug Architecture Validation Preflight
|
|
4
|
+
*
|
|
5
|
+
* Validates that product URLs are based on catalog cards, not individual listings.
|
|
6
|
+
* Product pages should use canonical catalog-card-based slugs that are human-readable
|
|
7
|
+
* and don't include arbitrary listing ID suffixes.
|
|
8
|
+
*
|
|
9
|
+
* BLOCKING: Yes - listing-based slugs like "card-name-2" are confusing to users
|
|
10
|
+
*
|
|
11
|
+
* Run: pnpm preflight:product-slug-architecture
|
|
12
|
+
*
|
|
13
|
+
* Validates:
|
|
14
|
+
* - Slug generation uses catalog card data, not listing IDs
|
|
15
|
+
* - Slugs don't end in numeric suffixes from listing IDs
|
|
16
|
+
* - Product URLs should be like /product/2021-panini-contenders-deandre-hopkins
|
|
17
|
+
* NOT like /product/2021-panini-contenders-deandre-hopkins-abc123
|
|
18
|
+
*/
|
|
19
|
+
export declare const id = "data/product-slug-architecture";
|
|
20
|
+
export declare const name = "Product Slug Architecture Validation";
|
|
21
|
+
export declare const description = "Validates product slugs are catalog-card-based, not listing-ID-based";
|
|
22
|
+
export declare const category = "data";
|
|
23
|
+
export declare const blocking = true;
|
|
24
|
+
export declare const tags: string[];
|
|
25
|
+
interface Issue {
|
|
26
|
+
file: string;
|
|
27
|
+
line: number;
|
|
28
|
+
pattern: string;
|
|
29
|
+
suggestion: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function run(): Promise<{
|
|
32
|
+
passed: boolean;
|
|
33
|
+
issues: Issue[];
|
|
34
|
+
}>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=product-slug-architecture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-slug-architecture.d.ts","sourceRoot":"","sources":["../../../src/checks/data/product-slug-architecture.ts"],"names":[],"mappings":";AAMA;;;;;;;;;;;;;;;;GAgBG;AAGH,eAAO,MAAM,EAAE,mCAAmC,CAAC;AACnD,eAAO,MAAM,IAAI,yCAAyC,CAAC;AAC3D,eAAO,MAAM,WAAW,yEAAyE,CAAC;AAClG,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAmD,CAAC;AAKrE,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AA+FD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC,CAgDzE"}
|
|
@@ -0,0 +1,167 @@
|
|
|
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
|
+
exports.run = run;
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const glob_1 = require("glob");
|
|
11
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
12
|
+
const exclusions_1 = require("../../shared/exclusions");
|
|
13
|
+
/**
|
|
14
|
+
* Product Slug Architecture Validation Preflight
|
|
15
|
+
*
|
|
16
|
+
* Validates that product URLs are based on catalog cards, not individual listings.
|
|
17
|
+
* Product pages should use canonical catalog-card-based slugs that are human-readable
|
|
18
|
+
* and don't include arbitrary listing ID suffixes.
|
|
19
|
+
*
|
|
20
|
+
* BLOCKING: Yes - listing-based slugs like "card-name-2" are confusing to users
|
|
21
|
+
*
|
|
22
|
+
* Run: pnpm preflight:product-slug-architecture
|
|
23
|
+
*
|
|
24
|
+
* Validates:
|
|
25
|
+
* - Slug generation uses catalog card data, not listing IDs
|
|
26
|
+
* - Slugs don't end in numeric suffixes from listing IDs
|
|
27
|
+
* - Product URLs should be like /product/2021-panini-contenders-deandre-hopkins
|
|
28
|
+
* NOT like /product/2021-panini-contenders-deandre-hopkins-abc123
|
|
29
|
+
*/
|
|
30
|
+
// METADATA - Required for plugin loader discovery
|
|
31
|
+
exports.id = "data/product-slug-architecture";
|
|
32
|
+
exports.name = "Product Slug Architecture Validation";
|
|
33
|
+
exports.description = "Validates product slugs are catalog-card-based, not listing-ID-based";
|
|
34
|
+
exports.category = "data";
|
|
35
|
+
exports.blocking = true;
|
|
36
|
+
exports.tags = ["data", "slugs", "urls", "seo", "architecture"];
|
|
37
|
+
// App-specific exclusions
|
|
38
|
+
let appExclusions = [];
|
|
39
|
+
// Patterns that indicate listing-ID-based slug generation (anti-pattern)
|
|
40
|
+
const PROBLEMATIC_SLUG_PATTERNS = [
|
|
41
|
+
{
|
|
42
|
+
// Slug generation that appends listing ID suffix
|
|
43
|
+
pattern: /slug.*=.*listingId\.split\(['"_"']\)\.pop\(\)/,
|
|
44
|
+
name: "Slug uses listing ID suffix",
|
|
45
|
+
suggestion: "Product slugs should be generated from catalog card data (year, brand, series, player), not listing IDs",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
// Template literal appending listing ID to slug
|
|
49
|
+
pattern: /`\$\{baseSlug\}-\$\{listingId/,
|
|
50
|
+
name: "Slug template appends listing ID",
|
|
51
|
+
suggestion: "Use catalog card identifiers for unique slugs, not listing IDs",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
// generateSlug function that takes listingId parameter
|
|
55
|
+
pattern: /function generateSlug\([^)]*listingId/,
|
|
56
|
+
name: "generateSlug function takes listingId",
|
|
57
|
+
suggestion: "Slug generation should not depend on listing IDs - use catalog card data instead",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
// Slug based on listingId.split
|
|
61
|
+
pattern: /\$\{listingId\.split/,
|
|
62
|
+
name: "Slug constructed from listingId.split()",
|
|
63
|
+
suggestion: "Catalog card slugs should be deterministic from card metadata, not listing IDs",
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
// Files/directories to exclude from checking
|
|
67
|
+
const EXCLUDED_PATHS = [
|
|
68
|
+
"node_modules",
|
|
69
|
+
".next",
|
|
70
|
+
"dist",
|
|
71
|
+
"build",
|
|
72
|
+
"__tests__",
|
|
73
|
+
"tests/",
|
|
74
|
+
"*.test.ts",
|
|
75
|
+
"*.test.tsx",
|
|
76
|
+
"*.spec.ts",
|
|
77
|
+
"*.spec.tsx",
|
|
78
|
+
"docs/",
|
|
79
|
+
"scripts/preflights/", // Don't check preflight files themselves
|
|
80
|
+
"*.d.ts",
|
|
81
|
+
];
|
|
82
|
+
function isExcludedPath(filePath) {
|
|
83
|
+
const normalized = filePath.replace(/\\/g, "/");
|
|
84
|
+
return EXCLUDED_PATHS.some((excluded) => {
|
|
85
|
+
if (excluded.startsWith("*.")) {
|
|
86
|
+
return normalized.endsWith(excluded.slice(1));
|
|
87
|
+
}
|
|
88
|
+
return normalized.includes(excluded);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function isCommentLine(line) {
|
|
92
|
+
const trimmed = line.trim();
|
|
93
|
+
return (trimmed.startsWith("//") ||
|
|
94
|
+
trimmed.startsWith("/*") ||
|
|
95
|
+
trimmed.startsWith("*") ||
|
|
96
|
+
trimmed.startsWith("*/"));
|
|
97
|
+
}
|
|
98
|
+
function checkFile(filePath) {
|
|
99
|
+
const issues = [];
|
|
100
|
+
if (isExcludedPath(filePath)) {
|
|
101
|
+
return issues;
|
|
102
|
+
}
|
|
103
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
104
|
+
const lines = content.split("\n");
|
|
105
|
+
lines.forEach((line, index) => {
|
|
106
|
+
if (isCommentLine(line))
|
|
107
|
+
return;
|
|
108
|
+
for (const { pattern, name, suggestion } of PROBLEMATIC_SLUG_PATTERNS) {
|
|
109
|
+
if (pattern.test(line)) {
|
|
110
|
+
issues.push({
|
|
111
|
+
file: filePath,
|
|
112
|
+
line: index + 1,
|
|
113
|
+
pattern: name,
|
|
114
|
+
suggestion,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return issues;
|
|
120
|
+
}
|
|
121
|
+
async function run() {
|
|
122
|
+
console.log((0, console_chars_1.createDivider)("Product Slug Architecture Validation"));
|
|
123
|
+
console.log(`${console_chars_1.emoji.search} Checking for listing-ID-based slug patterns...\n`);
|
|
124
|
+
// Load app-specific exclusions
|
|
125
|
+
try {
|
|
126
|
+
appExclusions = await (0, exclusions_1.getExclusions)("product-slug-architecture");
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
appExclusions = [];
|
|
130
|
+
}
|
|
131
|
+
const files = await (0, glob_1.glob)("**/*.{ts,tsx}", {
|
|
132
|
+
ignore: ["node_modules/**", ".next/**", "dist/**", "build/**", "**/*.d.ts", "**/*.test.ts", "**/*.spec.ts", "scripts/preflights/**"],
|
|
133
|
+
});
|
|
134
|
+
const allIssues = [];
|
|
135
|
+
for (const file of files) {
|
|
136
|
+
if ((0, exclusions_1.shouldExcludeFile)(file, appExclusions)) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
const issues = checkFile(file);
|
|
140
|
+
allIssues.push(...issues);
|
|
141
|
+
}
|
|
142
|
+
if (allIssues.length === 0) {
|
|
143
|
+
console.log(`${console_chars_1.emoji.success} No listing-ID-based slug patterns found\n`);
|
|
144
|
+
return { passed: true, issues: [] };
|
|
145
|
+
}
|
|
146
|
+
console.log(`${console_chars_1.emoji.error} Found ${allIssues.length} listing-ID-based slug issue(s):\n`);
|
|
147
|
+
for (const issue of allIssues) {
|
|
148
|
+
console.log(` ${console_chars_1.emoji.warning} ${issue.file}:${issue.line}`);
|
|
149
|
+
console.log(` Pattern: ${issue.pattern}`);
|
|
150
|
+
console.log(` Fix: ${issue.suggestion}\n`);
|
|
151
|
+
}
|
|
152
|
+
console.log(`\n${console_chars_1.emoji.info} Product slugs should be based on CATALOG CARD data, not listing IDs.`);
|
|
153
|
+
console.log(` Good: /product/2021-panini-contenders-deandre-hopkins`);
|
|
154
|
+
console.log(` Bad: /product/2021-panini-contenders-deandre-hopkins-abc123`);
|
|
155
|
+
console.log(`\n Catalog-based slugs are:`);
|
|
156
|
+
console.log(` - Human-readable and SEO-friendly`);
|
|
157
|
+
console.log(` - Shared across all listings for the same card`);
|
|
158
|
+
console.log(` - Deterministic from card metadata\n`);
|
|
159
|
+
return { passed: false, issues: allIssues };
|
|
160
|
+
}
|
|
161
|
+
// CLI execution
|
|
162
|
+
if (process.argv[1]?.includes("product-slug-architecture")) {
|
|
163
|
+
run().then(({ passed }) => {
|
|
164
|
+
process.exit(passed ? 0 : 1);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=product-slug-architecture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-slug-architecture.js","sourceRoot":"","sources":["../../../src/checks/data/product-slug-architecture.ts"],"names":[],"mappings":"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"}
|