@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,227 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Crockford ID Validation Preflight Check
5
+ *
6
+ * Prevents @default(cuid()) from being added to schema when Crockford middleware is active.
7
+ *
8
+ * CRITICAL: We use Crockford Base32 IDs with entity prefixes (usr_, lst_, ord_) via middleware.
9
+ * The @default(cuid()) directive conflicts with this system and should never be used.
10
+ *
11
+ * Rules:
12
+ * 1. No @default(cuid()) in schema (conflicts with Crockford middleware)
13
+ * 2. Middleware must have createIdExtension() active
14
+ * 3. User-facing models should NOT have @default() on id field
15
+ * 4. System/analytics tables can use @default(dbgenerated("gen_random_uuid()"))
16
+ *
17
+ * Cost: Prevents ID generation conflicts and ensures consistent entity prefixes
18
+ */
19
+ var __importDefault = (this && this.__importDefault) || function (mod) {
20
+ return (mod && mod.__esModule) ? mod : { "default": mod };
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
24
+ // METADATA - Required for plugin loader discovery
25
+ exports.id = "data/crockford-id-validation";
26
+ exports.name = "Crockford ID Validation";
27
+ exports.description = "Validates Crockford Base32 ID generation and prevents @default(cuid()) conflicts";
28
+ exports.category = "data";
29
+ exports.blocking = true;
30
+ exports.tags = ["data", "prisma", "ids", "crockford"];
31
+ const fs_1 = __importDefault(require("fs"));
32
+ const path_1 = __importDefault(require("path"));
33
+ const console_chars_1 = require("../../utils/console-chars");
34
+ const colors = {
35
+ reset: "\x1b[0m",
36
+ red: "\x1b[31m",
37
+ green: "\x1b[32m",
38
+ yellow: "\x1b[33m",
39
+ blue: "\x1b[34m",
40
+ cyan: "\x1b[36m",
41
+ };
42
+ console.log(`${colors.cyan}${console_chars_1.emoji.search} Crockford ID Validation Preflight Check${colors.reset}\n`);
43
+ let hasErrors = false;
44
+ let hasWarnings = false;
45
+ const errors = [];
46
+ const warnings = [];
47
+ // Check 1: No @default(cuid()) in schema
48
+ console.log(`${colors.blue}${console_chars_1.emoji.clipboard} Checking for @default(cuid()) in schema...${colors.reset}`);
49
+ const schemaPath = path_1.default.join(process.cwd(), "prisma", "schema.prisma");
50
+ if (!fs_1.default.existsSync(schemaPath)) {
51
+ errors.push(`${console_chars_1.emoji.error} prisma/schema.prisma not found`);
52
+ hasErrors = true;
53
+ }
54
+ else {
55
+ const schemaContent = fs_1.default.readFileSync(schemaPath, "utf-8");
56
+ const lines = schemaContent.split("\n");
57
+ const cuidMatches = [];
58
+ lines.forEach((line, index) => {
59
+ if (line.includes("@default(cuid())")) {
60
+ cuidMatches.push({
61
+ line: index + 1,
62
+ content: line.trim(),
63
+ });
64
+ }
65
+ });
66
+ if (cuidMatches.length > 0) {
67
+ hasErrors = true;
68
+ errors.push(`${console_chars_1.emoji.error} Found ${cuidMatches.length} @default(cuid()) directive(s) in schema`);
69
+ errors.push(" This conflicts with Crockford ID middleware!");
70
+ errors.push("");
71
+ cuidMatches.forEach((match) => {
72
+ errors.push(` Line ${match.line}: ${match.content}`);
73
+ });
74
+ errors.push("");
75
+ errors.push(` ${console_chars_1.emoji.hint} Fix: Remove @default(cuid()) - middleware handles ID generation`);
76
+ errors.push(" Example: id String @id // Remove @default(cuid())");
77
+ }
78
+ else {
79
+ console.log(` ${colors.green}${console_chars_1.emoji.success} No @default(cuid()) found${colors.reset}`);
80
+ }
81
+ }
82
+ // Check 2: Verify Crockford middleware exists and is active
83
+ console.log(`${colors.blue}${console_chars_1.emoji.clipboard} Checking Crockford middleware...${colors.reset}`);
84
+ const middlewarePath = path_1.default.join(process.cwd(), "lib", "prisma-middleware.ts");
85
+ if (!fs_1.default.existsSync(middlewarePath)) {
86
+ errors.push(`${console_chars_1.emoji.error} lib/prisma-middleware.ts not found`);
87
+ errors.push(" Crockford ID generation middleware is missing!");
88
+ hasErrors = true;
89
+ }
90
+ else {
91
+ const middlewareContent = fs_1.default.readFileSync(middlewarePath, "utf-8");
92
+ if (!middlewareContent.includes("createIdExtension")) {
93
+ errors.push(`${console_chars_1.emoji.error} createIdExtension() not found in middleware`);
94
+ errors.push(" Crockford ID generation is not implemented!");
95
+ hasErrors = true;
96
+ }
97
+ else {
98
+ console.log(` ${colors.green}${console_chars_1.emoji.success} createIdExtension() found${colors.reset}`);
99
+ }
100
+ if (!middlewareContent.includes("generatePrefixedId")) {
101
+ warnings.push(`${console_chars_1.emoji.warning} generatePrefixedId() not found in middleware`);
102
+ warnings.push(" Entity prefixes may not be working correctly");
103
+ hasWarnings = true;
104
+ }
105
+ }
106
+ // Check 3: Verify Crockford ID library exists
107
+ console.log(`${colors.blue}${console_chars_1.emoji.clipboard} Checking Crockford ID library...${colors.reset}`);
108
+ const crockfordPath = path_1.default.join(process.cwd(), "lib", "crockford-id.ts");
109
+ if (!fs_1.default.existsSync(crockfordPath)) {
110
+ errors.push(`${console_chars_1.emoji.error} lib/crockford-id.ts not found`);
111
+ errors.push(" Crockford ID generation library is missing!");
112
+ hasErrors = true;
113
+ }
114
+ else {
115
+ const crockfordContent = fs_1.default.readFileSync(crockfordPath, "utf-8");
116
+ if (!crockfordContent.includes("generateId")) {
117
+ errors.push(`${console_chars_1.emoji.error} generateId() not found in crockford-id.ts`);
118
+ hasErrors = true;
119
+ }
120
+ else {
121
+ console.log(` ${colors.green}${console_chars_1.emoji.success} Crockford ID library found${colors.reset}`);
122
+ }
123
+ }
124
+ // Check 4: Verify middleware is applied in prisma.ts
125
+ console.log(`${colors.blue}${console_chars_1.emoji.clipboard} Checking middleware application...${colors.reset}`);
126
+ const prismaClientPath = path_1.default.join(process.cwd(), "lib", "prisma.ts");
127
+ if (!fs_1.default.existsSync(prismaClientPath)) {
128
+ warnings.push(`${console_chars_1.emoji.warning} lib/prisma.ts not found`);
129
+ warnings.push(" Cannot verify middleware is applied");
130
+ hasWarnings = true;
131
+ }
132
+ else {
133
+ const prismaContent = fs_1.default.readFileSync(prismaClientPath, "utf-8");
134
+ if (!prismaContent.includes("createIdExtension")) {
135
+ errors.push(`${console_chars_1.emoji.error} createIdExtension() not applied in lib/prisma.ts`);
136
+ errors.push(" Middleware exists but is not being used!");
137
+ hasErrors = true;
138
+ }
139
+ else if (!prismaContent.includes("$extends(createIdExtension())")) {
140
+ warnings.push(`${console_chars_1.emoji.warning} createIdExtension() imported but may not be applied correctly`);
141
+ warnings.push(" Verify: client.$extends(createIdExtension())");
142
+ hasWarnings = true;
143
+ }
144
+ else {
145
+ console.log(` ${colors.green}${console_chars_1.emoji.success} Middleware applied correctly${colors.reset}`);
146
+ }
147
+ }
148
+ // Check 5: Warn about user-facing models with @default() on id
149
+ console.log(`${colors.blue}${console_chars_1.emoji.clipboard} Checking for user-facing models with @default() on id...${colors.reset}`);
150
+ if (fs_1.default.existsSync(schemaPath)) {
151
+ const schemaContent = fs_1.default.readFileSync(schemaPath, "utf-8");
152
+ const lines = schemaContent.split("\n");
153
+ const userFacingModels = [
154
+ "User",
155
+ "Store",
156
+ "Organization",
157
+ "Listing",
158
+ "Order",
159
+ "Card",
160
+ "TcgCard",
161
+ "NonSportsCard",
162
+ "VideoGame",
163
+ "Autograph",
164
+ "Ticket",
165
+ "UserCollection",
166
+ "CardSet",
167
+ ];
168
+ let currentModel = null;
169
+ const modelsWithDefaults = [];
170
+ lines.forEach((line, index) => {
171
+ const modelMatch = line.match(/^model\s+(\w+)/);
172
+ if (modelMatch) {
173
+ currentModel = modelMatch[1];
174
+ }
175
+ if (currentModel && userFacingModels.includes(currentModel)) {
176
+ if (line.includes("id") && line.includes("@id") && line.includes("@default(")) {
177
+ // Allow dbgenerated for system tables
178
+ if (!line.includes("dbgenerated")) {
179
+ modelsWithDefaults.push({
180
+ model: currentModel,
181
+ line: index + 1,
182
+ content: line.trim(),
183
+ });
184
+ }
185
+ }
186
+ }
187
+ });
188
+ if (modelsWithDefaults.length > 0) {
189
+ hasWarnings = true;
190
+ warnings.push(`${console_chars_1.emoji.warning} Found ${modelsWithDefaults.length} user-facing model(s) with @default() on id field`);
191
+ warnings.push(" Middleware should handle ID generation, not schema defaults");
192
+ warnings.push("");
193
+ modelsWithDefaults.forEach((match) => {
194
+ warnings.push(` ${match.model} (Line ${match.line}): ${match.content}`);
195
+ });
196
+ }
197
+ else {
198
+ console.log(` ${colors.green}${console_chars_1.emoji.success} User-facing models use middleware for IDs${colors.reset}`);
199
+ }
200
+ }
201
+ // Print summary
202
+ console.log("");
203
+ console.log(`${colors.cyan}${(0, console_chars_1.createDivider)(56, "double")}${colors.reset}`);
204
+ if (hasErrors) {
205
+ console.log(`${colors.red}${console_chars_1.emoji.error} PREFLIGHT FAILED${colors.reset}\n`);
206
+ errors.forEach((error) => console.log(`${colors.red}${error}${colors.reset}`));
207
+ console.log("");
208
+ }
209
+ if (hasWarnings) {
210
+ console.log(`${colors.yellow}${console_chars_1.emoji.warning} WARNINGS${colors.reset}\n`);
211
+ warnings.forEach((warning) => console.log(`${colors.yellow}${warning}${colors.reset}`));
212
+ console.log("");
213
+ }
214
+ if (!hasErrors && !hasWarnings) {
215
+ console.log(`${colors.green}${console_chars_1.emoji.success} All Crockford ID validation checks passed!${colors.reset}\n`);
216
+ console.log(` ${console_chars_1.chars.check} No @default(cuid()) conflicts`);
217
+ console.log(` ${console_chars_1.chars.check} Crockford middleware active`);
218
+ console.log(` ${console_chars_1.chars.check} Entity prefixes working`);
219
+ console.log(` ${console_chars_1.chars.check} ID generation consistent`);
220
+ }
221
+ console.log(`${colors.cyan}${console_chars_1.box.doubleHorizontal.repeat(56)}${colors.reset}\n`);
222
+ // Exit with appropriate code
223
+ if (hasErrors) {
224
+ process.exit(1);
225
+ }
226
+ process.exit(0);
227
+ //# sourceMappingURL=crockford-id-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crockford-id-validation.js","sourceRoot":"","sources":["../../../src/checks/data/crockford-id-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Geographic Constants Validation Preflight
4
+ *
5
+ * Ensures all geographic data (US_STATES, COUNTRIES, CA_PROVINCES) is imported
6
+ * from the centralized location: @/lib/constants/geographic
7
+ *
8
+ * Run: pnpm preflight:geographic-constants
9
+ */
10
+ export declare const id = "data/geographic-constants-validation";
11
+ export declare const name = "Geographic Constants Validation";
12
+ export declare const description = "Ensures geographic data is imported from centralized location";
13
+ export declare const category = "data";
14
+ export declare const blocking = true;
15
+ export declare const tags: string[];
16
+ //# sourceMappingURL=geographic-constants-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geographic-constants-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/data/geographic-constants-validation.ts"],"names":[],"mappings":";AASA;;;;;;;GAOG;AAIH,eAAO,MAAM,EAAE,yCAAyC,CAAC;AACzD,eAAO,MAAM,IAAI,oCAAoC,CAAC;AACtD,eAAO,MAAM,WAAW,kEAAkE,CAAC;AAC3F,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAsC,CAAC"}
@@ -0,0 +1,168 @@
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
+ * Geographic Constants Validation Preflight
16
+ *
17
+ * Ensures all geographic data (US_STATES, COUNTRIES, CA_PROVINCES) is imported
18
+ * from the centralized location: @/lib/constants/geographic
19
+ *
20
+ * Run: pnpm preflight:geographic-constants
21
+ */
22
+ // METADATA - Required for plugin loader discovery
23
+ exports.id = "data/geographic-constants-validation";
24
+ exports.name = "Geographic Constants Validation";
25
+ exports.description = "Ensures geographic data is imported from centralized location";
26
+ exports.category = "data";
27
+ exports.blocking = true;
28
+ exports.tags = ["data", "constants", "geographic"];
29
+ // Patterns that indicate local definition of geographic constants
30
+ const LOCAL_DEFINITION_PATTERNS = [
31
+ // US States definitions
32
+ /const\s+US_STATES\s*=\s*\[/,
33
+ /let\s+US_STATES\s*=\s*\[/,
34
+ /var\s+US_STATES\s*=\s*\[/,
35
+ /export\s+const\s+US_STATES\s*=\s*\[/,
36
+ // Countries definitions
37
+ /const\s+COUNTRIES\s*=\s*\[/,
38
+ /let\s+COUNTRIES\s*=\s*\[/,
39
+ /var\s+COUNTRIES\s*=\s*\[/,
40
+ /export\s+const\s+COUNTRIES\s*=\s*\[/,
41
+ // Canadian provinces definitions
42
+ /const\s+CA_PROVINCES\s*=\s*\[/,
43
+ /let\s+CA_PROVINCES\s*=\s*\[/,
44
+ /var\s+CA_PROVINCES\s*=\s*\[/,
45
+ /export\s+const\s+CA_PROVINCES\s*=\s*\[/,
46
+ // State codes array
47
+ /const\s+US_STATE_CODES\s*=\s*\[/,
48
+ /const\s+STATE_CODES\s*=\s*\[/,
49
+ // Country codes array
50
+ /const\s+COUNTRY_CODES\s*=\s*\[/,
51
+ ];
52
+ // Files that are allowed to define these constants (the source of truth)
53
+ const ALLOWED_FILES = ["lib/constants/geographic.ts", "lib/constants/geographic.js"];
54
+ // Files that re-export from centralized location (allowed)
55
+ const REEXPORT_FILES = [
56
+ "components/shipping/types.ts",
57
+ "components/forms/constants/cardFormConstants.ts",
58
+ "components/CardEditDialog/constants.ts",
59
+ ];
60
+ // Note: General file exclusions are handled via centralized config in preflight.config.js
61
+ function isAllowedSourceFile(filePath) {
62
+ const normalizedPath = filePath.replace(/\\/g, "/");
63
+ // Check if it's an allowed source file
64
+ for (const allowed of ALLOWED_FILES) {
65
+ if (normalizedPath.endsWith(allowed)) {
66
+ return true;
67
+ }
68
+ }
69
+ // Check if it's a file that re-exports from centralized location
70
+ for (const reexport of REEXPORT_FILES) {
71
+ if (normalizedPath.endsWith(reexport)) {
72
+ return true;
73
+ }
74
+ }
75
+ return false;
76
+ }
77
+ function checkFile(filePath) {
78
+ const issues = [];
79
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
80
+ const lines = content.split("\n");
81
+ for (let i = 0; i < lines.length; i++) {
82
+ const line = lines[i];
83
+ const lineNum = i + 1;
84
+ for (const pattern of LOCAL_DEFINITION_PATTERNS) {
85
+ if (pattern.test(line)) {
86
+ // Extract what's being defined
87
+ let constantName = "geographic constant";
88
+ if (/US_STATES/.test(line))
89
+ constantName = "US_STATES";
90
+ else if (/COUNTRIES/.test(line))
91
+ constantName = "COUNTRIES";
92
+ else if (/CA_PROVINCES/.test(line))
93
+ constantName = "CA_PROVINCES";
94
+ else if (/STATE_CODES/.test(line))
95
+ constantName = "STATE_CODES";
96
+ else if (/COUNTRY_CODES/.test(line))
97
+ constantName = "COUNTRY_CODES";
98
+ issues.push({
99
+ file: filePath,
100
+ line: lineNum,
101
+ constantName,
102
+ message: `Local definition of ${constantName} found. Import from @/lib/constants/geographic instead.`,
103
+ });
104
+ break; // Only report once per line
105
+ }
106
+ }
107
+ }
108
+ return issues;
109
+ }
110
+ async function main() {
111
+ console.log("Geographic Constants Validation\n");
112
+ // Load app-specific exclusions from config
113
+ appExclusions = await (0, exclusions_1.getExclusions)(exports.id);
114
+ console.log("Checking for local definitions of US_STATES, COUNTRIES, CA_PROVINCES...\n");
115
+ // Find all TypeScript/JavaScript files
116
+ const allFiles = glob_1.glob.sync("**/*.{ts,tsx,js,jsx}", {
117
+ ignore: ["node_modules/**", ".next/**", "coverage/**"],
118
+ });
119
+ const files = allFiles.filter((file) => !(0, exclusions_1.shouldExcludeFile)(file, appExclusions));
120
+ const allIssues = [];
121
+ let filesChecked = 0;
122
+ for (const file of files) {
123
+ // Skip source files that are allowed to define these constants
124
+ if (isAllowedSourceFile(file)) {
125
+ continue;
126
+ }
127
+ filesChecked++;
128
+ const issues = checkFile(file);
129
+ allIssues.push(...issues);
130
+ }
131
+ // Report results
132
+ console.log(`Files checked: ${filesChecked}\n`);
133
+ if (allIssues.length === 0) {
134
+ console.log(`${console_chars_1.emoji.success} No local geographic constant definitions found!\n`);
135
+ console.log("All geographic data should be imported from: @/lib/constants/geographic\n");
136
+ process.exit(0);
137
+ }
138
+ console.log(`${console_chars_1.emoji.error} Found ${allIssues.length} local definition(s) that should be centralized:\n`);
139
+ // Group by file
140
+ const byFile = {};
141
+ for (const issue of allIssues) {
142
+ if (!byFile[issue.file]) {
143
+ byFile[issue.file] = [];
144
+ }
145
+ byFile[issue.file].push(issue);
146
+ }
147
+ for (const [file, issues] of Object.entries(byFile)) {
148
+ console.log(`${console_chars_1.emoji.folder} ${file}`);
149
+ for (const issue of issues) {
150
+ console.log(` Line ${issue.line}: ${issue.constantName}`);
151
+ }
152
+ console.log("");
153
+ }
154
+ console.log((0, console_chars_1.createDivider)(60, "light"));
155
+ console.log(`\n${console_chars_1.emoji.clipboard} How to fix:\n`);
156
+ console.log("1. Remove the local definition of US_STATES, COUNTRIES, etc.");
157
+ console.log("2. Add this import at the top of the file:");
158
+ console.log(' import { US_STATES, COUNTRIES, CA_PROVINCES } from "@/lib/constants/geographic";\n');
159
+ console.log("3. If you need just state codes, use US_STATE_CODES or COUNTRY_CODES\n");
160
+ console.log("4. For helper functions, use getStateName(), getCountryName(), etc.\n");
161
+ // Exit with error code for CI
162
+ process.exit(1);
163
+ }
164
+ main().catch((err) => {
165
+ console.error("Error:", err);
166
+ process.exit(1);
167
+ });
168
+ //# sourceMappingURL=geographic-constants-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geographic-constants-validation.js","sourceRoot":"","sources":["../../../src/checks/data/geographic-constants-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Hardcoded Options Validation Preflight
4
+ *
5
+ * Detects hardcoded option arrays AND inline MenuItem patterns that should use centralized constants.
6
+ * These patterns indicate dummy/sample data that bypasses the single source of truth.
7
+ *
8
+ * BLOCKING: Yes - hardcoded options cause data inconsistency
9
+ *
10
+ * Run: pnpm preflight:hardcoded-options
11
+ *
12
+ * Detects:
13
+ * 1. const SAMPLE_CATEGORIES = [...] - Local constant definitions
14
+ * 2. <MenuItem value="BASEBALL">Baseball</MenuItem> - Inline enum-like values
15
+ * 3. <MenuItem value="PSA">PSA</MenuItem> - Grading companies
16
+ * 4. <MenuItem value="flat">Flat Rate</MenuItem> - Shipping types
17
+ */
18
+ export declare const id = "data/hardcoded-options-validation";
19
+ export declare const name = "Hardcoded Options Validation";
20
+ export declare const description = "Detects hardcoded option arrays that should use centralized constants";
21
+ export declare const category = "data";
22
+ export declare const blocking = true;
23
+ export declare const tags: string[];
24
+ //# sourceMappingURL=hardcoded-options-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardcoded-options-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/data/hardcoded-options-validation.ts"],"names":[],"mappings":";AASA;;;;;;;;;;;;;;;GAeG;AAIH,eAAO,MAAM,EAAE,sCAAsC,CAAC;AACtD,eAAO,MAAM,IAAI,iCAAiC,CAAC;AACnD,eAAO,MAAM,WAAW,0EAA0E,CAAC;AACnG,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA4C,CAAC"}