@empline/preflight 1.1.34 → 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/store-page-auth-guard.d.ts.map +1 -1
- package/dist/checks/auth/store-page-auth-guard.js +75 -27
- package/dist/checks/auth/store-page-auth-guard.js.map +1 -1
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-page-auth-guard.d.ts","sourceRoot":"","sources":["../../../src/checks/auth/store-page-auth-guard.ts"],"names":[],"mappings":";AA2BA,eAAO,MAAM,EAAE,+BAA+B,CAAC;AAC/C,eAAO,MAAM,IAAI,0BAA0B,CAAC;AAC5C,eAAO,MAAM,WAAW,kEAAkE,CAAC;AAC3F,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA8D,CAAC;AAChF,eAAO,MAAM,QAAQ,UAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"store-page-auth-guard.d.ts","sourceRoot":"","sources":["../../../src/checks/auth/store-page-auth-guard.ts"],"names":[],"mappings":";AA2BA,eAAO,MAAM,EAAE,+BAA+B,CAAC;AAC/C,eAAO,MAAM,IAAI,0BAA0B,CAAC;AAC5C,eAAO,MAAM,WAAW,kEAAkE,CAAC;AAC3F,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA8D,CAAC;AAChF,eAAO,MAAM,QAAQ,UAA0B,CAAC;AAiGhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA4I3F"}
|
|
@@ -79,6 +79,12 @@ const STORE_DATA_PATTERNS = [
|
|
|
79
79
|
/getStoreData|fetchStore|loadStore/i,
|
|
80
80
|
/params\.storeId|storeId.*params/i,
|
|
81
81
|
];
|
|
82
|
+
/**
|
|
83
|
+
* Pattern for pages that just render a client component without auth
|
|
84
|
+
* These are dangerous because the client component will make API calls
|
|
85
|
+
* but the page itself has no server-side auth gate
|
|
86
|
+
*/
|
|
87
|
+
const RENDERS_CLIENT_ONLY_PATTERN = /export\s+default\s+function\s+\w+\s*\([^)]*\)\s*\{?\s*return\s+<\w+Client/;
|
|
82
88
|
/**
|
|
83
89
|
* Anti-patterns - dangerous code patterns
|
|
84
90
|
*/
|
|
@@ -102,6 +108,14 @@ const ANTI_PATTERNS = {
|
|
|
102
108
|
function hasStoreDataAccess(content) {
|
|
103
109
|
return STORE_DATA_PATTERNS.some((pattern) => pattern.test(content));
|
|
104
110
|
}
|
|
111
|
+
function isClientComponent(content) {
|
|
112
|
+
// Check first few lines for "use client" directive
|
|
113
|
+
const header = content.substring(0, 500);
|
|
114
|
+
return /["']use client["']/.test(header);
|
|
115
|
+
}
|
|
116
|
+
function rendersClientComponentOnly(content) {
|
|
117
|
+
return RENDERS_CLIENT_ONLY_PATTERN.test(content);
|
|
118
|
+
}
|
|
105
119
|
async function run() {
|
|
106
120
|
console.log(`\n${console_chars_1.emoji.shield} STORE PAGE AUTH GUARD CHECK`);
|
|
107
121
|
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
@@ -125,49 +139,83 @@ async function run() {
|
|
|
125
139
|
continue;
|
|
126
140
|
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
127
141
|
filesChecked.push(relativePath);
|
|
128
|
-
// Skip
|
|
129
|
-
|
|
142
|
+
// Skip client components - they can't do server auth anyway
|
|
143
|
+
// (client-only-protected-pages.ts handles those)
|
|
144
|
+
if (isClientComponent(content)) {
|
|
130
145
|
continue;
|
|
131
146
|
}
|
|
132
|
-
console.log(`\n${console_chars_1.emoji.file} ${relativePath} (accesses store data)`);
|
|
133
147
|
// Check for required auth patterns
|
|
134
148
|
const hasSessionCheck = REQUIRED_AUTH_PATTERNS.sessionCheck.pattern.test(content);
|
|
135
149
|
const hasStoreAccessCheck = REQUIRED_AUTH_PATTERNS.storeAccessCheck.pattern.test(content);
|
|
136
150
|
const hasOwnershipCheck = REQUIRED_AUTH_PATTERNS.ownershipCheck.pattern.test(content);
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
critical: true,
|
|
143
|
-
});
|
|
144
|
-
console.log(` ${console_chars_1.emoji.error} Missing: Session/authentication check`);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
console.log(` ${console_chars_1.emoji.success} Found: Session check`);
|
|
148
|
-
}
|
|
149
|
-
if (!hasStoreAccessCheck && !hasOwnershipCheck) {
|
|
151
|
+
const accessesStoreData = hasStoreDataAccess(content);
|
|
152
|
+
const rendersClient = rendersClientComponentOnly(content);
|
|
153
|
+
// CRITICAL: Pages that just render a client component without auth
|
|
154
|
+
// Examples: app/store/daily-summary/page.tsx, app/store/disputes/page.tsx
|
|
155
|
+
if (rendersClient && !hasSessionCheck) {
|
|
150
156
|
issues.push({
|
|
151
157
|
file: relativePath,
|
|
152
|
-
type: "
|
|
153
|
-
description: "
|
|
158
|
+
type: "renders-client-without-auth",
|
|
159
|
+
description: "Page renders client component without server-side auth - unauth users see broken UI",
|
|
154
160
|
critical: true,
|
|
155
161
|
});
|
|
156
|
-
console.log(
|
|
162
|
+
console.log(`\n${console_chars_1.emoji.file} ${relativePath}`);
|
|
163
|
+
console.log(` ${console_chars_1.emoji.error} Renders client component without server auth`);
|
|
164
|
+
continue; // Don't check other patterns for these simple wrapper pages
|
|
157
165
|
}
|
|
158
|
-
|
|
159
|
-
|
|
166
|
+
// For pages that access store data, check all patterns
|
|
167
|
+
if (accessesStoreData) {
|
|
168
|
+
console.log(`\n${console_chars_1.emoji.file} ${relativePath} (accesses store data)`);
|
|
169
|
+
if (!hasSessionCheck) {
|
|
170
|
+
issues.push({
|
|
171
|
+
file: relativePath,
|
|
172
|
+
type: "missing-auth",
|
|
173
|
+
description: "Missing session/authentication check",
|
|
174
|
+
critical: true,
|
|
175
|
+
});
|
|
176
|
+
console.log(` ${console_chars_1.emoji.error} Missing: Session/authentication check`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
console.log(` ${console_chars_1.emoji.success} Found: Session check`);
|
|
180
|
+
}
|
|
181
|
+
if (!hasStoreAccessCheck && !hasOwnershipCheck) {
|
|
182
|
+
issues.push({
|
|
183
|
+
file: relativePath,
|
|
184
|
+
type: "missing-store-access",
|
|
185
|
+
description: "Missing store access verification",
|
|
186
|
+
critical: true,
|
|
187
|
+
});
|
|
188
|
+
console.log(` ${console_chars_1.emoji.error} Missing: Store access verification`);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
console.log(` ${console_chars_1.emoji.success} Found: Store access check`);
|
|
192
|
+
}
|
|
193
|
+
// Check for anti-patterns
|
|
194
|
+
for (const [name, check] of Object.entries(ANTI_PATTERNS)) {
|
|
195
|
+
if (check.pattern.test(content)) {
|
|
196
|
+
issues.push({
|
|
197
|
+
file: relativePath,
|
|
198
|
+
type: "anti-pattern",
|
|
199
|
+
description: check.description,
|
|
200
|
+
critical: true,
|
|
201
|
+
});
|
|
202
|
+
console.log(` ${console_chars_1.emoji.error} Anti-pattern: ${check.description}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
160
205
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
206
|
+
else if (!hasSessionCheck && !rendersClient) {
|
|
207
|
+
// Server component that doesn't access data but also has no auth
|
|
208
|
+
// This might be intentional (like a layout that delegates to children)
|
|
209
|
+
// But for page.tsx files, it's likely a problem
|
|
210
|
+
if (relativePath.endsWith("page.tsx")) {
|
|
164
211
|
issues.push({
|
|
165
212
|
file: relativePath,
|
|
166
|
-
type: "
|
|
167
|
-
description: check
|
|
213
|
+
type: "missing-auth",
|
|
214
|
+
description: "Store page has no authentication check",
|
|
168
215
|
critical: true,
|
|
169
216
|
});
|
|
170
|
-
console.log(
|
|
217
|
+
console.log(`\n${console_chars_1.emoji.file} ${relativePath}`);
|
|
218
|
+
console.log(` ${console_chars_1.emoji.error} No authentication check found`);
|
|
171
219
|
}
|
|
172
220
|
}
|
|
173
221
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-page-auth-guard.js","sourceRoot":"","sources":["../../../src/checks/auth/store-page-auth-guard.ts"],"names":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"store-page-auth-guard.js","sourceRoot":"","sources":["../../../src/checks/auth/store-page-auth-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export declare const id = "data-integrity/api-route-reference-validation";
|
|
3
|
+
export declare const name = "API Route Reference Validation";
|
|
4
|
+
export declare const description = "Detects UI references to API routes that don't exist";
|
|
5
|
+
export declare const category = "data-integrity";
|
|
6
|
+
export declare const blocking = true;
|
|
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=api-route-reference-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-route-reference-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/data-integrity/api-route-reference-validation.ts"],"names":[],"mappings":";AAwBA,eAAO,MAAM,EAAE,kDAAkD,CAAC;AAClE,eAAO,MAAM,IAAI,mCAAmC,CAAC;AACrD,eAAO,MAAM,WAAW,yDAAyD,CAAC;AAClF,eAAO,MAAM,QAAQ,mBAAmB,CAAC;AACzC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA8D,CAAC;AAChF,eAAO,MAAM,QAAQ,UAA0B,CAAC;AAoEhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAiJ3F"}
|
|
@@ -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"}
|