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