@tractorcow/beefup 0.0.0 → 1.0.0
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/LICENSE +15 -0
- package/README.md +108 -0
- package/dist/__tests__/with-safe-chain-stubs.d.ts +5 -0
- package/dist/__tests__/with-safe-chain-stubs.js +25 -0
- package/dist/__tests__/with-safe-chain-stubs.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +6 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/args.d.ts +18 -0
- package/dist/cli/args.js +88 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +81 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/commands/accept.d.ts +16 -0
- package/dist/commands/accept.js +47 -0
- package/dist/commands/accept.js.map +1 -0
- package/dist/commands/report.d.ts +19 -0
- package/dist/commands/report.js +151 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/stage.d.ts +16 -0
- package/dist/commands/stage.js +60 -0
- package/dist/commands/stage.js.map +1 -0
- package/dist/config/load.d.ts +6 -0
- package/dist/config/load.js +103 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/types.d.ts +75 -0
- package/dist/config/types.js +68 -0
- package/dist/config/types.js.map +1 -0
- package/dist/diff/diff.d.ts +21 -0
- package/dist/diff/diff.js +132 -0
- package/dist/diff/diff.js.map +1 -0
- package/dist/diff/group.d.ts +5 -0
- package/dist/diff/group.js +24 -0
- package/dist/diff/group.js.map +1 -0
- package/dist/diff/types.d.ts +37 -0
- package/dist/diff/types.js +7 -0
- package/dist/diff/types.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/fsutil.d.ts +20 -0
- package/dist/fsutil.js +43 -0
- package/dist/fsutil.js.map +1 -0
- package/dist/lockfile/locked.d.ts +9 -0
- package/dist/lockfile/locked.js +15 -0
- package/dist/lockfile/locked.js.map +1 -0
- package/dist/lockfile/npm.d.ts +15 -0
- package/dist/lockfile/npm.js +152 -0
- package/dist/lockfile/npm.js.map +1 -0
- package/dist/lockfile/pnpm.d.ts +27 -0
- package/dist/lockfile/pnpm.js +155 -0
- package/dist/lockfile/pnpm.js.map +1 -0
- package/dist/lockfile/resolve.d.ts +10 -0
- package/dist/lockfile/resolve.js +20 -0
- package/dist/lockfile/resolve.js.map +1 -0
- package/dist/lockfile/types.d.ts +49 -0
- package/dist/lockfile/types.js +2 -0
- package/dist/lockfile/types.js.map +1 -0
- package/dist/pm/cve-lite-bin.d.ts +5 -0
- package/dist/pm/cve-lite-bin.js +36 -0
- package/dist/pm/cve-lite-bin.js.map +1 -0
- package/dist/pm/install.d.ts +24 -0
- package/dist/pm/install.js +30 -0
- package/dist/pm/install.js.map +1 -0
- package/dist/pm/runner.d.ts +17 -0
- package/dist/pm/runner.js +27 -0
- package/dist/pm/runner.js.map +1 -0
- package/dist/pm/safe-chain.d.ts +17 -0
- package/dist/pm/safe-chain.js +65 -0
- package/dist/pm/safe-chain.js.map +1 -0
- package/dist/pm/update.d.ts +16 -0
- package/dist/pm/update.js +25 -0
- package/dist/pm/update.js.map +1 -0
- package/dist/policy/alignment.d.ts +13 -0
- package/dist/policy/alignment.js +171 -0
- package/dist/policy/alignment.js.map +1 -0
- package/dist/policy/evaluate.d.ts +19 -0
- package/dist/policy/evaluate.js +75 -0
- package/dist/policy/evaluate.js.map +1 -0
- package/dist/policy/overrides.d.ts +42 -0
- package/dist/policy/overrides.js +358 -0
- package/dist/policy/overrides.js.map +1 -0
- package/dist/policy/ranges.d.ts +13 -0
- package/dist/policy/ranges.js +58 -0
- package/dist/policy/ranges.js.map +1 -0
- package/dist/project/collect.d.ts +15 -0
- package/dist/project/collect.js +60 -0
- package/dist/project/collect.js.map +1 -0
- package/dist/project/detect.d.ts +5 -0
- package/dist/project/detect.js +76 -0
- package/dist/project/detect.js.map +1 -0
- package/dist/project/direct-deps.d.ts +7 -0
- package/dist/project/direct-deps.js +28 -0
- package/dist/project/direct-deps.js.map +1 -0
- package/dist/project/package-json.d.ts +20 -0
- package/dist/project/package-json.js +6 -0
- package/dist/project/package-json.js.map +1 -0
- package/dist/project/paths.d.ts +31 -0
- package/dist/project/paths.js +45 -0
- package/dist/project/paths.js.map +1 -0
- package/dist/project/types.d.ts +13 -0
- package/dist/project/types.js +6 -0
- package/dist/project/types.js.map +1 -0
- package/dist/project/workspace.d.ts +14 -0
- package/dist/project/workspace.js +80 -0
- package/dist/project/workspace.js.map +1 -0
- package/dist/report/ansi.d.ts +31 -0
- package/dist/report/ansi.js +59 -0
- package/dist/report/ansi.js.map +1 -0
- package/dist/report/html.d.ts +6 -0
- package/dist/report/html.js +260 -0
- package/dist/report/html.js.map +1 -0
- package/dist/report/markdown.d.ts +6 -0
- package/dist/report/markdown.js +234 -0
- package/dist/report/markdown.js.map +1 -0
- package/dist/report/shared.d.ts +25 -0
- package/dist/report/shared.js +32 -0
- package/dist/report/shared.js.map +1 -0
- package/dist/report/text.d.ts +10 -0
- package/dist/report/text.js +156 -0
- package/dist/report/text.js.map +1 -0
- package/dist/report/types.d.ts +20 -0
- package/dist/report/types.js +2 -0
- package/dist/report/types.js.map +1 -0
- package/dist/rewrite/constraints.d.ts +20 -0
- package/dist/rewrite/constraints.js +64 -0
- package/dist/rewrite/constraints.js.map +1 -0
- package/dist/rewrite/repin.d.ts +8 -0
- package/dist/rewrite/repin.js +28 -0
- package/dist/rewrite/repin.js.map +1 -0
- package/dist/rewrite/workspace.d.ts +14 -0
- package/dist/rewrite/workspace.js +40 -0
- package/dist/rewrite/workspace.js.map +1 -0
- package/dist/security/classify.d.ts +48 -0
- package/dist/security/classify.js +86 -0
- package/dist/security/classify.js.map +1 -0
- package/dist/security/cve-lite.d.ts +7 -0
- package/dist/security/cve-lite.js +78 -0
- package/dist/security/cve-lite.js.map +1 -0
- package/dist/security/npm-audit.d.ts +10 -0
- package/dist/security/npm-audit.js +65 -0
- package/dist/security/npm-audit.js.map +1 -0
- package/dist/security/refs.d.ts +63 -0
- package/dist/security/refs.js +218 -0
- package/dist/security/refs.js.map +1 -0
- package/dist/security/scan.d.ts +13 -0
- package/dist/security/scan.js +32 -0
- package/dist/security/scan.js.map +1 -0
- package/dist/strategy/git.d.ts +16 -0
- package/dist/strategy/git.js +92 -0
- package/dist/strategy/git.js.map +1 -0
- package/dist/strategy/index.d.ts +7 -0
- package/dist/strategy/index.js +13 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/strategy/inplace.d.ts +30 -0
- package/dist/strategy/inplace.js +77 -0
- package/dist/strategy/inplace.js.map +1 -0
- package/dist/strategy/types.d.ts +13 -0
- package/dist/strategy/types.js +2 -0
- package/dist/strategy/types.js.map +1 -0
- package/dist/strategy/worktree.d.ts +26 -0
- package/dist/strategy/worktree.js +74 -0
- package/dist/strategy/worktree.js.map +1 -0
- package/package.json +60 -4
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import semver from "semver";
|
|
2
|
+
import { BannedRangeTags } from "../config/types.js";
|
|
3
|
+
import { stripPnpmPeerSuffix } from "../lockfile/pnpm.js";
|
|
4
|
+
import { PackageManagers } from "../project/types.js";
|
|
5
|
+
const BANNED_OVERRIDE_TAGS = new Set([BannedRangeTags.Latest]);
|
|
6
|
+
/**
|
|
7
|
+
* Parses an override key into a package name and optional version selector.
|
|
8
|
+
*/
|
|
9
|
+
function parseOverrideKey(key) {
|
|
10
|
+
if (key.startsWith("@")) {
|
|
11
|
+
const slash = key.indexOf("/");
|
|
12
|
+
if (slash === -1) {
|
|
13
|
+
return { name: key, selector: null };
|
|
14
|
+
}
|
|
15
|
+
const at = key.indexOf("@", slash);
|
|
16
|
+
if (at === -1) {
|
|
17
|
+
return { name: key, selector: null };
|
|
18
|
+
}
|
|
19
|
+
return { name: key.slice(0, at), selector: key.slice(at + 1) };
|
|
20
|
+
}
|
|
21
|
+
const at = key.indexOf("@");
|
|
22
|
+
if (at === -1) {
|
|
23
|
+
return { name: key, selector: null };
|
|
24
|
+
}
|
|
25
|
+
return { name: key.slice(0, at), selector: key.slice(at + 1) };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolves `$dep` override references against direct package.json dependencies.
|
|
29
|
+
*/
|
|
30
|
+
function resolveDollarRef(value, pkg) {
|
|
31
|
+
if (!value.startsWith("$")) {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
const ref = value.slice(1);
|
|
35
|
+
const buckets = [
|
|
36
|
+
pkg.dependencies,
|
|
37
|
+
pkg.devDependencies,
|
|
38
|
+
pkg.optionalDependencies,
|
|
39
|
+
pkg.peerDependencies,
|
|
40
|
+
];
|
|
41
|
+
for (const bucket of buckets) {
|
|
42
|
+
if (bucket && typeof bucket[ref] === "string") {
|
|
43
|
+
return bucket[ref];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
throw new Error(`override value "${value}" references missing dependency "${ref}"`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns true when an override target uses a banned floating tag such as latest.
|
|
50
|
+
*/
|
|
51
|
+
function isBannedOverrideTarget(raw) {
|
|
52
|
+
const value = raw.trim();
|
|
53
|
+
if (BANNED_OVERRIDE_TAGS.has(value.toLowerCase())) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
const npmAlias = value.match(/^npm:(@?[^@]+)@(.+)$/);
|
|
57
|
+
if (npmAlias && BANNED_OVERRIDE_TAGS.has(npmAlias[2].toLowerCase())) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolves an override target string into a concrete semver version when possible.
|
|
64
|
+
*/
|
|
65
|
+
function parseOverrideTarget(raw, pkg) {
|
|
66
|
+
const value = resolveDollarRef(raw, pkg);
|
|
67
|
+
const npmAlias = value.match(/^npm:(@?[^@]+)@(.+)$/);
|
|
68
|
+
if (npmAlias) {
|
|
69
|
+
const version = npmAlias[2];
|
|
70
|
+
return { version: semver.valid(version) ? version : null, raw: value };
|
|
71
|
+
}
|
|
72
|
+
if (semver.valid(value)) {
|
|
73
|
+
return { version: value, raw: value };
|
|
74
|
+
}
|
|
75
|
+
return { version: null, raw: value };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Flattens nested npm/pnpm override maps into individual pin records.
|
|
79
|
+
*/
|
|
80
|
+
function flattenOverrides(node, trail = [], scopedTo = null) {
|
|
81
|
+
const pins = [];
|
|
82
|
+
for (const [key, value] of Object.entries(node)) {
|
|
83
|
+
if (typeof value === "string") {
|
|
84
|
+
const { name, selector } = parseOverrideKey(key);
|
|
85
|
+
pins.push({
|
|
86
|
+
logicalName: name,
|
|
87
|
+
selector,
|
|
88
|
+
targetRaw: value,
|
|
89
|
+
trail: [...trail, key],
|
|
90
|
+
scopedTo,
|
|
91
|
+
});
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (!value || typeof value !== "object") {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const nested = value;
|
|
98
|
+
const { name: parentName } = parseOverrideKey(key);
|
|
99
|
+
if (typeof nested["."] === "string") {
|
|
100
|
+
const { name, selector } = parseOverrideKey(key);
|
|
101
|
+
pins.push({
|
|
102
|
+
logicalName: name,
|
|
103
|
+
selector,
|
|
104
|
+
targetRaw: nested["."],
|
|
105
|
+
trail: [...trail, key, "."],
|
|
106
|
+
scopedTo,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
for (const [childKey, childVal] of Object.entries(nested)) {
|
|
110
|
+
if (childKey === ".") {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (typeof childVal === "string") {
|
|
114
|
+
const { name, selector } = parseOverrideKey(childKey);
|
|
115
|
+
pins.push({
|
|
116
|
+
logicalName: name,
|
|
117
|
+
selector,
|
|
118
|
+
targetRaw: childVal,
|
|
119
|
+
trail: [...trail, key, childKey],
|
|
120
|
+
scopedTo: parentName,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else if (childVal && typeof childVal === "object") {
|
|
124
|
+
pins.push(...flattenOverrides({ [childKey]: childVal }, [...trail, key], parentName));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return pins;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Collects dependency request ranges for a package from a normalized lockfile.
|
|
132
|
+
*/
|
|
133
|
+
function collectRequestedRanges(packageName, lock) {
|
|
134
|
+
const requests = [];
|
|
135
|
+
const packages = (lock.packages ?? {});
|
|
136
|
+
for (const [lockKey, meta] of Object.entries(packages)) {
|
|
137
|
+
if (!meta || typeof meta !== "object") {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const entry = meta;
|
|
141
|
+
const depBuckets = [
|
|
142
|
+
entry.dependencies,
|
|
143
|
+
entry.optionalDependencies,
|
|
144
|
+
entry.peerDependencies,
|
|
145
|
+
entry.devDependencies,
|
|
146
|
+
];
|
|
147
|
+
for (const bucket of depBuckets) {
|
|
148
|
+
if (!bucket || typeof bucket !== "object") {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const deps = bucket;
|
|
152
|
+
if (typeof deps[packageName] !== "string") {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const from = lockKey === "" ? "(root package.json)" : lockKey.replace(/^node_modules\//, "");
|
|
156
|
+
requests.push({ from, range: stripPnpmPeerSuffix(deps[packageName]) });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return requests;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Converts a pnpm lockfile into an npm-like packages map for override checks.
|
|
163
|
+
*/
|
|
164
|
+
function normalizePnpmLock(lock) {
|
|
165
|
+
const packages = {};
|
|
166
|
+
const importers = lock.importers ?? {};
|
|
167
|
+
for (const [importerPath, meta] of Object.entries(importers)) {
|
|
168
|
+
const key = importerPath === "." ? "" : importerPath;
|
|
169
|
+
/**
|
|
170
|
+
* Extracts specifier strings from a pnpm importer dependency bucket.
|
|
171
|
+
*/
|
|
172
|
+
const take = (bucket) => {
|
|
173
|
+
const out = {};
|
|
174
|
+
if (!bucket) {
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
177
|
+
for (const [name, info] of Object.entries(bucket)) {
|
|
178
|
+
if (typeof info === "string") {
|
|
179
|
+
out[name] = info;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (info && typeof info.specifier === "string") {
|
|
183
|
+
out[name] = info.specifier;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return out;
|
|
187
|
+
};
|
|
188
|
+
packages[key] = {
|
|
189
|
+
dependencies: take(meta.dependencies),
|
|
190
|
+
optionalDependencies: take(meta.optionalDependencies),
|
|
191
|
+
peerDependencies: take(meta.peerDependencies),
|
|
192
|
+
devDependencies: take(meta.devDependencies),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Merges resolved dependency maps from packages/snapshots into `packages`.
|
|
197
|
+
*/
|
|
198
|
+
const takeResolved = (section) => {
|
|
199
|
+
if (!section) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
for (const [lockKey, meta] of Object.entries(section)) {
|
|
203
|
+
if (!meta || typeof meta !== "object") {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
const entry = meta;
|
|
207
|
+
if (!packages[lockKey]) {
|
|
208
|
+
packages[lockKey] = {};
|
|
209
|
+
}
|
|
210
|
+
for (const field of ["dependencies", "optionalDependencies", "peerDependencies"]) {
|
|
211
|
+
const bucket = entry[field];
|
|
212
|
+
if (!bucket || typeof bucket !== "object") {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const out = {
|
|
216
|
+
...(packages[lockKey][field] ?? {}),
|
|
217
|
+
};
|
|
218
|
+
for (const [name, value] of Object.entries(bucket)) {
|
|
219
|
+
if (typeof value === "string") {
|
|
220
|
+
out[name] = value;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
packages[lockKey][field] = out;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
takeResolved(lock.packages);
|
|
228
|
+
takeResolved(lock.snapshots);
|
|
229
|
+
return { packages };
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Returns true when a dependency request falls within an override selector scope.
|
|
233
|
+
*/
|
|
234
|
+
function requestInOverrideScope(requestRange, selector) {
|
|
235
|
+
if (!selector) {
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
if (!semver.validRange(selector) || !semver.validRange(requestRange)) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
return semver.intersects(requestRange, selector, true);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Returns true when a pin version is strictly below a requested range's minimum.
|
|
245
|
+
*/
|
|
246
|
+
function pinBelowRequest(pinVersion, requestRange) {
|
|
247
|
+
if (semver.satisfies(pinVersion, requestRange, { includePrerelease: true })) {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
const minimum = semver.minVersion(requestRange);
|
|
251
|
+
if (!minimum) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
return semver.lt(pinVersion, minimum);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Finds override pins that are banned floating tags or below requested ranges.
|
|
258
|
+
*/
|
|
259
|
+
export function findStaleOverridePins(pkg, lock) {
|
|
260
|
+
const overrides = pkg.overrides;
|
|
261
|
+
if (!overrides || typeof overrides !== "object") {
|
|
262
|
+
return [];
|
|
263
|
+
}
|
|
264
|
+
const errors = [];
|
|
265
|
+
const pins = flattenOverrides(overrides);
|
|
266
|
+
for (const pin of pins) {
|
|
267
|
+
const label = pin.trail.join(" → ");
|
|
268
|
+
let target;
|
|
269
|
+
try {
|
|
270
|
+
target = parseOverrideTarget(pin.targetRaw, pkg);
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
errors.push({
|
|
274
|
+
override: label,
|
|
275
|
+
message: err instanceof Error ? err.message : String(err),
|
|
276
|
+
});
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (isBannedOverrideTarget(target.raw)) {
|
|
280
|
+
errors.push({
|
|
281
|
+
override: label,
|
|
282
|
+
message: `pin must not use floating tag "${BannedRangeTags.Latest}" (got ${target.raw}); pin a concrete semver version instead`,
|
|
283
|
+
});
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (!target.version || !semver.valid(target.version)) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
const requests = collectRequestedRanges(pin.logicalName, lock);
|
|
290
|
+
const seen = new Set();
|
|
291
|
+
for (const req of requests) {
|
|
292
|
+
if (req.range.startsWith("npm:") || req.range.startsWith("file:")) {
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
if (!semver.validRange(req.range)) {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (!requestInOverrideScope(req.range, pin.selector)) {
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (pin.scopedTo) {
|
|
302
|
+
const fromName = req.from.split("/node_modules/").pop();
|
|
303
|
+
if (fromName !== pin.scopedTo) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const key = `${req.from}::${req.range}`;
|
|
308
|
+
if (seen.has(key)) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
seen.add(key);
|
|
312
|
+
if (pinBelowRequest(target.version, req.range)) {
|
|
313
|
+
const minimum = semver.minVersion(req.range);
|
|
314
|
+
errors.push({
|
|
315
|
+
override: label,
|
|
316
|
+
message: `pin ${pin.logicalName}@${target.version} is below ` +
|
|
317
|
+
`${req.from} → ${pin.logicalName}@${req.range}` +
|
|
318
|
+
(minimum ? ` (minimum ${minimum.version})` : ""),
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return errors;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Finds keys where package.json and pnpm-workspace.yaml overrides disagree.
|
|
327
|
+
*/
|
|
328
|
+
export function findWorkspaceOverrideDrift(pkg, workspaceOverrides) {
|
|
329
|
+
if (!workspaceOverrides) {
|
|
330
|
+
return [];
|
|
331
|
+
}
|
|
332
|
+
const pkgOverrides = pkg.overrides && typeof pkg.overrides === "object" ? pkg.overrides : {};
|
|
333
|
+
const errors = [];
|
|
334
|
+
const keys = new Set([...Object.keys(pkgOverrides), ...Object.keys(workspaceOverrides)]);
|
|
335
|
+
for (const key of keys) {
|
|
336
|
+
const left = JSON.stringify(pkgOverrides[key] ?? null);
|
|
337
|
+
const right = JSON.stringify(workspaceOverrides[key] ?? null);
|
|
338
|
+
if (left !== right) {
|
|
339
|
+
errors.push({
|
|
340
|
+
override: key,
|
|
341
|
+
message: `package.json#overrides and pnpm-workspace.yaml#overrides disagree ` +
|
|
342
|
+
`(package.json=${left}, workspace=${right})`,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return errors;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Normalizes a lockfile into the packages shape used by override pin checks.
|
|
350
|
+
*/
|
|
351
|
+
export function normalizeLockForOverrides(packageManager, lock) {
|
|
352
|
+
if (packageManager === PackageManagers.Pnpm) {
|
|
353
|
+
return normalizePnpmLock(lock);
|
|
354
|
+
}
|
|
355
|
+
return lock;
|
|
356
|
+
}
|
|
357
|
+
export { parseOverrideKey, flattenOverrides };
|
|
358
|
+
//# sourceMappingURL=overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/policy/overrides.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type AlignmentAction, type BeefupConfig } from "../config/types.js";
|
|
2
|
+
import { type PackageJson } from "../project/package-json.js";
|
|
3
|
+
export interface RangeFinding {
|
|
4
|
+
packageName: string;
|
|
5
|
+
field: string;
|
|
6
|
+
spec: string;
|
|
7
|
+
severity: AlignmentAction;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Finds banned and non-exact dependency range issues in a package.json.
|
|
12
|
+
*/
|
|
13
|
+
export declare function findRangeIssues(pkg: PackageJson, config: BeefupConfig, fromLabel: string): RangeFinding[];
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import semver from "semver";
|
|
2
|
+
import { AlignmentActions, } from "../config/types.js";
|
|
3
|
+
import { DIRECT_DEP_FIELDS, } from "../project/package-json.js";
|
|
4
|
+
import { shouldSkipSpec } from "../rewrite/constraints.js";
|
|
5
|
+
/**
|
|
6
|
+
* Returns true when `spec` matches a banned floating range (case-insensitive).
|
|
7
|
+
*/
|
|
8
|
+
function isBanned(spec, banned) {
|
|
9
|
+
const trimmed = spec.trim().toLowerCase();
|
|
10
|
+
return banned.some((item) => item.toLowerCase() === trimmed);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns true when `spec` is a semver range rather than an exact version.
|
|
14
|
+
*/
|
|
15
|
+
function isLooseRange(spec) {
|
|
16
|
+
if (semver.valid(spec)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return Boolean(semver.validRange(spec));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Finds banned and non-exact dependency range issues in a package.json.
|
|
23
|
+
*/
|
|
24
|
+
export function findRangeIssues(pkg, config, fromLabel) {
|
|
25
|
+
const findings = [];
|
|
26
|
+
for (const field of DIRECT_DEP_FIELDS) {
|
|
27
|
+
const bucket = pkg[field];
|
|
28
|
+
if (!bucket) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
for (const [name, spec] of Object.entries(bucket)) {
|
|
32
|
+
if (shouldSkipSpec(spec)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (isBanned(spec, config.bannedRanges)) {
|
|
36
|
+
findings.push({
|
|
37
|
+
packageName: name,
|
|
38
|
+
field: `${fromLabel}#${field}`,
|
|
39
|
+
spec,
|
|
40
|
+
severity: AlignmentActions.Error,
|
|
41
|
+
message: `${name} uses banned range "${spec}"`,
|
|
42
|
+
});
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (config.preferExact && isLooseRange(spec)) {
|
|
46
|
+
findings.push({
|
|
47
|
+
packageName: name,
|
|
48
|
+
field: `${fromLabel}#${field}`,
|
|
49
|
+
spec,
|
|
50
|
+
severity: AlignmentActions.Warn,
|
|
51
|
+
message: `${name} is not exact-pinned ("${spec}")`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return findings;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=ranges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranges.js","sourceRoot":"","sources":["../../src/policy/ranges.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EACL,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,iBAAiB,GAElB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D;;GAEG;AACH,SAAS,QAAQ,CAAC,IAAY,EAAE,MAAgB;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAgB,EAChB,MAAoB,EACpB,SAAiB;IAEjB,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC;oBACZ,WAAW,EAAE,IAAI;oBACjB,KAAK,EAAE,GAAG,SAAS,IAAI,KAAK,EAAE;oBAC9B,IAAI;oBACJ,QAAQ,EAAE,gBAAgB,CAAC,KAAK;oBAChC,OAAO,EAAE,GAAG,IAAI,uBAAuB,IAAI,GAAG;iBAC/C,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,QAAQ,CAAC,IAAI,CAAC;oBACZ,WAAW,EAAE,IAAI;oBACjB,KAAK,EAAE,GAAG,SAAS,IAAI,KAAK,EAAE;oBAC9B,IAAI;oBACJ,QAAQ,EAAE,gBAAgB,CAAC,IAAI;oBAC/B,OAAO,EAAE,GAAG,IAAI,0BAA0B,IAAI,IAAI;iBACnD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copies writable project files from a staging source into `.beefup/staged`.
|
|
3
|
+
* Uses a temporary directory and renames atomically into place.
|
|
4
|
+
*/
|
|
5
|
+
export declare function collectStagedOutputs(sourceRoot: string, projectRoot: string, lockfileName: string): Promise<string>;
|
|
6
|
+
/**
|
|
7
|
+
* Ensures `.beefup/staged` contains a proposal lockfile for the project.
|
|
8
|
+
* Returns the staged directory path.
|
|
9
|
+
*/
|
|
10
|
+
export declare function requireStagedUpgrade(projectRoot: string, lockfileName: string): Promise<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Copies staged proposal files from `.beefup/staged` into the live project tree.
|
|
13
|
+
* Returns the relative paths that were written.
|
|
14
|
+
*/
|
|
15
|
+
export declare function applyStagedOutputs(projectRoot: string, lockfileName: string): Promise<string[]>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { mkdir, rename } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { CliCommands } from "../config/types.js";
|
|
4
|
+
import { BeefupError } from "../errors.js";
|
|
5
|
+
import { copyFileTo, pathExists, removePath } from "../fsutil.js";
|
|
6
|
+
import { beefupDir, stagedDir } from "./paths.js";
|
|
7
|
+
import { listWritableRelativePaths } from "./workspace.js";
|
|
8
|
+
/**
|
|
9
|
+
* Copies writable project files from a staging source into `.beefup/staged`.
|
|
10
|
+
* Uses a temporary directory and renames atomically into place.
|
|
11
|
+
*/
|
|
12
|
+
export async function collectStagedOutputs(sourceRoot, projectRoot, lockfileName) {
|
|
13
|
+
const dest = stagedDir(projectRoot);
|
|
14
|
+
const tmp = path.join(beefupDir(projectRoot), "staged.tmp");
|
|
15
|
+
await removePath(tmp);
|
|
16
|
+
await mkdir(tmp, { recursive: true });
|
|
17
|
+
const rels = await listWritableRelativePaths(sourceRoot, lockfileName);
|
|
18
|
+
for (const rel of rels) {
|
|
19
|
+
const from = path.join(sourceRoot, rel);
|
|
20
|
+
if (!(await pathExists(from))) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
await copyFileTo(from, path.join(tmp, rel));
|
|
24
|
+
}
|
|
25
|
+
await removePath(dest);
|
|
26
|
+
await mkdir(path.dirname(dest), { recursive: true });
|
|
27
|
+
await rename(tmp, dest);
|
|
28
|
+
return dest;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Ensures `.beefup/staged` contains a proposal lockfile for the project.
|
|
32
|
+
* Returns the staged directory path.
|
|
33
|
+
*/
|
|
34
|
+
export async function requireStagedUpgrade(projectRoot, lockfileName) {
|
|
35
|
+
const staged = stagedDir(projectRoot);
|
|
36
|
+
const stagedLock = path.join(staged, lockfileName);
|
|
37
|
+
if (!(await pathExists(stagedLock))) {
|
|
38
|
+
throw new BeefupError(`no staged lockfile at ${path.relative(projectRoot, stagedLock) || stagedLock}; run beefup ${CliCommands.Stage} first`);
|
|
39
|
+
}
|
|
40
|
+
return staged;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Copies staged proposal files from `.beefup/staged` into the live project tree.
|
|
44
|
+
* Returns the relative paths that were written.
|
|
45
|
+
*/
|
|
46
|
+
export async function applyStagedOutputs(projectRoot, lockfileName) {
|
|
47
|
+
const staged = stagedDir(projectRoot);
|
|
48
|
+
const rels = await listWritableRelativePaths(staged, lockfileName);
|
|
49
|
+
const copied = [];
|
|
50
|
+
for (const rel of rels) {
|
|
51
|
+
const from = path.join(staged, rel);
|
|
52
|
+
if (!(await pathExists(from))) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
await copyFileTo(from, path.join(projectRoot, rel));
|
|
56
|
+
copied.push(rel);
|
|
57
|
+
}
|
|
58
|
+
return copied;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/project/collect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { BeefupError } from "../errors.js";
|
|
3
|
+
import { pathExists, readJsonFile } from "../fsutil.js";
|
|
4
|
+
import { PackageManagers } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Maps a package.json `packageManager` field to a supported package manager.
|
|
7
|
+
*/
|
|
8
|
+
function managerFromPackageManagerField(field) {
|
|
9
|
+
if (!field) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
if (field.startsWith(`${PackageManagers.Pnpm}@`)) {
|
|
13
|
+
return PackageManagers.Pnpm;
|
|
14
|
+
}
|
|
15
|
+
if (field.startsWith(`${PackageManagers.Npm}@`)) {
|
|
16
|
+
return PackageManagers.Npm;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Detects the project root's package manager and lockfile from disk and hints.
|
|
22
|
+
*/
|
|
23
|
+
export async function detectProject(root) {
|
|
24
|
+
const pkgPath = path.join(root, "package.json");
|
|
25
|
+
if (!(await pathExists(pkgPath))) {
|
|
26
|
+
throw new BeefupError(`no package.json at ${root}`);
|
|
27
|
+
}
|
|
28
|
+
const pkg = await readJsonFile(pkgPath);
|
|
29
|
+
const pnpmLock = path.join(root, "pnpm-lock.yaml");
|
|
30
|
+
const npmLock = path.join(root, "package-lock.json");
|
|
31
|
+
const hasPnpm = await pathExists(pnpmLock);
|
|
32
|
+
const hasNpm = await pathExists(npmLock);
|
|
33
|
+
const hinted = managerFromPackageManagerField(pkg.packageManager);
|
|
34
|
+
if (hasPnpm && hasNpm) {
|
|
35
|
+
if (!hinted) {
|
|
36
|
+
throw new BeefupError("both pnpm-lock.yaml and package-lock.json exist; set packageManager in package.json");
|
|
37
|
+
}
|
|
38
|
+
return hinted === PackageManagers.Pnpm
|
|
39
|
+
? {
|
|
40
|
+
root,
|
|
41
|
+
packageManager: PackageManagers.Pnpm,
|
|
42
|
+
lockfileName: "pnpm-lock.yaml",
|
|
43
|
+
lockfilePath: pnpmLock,
|
|
44
|
+
}
|
|
45
|
+
: {
|
|
46
|
+
root,
|
|
47
|
+
packageManager: PackageManagers.Npm,
|
|
48
|
+
lockfileName: "package-lock.json",
|
|
49
|
+
lockfilePath: npmLock,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (hasPnpm || hinted === PackageManagers.Pnpm) {
|
|
53
|
+
if (!hasPnpm) {
|
|
54
|
+
throw new BeefupError(`no pnpm-lock.yaml at ${root}`);
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
root,
|
|
58
|
+
packageManager: PackageManagers.Pnpm,
|
|
59
|
+
lockfileName: "pnpm-lock.yaml",
|
|
60
|
+
lockfilePath: pnpmLock,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (hasNpm || hinted === PackageManagers.Npm) {
|
|
64
|
+
if (!hasNpm) {
|
|
65
|
+
throw new BeefupError(`no package-lock.json at ${root}`);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
root,
|
|
69
|
+
packageManager: PackageManagers.Npm,
|
|
70
|
+
lockfileName: "package-lock.json",
|
|
71
|
+
lockfilePath: npmLock,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
throw new BeefupError(`no pnpm-lock.yaml or package-lock.json at ${root}`);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/project/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readJsonFile } from "../fsutil.js";
|
|
2
|
+
import { DIRECT_DEP_FIELDS } from "./package-json.js";
|
|
3
|
+
import { listWorkspacePackages } from "./workspace.js";
|
|
4
|
+
/**
|
|
5
|
+
* Collects direct and optionalDependency package names across the workspace.
|
|
6
|
+
*/
|
|
7
|
+
export async function collectDirectDependencyNames(projectRoot) {
|
|
8
|
+
const directNames = new Set();
|
|
9
|
+
const optionalDeclaredNames = new Set();
|
|
10
|
+
const workspaces = await listWorkspacePackages(projectRoot);
|
|
11
|
+
for (const ws of workspaces) {
|
|
12
|
+
const pkg = await readJsonFile(ws.packageJsonPath);
|
|
13
|
+
for (const field of DIRECT_DEP_FIELDS) {
|
|
14
|
+
const bucket = pkg[field];
|
|
15
|
+
if (!bucket) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
for (const name of Object.keys(bucket)) {
|
|
19
|
+
directNames.add(name);
|
|
20
|
+
if (field === "optionalDependencies") {
|
|
21
|
+
optionalDeclaredNames.add(name);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return { directNames, optionalDeclaredNames };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=direct-deps.js.map
|