@jsenv/monorepo 0.0.1 → 0.0.2
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/package.json +1 -1
- package/src/main.js +1 -1
- package/src/sync_packages_versions.js +86 -82
- package/src/upgrade_external_versions.js +162 -0
- package/src/upgrade_packages_versions.js +0 -57
package/package.json
CHANGED
package/src/main.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { upgradeExternalVersions } from "./upgrade_external_versions.js";
|
|
2
2
|
export { syncPackagesVersions } from "./sync_packages_versions.js";
|
|
3
3
|
export { publishPackages } from "./publish_packages.js";
|
|
@@ -21,7 +21,7 @@ export const syncPackagesVersions = async ({
|
|
|
21
21
|
|
|
22
22
|
const outdatedPackageNames = [];
|
|
23
23
|
const toPublishPackageNames = [];
|
|
24
|
-
Object.keys(workspacePackages)
|
|
24
|
+
for (const packageName of Object.keys(workspacePackages)) {
|
|
25
25
|
const workspacePackage = workspacePackages[packageName];
|
|
26
26
|
const workspacePackageVersion = workspacePackage.packageObject.version;
|
|
27
27
|
const registryLatestVersion = registryLatestVersions[packageName];
|
|
@@ -34,7 +34,7 @@ export const syncPackagesVersions = async ({
|
|
|
34
34
|
);
|
|
35
35
|
if (result === VERSION_COMPARE_RESULTS.SMALLER) {
|
|
36
36
|
outdatedPackageNames.push(packageName);
|
|
37
|
-
|
|
37
|
+
continue;
|
|
38
38
|
}
|
|
39
39
|
if (!workspacePackage.packageObject.private) {
|
|
40
40
|
if (
|
|
@@ -44,7 +44,7 @@ export const syncPackagesVersions = async ({
|
|
|
44
44
|
toPublishPackageNames.push(packageName);
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
}
|
|
47
|
+
}
|
|
48
48
|
|
|
49
49
|
const versionUpdates = [];
|
|
50
50
|
const dependencyUpdates = [];
|
|
@@ -116,95 +116,99 @@ Use a tool like "git diff" to see the new versions and ensure this is what you w
|
|
|
116
116
|
workspacePackage.packageObject.version = to;
|
|
117
117
|
packageFilesToUpdate[packageName] = true;
|
|
118
118
|
};
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
dependencyType: "dependencies",
|
|
138
|
-
dependencyName,
|
|
139
|
-
from: versionInDependencies,
|
|
140
|
-
to: version,
|
|
141
|
-
});
|
|
142
|
-
if (!toPublishPackageNames.includes(packageName)) {
|
|
143
|
-
updateVersion({
|
|
119
|
+
dependencies: {
|
|
120
|
+
const dependencyGraph = buildDependencyGraph(workspacePackages);
|
|
121
|
+
const packageNamesOrderedByDependency =
|
|
122
|
+
orderByDependencies(dependencyGraph);
|
|
123
|
+
packageNamesOrderedByDependency.forEach((packageName) => {
|
|
124
|
+
const workspacePackage = workspacePackages[packageName];
|
|
125
|
+
const { dependencies = {} } = workspacePackage.packageObject;
|
|
126
|
+
Object.keys(dependencies).forEach((dependencyName) => {
|
|
127
|
+
const dependencyAsWorkspacePackage = workspacePackages[dependencyName];
|
|
128
|
+
if (!dependencyAsWorkspacePackage) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const versionInDependencies = dependencies[dependencyName];
|
|
132
|
+
const version = dependencyAsWorkspacePackage.packageObject.version;
|
|
133
|
+
if (versionInDependencies === version) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
updateDependencyVersion({
|
|
144
137
|
packageName,
|
|
145
|
-
|
|
146
|
-
|
|
138
|
+
dependencyType: "dependencies",
|
|
139
|
+
dependencyName,
|
|
140
|
+
from: versionInDependencies,
|
|
141
|
+
to: version,
|
|
147
142
|
});
|
|
148
|
-
if (!
|
|
149
|
-
|
|
143
|
+
if (!toPublishPackageNames.includes(packageName)) {
|
|
144
|
+
updateVersion({
|
|
145
|
+
packageName,
|
|
146
|
+
from: workspacePackage.packageObject.version,
|
|
147
|
+
to: increaseVersion(workspacePackage.packageObject.version),
|
|
148
|
+
});
|
|
149
|
+
if (!workspacePackage.packageObject.private) {
|
|
150
|
+
toPublishPackageNames.push(packageName);
|
|
151
|
+
}
|
|
150
152
|
}
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
Object.keys(workspacePackages).forEach((packageName) => {
|
|
155
|
-
const workspacePackage = workspacePackages[packageName];
|
|
156
|
-
const { devDependencies = {} } = workspacePackage.packageObject;
|
|
157
|
-
Object.keys(devDependencies).forEach((devDependencyName) => {
|
|
158
|
-
const devDependencyAsWorkspacePackage =
|
|
159
|
-
workspacePackages[devDependencyName];
|
|
160
|
-
if (!devDependencyAsWorkspacePackage) {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
const versionInDevDependencies = devDependencies[devDependencyName];
|
|
164
|
-
const version = devDependencyAsWorkspacePackage.packageObject.version;
|
|
165
|
-
if (versionInDevDependencies === version) {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
updateDependencyVersion({
|
|
169
|
-
packageName,
|
|
170
|
-
dependencyType: "devDependencies",
|
|
171
|
-
dependencyName: devDependencyName,
|
|
172
|
-
from: versionInDevDependencies,
|
|
173
|
-
to: version,
|
|
174
153
|
});
|
|
175
154
|
});
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
(
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
155
|
+
}
|
|
156
|
+
dev_dependencies: {
|
|
157
|
+
Object.keys(workspacePackages).forEach((packageName) => {
|
|
158
|
+
const workspacePackage = workspacePackages[packageName];
|
|
159
|
+
const { devDependencies = {} } = workspacePackage.packageObject;
|
|
160
|
+
Object.keys(devDependencies).forEach((devDependencyName) => {
|
|
161
|
+
const devDependencyAsWorkspacePackage =
|
|
162
|
+
workspacePackages[devDependencyName];
|
|
163
|
+
if (!devDependencyAsWorkspacePackage) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const versionInDevDependencies = devDependencies[devDependencyName];
|
|
167
|
+
const version = devDependencyAsWorkspacePackage.packageObject.version;
|
|
168
|
+
if (versionInDevDependencies === version) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
updateDependencyVersion({
|
|
172
|
+
packageName,
|
|
173
|
+
dependencyType: "devDependencies",
|
|
174
|
+
dependencyName: devDependencyName,
|
|
175
|
+
from: versionInDevDependencies,
|
|
176
|
+
to: version,
|
|
177
|
+
});
|
|
199
178
|
});
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
package_relations: {
|
|
182
|
+
Object.keys(packagesRelations).forEach((packageName) => {
|
|
183
|
+
const relatedPackageNames = packagesRelations[packageName];
|
|
184
|
+
const someRelatedPackageUpdated = relatedPackageNames.some(
|
|
185
|
+
(relatedPackageName) => {
|
|
186
|
+
return (
|
|
187
|
+
dependencyUpdates.some(
|
|
188
|
+
(dependencyUpdate) =>
|
|
189
|
+
dependencyUpdate.packageName === relatedPackageName,
|
|
190
|
+
) ||
|
|
191
|
+
versionUpdates.some(
|
|
192
|
+
(versionUpdate) =>
|
|
193
|
+
versionUpdate.packageName === relatedPackageName,
|
|
194
|
+
)
|
|
195
|
+
);
|
|
196
|
+
},
|
|
197
|
+
);
|
|
198
|
+
if (someRelatedPackageUpdated) {
|
|
199
|
+
const packageInfo = workspacePackages[packageName];
|
|
200
|
+
updateVersion({
|
|
201
|
+
packageName,
|
|
202
|
+
from: packageInfo.packageObject.version,
|
|
203
|
+
to: increaseVersion(packageInfo.packageObject.version),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
203
208
|
Object.keys(packageFilesToUpdate).forEach((packageName) => {
|
|
204
209
|
const workspacePackage = workspacePackages[packageName];
|
|
205
210
|
workspacePackage.updateFile(workspacePackage.packageObject);
|
|
206
211
|
});
|
|
207
|
-
|
|
208
212
|
const updateCount = versionUpdates.length + dependencyUpdates.length;
|
|
209
213
|
if (updateCount === 0) {
|
|
210
214
|
console.log(`${UNICODE.OK} all versions in package.json files are in sync`);
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { UNICODE, createTaskLog } from "@jsenv/log";
|
|
2
|
+
import { fetchLatestInRegistry } from "@jsenv/package-publish/src/internal/fetchLatestInRegistry.js";
|
|
3
|
+
|
|
4
|
+
import { collectWorkspacePackages } from "./internal/collect_workspace_packages.js";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
compareTwoPackageVersions,
|
|
8
|
+
VERSION_COMPARE_RESULTS,
|
|
9
|
+
} from "./internal/compare_two_package_versions.js";
|
|
10
|
+
|
|
11
|
+
export const upgradeExternalVersions = async ({ directoryUrl }) => {
|
|
12
|
+
const internalPackages = await collectWorkspacePackages({ directoryUrl });
|
|
13
|
+
let externalPackages = {};
|
|
14
|
+
collect_external_packages: {
|
|
15
|
+
const addExternalPackage = ({
|
|
16
|
+
internalPackageName,
|
|
17
|
+
name,
|
|
18
|
+
type,
|
|
19
|
+
version,
|
|
20
|
+
}) => {
|
|
21
|
+
// ignore local deps
|
|
22
|
+
if (
|
|
23
|
+
version.startsWith("./") ||
|
|
24
|
+
version.startsWith("../") ||
|
|
25
|
+
version.startsWith("file:")
|
|
26
|
+
) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const existing = externalPackages[name];
|
|
30
|
+
if (existing) {
|
|
31
|
+
externalPackages[name].push({
|
|
32
|
+
internalPackageName,
|
|
33
|
+
type,
|
|
34
|
+
version,
|
|
35
|
+
});
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
externalPackages[name] = [];
|
|
39
|
+
externalPackages[name].push({
|
|
40
|
+
internalPackageName,
|
|
41
|
+
type,
|
|
42
|
+
version,
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
for (const internalPackageName of Object.keys(internalPackages)) {
|
|
46
|
+
const internalPackage = internalPackages[internalPackageName];
|
|
47
|
+
const internalPackageObject = internalPackage.packageObject;
|
|
48
|
+
const {
|
|
49
|
+
dependencies = {},
|
|
50
|
+
devDependencies = {},
|
|
51
|
+
peerDependencies = {},
|
|
52
|
+
} = internalPackageObject;
|
|
53
|
+
const dependencyNames = Object.keys(dependencies);
|
|
54
|
+
dependencyNames.forEach((dependencyName) => {
|
|
55
|
+
addExternalPackage({
|
|
56
|
+
internalPackageName,
|
|
57
|
+
type: "dependencies",
|
|
58
|
+
name: dependencyName,
|
|
59
|
+
version: dependencies[dependencyName],
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
const devDependencyNames = Object.keys(devDependencies);
|
|
63
|
+
devDependencyNames.forEach((devDependencyName) => {
|
|
64
|
+
addExternalPackage({
|
|
65
|
+
internalPackageName,
|
|
66
|
+
type: "devDependencies",
|
|
67
|
+
name: devDependencyName,
|
|
68
|
+
version: dependencies[devDependencyName],
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
const peerDependencyNames = Object.keys(peerDependencies);
|
|
72
|
+
peerDependencyNames.forEach((peerDependencyName) => {
|
|
73
|
+
addExternalPackage({
|
|
74
|
+
internalPackageName,
|
|
75
|
+
type: "peerDependencies",
|
|
76
|
+
name: peerDependencyName,
|
|
77
|
+
version: dependencies[peerDependencyName],
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const externalPackageNames = Object.keys(externalPackages);
|
|
83
|
+
console.log(
|
|
84
|
+
`${UNICODE.INFO} ${externalPackageNames.length} external packages found`,
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
const latestVersions = {};
|
|
88
|
+
fetch_latest_versions: {
|
|
89
|
+
let done = 0;
|
|
90
|
+
const total = externalPackageNames.length;
|
|
91
|
+
const fetchTask = createTaskLog(`fetch latest versions`);
|
|
92
|
+
try {
|
|
93
|
+
await Promise.all(
|
|
94
|
+
externalPackageNames.map(async (externalPackageName) => {
|
|
95
|
+
const latestPackageInRegistry = await fetchLatestInRegistry({
|
|
96
|
+
registryUrl: "https://registry.npmjs.org",
|
|
97
|
+
packageName: externalPackageName,
|
|
98
|
+
});
|
|
99
|
+
if (latestPackageInRegistry === null) {
|
|
100
|
+
throw new Error(`${externalPackageName} not found on NPM registry`);
|
|
101
|
+
}
|
|
102
|
+
const registryLatestVersion = latestPackageInRegistry.version;
|
|
103
|
+
latestVersions[externalPackageName] = registryLatestVersion;
|
|
104
|
+
done++;
|
|
105
|
+
fetchTask.setRightText(`${done}/${total}`);
|
|
106
|
+
}),
|
|
107
|
+
);
|
|
108
|
+
fetchTask.done();
|
|
109
|
+
} catch (e) {
|
|
110
|
+
fetchTask.fail();
|
|
111
|
+
throw e;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const packageFilesToUpdate = {};
|
|
116
|
+
const updates = [];
|
|
117
|
+
for (const externalPackageName of externalPackageNames) {
|
|
118
|
+
const externalPackageRefs = externalPackageNames[externalPackageName];
|
|
119
|
+
for (const externalPackageRef of externalPackageRefs) {
|
|
120
|
+
const internalPackageName = externalPackageRef.internalPackageName;
|
|
121
|
+
const internalPackageDeps =
|
|
122
|
+
internalPackages[internalPackageName].packageObject[
|
|
123
|
+
externalPackageRef.type
|
|
124
|
+
];
|
|
125
|
+
const versionDeclared = internalPackageDeps[externalPackageName];
|
|
126
|
+
const registryLatestVersion = latestVersions[externalPackageName];
|
|
127
|
+
const comparisonResult = compareTwoPackageVersions(
|
|
128
|
+
versionDeclared,
|
|
129
|
+
registryLatestVersion,
|
|
130
|
+
);
|
|
131
|
+
if (comparisonResult === VERSION_COMPARE_RESULTS.GREATER) {
|
|
132
|
+
console.warn(
|
|
133
|
+
`${UNICODE.WARNING} ${externalPackageName} version declared in ${internalPackageName} "${externalPackageRef.type}" (${versionDeclared}) is greater than latest version in registry (${registryLatestVersion})`,
|
|
134
|
+
);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (comparisonResult === VERSION_COMPARE_RESULTS.SMALLER) {
|
|
138
|
+
updates.push({
|
|
139
|
+
packageName: internalPackageName,
|
|
140
|
+
dependencyName: externalPackageName,
|
|
141
|
+
from: versionDeclared,
|
|
142
|
+
to: registryLatestVersion,
|
|
143
|
+
});
|
|
144
|
+
internalPackageDeps[externalPackageName] = registryLatestVersion;
|
|
145
|
+
packageFilesToUpdate[internalPackageName] = true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
Object.keys(packageFilesToUpdate).forEach((packageName) => {
|
|
150
|
+
const internalPackage = internalPackages[packageName];
|
|
151
|
+
internalPackage.updateFile(internalPackage.packageObject);
|
|
152
|
+
});
|
|
153
|
+
if (updates.length === 0) {
|
|
154
|
+
console.log(`${UNICODE.OK} all versions in package.json files are in sync`);
|
|
155
|
+
} else {
|
|
156
|
+
console.log(
|
|
157
|
+
`${UNICODE.INFO} ${updates.length} versions modified in package.json files
|
|
158
|
+
Use a tool like "git diff" to review these changes then run "npm install"`,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
return updates;
|
|
162
|
+
};
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { UNICODE } from "@jsenv/log";
|
|
2
|
-
|
|
3
|
-
import { collectWorkspacePackages } from "./internal/collect_workspace_packages.js";
|
|
4
|
-
import { fetchWorkspaceLatests } from "./internal/fetch_workspace_latests.js";
|
|
5
|
-
import {
|
|
6
|
-
compareTwoPackageVersions,
|
|
7
|
-
VERSION_COMPARE_RESULTS,
|
|
8
|
-
} from "./internal/compare_two_package_versions.js";
|
|
9
|
-
|
|
10
|
-
export const upgradePackagesVersions = async ({ directoryUrl }) => {
|
|
11
|
-
const workspacePackages = await collectWorkspacePackages({ directoryUrl });
|
|
12
|
-
const registryLatestVersions = await fetchWorkspaceLatests(workspacePackages);
|
|
13
|
-
|
|
14
|
-
const outdatedPackageNames = [];
|
|
15
|
-
const toPublishPackageNames = [];
|
|
16
|
-
Object.keys(workspacePackages).forEach((packageName) => {
|
|
17
|
-
const workspacePackage = workspacePackages[packageName];
|
|
18
|
-
const workspacePackageVersion = workspacePackage.packageObject.version;
|
|
19
|
-
const registryLatestVersion = registryLatestVersions[packageName];
|
|
20
|
-
const result =
|
|
21
|
-
registryLatestVersion === null
|
|
22
|
-
? VERSION_COMPARE_RESULTS.GREATER
|
|
23
|
-
: compareTwoPackageVersions(
|
|
24
|
-
workspacePackageVersion,
|
|
25
|
-
registryLatestVersion,
|
|
26
|
-
);
|
|
27
|
-
if (result === VERSION_COMPARE_RESULTS.SMALLER) {
|
|
28
|
-
outdatedPackageNames.push(packageName);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
if (!workspacePackage.packageObject.private) {
|
|
32
|
-
if (
|
|
33
|
-
result === VERSION_COMPARE_RESULTS.GREATER ||
|
|
34
|
-
result === VERSION_COMPARE_RESULTS.DIFF_TAG
|
|
35
|
-
) {
|
|
36
|
-
toPublishPackageNames.push(packageName);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
const updates = [];
|
|
42
|
-
if (outdatedPackageNames.length === 0) {
|
|
43
|
-
console.log(`${UNICODE.OK} all versions are up-to-date`);
|
|
44
|
-
return updates;
|
|
45
|
-
}
|
|
46
|
-
for (const outdatedPackageName of outdatedPackageNames) {
|
|
47
|
-
const workspacePackage = workspacePackages[outdatedPackageName];
|
|
48
|
-
workspacePackage.packageObject.version =
|
|
49
|
-
registryLatestVersions[outdatedPackageName];
|
|
50
|
-
workspacePackage.updateFile(workspacePackage.packageObject);
|
|
51
|
-
}
|
|
52
|
-
console.log(
|
|
53
|
-
`${UNICODE.INFO} ${outdatedPackageNames.length} packages versions upgraded
|
|
54
|
-
Use a tool like "git diff" to see the new versions then run "npm install"`,
|
|
55
|
-
);
|
|
56
|
-
return updates;
|
|
57
|
-
};
|