@antongolub/lockfile 0.0.0-snapshot.40 → 0.0.0-snapshot.42

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
@@ -165,6 +165,7 @@ export interface TSnapshotIndex {
165
165
  name: string
166
166
  version: string
167
167
  entry: TEntry
168
+ depth: number // the lowest level where the dep@ver first time occurs
168
169
  }>
169
170
  prod: Set<TEntry>
170
171
  getEntryId ({name, version}: TEntry): string
@@ -183,6 +184,36 @@ export interface TSnapshotIndex {
183
184
  * pkg.json `resolutions` and `overrides` directives are completely ignored for now
184
185
  * pkg aliases are not _fully_ supported yet [#2](https://github.com/antongolub/lockfile/issues/2#issuecomment-1786613893)
185
186
 
187
+ ### Snippets
188
+ Extracts all deps by depth:
189
+ ```ts
190
+ const getDepsByDepth = (idx: TSnapshotIndex, depth = 0) => Object.values(idx.tree)
191
+ .filter(({depth: d}) => d === depth)
192
+ .map(({entry}) => entry)
193
+ ```
194
+
195
+ Get the longest dep chain:
196
+ ```ts
197
+ const getLongestChain = (): TEntry[] => {
198
+ let max = 0
199
+ let chain: TEntry[] = []
200
+
201
+ for (const e of Object.values(idx.tree)) {
202
+ if (e.depth > max) {
203
+ max = e.depth
204
+ chain = [...e.parents, e.entry]
205
+ }
206
+ }
207
+ return chain
208
+ }
209
+
210
+ constole.log(
211
+ getLongestChain()
212
+ .map((e) => idx.getEntryId(e))
213
+ .join(' -> ')
214
+ )
215
+ ```
216
+
186
217
  ### Inspired by
187
218
  * [synp](https://github.com/imsnif/synp)
188
219
  * [snyk-nodejs-lockfile-parser](https://github.com/snyk/nodejs-lockfile-parser)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antongolub/lockfile",
3
- "version": "0.0.0-snapshot.40",
3
+ "version": "0.0.0-snapshot.42",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -49,9 +49,9 @@
49
49
  },
50
50
  "scripts": {
51
51
  "build": "concurrently 'npm:build:*'",
52
- "build:bin": "node ./src/scripts/build.mjs --entry='./src/main/ts/cli.ts' --no-bundle",
53
- "build:esm": "node ./src/scripts/build.mjs --entry='./src/main/ts/index.ts'",
54
- "build:cjs": "yarn run build:esm -- --cjs",
52
+ "build:bin": "node ./src/scripts/build.mjs --entry='./src/main/ts/cli.ts' --bundle=none",
53
+ "build:vendor": "node ./src/scripts/build.mjs --entry='./src/main/ts/vendor.ts' --bundle=all --format='cjs,esm'",
54
+ "build:index": "node ./src/scripts/build.mjs --entry='./src/main/ts/index.ts' --bundle=src --format='cjs,esm' --external='./src/main/ts/vendor,node:*' --map='../../src/main/ts/vendor:./vendor,../src/main/ts/vendor:./vendor'",
55
55
  "build:dts": "tsc --emitDeclarationOnly --skipLibCheck --outDir target/dts",
56
56
  "test": "yarn test:unit",
57
57
  "test:unit": "c8 -r lcov -r text -o target/coverage -x src/scripts -x src/test uvu -r tsm -i helpers 'src/test/ts/'",
@@ -187,6 +187,12 @@ var debug = Object.assign((...chunks) => {
187
187
  });
188
188
  }
189
189
  });
190
+ var mergeDeps = (...deps) => {
191
+ const _deps = deps.filter(Boolean);
192
+ if (!_deps.length)
193
+ return;
194
+ return Object.assign({}, ..._deps);
195
+ };
190
196
  var unique = (arr) => [...new Set(arr)];
191
197
 
192
198
  // src/main/ts/analyze.ts
@@ -213,7 +219,8 @@ var walk = (ctx) => {
213
219
  name: entry.name,
214
220
  version: entry.version,
215
221
  entry,
216
- parents
222
+ parents,
223
+ depth
217
224
  };
218
225
  if ((_a = root.dependencies) == null ? void 0 : _a[chunks[1]]) {
219
226
  idx.prod.add(entry);
@@ -676,7 +683,7 @@ var preformat3 = (idx) => {
676
683
  var format3 = (snapshot) => JSON.stringify(preformat3(analyze(snapshot)), null, 2);
677
684
 
678
685
  // src/main/ts/formats/yarn-classic.ts
679
- var import_js_yaml = require("js-yaml");
686
+ var import_vendor = require("./vendor.cjs");
680
687
  var kvEntryPattern = /^(\s+)"?([^"]+)"?\s"?([^"]+)"?$/;
681
688
  var version4 = "yarn-classic";
682
689
  var check4 = (value) => value.includes("# yarn lockfile v1");
@@ -695,28 +702,37 @@ var preparse = (value) => {
695
702
  }
696
703
  return line;
697
704
  }, "").join("\n");
698
- return (0, import_js_yaml.load)(_value);
705
+ return (0, import_vendor.yamlLoad)(_value);
699
706
  };
700
- var parse3 = (value, pkg) => {
701
- const manifest = JSON.parse(pkg);
707
+ var parse3 = (value, ...pkgs) => {
708
+ const manifest = JSON.parse(pkgs[0]);
709
+ const manifests = Object.fromEntries(pkgs.map((p) => {
710
+ const manifest2 = JSON.parse(p);
711
+ return [manifest2.name, manifest2];
712
+ }));
702
713
  const raw = preparse(value);
703
714
  const snapshot = {};
704
715
  Object.entries(raw).forEach((value2) => {
716
+ var _a, _b;
705
717
  const [_key, _entry] = value2;
706
718
  const { version: version6, integrity, dependencies, optionalDependencies, resolved } = _entry;
707
719
  const hashes = parseIntegrity(integrity);
708
720
  const source = parseResolution3(resolved);
709
721
  const chunks = _key.split(", ");
710
722
  const names = unique(chunks.map((c) => c.slice(0, c.indexOf("@", 1))));
723
+ const isLocal = version6 === "0.0.0-use.local";
711
724
  for (const name of names) {
712
725
  const ranges = chunks.filter((c) => c.startsWith(`${name}@`)).map((r) => r.slice(r.indexOf("@", 1) + 1)).sort();
713
726
  const key = `${name}@${version6}`;
727
+ const _dependencies = isLocal && ((_a = manifests[name]) == null ? void 0 : _a.dependencies) || dependencies;
728
+ const _devDependencies = isLocal && ((_b = manifests[name]) == null ? void 0 : _b.devDependencies);
714
729
  snapshot[key] = {
715
730
  name,
716
731
  version: version6,
717
732
  ranges,
718
733
  hashes,
719
- dependencies,
734
+ dependencies: _dependencies,
735
+ devDependencies: _devDependencies,
720
736
  optionalDependencies,
721
737
  source
722
738
  };
@@ -744,7 +760,7 @@ var preformat4 = (idx) => {
744
760
  const lf = {};
745
761
  const rangemap = {};
746
762
  Object.values(snapshot).forEach((entry) => {
747
- const { name, version: version6, ranges, hashes, dependencies, optionalDependencies, source } = entry;
763
+ const { name, version: version6, ranges, hashes, devDependencies, dependencies, optionalDependencies, source } = entry;
748
764
  const resolved = formatResolution3(source);
749
765
  const alias = rangemap[resolved];
750
766
  const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(" ");
@@ -755,12 +771,15 @@ var preformat4 = (idx) => {
755
771
  delete lf[alias.key];
756
772
  }
757
773
  const key = keys.join(", ");
774
+ const _dependencies = mergeDeps(dependencies, devDependencies);
775
+ if (_dependencies)
776
+ sortObject(_dependencies);
758
777
  rangemap[resolved] = { keys, key, name };
759
778
  lf[key] = {
760
779
  version: version6,
761
780
  resolved,
762
781
  integrity,
763
- dependencies,
782
+ dependencies: _dependencies,
764
783
  optionalDependencies
765
784
  };
766
785
  });
@@ -769,7 +788,7 @@ var preformat4 = (idx) => {
769
788
  };
770
789
  var format4 = (snapshot) => {
771
790
  const lf = preformat4({ snapshot });
772
- const lines = (0, import_js_yaml.dump)(lf, {
791
+ const lines = (0, import_vendor.yamlDump)(lf, {
773
792
  quotingType: '"',
774
793
  flowLevel: -1,
775
794
  lineWidth: -1,
@@ -817,21 +836,29 @@ var formatResolution3 = ({ type, id, name = "", registry = "https://registry.yar
817
836
  };
818
837
 
819
838
  // src/main/ts/formats/yarn-berry.ts
820
- var import_js_yaml2 = require("js-yaml");
839
+ var import_vendor2 = require("./vendor.cjs");
821
840
  var version5 = "yarn-berry";
822
841
  var check5 = (value) => value.includes(`
823
842
  __metadata:
824
843
  version:`);
825
- var parse4 = (lockfile, pkg) => {
826
- const manifest = JSON.parse(pkg);
844
+ var parse4 = (lockfile, ...pkgs) => {
845
+ const manifest = JSON.parse(pkgs[0]);
846
+ const manifests = Object.fromEntries(pkgs.map((p) => {
847
+ const manifest2 = JSON.parse(p);
848
+ return [manifest2.name, manifest2];
849
+ }));
827
850
  const snapshot = {};
828
- const raw = (0, import_js_yaml2.load)(lockfile);
851
+ const raw = (0, import_vendor2.yamlLoad)(lockfile);
829
852
  delete raw.__metadata;
830
853
  Object.entries(raw).forEach((value) => {
854
+ var _a, _b;
831
855
  const [_key, _entry] = value;
832
856
  const { version: version6, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution, bin, conditions } = _entry;
833
857
  const chunks = _key.split(", ");
834
858
  const names = unique(chunks.map((c) => c.slice(0, c.indexOf("@", 1))));
859
+ const isLocal = version6 === "0.0.0-use.local";
860
+ const hashes = parseIntegrity(checksum);
861
+ const source = parseResolution4(resolution);
835
862
  for (const name of names) {
836
863
  const key = `${name}@${version6}`;
837
864
  if (_key.includes("#")) {
@@ -843,15 +870,16 @@ var parse4 = (lockfile, pkg) => {
843
870
  return;
844
871
  }
845
872
  const ranges = chunks.filter((c) => c.startsWith(`${name}@`)).map((r) => r.slice(r.indexOf("@", 1) + 1)).map(normalizeReference);
846
- const hashes = parseIntegrity(checksum);
847
- const source = parseResolution4(resolution);
873
+ const _dependencies = normalizeDeps(isLocal && ((_a = manifests[name]) == null ? void 0 : _a.dependencies) || dependencies);
874
+ const _devDependencies = normalizeDeps(isLocal && ((_b = manifests[name]) == null ? void 0 : _b.devDependencies));
848
875
  snapshot[key] = {
849
876
  name,
850
877
  version: version6,
851
878
  ranges,
852
879
  hashes,
853
880
  source,
854
- dependencies: normalizeDeps(dependencies),
881
+ dependencies: _dependencies,
882
+ devDependencies: _devDependencies,
855
883
  dependenciesMeta,
856
884
  optionalDependencies: normalizeDeps(optionalDependencies),
857
885
  peerDependencies: normalizeDeps(peerDependencies),
@@ -880,12 +908,13 @@ var parse4 = (lockfile, pkg) => {
880
908
  debug.json("yarn-berry-snapshot.json", snapshot);
881
909
  return snapshot;
882
910
  };
883
- var preformat5 = (idx) => {
911
+ var preformat5 = (idx, { __metadata } = {}) => {
884
912
  const { snapshot } = idx;
885
913
  const lf = {};
886
914
  const rangemap = {};
915
+ const isYarn4 = (__metadata == null ? void 0 : __metadata.version) >= 7;
887
916
  Object.values(snapshot).forEach((entry) => {
888
- const { name, version: version6, ranges, hashes: { checksum }, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, patch, bin, conditions } = entry;
917
+ const { name, version: version6, ranges, hashes: { checksum }, devDependencies, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, patch, bin, conditions } = entry;
889
918
  const resolution = formatResolution4(source);
890
919
  const alias = rangemap[resolution];
891
920
  const isLocal = version6 === "0.0.0-use.local";
@@ -898,11 +927,14 @@ var preformat5 = (idx) => {
898
927
  delete lf[alias.key];
899
928
  }
900
929
  const key = keys.join(", ");
930
+ const _dependencies = mergeDeps(dependencies, devDependencies);
931
+ if (_dependencies)
932
+ sortObject(_dependencies);
901
933
  rangemap[resolution] = { keys, key, name };
902
934
  lf[key] = {
903
935
  version: version6,
904
936
  resolution,
905
- dependencies: formatDeps(dependencies),
937
+ dependencies: formatDeps(_dependencies, { semverAsNpm: isYarn4, isLocal: !isLocal }),
906
938
  optionalDependencies: formatDeps(optionalDependencies),
907
939
  peerDependencies: formatDeps(peerDependencies),
908
940
  dependenciesMeta,
@@ -927,9 +959,9 @@ var format5 = (snapshot, { __metadata = {
927
959
  version: 5,
928
960
  cacheKey: 8
929
961
  } } = {}) => {
930
- const lines = (0, import_js_yaml2.dump)(__spreadValues({
962
+ const lines = (0, import_vendor2.yamlDump)(__spreadValues({
931
963
  __metadata
932
- }, preformat5({ snapshot })), {
964
+ }, preformat5({ snapshot }, { __metadata })), {
933
965
  quotingType: '"',
934
966
  flowLevel: -1,
935
967
  lineWidth: -1,