/
version-package.ts
107 lines (100 loc) 路 3.26 KB
/
version-package.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 {
ComprehensiveRelease,
PackageJSON,
VersionType
} from "@changesets/types";
import getVersionRangeType from "@changesets/get-version-range-type";
import semver from "semver";
import { shouldUpdateDependencyBasedOnConfig } from "./utils";
const DEPENDENCY_TYPES = [
"dependencies",
"devDependencies",
"peerDependencies",
"optionalDependencies"
] as const;
export default function versionPackage(
release: ComprehensiveRelease & {
changelog: string | null;
packageJson: PackageJSON;
dir: string;
},
versionsToUpdate: Array<{ name: string; version: string; type: VersionType }>,
{
updateInternalDependencies,
onlyUpdatePeerDependentsWhenOutOfRange,
bumpVersionsWithWorkspaceProtocolOnly,
snapshot
}: {
updateInternalDependencies: "patch" | "minor";
onlyUpdatePeerDependentsWhenOutOfRange: boolean;
bumpVersionsWithWorkspaceProtocolOnly?: boolean;
snapshot?: string | boolean | undefined;
}
) {
let { newVersion, packageJson } = release;
packageJson.version = newVersion;
for (let depType of DEPENDENCY_TYPES) {
let deps = packageJson[depType];
if (deps) {
for (let { name, version, type } of versionsToUpdate) {
let depCurrentVersion = deps[name];
if (
!depCurrentVersion ||
depCurrentVersion.startsWith("file:") ||
depCurrentVersion.startsWith("link:") ||
!shouldUpdateDependencyBasedOnConfig(
{ version, type },
{
depVersionRange: depCurrentVersion,
depType
},
{
minReleaseType: updateInternalDependencies,
onlyUpdatePeerDependentsWhenOutOfRange
}
)
) {
continue;
}
const usesWorkspaceRange = depCurrentVersion.startsWith("workspace:");
if (
!usesWorkspaceRange &&
bumpVersionsWithWorkspaceProtocolOnly === true
) {
continue;
}
if (usesWorkspaceRange) {
const workspaceDepVersion = depCurrentVersion.replace(
/^workspace:/,
""
);
if (
workspaceDepVersion === "*" ||
workspaceDepVersion === "^" ||
workspaceDepVersion === "~"
) {
continue;
}
depCurrentVersion = workspaceDepVersion;
}
if (
// an empty string is the normalised version of x/X/*
// we don't want to change these versions because they will match
// any version and if someone makes the range that
// they probably want it to stay like that...
new semver.Range(depCurrentVersion).range !== "" ||
// ...unless the current version of a dependency is a prerelease (which doesn't satisfy x/X/*)
// leaving those as is would leave the package in a non-installable state (wrong dep versions would get installed)
semver.prerelease(version) !== null
) {
let newNewRange = snapshot
? version
: `${getVersionRangeType(depCurrentVersion)}${version}`;
if (usesWorkspaceRange) newNewRange = `workspace:${newNewRange}`;
deps[name] = newNewRange;
}
}
}
}
return { ...release, packageJson };
}