@empline/preflight 1.1.3 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/checks/card-processing/dimension-variance-blocking.d.ts +8 -0
- package/dist/checks/card-processing/dimension-variance-blocking.d.ts.map +1 -0
- package/dist/checks/card-processing/dimension-variance-blocking.js +256 -0
- package/dist/checks/card-processing/dimension-variance-blocking.js.map +1 -0
- package/dist/checks/card-processing/edge-detection-integration.d.ts +8 -0
- package/dist/checks/card-processing/edge-detection-integration.d.ts.map +1 -0
- package/dist/checks/card-processing/edge-detection-integration.js +180 -0
- package/dist/checks/card-processing/edge-detection-integration.js.map +1 -0
- package/dist/checks/card-processing/front-back-detection-validation.d.ts +8 -0
- package/dist/checks/card-processing/front-back-detection-validation.d.ts.map +1 -0
- package/dist/checks/card-processing/front-back-detection-validation.js +83 -0
- package/dist/checks/card-processing/front-back-detection-validation.js.map +1 -0
- package/dist/checks/card-processing/image-deskew-system.d.ts +8 -0
- package/dist/checks/card-processing/image-deskew-system.d.ts.map +1 -0
- package/dist/checks/card-processing/image-deskew-system.js +62 -0
- package/dist/checks/card-processing/image-deskew-system.js.map +1 -0
- package/dist/checks/card-processing/image-filename-uniqueness.d.ts +8 -0
- package/dist/checks/card-processing/image-filename-uniqueness.d.ts.map +1 -0
- package/dist/checks/card-processing/image-filename-uniqueness.js +229 -0
- package/dist/checks/card-processing/image-filename-uniqueness.js.map +1 -0
- package/dist/checks/card-processing/image-processing-config-validation.d.ts +8 -0
- package/dist/checks/card-processing/image-processing-config-validation.d.ts.map +1 -0
- package/dist/checks/card-processing/image-processing-config-validation.js +440 -0
- package/dist/checks/card-processing/image-processing-config-validation.js.map +1 -0
- package/dist/checks/code-quality/price-formatting-consistency.d.ts +28 -0
- package/dist/checks/code-quality/price-formatting-consistency.d.ts.map +1 -0
- package/dist/checks/code-quality/price-formatting-consistency.js +230 -0
- package/dist/checks/code-quality/price-formatting-consistency.js.map +1 -0
- package/dist/checks/data/constants-validation.d.ts +19 -0
- package/dist/checks/data/constants-validation.d.ts.map +1 -0
- package/dist/checks/data/constants-validation.js +297 -0
- package/dist/checks/data/constants-validation.js.map +1 -0
- package/dist/checks/data/crockford-id-validation.d.ts +24 -0
- package/dist/checks/data/crockford-id-validation.d.ts.map +1 -0
- package/dist/checks/data/crockford-id-validation.js +227 -0
- package/dist/checks/data/crockford-id-validation.js.map +1 -0
- package/dist/checks/data/geographic-constants-validation.d.ts +16 -0
- package/dist/checks/data/geographic-constants-validation.d.ts.map +1 -0
- package/dist/checks/data/geographic-constants-validation.js +168 -0
- package/dist/checks/data/geographic-constants-validation.js.map +1 -0
- package/dist/checks/data/hardcoded-options-validation.d.ts +24 -0
- package/dist/checks/data/hardcoded-options-validation.d.ts.map +1 -0
- package/dist/checks/data/hardcoded-options-validation.js +362 -0
- package/dist/checks/data/hardcoded-options-validation.js.map +1 -0
- package/dist/checks/data/league-data-integrity-with-env.d.ts +14 -0
- package/dist/checks/data/league-data-integrity-with-env.d.ts.map +1 -0
- package/dist/checks/data/league-data-integrity-with-env.js +21 -0
- package/dist/checks/data/league-data-integrity-with-env.js.map +1 -0
- package/dist/checks/data/product-slug-architecture.d.ts +36 -0
- package/dist/checks/data/product-slug-architecture.d.ts.map +1 -0
- package/dist/checks/data/product-slug-architecture.js +167 -0
- package/dist/checks/data/product-slug-architecture.js.map +1 -0
- package/dist/checks/data/schema-fk-defaults-validation.d.ts +21 -0
- package/dist/checks/data/schema-fk-defaults-validation.d.ts.map +1 -0
- package/dist/checks/data/schema-fk-defaults-validation.js +168 -0
- package/dist/checks/data/schema-fk-defaults-validation.js.map +1 -0
- package/dist/checks/tailwind/undefined-tailwind-utilities.d.ts +29 -0
- package/dist/checks/tailwind/undefined-tailwind-utilities.d.ts.map +1 -0
- package/dist/checks/tailwind/undefined-tailwind-utilities.js +337 -0
- package/dist/checks/tailwind/undefined-tailwind-utilities.js.map +1 -0
- package/dist/checks/turbopack/map-closure-safety.d.ts +37 -0
- package/dist/checks/turbopack/map-closure-safety.d.ts.map +1 -0
- package/dist/checks/turbopack/map-closure-safety.js +261 -0
- package/dist/checks/turbopack/map-closure-safety.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/core/categories.d.ts.map +1 -1
- package/dist/core/categories.js +42 -0
- package/dist/core/categories.js.map +1 -1
- 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,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Schema FK Defaults Validation Preflight
|
|
4
|
+
*
|
|
5
|
+
* Ensures Prisma schema @default values for foreign key fields match
|
|
6
|
+
* the IDs in seed data. Prevents FK constraint violations at runtime.
|
|
7
|
+
*
|
|
8
|
+
* Example issue this catches:
|
|
9
|
+
* Schema: language String @default("ENGLISH") <- uppercase
|
|
10
|
+
* Seed: { id: "english", ... } <- lowercase
|
|
11
|
+
* Result: FK constraint violation at runtime (P2003)
|
|
12
|
+
*
|
|
13
|
+
* Run: pnpm preflight:schema-fk-defaults
|
|
14
|
+
*/
|
|
15
|
+
export declare const id = "data/schema-fk-defaults-validation";
|
|
16
|
+
export declare const name = "Schema FK Defaults Validation";
|
|
17
|
+
export declare const description = "Ensures schema defaults match seed data for FK fields";
|
|
18
|
+
export declare const category = "data";
|
|
19
|
+
export declare const blocking = true;
|
|
20
|
+
export declare const tags: string[];
|
|
21
|
+
//# sourceMappingURL=schema-fk-defaults-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-fk-defaults-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/data/schema-fk-defaults-validation.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAGH,eAAO,MAAM,EAAE,uCAAuC,CAAC;AACvD,eAAO,MAAM,IAAI,kCAAkC,CAAC;AACpD,eAAO,MAAM,WAAW,0DAA0D,CAAC;AACnF,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA8C,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Schema FK Defaults Validation Preflight
|
|
5
|
+
*
|
|
6
|
+
* Ensures Prisma schema @default values for foreign key fields match
|
|
7
|
+
* the IDs in seed data. Prevents FK constraint violations at runtime.
|
|
8
|
+
*
|
|
9
|
+
* Example issue this catches:
|
|
10
|
+
* Schema: language String @default("ENGLISH") <- uppercase
|
|
11
|
+
* Seed: { id: "english", ... } <- lowercase
|
|
12
|
+
* Result: FK constraint violation at runtime (P2003)
|
|
13
|
+
*
|
|
14
|
+
* Run: pnpm preflight:schema-fk-defaults
|
|
15
|
+
*/
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
|
|
21
|
+
// METADATA - Required for plugin loader discovery
|
|
22
|
+
exports.id = "data/schema-fk-defaults-validation";
|
|
23
|
+
exports.name = "Schema FK Defaults Validation";
|
|
24
|
+
exports.description = "Ensures schema defaults match seed data for FK fields";
|
|
25
|
+
exports.category = "data";
|
|
26
|
+
exports.blocking = true;
|
|
27
|
+
exports.tags = ["data", "schema", "prisma", "foreign-key"];
|
|
28
|
+
const fs_1 = __importDefault(require("fs"));
|
|
29
|
+
const path_1 = __importDefault(require("path"));
|
|
30
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
31
|
+
const colors = {
|
|
32
|
+
reset: "\x1b[0m",
|
|
33
|
+
red: "\x1b[31m",
|
|
34
|
+
green: "\x1b[32m",
|
|
35
|
+
yellow: "\x1b[33m",
|
|
36
|
+
blue: "\x1b[34m",
|
|
37
|
+
cyan: "\x1b[36m",
|
|
38
|
+
};
|
|
39
|
+
console.log(`${colors.cyan}${console_chars_1.emoji.search} Schema FK Defaults Validation Preflight${colors.reset}\n`);
|
|
40
|
+
const SCHEMA_PATH = "prisma/schema.prisma";
|
|
41
|
+
// Configuration: FK fields to validate
|
|
42
|
+
const FK_VALIDATIONS = [
|
|
43
|
+
{
|
|
44
|
+
name: "language",
|
|
45
|
+
schemaPattern: /language\s+String\s+@default\("([^"]+)"\)/g,
|
|
46
|
+
seedFile: "lib/seed-data/reference-data.ts",
|
|
47
|
+
seedArrayName: "languages",
|
|
48
|
+
idField: "id",
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
let hasErrors = false;
|
|
52
|
+
const errors = [];
|
|
53
|
+
/**
|
|
54
|
+
* Extract array data from a TypeScript seed file
|
|
55
|
+
*/
|
|
56
|
+
function extractSeedIds(seedFile, arrayName, idField) {
|
|
57
|
+
const fullPath = path_1.default.resolve(seedFile);
|
|
58
|
+
if (!fs_1.default.existsSync(fullPath)) {
|
|
59
|
+
return { error: `Seed file not found: ${seedFile}`, ids: [] };
|
|
60
|
+
}
|
|
61
|
+
const content = fs_1.default.readFileSync(fullPath, "utf-8");
|
|
62
|
+
// Find the array definition
|
|
63
|
+
const arrayRegex = new RegExp(`export\\s+const\\s+${arrayName}\\s*=\\s*\\[([\\s\\S]*?)\\];`, "m");
|
|
64
|
+
const match = content.match(arrayRegex);
|
|
65
|
+
if (!match) {
|
|
66
|
+
return { error: `Array "${arrayName}" not found in ${seedFile}`, ids: [] };
|
|
67
|
+
}
|
|
68
|
+
// Extract all id values from the array
|
|
69
|
+
const arrayContent = match[1];
|
|
70
|
+
const idRegex = new RegExp(`${idField}:\\s*["']([^"']+)["']`, "g");
|
|
71
|
+
const ids = [];
|
|
72
|
+
let idMatch;
|
|
73
|
+
while ((idMatch = idRegex.exec(arrayContent)) !== null) {
|
|
74
|
+
ids.push(idMatch[1]);
|
|
75
|
+
}
|
|
76
|
+
return { ids, error: null };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Find line number for a position in content
|
|
80
|
+
*/
|
|
81
|
+
function getLineNumber(content, position) {
|
|
82
|
+
return content.substring(0, position).split("\n").length;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Find model name for a position in schema
|
|
86
|
+
*/
|
|
87
|
+
function getModelName(schemaContent, position) {
|
|
88
|
+
const beforePosition = schemaContent.substring(0, position);
|
|
89
|
+
const modelMatches = [...beforePosition.matchAll(/model\s+(\w+)\s*\{/g)];
|
|
90
|
+
if (modelMatches.length === 0)
|
|
91
|
+
return "Unknown";
|
|
92
|
+
return modelMatches[modelMatches.length - 1][1];
|
|
93
|
+
}
|
|
94
|
+
// Read schema
|
|
95
|
+
if (!fs_1.default.existsSync(SCHEMA_PATH)) {
|
|
96
|
+
console.error(`${console_chars_1.emoji.error} Schema file not found: ${SCHEMA_PATH}`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
const schemaContent = fs_1.default.readFileSync(SCHEMA_PATH, "utf-8");
|
|
100
|
+
for (const validation of FK_VALIDATIONS) {
|
|
101
|
+
console.log(`${colors.blue}${console_chars_1.emoji.clipboard} Checking ${validation.name} defaults...${colors.reset}`);
|
|
102
|
+
// Get valid IDs from seed data
|
|
103
|
+
const { ids: validIds, error } = extractSeedIds(validation.seedFile, validation.seedArrayName, validation.idField);
|
|
104
|
+
if (error) {
|
|
105
|
+
console.warn(` ${console_chars_1.emoji.warning} ${error}`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
console.log(` Found ${validIds.length} valid IDs in seed data: ${validIds.slice(0, 5).join(", ")}${validIds.length > 5 ? "..." : ""}`);
|
|
109
|
+
// Get defaults from schema
|
|
110
|
+
const defaults = [];
|
|
111
|
+
let match;
|
|
112
|
+
validation.schemaPattern.lastIndex = 0;
|
|
113
|
+
while ((match = validation.schemaPattern.exec(schemaContent)) !== null) {
|
|
114
|
+
defaults.push({
|
|
115
|
+
value: match[1],
|
|
116
|
+
position: match.index,
|
|
117
|
+
fullMatch: match[0],
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
console.log(` Found ${defaults.length} @default declarations in schema`);
|
|
121
|
+
// Check each default against valid IDs
|
|
122
|
+
for (const def of defaults) {
|
|
123
|
+
if (!validIds.includes(def.value)) {
|
|
124
|
+
const lineNum = getLineNumber(schemaContent, def.position);
|
|
125
|
+
const modelName = getModelName(schemaContent, def.position);
|
|
126
|
+
// Check for case mismatch specifically
|
|
127
|
+
const lowerValue = def.value.toLowerCase();
|
|
128
|
+
const caseMatch = validIds.find(id => id.toLowerCase() === lowerValue);
|
|
129
|
+
hasErrors = true;
|
|
130
|
+
errors.push({
|
|
131
|
+
field: validation.name,
|
|
132
|
+
model: modelName,
|
|
133
|
+
line: lineNum,
|
|
134
|
+
defaultValue: def.value,
|
|
135
|
+
validIds: validIds.slice(0, 5),
|
|
136
|
+
suggestion: caseMatch || validIds[0],
|
|
137
|
+
isCaseMismatch: !!caseMatch,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Report results
|
|
143
|
+
console.log("");
|
|
144
|
+
if (!hasErrors) {
|
|
145
|
+
console.log(`${colors.green}${console_chars_1.emoji.success} All schema @default values match seed data!${colors.reset}\n`);
|
|
146
|
+
process.exit(0);
|
|
147
|
+
}
|
|
148
|
+
console.log(`${colors.red}${console_chars_1.emoji.error} Found ${errors.length} mismatched default(s):${colors.reset}\n`);
|
|
149
|
+
for (const issue of errors) {
|
|
150
|
+
console.log(` ${issue.model}.${issue.field} (line ${issue.line})`);
|
|
151
|
+
console.log(` Current: @default("${issue.defaultValue}")`);
|
|
152
|
+
console.log(` Expected: @default("${issue.suggestion}")`);
|
|
153
|
+
if (issue.isCaseMismatch) {
|
|
154
|
+
console.log(` ${colors.yellow}${console_chars_1.emoji.warning} Case mismatch detected!${colors.reset}`);
|
|
155
|
+
}
|
|
156
|
+
console.log(` Valid IDs: ${issue.validIds.join(", ")}${issue.validIds.length >= 5 ? "..." : ""}`);
|
|
157
|
+
console.log("");
|
|
158
|
+
}
|
|
159
|
+
console.log((0, console_chars_1.createDivider)(60, "light"));
|
|
160
|
+
console.log(`\n${console_chars_1.emoji.clipboard} How to fix:\n`);
|
|
161
|
+
console.log("1. Update the @default value in prisma/schema.prisma to match seed data");
|
|
162
|
+
console.log("2. Run: pnpm db:generate");
|
|
163
|
+
console.log("3. If adding a new reference value, add it to the seed data first\n");
|
|
164
|
+
console.log(`${colors.yellow}Why this matters:${colors.reset}`);
|
|
165
|
+
console.log(" Schema defaults that don't exist in ref_* tables cause");
|
|
166
|
+
console.log(" FK constraint violations at runtime (P2003 errors).\n");
|
|
167
|
+
process.exit(1);
|
|
168
|
+
//# sourceMappingURL=schema-fk-defaults-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-fk-defaults-validation.js","sourceRoot":"","sources":["../../../src/checks/data/schema-fk-defaults-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Undefined Tailwind Utilities Preflight (BLOCKING)
|
|
4
|
+
*
|
|
5
|
+
* Detects Tailwind utility classes that reference undefined CSS variables.
|
|
6
|
+
* This prevents invisible UI elements caused by missing theme tokens.
|
|
7
|
+
*
|
|
8
|
+
* Common issue detected:
|
|
9
|
+
* - `bg-background` used when theme defines `--bg-primary` instead of `--background`
|
|
10
|
+
* - Other utility classes that expect shadcn-style CSS variables
|
|
11
|
+
*
|
|
12
|
+
* Why this matters:
|
|
13
|
+
* - Using undefined CSS variables results in invisible elements
|
|
14
|
+
* - Components may appear broken (e.g., toggle thumbs not visible)
|
|
15
|
+
* - These issues are hard to detect visually until specific states are reached
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* pnpm preflight:undefined-tailwind-utilities
|
|
19
|
+
* pnpm preflight:undefined-tailwind-utilities --verbose
|
|
20
|
+
*/
|
|
21
|
+
export declare const id = "tailwind/undefined-tailwind-utilities";
|
|
22
|
+
export declare const name = "Undefined Tailwind Utilities";
|
|
23
|
+
export declare const category = "tailwind";
|
|
24
|
+
export declare const blocking = true;
|
|
25
|
+
export declare const description = "Detects Tailwind classes using undefined CSS variables (BLOCKING)";
|
|
26
|
+
export declare const tags: string[];
|
|
27
|
+
export declare const requires: string[];
|
|
28
|
+
export declare function run(): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=undefined-tailwind-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undefined-tailwind-utilities.d.ts","sourceRoot":"","sources":["../../../src/checks/tailwind/undefined-tailwind-utilities.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AASH,eAAO,MAAM,EAAE,0CAA0C,CAAC;AAC1D,eAAO,MAAM,IAAI,iCAAiC,CAAC;AACnD,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,sEAAsE,CAAC;AAC/F,eAAO,MAAM,IAAI,UAAiD,CAAC;AACnE,eAAO,MAAM,QAAQ,UAAkB,CAAC;AAoLxC,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAuHzC"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Undefined Tailwind Utilities Preflight (BLOCKING)
|
|
5
|
+
*
|
|
6
|
+
* Detects Tailwind utility classes that reference undefined CSS variables.
|
|
7
|
+
* This prevents invisible UI elements caused by missing theme tokens.
|
|
8
|
+
*
|
|
9
|
+
* Common issue detected:
|
|
10
|
+
* - `bg-background` used when theme defines `--bg-primary` instead of `--background`
|
|
11
|
+
* - Other utility classes that expect shadcn-style CSS variables
|
|
12
|
+
*
|
|
13
|
+
* Why this matters:
|
|
14
|
+
* - Using undefined CSS variables results in invisible elements
|
|
15
|
+
* - Components may appear broken (e.g., toggle thumbs not visible)
|
|
16
|
+
* - These issues are hard to detect visually until specific states are reached
|
|
17
|
+
*
|
|
18
|
+
* Usage:
|
|
19
|
+
* pnpm preflight:undefined-tailwind-utilities
|
|
20
|
+
* pnpm preflight:undefined-tailwind-utilities --verbose
|
|
21
|
+
*/
|
|
22
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
25
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
26
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
27
|
+
}
|
|
28
|
+
Object.defineProperty(o, k2, desc);
|
|
29
|
+
}) : (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
o[k2] = m[k];
|
|
32
|
+
}));
|
|
33
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
34
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
35
|
+
}) : function(o, v) {
|
|
36
|
+
o["default"] = v;
|
|
37
|
+
});
|
|
38
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
39
|
+
var ownKeys = function(o) {
|
|
40
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
41
|
+
var ar = [];
|
|
42
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
43
|
+
return ar;
|
|
44
|
+
};
|
|
45
|
+
return ownKeys(o);
|
|
46
|
+
};
|
|
47
|
+
return function (mod) {
|
|
48
|
+
if (mod && mod.__esModule) return mod;
|
|
49
|
+
var result = {};
|
|
50
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
51
|
+
__setModuleDefault(result, mod);
|
|
52
|
+
return result;
|
|
53
|
+
};
|
|
54
|
+
})();
|
|
55
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
|
+
exports.requires = exports.tags = exports.description = exports.blocking = exports.category = exports.name = exports.id = void 0;
|
|
57
|
+
exports.run = run;
|
|
58
|
+
const fs = __importStar(require("fs"));
|
|
59
|
+
const file_cache_1 = require("../../shared/file-cache");
|
|
60
|
+
const glob_patterns_1 = require("../../shared/glob-patterns");
|
|
61
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
62
|
+
const universal_progress_reporter_1 = require("../system/universal-progress-reporter");
|
|
63
|
+
// Check metadata
|
|
64
|
+
exports.id = "tailwind/undefined-tailwind-utilities";
|
|
65
|
+
exports.name = "Undefined Tailwind Utilities";
|
|
66
|
+
exports.category = "tailwind";
|
|
67
|
+
exports.blocking = true;
|
|
68
|
+
exports.description = "Detects Tailwind classes using undefined CSS variables (BLOCKING)";
|
|
69
|
+
exports.tags = ["tailwind", "css-variables", "theming", "ui"];
|
|
70
|
+
exports.requires = ["tailwindcss"];
|
|
71
|
+
const EXCLUDED = (0, glob_patterns_1.extendExcludes)(glob_patterns_1.STANDARD_EXCLUDES, [
|
|
72
|
+
"**/test-results/**",
|
|
73
|
+
"**/*.test.tsx",
|
|
74
|
+
"**/*.spec.tsx",
|
|
75
|
+
"**/*.stories.tsx",
|
|
76
|
+
]);
|
|
77
|
+
/**
|
|
78
|
+
* Tailwind utility classes that rely on CSS variables not defined in our theme.
|
|
79
|
+
* These often come from copying shadcn/ui components that expect different variable names.
|
|
80
|
+
*
|
|
81
|
+
* Patterns use (?:\/\d+)? to optionally match opacity modifiers like /20, /50, etc.
|
|
82
|
+
*
|
|
83
|
+
* Format: { pattern, name, message, suggestion, severity }
|
|
84
|
+
*/
|
|
85
|
+
const UNDEFINED_UTILITIES = [
|
|
86
|
+
{
|
|
87
|
+
// shadcn expects --background, we use --bg-primary
|
|
88
|
+
pattern: /\bbg-background(?:\/\d+)?\b/g,
|
|
89
|
+
name: "bg-background",
|
|
90
|
+
message: "bg-background uses undefined --background CSS variable",
|
|
91
|
+
suggestion: "Use bg-white, bg-[var(--bg-primary)], or appropriate color class",
|
|
92
|
+
severity: "error",
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
// shadcn expects --foreground, we use --text-primary
|
|
96
|
+
pattern: /\btext-foreground(?:\/\d+)?\b/g,
|
|
97
|
+
name: "text-foreground",
|
|
98
|
+
message: "text-foreground uses undefined --foreground CSS variable",
|
|
99
|
+
suggestion: "Use text-[var(--text-primary)] or appropriate color class",
|
|
100
|
+
severity: "error",
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
// shadcn expects --muted, we use --text-secondary or --bg-tertiary
|
|
104
|
+
// Matches: bg-muted, bg-muted/20, bg-muted/50, etc.
|
|
105
|
+
pattern: /\bbg-muted(?:\/\d+)?\b/g,
|
|
106
|
+
name: "bg-muted",
|
|
107
|
+
message: "bg-muted uses undefined --muted CSS variable",
|
|
108
|
+
suggestion: "Use bg-[var(--bg-tertiary)] or bg-[var(--bg-tertiary)]/20 for opacity",
|
|
109
|
+
severity: "error",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
// Matches: text-muted-foreground, text-muted-foreground/70, etc.
|
|
113
|
+
pattern: /\btext-muted-foreground(?:\/\d+)?\b/g,
|
|
114
|
+
name: "text-muted-foreground",
|
|
115
|
+
message: "text-muted-foreground uses undefined --muted-foreground CSS variable",
|
|
116
|
+
suggestion: "Use text-[var(--text-secondary)] or text-[var(--text-secondary)]/70 for opacity",
|
|
117
|
+
severity: "error",
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
// shadcn expects --card, we use --bg-primary
|
|
121
|
+
pattern: /\bbg-card(?:\/\d+)?\b/g,
|
|
122
|
+
name: "bg-card",
|
|
123
|
+
message: "bg-card uses undefined --card CSS variable",
|
|
124
|
+
suggestion: "Use bg-[var(--bg-primary)] or appropriate color class",
|
|
125
|
+
severity: "error",
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
// shadcn expects --popover
|
|
129
|
+
pattern: /\bbg-popover(?:\/\d+)?\b/g,
|
|
130
|
+
name: "bg-popover",
|
|
131
|
+
message: "bg-popover uses undefined --popover CSS variable",
|
|
132
|
+
suggestion: "Use bg-[var(--bg-primary)] or bg-white for popover backgrounds",
|
|
133
|
+
severity: "error",
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
// shadcn expects --accent
|
|
137
|
+
pattern: /\bbg-accent(?:\/\d+)?\b/g,
|
|
138
|
+
name: "bg-accent",
|
|
139
|
+
message: "bg-accent uses undefined --accent CSS variable",
|
|
140
|
+
suggestion: "Use bg-[var(--color-primary-light)] or appropriate accent color",
|
|
141
|
+
severity: "warning",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
pattern: /\btext-accent-foreground(?:\/\d+)?\b/g,
|
|
145
|
+
name: "text-accent-foreground",
|
|
146
|
+
message: "text-accent-foreground uses undefined --accent-foreground CSS variable",
|
|
147
|
+
suggestion: "Use text-[var(--color-primary)] or appropriate color class",
|
|
148
|
+
severity: "warning",
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
// shadcn expects --border, we use --border-color
|
|
152
|
+
pattern: /\bborder-border(?:\/\d+)?\b/g,
|
|
153
|
+
name: "border-border",
|
|
154
|
+
message: "border-border uses undefined --border CSS variable",
|
|
155
|
+
suggestion: "Use border-[var(--border-color)] instead",
|
|
156
|
+
severity: "error",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
// shadcn expects --input
|
|
160
|
+
pattern: /\bbg-input(?:\/\d+)?\b/g,
|
|
161
|
+
name: "bg-input",
|
|
162
|
+
message: "bg-input uses undefined --input CSS variable",
|
|
163
|
+
suggestion: "Use bg-[var(--bg-secondary)] or bg-white for input backgrounds",
|
|
164
|
+
severity: "warning",
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
// shadcn expects --ring
|
|
168
|
+
pattern: /\bring-ring(?:\/\d+)?\b/g,
|
|
169
|
+
name: "ring-ring",
|
|
170
|
+
message: "ring-ring uses undefined --ring CSS variable",
|
|
171
|
+
suggestion: "Use ring-[var(--color-primary)] for focus rings",
|
|
172
|
+
severity: "warning",
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
// shadcn expects --destructive
|
|
176
|
+
pattern: /\bbg-destructive(?:\/\d+)?\b/g,
|
|
177
|
+
name: "bg-destructive",
|
|
178
|
+
message: "bg-destructive uses undefined --destructive CSS variable",
|
|
179
|
+
suggestion: "Use bg-[var(--error-main)] for destructive/error backgrounds",
|
|
180
|
+
severity: "warning",
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
pattern: /\btext-destructive(?:\/\d+)?\b/g,
|
|
184
|
+
name: "text-destructive",
|
|
185
|
+
message: "text-destructive uses undefined --destructive CSS variable",
|
|
186
|
+
suggestion: "Use text-[var(--error-main)] for error text",
|
|
187
|
+
severity: "warning",
|
|
188
|
+
},
|
|
189
|
+
];
|
|
190
|
+
function checkFile(filePath, content) {
|
|
191
|
+
const issues = [];
|
|
192
|
+
const lines = content.split("\n");
|
|
193
|
+
for (const utility of UNDEFINED_UTILITIES) {
|
|
194
|
+
let match;
|
|
195
|
+
// Reset lastIndex for global regex
|
|
196
|
+
utility.pattern.lastIndex = 0;
|
|
197
|
+
while ((match = utility.pattern.exec(content)) !== null) {
|
|
198
|
+
// Find line number
|
|
199
|
+
let lineNumber = 1;
|
|
200
|
+
let charCount = 0;
|
|
201
|
+
for (let i = 0; i < lines.length; i++) {
|
|
202
|
+
charCount += lines[i].length + 1;
|
|
203
|
+
if (charCount > match.index) {
|
|
204
|
+
lineNumber = i + 1;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
issues.push({
|
|
209
|
+
file: filePath,
|
|
210
|
+
line: lineNumber,
|
|
211
|
+
type: utility.name,
|
|
212
|
+
severity: utility.severity,
|
|
213
|
+
message: utility.message,
|
|
214
|
+
suggestion: utility.suggestion,
|
|
215
|
+
snippet: lines[lineNumber - 1]?.trim().substring(0, 100),
|
|
216
|
+
match: match[0],
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return issues;
|
|
221
|
+
}
|
|
222
|
+
// CACHED FILE LISTS
|
|
223
|
+
let _cachedComponentFiles = null;
|
|
224
|
+
async function getComponentFiles() {
|
|
225
|
+
if (!_cachedComponentFiles) {
|
|
226
|
+
_cachedComponentFiles = await file_cache_1.fileCache.getComponentFiles();
|
|
227
|
+
}
|
|
228
|
+
return _cachedComponentFiles;
|
|
229
|
+
}
|
|
230
|
+
async function run() {
|
|
231
|
+
const reporter = (0, universal_progress_reporter_1.createUniversalProgressReporter)(exports.name);
|
|
232
|
+
const args = process.argv.slice(2);
|
|
233
|
+
const verbose = args.includes("--verbose") || args.includes("-v");
|
|
234
|
+
const warnOnly = args.includes("--warn") || args.includes("-w");
|
|
235
|
+
console.log(`\n${console_chars_1.emoji.palette} Undefined Tailwind Utilities Preflight`);
|
|
236
|
+
console.log((0, console_chars_1.createDivider)(80, "heavy"));
|
|
237
|
+
if (warnOnly) {
|
|
238
|
+
console.log(`${console_chars_1.emoji.warning} Running in warning mode - not blocking.\n`);
|
|
239
|
+
}
|
|
240
|
+
const startTime = Date.now();
|
|
241
|
+
const allIssues = [];
|
|
242
|
+
// Find all component files
|
|
243
|
+
const files = await getComponentFiles();
|
|
244
|
+
let filesScanned = 0;
|
|
245
|
+
for (const file of files) {
|
|
246
|
+
try {
|
|
247
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
248
|
+
filesScanned++;
|
|
249
|
+
allIssues.push(...checkFile(file, content));
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
if (verbose) {
|
|
253
|
+
console.error(`${console_chars_1.emoji.warning} Error reading ${file}: ${error.message}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const duration = Date.now() - startTime;
|
|
258
|
+
// Report results
|
|
259
|
+
console.log(`\n${console_chars_1.emoji.chart} Scan Summary:`);
|
|
260
|
+
console.log(` Files scanned: ${filesScanned}`);
|
|
261
|
+
console.log(` Duration: ${duration}ms`);
|
|
262
|
+
const errors = allIssues.filter((i) => i.severity === "error");
|
|
263
|
+
const warnings = allIssues.filter((i) => i.severity === "warning");
|
|
264
|
+
const infos = allIssues.filter((i) => i.severity === "info");
|
|
265
|
+
if (allIssues.length === 0) {
|
|
266
|
+
console.log(`\n${console_chars_1.emoji.success} No undefined Tailwind utility classes found`);
|
|
267
|
+
console.log(` All CSS variable references are valid.`);
|
|
268
|
+
process.exit(0);
|
|
269
|
+
}
|
|
270
|
+
// Group by type
|
|
271
|
+
const byType = new Map();
|
|
272
|
+
for (const issue of allIssues) {
|
|
273
|
+
const existing = byType.get(issue.type) || [];
|
|
274
|
+
existing.push(issue);
|
|
275
|
+
byType.set(issue.type, existing);
|
|
276
|
+
}
|
|
277
|
+
console.log(`\n${console_chars_1.emoji.clipboard} Issues Found:`);
|
|
278
|
+
console.log(` ${console_chars_1.emoji.error} Errors: ${errors.length}`);
|
|
279
|
+
console.log(` ${console_chars_1.emoji.warning} Warnings: ${warnings.length}`);
|
|
280
|
+
console.log(` ${console_chars_1.emoji.info} Info: ${infos.length}`);
|
|
281
|
+
// Print issues by type
|
|
282
|
+
for (const [type, issues] of byType) {
|
|
283
|
+
const icon = issues[0].severity === "error"
|
|
284
|
+
? `${console_chars_1.emoji.error}`
|
|
285
|
+
: issues[0].severity === "warning"
|
|
286
|
+
? `${console_chars_1.emoji.warning}`
|
|
287
|
+
: `${console_chars_1.emoji.info}`;
|
|
288
|
+
console.log(`\n${icon} ${type} (${issues.length} occurrences)`);
|
|
289
|
+
if (verbose) {
|
|
290
|
+
for (const issue of issues.slice(0, 5)) {
|
|
291
|
+
console.log(` ${issue.file}:${issue.line}`);
|
|
292
|
+
console.log(` ${issue.message}`);
|
|
293
|
+
console.log(` ${console_chars_1.emoji.hint} ${issue.suggestion}`);
|
|
294
|
+
if (issue.snippet) {
|
|
295
|
+
console.log(` ${console_chars_1.emoji.memo} ${issue.snippet}`);
|
|
296
|
+
}
|
|
297
|
+
console.log("");
|
|
298
|
+
}
|
|
299
|
+
if (issues.length > 5) {
|
|
300
|
+
console.log(` ... and ${issues.length - 5} more`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
console.log(` ${issues[0].message}`);
|
|
305
|
+
console.log(` ${console_chars_1.emoji.hint} ${issues[0].suggestion}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Print background info
|
|
309
|
+
console.log(`\n${console_chars_1.emoji.docs} Background:`);
|
|
310
|
+
console.log(` This project uses custom CSS variable names (--bg-primary,`);
|
|
311
|
+
console.log(` --text-primary, etc.) instead of shadcn defaults (--background,`);
|
|
312
|
+
console.log(` --foreground, etc.). Using shadcn-style classes results in`);
|
|
313
|
+
console.log(` undefined colors and invisible UI elements.`);
|
|
314
|
+
console.log("");
|
|
315
|
+
console.log(`${console_chars_1.emoji.hint} Common fixes:`);
|
|
316
|
+
console.log(` • bg-background → bg-white or bg-[var(--bg-primary)]`);
|
|
317
|
+
console.log(` • text-foreground → text-[var(--text-primary)]`);
|
|
318
|
+
console.log(` • bg-muted → bg-[var(--bg-tertiary)]`);
|
|
319
|
+
console.log(` • border-border → border-[var(--border-color)]`);
|
|
320
|
+
// Exit code
|
|
321
|
+
if (warnOnly) {
|
|
322
|
+
console.log(`\n${console_chars_1.emoji.warning} Running in warning mode - not blocking`);
|
|
323
|
+
process.exit(0);
|
|
324
|
+
}
|
|
325
|
+
if (errors.length > 0) {
|
|
326
|
+
console.log(`\n⛔ ${errors.length} blocking issue(s) found. Fix before deploying.`);
|
|
327
|
+
console.log(` These will cause invisible or broken UI elements.`);
|
|
328
|
+
process.exit(1);
|
|
329
|
+
}
|
|
330
|
+
console.log(`\n${console_chars_1.emoji.success} No blocking issues (warnings/info only)`);
|
|
331
|
+
process.exit(0);
|
|
332
|
+
}
|
|
333
|
+
// Allow direct execution
|
|
334
|
+
if (require.main === module) {
|
|
335
|
+
run().catch(console.error);
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=undefined-tailwind-utilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undefined-tailwind-utilities.js","sourceRoot":"","sources":["../../../src/checks/tailwind/undefined-tailwind-utilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Turbopack Map Closure Safety Preflight (BLOCKING)
|
|
4
|
+
*
|
|
5
|
+
* Detects patterns that cause Turbopack closure bugs where property access
|
|
6
|
+
* on mapped items gets mangled (e.g., `product.stock_quantity` becomes
|
|
7
|
+
* `_product_stock_quantity` and fails at runtime).
|
|
8
|
+
*
|
|
9
|
+
* Problem Pattern:
|
|
10
|
+
* {items.map((item) => (
|
|
11
|
+
* <div>{item.property}</div> // Turbopack may mangle this
|
|
12
|
+
* ))}
|
|
13
|
+
*
|
|
14
|
+
* Safe Pattern:
|
|
15
|
+
* {items.map((item) => {
|
|
16
|
+
* const property = item.property; // Extract first
|
|
17
|
+
* return <div>{property}</div>; // Use local variable
|
|
18
|
+
* })}
|
|
19
|
+
*
|
|
20
|
+
* Why this matters:
|
|
21
|
+
* - Turbopack's minification can break closure scope for mapped items
|
|
22
|
+
* - Results in runtime ReferenceError: _item_property is not defined
|
|
23
|
+
* - Only happens in development with Turbopack, not in production builds
|
|
24
|
+
*
|
|
25
|
+
* Usage:
|
|
26
|
+
* pnpm preflight:turbopack-map-closure
|
|
27
|
+
* pnpm preflight:turbopack-map-closure --verbose
|
|
28
|
+
*/
|
|
29
|
+
export declare const id = "turbopack/map-closure-safety";
|
|
30
|
+
export declare const name = "Turbopack Map Closure Safety";
|
|
31
|
+
export declare const category = "turbopack";
|
|
32
|
+
export declare const blocking = false;
|
|
33
|
+
export declare const description = "Detects map callbacks that may cause Turbopack closure bugs";
|
|
34
|
+
export declare const tags: string[];
|
|
35
|
+
export declare const requires: any[];
|
|
36
|
+
export declare function run(): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=map-closure-safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-closure-safety.d.ts","sourceRoot":"","sources":["../../../src/checks/turbopack/map-closure-safety.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AASH,eAAO,MAAM,EAAE,iCAAiC,CAAC;AACjD,eAAO,MAAM,IAAI,iCAAiC,CAAC;AACnD,eAAO,MAAM,QAAQ,cAAc,CAAC;AACpC,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,WAAW,gEAAgE,CAAC;AACzF,eAAO,MAAM,IAAI,UAA6C,CAAC;AAC/D,eAAO,MAAM,QAAQ,OAAK,CAAC;AAuH3B,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAsGzC"}
|