@antongolub/lockfile 0.0.0-snapshot.39 → 0.0.0-snapshot.41

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
@@ -3,7 +3,7 @@
3
3
 
4
4
  <p><img alt="@antongolub/lockfile" src="./pics/pic.png" align="right" width="300">
5
5
  Each package manager brings its own philosophy of how to describe, store and control project dependencies.
6
- It _seems_ acceptable for developers, but literally becomes a ~~pain in *** ***~~ headache for isec, devops and release engineers.
6
+ It <i>seems</i> acceptable for developers, but literally becomes a <strike>pain in *** ***</strike> headache for isec, devops and release engineers.
7
7
  This lib is a naive attempt to build a pm-independent, generic, extensible and reliable deps representation.
8
8
 
9
9
  The `package.json` manifest contains its own deps requirements, the `lockfile` holds the deps resolution snapshot<sup>*</sup>,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antongolub/lockfile",
3
- "version": "0.0.0-snapshot.39",
3
+ "version": "0.0.0-snapshot.41",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -54,7 +54,8 @@
54
54
  "build:cjs": "yarn run build:esm -- --cjs",
55
55
  "build:dts": "tsc --emitDeclarationOnly --skipLibCheck --outDir target/dts",
56
56
  "test": "yarn test:unit",
57
- "test:unit": "DEBUG=true c8 -r lcov -r text -o target/coverage -x src/scripts -x src/test uvu -r tsm -i helpers 'src/test/ts/'",
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/'",
58
+ "test:debug": "DEBUG=true TEMP=temp yarn run test:unit",
58
59
  "publish:snap": "yarn build && npm publish --no-git-tag-version --tag snapshot"
59
60
  },
60
61
  "files": [
@@ -81,5 +82,5 @@
81
82
  "url": "https://github.com/antongolub/lockfile/issues"
82
83
  },
83
84
  "homepage": "https://github.com/antongolub/lockfile#readme",
84
- "packageManager": "yarn@3.1.1"
85
+ "packageManager": "yarn@4.0.1"
85
86
  }
@@ -166,17 +166,33 @@ var debug = Object.assign((...chunks) => {
166
166
  console.log(...chunks);
167
167
  }, {
168
168
  enable: process.env.DEBUG,
169
- json(data, name = `debug-${Math.random().toString(16).slice(2)}.json`, base = import_node_path.default.resolve(process.cwd(), "temp")) {
170
- if (!this.enable)
171
- return;
172
- if (typeof data === "string") {
173
- this.json(name, data);
174
- return;
175
- }
176
- const _data = typeof data === "function" ? data() : data;
177
- import_promises2.default.writeFile(import_node_path.default.resolve(base, name), JSON.stringify(_data, null, 2));
169
+ json(_0) {
170
+ return __async(this, arguments, function* (data, name = `debug-${Math.random().toString(16).slice(2)}.json`, base) {
171
+ if (!this.enable)
172
+ return;
173
+ if (typeof data === "string") {
174
+ yield this.json(name, data);
175
+ return;
176
+ }
177
+ const _data = typeof data === "function" ? data() : data;
178
+ const _base = base || (yield this.tempy());
179
+ yield import_promises2.default.writeFile(import_node_path.default.resolve(_base, name), JSON.stringify(_data, null, 2));
180
+ });
181
+ },
182
+ tempy() {
183
+ return __async(this, null, function* () {
184
+ const temp = import_node_path.default.resolve(process.cwd(), process.env.TEMP || "temp");
185
+ yield import_promises2.default.mkdir(temp, { recursive: true });
186
+ return temp;
187
+ });
178
188
  }
179
189
  });
190
+ var mergeDeps = (...deps) => {
191
+ const _deps = deps.filter(Boolean);
192
+ if (!_deps.length)
193
+ return;
194
+ return Object.assign({}, ..._deps);
195
+ };
180
196
  var unique = (arr) => [...new Set(arr)];
181
197
 
182
198
  // src/main/ts/analyze.ts
@@ -687,26 +703,35 @@ var preparse = (value) => {
687
703
  }, "").join("\n");
688
704
  return (0, import_js_yaml.load)(_value);
689
705
  };
690
- var parse3 = (value, pkg) => {
691
- const manifest = JSON.parse(pkg);
706
+ var parse3 = (value, ...pkgs) => {
707
+ const manifest = JSON.parse(pkgs[0]);
708
+ const manifests = Object.fromEntries(pkgs.map((p) => {
709
+ const manifest2 = JSON.parse(p);
710
+ return [manifest2.name, manifest2];
711
+ }));
692
712
  const raw = preparse(value);
693
713
  const snapshot = {};
694
714
  Object.entries(raw).forEach((value2) => {
715
+ var _a, _b;
695
716
  const [_key, _entry] = value2;
696
717
  const { version: version6, integrity, dependencies, optionalDependencies, resolved } = _entry;
697
718
  const hashes = parseIntegrity(integrity);
698
719
  const source = parseResolution3(resolved);
699
720
  const chunks = _key.split(", ");
700
721
  const names = unique(chunks.map((c) => c.slice(0, c.indexOf("@", 1))));
722
+ const isLocal = version6 === "0.0.0-use.local";
701
723
  for (const name of names) {
702
724
  const ranges = chunks.filter((c) => c.startsWith(`${name}@`)).map((r) => r.slice(r.indexOf("@", 1) + 1)).sort();
703
725
  const key = `${name}@${version6}`;
726
+ const _dependencies = isLocal && ((_a = manifests[name]) == null ? void 0 : _a.dependencies) || dependencies;
727
+ const _devDependencies = isLocal && ((_b = manifests[name]) == null ? void 0 : _b.devDependencies);
704
728
  snapshot[key] = {
705
729
  name,
706
730
  version: version6,
707
731
  ranges,
708
732
  hashes,
709
- dependencies,
733
+ dependencies: _dependencies,
734
+ devDependencies: _devDependencies,
710
735
  optionalDependencies,
711
736
  source
712
737
  };
@@ -734,7 +759,7 @@ var preformat4 = (idx) => {
734
759
  const lf = {};
735
760
  const rangemap = {};
736
761
  Object.values(snapshot).forEach((entry) => {
737
- const { name, version: version6, ranges, hashes, dependencies, optionalDependencies, source } = entry;
762
+ const { name, version: version6, ranges, hashes, devDependencies, dependencies, optionalDependencies, source } = entry;
738
763
  const resolved = formatResolution3(source);
739
764
  const alias = rangemap[resolved];
740
765
  const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(" ");
@@ -745,12 +770,15 @@ var preformat4 = (idx) => {
745
770
  delete lf[alias.key];
746
771
  }
747
772
  const key = keys.join(", ");
773
+ const _dependencies = mergeDeps(dependencies, devDependencies);
774
+ if (_dependencies)
775
+ sortObject(_dependencies);
748
776
  rangemap[resolved] = { keys, key, name };
749
777
  lf[key] = {
750
778
  version: version6,
751
779
  resolved,
752
780
  integrity,
753
- dependencies,
781
+ dependencies: _dependencies,
754
782
  optionalDependencies
755
783
  };
756
784
  });
@@ -812,16 +840,24 @@ var version5 = "yarn-berry";
812
840
  var check5 = (value) => value.includes(`
813
841
  __metadata:
814
842
  version:`);
815
- var parse4 = (lockfile, pkg) => {
816
- const manifest = JSON.parse(pkg);
843
+ var parse4 = (lockfile, ...pkgs) => {
844
+ const manifest = JSON.parse(pkgs[0]);
845
+ const manifests = Object.fromEntries(pkgs.map((p) => {
846
+ const manifest2 = JSON.parse(p);
847
+ return [manifest2.name, manifest2];
848
+ }));
817
849
  const snapshot = {};
818
850
  const raw = (0, import_js_yaml2.load)(lockfile);
819
851
  delete raw.__metadata;
820
852
  Object.entries(raw).forEach((value) => {
853
+ var _a, _b;
821
854
  const [_key, _entry] = value;
822
855
  const { version: version6, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution, bin, conditions } = _entry;
823
856
  const chunks = _key.split(", ");
824
857
  const names = unique(chunks.map((c) => c.slice(0, c.indexOf("@", 1))));
858
+ const isLocal = version6 === "0.0.0-use.local";
859
+ const hashes = parseIntegrity(checksum);
860
+ const source = parseResolution4(resolution);
825
861
  for (const name of names) {
826
862
  const key = `${name}@${version6}`;
827
863
  if (_key.includes("#")) {
@@ -833,15 +869,16 @@ var parse4 = (lockfile, pkg) => {
833
869
  return;
834
870
  }
835
871
  const ranges = chunks.filter((c) => c.startsWith(`${name}@`)).map((r) => r.slice(r.indexOf("@", 1) + 1)).map(normalizeReference);
836
- const hashes = parseIntegrity(checksum);
837
- const source = parseResolution4(resolution);
872
+ const _dependencies = normalizeDeps(isLocal && ((_a = manifests[name]) == null ? void 0 : _a.dependencies) || dependencies);
873
+ const _devDependencies = normalizeDeps(isLocal && ((_b = manifests[name]) == null ? void 0 : _b.devDependencies));
838
874
  snapshot[key] = {
839
875
  name,
840
876
  version: version6,
841
877
  ranges,
842
878
  hashes,
843
879
  source,
844
- dependencies: normalizeDeps(dependencies),
880
+ dependencies: _dependencies,
881
+ devDependencies: _devDependencies,
845
882
  dependenciesMeta,
846
883
  optionalDependencies: normalizeDeps(optionalDependencies),
847
884
  peerDependencies: normalizeDeps(peerDependencies),
@@ -870,12 +907,13 @@ var parse4 = (lockfile, pkg) => {
870
907
  debug.json("yarn-berry-snapshot.json", snapshot);
871
908
  return snapshot;
872
909
  };
873
- var preformat5 = (idx) => {
910
+ var preformat5 = (idx, { __metadata } = {}) => {
874
911
  const { snapshot } = idx;
875
912
  const lf = {};
876
913
  const rangemap = {};
914
+ const isYarn4 = (__metadata == null ? void 0 : __metadata.version) >= 7;
877
915
  Object.values(snapshot).forEach((entry) => {
878
- const { name, version: version6, ranges, hashes: { checksum }, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, patch, bin, conditions } = entry;
916
+ const { name, version: version6, ranges, hashes: { checksum }, devDependencies, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, patch, bin, conditions } = entry;
879
917
  const resolution = formatResolution4(source);
880
918
  const alias = rangemap[resolution];
881
919
  const isLocal = version6 === "0.0.0-use.local";
@@ -888,11 +926,14 @@ var preformat5 = (idx) => {
888
926
  delete lf[alias.key];
889
927
  }
890
928
  const key = keys.join(", ");
929
+ const _dependencies = mergeDeps(dependencies, devDependencies);
930
+ if (_dependencies)
931
+ sortObject(_dependencies);
891
932
  rangemap[resolution] = { keys, key, name };
892
933
  lf[key] = {
893
934
  version: version6,
894
935
  resolution,
895
- dependencies: formatDeps(dependencies),
936
+ dependencies: formatDeps(_dependencies, { semverAsNpm: isYarn4, isLocal: !isLocal }),
896
937
  optionalDependencies: formatDeps(optionalDependencies),
897
938
  peerDependencies: formatDeps(peerDependencies),
898
939
  dependenciesMeta,
@@ -919,7 +960,7 @@ var format5 = (snapshot, { __metadata = {
919
960
  } } = {}) => {
920
961
  const lines = (0, import_js_yaml2.dump)(__spreadValues({
921
962
  __metadata
922
- }, preformat5({ snapshot })), {
963
+ }, preformat5({ snapshot }, { __metadata })), {
923
964
  quotingType: '"',
924
965
  flowLevel: -1,
925
966
  lineWidth: -1,
@@ -83,7 +83,7 @@ export type IFormatOpts = {
83
83
  };
84
84
  export type IFormat = (snapshot: TSnapshot, opts?: IFormatOpts) => string;
85
85
  export type IFormatReference = (value: string, opts: any) => string | number;
86
- export type IPreformat<T> = (idx: TSnapshotIndex) => T;
86
+ export type IPreformat<T> = (idx: TSnapshotIndex, opts?: IFormatOpts) => T;
87
87
  export type ICheck = (input: string) => boolean;
88
88
  export type IParseResolution = (input: string) => TResolution;
89
89
  export type IFormatResolution = (resolution: TResolution) => string;
@@ -1,8 +1,11 @@
1
+ import { TDependencies } from "./interface";
1
2
  export declare const sortObject: <T extends Record<string, any>>(unordered: T, predicate?: (a: [string, any], b: [string, any]) => number) => T;
2
3
  export declare const flushObject: (obj: Record<string, any>) => Record<string, any>;
3
4
  export declare const loadContents: (value: string) => Promise<string>;
4
5
  export declare const debug: ((...chunks: any[]) => void) & {
5
6
  enable: string | undefined;
6
- json(data: any, name?: any, base?: string): void;
7
+ json(data: any, name?: any, base?: string): Promise<void>;
8
+ tempy(): Promise<string>;
7
9
  };
10
+ export declare const mergeDeps: (...deps: (TDependencies | undefined)[]) => TDependencies | undefined;
8
11
  export declare const unique: (arr: string[]) => string[];
@@ -88,17 +88,29 @@ var debug = Object.assign((...chunks) => {
88
88
  console.log(...chunks);
89
89
  }, {
90
90
  enable: process.env.DEBUG,
91
- json(data, name = `debug-${Math.random().toString(16).slice(2)}.json`, base = path.resolve(process.cwd(), "temp")) {
91
+ async json(data, name = `debug-${Math.random().toString(16).slice(2)}.json`, base) {
92
92
  if (!this.enable)
93
93
  return;
94
94
  if (typeof data === "string") {
95
- this.json(name, data);
95
+ await this.json(name, data);
96
96
  return;
97
97
  }
98
98
  const _data = typeof data === "function" ? data() : data;
99
- fs2.writeFile(path.resolve(base, name), JSON.stringify(_data, null, 2));
99
+ const _base = base || await this.tempy();
100
+ await fs2.writeFile(path.resolve(_base, name), JSON.stringify(_data, null, 2));
101
+ },
102
+ async tempy() {
103
+ const temp = path.resolve(process.cwd(), process.env.TEMP || "temp");
104
+ await fs2.mkdir(temp, { recursive: true });
105
+ return temp;
100
106
  }
101
107
  });
108
+ var mergeDeps = (...deps) => {
109
+ const _deps = deps.filter(Boolean);
110
+ if (!_deps.length)
111
+ return;
112
+ return Object.assign({}, ..._deps);
113
+ };
102
114
  var unique = (arr) => [...new Set(arr)];
103
115
 
104
116
  // src/main/ts/analyze.ts
@@ -606,8 +618,12 @@ var preparse = (value) => {
606
618
  }, "").join("\n");
607
619
  return load(_value);
608
620
  };
609
- var parse3 = (value, pkg) => {
610
- const manifest = JSON.parse(pkg);
621
+ var parse3 = (value, ...pkgs) => {
622
+ const manifest = JSON.parse(pkgs[0]);
623
+ const manifests = Object.fromEntries(pkgs.map((p) => {
624
+ const manifest2 = JSON.parse(p);
625
+ return [manifest2.name, manifest2];
626
+ }));
611
627
  const raw = preparse(value);
612
628
  const snapshot = {};
613
629
  Object.entries(raw).forEach((value2) => {
@@ -617,15 +633,19 @@ var parse3 = (value, pkg) => {
617
633
  const source = parseResolution3(resolved);
618
634
  const chunks = _key.split(", ");
619
635
  const names = unique(chunks.map((c) => c.slice(0, c.indexOf("@", 1))));
636
+ const isLocal = version6 === "0.0.0-use.local";
620
637
  for (const name of names) {
621
638
  const ranges = chunks.filter((c) => c.startsWith(`${name}@`)).map((r) => r.slice(r.indexOf("@", 1) + 1)).sort();
622
639
  const key = `${name}@${version6}`;
640
+ const _dependencies = isLocal && manifests[name]?.dependencies || dependencies;
641
+ const _devDependencies = isLocal && manifests[name]?.devDependencies;
623
642
  snapshot[key] = {
624
643
  name,
625
644
  version: version6,
626
645
  ranges,
627
646
  hashes,
628
- dependencies,
647
+ dependencies: _dependencies,
648
+ devDependencies: _devDependencies,
629
649
  optionalDependencies,
630
650
  source
631
651
  };
@@ -653,7 +673,7 @@ var preformat4 = (idx) => {
653
673
  const lf = {};
654
674
  const rangemap = {};
655
675
  Object.values(snapshot).forEach((entry) => {
656
- const { name, version: version6, ranges, hashes, dependencies, optionalDependencies, source } = entry;
676
+ const { name, version: version6, ranges, hashes, devDependencies, dependencies, optionalDependencies, source } = entry;
657
677
  const resolved = formatResolution3(source);
658
678
  const alias = rangemap[resolved];
659
679
  const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(" ");
@@ -664,12 +684,15 @@ var preformat4 = (idx) => {
664
684
  delete lf[alias.key];
665
685
  }
666
686
  const key = keys.join(", ");
687
+ const _dependencies = mergeDeps(dependencies, devDependencies);
688
+ if (_dependencies)
689
+ sortObject(_dependencies);
667
690
  rangemap[resolved] = { keys, key, name };
668
691
  lf[key] = {
669
692
  version: version6,
670
693
  resolved,
671
694
  integrity,
672
- dependencies,
695
+ dependencies: _dependencies,
673
696
  optionalDependencies
674
697
  };
675
698
  });
@@ -731,8 +754,12 @@ var version5 = "yarn-berry";
731
754
  var check5 = (value) => value.includes(`
732
755
  __metadata:
733
756
  version:`);
734
- var parse4 = (lockfile, pkg) => {
735
- const manifest = JSON.parse(pkg);
757
+ var parse4 = (lockfile, ...pkgs) => {
758
+ const manifest = JSON.parse(pkgs[0]);
759
+ const manifests = Object.fromEntries(pkgs.map((p) => {
760
+ const manifest2 = JSON.parse(p);
761
+ return [manifest2.name, manifest2];
762
+ }));
736
763
  const snapshot = {};
737
764
  const raw = load2(lockfile);
738
765
  delete raw.__metadata;
@@ -741,6 +768,9 @@ var parse4 = (lockfile, pkg) => {
741
768
  const { version: version6, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution, bin, conditions } = _entry;
742
769
  const chunks = _key.split(", ");
743
770
  const names = unique(chunks.map((c) => c.slice(0, c.indexOf("@", 1))));
771
+ const isLocal = version6 === "0.0.0-use.local";
772
+ const hashes = parseIntegrity(checksum);
773
+ const source = parseResolution4(resolution);
744
774
  for (const name of names) {
745
775
  const key = `${name}@${version6}`;
746
776
  if (_key.includes("#")) {
@@ -752,15 +782,16 @@ var parse4 = (lockfile, pkg) => {
752
782
  return;
753
783
  }
754
784
  const ranges = chunks.filter((c) => c.startsWith(`${name}@`)).map((r) => r.slice(r.indexOf("@", 1) + 1)).map(normalizeReference);
755
- const hashes = parseIntegrity(checksum);
756
- const source = parseResolution4(resolution);
785
+ const _dependencies = normalizeDeps(isLocal && manifests[name]?.dependencies || dependencies);
786
+ const _devDependencies = normalizeDeps(isLocal && manifests[name]?.devDependencies);
757
787
  snapshot[key] = {
758
788
  name,
759
789
  version: version6,
760
790
  ranges,
761
791
  hashes,
762
792
  source,
763
- dependencies: normalizeDeps(dependencies),
793
+ dependencies: _dependencies,
794
+ devDependencies: _devDependencies,
764
795
  dependenciesMeta,
765
796
  optionalDependencies: normalizeDeps(optionalDependencies),
766
797
  peerDependencies: normalizeDeps(peerDependencies),
@@ -789,12 +820,13 @@ var parse4 = (lockfile, pkg) => {
789
820
  debug.json("yarn-berry-snapshot.json", snapshot);
790
821
  return snapshot;
791
822
  };
792
- var preformat5 = (idx) => {
823
+ var preformat5 = (idx, { __metadata } = {}) => {
793
824
  const { snapshot } = idx;
794
825
  const lf = {};
795
826
  const rangemap = {};
827
+ const isYarn4 = __metadata?.version >= 7;
796
828
  Object.values(snapshot).forEach((entry) => {
797
- const { name, version: version6, ranges, hashes: { checksum }, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, patch, bin, conditions } = entry;
829
+ const { name, version: version6, ranges, hashes: { checksum }, devDependencies, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, patch, bin, conditions } = entry;
798
830
  const resolution = formatResolution4(source);
799
831
  const alias = rangemap[resolution];
800
832
  const isLocal = version6 === "0.0.0-use.local";
@@ -807,11 +839,14 @@ var preformat5 = (idx) => {
807
839
  delete lf[alias.key];
808
840
  }
809
841
  const key = keys.join(", ");
842
+ const _dependencies = mergeDeps(dependencies, devDependencies);
843
+ if (_dependencies)
844
+ sortObject(_dependencies);
810
845
  rangemap[resolution] = { keys, key, name };
811
846
  lf[key] = {
812
847
  version: version6,
813
848
  resolution,
814
- dependencies: formatDeps(dependencies),
849
+ dependencies: formatDeps(_dependencies, { semverAsNpm: isYarn4, isLocal: !isLocal }),
815
850
  optionalDependencies: formatDeps(optionalDependencies),
816
851
  peerDependencies: formatDeps(peerDependencies),
817
852
  dependenciesMeta,
@@ -839,7 +874,7 @@ var format5 = (snapshot, { __metadata = {
839
874
  } } = {}) => {
840
875
  const lines = dump2({
841
876
  __metadata,
842
- ...preformat5({ snapshot })
877
+ ...preformat5({ snapshot }, { __metadata })
843
878
  }, {
844
879
  quotingType: '"',
845
880
  flowLevel: -1,