yarn-berry-deduplicate 6.0.6 → 6.1.1
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 +10 -4
- package/dist/cli.js +5 -20
- package/dist/cli.js.map +1 -1
- package/dist/computePackageInstances.d.ts +5 -0
- package/dist/computePackageInstances.d.ts.map +1 -0
- package/dist/computePackageInstances.js +89 -0
- package/dist/computePackageInstances.js.map +1 -0
- package/dist/extractPackages.d.ts +27 -0
- package/dist/extractPackages.d.ts.map +1 -0
- package/dist/extractPackages.js +63 -0
- package/dist/extractPackages.js.map +1 -0
- package/dist/index.d.ts +2 -39
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -122
- package/dist/index.js.map +1 -1
- package/dist/sharedTypes.d.ts +11 -0
- package/dist/sharedTypes.d.ts.map +1 -0
- package/dist/sharedTypes.js +3 -0
- package/dist/sharedTypes.js.map +1 -0
- package/dist/yarnlock.d.ts +12 -0
- package/dist/yarnlock.d.ts.map +1 -0
- package/dist/yarnlock.js +14 -0
- package/dist/yarnlock.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
# yarn-berry-deduplicate
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
_This is a fork of [yarn-deduplicate](https://www.npmjs.com/package/yarn-deduplicate) for yarn
|
|
4
|
+
berry. _
|
|
4
5
|
|
|
5
6
|
Cleans up `yarn.lock` by removing duplicates.
|
|
6
7
|
|
|
7
|
-
Yarn berry includes [`yarn dedupe`](https://yarnpkg.com/cli/dedupe) that currently only supports
|
|
8
|
+
Yarn berry includes [`yarn dedupe`](https://yarnpkg.com/cli/dedupe) that currently only supports
|
|
9
|
+
"highest" strategy. Follow this issue: https://github.com/yarnpkg/berry/issues/2297.
|
|
8
10
|
|
|
9
|
-
In the meantime, this is a fork of
|
|
11
|
+
In the meantime, this is a fork of
|
|
12
|
+
[yarn-deduplicate](https://www.npmjs.com/package/yarn-deduplicate) that works with both highest and
|
|
13
|
+
fewer (renamed "mostCommon") strategies as well as a new "fewerHighest" strategy which combines
|
|
14
|
+
"mostCommon" and "highest".
|
|
10
15
|
|
|
11
16
|
## Usage
|
|
12
17
|
|
|
@@ -24,7 +29,8 @@ Check all available options with:
|
|
|
24
29
|
yarn dlx yarn-berry-deduplicate --help
|
|
25
30
|
```
|
|
26
31
|
|
|
27
|
-
Note: you can apply multiple times deduplication and each time dedupe more. To prevent issues, try
|
|
32
|
+
Note: you can apply multiple times deduplication and each time dedupe more. To prevent issues, try
|
|
33
|
+
running `yarn dedupe` after each `yarn-berry-deduplicate`.
|
|
28
34
|
|
|
29
35
|
---
|
|
30
36
|
|
package/dist/cli.js
CHANGED
|
@@ -10,7 +10,7 @@ const FAIL_MESSAGE = '\nFound duplicated entries. Run yarn-deduplicate to dedupl
|
|
|
10
10
|
commander_1.program
|
|
11
11
|
.version(version)
|
|
12
12
|
.usage('[options] [yarn.lock path (default: yarn.lock)]')
|
|
13
|
-
.option('-s, --strategy <strategy>', 'deduplication strategy. Valid values:
|
|
13
|
+
.option('-s, --strategy <strategy>', 'deduplication strategy. Valid values: fewerHighest, mostCommon, highest. Default is "fewerHighest"', 'fewerHighest')
|
|
14
14
|
.option('-l, --list', 'do not change yarn.lock, just output the diagnosis')
|
|
15
15
|
.option('-f, --fail', 'if there are duplicates in yarn.lock, terminate the script with exit status 1')
|
|
16
16
|
.option('--scopes <scopes...>', 'a list of scopes to deduplicate. Defaults to all packages.')
|
|
@@ -26,20 +26,15 @@ if (scopes && packages) {
|
|
|
26
26
|
console.error('Please specify either scopes or packages, not both.');
|
|
27
27
|
commander_1.program.help();
|
|
28
28
|
}
|
|
29
|
-
if (strategy !== 'highest' && strategy !== 'fewer' && strategy !== '
|
|
29
|
+
if (strategy !== 'highest' && strategy !== 'fewer' && strategy !== 'fewerHighest' && strategy !== 'mostCommon') {
|
|
30
30
|
console.error(`Invalid strategy ${strategy}`);
|
|
31
31
|
commander_1.program.help();
|
|
32
32
|
}
|
|
33
33
|
try {
|
|
34
34
|
const yarnLock = fs_1.default.readFileSync(file, 'utf8');
|
|
35
|
-
const useMostCommon = strategy === 'fewer' || strategy === 'both';
|
|
36
35
|
if (list) {
|
|
37
|
-
if (strategy !== 'highest' && strategy !== 'fewer') {
|
|
38
|
-
console.error(`Invalid strategy ${strategy}`);
|
|
39
|
-
commander_1.program.help();
|
|
40
|
-
}
|
|
41
36
|
const duplicates = (0, index_js_1.listDuplicates)(yarnLock, {
|
|
42
|
-
|
|
37
|
+
strategy,
|
|
43
38
|
includeScopes: scopes,
|
|
44
39
|
includePackages: packages,
|
|
45
40
|
excludePackages: exclude,
|
|
@@ -51,29 +46,19 @@ try {
|
|
|
51
46
|
console.error(FAIL_MESSAGE);
|
|
52
47
|
process.exit(1);
|
|
53
48
|
}
|
|
54
|
-
else {
|
|
49
|
+
else if (duplicates.length === 0) {
|
|
55
50
|
console.log('No duplicates found!');
|
|
56
51
|
}
|
|
57
52
|
}
|
|
58
53
|
else {
|
|
59
54
|
let dedupedYarnLock = (0, index_js_1.fixDuplicates)(yarnLock, {
|
|
60
|
-
|
|
55
|
+
strategy,
|
|
61
56
|
includeScopes: scopes,
|
|
62
57
|
includePackages: packages,
|
|
63
58
|
excludePackages: exclude,
|
|
64
59
|
excludeScopes: excludeScopes,
|
|
65
60
|
includePrerelease: includePrerelease,
|
|
66
61
|
});
|
|
67
|
-
if (strategy === 'both') {
|
|
68
|
-
dedupedYarnLock = (0, index_js_1.fixDuplicates)(dedupedYarnLock, {
|
|
69
|
-
useMostCommon: false,
|
|
70
|
-
includeScopes: scopes,
|
|
71
|
-
includePackages: packages,
|
|
72
|
-
excludePackages: exclude,
|
|
73
|
-
excludeScopes: excludeScopes,
|
|
74
|
-
includePrerelease: includePrerelease,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
62
|
if (print) {
|
|
78
63
|
console.log(dedupedYarnLock);
|
|
79
64
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;AAEA,yCAAoC;AACpC,oDAAoB;AAEpB,yCAA2D;AAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;AAEnD,MAAM,YAAY,GAAG,uEAAuE,CAAC;AAE7F,mBAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,KAAK,CAAC,iDAAiD,CAAC;KACxD,MAAM,CACH,2BAA2B,EAC3B
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Package, Packages } from "./extractPackages";
|
|
2
|
+
import { Options } from "./sharedTypes";
|
|
3
|
+
export declare const computePackageInstances: (packages: Packages, packageKey: string, { strategy, includePrerelease, }?: Options) => Package[];
|
|
4
|
+
export declare const selectBestVersionFromPackageInstances: (packageInstances: Package[]) => void;
|
|
5
|
+
//# sourceMappingURL=computePackageInstances.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computePackageInstances.d.ts","sourceRoot":"","sources":["../src/computePackageInstances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAqB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,eAAO,MAAM,uBAAuB,aAAc,QAAQ,cAAc,MAAM,qCAIzE,OAAO,KAAQ,OAAO,EA8D1B,CAAC;AAEF,eAAO,MAAM,qCAAqC,qBAAsB,OAAO,EAAE,KAAG,IA0BjF,CAAA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectBestVersionFromPackageInstances = exports.computePackageInstances = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const semver_1 = tslib_1.__importDefault(require("semver"));
|
|
6
|
+
const computePackageInstances = (packages, packageKey, { strategy = 'fewerHighest', includePrerelease = false, } = {}) => {
|
|
7
|
+
// Instances of this package in the tree
|
|
8
|
+
const packageInstances = packages[packageKey];
|
|
9
|
+
// Extract the list of unique versions for this package
|
|
10
|
+
const versions = new Map();
|
|
11
|
+
for (const packageInstance of packageInstances) {
|
|
12
|
+
if (packageInstance.ignored)
|
|
13
|
+
continue;
|
|
14
|
+
if (versions.has(packageInstance.installedVersion))
|
|
15
|
+
continue;
|
|
16
|
+
versions.set(packageInstance.installedVersion, {
|
|
17
|
+
pkg: packageInstance.pkg,
|
|
18
|
+
satisfies: new Set(),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
// Link each package instance with all the versions it could satisfy.
|
|
22
|
+
for (const [version, { satisfies }] of versions) {
|
|
23
|
+
packageInstances.forEach((packageInstance) => {
|
|
24
|
+
// We can assume that the installed version always satisfied the requested version.
|
|
25
|
+
packageInstance.satisfiedBy.add(packageInstance.installedVersion);
|
|
26
|
+
// In some cases the requested version is invalid form a semver point of view (for
|
|
27
|
+
// example `sinon@next`). Just ignore those cases, they won't get deduped.
|
|
28
|
+
if (semver_1.default.validRange(packageInstance.requestedVersion, { includePrerelease }) &&
|
|
29
|
+
semver_1.default.satisfies(version, packageInstance.requestedVersion, { includePrerelease })) {
|
|
30
|
+
satisfies.add(packageInstance);
|
|
31
|
+
packageInstance.satisfiedBy.add(version);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
;
|
|
36
|
+
// Sort the list of satisfied versions
|
|
37
|
+
packageInstances.forEach((packageInstance) => {
|
|
38
|
+
if (packageInstance.ignored) {
|
|
39
|
+
packageInstance.bestVersion = packageInstance.installedVersion;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Save all versions for future reference
|
|
43
|
+
packageInstance.versions = versions;
|
|
44
|
+
// Compute the versions that actually satisfy this instance
|
|
45
|
+
packageInstance.candidateVersions = Array.from(packageInstance.satisfiedBy);
|
|
46
|
+
packageInstance.candidateVersions.sort((versionA, versionB) => {
|
|
47
|
+
if (strategy === 'fewer' || strategy === 'mostCommon' || strategy === 'fewerHighest') {
|
|
48
|
+
// Sort versions based on how many packages it satisfies. In case of a tie, put the
|
|
49
|
+
// highest version first.
|
|
50
|
+
const satisfiesA = versions.get(versionA).satisfies;
|
|
51
|
+
const satisfiesB = versions.get(versionB).satisfies;
|
|
52
|
+
if (satisfiesB.size > satisfiesA.size)
|
|
53
|
+
return 1;
|
|
54
|
+
if (satisfiesB.size < satisfiesA.size)
|
|
55
|
+
return -1;
|
|
56
|
+
}
|
|
57
|
+
return semver_1.default.rcompare(versionA, versionB);
|
|
58
|
+
});
|
|
59
|
+
// The best package is always the first one in the list thanks to the sorting above.
|
|
60
|
+
packageInstance.bestVersion = packageInstance.candidateVersions[0];
|
|
61
|
+
});
|
|
62
|
+
return packageInstances;
|
|
63
|
+
};
|
|
64
|
+
exports.computePackageInstances = computePackageInstances;
|
|
65
|
+
const selectBestVersionFromPackageInstances = (packageInstances) => {
|
|
66
|
+
// Find the versions that were selected on the previous run
|
|
67
|
+
const selectedVersions = new Map();
|
|
68
|
+
packageInstances.forEach((packageInstance) => {
|
|
69
|
+
if (!selectedVersions.has(packageInstance.packageKey)) {
|
|
70
|
+
selectedVersions.set(packageInstance.packageKey, new Set());
|
|
71
|
+
}
|
|
72
|
+
selectedVersions.get(packageInstance.packageKey).add(packageInstance.bestVersion);
|
|
73
|
+
});
|
|
74
|
+
// Sort the list of satisfied versions
|
|
75
|
+
packageInstances.forEach((packageInstance) => {
|
|
76
|
+
if (packageInstance.ignored || !packageInstance.candidateVersions) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const selectedVersionsForPackage = selectedVersions.get(packageInstance.packageKey);
|
|
80
|
+
const candidateVersionsExcludingNotSelected = packageInstance.candidateVersions.filter(version => selectedVersionsForPackage.has(version));
|
|
81
|
+
candidateVersionsExcludingNotSelected.sort((versionA, versionB) => {
|
|
82
|
+
return semver_1.default.rcompare(versionA, versionB);
|
|
83
|
+
});
|
|
84
|
+
// The best package is always the first one in the list thanks to the sorting above.
|
|
85
|
+
packageInstance.bestVersion = candidateVersionsExcludingNotSelected[0];
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
exports.selectBestVersionFromPackageInstances = selectBestVersionFromPackageInstances;
|
|
89
|
+
//# sourceMappingURL=computePackageInstances.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computePackageInstances.js","sourceRoot":"","sources":["../src/computePackageInstances.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Descriptor } from "@yarnpkg/core";
|
|
2
|
+
import type { Options } from "./sharedTypes";
|
|
3
|
+
import type { YarnEntries, YarnEntry } from "./yarnlock";
|
|
4
|
+
export type Version = {
|
|
5
|
+
pkg: YarnEntry;
|
|
6
|
+
satisfies: Set<Package>;
|
|
7
|
+
};
|
|
8
|
+
export type Versions = Map<string, Version>;
|
|
9
|
+
export type Package = {
|
|
10
|
+
installedVersion: string;
|
|
11
|
+
packageKey: string;
|
|
12
|
+
packageName: string;
|
|
13
|
+
pkg: YarnEntry;
|
|
14
|
+
ignored: boolean;
|
|
15
|
+
descriptorString: string;
|
|
16
|
+
descriptor: Descriptor;
|
|
17
|
+
actualDescriptor: Descriptor;
|
|
18
|
+
satisfiedBy: Set<string>;
|
|
19
|
+
candidateVersions?: string[];
|
|
20
|
+
requestedProtocol: string | null;
|
|
21
|
+
requestedVersion: string;
|
|
22
|
+
bestVersion?: string;
|
|
23
|
+
versions: Versions;
|
|
24
|
+
};
|
|
25
|
+
export type Packages = Record<string, Package[]>;
|
|
26
|
+
export declare const extractPackages: (yarnEntries: YarnEntries, { includeScopes, includePackages, excludePackages, excludeScopes, }?: Options) => Packages;
|
|
27
|
+
//# sourceMappingURL=extractPackages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractPackages.d.ts","sourceRoot":"","sources":["../src/extractPackages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGzD,MAAM,MAAM,OAAO,GAAG;IACpB,GAAG,EAAE,SAAS,CAAC;IACf,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,MAAM,MAAM,OAAO,GAAG;IAClB,gBAAgB,EAAC,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,UAAU,CAAC;IAC7B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAEjD,eAAO,MAAM,eAAe,gBACb,WAAW,wEAMrB,OAAO,KACT,QAgEF,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractPackages = void 0;
|
|
4
|
+
const core_1 = require("@yarnpkg/core");
|
|
5
|
+
const extractPackages = (yarnEntries, { includeScopes = [], includePackages = [], excludePackages = [], excludeScopes = [], } = {}) => {
|
|
6
|
+
const packages = {};
|
|
7
|
+
for (const [entryName, entry] of Object.entries(yarnEntries)) {
|
|
8
|
+
if (entryName === '__metadata')
|
|
9
|
+
continue;
|
|
10
|
+
for (const descriptorString of entryName.split(', ')) {
|
|
11
|
+
const descriptor = core_1.structUtils.parseDescriptor(descriptorString);
|
|
12
|
+
const range = core_1.structUtils.parseRange(descriptor.range);
|
|
13
|
+
// If the range is a valid descriptor we're dealing with an alias ("foo": "npm:lodash@*")
|
|
14
|
+
// and need to make the locator from that instead of the original descriptor
|
|
15
|
+
let actualDescriptor = descriptor;
|
|
16
|
+
try {
|
|
17
|
+
const potentialDescriptor = core_1.structUtils.tryParseDescriptor(range.selector, true);
|
|
18
|
+
if (potentialDescriptor) {
|
|
19
|
+
actualDescriptor = potentialDescriptor;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch { }
|
|
23
|
+
const packageName = core_1.structUtils.stringifyIdent(actualDescriptor);
|
|
24
|
+
let ignored = !range.protocol || !['npm', 'npm:'].includes(range.protocol) || (!!entry.linkType && entry.linkType !== 'hard');
|
|
25
|
+
// If there is a list of scopes, only process those.
|
|
26
|
+
if (includeScopes.length > 0 &&
|
|
27
|
+
!includeScopes.find((scope) => packageName.startsWith(`${scope}/`))) {
|
|
28
|
+
ignored = true;
|
|
29
|
+
}
|
|
30
|
+
else if (excludeScopes.length > 0 &&
|
|
31
|
+
excludeScopes.find((scope) => packageName.startsWith(`${scope}/`))) {
|
|
32
|
+
ignored = true;
|
|
33
|
+
}
|
|
34
|
+
// If there is a list of package names, only process those.
|
|
35
|
+
else if (includePackages.length > 0 && !includePackages.includes(packageName)) {
|
|
36
|
+
ignored = true;
|
|
37
|
+
}
|
|
38
|
+
else if (excludePackages.length > 0 && excludePackages.includes(packageName)) {
|
|
39
|
+
ignored = true;
|
|
40
|
+
}
|
|
41
|
+
const packageKey = ignored ? entryName : packageName + '@' + range.protocol;
|
|
42
|
+
packages[packageKey] = packages[packageKey] || [];
|
|
43
|
+
packages[packageKey].push({
|
|
44
|
+
packageKey,
|
|
45
|
+
packageName,
|
|
46
|
+
pkg: entry,
|
|
47
|
+
descriptorString,
|
|
48
|
+
descriptor,
|
|
49
|
+
actualDescriptor,
|
|
50
|
+
ignored,
|
|
51
|
+
requestedProtocol: range.protocol,
|
|
52
|
+
requestedVersion: range.selector,
|
|
53
|
+
installedVersion: entry.version,
|
|
54
|
+
satisfiedBy: new Set(),
|
|
55
|
+
versions: new Map()
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
;
|
|
60
|
+
return packages;
|
|
61
|
+
};
|
|
62
|
+
exports.extractPackages = extractPackages;
|
|
63
|
+
//# sourceMappingURL=extractPackages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractPackages.js","sourceRoot":"","sources":["../src/extractPackages.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,44 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
version: string;
|
|
4
|
-
resolution: string;
|
|
5
|
-
dependencies?: Record<string, string>;
|
|
6
|
-
checksum?: string;
|
|
7
|
-
languageName?: 'node';
|
|
8
|
-
linkType?: 'hard' | 'soft';
|
|
9
|
-
};
|
|
10
|
-
type Packages = Record<string, Package[]>;
|
|
11
|
-
type Package = {
|
|
12
|
-
installedVersion: string;
|
|
13
|
-
packageKey: string;
|
|
14
|
-
packageName: string;
|
|
15
|
-
pkg: YarnEntry;
|
|
16
|
-
ignored: boolean;
|
|
17
|
-
descriptorString: string;
|
|
18
|
-
descriptor: Descriptor;
|
|
19
|
-
satisfiedBy: Set<string>;
|
|
20
|
-
candidateVersions?: string[];
|
|
21
|
-
requestedProtocol: string;
|
|
22
|
-
requestedVersion: string;
|
|
23
|
-
bestVersion?: string;
|
|
24
|
-
versions: Versions;
|
|
25
|
-
};
|
|
26
|
-
type Version = {
|
|
27
|
-
pkg: YarnEntry;
|
|
28
|
-
satisfies: Set<Package>;
|
|
29
|
-
};
|
|
30
|
-
type Versions = Map<string, Version>;
|
|
31
|
-
type Options = {
|
|
32
|
-
includeScopes?: string[];
|
|
33
|
-
includePackages?: string[];
|
|
34
|
-
excludePackages?: string[];
|
|
35
|
-
excludeScopes?: string[];
|
|
36
|
-
useMostCommon?: boolean;
|
|
37
|
-
includePrerelease?: boolean;
|
|
38
|
-
};
|
|
1
|
+
import { Options } from './sharedTypes';
|
|
2
|
+
import { Package, Packages } from './extractPackages';
|
|
39
3
|
export declare const getBest: (packages: Packages, options?: Options) => Package[];
|
|
40
4
|
export declare const getDuplicates: (packages: Packages, options?: Options) => Package[];
|
|
41
5
|
export declare const listDuplicates: (yarnLock: string, options?: Options) => string[];
|
|
42
6
|
export declare const fixDuplicates: (yarnLock: string, options?: Options) => string;
|
|
43
|
-
export {};
|
|
44
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAmB,MAAM,mBAAmB,CAAC;AAGvE,eAAO,MAAM,OAAO,aACN,QAAQ,YACT,OAAO,KACjB,OAAO,EAgBT,CAAC;AAEF,eAAO,MAAM,aAAa,aACZ,QAAQ,YACT,OAAO,KACjB,OAAO,EAGT,CAAC;AAEF,eAAO,MAAM,cAAc,aAAa,MAAM,YAAW,OAAO,KAAQ,MAAM,EAQ7E,CAAC;AAEF,eAAO,MAAM,aAAa,aAAe,MAAM,YAAW,OAAO,WA2BhE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,119 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.fixDuplicates = exports.listDuplicates = exports.getDuplicates = exports.getBest = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
4
|
const core_1 = require("@yarnpkg/core");
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const extractPackages = (yarnEntries, { includeScopes = [], includePackages = [], excludePackages = [], excludeScopes = [], } = {}) => {
|
|
10
|
-
const packages = {};
|
|
11
|
-
const re = /^(?:([^:]*):)?([^@]*?)$/;
|
|
12
|
-
for (const [entryName, entry] of Object.entries(yarnEntries)) {
|
|
13
|
-
if (entryName === '__metadata')
|
|
14
|
-
continue;
|
|
15
|
-
for (const descriptorString of entryName.split(', ')) {
|
|
16
|
-
const descriptor = core_1.structUtils.parseDescriptor(descriptorString);
|
|
17
|
-
const [, requestedProtocol, requestedVersion] = descriptor.range.match(re) || [];
|
|
18
|
-
const packageName = core_1.structUtils.stringifyIdent(descriptor);
|
|
19
|
-
let ignored = requestedProtocol !== 'npm' || entry.linkType !== 'hard';
|
|
20
|
-
// If there is a list of scopes, only process those.
|
|
21
|
-
if (includeScopes.length > 0 &&
|
|
22
|
-
!includeScopes.find((scope) => packageName.startsWith(`${scope}/`))) {
|
|
23
|
-
ignored = true;
|
|
24
|
-
}
|
|
25
|
-
else if (excludeScopes.length > 0 &&
|
|
26
|
-
excludeScopes.find((scope) => packageName.startsWith(`${scope}/`))) {
|
|
27
|
-
ignored = true;
|
|
28
|
-
}
|
|
29
|
-
// If there is a list of package names, only process those.
|
|
30
|
-
else if (includePackages.length > 0 && !includePackages.includes(packageName)) {
|
|
31
|
-
ignored = true;
|
|
32
|
-
}
|
|
33
|
-
else if (excludePackages.length > 0 && excludePackages.includes(packageName)) {
|
|
34
|
-
ignored = true;
|
|
35
|
-
}
|
|
36
|
-
const packageKey = ignored ? entryName : packageName + '@' + requestedProtocol;
|
|
37
|
-
packages[packageKey] = packages[packageKey] || [];
|
|
38
|
-
packages[packageKey].push({
|
|
39
|
-
packageKey,
|
|
40
|
-
packageName,
|
|
41
|
-
pkg: entry,
|
|
42
|
-
descriptorString,
|
|
43
|
-
descriptor,
|
|
44
|
-
ignored,
|
|
45
|
-
requestedProtocol,
|
|
46
|
-
requestedVersion,
|
|
47
|
-
installedVersion: entry.version,
|
|
48
|
-
satisfiedBy: new Set(),
|
|
49
|
-
versions: new Map()
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
;
|
|
54
|
-
return packages;
|
|
55
|
-
};
|
|
56
|
-
const computePackageInstances = (packages, packageKey, { useMostCommon = false, includePrerelease = false, } = {}) => {
|
|
57
|
-
// Instances of this package in the tree
|
|
58
|
-
const packageInstances = packages[packageKey];
|
|
59
|
-
// Extract the list of unique versions for this package
|
|
60
|
-
const versions = new Map();
|
|
61
|
-
for (const packageInstance of packageInstances) {
|
|
62
|
-
if (packageInstance.ignored)
|
|
63
|
-
continue;
|
|
64
|
-
if (versions.has(packageInstance.installedVersion))
|
|
65
|
-
continue;
|
|
66
|
-
versions.set(packageInstance.installedVersion, {
|
|
67
|
-
pkg: packageInstance.pkg,
|
|
68
|
-
satisfies: new Set(),
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
// Link each package instance with all the versions it could satisfy.
|
|
72
|
-
for (const [version, { satisfies }] of versions) {
|
|
73
|
-
packageInstances.forEach((packageInstance) => {
|
|
74
|
-
// We can assume that the installed version always satisfied the requested version.
|
|
75
|
-
packageInstance.satisfiedBy.add(packageInstance.installedVersion);
|
|
76
|
-
// In some cases the requested version is invalid form a semver point of view (for
|
|
77
|
-
// example `sinon@next`). Just ignore those cases, they won't get deduped.
|
|
78
|
-
if (semver_1.default.validRange(packageInstance.requestedVersion, { includePrerelease }) &&
|
|
79
|
-
semver_1.default.satisfies(version, packageInstance.requestedVersion, { includePrerelease })) {
|
|
80
|
-
satisfies.add(packageInstance);
|
|
81
|
-
packageInstance.satisfiedBy.add(version);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
;
|
|
86
|
-
// Sort the list of satisfied versions
|
|
87
|
-
packageInstances.forEach((packageInstance) => {
|
|
88
|
-
if (packageInstance.ignored) {
|
|
89
|
-
packageInstance.bestVersion = packageInstance.installedVersion;
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
// Save all versions for future reference
|
|
93
|
-
packageInstance.versions = versions;
|
|
94
|
-
// Compute the versions that actually satisfy this instance
|
|
95
|
-
packageInstance.candidateVersions = Array.from(packageInstance.satisfiedBy);
|
|
96
|
-
packageInstance.candidateVersions.sort((versionA, versionB) => {
|
|
97
|
-
if (useMostCommon) {
|
|
98
|
-
// Sort verions based on how many packages it satisfies. In case of a tie, put the
|
|
99
|
-
// highest version first.
|
|
100
|
-
const satisfiesA = versions.get(versionA).satisfies;
|
|
101
|
-
const satisfiesB = versions.get(versionB).satisfies;
|
|
102
|
-
if (satisfiesB.size > satisfiesA.size)
|
|
103
|
-
return 1;
|
|
104
|
-
if (satisfiesB.size < satisfiesA.size)
|
|
105
|
-
return -1;
|
|
106
|
-
}
|
|
107
|
-
return semver_1.default.rcompare(versionA, versionB);
|
|
108
|
-
});
|
|
109
|
-
// The best package is always the first one in the list thanks to the sorting above.
|
|
110
|
-
packageInstance.bestVersion = packageInstance.candidateVersions[0];
|
|
111
|
-
});
|
|
112
|
-
return packageInstances;
|
|
113
|
-
};
|
|
5
|
+
const yarnlock_1 = require("./yarnlock");
|
|
6
|
+
const extractPackages_1 = require("./extractPackages");
|
|
7
|
+
const computePackageInstances_1 = require("./computePackageInstances");
|
|
114
8
|
const getBest = (packages, options = {}) => {
|
|
115
|
-
|
|
116
|
-
|
|
9
|
+
const bestPackages = [];
|
|
10
|
+
Object.keys(packages)
|
|
11
|
+
.forEach((name) => {
|
|
12
|
+
bestPackages.push(...(0, computePackageInstances_1.computePackageInstances)(packages, name, options));
|
|
13
|
+
});
|
|
14
|
+
// eliminate candidates that were not selected on the previous run
|
|
15
|
+
if (!options.strategy || options.strategy === 'fewerHighest') {
|
|
16
|
+
(0, computePackageInstances_1.selectBestVersionFromPackageInstances)(bestPackages);
|
|
17
|
+
}
|
|
18
|
+
return bestPackages;
|
|
117
19
|
};
|
|
118
20
|
exports.getBest = getBest;
|
|
119
21
|
const getDuplicates = (packages, options = {}) => {
|
|
@@ -122,8 +24,8 @@ const getDuplicates = (packages, options = {}) => {
|
|
|
122
24
|
};
|
|
123
25
|
exports.getDuplicates = getDuplicates;
|
|
124
26
|
const listDuplicates = (yarnLock, options = {}) => {
|
|
125
|
-
const yarnEntries = parseYarnLock(yarnLock);
|
|
126
|
-
const packages = extractPackages(yarnEntries);
|
|
27
|
+
const yarnEntries = (0, yarnlock_1.parseYarnLock)(yarnLock);
|
|
28
|
+
const packages = (0, extractPackages_1.extractPackages)(yarnEntries, options);
|
|
127
29
|
const duplicates = (0, exports.getDuplicates)(packages, options);
|
|
128
30
|
const result = duplicates.map(({ bestVersion, packageName, installedVersion, requestedVersion }) => {
|
|
129
31
|
return `Package "${packageName}" wants ${requestedVersion} and could get ${bestVersion}, but got ${installedVersion}`;
|
|
@@ -131,19 +33,15 @@ const listDuplicates = (yarnLock, options = {}) => {
|
|
|
131
33
|
return result;
|
|
132
34
|
};
|
|
133
35
|
exports.listDuplicates = listDuplicates;
|
|
134
|
-
const yarnLockHeader = `${[
|
|
135
|
-
`# This file is generated by running "yarn install" inside your project.\n`,
|
|
136
|
-
`# Manual changes might be lost - proceed with caution!\n`,
|
|
137
|
-
].join(``)}\n`;
|
|
138
36
|
const fixDuplicates = (yarnLock, options = {}) => {
|
|
139
|
-
const yarnEntries = parseYarnLock(yarnLock);
|
|
140
|
-
const packages = extractPackages(yarnEntries);
|
|
37
|
+
const yarnEntries = (0, yarnlock_1.parseYarnLock)(yarnLock);
|
|
38
|
+
const packages = (0, extractPackages_1.extractPackages)(yarnEntries, options);
|
|
141
39
|
const bestPackages = (0, exports.getBest)(packages, options);
|
|
142
40
|
const packageResolutions = {};
|
|
143
41
|
for (const bestPackage of bestPackages) {
|
|
144
|
-
const { descriptorString, bestVersion, requestedProtocol, installedVersion, pkg,
|
|
42
|
+
const { descriptorString, bestVersion, requestedProtocol, installedVersion, pkg, actualDescriptor, ignored, packageKey } = bestPackage;
|
|
145
43
|
const keyWithBestVersion = ignored ? packageKey : core_1.structUtils.stringifyDescriptor({
|
|
146
|
-
...
|
|
44
|
+
...actualDescriptor,
|
|
147
45
|
range: requestedProtocol + ':' + bestVersion
|
|
148
46
|
});
|
|
149
47
|
packageResolutions[keyWithBestVersion] = packageResolutions[keyWithBestVersion] || { keys: [] };
|
|
@@ -153,10 +51,11 @@ const fixDuplicates = (yarnLock, options = {}) => {
|
|
|
153
51
|
}
|
|
154
52
|
const newYarnEntries = { __metadata: yarnEntries.__metadata };
|
|
155
53
|
for (const packageResolution of Object.values(packageResolutions)) {
|
|
54
|
+
//TODO packageResolution.keys.sort();
|
|
156
55
|
const key = packageResolution.keys.join(', ');
|
|
157
56
|
newYarnEntries[key] = packageResolution.pkg;
|
|
158
57
|
}
|
|
159
|
-
return
|
|
58
|
+
return (0, yarnlock_1.stringifyYarnLock)(newYarnEntries);
|
|
160
59
|
};
|
|
161
60
|
exports.fixDuplicates = fixDuplicates;
|
|
162
61
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type LegacyFewerStrategy = 'fewer';
|
|
2
|
+
export type DedupeStrategy = LegacyFewerStrategy | 'mostCommon' | 'fewerHighest' | 'highest';
|
|
3
|
+
export type Options = {
|
|
4
|
+
includeScopes?: string[];
|
|
5
|
+
includePackages?: string[];
|
|
6
|
+
excludePackages?: string[];
|
|
7
|
+
excludeScopes?: string[];
|
|
8
|
+
strategy?: DedupeStrategy;
|
|
9
|
+
includePrerelease?: boolean;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=sharedTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedTypes.d.ts","sourceRoot":"","sources":["../src/sharedTypes.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC1C,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;AAE7F,MAAM,MAAM,OAAO,GAAG;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedTypes.js","sourceRoot":"","sources":["../src/sharedTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type YarnEntry = {
|
|
2
|
+
version: string;
|
|
3
|
+
resolution: string;
|
|
4
|
+
dependencies?: Record<string, string>;
|
|
5
|
+
checksum?: string;
|
|
6
|
+
languageName?: 'node';
|
|
7
|
+
linkType?: 'hard' | 'soft';
|
|
8
|
+
};
|
|
9
|
+
export type YarnEntries = Record<string, YarnEntry>;
|
|
10
|
+
export declare const parseYarnLock: (file: string) => YarnEntries;
|
|
11
|
+
export declare const stringifyYarnLock: (yarnEntries: YarnEntries) => string;
|
|
12
|
+
//# sourceMappingURL=yarnlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yarnlock.d.ts","sourceRoot":"","sources":["../src/yarnlock.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAGpD,eAAO,MAAM,aAAa,SAAS,MAAM,gBAA+C,CAAC;AASzF,eAAO,MAAM,iBAAiB,gBAAiB,WAAW,WAA4D,CAAC"}
|
package/dist/yarnlock.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stringifyYarnLock = exports.parseYarnLock = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const yarnParsers = tslib_1.__importStar(require("@yarnpkg/parsers"));
|
|
6
|
+
const parseYarnLock = (file) => yarnParsers.parseSyml(file);
|
|
7
|
+
exports.parseYarnLock = parseYarnLock;
|
|
8
|
+
const yarnLockHeader = `${[
|
|
9
|
+
`# This file is generated by running "yarn install" inside your project.\n`,
|
|
10
|
+
`# Manual changes might be lost - proceed with caution!\n`,
|
|
11
|
+
].join(``)}\n`;
|
|
12
|
+
const stringifyYarnLock = (yarnEntries) => yarnLockHeader + yarnParsers.stringifySyml(yarnEntries);
|
|
13
|
+
exports.stringifyYarnLock = stringifyYarnLock;
|
|
14
|
+
//# sourceMappingURL=yarnlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yarnlock.js","sourceRoot":"","sources":["../src/yarnlock.ts"],"names":[],"mappings":";;;;AACA,sEAAgD;AAczC,MAAM,aAAa,GAAG,CAAC,IAAW,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAgB,CAAC;AAA5E,QAAA,aAAa,iBAA+D;AAGzF,MAAM,cAAc,GAAG,GAAG;IACxB,2EAA2E;IAC3E,0DAA0D;CAC3D,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;AAGR,MAAM,iBAAiB,GAAG,CAAC,WAAwB,EAAE,EAAE,CAAC,cAAc,GAAG,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;AAA1G,QAAA,iBAAiB,qBAAyF"}
|