UNPKG

1.32 kBJavaScriptView Raw
1const clone = src => JSON.parse(JSON.stringify(src));
2
3const targetProperties = ['dependencies', 'peerDependencies'];
4
5// link: specifiers are used by Yarn and should be supported by npm in future
6// workspace: specifiers are used by Yarn and pnpm
7// portal: specifiers are used by Yarn 2 (a.k.a Berry)
8const targetSpecifiers = /^(file|link|workspace|portal):/;
9
10module.exports = (manifest, packagesToUpdate, number, fallbackVersions) => {
11 const pkg = clone(manifest);
12
13 pkg.version = number;
14
15 targetProperties.forEach(targetProperty => {
16 const dependencies = pkg[targetProperty] || {};
17 const dependencyNames = Object.keys(dependencies);
18
19 dependencyNames.forEach(dependencyName => {
20 const version = dependencies[dependencyName];
21
22 // Only update dependency version of dependencies specified with a local path
23 if (targetSpecifiers.test(version)) {
24 if (packagesToUpdate.has(dependencyName)) {
25 dependencies[dependencyName] = `^${number}`;
26 } else if (fallbackVersions.has(dependencyName)) {
27 dependencies[dependencyName] = `^${fallbackVersions.get(
28 dependencyName,
29 )}`;
30 } else {
31 // Don't allow packages to depend on unpublished packages
32 throw new Error(
33 `No suitable version found for ${dependencyName} package`,
34 );
35 }
36 }
37 });
38 });
39
40 return pkg;
41};