@@ -96,7 +96,7 @@ export async function pnpmFix(
9696 spinner ?. start ( )
9797
9898 let actualTree : NodeClass | undefined
99- let lockSrc : string | null = pkgEnvDetails . lockSrc
99+ let lockSrc : string = pkgEnvDetails . lockSrc
100100 let lockfile = parsePnpmLockfile ( lockSrc )
101101 // Update pnpm-lock.yaml if its version is older than what the installed pnpm
102102 // produces.
@@ -109,11 +109,13 @@ export async function pnpmFix(
109109 cwd,
110110 spinner,
111111 } )
112- lockSrc = maybeActualTree
113- ? await readLockfile ( pkgEnvDetails . lockPath )
114- : null
115- if ( lockSrc && maybeActualTree ) {
116- actualTree = maybeActualTree
112+ if ( maybeActualTree ) {
113+ lockSrc = ( await readLockfile ( pkgEnvDetails . lockPath ) ) ?? ''
114+ } else {
115+ lockSrc = ''
116+ }
117+ if ( lockSrc ) {
118+ actualTree = maybeActualTree !
117119 lockfile = parsePnpmLockfile ( lockSrc )
118120 } else {
119121 lockfile = null
@@ -165,23 +167,23 @@ export async function pnpmFix(
165167 vulnerableVersionRange ,
166168 options ,
167169 ) {
168- const isWorkspaceRoot =
169- editablePkgJson . filename === pkgEnvDetails . editablePkgJson . filename
170- // Get current overrides for revert logic.
171- const { overrides : oldOverrides } = getOverridesDataPnpm (
172- pkgEnvDetails ,
173- editablePkgJson . content ,
174- )
175- const oldPnpmSection = editablePkgJson . content [ PNPM ] as
176- | StringKeyValueObject
177- | undefined
178- const overrideKey = `${ packument . name } @${ vulnerableVersionRange } `
170+ lockSrc = ( await readLockfile ( pkgEnvDetails . lockPath ) ) ?? ''
179171
180- lockSrc = await readLockfile ( pkgEnvDetails . lockPath )
181- revertOverrides = undefined
182- revertOverridesSrc = extractOverridesFromPnpmLockSrc ( lockSrc )
172+ // Update overrides for the root workspace.
173+ if (
174+ editablePkgJson . filename === pkgEnvDetails . editablePkgJson . filename
175+ ) {
176+ const { overrides : oldOverrides } = getOverridesDataPnpm (
177+ pkgEnvDetails ,
178+ editablePkgJson . content ,
179+ )
180+ const oldPnpmSection = editablePkgJson . content [ PNPM ] as
181+ | StringKeyValueObject
182+ | undefined
183+ const overrideKey = `${ packument . name } @${ vulnerableVersionRange } `
183184
184- if ( isWorkspaceRoot ) {
185+ revertOverridesSrc = extractOverridesFromPnpmLockSrc ( lockSrc )
186+ // Track existing overrides in the root package.json to revert to later.
185187 revertOverrides = {
186188 [ PNPM ] : oldPnpmSection
187189 ? {
@@ -191,9 +193,11 @@ export async function pnpmFix(
191193 ...oldOverrides ,
192194 [ overrideKey ] : undefined ,
193195 }
194- : undefined ,
196+ : // Properties with undefined values are deleted when saved as JSON.
197+ undefined ,
195198 }
196- : undefined ,
199+ : // Properties with undefined values are deleted when saved as JSON.
200+ undefined ,
197201 } as PackageJson
198202 // Update overrides in the root package.json so that when `pnpm install`
199203 // generates pnpm-lock.yaml it updates transitive dependencies too.
@@ -210,10 +214,15 @@ export async function pnpmFix(
210214 } ,
211215 } ,
212216 } )
217+ } else {
218+ revertOverrides = undefined
219+ revertOverridesSrc = ''
213220 }
214-
215221 revertData = {
222+ // If "pnpm" or "pnpm.overrides" fields are undefined they will be
223+ // deleted when saved.
216224 ...revertOverrides ,
225+ // Track existing dependencies in the root package.json to revert to later.
217226 ...( editablePkgJson . content . dependencies && {
218227 dependencies : { ...editablePkgJson . content . dependencies } ,
219228 } ) ,
@@ -232,22 +241,34 @@ export async function pnpmFix(
232241 // Revert overrides metadata in package.json now that pnpm-lock.yaml
233242 // has been updated.
234243 editablePkgJson . update ( revertOverrides )
244+ await editablePkgJson . save ( { ignoreWhitespace : true } )
235245 }
236- await editablePkgJson . save ( { ignoreWhitespace : true } )
237-
238- lockSrc = await readLockfile ( pkgEnvDetails . lockPath )
239- const updatedOverridesContent = extractOverridesFromPnpmLockSrc ( lockSrc )
240- if ( updatedOverridesContent ) {
241- lockSrc = lockSrc ! . replace (
242- updatedOverridesContent ,
243- revertOverridesSrc ,
244- )
245- await fs . writeFile ( pkgEnvDetails . lockPath , lockSrc , 'utf8' )
246+ lockSrc = ( await readLockfile ( pkgEnvDetails . lockPath ) ) ?? ''
247+ // Remove "overrides" block from pnpm-lock.yaml lockfile when processing
248+ // the root workspace.
249+ if (
250+ editablePkgJson . filename === pkgEnvDetails . editablePkgJson . filename
251+ ) {
252+ const updatedOverridesContent =
253+ extractOverridesFromPnpmLockSrc ( lockSrc )
254+ if ( updatedOverridesContent ) {
255+ // Remove "overrides" block from pnpm-lock.yaml lockfile.
256+ lockSrc = lockSrc ! . replace (
257+ updatedOverridesContent ,
258+ revertOverridesSrc ,
259+ )
260+ // Save pnpm-lock.yaml lockfile.
261+ await fs . writeFile ( pkgEnvDetails . lockPath , lockSrc , 'utf8' )
262+ }
246263 }
247264 } ,
248265 async revertInstall ( editablePkgJson ) {
249266 if ( revertData ) {
267+ // Revert package.json.
250268 editablePkgJson . update ( revertData )
269+ await editablePkgJson . save ( { ignoreWhitespace : true } )
270+ // Revert pnpm-lock.yaml lockfile to be on the safe side.
271+ await fs . writeFile ( pkgEnvDetails . lockPath , lockSrc , 'utf8' )
251272 }
252273 } ,
253274 } ,
0 commit comments