@antongolub/lockfile 0.0.0-snapshot.13 → 0.0.0-snapshot.14
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/package.json +5 -5
- package/target/es6/common.d.ts +9 -7
- package/target/es6/formats/npm-1.d.ts +3 -1
- package/target/es6/formats/npm-3.d.ts +3 -1
- package/target/es6/formats/yarn-berry.d.ts +3 -1
- package/target/es6/formats/yarn-classic.d.ts +4 -2
- package/target/es6/index.js +166 -70
- package/target/es6/index.js.map +3 -3
- package/target/es6/interface.d.ts +10 -1
- package/target/es6/util.d.ts +2 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antongolub/lockfile",
|
|
3
|
-
"version": "0.0.0-snapshot.
|
|
3
|
+
"version": "0.0.0-snapshot.14",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
"semver": "^7.5.4"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@types/js-yaml": "^4.0.
|
|
18
|
-
"@types/node": "^20.
|
|
19
|
-
"@types/semver": "^7.5.
|
|
20
|
-
"esbuild": "^0.19.
|
|
17
|
+
"@types/js-yaml": "^4.0.8",
|
|
18
|
+
"@types/node": "^20.8.10",
|
|
19
|
+
"@types/semver": "^7.5.4",
|
|
20
|
+
"esbuild": "^0.19.5",
|
|
21
21
|
"esbuild-node-externals": "^1.9.0",
|
|
22
22
|
"tsm": "^2.3.0",
|
|
23
23
|
"typescript": "^5.2.2",
|
package/target/es6/common.d.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { THashes, TSnapshot } from './interface';
|
|
2
|
-
export declare const formatTarballUrl: (name: string, version: string, registry?: string) => string;
|
|
1
|
+
import { THashes, TSnapshot, TSource } from './interface';
|
|
3
2
|
export declare const getSources: (snapshot: TSnapshot) => string[];
|
|
4
3
|
export declare const parseIntegrity: (integrity?: string) => THashes;
|
|
5
4
|
export declare const formatIntegrity: (hashes: THashes) => string;
|
|
6
|
-
export
|
|
5
|
+
export interface IReference {
|
|
7
6
|
protocol: string;
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
id: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
host?: string;
|
|
10
10
|
[extra: string]: any;
|
|
11
|
-
}
|
|
12
|
-
export declare const
|
|
11
|
+
}
|
|
12
|
+
export declare const parseTarballUrl: (resolution: string) => TSource | null;
|
|
13
|
+
export declare const formatTarballUrl: (name: string, version: string, registry?: string, hash?: string) => string;
|
|
14
|
+
export declare const parseReference: (raw?: any) => IReference;
|
|
13
15
|
export declare const mapReference: (current: string, targetProtocol: string, strategy?: string) => string;
|
|
14
16
|
/**
|
|
15
17
|
* Replaces local monorepo cross-refs with the target protocol: workspace or semver
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ICheck, IFormat, IParse, IPreformat } from '../interface';
|
|
1
|
+
import { ICheck, IFormat, IParse, IPreformat, IParseResolution, IFormatResolution } from '../interface';
|
|
2
2
|
export declare const version = "npm-1";
|
|
3
3
|
export type TNpm1LockfileEntry = {
|
|
4
4
|
version: string;
|
|
@@ -20,3 +20,5 @@ export declare const check: ICheck;
|
|
|
20
20
|
export declare const parse: IParse;
|
|
21
21
|
export declare const preformat: IPreformat<TNpm1Lockfile>;
|
|
22
22
|
export declare const format: IFormat;
|
|
23
|
+
export declare const parseResolution: IParseResolution;
|
|
24
|
+
export declare const formatResolution: IFormatResolution;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ICheck, IFormat, IPreformat, TSnapshot } from '../interface';
|
|
1
|
+
import { ICheck, IFormat, IFormatResolution, IParseResolution, IPreformat, TSnapshot } from '../interface';
|
|
2
2
|
export type TNpm3LockfileEntry = {
|
|
3
3
|
name?: string;
|
|
4
4
|
version?: string;
|
|
@@ -28,3 +28,5 @@ export declare const check: ICheck;
|
|
|
28
28
|
export declare const parse: (lockfile: string) => TSnapshot;
|
|
29
29
|
export declare const preformat: IPreformat<TNpm3Lockfile>;
|
|
30
30
|
export declare const format: IFormat;
|
|
31
|
+
export declare const parseResolution: IParseResolution;
|
|
32
|
+
export declare const formatResolution: IFormatResolution;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ICheck, IFormat, IParse, IPreformat, TDependencies, TDependenciesMeta } from '../interface';
|
|
1
|
+
import { ICheck, IFormat, IParse, IParseResolution, IPreformat, TDependencies, TDependenciesMeta, TSource } from '../interface';
|
|
2
2
|
export type TYarn5Lockfile = Record<string, {
|
|
3
3
|
version: string;
|
|
4
4
|
resolution: string;
|
|
@@ -18,3 +18,5 @@ export declare const check: ICheck;
|
|
|
18
18
|
export declare const parse: IParse;
|
|
19
19
|
export declare const preformat: IPreformat<TYarn5Lockfile>;
|
|
20
20
|
export declare const format: IFormat;
|
|
21
|
+
export declare const parseResolution: IParseResolution;
|
|
22
|
+
export declare const formatResolution: ({ name, id, type, alias, hash }: TSource) => string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TDependencies, ICheck, IFormat, IParse, IPreformat } from '../interface';
|
|
1
|
+
import { TDependencies, ICheck, IFormat, IParse, IPreformat, IParseResolution, IFormatResolution } from '../interface';
|
|
2
2
|
export type TYarn1Lockfile = Record<string, {
|
|
3
3
|
version: string;
|
|
4
4
|
resolved: string;
|
|
@@ -6,9 +6,11 @@ export type TYarn1Lockfile = Record<string, {
|
|
|
6
6
|
dependencies?: TDependencies;
|
|
7
7
|
optionalDependencies?: TDependencies;
|
|
8
8
|
}>;
|
|
9
|
-
export declare const version = "yarn-
|
|
9
|
+
export declare const version = "yarn-classic";
|
|
10
10
|
export declare const check: ICheck;
|
|
11
11
|
export declare const preparse: (value: string) => TYarn1Lockfile;
|
|
12
12
|
export declare const parse: IParse;
|
|
13
13
|
export declare const preformat: IPreformat<TYarn1Lockfile>;
|
|
14
14
|
export declare const format: IFormat;
|
|
15
|
+
export declare const parseResolution: IParseResolution;
|
|
16
|
+
export declare const formatResolution: IFormatResolution;
|
package/target/es6/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// src/main/ts/common.ts
|
|
2
2
|
import semver from "semver";
|
|
3
3
|
import { topo, traverseDeps } from "@semrel-extra/topo";
|
|
4
|
-
var formatTarballUrl = (name, version6, registry = "https://registry.npmjs.org") => `${registry}/${name}/-/${name.slice(name.indexOf("/") + 1)}-${version6}.tgz`;
|
|
5
4
|
var getSources = (snapshot) => Object.values(snapshot).map((entry) => entry.source.id).filter(Boolean);
|
|
6
5
|
var parseIntegrity = (integrity) => integrity ? integrity.split(" ").reduce((m, item) => {
|
|
7
6
|
const [k, v] = item.split("-");
|
|
@@ -19,6 +18,23 @@ var formatIntegrity = (hashes) => {
|
|
|
19
18
|
}
|
|
20
19
|
return Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(" ");
|
|
21
20
|
};
|
|
21
|
+
var parseTarballUrl = (resolution) => {
|
|
22
|
+
const [tgz, br, _name, org, ...rest] = resolution.split("/").reverse();
|
|
23
|
+
if (br !== "-") {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const hasScope = org.startsWith("@");
|
|
27
|
+
const name = hasScope ? `${org}/${_name}` : _name;
|
|
28
|
+
const id = tgz.slice(_name.length + 1, tgz.lastIndexOf(".tgz"));
|
|
29
|
+
return {
|
|
30
|
+
type: "npm",
|
|
31
|
+
name,
|
|
32
|
+
id,
|
|
33
|
+
registry: rest.reverse().join("/") + (hasScope ? "" : "/" + org),
|
|
34
|
+
hash: tgz.slice((tgz + "#").indexOf("#"))
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
var formatTarballUrl = (name, version6, registry = "https://registry.npmjs.org", hash = "") => `${registry}/${name}/-/${name.slice(name.indexOf("/") + 1)}-${version6}.tgz${hash}`;
|
|
22
38
|
|
|
23
39
|
// src/main/ts/util.ts
|
|
24
40
|
import fs from "node:fs/promises";
|
|
@@ -37,8 +53,8 @@ var flushObject = (obj) => {
|
|
|
37
53
|
}
|
|
38
54
|
return obj;
|
|
39
55
|
};
|
|
40
|
-
var debug = Object.assign(
|
|
41
|
-
if (!
|
|
56
|
+
var debug = Object.assign((...chunks) => {
|
|
57
|
+
if (!debug.enable)
|
|
42
58
|
return;
|
|
43
59
|
console.log(...chunks);
|
|
44
60
|
}, {
|
|
@@ -54,6 +70,7 @@ var debug = Object.assign(function(...chunks) {
|
|
|
54
70
|
fs.writeFile(path.resolve(base, name), JSON.stringify(_data, null, 2));
|
|
55
71
|
}
|
|
56
72
|
});
|
|
73
|
+
var unique = (arr) => [...new Set(arr)];
|
|
57
74
|
|
|
58
75
|
// src/main/ts/analyze.ts
|
|
59
76
|
var getDeps = (entry) => {
|
|
@@ -151,7 +168,7 @@ var analyze = (snapshot) => {
|
|
|
151
168
|
};
|
|
152
169
|
const now = Date.now();
|
|
153
170
|
roots.forEach((root, i) => walk({ root, idx, id: root.source.id === "." ? "" : void 0 }));
|
|
154
|
-
|
|
171
|
+
debug("analyze duration=", Date.now() - now, "deptree size=", Object.keys(tree).length);
|
|
155
172
|
debug.json("deptree.json", Object.values(tree).map(({ parents, name }) => [...parents.map((p) => p.name).slice(1), name].join(",")));
|
|
156
173
|
return idx;
|
|
157
174
|
};
|
|
@@ -204,10 +221,7 @@ var parse = (lockfile, pkg) => {
|
|
|
204
221
|
upsertEntry(name, entry.version, {
|
|
205
222
|
hashes: parseIntegrity(entry.integrity),
|
|
206
223
|
dependencies: requires,
|
|
207
|
-
source:
|
|
208
|
-
type: "npm",
|
|
209
|
-
id: entry.resolved
|
|
210
|
-
}
|
|
224
|
+
source: parseResolution(entry.resolved)
|
|
211
225
|
});
|
|
212
226
|
extractEntries(entry.dependencies, deps, ...parents);
|
|
213
227
|
extractRanges(requires, entry.dependencies || {}, deps, ...parents);
|
|
@@ -226,10 +240,10 @@ var preformat = (idx) => {
|
|
|
226
240
|
const deptree = Object.values(idx.tree).slice(1).map(({ parents, entry }) => [...parents.slice(1), entry]);
|
|
227
241
|
debug.json("deptree-npm-1.json", deptree.map((entries) => entries.map((e) => e.name).join(",")));
|
|
228
242
|
const formatNpm1LockfileEntry = (entry) => {
|
|
229
|
-
const { name, version: version6, hashes } = entry;
|
|
243
|
+
const { name, version: version6, hashes, source } = entry;
|
|
230
244
|
const _entry = {
|
|
231
245
|
version: version6,
|
|
232
|
-
resolved:
|
|
246
|
+
resolved: formatResolution(source),
|
|
233
247
|
integrity: formatIntegrity2(hashes)
|
|
234
248
|
};
|
|
235
249
|
if (!idx.prod.has(entry)) {
|
|
@@ -292,6 +306,26 @@ var preformat = (idx) => {
|
|
|
292
306
|
return lf;
|
|
293
307
|
};
|
|
294
308
|
var format = (snap) => JSON.stringify(preformat(analyze(snap)), null, 2);
|
|
309
|
+
var parseResolution = (input) => {
|
|
310
|
+
if (input.startsWith("github:")) {
|
|
311
|
+
return {
|
|
312
|
+
type: "github",
|
|
313
|
+
name: input.slice(7, -41),
|
|
314
|
+
id: input.slice(-40)
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
const npmResolution = parseTarballUrl(input);
|
|
318
|
+
if (!npmResolution)
|
|
319
|
+
throw new TypeError(`Unsupported resolution format: ${input}`);
|
|
320
|
+
return npmResolution;
|
|
321
|
+
};
|
|
322
|
+
var formatResolution = (source) => {
|
|
323
|
+
const { type, name, id, registry = "https://registry.npmjs.org" } = source;
|
|
324
|
+
if (type === "github") {
|
|
325
|
+
return `github:${name}#${id}`;
|
|
326
|
+
}
|
|
327
|
+
return formatTarballUrl(name, id, registry);
|
|
328
|
+
};
|
|
295
329
|
|
|
296
330
|
// src/main/ts/formats/npm-3.ts
|
|
297
331
|
import semver2 from "semver";
|
|
@@ -310,13 +344,12 @@ var parsePackages = (packages) => {
|
|
|
310
344
|
const getClosestPkg = (name, chain, entries2, range) => {
|
|
311
345
|
const variants3 = [];
|
|
312
346
|
let s = 0;
|
|
313
|
-
let i = 0;
|
|
314
347
|
while (s < chain.length) {
|
|
315
348
|
let l = chain.length + 1;
|
|
316
349
|
while (l--) {
|
|
317
350
|
const variant = formatNmKey([...chain.slice(s, l), name].filter(Boolean));
|
|
318
351
|
const entry = entries2[variant];
|
|
319
|
-
if (entry && (!entry.version || semver2.satisfies(entry.version, range))) {
|
|
352
|
+
if (entry && (!entry.version || entry.version === range || semver2.satisfies(entry.version, range))) {
|
|
320
353
|
return [variant, entry];
|
|
321
354
|
}
|
|
322
355
|
variants3.push(variant);
|
|
@@ -327,17 +360,13 @@ var parsePackages = (packages) => {
|
|
|
327
360
|
${variants3.join("\n")}`);
|
|
328
361
|
};
|
|
329
362
|
const processPackage = (path2, pkg) => {
|
|
330
|
-
|
|
331
|
-
if (sourceType === "workspace" && !pkg.name) {
|
|
363
|
+
if ((pkg.link || path2 === "") && !pkg.name) {
|
|
332
364
|
return processPackage(path2, {
|
|
333
365
|
...pkg,
|
|
334
366
|
...packages[pkg.resolved]
|
|
335
367
|
});
|
|
336
368
|
}
|
|
337
|
-
const source =
|
|
338
|
-
id: pkg.resolved || ".",
|
|
339
|
-
type: sourceType
|
|
340
|
-
};
|
|
369
|
+
const source = parseResolution2(pkg.resolved);
|
|
341
370
|
const chain = path2 ? ("/" + path2).split("/node_modules/").filter(Boolean) : [""];
|
|
342
371
|
const name = pkg.name || chain[chain.length - 1];
|
|
343
372
|
const version6 = pkg.version;
|
|
@@ -439,7 +468,7 @@ var preformat2 = (idx) => {
|
|
|
439
468
|
}
|
|
440
469
|
m[k] = {
|
|
441
470
|
version: entry.version,
|
|
442
|
-
resolved:
|
|
471
|
+
resolved: formatResolution2(entry.source),
|
|
443
472
|
integrity: formatIntegrity(entry.hashes)
|
|
444
473
|
};
|
|
445
474
|
if (!idx.prod.has(entry)) {
|
|
@@ -463,6 +492,31 @@ var preformat2 = (idx) => {
|
|
|
463
492
|
};
|
|
464
493
|
};
|
|
465
494
|
var format2 = (snapshot) => JSON.stringify(preformat2(analyze(snapshot)), null, 2);
|
|
495
|
+
var parseResolution2 = (input) => {
|
|
496
|
+
if (!input?.includes("://")) {
|
|
497
|
+
return {
|
|
498
|
+
type: "workspace",
|
|
499
|
+
id: input || "."
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
if (input.startsWith("git+ssh://git@github.com/")) {
|
|
503
|
+
return {
|
|
504
|
+
name: input.slice(25, -45),
|
|
505
|
+
id: input.slice(-40),
|
|
506
|
+
type: "github"
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
const npmResolution = parseTarballUrl(input);
|
|
510
|
+
if (!npmResolution)
|
|
511
|
+
throw new TypeError(`Unsupported resolution format: ${input}`);
|
|
512
|
+
return npmResolution;
|
|
513
|
+
};
|
|
514
|
+
var formatResolution2 = ({ type, id, name, registry, hash }) => {
|
|
515
|
+
if (type === "github") {
|
|
516
|
+
return `git+ssh://git@github.com/${name}.git#${id}`;
|
|
517
|
+
}
|
|
518
|
+
return formatTarballUrl(name, id, registry, hash);
|
|
519
|
+
};
|
|
466
520
|
|
|
467
521
|
// src/main/ts/formats/npm-2.ts
|
|
468
522
|
var version3 = "npm-2";
|
|
@@ -484,7 +538,7 @@ var format3 = (snapshot) => JSON.stringify(preformat3(analyze(snapshot)), null,
|
|
|
484
538
|
// src/main/ts/formats/yarn-classic.ts
|
|
485
539
|
import { load, dump } from "js-yaml";
|
|
486
540
|
var kvEntryPattern = /^(\s+)"?([^"]+)"?\s"?([^"]+)"?$/;
|
|
487
|
-
var version4 = "yarn-
|
|
541
|
+
var version4 = "yarn-classic";
|
|
488
542
|
var check4 = (value) => value.includes("# yarn lockfile v1");
|
|
489
543
|
var preparse = (value) => {
|
|
490
544
|
const lines = value.split("\n");
|
|
@@ -509,25 +563,24 @@ var parse3 = (value, pkg) => {
|
|
|
509
563
|
const snapshot = {};
|
|
510
564
|
Object.entries(raw).forEach((value2) => {
|
|
511
565
|
const [_key, _entry] = value2;
|
|
512
|
-
const chunks = _key.split(", ");
|
|
513
|
-
const ranges = chunks.map((r) => r.slice(r.lastIndexOf("@") + 1)).sort();
|
|
514
566
|
const { version: version6, integrity, dependencies, optionalDependencies, resolved } = _entry;
|
|
515
|
-
const name = chunks[0].slice(0, chunks[0].lastIndexOf("@"));
|
|
516
|
-
const key = `${name}@${version6}`;
|
|
517
567
|
const hashes = parseIntegrity(integrity);
|
|
518
|
-
const source =
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
name
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
568
|
+
const source = parseResolution3(resolved);
|
|
569
|
+
const chunks = _key.split(", ");
|
|
570
|
+
const names = unique(chunks.map((c) => c.slice(0, c.indexOf("@", 1))));
|
|
571
|
+
for (const name of names) {
|
|
572
|
+
const ranges = chunks.filter((c) => c.startsWith(`${name}@`)).map((r) => r.slice(r.indexOf("@", 1) + 1)).sort();
|
|
573
|
+
const key = `${name}@${version6}`;
|
|
574
|
+
snapshot[key] = {
|
|
575
|
+
name,
|
|
576
|
+
version: version6,
|
|
577
|
+
ranges,
|
|
578
|
+
hashes,
|
|
579
|
+
dependencies,
|
|
580
|
+
optionalDependencies,
|
|
581
|
+
source
|
|
582
|
+
};
|
|
583
|
+
}
|
|
531
584
|
});
|
|
532
585
|
snapshot[""] = {
|
|
533
586
|
name: manifest.name,
|
|
@@ -547,13 +600,28 @@ var parse3 = (value, pkg) => {
|
|
|
547
600
|
var preformat4 = (idx) => {
|
|
548
601
|
const { snapshot } = idx;
|
|
549
602
|
const lf = {};
|
|
603
|
+
const rangemap = {};
|
|
604
|
+
const keysorter = (a, b) => {
|
|
605
|
+
const _a = a.includes("npm:");
|
|
606
|
+
const _b = b.includes("npm:");
|
|
607
|
+
return _a === _b ? 0 : +_b - +_a;
|
|
608
|
+
};
|
|
550
609
|
Object.values(snapshot).forEach((entry) => {
|
|
551
610
|
const { name, version: version6, ranges, hashes, dependencies, optionalDependencies, source } = entry;
|
|
552
|
-
const
|
|
611
|
+
const resolved = formatResolution3(source);
|
|
612
|
+
const alias = rangemap[resolved];
|
|
553
613
|
const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(" ");
|
|
614
|
+
const keys = ranges.map((r) => `${name}@${r}`);
|
|
615
|
+
if (alias) {
|
|
616
|
+
keys.push(...alias.keys);
|
|
617
|
+
keys.sort(keysorter);
|
|
618
|
+
delete lf[alias.key];
|
|
619
|
+
}
|
|
620
|
+
const key = keys.join(", ");
|
|
621
|
+
rangemap[resolved] = { keys, key, name };
|
|
554
622
|
lf[key] = {
|
|
555
623
|
version: version6,
|
|
556
|
-
resolved
|
|
624
|
+
resolved,
|
|
557
625
|
integrity,
|
|
558
626
|
dependencies,
|
|
559
627
|
optionalDependencies
|
|
@@ -568,11 +636,12 @@ var format4 = (snapshot) => {
|
|
|
568
636
|
quotingType: '"',
|
|
569
637
|
flowLevel: -1,
|
|
570
638
|
lineWidth: -1,
|
|
571
|
-
forceQuotes: true
|
|
639
|
+
forceQuotes: true,
|
|
640
|
+
noRefs: true
|
|
572
641
|
}).split("\n");
|
|
573
642
|
const _value = lines.map((line) => {
|
|
574
643
|
if (line.length !== 0 && line.charAt(0) !== " ") {
|
|
575
|
-
const chunks = line.slice(0, -1).replaceAll('"', "").split(", ").map((chunk) => chunk.startsWith("@") || chunk.includes(" ") ? `"${chunk}"` : chunk);
|
|
644
|
+
const chunks = line.slice(0, -1).replaceAll('"', "").split(", ").map((chunk) => chunk.startsWith("@") || chunk.includes(" ") || chunk.includes("npm:") ? `"${chunk}"` : chunk);
|
|
576
645
|
return `
|
|
577
646
|
${chunks.join(", ")}:`;
|
|
578
647
|
}
|
|
@@ -590,6 +659,25 @@ ${chunks.join(", ")}:`;
|
|
|
590
659
|
|
|
591
660
|
${_value}`;
|
|
592
661
|
};
|
|
662
|
+
var parseResolution3 = (input) => {
|
|
663
|
+
if (input.startsWith("https://codeload.github.com/")) {
|
|
664
|
+
return {
|
|
665
|
+
type: "github",
|
|
666
|
+
name: input.slice(28, -48),
|
|
667
|
+
id: input.slice(-40)
|
|
668
|
+
};
|
|
669
|
+
}
|
|
670
|
+
const npmResolution = parseTarballUrl(input);
|
|
671
|
+
if (!npmResolution)
|
|
672
|
+
throw new TypeError(`Unsupported resolution format: ${input}`);
|
|
673
|
+
return npmResolution;
|
|
674
|
+
};
|
|
675
|
+
var formatResolution3 = ({ type, id, name = "", registry = "https://registry.yarnpkg.com", hash = "" }) => {
|
|
676
|
+
if (type === "github") {
|
|
677
|
+
return `https://codeload.github.com/${name}/tar.gz/${id}`;
|
|
678
|
+
}
|
|
679
|
+
return formatTarballUrl(name, id, registry, hash);
|
|
680
|
+
};
|
|
593
681
|
|
|
594
682
|
// src/main/ts/formats/yarn-berry.ts
|
|
595
683
|
import { load as load2, dump as dump2 } from "js-yaml";
|
|
@@ -597,24 +685,6 @@ var version5 = "yarn-berry";
|
|
|
597
685
|
var check5 = (value) => value.includes(`
|
|
598
686
|
__metadata:
|
|
599
687
|
version:`);
|
|
600
|
-
var parseResolution = (resolution) => {
|
|
601
|
-
const colonPos = resolution.indexOf(":");
|
|
602
|
-
const atPos = resolution.indexOf("@", 1);
|
|
603
|
-
const name = resolution.slice(0, atPos);
|
|
604
|
-
if (colonPos === -1) {
|
|
605
|
-
return {
|
|
606
|
-
name,
|
|
607
|
-
sourceId: resolution.slice(atPos + 1),
|
|
608
|
-
sourceType: "npm"
|
|
609
|
-
};
|
|
610
|
-
}
|
|
611
|
-
return {
|
|
612
|
-
name,
|
|
613
|
-
sourceId: resolution.slice(colonPos + 1),
|
|
614
|
-
sourceType: resolution.slice(atPos + 1, colonPos)
|
|
615
|
-
};
|
|
616
|
-
};
|
|
617
|
-
var formatResolution = (name, source, sourceType = "npm") => `${name}@${sourceType === "semver" ? "" : sourceType + ":"}${source}`;
|
|
618
688
|
var parse4 = (lockfile, pkg) => {
|
|
619
689
|
const manifest = JSON.parse(pkg);
|
|
620
690
|
const snapshot = {};
|
|
@@ -624,8 +694,7 @@ var parse4 = (lockfile, pkg) => {
|
|
|
624
694
|
const [_key, _entry] = value;
|
|
625
695
|
const { version: version6, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution, bin, conditions } = _entry;
|
|
626
696
|
const chunks = _key.split(", ");
|
|
627
|
-
const
|
|
628
|
-
const name = refs[0].name;
|
|
697
|
+
const name = _key.slice(0, _key.indexOf("@", 1));
|
|
629
698
|
const key = `${name}@${version6}`;
|
|
630
699
|
if (_key.includes("#")) {
|
|
631
700
|
snapshot[key].patch = {
|
|
@@ -635,13 +704,9 @@ var parse4 = (lockfile, pkg) => {
|
|
|
635
704
|
};
|
|
636
705
|
return;
|
|
637
706
|
}
|
|
638
|
-
const ranges =
|
|
707
|
+
const ranges = chunks.map((c) => c.slice(name.length + 1)).sort();
|
|
639
708
|
const hashes = parseIntegrity(checksum);
|
|
640
|
-
const
|
|
641
|
-
const source = {
|
|
642
|
-
id: sourceId,
|
|
643
|
-
type: sourceType
|
|
644
|
-
};
|
|
709
|
+
const source = parseResolution4(resolution);
|
|
645
710
|
snapshot[key] = {
|
|
646
711
|
name,
|
|
647
712
|
version: version6,
|
|
@@ -656,7 +721,7 @@ var parse4 = (lockfile, pkg) => {
|
|
|
656
721
|
bin,
|
|
657
722
|
conditions
|
|
658
723
|
};
|
|
659
|
-
if (
|
|
724
|
+
if (source.type === "workspace") {
|
|
660
725
|
}
|
|
661
726
|
});
|
|
662
727
|
snapshot[""] = {
|
|
@@ -683,10 +748,10 @@ var preformat5 = (idx) => {
|
|
|
683
748
|
const isLocal = version6 === "0.0.0-use.local";
|
|
684
749
|
const languageName = isLocal ? "unknown" : "node";
|
|
685
750
|
const linkType = isLocal ? "soft" : "hard";
|
|
686
|
-
const key = ranges.map((r) =>
|
|
751
|
+
const key = ranges.map((r) => `${name}@${r}`).join(", ");
|
|
687
752
|
lf[key] = {
|
|
688
753
|
version: version6,
|
|
689
|
-
resolution:
|
|
754
|
+
resolution: formatResolution4(source),
|
|
690
755
|
dependencies,
|
|
691
756
|
dependenciesMeta,
|
|
692
757
|
optionalDependencies,
|
|
@@ -741,6 +806,37 @@ ${line}`;
|
|
|
741
806
|
# Manual changes might be lost - proceed with caution!
|
|
742
807
|
${_value}`;
|
|
743
808
|
};
|
|
809
|
+
var parseResolution4 = (input) => {
|
|
810
|
+
const colonPos = input.indexOf(":");
|
|
811
|
+
const atPos = input.indexOf("@", 1);
|
|
812
|
+
const name = input.slice(0, atPos);
|
|
813
|
+
if (colonPos === -1) {
|
|
814
|
+
return {
|
|
815
|
+
name,
|
|
816
|
+
id: input.slice(atPos + 1),
|
|
817
|
+
type: "npm"
|
|
818
|
+
};
|
|
819
|
+
}
|
|
820
|
+
if (input.includes("https://github.com")) {
|
|
821
|
+
return {
|
|
822
|
+
type: "github",
|
|
823
|
+
name: input.slice(atPos + 20, -52),
|
|
824
|
+
id: input.slice(-40),
|
|
825
|
+
alias: input.slice(0, input.indexOf("@", 1))
|
|
826
|
+
};
|
|
827
|
+
}
|
|
828
|
+
return {
|
|
829
|
+
name,
|
|
830
|
+
id: input.slice(colonPos + 1),
|
|
831
|
+
type: input.slice(atPos + 1, colonPos)
|
|
832
|
+
};
|
|
833
|
+
};
|
|
834
|
+
var formatResolution4 = ({ name, id, type = "npm", alias = name, hash }) => {
|
|
835
|
+
if (type === "github") {
|
|
836
|
+
return `${alias}@https://github.com/${name}.git#commit=${id}`;
|
|
837
|
+
}
|
|
838
|
+
return `${name}@${type === "semver" ? "" : type + ":"}${id}`;
|
|
839
|
+
};
|
|
744
840
|
|
|
745
841
|
// src/main/ts/parse.ts
|
|
746
842
|
var isPkgJson = (input) => input.startsWith("{") && input.includes('"name":');
|
package/target/es6/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/main/ts/common.ts", "../../src/main/ts/util.ts", "../../src/main/ts/analyze.ts", "../../src/main/ts/formats/npm-1.ts", "../../src/main/ts/formats/npm-3.ts", "../../src/main/ts/formats/npm-2.ts", "../../src/main/ts/formats/yarn-classic.ts", "../../src/main/ts/formats/yarn-berry.ts", "../../src/main/ts/parse.ts", "../../src/main/ts/format.ts"],
|
|
4
|
-
"sourcesContent": ["import semver from 'semver'\nimport fs from 'node:fs/promises'\nimport {topo, traverseDeps} from '@semrel-extra/topo'\nimport {THashes, TManifest, TSnapshot} from './interface'\n\nexport const formatTarballUrl = (name: string, version: string, registry = 'https://registry.npmjs.org') =>\n `${registry}/${name}/-/${name.slice(name.indexOf('/') + 1)}-${version}.tgz`\n\nexport const getSources = (snapshot: TSnapshot): string[] =>\n Object.values(snapshot)\n .map(entry => entry.source.id)\n .filter(Boolean)\n\nexport const parseIntegrity = (integrity?: string): THashes =>\n integrity\n ? integrity.split(' ').reduce<THashes>((m, item) => {\n const [k, v] = item.split('-')\n if (k === 'sha512' || k === 'sha256' || k === 'sha1' || k === 'checksum') {\n m[k] = v\n } else if (!v){\n m['checksum'] = k\n }\n\n return m\n }, {})\n : {}\n\nexport const formatIntegrity = (hashes: THashes): string => {\n const checksum = hashes['checksum']\n if (checksum) {\n return checksum\n }\n\n return Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n}\n\nexport type IReferenceDeclaration = {\n protocol: string\n raw: string\n version: string | null\n [extra: string]: any\n}\n\nconst buildReference = (protocol: string, raw: string, value: string) => ({\n protocol,\n value,\n raw,\n caret: (value.startsWith('^') || value.startsWith('~')) ? value[0] : '',\n version: semver.valid(raw) || semver.coerce(raw)?.version || null\n})\n\nexport const parseReference = (raw?: any): IReferenceDeclaration => {\n if (raw.startsWith('workspace:')) {\n return buildReference('workspace', raw, raw.slice(10))\n }\n\n if (raw.startsWith('npm:')) {\n return buildReference('npm', raw, raw.slice(4))\n }\n\n return buildReference('semver', raw, raw)\n}\n\nexport const mapReference = (current: string, targetProtocol: string, strategy = 'inherit'): string => {\n const {caret, version, protocol} = parseReference(current)\n const prefix = targetProtocol === 'semver' ? '' : `${targetProtocol}:`\n\n if (protocol === targetProtocol) {\n return current\n }\n\n if (version === null) {\n return prefix + '*'\n }\n\n const _version = strategy === 'pin'\n ? version\n : strategy === 'inherit'\n ? (caret + version)\n : strategy\n\n return prefix + _version\n}\n\n/**\n * Replaces local monorepo cross-refs with the target protocol: workspace or semver\n */\nexport const switchMonorefs = async ({cwd, strategy, protocol = 'semver', dryrun = false}: {\n cwd?: string\n strategy?: string // 'inherit' | 'pin' | 'coerce'\n protocol?: string\n dryrun?: boolean\n}) => {\n const {packages} = await topo({cwd})\n\n await Promise.all(Object.values(packages).map(async pkg => {\n await traverseDeps({pkg, packages, cb({name, version, deps}) {\n deps[name] = mapReference(version, protocol, strategy)\n }})\n\n if (dryrun) {\n return\n }\n\n await fs.writeFile(pkg.manifestAbsPath, JSON.stringify(pkg.manifest), 'utf8')\n }))\n\n return packages\n}\n", "import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport * as process from 'node:process'\n\nexport const sortObject = <T extends Record<string, any>>(\n unordered: T,\n predicate: (a: [string, any], b: [string, any]) => number = ([a], [b]) => a > b ? 1 : -1 // This is actually what npm does\n): T =>\n Object.entries({...unordered})\n .sort(predicate)\n .reduce((obj, [key, value]: [keyof T, T[keyof T]]) => {\n obj[key] = value\n return obj\n },\n flushObject(unordered) as T,\n )\n\nexport const flushObject = (obj: Record<string, any>) => {\n for (const key in obj) {\n delete obj[key]\n }\n\n return obj\n}\n\nexport const loadContents = async (value: string): Promise<string> =>\n value.includes('\\n')\n ? value\n : fs.readFile(value, 'utf-8')\n\nexport const debug = Object.assign(function (this: any, ...chunks: any[]) {\n if (!this.enable) return\n\n console.log(...chunks)\n}, {\n enable: process.env.DEBUG,\n json(data: any, name: any = `debug-${Math.random().toString(16).slice(2)}.json`, base = path.resolve(process.cwd(), 'temp')) {\n if (!this.enable) return\n\n if (typeof data === 'string') {\n this.json(name, data)\n return\n }\n\n const _data = typeof data === 'function' ? data() : data\n\n fs.writeFile(path.resolve(base, name), JSON.stringify(_data, null, 2))\n }\n})\n", "import {TEntry, TSnapshot, TSnapshotIndex} from './interface'\nimport {debug, sortObject} from './util'\n\nexport const getDeps = (entry: TEntry): Record<string, string> => {\n if (!getDeps.cache.has(entry)) {\n getDeps.cache.set(entry, ({\n ...sortObject(entry.dependencies || {}),\n ...sortObject({...entry.devDependencies, ...entry.optionalDependencies})\n }))\n }\n\n return getDeps.cache.get(entry) as Record<string, string>\n}\n\ngetDeps.cache = new WeakMap<TEntry, Record<string, string>>()\n\ntype TWalkCtx = {\n root: TEntry,\n entry?: TEntry\n idx: TSnapshotIndex\n id?: string\n prefix?: string\n depth?: number\n parentId?: string\n parents?: TEntry[]\n}\n\nconst walk = (ctx: TWalkCtx) => {\n const {root, entry = root, prefix, depth = 0, parentId, idx, id = idx.getEntryId(entry), parents = []} = ctx\n const key = (prefix ? prefix + ',' : '') + entry.name\n\n if (id === undefined) {\n throw new TypeError(`Invalid snapshot: ${key}`)\n }\n\n if (!idx.tree[key]) {\n const chunks = key.split(',')\n idx.tree[key] = {\n key,\n chunks,\n id,\n name: entry.name,\n version: entry.version,\n entry,\n parents\n }\n if (root.dependencies?.[chunks[1]]) {\n idx.prod.add(entry)\n }\n if (parentId !== undefined) {\n idx.edges.push([parentId, id])\n return\n }\n if (depth) {\n return\n }\n }\n\n const dependencies = getDeps(entry)\n const stack: any[] = []\n\n Object.entries(dependencies).forEach(([name, range]) => {\n const _entry = idx.getEntryByRange(name, range)\n if (!_entry) {\n throw new Error(`inconsistent snapshot: ${name} ${range}`)\n }\n idx.bound(entry, _entry)\n if (parents.includes(entry)) {\n return\n }\n const _ctx: TWalkCtx = {root, entry: _entry, prefix: key, depth: depth + 1, parentId: id, idx, parents: [...parents, entry]}\n stack.push(_ctx)\n walk(_ctx)\n })\n\n stack.forEach(walk)\n}\n\nexport const getId = (name?: string, version: string = ''): string => name\n ? `${name}@${version}`\n : ''\n\nexport const analyze = (snapshot: TSnapshot): TSnapshotIndex => {\n const entries: TEntry[] = Object.values(snapshot)\n const roots = entries.filter(e => e.source.type === 'workspace')\n const prod = new Set(roots)\n const deps = new Map()\n const edges: [string, string][] = []\n const tree: TSnapshotIndex['tree'] = {}\n const idx: TSnapshotIndex = {\n snapshot,\n roots,\n edges,\n tree,\n prod,\n entries,\n bound(from: TEntry, to: TEntry) {\n const deps = this.getEntryDeps(from)\n if (deps.includes(to)) {\n return\n }\n\n deps.push(to)\n },\n getEntryId ({name, version}: TEntry): string {\n return getId(name, version)\n },\n getEntry (name: string, version?: string) {\n return snapshot[name] || snapshot[getId(name, version)]\n },\n getEntryByRange (name: string, range: string) {\n return entries.find(({name: _name, ranges}) => name === _name && ranges.includes(range))\n },\n getEntryDeps (entry: TEntry): TEntry[] {\n if (!deps.has(entry)) {\n deps.set(entry, [])\n }\n return deps.get(entry)\n }\n }\n\n const now = Date.now()\n roots.forEach((root, i) => walk({root, idx, id: root.source.id === '.' ? '' : undefined}))\n // walk({root: roots[0], idx, id: ''})\n // walk({root: roots[2], idx})\n console.log('analyze duration=', Date.now() - now, 'deptree size=', Object.keys(tree).length)\n\n debug.json('deptree.json', Object.values(tree).map(({parents, name}) => [...parents.map(p=> p.name).slice(1), name].join(',')))\n\n return idx\n}\n", "import {\n ICheck,\n IFormat,\n IParse, IPreformat,\n TDependencies,\n THashes,\n TEntry,\n TManifest,\n TSnapshot,\n} from '../interface'\nimport {debug, sortObject} from '../util'\nimport {parseIntegrity, formatTarballUrl} from '../common'\nimport {analyze} from '../analyze'\n\nexport const version = 'npm-1'\n\nexport type TNpm1LockfileEntry = {\n version: string\n resolved: string\n integrity: string\n dev?: boolean\n requires?: Record<string, string>\n dependencies?: TNpm1LockfileDeps\n}\n\nexport type TNpm1LockfileDeps = Record<string, TNpm1LockfileEntry>\n\nexport type TNpm1Lockfile = {\n lockfileVersion: 1\n name: string\n version: string\n requires?: true\n dependencies: TNpm1LockfileDeps\n}\n\ninterface TDepTree {\n dependencies?: Record<string, TDepTree>\n version: string\n requires?: any\n}\n\nexport const check: ICheck = (lockfile: string) => lockfile.includes(' \"lockfileVersion\": 1')\n\nexport const parse: IParse = (lockfile: string, pkg: string): TSnapshot => {\n const lf: TNpm1Lockfile = JSON.parse(lockfile)\n const manifest: TManifest = JSON.parse(pkg)\n const snapshot: Record<string, TEntry> = {\n \"\": {\n name: manifest.name,\n version: manifest.version,\n dependencies: manifest.dependencies,\n devDependencies: manifest.devDependencies,\n hashes: {},\n source: {\n type: 'workspace',\n id: '.'\n },\n ranges: [],\n manifest,\n }\n }\n const getClosestVersion = (name: string, ...deps: TNpm1LockfileDeps[]): string =>\n deps.find((dep) => dep[name])?.[name]?.version as string\n\n const upsertEntry = (name: string, version: string, data: Partial<TEntry> = {}): TEntry => {\n const key = `${name}@${version}`\n if (!snapshot[key]) {\n // @ts-ignore\n snapshot[key] = {name, version, ranges: []}\n }\n return Object.assign(snapshot[key], data)\n }\n const pushRange = (name: string, version: string, range: string): void => {\n const entry = upsertEntry(name, version)\n\n if (!entry.ranges.includes(range)) {\n entry.ranges.push(range)\n entry.ranges.sort()\n }\n }\n const extractRanges = (deps?: TDependencies, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([_name, range]) => {\n const _version = getClosestVersion(_name, ...parents)\n pushRange(_name, _version, range)\n })\n const extractEntries = (deps?: TNpm1LockfileDeps, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([name, entry]) => {\n const requires = entry.requires || entry.dependencies && Object.entries(entry.dependencies).reduce((m, [name, {version}]) => {\n m[name] = version\n return m\n }, {} as Record<string, string>)\n\n upsertEntry(name, entry.version, {\n hashes: parseIntegrity(entry.integrity),\n dependencies: requires,\n source: {\n type: 'npm',\n id: entry.resolved\n }\n })\n\n extractEntries(entry.dependencies, deps, ...parents)\n extractRanges(requires, entry.dependencies || {}, deps, ...parents)\n })\n\n extractEntries(lf.dependencies)\n extractRanges({\n ...snapshot[\"\"].dependencies,\n ...snapshot[\"\"].devDependencies\n }, lf.dependencies || {})\n\n debug.json('npm1-snapshot.json', snapshot)\n\n return sortObject(snapshot)\n}\n\nconst formatIntegrity = (hashes: THashes): string => Object.entries(hashes).map(([key, value]) => `${key}-${value}`).join(' ')\n\nexport const preformat: IPreformat<TNpm1Lockfile> = (idx): TNpm1Lockfile => {\n const root = idx.snapshot[\"\"].manifest as TManifest\n const deptree = Object.values(idx.tree).slice(1).map(({parents, entry}) => [...parents.slice(1), entry])\n\n debug.json('deptree-npm-1.json', deptree.map((entries: TEntry[]) => entries.map(e => e.name).join(',')))\n\n const formatNpm1LockfileEntry = (entry: TEntry): TNpm1LockfileEntry => {\n const {name, version, hashes} = entry\n const _entry: TNpm1LockfileDeps[string] = {\n version,\n resolved: formatTarballUrl(name, version),\n integrity: formatIntegrity(hashes)\n }\n\n if (!idx.prod.has(entry)) {\n _entry.dev = true\n }\n\n if (entry.dependencies) {\n _entry.requires = entry.dependencies\n }\n\n return _entry\n }\n\n const lf: TNpm1Lockfile = {\n name: root.name,\n version: root.version,\n lockfileVersion: 1,\n requires: true,\n dependencies: {}\n }\n const nmtree = lf\n const nodes: TDepTree[] = [nmtree]\n const processEntry = (name: string, version: string, parents: TNpm1LockfileEntry[]) => {\n const entry = idx.getEntry(name, version)!\n const deps = idx.getEntryDeps(entry)\n const queue: [string, string, TNpm1LockfileEntry[]][] = []\n\n deps.forEach((e) => {\n const closestIndex = parents.findIndex((p) => p.dependencies?.[e.name])\n const closest = parents[closestIndex]\n if (closest?.dependencies?.[e.name].version === e.version) {\n return\n }\n\n const _entry = formatNpm1LockfileEntry(e)\n const _parents = [_entry, ...parents]\n const parent = closest\n ? _parents[closestIndex]\n : _parents[_parents.length - 1]\n\n if (!parent.dependencies) {\n parent.dependencies = {}\n }\n parent.dependencies[e.name] = _entry\n\n nodes.push(parent)\n queue.push([e.name, e.version, _parents])\n })\n\n queue.forEach(([name, version, parents]) => processEntry(name, version, parents))\n }\n\n deptree.forEach((chain) => {\n const entry = chain[chain.length - 1]\n const {name} = entry\n\n if (!nmtree.dependencies[name]) {\n nmtree.dependencies[name] = formatNpm1LockfileEntry(entry)\n }\n })\n Object.entries(nmtree.dependencies).forEach(([name, entry]) => processEntry(name, entry.version, [entry, nmtree] as TNpm1LockfileEntry[]))\n\n nodes.forEach((node) => {\n sortObject(node.dependencies || {})\n\n if (node.requires) {\n const snap1 = Object.entries(node.requires).map(([name, range]) => `${name}@${range}`).join('')\n const snap2 = Object.entries(node.dependencies || {}).map(([name, {version}]) => `${name}@${version}`).join('')\n\n if (snap1 === snap2) {\n delete node.requires\n }\n }\n })\n\n return lf\n}\n\nexport const format: IFormat = (snap): string =>\n JSON.stringify(preformat(analyze(snap)), null, 2)\n", "import {ICheck, IFormat, IPreformat, TEntry, TManifest, TSnapshot, TSource} from '../interface'\nimport {formatTarballUrl, parseIntegrity, formatIntegrity} from '../common'\nimport {sortObject, debug} from '../util'\nimport {analyze, getDeps, getId} from '../analyze'\nimport semver from 'semver'\n\nexport type TNpm3LockfileEntry = {\n name?: string\n version?: string\n resolved?: string\n integrity?: string\n dev?: boolean\n link?: boolean\n dependencies?: Record<string, string>,\n engines?: Record<string, string>\n funding?: Record<string, string>\n peerDependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n bin?: any\n license?: string\n}\n\nexport type TNpm3LockfileDeps = Record<string, TNpm3LockfileEntry>\n\nexport type TNpm3Lockfile = {\n lockfileVersion: 3\n name: string\n version: string\n requires?: true\n packages: TNpm3LockfileDeps\n}\n\nexport const version = 'npm-3'\n\nexport const check: ICheck = (lockfile: string) => lockfile.includes(' \"lockfileVersion\": 3')\n\nexport const parse = (lockfile: string): TSnapshot => {\n const lf: TNpm3Lockfile = JSON.parse(lockfile)\n const snapshot = parsePackages(lf.packages)\n\n snapshot[\"\"].manifest = lf.packages[\"\"]\n\n debug.json('npm3-snapshot.json', snapshot)\n\n return snapshot\n}\n\nconst formatNmKey = (chunks: string[]) => `node_modules/` + chunks.join('/node_modules/')\n\nconst parsePackages = (packages: TNpm3LockfileDeps): any => {\n const entries: Record<string, TEntry> = {}\n const getClosestPkg = (name: string, chain: string[], entries: Record<string, TNpm3LockfileEntry>, range: string): [string, TNpm3LockfileEntry] => {\n const variants: string[] = []\n\n let s = 0\n let i = 0\n while(s < chain.length) {\n let l = chain.length + 1\n while (l--) {\n const variant = formatNmKey([...chain.slice(s, l), name].filter(Boolean))\n const entry = entries[variant]\n\n if (entry && (!entry.version || semver.satisfies(entry.version as string, range))) { // FIXME later\n return [variant, entry]\n }\n variants.push(variant)\n }\n s++\n }\n throw new Error(`Malformed lockfile: ${name} ${range}\\n${variants.join('\\n')}`)\n }\n\n const processPackage = (path: string, pkg: TNpm3LockfileEntry): TEntry => {\n const sourceType = (pkg.link || path === \"\") ? 'workspace' : 'semver'\n\n if (sourceType === 'workspace' && !pkg.name){\n return processPackage(path, {\n ...pkg,\n ...packages[pkg.resolved as string]\n })\n }\n const source: TSource = {\n id: (pkg.resolved || '.') as string,\n type: sourceType\n }\n\n const chain: string[] = path ? ('/' + path).split('/node_modules/').filter(Boolean) : [\"\"]\n const name = pkg.name || chain[chain.length - 1]\n const version = pkg.version as string\n const id = path === \"\" ? path : getId(name, version)\n\n if (entries[id]) {\n return entries[id]\n }\n\n entries[id] = {\n name,\n version,\n ranges: [],\n hashes: parseIntegrity(pkg.integrity),\n source,\n dependencies: pkg.dependencies,\n engines: pkg.engines,\n funding: pkg.funding,\n bin: pkg.bin,\n devDependencies: pkg.devDependencies,\n peerDependencies: pkg.peerDependencies,\n optionalDependencies: pkg.optionalDependencies,\n license: pkg.license\n }\n\n Object.entries<string>(getDeps(entries[id])).forEach(([_name, range]) => {\n const [_path, _entry] = getClosestPkg(_name, chain, packages, range)\n const {ranges} = processPackage(_path, _entry)\n\n if (!ranges.includes(range)) {\n ranges.push(range)\n ranges.sort()\n }\n })\n return entries[id]\n }\n\n Object.entries(packages).forEach(([path, entry]) =>\n (path.startsWith('node_modules/') || path === '') && processPackage(path, entry))\n\n return sortObject(entries)\n}\n\nexport const preformat: IPreformat<TNpm3Lockfile> = (idx): TNpm3Lockfile => {\n const snap = idx.snapshot\n const nmtree = Object.values(idx.tree).reduce<Record<string, {entry: TEntry, parent: string}>>((result, {key, id, chunks}) => {\n const entry = snap[id]\n if (!entry) {\n throw new Error(`Malformed snapshot: ${id}`)\n }\n\n const grandparent = chunks[1]\n const cl = chunks.length\n\n let l = 0\n while (l <= cl) {\n const [name, ...parents] = [...chunks].reverse()\n\n let i = 0\n while (i < parents.length) {\n const __key = parents.slice(i, i + l).reverse()\n const _key = [...__key, name]//\n const variant = formatNmKey(_key)\n const found = result[variant]\n if (found) {\n\n if (found.entry === entry) {\n return result\n }\n\n } else {\n const pEntry = result[formatNmKey(__key)]?.entry\n const ppEntry = idx.getEntry(idx.tree[chunks.slice(0, cl - i - l).join(',')]?.id)\n if (__key.length && pEntry !== ppEntry) {\n i++\n continue\n }\n\n result[variant] = {entry, parent: grandparent}\n return result\n }\n i++\n }\n l++\n }\n\n if (entry.source.type === 'workspace') {\n result[formatNmKey([entry.name])] = {entry, parent: ''}\n }\n\n return result\n }, {})\n\n debug.json('npm3-nmtree.json', nmtree)\n\n const manifest = snap[\"\"].manifest as TManifest\n const packages = sortObject(Object.entries(nmtree).reduce((m, [k, {entry, parent}]) => {\n if (entry.source.type === 'workspace') {\n if (entry.source.id === '.') {\n m[\"\"] = manifest as TNpm3LockfileEntry\n return m\n }\n\n m[`node_modules/${entry.name}`] = {\n resolved: entry.source.id as string,\n link: true\n }\n\n m[entry.source.id as string] = {\n name: entry.name,\n version: entry.version,\n license: entry.license,\n dependencies: entry.dependencies,\n bin: entry.bin,\n devDependencies: entry.devDependencies,\n }\n return m\n }\n\n m[k] = {\n version: entry.version,\n resolved: formatTarballUrl(entry.name, entry.version),\n integrity: formatIntegrity(entry.hashes)\n }\n if (!idx.prod.has(entry)) {\n m[k].dev = true\n }\n m[k].dependencies = entry.dependencies\n m[k].bin = entry.bin\n m[k].engines = entry.engines\n m[k].funding = entry.funding\n m[k].peerDependencies = entry.peerDependencies\n m[k].optionalDependencies = entry.optionalDependencies\n\n return m\n }, {} as TNpm3LockfileDeps)\n )\n\n return {\n name: manifest.name,\n version: manifest.version,\n lockfileVersion: 3,\n requires: true,\n packages,\n }\n}\n\nexport const format: IFormat = (snapshot: TSnapshot): string => JSON.stringify(preformat(analyze(snapshot)), null, 2)\n", "import {ICheck, IFormat, IPreformat, TSnapshot} from '../interface'\nimport {preformat as preformatNpm1, TNpm1LockfileDeps, TNpm1Lockfile} from './npm-1'\nimport {preformat as preformatNpm3, TNpm3LockfileDeps, TNpm3Lockfile} from './npm-3'\nimport {analyze} from '../analyze'\n\nexport type TNpm2Lockfile = {\n lockfileVersion: 2\n name: string\n version: string\n requires?: true\n packages: TNpm3LockfileDeps\n dependencies: TNpm1LockfileDeps\n}\n\nexport const version = 'npm-2'\n\nexport {parse} from './npm-3'\n\nexport const check: ICheck = (lockfile: string) => lockfile.includes(' \"lockfileVersion\": 2')\n\nexport const preformat: IPreformat<TNpm2Lockfile> = (idx): TNpm2Lockfile => {\n const lfnpm1: TNpm1Lockfile = preformatNpm1(idx)\n const lfnpm3: TNpm3Lockfile = preformatNpm3(idx)\n\n return {\n name: lfnpm1.name,\n version: lfnpm1.version,\n lockfileVersion: 2,\n requires: true,\n packages: lfnpm3.packages,\n dependencies: lfnpm1.dependencies,\n }\n}\n\nexport const format: IFormat = (snapshot: TSnapshot): string => JSON.stringify(preformat(analyze(snapshot)), null, 2)\n", "import {load, dump} from 'js-yaml'\nimport {TDependencies, TSnapshot, TSnapshotIndex, ICheck, IFormat, IParse, IPreformat, TSource} from '../interface'\nimport {parseIntegrity} from '../common'\nimport {debug} from '../util'\n\nconst kvEntryPattern = /^(\\s+)\"?([^\"]+)\"?\\s\"?([^\"]+)\"?$/\n\nexport type TYarn1Lockfile = Record<string, {\n version: string\n resolved: string\n integrity: string\n dependencies?: TDependencies\n optionalDependencies?: TDependencies\n}>\n\nexport const version = 'yarn-1'\n\nexport const check: ICheck = (value: string): boolean => value.includes('# yarn lockfile v1')\n\nexport const preparse = (value: string): TYarn1Lockfile => {\n const lines = value.split('\\n')\n const _value = lines.map((line) => {\n if (line.startsWith('#')) {\n return ''\n }\n\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n const [,p,k,v]: string[] = line.match(kvEntryPattern) || []\n if (line.match(kvEntryPattern)) {\n return `${p}\"${k}\": \"${v}\"`\n }\n\n return line\n }, '').join('\\n')\n\n return load(_value) as TYarn1Lockfile\n}\n\nexport const parse: IParse = (value: string, pkg: string): TSnapshot => {\n const manifest = JSON.parse(pkg)\n const raw = preparse(value)\n const snapshot: TSnapshot = {}\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const chunks = _key.split(', ')\n const ranges = chunks.map(r => r.slice(r.lastIndexOf('@') + 1)).sort()\n const { version, integrity, dependencies, optionalDependencies, resolved } = _entry\n const name = chunks[0].slice(0, chunks[0].lastIndexOf('@'))\n const key = `${name}@${version}`\n const hashes = parseIntegrity(integrity)\n const source: TSource = {\n type: 'npm',\n id: resolved\n }\n\n snapshot[key] = {\n name,\n version,\n ranges,\n hashes,\n dependencies,\n optionalDependencies,\n source,\n }\n })\n\n snapshot[\"\"] = {\n name: manifest.name,\n version: manifest.version,\n ranges: [],\n hashes: {},\n source: {\n type: 'workspace',\n id: '.'\n },\n manifest,\n dependencies: manifest.dependencies\n }\n\n debug.json('yarn-classic-snapshot.json', snapshot)\n\n return snapshot\n}\n\nexport const preformat: IPreformat<TYarn1Lockfile> = (idx): TYarn1Lockfile => {\n const {snapshot} = idx\n const lf: TYarn1Lockfile = {}\n\n Object.values(snapshot).forEach((entry) => {\n const { name, version, ranges, hashes, dependencies, optionalDependencies, source } = entry\n const key = ranges.map(r => `${name}@${r}`).join(', ')\n const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n\n lf[key] = {\n version,\n resolved: source.id as string,\n integrity,\n dependencies,\n optionalDependencies,\n }\n })\n\n delete lf[\"\"]\n\n return lf\n}\n\nexport const format: IFormat = (snapshot: TSnapshot): string => {\n const lf = preformat({snapshot} as TSnapshotIndex)\n const lines: string[] = dump(lf, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: true\n }).split('\\n')\n const _value = lines.map((line) => {\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n const chunks = line.slice(0, -1).replaceAll('\"', '').split(', ').map(chunk => chunk.startsWith('@') || chunk.includes(' ') ? `\"${chunk}\"` : chunk)\n return `\\n${chunks.join(', ')}:`\n }\n\n if (line.startsWith(' integrity')) {\n const _line = line.replace(':', '')\n\n return line.includes('= ') // multiple hashes\n ? _line.replaceAll('\"integrity\"', 'integrity')\n : _line.replaceAll('\"', '')\n }\n\n if (line.endsWith('ependencies:')) {\n return line\n }\n\n return line.replace(':', '')\n }, '').join('\\n')\n\n return `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n\n${_value}`\n}\n", "// https://github.com/yarnpkg/berry/commit/2f9e8073d15745f9d53e6b8b42fa9c81eb143d54\n\nimport {load, dump} from 'js-yaml'\nimport {\n ICheck,\n IFormat,\n IParse,\n IPreformat,\n TDependencies,\n TDependenciesMeta,\n TSnapshot,\n TSnapshotIndex,\n TSourceType\n} from '../interface'\nimport {parseIntegrity} from '../common'\nimport {debug, sortObject} from '../util'\n\nexport type TYarn5Lockfile = Record<string, {\n version: string\n resolution: string\n conditions?: string\n checksum: string\n languageName: string\n linkType: string\n dependencies?: TDependencies\n dependenciesMeta?: TDependenciesMeta\n optionalDependencies?: TDependencies\n peerDependencies?: TDependencies\n peerDependenciesMeta?: TDependenciesMeta\n bin?: Record<string, string>\n}>\n\nexport const version = 'yarn-berry'\n\nexport const check: ICheck = (value: string): boolean => value.includes(`\n__metadata:\n version:`)\n\nconst parseResolution = (resolution: string): {sourceId: string, sourceType: TSourceType, name: string} => {\n const colonPos = resolution.indexOf(':')\n const atPos = resolution.indexOf('@', 1)\n const name = resolution.slice(0, atPos)\n\n if (colonPos === -1) {\n return {\n name,\n sourceId: resolution.slice(atPos + 1),\n sourceType: 'npm'\n }\n }\n return {\n name,\n sourceId: resolution.slice(colonPos + 1),\n sourceType: resolution.slice(atPos + 1, colonPos) as TSourceType\n }\n}\n\nconst formatResolution = (name: string, source: string, sourceType: TSourceType = 'npm'): string =>\n `${name}@${sourceType === 'semver' ? '' : sourceType + ':'}${source}`\n\nexport const parse: IParse = (lockfile: string, pkg: string): TSnapshot => {\n const manifest = JSON.parse(pkg)\n const snapshot: TSnapshot = {}\n const raw = load(lockfile) as TYarn5Lockfile\n\n delete raw.__metadata\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const { version, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution, bin, conditions } = _entry\n const chunks = _key.split(', ')\n const refs = chunks.map(parseResolution)\n const name = refs[0].name\n const key = `${name}@${version}`\n\n // seems like a patch\n if (_key.includes('#')) {\n snapshot[key].patch = {\n resolution,\n refs: chunks,\n checksum\n }\n return\n }\n\n const ranges = refs.map(r => r.sourceId).sort()\n const hashes = parseIntegrity(checksum)\n const {sourceType, sourceId} = parseResolution(resolution)\n const source = {\n id: sourceId,\n type: sourceType\n }\n\n snapshot[key] = {\n name,\n version,\n ranges,\n hashes,\n source,\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n bin,\n conditions,\n }\n\n if (sourceType === 'workspace') {}\n })\n\n snapshot[\"\"] = {\n name: manifest.name,\n version: manifest.version,\n ranges: [],\n hashes: {},\n source: {\n type: 'workspace',\n id: '.'\n },\n manifest,\n dependencies: manifest.dependencies,\n devDependencies: manifest.devDependencies\n }\n\n debug.json('yarn-berry-snapshot.json', snapshot)\n return snapshot\n}\n\nexport const preformat: IPreformat<TYarn5Lockfile> = (idx): TYarn5Lockfile => {\n const {snapshot} = idx\n const lf: TYarn5Lockfile = {}\n\n Object.values(snapshot).forEach((entry) => {\n const { name, version, ranges, hashes: {checksum}, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, patch, bin, conditions } = entry\n const isLocal = version === '0.0.0-use.local'\n const languageName = isLocal ? 'unknown' : 'node'\n const linkType = isLocal ? 'soft' : 'hard'\n const key = ranges.map(r => formatResolution(name, r, source.type === 'workspace' ? ((r === '.' || r.includes('/')) ? 'workspace' : 'semver'): 'npm')).join(', ')\n\n lf[key] = {\n version,\n resolution: formatResolution(name, source.id, source.type),\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n bin,\n checksum: checksum as string,\n conditions,\n languageName,\n linkType,\n }\n\n if (patch) {\n lf[patch.refs.join(', ')] = {\n ...lf[key],\n resolution: patch.resolution,\n checksum: patch.checksum,\n }\n }\n })\n\n delete lf[\"\"]\n\n return sortObject(lf)\n}\n\nexport const format: IFormat = (snapshot: TSnapshot, {__metadata = {\n version: 5,\n cacheKey: 8,\n}} = {}): string => {\n const lines = dump({\n __metadata,\n ...preformat({snapshot} as TSnapshotIndex)\n }, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: false,\n noRefs: true\n })\n .split('\\n')\n .map(line => {\n if (line === '__metadata:') {\n return `\\n${line}`\n }\n\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\\n\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n if (line.startsWith(' resolution: ')) {\n return line.replaceAll('\"', '').replace(' resolution: ', ' resolution: \"').concat('\"')\n }\n\n return line\n })\n\n const _value = lines.join('\\n')\n\n return `# This file is generated by running \"yarn install\" inside your project.\n# Manual changes might be lost - proceed with caution!\n${_value}`\n}", "import {parse as parseNpm1, check as checkNpm1} from './formats/npm-1'\nimport {parse as parseNpm2, check as checkNpm2} from './formats/npm-2'\nimport {parse as parseNpm3, check as checkNpm3} from './formats/npm-3'\nimport {parse as parseYarnClassic, check as checkYarnClassic} from './formats/yarn-classic'\nimport {parse as parseYarnBerry, check as checkYarnBerry} from './formats/yarn-berry'\nimport {ICheck, IParse, TSnapshot} from './interface'\n\nconst isPkgJson = (input: string) => input.startsWith('{') && input.includes('\"name\":')\nconst variants: [ICheck, IParse][] = [\n [checkNpm1, parseNpm1],\n [checkNpm2, parseNpm2],\n [checkNpm3, parseNpm3],\n [checkYarnClassic, parseYarnClassic],\n [checkYarnBerry, parseYarnBerry],\n]\nexport const parse = (lockfile: string, ...pkgJsons: string[]): TSnapshot => {\n const [,parser] = variants.find(([check]) => check(lockfile)) || []\n\n if (!parser) {\n throw new TypeError('Unsupported lockfile format')\n }\n\n if (!pkgJsons.every(isPkgJson)) {\n throw new TypeError('Invalid package json')\n }\n\n return parser(lockfile, ...pkgJsons)\n}\n", "import {IFormat, IFormatOpts, TSnapshot} from './interface'\n\nimport {version as versionNpm1, format as formatNpm1} from './formats/npm-1'\nimport {version as versionNpm2, format as formatNpm2} from './formats/npm-2'\nimport {version as versionNpm3, format as formatNpm3} from './formats/npm-3'\nimport {version as versionYarnClassic, format as formatYarnClassic} from './formats/yarn-classic'\nimport {version as versionYarnBerry, format as formatYarnBerry} from './formats/yarn-berry'\n\nconst variants: [string, IFormat][] = [\n [versionNpm1, formatNpm1],\n [versionNpm2, formatNpm2],\n [versionNpm3, formatNpm3],\n [versionYarnClassic, formatYarnClassic],\n [versionYarnBerry, formatYarnBerry],\n]\n\nexport const format = (snapshot: TSnapshot, version: string, opts?: IFormatOpts): string => {\n const [,formatter] = variants.find(([_version]) => version === _version) || []\n\n if (!formatter) {\n throw new TypeError(`Unsupported lockfile format: ${version}`)\n }\n\n return formatter(snapshot, opts)\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["version", "version", "deps", "version", "name", "formatIntegrity", "parents", "semver", "version", "check", "parse", "entries", "variants", "path", "preformat", "format", "version", "check", "preformat", "format", "version", "check", "parse", "value", "preformat", "format", "load", "dump", "version", "check", "parse", "load", "preformat", "format", "dump", "check", "parse", "variants", "version", "format"]
|
|
4
|
+
"sourcesContent": ["import semver from 'semver'\nimport fs from 'node:fs/promises'\nimport {topo, traverseDeps} from '@semrel-extra/topo'\nimport {URL} from 'node:url'\nimport {THashes, TSnapshot, TSource} from './interface'\n\nexport const getSources = (snapshot: TSnapshot): string[] =>\n Object.values(snapshot)\n .map(entry => entry.source.id)\n .filter(Boolean)\n\nexport const parseIntegrity = (integrity?: string): THashes =>\n integrity\n ? integrity.split(' ').reduce<THashes>((m, item) => {\n const [k, v] = item.split('-')\n if (k === 'sha512' || k === 'sha256' || k === 'sha1' || k === 'checksum') {\n m[k] = v\n } else if (!v){\n m['checksum'] = k\n }\n\n return m\n }, {})\n : {}\n\nexport const formatIntegrity = (hashes: THashes): string => {\n const checksum = hashes['checksum']\n if (checksum) {\n return checksum\n }\n\n return Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n}\n\nexport interface IReference {\n protocol: string\n id: string\n name?: string\n host?: string\n [extra: string]: any\n}\n\nconst parseVersion = (version: string): string | null => semver.valid(version) || semver.coerce(version)?.version || null\n\nconst parseCaret = (value: string): string => (value.startsWith('^') || value.startsWith('~')) ? value[0] : ''\n\nconst parseName = (value: string): string => (value).slice(0, (value + '.').indexOf('.'))\n\nexport const parseTarballUrl = (resolution: string): TSource | null => {\n // https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d\n // https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz\n // Use regexp or URL to parse? A benchmark is needed.\n const [tgz, br, _name, org, ...rest] = resolution.split('/').reverse()\n if (br !== '-') {\n return null\n }\n\n const hasScope = org.startsWith('@')\n const name = hasScope ? `${org}/${_name}` : _name\n const id = tgz.slice(_name.length + 1, tgz.lastIndexOf('.tgz'))\n\n return {\n type: 'npm',\n name,\n id,\n registry: rest.reverse().join('/') + (hasScope ? '' : '/' + org),\n hash: tgz.slice((tgz + '#').indexOf('#'))\n }\n}\n\nexport const formatTarballUrl = (name: string, version: string, registry = 'https://registry.npmjs.org', hash = '') =>\n `${registry}/${name}/-/${name.slice(name.indexOf('/') + 1)}-${version}.tgz${hash}`\n\nexport const parseReference = (raw?: any): IReference => {\n if (raw.startsWith('workspace:')) {\n return {\n protocol: 'workspace',\n id: raw.slice(10)\n }\n }\n\n if (raw.startsWith('npm:')) {\n return {\n protocol: 'npm',\n id: raw.slice(4)\n }\n }\n\n if (URL.canParse(raw)) {\n const url = new URL(raw)\n return {\n protocol: url.protocol.slice(0, -1),\n name: parseName(url.pathname.startsWith('/') ? url.pathname.slice(1) : url.pathname),\n id: url.hash.slice(1),\n host: url.host\n }\n }\n\n if (raw.includes('/') && !raw.includes(':')) { // use regexp?\n const name = raw.slice(0, (raw + '#').indexOf('#'))\n return {\n protocol: 'github',\n name,\n id: raw.slice(name.length + 1)\n }\n }\n\n return {\n protocol: 'semver',\n id: raw,\n }\n}\n\nexport const mapReference = (current: string, targetProtocol: string, strategy = 'inherit'): string => {\n const {id, protocol} = parseReference(current)\n const version = parseVersion(id)\n const caret = parseCaret(id)\n const prefix = targetProtocol === 'semver' ? '' : `${targetProtocol}:`\n\n if (protocol === targetProtocol) {\n return current\n }\n\n if (version === null) {\n return prefix + '*'\n }\n\n const _version = strategy === 'pin'\n ? version\n : strategy === 'inherit'\n ? (caret + version)\n : strategy\n\n return prefix + _version\n}\n\n/**\n * Replaces local monorepo cross-refs with the target protocol: workspace or semver\n */\nexport const switchMonorefs = async ({cwd, strategy, protocol = 'semver', dryrun = false}: {\n cwd?: string\n strategy?: string // 'inherit' | 'pin' | 'coerce'\n protocol?: string\n dryrun?: boolean\n}) => {\n const {packages} = await topo({cwd})\n\n await Promise.all(Object.values(packages).map(async pkg => {\n await traverseDeps({pkg, packages, cb({name, version, deps}) {\n deps[name] = mapReference(version, protocol, strategy)\n }})\n\n if (dryrun) {\n return\n }\n\n await fs.writeFile(pkg.manifestAbsPath, JSON.stringify(pkg.manifest), 'utf8')\n }))\n\n return packages\n}\n", "import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport * as process from 'node:process'\n\nexport const sortObject = <T extends Record<string, any>>(\n unordered: T,\n predicate: (a: [string, any], b: [string, any]) => number = ([a], [b]) => a > b ? 1 : -1 // This is actually what npm does\n): T =>\n Object.entries({...unordered})\n .sort(predicate)\n .reduce((obj, [key, value]: [keyof T, T[keyof T]]) => {\n obj[key] = value\n return obj\n },\n flushObject(unordered) as T,\n )\n\nexport const flushObject = (obj: Record<string, any>) => {\n for (const key in obj) {\n delete obj[key]\n }\n\n return obj\n}\n\nexport const loadContents = async (value: string): Promise<string> =>\n value.includes('\\n')\n ? value\n : fs.readFile(value, 'utf-8')\n\nexport const debug = Object.assign((...chunks: any[]) => {\n if (!debug.enable) return\n\n console.log(...chunks)\n}, {\n enable: process.env.DEBUG,\n json(data: any, name: any = `debug-${Math.random().toString(16).slice(2)}.json`, base = path.resolve(process.cwd(), 'temp')) {\n if (!this.enable) return\n\n if (typeof data === 'string') {\n this.json(name, data)\n return\n }\n\n const _data = typeof data === 'function' ? data() : data\n\n fs.writeFile(path.resolve(base, name), JSON.stringify(_data, null, 2))\n }\n})\n\nexport const unique = (arr: string[]): string[] => [...new Set(arr)]\n", "import {TEntry, TSnapshot, TSnapshotIndex} from './interface'\nimport {debug, sortObject} from './util'\n\nexport const getDeps = (entry: TEntry): Record<string, string> => {\n if (!getDeps.cache.has(entry)) {\n getDeps.cache.set(entry, ({\n ...sortObject(entry.dependencies || {}),\n ...sortObject({...entry.devDependencies, ...entry.optionalDependencies})\n }))\n }\n\n return getDeps.cache.get(entry) as Record<string, string>\n}\n\ngetDeps.cache = new WeakMap<TEntry, Record<string, string>>()\n\ntype TWalkCtx = {\n root: TEntry,\n entry?: TEntry\n idx: TSnapshotIndex\n id?: string\n prefix?: string\n depth?: number\n parentId?: string\n parents?: TEntry[]\n}\n\nconst walk = (ctx: TWalkCtx) => {\n const {root, entry = root, prefix, depth = 0, parentId, idx, id = idx.getEntryId(entry), parents = []} = ctx\n const key = (prefix ? prefix + ',' : '') + entry.name\n\n if (id === undefined) {\n throw new TypeError(`Invalid snapshot: ${key}`)\n }\n\n if (!idx.tree[key]) {\n const chunks = key.split(',')\n idx.tree[key] = {\n key,\n chunks,\n id,\n name: entry.name,\n version: entry.version,\n entry,\n parents\n }\n if (root.dependencies?.[chunks[1]]) {\n idx.prod.add(entry)\n }\n if (parentId !== undefined) {\n idx.edges.push([parentId, id])\n return\n }\n if (depth) {\n return\n }\n }\n\n const dependencies = getDeps(entry)\n const stack: any[] = []\n\n Object.entries(dependencies).forEach(([name, range]) => {\n const _entry = idx.getEntryByRange(name, range)\n if (!_entry) {\n throw new Error(`inconsistent snapshot: ${name} ${range}`)\n }\n idx.bound(entry, _entry)\n if (parents.includes(entry)) {\n return\n }\n const _ctx: TWalkCtx = {root, entry: _entry, prefix: key, depth: depth + 1, parentId: id, idx, parents: [...parents, entry]}\n stack.push(_ctx)\n walk(_ctx)\n })\n\n stack.forEach(walk)\n}\n\nexport const getId = (name?: string, version: string = ''): string => name\n ? `${name}@${version}`\n : ''\n\nexport const analyze = (snapshot: TSnapshot): TSnapshotIndex => {\n const entries: TEntry[] = Object.values(snapshot)\n const roots = entries.filter(e => e.source.type === 'workspace')\n const prod = new Set(roots)\n const deps = new Map()\n const edges: [string, string][] = []\n const tree: TSnapshotIndex['tree'] = {}\n const idx: TSnapshotIndex = {\n snapshot,\n roots,\n edges,\n tree,\n prod,\n entries,\n bound(from: TEntry, to: TEntry) {\n const deps = this.getEntryDeps(from)\n if (deps.includes(to)) {\n return\n }\n\n deps.push(to)\n },\n getEntryId ({name, version}: TEntry): string {\n return getId(name, version)\n },\n getEntry (name: string, version?: string) {\n return snapshot[name] || snapshot[getId(name, version)]\n },\n getEntryByRange (name: string, range: string) {\n return entries.find(({name: _name, ranges}) => name === _name && ranges.includes(range))\n },\n getEntryDeps (entry: TEntry): TEntry[] {\n if (!deps.has(entry)) {\n deps.set(entry, [])\n }\n return deps.get(entry)\n }\n }\n\n const now = Date.now()\n roots.forEach((root, i) => walk({root, idx, id: root.source.id === '.' ? '' : undefined}))\n // walk({root: roots[0], idx, id: ''})\n // walk({root: roots[2], idx})\n debug('analyze duration=', Date.now() - now, 'deptree size=', Object.keys(tree).length)\n debug.json('deptree.json', Object.values(tree).map(({parents, name}) => [...parents.map(p=> p.name).slice(1), name].join(',')))\n\n return idx\n}\n", "import {\n ICheck,\n IFormat,\n IParse, IPreformat,\n TDependencies,\n THashes,\n TEntry,\n TManifest,\n TSnapshot,\n IParseResolution,\n IFormatResolution,\n TResolution,\n} from '../interface'\nimport {debug, sortObject} from '../util'\nimport {parseIntegrity, formatTarballUrl, parseTarballUrl} from '../common'\nimport {analyze} from '../analyze'\n\nexport const version = 'npm-1'\n\nexport type TNpm1LockfileEntry = {\n version: string\n resolved: string\n integrity: string\n dev?: boolean\n requires?: Record<string, string>\n dependencies?: TNpm1LockfileDeps\n}\n\nexport type TNpm1LockfileDeps = Record<string, TNpm1LockfileEntry>\n\nexport type TNpm1Lockfile = {\n lockfileVersion: 1\n name: string\n version: string\n requires?: true\n dependencies: TNpm1LockfileDeps\n}\n\ninterface TDepTree {\n dependencies?: Record<string, TDepTree>\n version: string\n requires?: any\n}\n\nexport const check: ICheck = (lockfile: string) => lockfile.includes(' \"lockfileVersion\": 1')\n\nexport const parse: IParse = (lockfile: string, pkg: string): TSnapshot => {\n const lf: TNpm1Lockfile = JSON.parse(lockfile)\n const manifest: TManifest = JSON.parse(pkg)\n const snapshot: Record<string, TEntry> = {\n \"\": {\n name: manifest.name,\n version: manifest.version,\n dependencies: manifest.dependencies,\n devDependencies: manifest.devDependencies,\n hashes: {},\n source: {\n type: 'workspace',\n id: '.'\n },\n ranges: [],\n manifest,\n }\n }\n const getClosestVersion = (name: string, ...deps: TNpm1LockfileDeps[]): string =>\n deps.find((dep) => dep[name])?.[name]?.version as string\n\n const upsertEntry = (name: string, version: string, data: Partial<TEntry> = {}): TEntry => {\n const key = `${name}@${version}`\n if (!snapshot[key]) {\n // @ts-ignore\n snapshot[key] = {name, version, ranges: []}\n }\n return Object.assign(snapshot[key], data)\n }\n const pushRange = (name: string, version: string, range: string): void => {\n const entry = upsertEntry(name, version)\n\n if (!entry.ranges.includes(range)) {\n entry.ranges.push(range)\n entry.ranges.sort()\n }\n }\n const extractRanges = (deps?: TDependencies, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([_name, range]) => {\n const _version = getClosestVersion(_name, ...parents)\n pushRange(_name, _version, range)\n })\n const extractEntries = (deps?: TNpm1LockfileDeps, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([name, entry]) => {\n const requires = entry.requires || entry.dependencies && Object.entries(entry.dependencies).reduce((m, [name, {version}]) => {\n m[name] = version\n return m\n }, {} as Record<string, string>)\n\n upsertEntry(name, entry.version, {\n hashes: parseIntegrity(entry.integrity),\n dependencies: requires,\n source: parseResolution(entry.resolved)\n })\n\n extractEntries(entry.dependencies, deps, ...parents)\n extractRanges(requires, entry.dependencies || {}, deps, ...parents)\n })\n\n extractEntries(lf.dependencies)\n extractRanges({\n ...snapshot[\"\"].dependencies,\n ...snapshot[\"\"].devDependencies\n }, lf.dependencies || {})\n\n debug.json('npm1-snapshot.json', snapshot)\n\n return sortObject(snapshot)\n}\n\nconst formatIntegrity = (hashes: THashes): string => Object.entries(hashes).map(([key, value]) => `${key}-${value}`).join(' ')\n\nexport const preformat: IPreformat<TNpm1Lockfile> = (idx): TNpm1Lockfile => {\n const root = idx.snapshot[\"\"].manifest as TManifest\n const deptree = Object.values(idx.tree).slice(1).map(({parents, entry}) => [...parents.slice(1), entry])\n\n debug.json('deptree-npm-1.json', deptree.map((entries: TEntry[]) => entries.map(e => e.name).join(',')))\n\n const formatNpm1LockfileEntry = (entry: TEntry): TNpm1LockfileEntry => {\n const {name, version, hashes, source} = entry\n const _entry: TNpm1LockfileDeps[string] = {\n version,\n resolved: formatResolution(source),\n integrity: formatIntegrity(hashes)\n }\n\n if (!idx.prod.has(entry)) {\n _entry.dev = true\n }\n\n if (entry.dependencies) {\n _entry.requires = entry.dependencies\n }\n\n return _entry\n }\n\n const lf: TNpm1Lockfile = {\n name: root.name,\n version: root.version,\n lockfileVersion: 1,\n requires: true,\n dependencies: {}\n }\n const nmtree = lf\n const nodes: TDepTree[] = [nmtree]\n const processEntry = (name: string, version: string, parents: TNpm1LockfileEntry[]) => {\n const entry = idx.getEntry(name, version)!\n const deps = idx.getEntryDeps(entry)\n const queue: [string, string, TNpm1LockfileEntry[]][] = []\n\n deps.forEach((e) => {\n const closestIndex = parents.findIndex((p) => p.dependencies?.[e.name])\n const closest = parents[closestIndex]\n if (closest?.dependencies?.[e.name].version === e.version) {\n return\n }\n\n const _entry = formatNpm1LockfileEntry(e)\n const _parents = [_entry, ...parents]\n const parent = closest\n ? _parents[closestIndex]\n : _parents[_parents.length - 1]\n\n if (!parent.dependencies) {\n parent.dependencies = {}\n }\n parent.dependencies[e.name] = _entry\n\n nodes.push(parent)\n queue.push([e.name, e.version, _parents])\n })\n\n queue.forEach(([name, version, parents]) => processEntry(name, version, parents))\n }\n\n deptree.forEach((chain) => {\n const entry = chain[chain.length - 1]\n const {name} = entry\n\n if (!nmtree.dependencies[name]) {\n nmtree.dependencies[name] = formatNpm1LockfileEntry(entry)\n }\n })\n Object.entries(nmtree.dependencies).forEach(([name, entry]) => processEntry(name, entry.version, [entry, nmtree] as TNpm1LockfileEntry[]))\n\n nodes.forEach((node) => {\n sortObject(node.dependencies || {})\n\n if (node.requires) {\n const snap1 = Object.entries(node.requires).map(([name, range]) => `${name}@${range}`).join('')\n const snap2 = Object.entries(node.dependencies || {}).map(([name, {version}]) => `${name}@${version}`).join('')\n\n if (snap1 === snap2) {\n delete node.requires\n }\n }\n })\n\n return lf\n}\n\nexport const format: IFormat = (snap): string =>\n JSON.stringify(preformat(analyze(snap)), null, 2)\n\nexport const parseResolution: IParseResolution = (input: string) => {\n if (input.startsWith('github:')) {\n // github:mixmaxhq/throng#8a015a378c2c0db0c760b2147b2468a1c1e86edf\n // 7 x 40\n return {\n type: 'github',\n name: input.slice(7, -41),\n id: input.slice(-40)\n }\n }\n\n const npmResolution = parseTarballUrl(input)\n if (!npmResolution) throw new TypeError(`Unsupported resolution format: ${input}`)\n\n return npmResolution\n}\n\nexport const formatResolution: IFormatResolution = (source: TResolution) => {\n const {type, name, id, registry = 'https://registry.npmjs.org'} = source\n if (type === 'github') {\n return `github:${name}#${id}`\n }\n\n return formatTarballUrl(name as string, id, registry)\n}\n", "import {\n ICheck,\n IFormat,\n IFormatResolution,\n IParseResolution,\n IPreformat,\n TEntry,\n TManifest,\n TSnapshot,\n TSource\n} from '../interface'\nimport {formatTarballUrl, parseIntegrity, formatIntegrity, parseTarballUrl} from '../common'\nimport {sortObject, debug} from '../util'\nimport {analyze, getDeps, getId} from '../analyze'\nimport semver from 'semver'\n\nexport type TNpm3LockfileEntry = {\n name?: string\n version?: string\n resolved?: string\n integrity?: string\n dev?: boolean\n link?: boolean\n dependencies?: Record<string, string>,\n engines?: Record<string, string>\n funding?: Record<string, string>\n peerDependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n bin?: any\n license?: string\n}\n\nexport type TNpm3LockfileDeps = Record<string, TNpm3LockfileEntry>\n\nexport type TNpm3Lockfile = {\n lockfileVersion: 3\n name: string\n version: string\n requires?: true\n packages: TNpm3LockfileDeps\n}\n\nexport const version = 'npm-3'\n\nexport const check: ICheck = (lockfile: string) => lockfile.includes(' \"lockfileVersion\": 3')\n\nexport const parse = (lockfile: string): TSnapshot => {\n const lf: TNpm3Lockfile = JSON.parse(lockfile)\n const snapshot = parsePackages(lf.packages)\n\n snapshot[\"\"].manifest = lf.packages[\"\"]\n\n debug.json('npm3-snapshot.json', snapshot)\n\n return snapshot\n}\n\nconst formatNmKey = (chunks: string[]) => `node_modules/` + chunks.join('/node_modules/')\n\nconst parsePackages = (packages: TNpm3LockfileDeps): any => {\n const entries: Record<string, TEntry> = {}\n const getClosestPkg = (name: string, chain: string[], entries: Record<string, TNpm3LockfileEntry>, range: string): [string, TNpm3LockfileEntry] => {\n const variants: string[] = []\n\n let s = 0\n while(s < chain.length) {\n let l = chain.length + 1\n while (l--) {\n const variant = formatNmKey([...chain.slice(s, l), name].filter(Boolean))\n const entry = entries[variant]\n\n if (entry && (!entry.version || entry.version === range || semver.satisfies(entry.version as string, range))) {\n return [variant, entry]\n }\n variants.push(variant)\n }\n s++\n }\n throw new Error(`Malformed lockfile: ${name} ${range}\\n${variants.join('\\n')}`)\n }\n\n const processPackage = (path: string, pkg: TNpm3LockfileEntry): TEntry => {\n if ((pkg.link || path === \"\") && !pkg.name){\n return processPackage(path, {\n ...pkg,\n ...packages[pkg.resolved as string]\n })\n }\n // const source: TSource = {\n // id: (pkg.resolved || '.') as string,\n // type: sourceType\n // }\n const source = parseResolution(pkg.resolved as string)\n const chain: string[] = path ? ('/' + path).split('/node_modules/').filter(Boolean) : [\"\"]\n const name = pkg.name || chain[chain.length - 1]\n const version = pkg.version as string\n const id = path === \"\" ? path : getId(name, version)\n\n if (entries[id]) {\n return entries[id]\n }\n\n entries[id] = {\n name,\n version,\n ranges: [],\n hashes: parseIntegrity(pkg.integrity),\n source,\n dependencies: pkg.dependencies,\n engines: pkg.engines,\n funding: pkg.funding,\n bin: pkg.bin,\n devDependencies: pkg.devDependencies,\n peerDependencies: pkg.peerDependencies,\n optionalDependencies: pkg.optionalDependencies,\n license: pkg.license\n }\n\n Object.entries<string>(getDeps(entries[id])).forEach(([_name, range]) => {\n const [_path, _entry] = getClosestPkg(_name, chain, packages, range)\n const {ranges} = processPackage(_path, _entry)\n\n if (!ranges.includes(range)) {\n ranges.push(range)\n ranges.sort()\n }\n })\n return entries[id]\n }\n\n Object.entries(packages).forEach(([path, entry]) =>\n (path.startsWith('node_modules/') || path === '') && processPackage(path, entry))\n\n return sortObject(entries)\n}\n\nexport const preformat: IPreformat<TNpm3Lockfile> = (idx): TNpm3Lockfile => {\n const snap = idx.snapshot\n const nmtree = Object.values(idx.tree).reduce<Record<string, {entry: TEntry, parent: string}>>((result, {key, id, chunks}) => {\n const entry = snap[id]\n if (!entry) {\n throw new Error(`Malformed snapshot: ${id}`)\n }\n\n const grandparent = chunks[1]\n const cl = chunks.length\n\n let l = 0\n while (l <= cl) {\n const [name, ...parents] = [...chunks].reverse()\n\n let i = 0\n while (i < parents.length) {\n const __key = parents.slice(i, i + l).reverse()\n const _key = [...__key, name]//\n const variant = formatNmKey(_key)\n const found = result[variant]\n if (found) {\n\n if (found.entry === entry) {\n return result\n }\n\n } else {\n const pEntry = result[formatNmKey(__key)]?.entry\n const ppEntry = idx.getEntry(idx.tree[chunks.slice(0, cl - i - l).join(',')]?.id)\n if (__key.length && pEntry !== ppEntry) {\n i++\n continue\n }\n\n result[variant] = {entry, parent: grandparent}\n return result\n }\n i++\n }\n l++\n }\n\n if (entry.source.type === 'workspace') {\n result[formatNmKey([entry.name])] = {entry, parent: ''}\n }\n\n return result\n }, {})\n\n debug.json('npm3-nmtree.json', nmtree)\n\n const manifest = snap[\"\"].manifest as TManifest\n const packages = sortObject(Object.entries(nmtree).reduce((m, [k, {entry, parent}]) => {\n if (entry.source.type === 'workspace') {\n if (entry.source.id === '.') {\n m[\"\"] = manifest as TNpm3LockfileEntry\n return m\n }\n\n m[`node_modules/${entry.name}`] = {\n resolved: entry.source.id as string,\n link: true\n }\n\n m[entry.source.id as string] = {\n name: entry.name,\n version: entry.version,\n license: entry.license,\n dependencies: entry.dependencies,\n bin: entry.bin,\n devDependencies: entry.devDependencies,\n }\n return m\n }\n\n m[k] = {\n version: entry.version,\n resolved: formatResolution(entry.source),\n integrity: formatIntegrity(entry.hashes)\n }\n if (!idx.prod.has(entry)) {\n m[k].dev = true\n }\n m[k].dependencies = entry.dependencies\n m[k].bin = entry.bin\n m[k].engines = entry.engines\n m[k].funding = entry.funding\n m[k].peerDependencies = entry.peerDependencies\n m[k].optionalDependencies = entry.optionalDependencies\n\n return m\n }, {} as TNpm3LockfileDeps)\n )\n\n return {\n name: manifest.name,\n version: manifest.version,\n lockfileVersion: 3,\n requires: true,\n packages,\n }\n}\n\nexport const format: IFormat = (snapshot: TSnapshot): string => JSON.stringify(preformat(analyze(snapshot)), null, 2)\n\nexport const parseResolution: IParseResolution = (input) => {\n if (!input?.includes('://')) {\n return {\n type: 'workspace',\n id: input || '.'\n }\n }\n\n // git+ssh://git@github.com/mixmaxhq/throng.git#8a015a378c2c0db0c760b2147b2468a1c1e86edf\n // 25 x 5 40\n if (input.startsWith('git+ssh://git@github.com/')) {\n return {\n name: input.slice(25, -45),\n id: input.slice(-40),\n type: 'github'\n }\n }\n\n const npmResolution = parseTarballUrl(input)\n if (!npmResolution) throw new TypeError(`Unsupported resolution format: ${input}`)\n\n return npmResolution\n}\n\nexport const formatResolution: IFormatResolution = ({type, id, name, registry, hash}) => {\n if (type === 'github') {\n return `git+ssh://git@github.com/${name}.git#${id}`\n }\n\n return formatTarballUrl(name as string, id, registry, hash)\n}\n", "import {ICheck, IFormat, IPreformat, TSnapshot} from '../interface'\nimport {preformat as preformatNpm1, TNpm1LockfileDeps, TNpm1Lockfile} from './npm-1'\nimport {preformat as preformatNpm3, TNpm3LockfileDeps, TNpm3Lockfile} from './npm-3'\nimport {analyze} from '../analyze'\n\nexport type TNpm2Lockfile = {\n lockfileVersion: 2\n name: string\n version: string\n requires?: true\n packages: TNpm3LockfileDeps\n dependencies: TNpm1LockfileDeps\n}\n\nexport const version = 'npm-2'\n\nexport {parse} from './npm-3'\n\nexport const check: ICheck = (lockfile: string) => lockfile.includes(' \"lockfileVersion\": 2')\n\nexport const preformat: IPreformat<TNpm2Lockfile> = (idx): TNpm2Lockfile => {\n const lfnpm1: TNpm1Lockfile = preformatNpm1(idx)\n const lfnpm3: TNpm3Lockfile = preformatNpm3(idx)\n\n return {\n name: lfnpm1.name,\n version: lfnpm1.version,\n lockfileVersion: 2,\n requires: true,\n packages: lfnpm3.packages,\n dependencies: lfnpm1.dependencies,\n }\n}\n\nexport const format: IFormat = (snapshot: TSnapshot): string => JSON.stringify(preformat(analyze(snapshot)), null, 2)\n", "import {load, dump} from 'js-yaml'\nimport {\n TDependencies,\n TSnapshot,\n TSnapshotIndex,\n ICheck,\n IFormat,\n IParse,\n IPreformat,\n TSource,\n TResolution,\n IParseResolution,\n IFormatResolution\n} from '../interface'\nimport {parseIntegrity, formatTarballUrl, parseTarballUrl} from '../common'\nimport {debug, unique} from '../util'\n\nconst kvEntryPattern = /^(\\s+)\"?([^\"]+)\"?\\s\"?([^\"]+)\"?$/\n\nexport type TYarn1Lockfile = Record<string, {\n version: string\n resolved: string\n integrity: string\n dependencies?: TDependencies\n optionalDependencies?: TDependencies\n}>\n\nexport const version = 'yarn-classic'\n\nexport const check: ICheck = (value: string): boolean => value.includes('# yarn lockfile v1')\n\nexport const preparse = (value: string): TYarn1Lockfile => {\n const lines = value.split('\\n')\n const _value = lines.map((line) => {\n if (line.startsWith('#')) {\n return ''\n }\n\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n const [,p,k,v]: string[] = line.match(kvEntryPattern) || []\n if (line.match(kvEntryPattern)) {\n return `${p}\"${k}\": \"${v}\"`\n }\n\n return line\n }, '').join('\\n')\n\n return load(_value) as TYarn1Lockfile\n}\n\nexport const parse: IParse = (value: string, pkg: string): TSnapshot => {\n const manifest = JSON.parse(pkg)\n const raw = preparse(value)\n const snapshot: TSnapshot = {}\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const { version, integrity, dependencies, optionalDependencies, resolved } = _entry\n const hashes = parseIntegrity(integrity)\n const source: TSource = parseResolution(resolved)\n const chunks = _key.split(', ')\n const names = unique(chunks.map(c => c.slice(0, c.indexOf('@', 1))))\n\n for (const name of names) {\n const ranges = chunks.filter(c => c.startsWith(`${name}@`)).map(r => r.slice(r.indexOf('@', 1) + 1)).sort()\n const key = `${name}@${version}`\n snapshot[key] = {\n name,\n version,\n ranges,\n hashes,\n dependencies,\n optionalDependencies,\n source,\n }\n }\n })\n\n snapshot[\"\"] = {\n name: manifest.name,\n version: manifest.version,\n ranges: [],\n hashes: {},\n source: {\n type: 'workspace',\n id: '.'\n },\n manifest,\n dependencies: manifest.dependencies\n }\n\n debug.json('yarn-classic-snapshot.json', snapshot)\n\n return snapshot\n}\n\n\n\nexport const preformat: IPreformat<TYarn1Lockfile> = (idx): TYarn1Lockfile => {\n const {snapshot} = idx\n const lf: TYarn1Lockfile = {}\n const rangemap: Record<string, {keys: string[], key: string, name: string}> = {}\n const keysorter = (a: string, b: string) => {\n const _a = a.includes('npm:')\n const _b = b.includes('npm:')\n return _a === _b\n ? 0\n : +_b - +_a\n }\n\n Object.values(snapshot).forEach((entry) => {\n const { name, version, ranges, hashes, dependencies, optionalDependencies, source } = entry\n const resolved = formatResolution(source)\n const alias = rangemap[resolved]\n const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n const keys = ranges.map(r => `${name}@${r}`)\n\n if (alias) {\n keys.push(...alias.keys)\n keys.sort(keysorter)\n delete lf[alias.key]\n }\n\n const key = keys.join(', ')\n\n rangemap[resolved] = {keys, key, name}\n lf[key] = {\n version,\n resolved,\n integrity,\n dependencies,\n optionalDependencies,\n }\n })\n\n delete lf[\"\"]\n\n return lf\n}\n\nexport const format: IFormat = (snapshot: TSnapshot): string => {\n const lf = preformat({snapshot} as TSnapshotIndex)\n const lines: string[] = dump(lf, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: true,\n noRefs: true,\n }).split('\\n')\n const _value = lines.map((line) => {\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n const chunks = line.slice(0, -1).replaceAll('\"', '').split(', ').map(chunk => chunk.startsWith('@') || chunk.includes(' ') || chunk.includes('npm:')? `\"${chunk}\"` : chunk)\n return `\\n${chunks.join(', ')}:`\n }\n\n if (line.startsWith(' integrity')) {\n const _line = line.replace(':', '')\n\n return line.includes('= ') // multiple hashes\n ? _line.replaceAll('\"integrity\"', 'integrity')\n : _line.replaceAll('\"', '')\n }\n\n if (line.endsWith('ependencies:')) {\n return line\n }\n\n return line.replace(':', '')\n }, '').join('\\n')\n\n return `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n\n${_value}`\n}\n\nexport const parseResolution: IParseResolution = (input: string): TResolution => {\n // https://github.com/yarnpkg/yarn/blob/master/src/resolvers/exotics/github-resolver.js\n // https://github.com/yarnpkg/yarn/blob/master/src/resolvers/exotics/git-resolver.js\n if (input.startsWith('https://codeload.github.com/')) {\n // https://codeload.github.com/mixmaxhq/throng/tar.gz/8a015a378c2c0db0c760b2147b2468a1c1e86edf\n // 28 x 8 40\n return {\n type: 'github',\n name: input.slice(28, -48),\n id: input.slice(-40)\n }\n }\n\n const npmResolution = parseTarballUrl(input)\n if (!npmResolution) throw new TypeError(`Unsupported resolution format: ${input}`)\n\n return npmResolution\n}\n\nexport const formatResolution: IFormatResolution = ({type, id, name = '', registry = 'https://registry.yarnpkg.com', hash = ''}: TResolution): string => {\n if (type === 'github') {\n return `https://codeload.github.com/${name}/tar.gz/${id}`\n }\n\n return formatTarballUrl(name, id, registry, hash)\n}\n", "// https://github.com/yarnpkg/berry/commit/2f9e8073d15745f9d53e6b8b42fa9c81eb143d54\n\nimport {load, dump} from 'js-yaml'\nimport {\n ICheck,\n IFormat,\n IParse, IParseResolution,\n IPreformat,\n TDependencies,\n TDependenciesMeta,\n TSnapshot,\n TSnapshotIndex, TSource,\n TSourceType\n} from '../interface'\nimport {parseIntegrity} from '../common'\nimport {debug, sortObject} from '../util'\n\nexport type TYarn5Lockfile = Record<string, {\n version: string\n resolution: string\n conditions?: string\n checksum: string\n languageName: string\n linkType: string\n dependencies?: TDependencies\n dependenciesMeta?: TDependenciesMeta\n optionalDependencies?: TDependencies\n peerDependencies?: TDependencies\n peerDependenciesMeta?: TDependenciesMeta\n bin?: Record<string, string>\n}>\n\nexport const version = 'yarn-berry'\n\nexport const check: ICheck = (value: string): boolean => value.includes(`\n__metadata:\n version:`)\n\nexport const parse: IParse = (lockfile: string, pkg: string): TSnapshot => {\n const manifest = JSON.parse(pkg)\n const snapshot: TSnapshot = {}\n const raw = load(lockfile) as TYarn5Lockfile\n\n delete raw.__metadata\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const { version, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution, bin, conditions } = _entry\n const chunks = _key.split(', ')\n const name = _key.slice(0, _key.indexOf('@', 1))\n const key = `${name}@${version}`\n\n // seems like a patch\n if (_key.includes('#')) {\n snapshot[key].patch = {\n resolution,\n refs: chunks,\n checksum\n }\n return\n }\n\n const ranges = chunks.map(c => c.slice(name.length + 1)).sort()\n const hashes = parseIntegrity(checksum)\n const source = parseResolution(resolution)\n\n snapshot[key] = {\n name,\n version,\n ranges,\n hashes,\n source,\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n bin,\n conditions,\n }\n\n if (source.type === 'workspace') {}\n })\n\n snapshot[\"\"] = {\n name: manifest.name,\n version: manifest.version,\n ranges: [],\n hashes: {},\n source: {\n type: 'workspace',\n id: '.'\n },\n manifest,\n dependencies: manifest.dependencies,\n devDependencies: manifest.devDependencies\n }\n\n debug.json('yarn-berry-snapshot.json', snapshot)\n return snapshot\n}\n\nexport const preformat: IPreformat<TYarn5Lockfile> = (idx): TYarn5Lockfile => {\n const {snapshot} = idx\n const lf: TYarn5Lockfile = {}\n\n Object.values(snapshot).forEach((entry) => {\n const { name, version, ranges, hashes: {checksum}, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, patch, bin, conditions } = entry\n const isLocal = version === '0.0.0-use.local'\n const languageName = isLocal ? 'unknown' : 'node'\n const linkType = isLocal ? 'soft' : 'hard'\n // const key = ranges.map(r => formatResolution(name, r, source.type === 'workspace' ? ((r === '.' || r.includes('/')) ? 'workspace' : 'semver'): 'npm')).join(', ')\n const key = ranges.map(r => `${name}@${r}`).join(', ')\n\n lf[key] = {\n version,\n resolution: formatResolution(source),\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n bin,\n checksum: checksum as string,\n conditions,\n languageName,\n linkType,\n }\n\n if (patch) {\n lf[patch.refs.join(', ')] = {\n ...lf[key],\n resolution: patch.resolution,\n checksum: patch.checksum,\n }\n }\n })\n\n delete lf[\"\"]\n\n return sortObject(lf)\n}\n\nexport const format: IFormat = (snapshot: TSnapshot, {__metadata = {\n version: 5,\n cacheKey: 8,\n}} = {}): string => {\n const lines = dump({\n __metadata,\n ...preformat({snapshot} as TSnapshotIndex)\n }, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: false,\n noRefs: true\n })\n .split('\\n')\n .map(line => {\n if (line === '__metadata:') {\n return `\\n${line}`\n }\n\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\\n\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n if (line.startsWith(' resolution: ')) {\n return line.replaceAll('\"', '').replace(' resolution: ', ' resolution: \"').concat('\"')\n }\n\n return line\n })\n\n const _value = lines.join('\\n')\n\n return `# This file is generated by running \"yarn install\" inside your project.\n# Manual changes might be lost - proceed with caution!\n${_value}`\n}\n\nexport const parseResolution: IParseResolution = (input: string) => {\n const colonPos = input.indexOf(':')\n const atPos = input.indexOf('@', 1)\n const name = input.slice(0, atPos)\n\n if (colonPos === -1) {\n return {\n name,\n id: input.slice(atPos + 1),\n type: 'npm'\n }\n }\n\n // throng@https://github.com/mixmaxhq/throng.git#commit=8a015a378c2c0db0c760b2147b2468a1c1e86edf\n // x 18 y 12 40\n if (input.includes('https://github.com')) {\n return {\n type: 'github',\n name: input.slice(atPos + 20, -52),\n id: input.slice(-40),\n alias: input.slice(0, input.indexOf('@', 1))\n }\n }\n\n return {\n name,\n id: input.slice(colonPos + 1),\n type: input.slice(atPos + 1, colonPos) as TSourceType\n }\n}\n\nexport const formatResolution = ({name, id, type = 'npm', alias = name, hash}: TSource): string => {\n // https://github.com/yarnpkg/berry/blob/a8ea92828badb4b6a1edddae18b0a163b0c4d2c5/packages/plugin-github/sources/GithubFetcher.ts\n if (type === 'github') {\n return `${alias}@https://github.com/${name}.git#commit=${id}`\n }\n return `${name}@${type === 'semver' ? '' : type + ':'}${id}`\n}", "import {parse as parseNpm1, check as checkNpm1} from './formats/npm-1'\nimport {parse as parseNpm2, check as checkNpm2} from './formats/npm-2'\nimport {parse as parseNpm3, check as checkNpm3} from './formats/npm-3'\nimport {parse as parseYarnClassic, check as checkYarnClassic} from './formats/yarn-classic'\nimport {parse as parseYarnBerry, check as checkYarnBerry} from './formats/yarn-berry'\nimport {ICheck, IParse, TSnapshot} from './interface'\n\nconst isPkgJson = (input: string) => input.startsWith('{') && input.includes('\"name\":')\nconst variants: [ICheck, IParse][] = [\n [checkNpm1, parseNpm1],\n [checkNpm2, parseNpm2],\n [checkNpm3, parseNpm3],\n [checkYarnClassic, parseYarnClassic],\n [checkYarnBerry, parseYarnBerry],\n]\nexport const parse = (lockfile: string, ...pkgJsons: string[]): TSnapshot => {\n const [,parser] = variants.find(([check]) => check(lockfile)) || []\n\n if (!parser) {\n throw new TypeError('Unsupported lockfile format')\n }\n\n if (!pkgJsons.every(isPkgJson)) {\n throw new TypeError('Invalid package json')\n }\n\n return parser(lockfile, ...pkgJsons)\n}\n", "import {IFormat, IFormatOpts, TSnapshot} from './interface'\n\nimport {version as versionNpm1, format as formatNpm1} from './formats/npm-1'\nimport {version as versionNpm2, format as formatNpm2} from './formats/npm-2'\nimport {version as versionNpm3, format as formatNpm3} from './formats/npm-3'\nimport {version as versionYarnClassic, format as formatYarnClassic} from './formats/yarn-classic'\nimport {version as versionYarnBerry, format as formatYarnBerry} from './formats/yarn-berry'\n\nconst variants: [string, IFormat][] = [\n [versionNpm1, formatNpm1],\n [versionNpm2, formatNpm2],\n [versionNpm3, formatNpm3],\n [versionYarnClassic, formatYarnClassic],\n [versionYarnBerry, formatYarnBerry],\n]\n\nexport const format = (snapshot: TSnapshot, version: string, opts?: IFormatOpts): string => {\n const [,formatter] = variants.find(([_version]) => version === _version) || []\n\n if (!formatter) {\n throw new TypeError(`Unsupported lockfile format: ${version}`)\n }\n\n return formatter(snapshot, opts)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["version", "version", "deps", "version", "name", "formatIntegrity", "parents", "semver", "version", "check", "parse", "entries", "variants", "path", "parseResolution", "preformat", "formatResolution", "format", "version", "check", "preformat", "format", "version", "check", "parse", "value", "parseResolution", "preformat", "formatResolution", "format", "load", "dump", "version", "check", "parse", "load", "parseResolution", "preformat", "formatResolution", "format", "dump", "check", "parse", "variants", "version", "format"]
|
|
7
7
|
}
|
|
@@ -9,11 +9,18 @@ export interface THashes {
|
|
|
9
9
|
checksum?: string;
|
|
10
10
|
md5?: string;
|
|
11
11
|
}
|
|
12
|
-
export type TSourceType = 'npm' | '
|
|
12
|
+
export type TSourceType = 'npm' | 'github' | 'file' | 'workspace' | 'semver' | 'patch';
|
|
13
13
|
export interface TSource {
|
|
14
14
|
type: TSourceType;
|
|
15
15
|
id: string;
|
|
16
16
|
registry?: string;
|
|
17
|
+
name?: string;
|
|
18
|
+
hash?: string;
|
|
19
|
+
alias?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface TResolution extends TSource {
|
|
22
|
+
name?: string;
|
|
23
|
+
hash?: string;
|
|
17
24
|
}
|
|
18
25
|
export interface TEntry {
|
|
19
26
|
name: string;
|
|
@@ -77,3 +84,5 @@ export type IFormatOpts = {
|
|
|
77
84
|
export type IFormat = (snapshot: TSnapshot, opts?: IFormatOpts) => string;
|
|
78
85
|
export type IPreformat<T> = (idx: TSnapshotIndex) => T;
|
|
79
86
|
export type ICheck = (input: string) => boolean;
|
|
87
|
+
export type IParseResolution = (input: string) => TResolution;
|
|
88
|
+
export type IFormatResolution = (resolution: TResolution) => string;
|
package/target/es6/util.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export declare const sortObject: <T extends Record<string, any>>(unordered: T, predicate?: (a: [string, any], b: [string, any]) => number) => T;
|
|
2
2
|
export declare const flushObject: (obj: Record<string, any>) => Record<string, any>;
|
|
3
3
|
export declare const loadContents: (value: string) => Promise<string>;
|
|
4
|
-
export declare const debug: ((
|
|
4
|
+
export declare const debug: ((...chunks: any[]) => void) & {
|
|
5
5
|
enable: string | undefined;
|
|
6
6
|
json(data: any, name?: any, base?: string): void;
|
|
7
7
|
};
|
|
8
|
+
export declare const unique: (arr: string[]) => string[];
|