@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.
Files changed (79) hide show
  1. package/dist/bin/sync-check.js +6 -4
  2. package/dist/bin/sync-check.js.map +1 -1
  3. package/dist/checks/card-processing/dimension-variance-blocking.d.ts +8 -0
  4. package/dist/checks/card-processing/dimension-variance-blocking.d.ts.map +1 -0
  5. package/dist/checks/card-processing/dimension-variance-blocking.js +256 -0
  6. package/dist/checks/card-processing/dimension-variance-blocking.js.map +1 -0
  7. package/dist/checks/card-processing/edge-detection-integration.d.ts +8 -0
  8. package/dist/checks/card-processing/edge-detection-integration.d.ts.map +1 -0
  9. package/dist/checks/card-processing/edge-detection-integration.js +180 -0
  10. package/dist/checks/card-processing/edge-detection-integration.js.map +1 -0
  11. package/dist/checks/card-processing/front-back-detection-validation.d.ts +8 -0
  12. package/dist/checks/card-processing/front-back-detection-validation.d.ts.map +1 -0
  13. package/dist/checks/card-processing/front-back-detection-validation.js +83 -0
  14. package/dist/checks/card-processing/front-back-detection-validation.js.map +1 -0
  15. package/dist/checks/card-processing/image-deskew-system.d.ts +8 -0
  16. package/dist/checks/card-processing/image-deskew-system.d.ts.map +1 -0
  17. package/dist/checks/card-processing/image-deskew-system.js +62 -0
  18. package/dist/checks/card-processing/image-deskew-system.js.map +1 -0
  19. package/dist/checks/card-processing/image-filename-uniqueness.d.ts +8 -0
  20. package/dist/checks/card-processing/image-filename-uniqueness.d.ts.map +1 -0
  21. package/dist/checks/card-processing/image-filename-uniqueness.js +229 -0
  22. package/dist/checks/card-processing/image-filename-uniqueness.js.map +1 -0
  23. package/dist/checks/card-processing/image-processing-config-validation.d.ts +8 -0
  24. package/dist/checks/card-processing/image-processing-config-validation.d.ts.map +1 -0
  25. package/dist/checks/card-processing/image-processing-config-validation.js +440 -0
  26. package/dist/checks/card-processing/image-processing-config-validation.js.map +1 -0
  27. package/dist/checks/code-quality/price-formatting-consistency.d.ts +28 -0
  28. package/dist/checks/code-quality/price-formatting-consistency.d.ts.map +1 -0
  29. package/dist/checks/code-quality/price-formatting-consistency.js +230 -0
  30. package/dist/checks/code-quality/price-formatting-consistency.js.map +1 -0
  31. package/dist/checks/data/constants-validation.d.ts +19 -0
  32. package/dist/checks/data/constants-validation.d.ts.map +1 -0
  33. package/dist/checks/data/constants-validation.js +297 -0
  34. package/dist/checks/data/constants-validation.js.map +1 -0
  35. package/dist/checks/data/crockford-id-validation.d.ts +24 -0
  36. package/dist/checks/data/crockford-id-validation.d.ts.map +1 -0
  37. package/dist/checks/data/crockford-id-validation.js +227 -0
  38. package/dist/checks/data/crockford-id-validation.js.map +1 -0
  39. package/dist/checks/data/geographic-constants-validation.d.ts +16 -0
  40. package/dist/checks/data/geographic-constants-validation.d.ts.map +1 -0
  41. package/dist/checks/data/geographic-constants-validation.js +168 -0
  42. package/dist/checks/data/geographic-constants-validation.js.map +1 -0
  43. package/dist/checks/data/hardcoded-options-validation.d.ts +24 -0
  44. package/dist/checks/data/hardcoded-options-validation.d.ts.map +1 -0
  45. package/dist/checks/data/hardcoded-options-validation.js +362 -0
  46. package/dist/checks/data/hardcoded-options-validation.js.map +1 -0
  47. package/dist/checks/data/league-data-integrity-with-env.d.ts +14 -0
  48. package/dist/checks/data/league-data-integrity-with-env.d.ts.map +1 -0
  49. package/dist/checks/data/league-data-integrity-with-env.js +21 -0
  50. package/dist/checks/data/league-data-integrity-with-env.js.map +1 -0
  51. package/dist/checks/data/product-slug-architecture.d.ts +36 -0
  52. package/dist/checks/data/product-slug-architecture.d.ts.map +1 -0
  53. package/dist/checks/data/product-slug-architecture.js +167 -0
  54. package/dist/checks/data/product-slug-architecture.js.map +1 -0
  55. package/dist/checks/data/schema-fk-defaults-validation.d.ts +21 -0
  56. package/dist/checks/data/schema-fk-defaults-validation.d.ts.map +1 -0
  57. package/dist/checks/data/schema-fk-defaults-validation.js +168 -0
  58. package/dist/checks/data/schema-fk-defaults-validation.js.map +1 -0
  59. package/dist/checks/ui/admin-filter-patterns.d.ts +27 -0
  60. package/dist/checks/ui/admin-filter-patterns.d.ts.map +1 -0
  61. package/dist/checks/ui/admin-filter-patterns.js +225 -0
  62. package/dist/checks/ui/admin-filter-patterns.js.map +1 -0
  63. package/dist/checks/ui/form-field-variant-consistency.d.ts +28 -0
  64. package/dist/checks/ui/form-field-variant-consistency.d.ts.map +1 -0
  65. package/dist/checks/ui/form-field-variant-consistency.js +218 -0
  66. package/dist/checks/ui/form-field-variant-consistency.js.map +1 -0
  67. package/dist/checks/ui/integration-component-consolidation.d.ts +47 -0
  68. package/dist/checks/ui/integration-component-consolidation.d.ts.map +1 -0
  69. package/dist/checks/ui/integration-component-consolidation.js +383 -0
  70. package/dist/checks/ui/integration-component-consolidation.js.map +1 -0
  71. package/dist/checks/ui/notification-system-consistency.d.ts +42 -0
  72. package/dist/checks/ui/notification-system-consistency.d.ts.map +1 -0
  73. package/dist/checks/ui/notification-system-consistency.js +243 -0
  74. package/dist/checks/ui/notification-system-consistency.js.map +1 -0
  75. package/dist/utils/console-chars.d.ts +18 -10
  76. package/dist/utils/console-chars.d.ts.map +1 -1
  77. package/dist/utils/console-chars.js +19 -5
  78. package/dist/utils/console-chars.js.map +1 -1
  79. 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":";;;;;;;AAuIA,kBAgDC;AAtLD,4CAAoB;AACpB,+BAA4B;AAC5B,6DAAiE;AACjE,wDAA2E;AAE3E;;;;;;;;;;;;;;;;GAgBG;AAEH,kDAAkD;AACrC,QAAA,EAAE,GAAG,gCAAgC,CAAC;AACtC,QAAA,IAAI,GAAG,sCAAsC,CAAC;AAC9C,QAAA,WAAW,GAAG,sEAAsE,CAAC;AACrF,QAAA,QAAQ,GAAG,MAAM,CAAC;AAClB,QAAA,QAAQ,GAAG,IAAI,CAAC;AAChB,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAErE,0BAA0B;AAC1B,IAAI,aAAa,GAAa,EAAE,CAAC;AASjC,yEAAyE;AACzE,MAAM,yBAAyB,GAAG;IAChC;QACE,iDAAiD;QACjD,OAAO,EAAE,+CAA+C;QACxD,IAAI,EAAE,6BAA6B;QACnC,UAAU,EAAE,yGAAyG;KACtH;IACD;QACE,gDAAgD;QAChD,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,kCAAkC;QACxC,UAAU,EAAE,gEAAgE;KAC7E;IACD;QACE,uDAAuD;QACvD,OAAO,EAAE,uCAAuC;QAChD,IAAI,EAAE,uCAAuC;QAC7C,UAAU,EAAE,kFAAkF;KAC/F;IACD;QACE,gCAAgC;QAChC,OAAO,EAAE,sBAAsB;QAC/B,IAAI,EAAE,yCAAyC;QAC/C,UAAU,EAAE,gFAAgF;KAC7F;CACF,CAAC;AAEF,6CAA6C;AAC7C,MAAM,cAAc,GAAG;IACrB,cAAc;IACd,OAAO;IACP,MAAM;IACN,OAAO;IACP,WAAW;IACX,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,OAAO;IACP,qBAAqB,EAAE,yCAAyC;IAChE,QAAQ;CACT,CAAC;AAEF,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACtC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,CACL,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QACxB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QACxB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QACvB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CACzB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,IAAI,aAAa,CAAC,IAAI,CAAC;YAAE,OAAO;QAEhC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,yBAAyB,EAAE,CAAC;YACtE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,KAAK,GAAG,CAAC;oBACf,OAAO,EAAE,IAAI;oBACb,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,GAAG;IACvB,OAAO,CAAC,GAAG,CAAC,IAAA,6BAAa,EAAC,sCAAsC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,GAAG,qBAAK,CAAC,MAAM,mDAAmD,CAAC,CAAC;IAEhF,+BAA+B;IAC/B,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,IAAA,0BAAa,EAAC,2BAA2B,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAA,WAAI,EAAC,eAAe,EAAE;QACxC,MAAM,EAAE,CAAC,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,uBAAuB,CAAC;KACrI,CAAC,CAAC;IAEH,MAAM,SAAS,GAAY,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAA,8BAAiB,EAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,qBAAK,CAAC,OAAO,4CAA4C,CAAC,CAAC;QAC1E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,qBAAK,CAAC,KAAK,UAAU,SAAS,CAAC,MAAM,oCAAoC,CAAC,CAAC;IAE1F,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,IAAI,uEAAuE,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAEvD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC9C,CAAC;AAED,gBAAgB;AAChB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC;IAC3D,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC"}