@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/monorepo",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Helpers to manage packages in a monorepo",
5
5
  "license": "MIT",
6
6
  "author": {
package/src/main.js CHANGED
@@ -1,3 +1,3 @@
1
- export { upgradePackagesVersions } from "./upgrade_packages_versions.js";
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).forEach((packageName) => {
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
- return;
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
- const dependencyGraph = buildDependencyGraph(workspacePackages);
121
- const packageNamesOrderedByDependency = orderByDependencies(dependencyGraph);
122
- packageNamesOrderedByDependency.forEach((packageName) => {
123
- const workspacePackage = workspacePackages[packageName];
124
- const { dependencies = {} } = workspacePackage.packageObject;
125
- Object.keys(dependencies).forEach((dependencyName) => {
126
- const dependencyAsWorkspacePackage = workspacePackages[dependencyName];
127
- if (!dependencyAsWorkspacePackage) {
128
- return;
129
- }
130
- const versionInDependencies = dependencies[dependencyName];
131
- const version = dependencyAsWorkspacePackage.packageObject.version;
132
- if (versionInDependencies === version) {
133
- return;
134
- }
135
- updateDependencyVersion({
136
- packageName,
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
- from: workspacePackage.packageObject.version,
146
- to: increaseVersion(workspacePackage.packageObject.version),
138
+ dependencyType: "dependencies",
139
+ dependencyName,
140
+ from: versionInDependencies,
141
+ to: version,
147
142
  });
148
- if (!workspacePackage.packageObject.private) {
149
- toPublishPackageNames.push(packageName);
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
- Object.keys(packagesRelations).forEach((packageName) => {
179
- const relatedPackageNames = packagesRelations[packageName];
180
- const someRelatedPackageUpdated = relatedPackageNames.some(
181
- (relatedPackageName) => {
182
- return (
183
- dependencyUpdates.some(
184
- (dependencyUpdate) =>
185
- dependencyUpdate.packageName === relatedPackageName,
186
- ) ||
187
- versionUpdates.some(
188
- (versionUpdate) => versionUpdate.packageName === relatedPackageName,
189
- )
190
- );
191
- },
192
- );
193
- if (someRelatedPackageUpdated) {
194
- const packageInfo = workspacePackages[packageName];
195
- updateVersion({
196
- packageName,
197
- from: packageInfo.packageObject.version,
198
- to: increaseVersion(packageInfo.packageObject.version),
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
- };