@empline/preflight 1.1.14 ā 1.1.15
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/session-provider-wrapper.d.ts +47 -0
- package/dist/checks/auth/session-provider-wrapper.d.ts.map +1 -0
- package/dist/checks/auth/session-provider-wrapper.js +286 -0
- package/dist/checks/auth/session-provider-wrapper.js.map +1 -0
- package/dist/checks/database/prisma-upsert-safety.d.ts +39 -0
- package/dist/checks/database/prisma-upsert-safety.d.ts.map +1 -0
- package/dist/checks/database/prisma-upsert-safety.js +220 -0
- package/dist/checks/database/prisma-upsert-safety.js.map +1 -0
- package/dist/checks/dependencies/dependency-health-monitor.d.ts +49 -0
- package/dist/checks/dependencies/dependency-health-monitor.d.ts.map +1 -0
- package/dist/checks/dependencies/dependency-health-monitor.js +323 -0
- package/dist/checks/dependencies/dependency-health-monitor.js.map +1 -0
- package/dist/checks/file-hygiene-validation.d.ts +31 -0
- package/dist/checks/file-hygiene-validation.d.ts.map +1 -0
- package/dist/checks/file-hygiene-validation.js +934 -0
- package/dist/checks/file-hygiene-validation.js.map +1 -0
- package/dist/checks/organization/file-cleanup-validation.d.ts +22 -0
- package/dist/checks/organization/file-cleanup-validation.d.ts.map +1 -0
- package/dist/checks/organization/file-cleanup-validation.js +1121 -0
- package/dist/checks/organization/file-cleanup-validation.js.map +1 -0
- package/dist/checks/runtime/tailwind-runtime-check.d.ts +36 -0
- package/dist/checks/runtime/tailwind-runtime-check.d.ts.map +1 -0
- package/dist/checks/runtime/tailwind-runtime-check.js +264 -0
- package/dist/checks/runtime/tailwind-runtime-check.js.map +1 -0
- package/dist/checks/shipping-integration-validation.d.ts +28 -0
- package/dist/checks/shipping-integration-validation.d.ts.map +1 -0
- package/dist/checks/shipping-integration-validation.js +409 -0
- package/dist/checks/shipping-integration-validation.js.map +1 -0
- package/dist/checks/system/layout-constants-sync.d.ts +36 -0
- package/dist/checks/system/layout-constants-sync.d.ts.map +1 -0
- package/dist/checks/system/layout-constants-sync.js +642 -0
- package/dist/checks/system/layout-constants-sync.js.map +1 -0
- package/dist/checks/system/preflight-circular-dependency-detector.d.ts +26 -0
- package/dist/checks/system/preflight-circular-dependency-detector.d.ts.map +1 -0
- package/dist/checks/system/preflight-circular-dependency-detector.js +310 -0
- package/dist/checks/system/preflight-circular-dependency-detector.js.map +1 -0
- package/dist/checks/system/preflight-execution-benchmarks.d.ts +24 -0
- package/dist/checks/system/preflight-execution-benchmarks.d.ts.map +1 -0
- package/dist/checks/system/preflight-execution-benchmarks.js +282 -0
- package/dist/checks/system/preflight-execution-benchmarks.js.map +1 -0
- package/dist/checks/system/preflight-tag-taxonomy-validator.d.ts +27 -0
- package/dist/checks/system/preflight-tag-taxonomy-validator.d.ts.map +1 -0
- package/dist/checks/system/preflight-tag-taxonomy-validator.js +361 -0
- package/dist/checks/system/preflight-tag-taxonomy-validator.js.map +1 -0
- package/dist/utils/console-chars.d.ts +16 -0
- package/dist/utils/console-chars.d.ts.map +1 -1
- package/dist/utils/console-chars.js +10 -0
- package/dist/utils/console-chars.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Dependency Health Monitor
|
|
4
|
+
*
|
|
5
|
+
* Lightweight, mostly-offline dependency checks intended for preflight usage.
|
|
6
|
+
*
|
|
7
|
+
* Goals:
|
|
8
|
+
* - Flag risky/non-reproducible version ranges (e.g. "*", "latest")
|
|
9
|
+
* - Flag disallowed dependency specifiers (e.g. git/file/link where undesired)
|
|
10
|
+
* - Provide lockfile duplication signals (same package resolved to many versions)
|
|
11
|
+
*
|
|
12
|
+
* Notes:
|
|
13
|
+
* - pnpm lockfile is YAML; we parse it using conservative line-based extraction
|
|
14
|
+
* to avoid adding new deps just for YAML parsing.
|
|
15
|
+
*/
|
|
16
|
+
import type { PreflightResult } from "../../utils/preflight-runner";
|
|
17
|
+
export declare const id = "dependencies/dependency-health-monitor";
|
|
18
|
+
export declare const name = "Dependency Health Monitor";
|
|
19
|
+
export declare const category = "dependencies";
|
|
20
|
+
export declare const blocking = false;
|
|
21
|
+
export declare const description = "Dependency Health Monitor";
|
|
22
|
+
export declare const tags: string[];
|
|
23
|
+
export type DependencyIssueSeverity = "error" | "warning" | "info";
|
|
24
|
+
export interface DependencyIssue {
|
|
25
|
+
severity: DependencyIssueSeverity;
|
|
26
|
+
message: string;
|
|
27
|
+
dependencyName?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface DependencyHealthMonitorOptions {
|
|
30
|
+
workspaceRoot?: string;
|
|
31
|
+
packageJsonPath?: string;
|
|
32
|
+
lockfilePath?: string;
|
|
33
|
+
checkVersionSpecifiers?: boolean;
|
|
34
|
+
checkLockfileDupes?: boolean;
|
|
35
|
+
maxDistinctVersionsWarning?: number;
|
|
36
|
+
maxDistinctVersionsError?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface DependencyHealthReport {
|
|
39
|
+
issues: DependencyIssue[];
|
|
40
|
+
metrics: {
|
|
41
|
+
durationMs: number;
|
|
42
|
+
totalDirectDeps: number;
|
|
43
|
+
totalLockPackages: number;
|
|
44
|
+
packagesWithMultipleVersions: number;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export declare function runDependencyHealthMonitor(options?: DependencyHealthMonitorOptions): Promise<PreflightResult>;
|
|
48
|
+
export declare function run(): Promise<PreflightResult>;
|
|
49
|
+
//# sourceMappingURL=dependency-health-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-health-monitor.d.ts","sourceRoot":"","sources":["../../../src/checks/dependencies/dependency-health-monitor.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAIpE,eAAO,MAAM,EAAE,2CAA2C,CAAC;AAC3D,eAAO,MAAM,IAAI,8BAA8B,CAAC;AAChD,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AACvC,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,WAAW,8BAA8B,CAAC;AACvD,eAAO,MAAM,IAAI,UAAmB,CAAC;AAErC,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,8BAA8B;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAG7B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,4BAA4B,EAAE,MAAM,CAAC;KACtC,CAAC;CACH;AA+GD,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,eAAe,CAAC,CAsJ1B;AAGD,wBAAsB,GAAG,6BAkCxB"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Dependency Health Monitor
|
|
5
|
+
*
|
|
6
|
+
* Lightweight, mostly-offline dependency checks intended for preflight usage.
|
|
7
|
+
*
|
|
8
|
+
* Goals:
|
|
9
|
+
* - Flag risky/non-reproducible version ranges (e.g. "*", "latest")
|
|
10
|
+
* - Flag disallowed dependency specifiers (e.g. git/file/link where undesired)
|
|
11
|
+
* - Provide lockfile duplication signals (same package resolved to many versions)
|
|
12
|
+
*
|
|
13
|
+
* Notes:
|
|
14
|
+
* - pnpm lockfile is YAML; we parse it using conservative line-based extraction
|
|
15
|
+
* to avoid adding new deps just for YAML parsing.
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.tags = exports.description = exports.blocking = exports.category = exports.name = exports.id = void 0;
|
|
52
|
+
exports.runDependencyHealthMonitor = runDependencyHealthMonitor;
|
|
53
|
+
exports.run = run;
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
57
|
+
const universal_progress_reporter_1 = require("../system/universal-progress-reporter");
|
|
58
|
+
// Check metadata
|
|
59
|
+
exports.id = "dependencies/dependency-health-monitor";
|
|
60
|
+
exports.name = "Dependency Health Monitor";
|
|
61
|
+
exports.category = "dependencies";
|
|
62
|
+
exports.blocking = false;
|
|
63
|
+
exports.description = "Dependency Health Monitor";
|
|
64
|
+
exports.tags = ["dependencies"];
|
|
65
|
+
const DEFAULTS = {
|
|
66
|
+
checkVersionSpecifiers: true,
|
|
67
|
+
checkLockfileDupes: true,
|
|
68
|
+
maxDistinctVersionsWarning: 2,
|
|
69
|
+
maxDistinctVersionsError: 5,
|
|
70
|
+
};
|
|
71
|
+
function readJsonFile(filePath) {
|
|
72
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
73
|
+
return JSON.parse(raw);
|
|
74
|
+
}
|
|
75
|
+
function getLastAtIndex(value) {
|
|
76
|
+
// Handles scoped packages like "@types/node@20.11.0" (last '@' splits version)
|
|
77
|
+
return value.lastIndexOf("@");
|
|
78
|
+
}
|
|
79
|
+
function splitNameAndVersion(nameAtVersion) {
|
|
80
|
+
const idx = getLastAtIndex(nameAtVersion);
|
|
81
|
+
if (idx <= 0 || idx === nameAtVersion.length - 1)
|
|
82
|
+
return null;
|
|
83
|
+
return {
|
|
84
|
+
name: nameAtVersion.slice(0, idx),
|
|
85
|
+
version: nameAtVersion.slice(idx + 1),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function extractPnpmLockPackageKeys(lockText) {
|
|
89
|
+
// pnpm-lock.yaml contains a top-level "packages:" section.
|
|
90
|
+
// lockfileVersion 9 (current) uses quoted keys like:
|
|
91
|
+
// packages:
|
|
92
|
+
//
|
|
93
|
+
// '@scope/name@1.2.3':
|
|
94
|
+
// 'react@19.2.3':
|
|
95
|
+
//
|
|
96
|
+
// Older pnpm lock formats may use:
|
|
97
|
+
// /react@18.3.1:
|
|
98
|
+
// /@scope/name@1.2.3:
|
|
99
|
+
// /pkg@1.0.0(react@18.3.1):
|
|
100
|
+
//
|
|
101
|
+
// We conservatively extract both styles.
|
|
102
|
+
const keys = [];
|
|
103
|
+
const lines = lockText.split(/\r?\n/);
|
|
104
|
+
let inPackagesSection = false;
|
|
105
|
+
for (const line of lines) {
|
|
106
|
+
if (!inPackagesSection) {
|
|
107
|
+
if (line.trim() === "packages:") {
|
|
108
|
+
inPackagesSection = true;
|
|
109
|
+
}
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// Exit when we hit another top-level section
|
|
113
|
+
if (/^[^\s]/.test(line))
|
|
114
|
+
break;
|
|
115
|
+
// Style A: two spaces, then quoted key
|
|
116
|
+
const quotedMatch = line.match(/^\s{2}['"]([^'"]+)['"]:\s*$/);
|
|
117
|
+
// Style B: two spaces, then /key
|
|
118
|
+
const slashMatch = line.match(/^\s{2}\/([^:]+):\s*$/);
|
|
119
|
+
const rawKey = quotedMatch?.[1] ?? slashMatch?.[1];
|
|
120
|
+
if (!rawKey)
|
|
121
|
+
continue;
|
|
122
|
+
if (!rawKey)
|
|
123
|
+
continue;
|
|
124
|
+
// Strip peer/dependency suffix in parentheses: "pkg@1.0.0(react@18...)" ā "pkg@1.0.0"
|
|
125
|
+
const keyWithoutPeers = rawKey.split("(")[0] ?? rawKey;
|
|
126
|
+
keys.push(keyWithoutPeers);
|
|
127
|
+
}
|
|
128
|
+
return keys;
|
|
129
|
+
}
|
|
130
|
+
function toPreflightResult(report) {
|
|
131
|
+
const errors = [];
|
|
132
|
+
const warnings = [];
|
|
133
|
+
const info = [];
|
|
134
|
+
for (const issue of report.issues) {
|
|
135
|
+
const prefix = issue.dependencyName ? `[${issue.dependencyName}] ` : "";
|
|
136
|
+
const message = `${prefix}${issue.message}`;
|
|
137
|
+
if (issue.severity === "error")
|
|
138
|
+
errors.push(message);
|
|
139
|
+
else if (issue.severity === "warning")
|
|
140
|
+
warnings.push(message);
|
|
141
|
+
else
|
|
142
|
+
info.push(message);
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
passed: errors.length === 0,
|
|
146
|
+
errors,
|
|
147
|
+
warnings,
|
|
148
|
+
info,
|
|
149
|
+
metrics: {
|
|
150
|
+
durationMs: report.metrics.durationMs,
|
|
151
|
+
totalDirectDeps: report.metrics.totalDirectDeps,
|
|
152
|
+
totalLockPackages: report.metrics.totalLockPackages,
|
|
153
|
+
packagesWithMultipleVersions: report.metrics.packagesWithMultipleVersions,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
async function runDependencyHealthMonitor(options = {}) {
|
|
158
|
+
const startTime = Date.now();
|
|
159
|
+
const workspaceRoot = options.workspaceRoot ?? process.cwd();
|
|
160
|
+
const packageJsonPath = options.packageJsonPath ?? path.join(workspaceRoot, "package.json");
|
|
161
|
+
const lockfilePath = options.lockfilePath ?? path.join(workspaceRoot, "pnpm-lock.yaml");
|
|
162
|
+
const checkVersionSpecifiers = options.checkVersionSpecifiers ?? DEFAULTS.checkVersionSpecifiers;
|
|
163
|
+
const checkLockfileDupes = options.checkLockfileDupes ?? DEFAULTS.checkLockfileDupes;
|
|
164
|
+
const maxDistinctVersionsWarning = options.maxDistinctVersionsWarning ?? DEFAULTS.maxDistinctVersionsWarning;
|
|
165
|
+
const maxDistinctVersionsError = options.maxDistinctVersionsError ?? DEFAULTS.maxDistinctVersionsError;
|
|
166
|
+
const issues = [];
|
|
167
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
168
|
+
issues.push({
|
|
169
|
+
severity: "error",
|
|
170
|
+
message: `package.json not found at ${packageJsonPath}`,
|
|
171
|
+
});
|
|
172
|
+
const durationMs = Date.now() - startTime;
|
|
173
|
+
return toPreflightResult({
|
|
174
|
+
issues,
|
|
175
|
+
metrics: {
|
|
176
|
+
durationMs,
|
|
177
|
+
totalDirectDeps: 0,
|
|
178
|
+
totalLockPackages: 0,
|
|
179
|
+
packagesWithMultipleVersions: 0,
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
const pkg = readJsonFile(packageJsonPath);
|
|
184
|
+
const directDeps = {
|
|
185
|
+
...(pkg.dependencies ?? {}),
|
|
186
|
+
...(pkg.devDependencies ?? {}),
|
|
187
|
+
...(pkg.optionalDependencies ?? {}),
|
|
188
|
+
};
|
|
189
|
+
if (checkVersionSpecifiers) {
|
|
190
|
+
for (const [depName, spec] of Object.entries(directDeps)) {
|
|
191
|
+
const trimmed = String(spec).trim();
|
|
192
|
+
// Common non-reproducible/risky specifiers
|
|
193
|
+
if (trimmed === "*" || trimmed.toLowerCase() === "latest") {
|
|
194
|
+
issues.push({
|
|
195
|
+
severity: "error",
|
|
196
|
+
dependencyName: depName,
|
|
197
|
+
message: `Non-reproducible version specifier: ${spec}`,
|
|
198
|
+
});
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
// Disallow git/file/link by default (these can break reproducibility)
|
|
202
|
+
if (/^git\+/.test(trimmed) ||
|
|
203
|
+
/^git:/.test(trimmed) ||
|
|
204
|
+
/^https?:\/\//.test(trimmed) ||
|
|
205
|
+
/^file:/.test(trimmed) ||
|
|
206
|
+
/^link:/.test(trimmed)) {
|
|
207
|
+
issues.push({
|
|
208
|
+
severity: "warning",
|
|
209
|
+
dependencyName: depName,
|
|
210
|
+
message: `Potentially non-reproducible dependency specifier: ${spec}`,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// workspace:* is typically intentional in monorepos
|
|
214
|
+
if (/^workspace:/.test(trimmed)) {
|
|
215
|
+
issues.push({
|
|
216
|
+
severity: "info",
|
|
217
|
+
dependencyName: depName,
|
|
218
|
+
message: `Workspace dependency: ${spec}`,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
let totalLockPackages = 0;
|
|
224
|
+
let packagesWithMultipleVersions = 0;
|
|
225
|
+
if (checkLockfileDupes) {
|
|
226
|
+
if (!fs.existsSync(lockfilePath)) {
|
|
227
|
+
issues.push({
|
|
228
|
+
severity: "warning",
|
|
229
|
+
message: `pnpm lockfile not found at ${lockfilePath} (skipping lock health checks)`,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
const lockText = fs.readFileSync(lockfilePath, "utf-8");
|
|
234
|
+
const keys = extractPnpmLockPackageKeys(lockText);
|
|
235
|
+
totalLockPackages = keys.length;
|
|
236
|
+
const versionsByName = new Map();
|
|
237
|
+
for (const key of keys) {
|
|
238
|
+
const parsed = splitNameAndVersion(key);
|
|
239
|
+
if (!parsed)
|
|
240
|
+
continue;
|
|
241
|
+
const set = versionsByName.get(parsed.name) ?? new Set();
|
|
242
|
+
set.add(parsed.version);
|
|
243
|
+
versionsByName.set(parsed.name, set);
|
|
244
|
+
}
|
|
245
|
+
for (const [name, versions] of versionsByName.entries()) {
|
|
246
|
+
if (versions.size <= 1)
|
|
247
|
+
continue;
|
|
248
|
+
packagesWithMultipleVersions += 1;
|
|
249
|
+
const sortedVersions = Array.from(versions).sort();
|
|
250
|
+
const versionList = sortedVersions.slice(0, 5).join(", ");
|
|
251
|
+
const extra = sortedVersions.length > 5 ? ` (+${sortedVersions.length - 5} more)` : "";
|
|
252
|
+
if (versions.size >= maxDistinctVersionsError) {
|
|
253
|
+
issues.push({
|
|
254
|
+
severity: "error",
|
|
255
|
+
dependencyName: name,
|
|
256
|
+
message: `Resolved to ${versions.size} distinct versions in lockfile: ${versionList}${extra}`,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
else if (versions.size >= maxDistinctVersionsWarning) {
|
|
260
|
+
issues.push({
|
|
261
|
+
severity: "warning",
|
|
262
|
+
dependencyName: name,
|
|
263
|
+
message: `Resolved to ${versions.size} distinct versions in lockfile: ${versionList}${extra}`,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const durationMs = Date.now() - startTime;
|
|
270
|
+
const report = {
|
|
271
|
+
issues,
|
|
272
|
+
metrics: {
|
|
273
|
+
durationMs,
|
|
274
|
+
totalDirectDeps: Object.keys(directDeps).length,
|
|
275
|
+
totalLockPackages,
|
|
276
|
+
packagesWithMultipleVersions,
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
return toPreflightResult(report);
|
|
280
|
+
}
|
|
281
|
+
// Export run function for framework compatibility
|
|
282
|
+
async function run() {
|
|
283
|
+
const reporter = (0, universal_progress_reporter_1.createUniversalProgressReporter)(path.basename(__filename, ".ts"));
|
|
284
|
+
const result = await runDependencyHealthMonitor();
|
|
285
|
+
console.log("\nš§© DEPENDENCY HEALTH MONITOR\n");
|
|
286
|
+
if (result.errors.length > 0) {
|
|
287
|
+
console.log(`${console_chars_1.emoji.error} ERRORS`);
|
|
288
|
+
for (const error of result.errors)
|
|
289
|
+
console.log(`- ${error}`);
|
|
290
|
+
console.log();
|
|
291
|
+
}
|
|
292
|
+
if (result.warnings.length > 0) {
|
|
293
|
+
console.log(`${console_chars_1.emoji.warning} WARNINGS`);
|
|
294
|
+
for (const warning of result.warnings)
|
|
295
|
+
console.log(`- ${warning}`);
|
|
296
|
+
console.log();
|
|
297
|
+
}
|
|
298
|
+
if (result.info && result.info.length > 0) {
|
|
299
|
+
console.log(`${console_chars_1.emoji.info} INFO`);
|
|
300
|
+
for (const message of result.info)
|
|
301
|
+
console.log(`- ${message}`);
|
|
302
|
+
console.log();
|
|
303
|
+
}
|
|
304
|
+
if (result.metrics) {
|
|
305
|
+
console.log((0, console_chars_1.createDivider)(60, "light"));
|
|
306
|
+
console.log(`Duration: ${result.metrics.durationMs}ms`);
|
|
307
|
+
console.log(`Direct deps: ${result.metrics.totalDirectDeps}`);
|
|
308
|
+
console.log(`Lock packages: ${result.metrics.totalLockPackages}`);
|
|
309
|
+
console.log(`Multi-version packages: ${result.metrics.packagesWithMultipleVersions}`);
|
|
310
|
+
console.log((0, console_chars_1.createDivider)(60, "light"));
|
|
311
|
+
}
|
|
312
|
+
return result;
|
|
313
|
+
}
|
|
314
|
+
// Allow direct execution
|
|
315
|
+
if (require.main === module) {
|
|
316
|
+
run()
|
|
317
|
+
.then((result) => process.exit(result.passed ? 0 : 1))
|
|
318
|
+
.catch((err) => {
|
|
319
|
+
console.error("Error:", err);
|
|
320
|
+
process.exit(1);
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=dependency-health-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-health-monitor.js","sourceRoot":"","sources":["../../../src/checks/dependencies/dependency-health-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* File Hygiene Validation Preflight (BLOCKING)
|
|
4
|
+
*
|
|
5
|
+
* Catches file naming anti-patterns that indicate technical debt:
|
|
6
|
+
* 1. Version suffixes (-v2, -v3, etc.) - indicates unfinished migration
|
|
7
|
+
* 2. Temporary suffixes (-old, -backup, -new, -legacy, -deprecated)
|
|
8
|
+
* 3. Problematic route segments (/new/, /old/, /temp/) in app router
|
|
9
|
+
* 4. Duplicate/shadow files that should be consolidated
|
|
10
|
+
* 5. Case collisions (UserCard.tsx vs usercard.tsx)
|
|
11
|
+
* 6. Component/export name mismatches
|
|
12
|
+
* 7. Directory naming violations
|
|
13
|
+
*
|
|
14
|
+
* BLOCKING: Fails build if violations found (unless allowlisted).
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* pnpm preflight:file-hygiene - BLOCKING mode
|
|
18
|
+
* pnpm preflight:file-hygiene --warning - Warning mode
|
|
19
|
+
* pnpm preflight:file-hygiene --fix-preview - Show migration suggestions
|
|
20
|
+
* pnpm preflight:file-hygiene --add-allowlist <file> - Add to allowlist
|
|
21
|
+
* pnpm preflight:file-hygiene --check-duplicates - Check for duplicate filenames
|
|
22
|
+
* pnpm preflight:file-hygiene --check-exports - Check component/export name match
|
|
23
|
+
*/
|
|
24
|
+
export declare const id = "misc/file-hygiene-validation";
|
|
25
|
+
export declare const name = "File Hygiene Validation";
|
|
26
|
+
export declare const category = "misc";
|
|
27
|
+
export declare const blocking = true;
|
|
28
|
+
export declare const description = "File Hygiene Validation Preflight (BLOCKING)";
|
|
29
|
+
export declare const tags: string[];
|
|
30
|
+
export declare function run(): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=file-hygiene-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-hygiene-validation.d.ts","sourceRoot":"","sources":["../../src/checks/file-hygiene-validation.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAaH,eAAO,MAAM,EAAE,iCAAiC,CAAC;AACjD,eAAO,MAAM,IAAI,4BAA4B,CAAC;AAC9C,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,iDAAiD,CAAC;AAC1E,eAAO,MAAM,IAAI,UAAwB,CAAC;AAo9B1C,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBzC"}
|