@@ -12,10 +12,8 @@ const {
12
12
13
13
const UPDATE_CONFIGS = require ( './update-dependencies-config' ) ;
14
14
15
- async function hoistSharedDependencies ( newVersions ) {
15
+ async function hoistSharedDependencies ( root , newVersions ) {
16
16
try {
17
- const root = await findMonorepoRoot ( ) ;
18
-
19
17
await withProgress ( 'Cleaning up existing node_modules' , async ( ) => {
20
18
await runInDir ( "npx lerna exec 'rm -Rf node_modules'" , root ) ;
21
19
await runInDir ( 'rm -Rf node_modules' , root ) ;
@@ -71,6 +69,55 @@ async function getVersion(depSpec) {
71
69
return [ name , version . trim ( ) ] ;
72
70
}
73
71
72
+ function updateDependencies ( packageJson , newVersions ) {
73
+ for ( const depType of [
74
+ 'dependencies' ,
75
+ 'devDependencies' ,
76
+ 'peerDependencies' ,
77
+ 'optionalDependencies' ,
78
+ ] ) {
79
+ if ( packageJson [ depType ] ) {
80
+ for ( const packageName of Object . keys ( packageJson [ depType ] ) ) {
81
+ if ( packageJson [ depType ] [ packageName ] && newVersions [ packageName ] ) {
82
+ packageJson [ depType ] [ packageName ] = `^${ newVersions [ packageName ] } ` ;
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
88
+
89
+ /**
90
+ * example overrides config:
91
+ *
92
+ * {
93
+ * "overrides": {
94
+ * "@npm /foo": "1.0.0",
95
+ * "@npm/bar": {
96
+ * ".": "1.0.0",
97
+ * "@npm /buz": "1.0.0"
98
+ * },
99
+ * "@npm/a": {
100
+ * "@npm /b": {
101
+ * "@npm /c": "1.0.0"
102
+ * }
103
+ * }
104
+ * }
105
+ * }
106
+ *
107
+ * https://docs.npmjs.com/cli/v11/configuring-npm/package-json#overrides
108
+ */
109
+ function updateOverrides ( overrides , newVersions , parent ) {
110
+ for ( const name of Object . keys ( overrides ?? { } ) ) {
111
+ if ( typeof overrides [ name ] === 'string' && newVersions [ name ] ) {
112
+ overrides [ name ] = `^${ newVersions [ name ] } ` ;
113
+ } else if ( name === '.' && parent && newVersions [ parent ] ) {
114
+ overrides [ name ] = `^${ newVersions [ name ] } ` ;
115
+ } else if ( typeof overrides [ name ] === 'object' ) {
116
+ updateOverrides ( overrides [ name ] , newVersions , name ) ;
117
+ }
118
+ }
119
+ }
120
+
74
121
async function main ( ) {
75
122
let dependencies ;
76
123
@@ -124,29 +171,17 @@ async function main() {
124
171
const newVersionsObj = Object . fromEntries ( newVersions ) ;
125
172
let hasChanged ;
126
173
174
+ const monorepoRoot = await findMonorepoRoot ( ) ;
175
+ const workspaces = [ monorepoRoot ] . concat (
176
+ await Array . fromAsync ( listAllPackages ( ) , ( workspace ) => workspace . location )
177
+ ) ;
178
+
127
179
await withProgress ( 'Updating package.json in workspaces' , async ( ) => {
128
- for await ( const props of listAllPackages ( ) ) {
129
- await updatePackageJson ( props . location , ( packageJson ) => {
180
+ for ( const workspacePath of workspaces ) {
181
+ await updatePackageJson ( workspacePath , ( packageJson ) => {
130
182
const origPackageJson = cloneDeep ( packageJson ) ;
131
- for ( const depType of [
132
- 'dependencies' ,
133
- 'devDependencies' ,
134
- 'peerDependencies' ,
135
- 'optionalDependencies' ,
136
- ] ) {
137
- if ( packageJson [ depType ] ) {
138
- for ( const packageName of Object . keys ( packageJson [ depType ] ) ) {
139
- if (
140
- packageJson [ depType ] [ packageName ] &&
141
- newVersionsObj [ packageName ]
142
- ) {
143
- packageJson [ depType ] [
144
- packageName
145
- ] = `^${ newVersionsObj [ packageName ] } ` ;
146
- }
147
- }
148
- }
149
- }
183
+ updateDependencies ( packageJson , newVersionsObj ) ;
184
+ updateOverrides ( packageJson . overrides , newVersionsObj ) ;
150
185
hasChanged = hasChanged || ! isEqual ( origPackageJson , packageJson ) ;
151
186
return packageJson ;
152
187
} ) ;
@@ -159,7 +194,7 @@ async function main() {
159
194
return ;
160
195
}
161
196
162
- await hoistSharedDependencies ( newVersions ) ;
197
+ await hoistSharedDependencies ( monorepoRoot , newVersions ) ;
163
198
164
199
console . log ( ) ;
165
200
console . log ( 'Successfully updated dependencies' ) ;
0 commit comments