@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.
Files changed (24) hide show
  1. package/dist/checks/auth/store-page-auth-guard.d.ts.map +1 -1
  2. package/dist/checks/auth/store-page-auth-guard.js +75 -27
  3. package/dist/checks/auth/store-page-auth-guard.js.map +1 -1
  4. package/dist/checks/data-integrity/api-route-reference-validation.d.ts +14 -0
  5. package/dist/checks/data-integrity/api-route-reference-validation.d.ts.map +1 -0
  6. package/dist/checks/data-integrity/api-route-reference-validation.js +219 -0
  7. package/dist/checks/data-integrity/api-route-reference-validation.js.map +1 -0
  8. package/dist/checks/system/active-preflight-migration-tracker.d.ts +13 -0
  9. package/dist/checks/system/active-preflight-migration-tracker.d.ts.map +1 -0
  10. package/dist/checks/system/active-preflight-migration-tracker.js +244 -0
  11. package/dist/checks/system/active-preflight-migration-tracker.js.map +1 -0
  12. package/dist/checks/ui/filter-option-coverage.d.ts +14 -0
  13. package/dist/checks/ui/filter-option-coverage.d.ts.map +1 -0
  14. package/dist/checks/ui/filter-option-coverage.js +286 -0
  15. package/dist/checks/ui/filter-option-coverage.js.map +1 -0
  16. package/dist/checks/ui/query-param-state-sync.d.ts +14 -0
  17. package/dist/checks/ui/query-param-state-sync.d.ts.map +1 -0
  18. package/dist/checks/ui/query-param-state-sync.js +251 -0
  19. package/dist/checks/ui/query-param-state-sync.js.map +1 -0
  20. package/dist/checks/ui/unimplemented-action-handler.d.ts +14 -0
  21. package/dist/checks/ui/unimplemented-action-handler.d.ts.map +1 -0
  22. package/dist/checks/ui/unimplemented-action-handler.js +230 -0
  23. package/dist/checks/ui/unimplemented-action-handler.js.map +1 -0
  24. 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;AAgFhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA0G3F"}
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 if file doesn't access store data
129
- if (!hasStoreDataAccess(content)) {
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
- if (!hasSessionCheck) {
138
- issues.push({
139
- file: relativePath,
140
- type: "missing-auth",
141
- description: "Missing session/authentication check",
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: "missing-store-access",
153
- description: "Missing store access verification",
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(` ${console_chars_1.emoji.error} Missing: Store access verification`);
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
- else {
159
- console.log(` ${console_chars_1.emoji.success} Found: Store access check`);
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
- // Check for anti-patterns
162
- for (const [name, check] of Object.entries(ANTI_PATTERNS)) {
163
- if (check.pattern.test(content)) {
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: "anti-pattern",
167
- description: check.description,
213
+ type: "missing-auth",
214
+ description: "Store page has no authentication check",
168
215
  critical: true,
169
216
  });
170
- console.log(` ${console_chars_1.emoji.error} Anti-pattern: ${check.description}`);
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":"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"}
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":";;;;;;;AAkGA,kBAiJC;AAlPD;;;;;;;;;;;;;;;GAeG;AACH,4CAAoB;AACpB,gDAAwB;AACxB,+BAA4B;AAE5B,6DAAiE;AAEjE,WAAW;AACE,QAAA,EAAE,GAAG,+CAA+C,CAAC;AACrD,QAAA,IAAI,GAAG,gCAAgC,CAAC;AACxC,QAAA,WAAW,GAAG,sDAAsD,CAAC;AACrE,QAAA,QAAQ,GAAG,gBAAgB,CAAC;AAC5B,QAAA,QAAQ,GAAG,IAAI,CAAC;AAChB,QAAA,IAAI,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AACnE,QAAA,QAAQ,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAgBhD;;GAEG;AACH,MAAM,sBAAsB,GAAG;IAC7B,oBAAoB;IACpB,wCAAwC;IACxC,wBAAwB;IACxB,4CAA4C;IAC5C,kBAAkB;IAClB,sCAAsC;IACtC,kBAAkB;IAClB,kCAAkC;IAClC,oBAAoB;IACpB,wCAAwC;IACxC,0BAA0B;IAC1B,+CAA+C;IAC/C,uBAAuB;IACvB,yCAAyC;IACzC,uBAAuB;IACvB,uCAAuC;CACxC,CAAC;AAEF;;;GAGG;AACH,SAAS,YAAY,CAAC,SAAiB;IACrC,4CAA4C;IAC5C,IAAI,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC5D,sCAAsC;IACtC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;IACzD,0CAA0C;IAC1C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,+BAA+B;IAC/B,IAAI,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,wBAAwB;IACxB,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3C,kDAAkD;IAClD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC3D,OAAO,UAAU,CAAC;AACpB,CAAC;AAEM,KAAK,UAAU,GAAG;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,MAAM,iCAAiC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,IAAA,6BAAa,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAExC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,qCAAqC;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,IAAI,yBAAyB,CAAC,CAAC;IAEtD,MAAM,aAAa,GAAG,MAAM,IAAA,WAAI,EAAC,qBAAqB,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAChF,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,iCAAiC;QACjC,2EAA2E;QAC3E,IAAI,KAAK,GAAG,GAAG,GAAG,SAAS;aACxB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;aACrB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC/B,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,cAAc,CAAC,MAAM,aAAa,CAAC,CAAC;IAE5D,6CAA6C;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,MAAM,yCAAyC,CAAC,CAAC;IAExE,MAAM,OAAO,GAAG,MAAM,IAAA,WAAI,EAAC;QACzB,cAAc;QACd,aAAa;QACb,qBAAqB;QACrB,oBAAoB;QACpB,aAAa;QACb,eAAe;KAChB,EAAE;QACD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC;KAC1D,CAAC,CAAC;IAEH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEvC,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,KAAK,MAAM,OAAO,IAAI,sBAAsB,EAAE,CAAC;YAC7C,mCAAmC;YACnC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,KAAK,CAAC;YAEV,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAChD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvB,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;gBACrE,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAErD,aAAa,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;iBACnC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,aAAa,CAAC,MAAM,iBAAiB,CAAC,CAAC;IAE/D,uDAAuD;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,+BAA+B,CAAC,CAAC;IAE7D,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAElD,qDAAqD;QACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;YACrD,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,OAAO,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,wCAAwC;YACxC,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,OAAO,EAAE,EAAE;gBAClF,2CAA2C;gBAC3C,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnE,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;gBAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC/C,OAAO,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YAEH,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,WAAW,EAAE,yCAAyC;iBACvD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU;IACV,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,WAAW,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,4BAA4B,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAEnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,OAAO,wCAAwC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,2CAA2C;IAC3C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAmB,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,sBAAsB,CAAC,CAAC;IACpD,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,aAAa,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,MAAM,YAAY,CAAC,CAAC;QAChE,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,IAAI,6BAA6B,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IAExE,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,wCAAwC,CAAC,CAAC;IACtE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,GAAG,EAAE;SACF,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,GAAG,qBAAK,CAAC,KAAK,oBAAoB,EAAE,GAAG,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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"}