forked from Thinkmill/manypkg
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupgrade.ts
107 lines (87 loc) · 2.8 KB
/
upgrade.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import { getPackages } from "@manypkg/get-packages";
import semver from "semver";
import { DEPENDENCY_TYPES, versionRangeToRangeType } from "./checks/utils";
import pLimit from "p-limit";
import { writePackage, install } from "./utils";
export async function upgradeDependency([name, tag = "latest"]: string[]) {
// handle no name is missing
let { packages, tool, rootPackage, rootDir } = await getPackages(
process.cwd()
);
let isScope = name.startsWith("@") && !name.includes("/");
let newVersion = semver.validRange(tag) ? tag : null;
let packagesToUpdate = new Set<string>();
let filteredPackages = packages.filter(({ packageJson }) => {
let requiresUpdate = false;
DEPENDENCY_TYPES.forEach((t) => {
let deps = packageJson[t];
if (!deps) return;
let packageNames = Object.keys(deps);
packageNames.forEach((pkgName) => {
if ((isScope && pkgName.startsWith(`${name}/`)) || pkgName === name) {
requiresUpdate = true;
packagesToUpdate.add(pkgName);
}
});
});
return requiresUpdate;
});
if (rootPackage) {
let rootRequiresUpdate = false;
DEPENDENCY_TYPES.forEach((t) => {
let deps = rootPackage!.packageJson[t];
if (!deps) return;
let packageNames = Object.keys(deps);
packageNames.forEach((pkgName) => {
if ((isScope && pkgName.startsWith(`${name}/`)) || pkgName === name) {
rootRequiresUpdate = true;
packagesToUpdate.add(pkgName);
}
});
if (rootRequiresUpdate) {
filteredPackages.push(rootPackage!);
}
});
}
let newVersions = await Promise.all(
[...packagesToUpdate].map(async (pkgName) => {
if (!newVersion) {
let info = await getPackageInfo(pkgName);
let distTags = info["dist-tags"];
let version = distTags[tag];
return { pkgName, version };
} else {
return { pkgName, version: newVersion };
}
})
);
filteredPackages.forEach(({ packageJson }) => {
DEPENDENCY_TYPES.forEach((t) => {
let deps = packageJson[t];
if (deps) {
newVersions.forEach(({ pkgName, version }) => {
if (deps![pkgName] && version) {
if (!newVersion) {
deps![pkgName] = `${versionRangeToRangeType(
deps![pkgName]
)}${version}`;
} else {
deps![pkgName] = version;
}
}
});
}
});
});
await Promise.all([...filteredPackages].map(writePackage));
await install(tool.type, rootDir);
}
const npmRequestLimit = pLimit(40);
function getPackageInfo(pkgName: string) {
return npmRequestLimit(async () => {
const getPackageJson = (await import("package-json")).default;
return getPackageJson(pkgName, {
allVersions: true,
});
});
}