@antongolub/lockfile 0.0.0-snapshot.13 → 0.0.0-snapshot.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -60,9 +60,9 @@ idx.edges
60
60
  ```
61
61
 
62
62
  ### Terms
63
- * `nmtree` — fs projection of deps, directories structure
64
- * `deptree` — bounds full dep paths with their resolved packages
65
- * `depgraph` — describes how resolved pkgs are related with each other
63
+ `nmtree` — fs projection of deps, directories structure
64
+ `deptree` — bounds full dep paths with their resolved packages
65
+ `depgraph` — describes how resolved pkgs are related with each other
66
66
 
67
67
  ### Lockfiles types
68
68
  | Package manager | Meta format | Read | Write |
@@ -73,7 +73,7 @@ idx.edges
73
73
  | yarn 1 (classic) | 1 | ✓ | ✓ |
74
74
  | yarn 2, 3, 4 (berry) | 5, 6, 7 | ✓ | ✓ |
75
75
 
76
- ### Protocols
76
+ ### Dependency protocols
77
77
  | Type | Supported | Example | Description |
78
78
  |-----------|-----------|-----------------------------------------|----------------------------------------------------------------|
79
79
  | semver | ✓ | `^1.2.3` | Resolves from the default registry |
@@ -88,8 +88,9 @@ idx.edges
88
88
  | portal | | `portal:./my-folder` | Creates a link to the ./my-folder folder (follow dependencies) |
89
89
  | workspace | _limited_ | `workspace:*` | Creates a link to a package in another workspace |
90
90
 
91
- https://v3.yarnpkg.com/features/protocols
92
- https://yarnpkg.com/protocols
91
+ https://v3.yarnpkg.com/features/protocols
92
+ https://yarnpkg.com/protocols
93
+ https://docs.npmjs.com/cli/v10/configuring-npm/package-json#dependencies
93
94
 
94
95
  ### `TSnapshot`
95
96
  ```ts
@@ -107,8 +108,8 @@ export type TEntry = {
107
108
  md5?: string
108
109
  }
109
110
  source: {
110
- type: TSourceType // npm, workspace, gh, patch, etc
111
- id: string
111
+ type: TSourceType // npm, workspace, gh, patch, etc
112
+ id: string
112
113
  registry?: string
113
114
  }
114
115
  // optional pm-specific lockfile meta
@@ -123,7 +124,7 @@ export type TEntry = {
123
124
  bin?: Record<string, string>
124
125
  engines?: Record<string, string>
125
126
  funding?: Record<string, string>
126
- }>
127
+ }
127
128
  ```
128
129
 
129
130
  ### `TSnapshotIndex`
@@ -156,7 +157,7 @@ export interface TSnapshotIndex {
156
157
  * yarn berry: no idea how to resolve and inject PnP patches https://github.com/yarnpkg/berry/tree/master/packages/plugin-compat
157
158
  * npm2 and npm3 requires `engines` and `funding` data, while yarn* or npm1 does not contain it
158
159
  * many `nmtree` projections may correspond to the specified `depgraph`
159
- * pkg.json `resolutions` directive is completely ignored for now
160
+ * pkg.json `resolutions` and `overrides` directives are completely ignored for now
160
161
  * pkg aliases are not supported yet [#2](https://github.com/antongolub/lockfile/issues/2#issuecomment-1786613893)
161
162
 
162
163
  ### Inspired by
@@ -172,5 +173,5 @@ export interface TSnapshotIndex {
172
173
  * [the-ultimate-guide-to-yarn-lock-lockfiles](https://www.arahansen.com/the-ultimate-guide-to-yarn-lock-lockfiles/)
173
174
  * [package-lock-json-the-complete-guide](https://medium.com/helpshift-engineering/package-lock-json-the-complete-guide-2ae40175ebdd)
174
175
 
175
- ### License
176
+ ## License
176
177
  [MIT](./LICENSE)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antongolub/lockfile",
3
- "version": "0.0.0-snapshot.13",
3
+ "version": "0.0.0-snapshot.15",
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.5",
18
- "@types/node": "^20.6.0",
19
- "@types/semver": "^7.5.1",
20
- "esbuild": "^0.19.2",
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",
@@ -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 type IReferenceDeclaration = {
5
+ export interface IReference {
7
6
  protocol: string;
8
- raw: string;
9
- version: string | null;
7
+ id: string;
8
+ name?: string;
9
+ host?: string;
10
10
  [extra: string]: any;
11
- };
12
- export declare const parseReference: (raw?: any) => IReferenceDeclaration;
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-1";
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;
@@ -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(function(...chunks) {
41
- if (!this.enable)
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
- console.log("analyze duration=", Date.now() - now, "deptree size=", Object.keys(tree).length);
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: formatTarballUrl(name, version6),
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
- const sourceType = pkg.link || path2 === "" ? "workspace" : "semver";
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: formatTarballUrl(entry.name, entry.version),
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-1";
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
- type: "npm",
520
- id: resolved
521
- };
522
- snapshot[key] = {
523
- name,
524
- version: version6,
525
- ranges,
526
- hashes,
527
- dependencies,
528
- optionalDependencies,
529
- source
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 key = ranges.map((r) => `${name}@${r}`).join(", ");
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: source.id,
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 refs = chunks.map(parseResolution);
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 = refs.map((r) => r.sourceId).sort();
707
+ const ranges = chunks.map((c) => c.slice(name.length + 1)).sort();
639
708
  const hashes = parseIntegrity(checksum);
640
- const { sourceType, sourceId } = parseResolution(resolution);
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 (sourceType === "workspace") {
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) => formatResolution(name, r, source.type === "workspace" ? r === "." || r.includes("/") ? "workspace" : "semver" : "npm")).join(", ");
751
+ const key = ranges.map((r) => `${name}@${r}`).join(", ");
687
752
  lf[key] = {
688
753
  version: version6,
689
- resolution: formatResolution(name, source.id, source.type),
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":');
@@ -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' | 'gh' | 'file' | 'workspace' | 'semver' | 'patch';
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;
@@ -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: ((this: any, ...chunks: any[]) => void) & {
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[];