@@ -12,10 +12,8 @@ const {
1212
1313const UPDATE_CONFIGS = require ( './update-dependencies-config' ) ;
1414
15- async function hoistSharedDependencies ( newVersions ) {
15+ async function hoistSharedDependencies ( root , newVersions ) {
1616 try {
17- const root = await findMonorepoRoot ( ) ;
18-
1917 await withProgress ( 'Cleaning up existing node_modules' , async ( ) => {
2018 await runInDir ( "npx lerna exec 'rm -Rf node_modules'" , root ) ;
2119 await runInDir ( 'rm -Rf node_modules' , root ) ;
@@ -71,6 +69,55 @@ async function getVersion(depSpec) {
7169 return [ name , version . trim ( ) ] ;
7270}
7371
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+
74121async function main ( ) {
75122 let dependencies ;
76123
@@ -124,29 +171,17 @@ async function main() {
124171 const newVersionsObj = Object . fromEntries ( newVersions ) ;
125172 let hasChanged ;
126173
174+ const monorepoRoot = await findMonorepoRoot ( ) ;
175+ const workspaces = [ monorepoRoot ] . concat (
176+ await Array . fromAsync ( listAllPackages ( ) , ( workspace ) => workspace . location )
177+ ) ;
178+
127179 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 ) => {
130182 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 ) ;
150185 hasChanged = hasChanged || ! isEqual ( origPackageJson , packageJson ) ;
151186 return packageJson ;
152187 } ) ;
@@ -159,7 +194,7 @@ async function main() {
159194 return ;
160195 }
161196
162- await hoistSharedDependencies ( newVersions ) ;
197+ await hoistSharedDependencies ( monorepoRoot , newVersions ) ;
163198
164199 console . log ( ) ;
165200 console . log ( 'Successfully updated dependencies' ) ;
0 commit comments