@empline/preflight 1.1.33 → 1.1.35
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/auth/client-only-protected-pages.d.ts +14 -0
- package/dist/checks/auth/client-only-protected-pages.d.ts.map +1 -0
- package/dist/checks/auth/client-only-protected-pages.js +182 -0
- package/dist/checks/auth/client-only-protected-pages.js.map +1 -0
- package/dist/checks/auth/empty-data-instead-of-redirect.d.ts +14 -0
- package/dist/checks/auth/empty-data-instead-of-redirect.d.ts.map +1 -0
- package/dist/checks/auth/empty-data-instead-of-redirect.js +200 -0
- package/dist/checks/auth/empty-data-instead-of-redirect.js.map +1 -0
- package/dist/checks/auth/store-id-fallback.d.ts +14 -0
- package/dist/checks/auth/store-id-fallback.d.ts.map +1 -0
- package/dist/checks/auth/store-id-fallback.js +217 -0
- package/dist/checks/auth/store-id-fallback.js.map +1 -0
- package/dist/checks/auth/store-page-auth-guard.d.ts +14 -0
- package/dist/checks/auth/store-page-auth-guard.d.ts.map +1 -0
- package/dist/checks/auth/store-page-auth-guard.js +255 -0
- package/dist/checks/auth/store-page-auth-guard.js.map +1 -0
- package/dist/checks/data-integrity/api-route-reference-validation.d.ts +14 -0
- package/dist/checks/data-integrity/api-route-reference-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/api-route-reference-validation.js +219 -0
- package/dist/checks/data-integrity/api-route-reference-validation.js.map +1 -0
- package/dist/checks/system/active-preflight-migration-tracker.d.ts +13 -0
- package/dist/checks/system/active-preflight-migration-tracker.d.ts.map +1 -0
- package/dist/checks/system/active-preflight-migration-tracker.js +244 -0
- package/dist/checks/system/active-preflight-migration-tracker.js.map +1 -0
- package/dist/checks/ui/filter-option-coverage.d.ts +14 -0
- package/dist/checks/ui/filter-option-coverage.d.ts.map +1 -0
- package/dist/checks/ui/filter-option-coverage.js +286 -0
- package/dist/checks/ui/filter-option-coverage.js.map +1 -0
- package/dist/checks/ui/query-param-state-sync.d.ts +14 -0
- package/dist/checks/ui/query-param-state-sync.d.ts.map +1 -0
- package/dist/checks/ui/query-param-state-sync.js +251 -0
- package/dist/checks/ui/query-param-state-sync.js.map +1 -0
- package/dist/checks/ui/unimplemented-action-handler.d.ts +14 -0
- package/dist/checks/ui/unimplemented-action-handler.d.ts.map +1 -0
- package/dist/checks/ui/unimplemented-action-handler.js +230 -0
- package/dist/checks/ui/unimplemented-action-handler.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,219 @@
|
|
|
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.requires = exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
|
|
8
|
+
exports.run = run;
|
|
9
|
+
/**
|
|
10
|
+
* API Route Reference Validation Preflight
|
|
11
|
+
*
|
|
12
|
+
* Detects when UI code references API routes that don't exist. This catches
|
|
13
|
+
* broken functionality before it reaches production.
|
|
14
|
+
*
|
|
15
|
+
* Example problems this catches:
|
|
16
|
+
* - Button opens "/api/store/orders/[id]/label" but that route doesn't exist
|
|
17
|
+
* - Link to "/api/export/csv" but the handler was removed
|
|
18
|
+
* - Fetch to "/api/store/settings" but renamed to "/api/store/preferences"
|
|
19
|
+
*
|
|
20
|
+
* How it works:
|
|
21
|
+
* 1. Scans UI files for API route references (fetch, authFetch, href, etc.)
|
|
22
|
+
* 2. Scans app/api/ directory for actual route.ts files
|
|
23
|
+
* 3. Reports references that don't match any existing route
|
|
24
|
+
*/
|
|
25
|
+
const fs_1 = __importDefault(require("fs"));
|
|
26
|
+
const path_1 = __importDefault(require("path"));
|
|
27
|
+
const glob_1 = require("glob");
|
|
28
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
29
|
+
// METADATA
|
|
30
|
+
exports.id = "data-integrity/api-route-reference-validation";
|
|
31
|
+
exports.name = "API Route Reference Validation";
|
|
32
|
+
exports.description = "Detects UI references to API routes that don't exist";
|
|
33
|
+
exports.category = "data-integrity";
|
|
34
|
+
exports.blocking = true;
|
|
35
|
+
exports.tags = ["api", "routes", "integrity", "dead-code", "broken-links"];
|
|
36
|
+
exports.requires = ["trading-card-system"];
|
|
37
|
+
/**
|
|
38
|
+
* Patterns to find API route references in code
|
|
39
|
+
*/
|
|
40
|
+
const API_REFERENCE_PATTERNS = [
|
|
41
|
+
// fetch("/api/...")
|
|
42
|
+
/fetch\s*\(\s*["'`]([/]api\/[^"'`\s]+)/g,
|
|
43
|
+
// authFetch("/api/...")
|
|
44
|
+
/authFetch\s*\(\s*["'`]([/]api\/[^"'`\s]+)/g,
|
|
45
|
+
// href="/api/..."
|
|
46
|
+
/href\s*=\s*["'`]([/]api\/[^"'`\s]+)/g,
|
|
47
|
+
// url: "/api/..."
|
|
48
|
+
/url:\s*["'`]([/]api\/[^"'`\s]+)/g,
|
|
49
|
+
// action="/api/..."
|
|
50
|
+
/action\s*=\s*["'`]([/]api\/[^"'`\s]+)/g,
|
|
51
|
+
// window.open("/api/...")
|
|
52
|
+
/window\.open\s*\(\s*["'`]([/]api\/[^"'`\s]+)/g,
|
|
53
|
+
// API_URL = "/api/..."
|
|
54
|
+
/API_URL\s*=\s*["'`]([/]api\/[^"'`\s]+)/g,
|
|
55
|
+
// endpoint: "/api/..."
|
|
56
|
+
/endpoint:\s*["'`]([/]api\/[^"'`\s]+)/g,
|
|
57
|
+
];
|
|
58
|
+
/**
|
|
59
|
+
* Convert a route pattern to a regex for matching
|
|
60
|
+
* E.g., "/api/store/orders/[id]/label" -> /^\/api\/store\/orders\/[^/]+\/label$/
|
|
61
|
+
*/
|
|
62
|
+
function routeToRegex(routePath) {
|
|
63
|
+
// Escape special regex chars except [ and ]
|
|
64
|
+
let pattern = routePath.replace(/[.*+?^${}()|\\]/g, "\\$&");
|
|
65
|
+
// Convert [...slug] to match any path
|
|
66
|
+
pattern = pattern.replace(/\\\[\.\.\.[^\]]+\\\]/g, ".+");
|
|
67
|
+
// Convert [param] to match single segment
|
|
68
|
+
pattern = pattern.replace(/\\\[[^\]]+\\\]/g, "[^/]+");
|
|
69
|
+
return new RegExp(`^${pattern}$`);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Normalize an API path for comparison
|
|
73
|
+
* - Remove query params
|
|
74
|
+
* - Remove trailing slashes
|
|
75
|
+
* - Handle template literals
|
|
76
|
+
*/
|
|
77
|
+
function normalizeApiPath(apiPath) {
|
|
78
|
+
// Remove query params and hash
|
|
79
|
+
let normalized = apiPath.split("?")[0].split("#")[0];
|
|
80
|
+
// Remove trailing slash
|
|
81
|
+
normalized = normalized.replace(/\/$/, "");
|
|
82
|
+
// Handle template literal placeholders like ${id}
|
|
83
|
+
normalized = normalized.replace(/\$\{[^}]+\}/g, "[param]");
|
|
84
|
+
return normalized;
|
|
85
|
+
}
|
|
86
|
+
async function run() {
|
|
87
|
+
console.log(`\n${console_chars_1.emoji.search} API ROUTE REFERENCE VALIDATION`);
|
|
88
|
+
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
89
|
+
const issues = [];
|
|
90
|
+
const apiReferences = [];
|
|
91
|
+
// Step 1: Find all actual API routes
|
|
92
|
+
console.log(`\n${console_chars_1.emoji.file} Scanning API routes...`);
|
|
93
|
+
const apiRouteFiles = await (0, glob_1.glob)("app/api/**/route.ts", { cwd: process.cwd() });
|
|
94
|
+
const existingRoutes = [];
|
|
95
|
+
for (const routeFile of apiRouteFiles) {
|
|
96
|
+
// Convert file path to API route
|
|
97
|
+
// app/api/store/orders/[id]/label/route.ts -> /api/store/orders/[id]/label
|
|
98
|
+
let route = "/" + routeFile
|
|
99
|
+
.replace(/^app\//, "")
|
|
100
|
+
.replace(/\/route\.ts$/, "");
|
|
101
|
+
existingRoutes.push(route);
|
|
102
|
+
}
|
|
103
|
+
console.log(` Found ${existingRoutes.length} API routes`);
|
|
104
|
+
// Step 2: Find all API references in UI code
|
|
105
|
+
console.log(`\n${console_chars_1.emoji.search} Scanning UI code for API references...`);
|
|
106
|
+
const uiFiles = await (0, glob_1.glob)([
|
|
107
|
+
"app/**/*.tsx",
|
|
108
|
+
"app/**/*.ts",
|
|
109
|
+
"components/**/*.tsx",
|
|
110
|
+
"components/**/*.ts",
|
|
111
|
+
"lib/**/*.ts",
|
|
112
|
+
"hooks/**/*.ts",
|
|
113
|
+
], {
|
|
114
|
+
cwd: process.cwd(),
|
|
115
|
+
ignore: ["app/api/**", "**/*.d.ts", "**/node_modules/**"],
|
|
116
|
+
});
|
|
117
|
+
for (const uiFile of uiFiles) {
|
|
118
|
+
const filePath = path_1.default.join(process.cwd(), uiFile);
|
|
119
|
+
if (!fs_1.default.existsSync(filePath))
|
|
120
|
+
continue;
|
|
121
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
122
|
+
const lines = content.split("\n");
|
|
123
|
+
for (const pattern of API_REFERENCE_PATTERNS) {
|
|
124
|
+
// Reset lastIndex for global regex
|
|
125
|
+
pattern.lastIndex = 0;
|
|
126
|
+
let match;
|
|
127
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
128
|
+
const route = match[1];
|
|
129
|
+
const lineNum = content.substring(0, match.index).split("\n").length;
|
|
130
|
+
const lineContent = lines[lineNum - 1]?.trim() || "";
|
|
131
|
+
apiReferences.push({
|
|
132
|
+
file: uiFile,
|
|
133
|
+
line: lineNum,
|
|
134
|
+
route: route,
|
|
135
|
+
context: lineContent.slice(0, 100),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
console.log(` Found ${apiReferences.length} API references`);
|
|
141
|
+
// Step 3: Check each reference against existing routes
|
|
142
|
+
console.log(`\n${console_chars_1.emoji.check} Validating API references...`);
|
|
143
|
+
for (const ref of apiReferences) {
|
|
144
|
+
const normalizedRef = normalizeApiPath(ref.route);
|
|
145
|
+
// Check if any existing route matches this reference
|
|
146
|
+
const hasMatch = existingRoutes.some((existingRoute) => {
|
|
147
|
+
const routeRegex = routeToRegex(existingRoute);
|
|
148
|
+
return routeRegex.test(normalizedRef);
|
|
149
|
+
});
|
|
150
|
+
if (!hasMatch) {
|
|
151
|
+
// Double-check with normalized versions
|
|
152
|
+
const refWithParam = normalizedRef.replace(/\/[a-zA-Z0-9_-]+(?=\/|$)/g, (segment) => {
|
|
153
|
+
// Check if this could be a dynamic segment
|
|
154
|
+
if (/^\/[a-f0-9-]{20,}$/i.test(segment) || /^\/\d+$/.test(segment)) {
|
|
155
|
+
return "/[param]";
|
|
156
|
+
}
|
|
157
|
+
return segment;
|
|
158
|
+
});
|
|
159
|
+
const stillNoMatch = !existingRoutes.some((existingRoute) => {
|
|
160
|
+
const routeRegex = routeToRegex(existingRoute);
|
|
161
|
+
return routeRegex.test(refWithParam);
|
|
162
|
+
});
|
|
163
|
+
if (stillNoMatch) {
|
|
164
|
+
issues.push({
|
|
165
|
+
file: ref.file,
|
|
166
|
+
line: ref.line,
|
|
167
|
+
route: ref.route,
|
|
168
|
+
description: `References API route that doesn't exist`,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Summary
|
|
174
|
+
console.log(`\n${console_chars_1.emoji.chart} Summary:`);
|
|
175
|
+
console.log(` API routes found: ${existingRoutes.length}`);
|
|
176
|
+
console.log(` API references found: ${apiReferences.length}`);
|
|
177
|
+
console.log(` Missing routes: ${issues.length}`);
|
|
178
|
+
if (issues.length === 0) {
|
|
179
|
+
console.log(`\n${console_chars_1.emoji.success} API ROUTE REFERENCE VALIDATION PASSED`);
|
|
180
|
+
console.log(`\nAll API route references point to existing routes.`);
|
|
181
|
+
return { success: true, errors: 0, warnings: 0 };
|
|
182
|
+
}
|
|
183
|
+
// Group issues by route for cleaner output
|
|
184
|
+
const issuesByRoute = new Map();
|
|
185
|
+
for (const issue of issues) {
|
|
186
|
+
const existing = issuesByRoute.get(issue.route) || [];
|
|
187
|
+
existing.push(issue);
|
|
188
|
+
issuesByRoute.set(issue.route, existing);
|
|
189
|
+
}
|
|
190
|
+
console.log(`\n${console_chars_1.emoji.error} Missing API routes:`);
|
|
191
|
+
for (const [route, routeIssues] of issuesByRoute) {
|
|
192
|
+
console.log(`\n ${route}`);
|
|
193
|
+
console.log(` Referenced in ${routeIssues.length} place(s):`);
|
|
194
|
+
for (const issue of routeIssues.slice(0, 3)) {
|
|
195
|
+
console.log(` - ${issue.file}:${issue.line}`);
|
|
196
|
+
}
|
|
197
|
+
if (routeIssues.length > 3) {
|
|
198
|
+
console.log(` ... and ${routeIssues.length - 3} more`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
console.log(`\n${console_chars_1.emoji.info} To fix missing API routes:`);
|
|
202
|
+
console.log(` 1. Create the missing route.ts file at the expected path`);
|
|
203
|
+
console.log(` 2. Or update the UI to use the correct API path`);
|
|
204
|
+
console.log(` 3. Or remove the dead code if the feature was removed`);
|
|
205
|
+
console.log(`\n${console_chars_1.emoji.error} API ROUTE REFERENCE VALIDATION FAILED`);
|
|
206
|
+
return { success: false, errors: issues.length, warnings: 0 };
|
|
207
|
+
}
|
|
208
|
+
// Allow direct execution
|
|
209
|
+
if (require.main === module) {
|
|
210
|
+
run()
|
|
211
|
+
.then((result) => {
|
|
212
|
+
process.exit(result.success ? 0 : 1);
|
|
213
|
+
})
|
|
214
|
+
.catch((err) => {
|
|
215
|
+
console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
|
|
216
|
+
process.exit(1);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=api-route-reference-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-route-reference-validation.js","sourceRoot":"","sources":["../../../src/checks/data-integrity/api-route-reference-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export declare const id = "system/active-preflight-migration-tracker";
|
|
3
|
+
export declare const name = "Active Preflight Migration Tracker";
|
|
4
|
+
export declare const description = "Detects preflights in active/ that need migration to src/checks/";
|
|
5
|
+
export declare const category = "system";
|
|
6
|
+
export declare const blocking = false;
|
|
7
|
+
export declare const tags: string[];
|
|
8
|
+
export declare function run(): Promise<{
|
|
9
|
+
success: boolean;
|
|
10
|
+
errors: number;
|
|
11
|
+
warnings: number;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=active-preflight-migration-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-preflight-migration-tracker.d.ts","sourceRoot":"","sources":["../../../src/checks/system/active-preflight-migration-tracker.ts"],"names":[],"mappings":";AAwBA,eAAO,MAAM,EAAE,8CAA8C,CAAC;AAC9D,eAAO,MAAM,IAAI,uCAAuC,CAAC;AACzD,eAAO,MAAM,WAAW,qEAAqE,CAAC;AAC9F,eAAO,MAAM,QAAQ,WAAW,CAAC;AACjC,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,IAAI,UAAuD,CAAC;AAyGzE,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA6I3F"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
|
|
8
|
+
exports.run = run;
|
|
9
|
+
/**
|
|
10
|
+
* Active Preflight Migration Tracker
|
|
11
|
+
*
|
|
12
|
+
* INTERNAL CHECK - Detects preflights in active/preflights/ that haven't been
|
|
13
|
+
* migrated to src/checks/ yet. This ensures we don't lose track of preflights
|
|
14
|
+
* that were created in the staging area but never formally added to the package.
|
|
15
|
+
*
|
|
16
|
+
* What it checks:
|
|
17
|
+
* 1. Files in active/preflights/ that don't exist in src/checks/
|
|
18
|
+
* 2. Files that exist in both but have different implementations
|
|
19
|
+
* 3. Files using old format (ESM with import.meta.url) vs new format (CommonJS)
|
|
20
|
+
*
|
|
21
|
+
* This is a META preflight - it checks the preflight-manager package itself,
|
|
22
|
+
* not the target application.
|
|
23
|
+
*/
|
|
24
|
+
const fs_1 = __importDefault(require("fs"));
|
|
25
|
+
const path_1 = __importDefault(require("path"));
|
|
26
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
27
|
+
const glob_1 = require("glob");
|
|
28
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
29
|
+
// METADATA
|
|
30
|
+
exports.id = "system/active-preflight-migration-tracker";
|
|
31
|
+
exports.name = "Active Preflight Migration Tracker";
|
|
32
|
+
exports.description = "Detects preflights in active/ that need migration to src/checks/";
|
|
33
|
+
exports.category = "system";
|
|
34
|
+
exports.blocking = false; // Informational
|
|
35
|
+
exports.tags = ["system", "meta", "migration", "internal", "drift"];
|
|
36
|
+
/**
|
|
37
|
+
* Check if a file uses the old ESM format
|
|
38
|
+
*/
|
|
39
|
+
function checkFileFormat(content) {
|
|
40
|
+
const issues = [];
|
|
41
|
+
// Check for old ESM auto-run pattern
|
|
42
|
+
if (/import\.meta\.url/.test(content)) {
|
|
43
|
+
issues.push("Uses import.meta.url (old ESM pattern)");
|
|
44
|
+
}
|
|
45
|
+
// Check for missing metadata exports
|
|
46
|
+
if (!/export\s+const\s+id\s*=/.test(content)) {
|
|
47
|
+
issues.push("Missing 'id' metadata export");
|
|
48
|
+
}
|
|
49
|
+
if (!/export\s+const\s+name\s*=/.test(content)) {
|
|
50
|
+
issues.push("Missing 'name' metadata export");
|
|
51
|
+
}
|
|
52
|
+
if (!/export\s+const\s+category\s*=/.test(content)) {
|
|
53
|
+
issues.push("Missing 'category' metadata export");
|
|
54
|
+
}
|
|
55
|
+
// Check for old return format
|
|
56
|
+
if (/return\s*\{\s*passed:/.test(content) && !/return\s*\{\s*success:/.test(content)) {
|
|
57
|
+
issues.push("Uses old { passed: } format instead of { success: }");
|
|
58
|
+
}
|
|
59
|
+
// Check for relative imports that won't work in src/checks
|
|
60
|
+
if (/from\s+["']\.\.\/utils\/console-chars["']/.test(content)) {
|
|
61
|
+
issues.push("Uses relative import ../utils/console-chars (needs ../../utils/console-chars)");
|
|
62
|
+
}
|
|
63
|
+
return issues;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Compute hash of file content (ignoring whitespace differences)
|
|
67
|
+
*/
|
|
68
|
+
function computeContentHash(content) {
|
|
69
|
+
// Normalize: remove comments, extra whitespace for comparison
|
|
70
|
+
const normalized = content
|
|
71
|
+
.replace(/\/\*[\s\S]*?\*\//g, "") // Remove block comments
|
|
72
|
+
.replace(/\/\/.*$/gm, "") // Remove line comments
|
|
73
|
+
.replace(/\s+/g, " ") // Normalize whitespace
|
|
74
|
+
.trim();
|
|
75
|
+
return crypto_1.default.createHash("sha256").update(normalized).digest("hex").slice(0, 16);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract the base name for comparison (strips category prefix)
|
|
79
|
+
*/
|
|
80
|
+
function getBaseName(filePath) {
|
|
81
|
+
return path_1.default.basename(filePath, path_1.default.extname(filePath));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Map active/preflights/ paths to expected src/checks/ paths
|
|
85
|
+
*/
|
|
86
|
+
function mapActiveToSrc(activePath) {
|
|
87
|
+
// active/preflights/business/foo.ts -> src/checks/business/foo.ts
|
|
88
|
+
// But also check other likely locations
|
|
89
|
+
const baseName = getBaseName(activePath);
|
|
90
|
+
const activeCategory = activePath.split("/")[2] || activePath.split("\\")[2] || "";
|
|
91
|
+
const possiblePaths = [
|
|
92
|
+
`src/checks/${activeCategory}/${baseName}.ts`,
|
|
93
|
+
`src/checks/${baseName}.ts`,
|
|
94
|
+
];
|
|
95
|
+
// Auth preflights might be in auth/ instead of business/
|
|
96
|
+
if (activeCategory === "business") {
|
|
97
|
+
if (baseName.includes("auth") ||
|
|
98
|
+
baseName.includes("guard") ||
|
|
99
|
+
baseName.includes("store-page") ||
|
|
100
|
+
baseName.includes("redirect") ||
|
|
101
|
+
baseName.includes("protected")) {
|
|
102
|
+
possiblePaths.push(`src/checks/auth/${baseName}.ts`);
|
|
103
|
+
}
|
|
104
|
+
if (baseName.includes("cart") || baseName.includes("checkout") || baseName.includes("order")) {
|
|
105
|
+
possiblePaths.push(`src/checks/cart/${baseName}.ts`);
|
|
106
|
+
possiblePaths.push(`src/checks/checkout/${baseName}.ts`);
|
|
107
|
+
possiblePaths.push(`src/checks/order/${baseName}.ts`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return possiblePaths;
|
|
111
|
+
}
|
|
112
|
+
async function run() {
|
|
113
|
+
console.log(`\n${console_chars_1.emoji.search} ACTIVE PREFLIGHT MIGRATION TRACKER`);
|
|
114
|
+
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
115
|
+
const issues = [];
|
|
116
|
+
const formatIssues = [];
|
|
117
|
+
// Find the preflight-manager root (where this file lives)
|
|
118
|
+
const preflightManagerRoot = path_1.default.resolve(__dirname, "../../..");
|
|
119
|
+
const activeDir = path_1.default.join(preflightManagerRoot, "active/preflights");
|
|
120
|
+
const srcDir = path_1.default.join(preflightManagerRoot, "src/checks");
|
|
121
|
+
if (!fs_1.default.existsSync(activeDir)) {
|
|
122
|
+
console.log(`\n${console_chars_1.emoji.info} No active/preflights/ directory found - skipping`);
|
|
123
|
+
return { success: true, errors: 0, warnings: 0 };
|
|
124
|
+
}
|
|
125
|
+
// Scan active preflights
|
|
126
|
+
const activeFiles = await (0, glob_1.glob)("**/*.ts", {
|
|
127
|
+
cwd: activeDir,
|
|
128
|
+
ignore: ["**/utils/**", "**/workflows/**", "**/*.d.ts"],
|
|
129
|
+
});
|
|
130
|
+
console.log(`\n${console_chars_1.emoji.file} Found ${activeFiles.length} preflights in active/preflights/`);
|
|
131
|
+
// Scan src/checks
|
|
132
|
+
const srcFiles = await (0, glob_1.glob)("**/*.ts", {
|
|
133
|
+
cwd: srcDir,
|
|
134
|
+
ignore: ["**/*.d.ts"],
|
|
135
|
+
});
|
|
136
|
+
const srcFileSet = new Set(srcFiles.map((f) => getBaseName(f)));
|
|
137
|
+
const srcFileMap = new Map();
|
|
138
|
+
for (const f of srcFiles) {
|
|
139
|
+
srcFileMap.set(getBaseName(f), f);
|
|
140
|
+
}
|
|
141
|
+
console.log(`${console_chars_1.emoji.file} Found ${srcFiles.length} preflights in src/checks/\n`);
|
|
142
|
+
// Check each active preflight
|
|
143
|
+
for (const activeFile of activeFiles) {
|
|
144
|
+
const baseName = getBaseName(activeFile);
|
|
145
|
+
const activeFullPath = path_1.default.join(activeDir, activeFile);
|
|
146
|
+
const activeContent = fs_1.default.readFileSync(activeFullPath, "utf-8");
|
|
147
|
+
// Check format issues
|
|
148
|
+
const fmtIssues = checkFileFormat(activeContent);
|
|
149
|
+
if (fmtIssues.length > 0) {
|
|
150
|
+
formatIssues.push({
|
|
151
|
+
file: `active/preflights/${activeFile}`,
|
|
152
|
+
issues: fmtIssues,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// Check if migrated to src/checks/
|
|
156
|
+
if (srcFileSet.has(baseName)) {
|
|
157
|
+
// File exists in both - check if implementations differ
|
|
158
|
+
const srcFile = srcFileMap.get(baseName);
|
|
159
|
+
const srcFullPath = path_1.default.join(srcDir, srcFile);
|
|
160
|
+
const srcContent = fs_1.default.readFileSync(srcFullPath, "utf-8");
|
|
161
|
+
const activeHash = computeContentHash(activeContent);
|
|
162
|
+
const srcHash = computeContentHash(srcContent);
|
|
163
|
+
if (activeHash !== srcHash) {
|
|
164
|
+
issues.push({
|
|
165
|
+
file: baseName,
|
|
166
|
+
type: "different-implementation",
|
|
167
|
+
activeFile: `active/preflights/${activeFile}`,
|
|
168
|
+
srcFile: `src/checks/${srcFile}`,
|
|
169
|
+
description: "Implementations differ - may need sync",
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// File not migrated
|
|
175
|
+
issues.push({
|
|
176
|
+
file: baseName,
|
|
177
|
+
type: "not-migrated",
|
|
178
|
+
activeFile: `active/preflights/${activeFile}`,
|
|
179
|
+
description: "Exists in active/ but not in src/checks/",
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Summary
|
|
184
|
+
const notMigrated = issues.filter((i) => i.type === "not-migrated");
|
|
185
|
+
const differentImpl = issues.filter((i) => i.type === "different-implementation");
|
|
186
|
+
console.log(`${console_chars_1.emoji.chart} Summary:`);
|
|
187
|
+
console.log(` Not migrated: ${notMigrated.length}`);
|
|
188
|
+
console.log(` Different implementations: ${differentImpl.length}`);
|
|
189
|
+
console.log(` Format issues: ${formatIssues.length}`);
|
|
190
|
+
if (issues.length === 0 && formatIssues.length === 0) {
|
|
191
|
+
console.log(`\n${console_chars_1.emoji.success} ACTIVE PREFLIGHT MIGRATION TRACKER PASSED`);
|
|
192
|
+
console.log(`\nAll active preflights have been migrated to src/checks/`);
|
|
193
|
+
return { success: true, errors: 0, warnings: 0 };
|
|
194
|
+
}
|
|
195
|
+
// Report not migrated
|
|
196
|
+
if (notMigrated.length > 0) {
|
|
197
|
+
console.log(`\n${console_chars_1.emoji.warning} Preflights NOT migrated to src/checks/:`);
|
|
198
|
+
for (const issue of notMigrated) {
|
|
199
|
+
console.log(` ${issue.activeFile}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Report different implementations
|
|
203
|
+
if (differentImpl.length > 0) {
|
|
204
|
+
console.log(`\n${console_chars_1.emoji.warning} Preflights with DIFFERENT implementations:`);
|
|
205
|
+
for (const issue of differentImpl) {
|
|
206
|
+
console.log(` ${issue.file}:`);
|
|
207
|
+
console.log(` Active: ${issue.activeFile}`);
|
|
208
|
+
console.log(` Src: ${issue.srcFile}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Report format issues
|
|
212
|
+
if (formatIssues.length > 0) {
|
|
213
|
+
console.log(`\n${console_chars_1.emoji.warning} Files with FORMAT issues (old ESM style):`);
|
|
214
|
+
for (const fmt of formatIssues.slice(0, 10)) {
|
|
215
|
+
console.log(` ${fmt.file}:`);
|
|
216
|
+
for (const issue of fmt.issues) {
|
|
217
|
+
console.log(` - ${issue}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (formatIssues.length > 10) {
|
|
221
|
+
console.log(` ... and ${formatIssues.length - 10} more`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
console.log(`\n${console_chars_1.emoji.info} To migrate a preflight:`);
|
|
225
|
+
console.log(` 1. Copy from active/preflights/ to src/checks/<category>/`);
|
|
226
|
+
console.log(` 2. Update imports: "../utils/console-chars" -> "../../utils/console-chars"`);
|
|
227
|
+
console.log(` 3. Add metadata exports: id, name, description, category, blocking, tags`);
|
|
228
|
+
console.log(` 4. Change return format: { passed: } -> { success: }`);
|
|
229
|
+
console.log(` 5. Change auto-run: import.meta.url -> require.main === module`);
|
|
230
|
+
console.log(`\n${console_chars_1.emoji.warning} ACTIVE PREFLIGHT MIGRATION TRACKER COMPLETED`);
|
|
231
|
+
return { success: true, errors: 0, warnings: notMigrated.length + differentImpl.length };
|
|
232
|
+
}
|
|
233
|
+
// Allow direct execution
|
|
234
|
+
if (require.main === module) {
|
|
235
|
+
run()
|
|
236
|
+
.then((result) => {
|
|
237
|
+
process.exit(result.success ? 0 : 1);
|
|
238
|
+
})
|
|
239
|
+
.catch((err) => {
|
|
240
|
+
console.error(`${console_chars_1.emoji.error} Check failed:`, err);
|
|
241
|
+
process.exit(1);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=active-preflight-migration-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-preflight-migration-tracker.js","sourceRoot":"","sources":["../../../src/checks/system/active-preflight-migration-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export declare const id = "ui/filter-option-coverage";
|
|
3
|
+
export declare const name = "Filter Option Coverage";
|
|
4
|
+
export declare const description = "Detects filter options that don't cover all possible values";
|
|
5
|
+
export declare const category = "ui";
|
|
6
|
+
export declare const blocking = false;
|
|
7
|
+
export declare const tags: string[];
|
|
8
|
+
export declare const requires: string[];
|
|
9
|
+
export declare function run(): Promise<{
|
|
10
|
+
success: boolean;
|
|
11
|
+
errors: number;
|
|
12
|
+
warnings: number;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=filter-option-coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-option-coverage.d.ts","sourceRoot":"","sources":["../../../src/checks/ui/filter-option-coverage.ts"],"names":[],"mappings":";AAyBA,eAAO,MAAM,EAAE,8BAA8B,CAAC;AAC9C,eAAO,MAAM,IAAI,2BAA2B,CAAC;AAC7C,eAAO,MAAM,WAAW,gEAAgE,CAAC;AACzF,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,IAAI,UAAsD,CAAC;AACxE,eAAO,MAAM,QAAQ,UAA0B,CAAC;AAgHhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAoM3F"}
|