diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts index 4a827520894f5e5b5cad5b7c42a8434614d46a84..4b0a360607d15830d2610e3fe796fc87506af28a 100644 --- a/lib/manager/npm/post-update/index.ts +++ b/lib/manager/npm/post-update/index.ts @@ -166,53 +166,61 @@ export async function writeExistingFiles( await remove(npmLockPath); } else { logger.debug(`Writing ${npmLock}`); - let existingNpmLock = await getFile(npmLock); - const npmLockParsed = JSON.parse(existingNpmLock); - const packageNames = Object.keys(npmLockParsed?.packages || {}); // lockfileVersion=2 - const widens = []; - let lockFileChanged = false; - for (const upgrade of config.upgrades) { - if ( - upgrade.rangeStrategy === 'widen' && - upgrade.npmLock === npmLock - ) { - widens.push(upgrade.depName); - } - const { depName } = upgrade; - for (const packageName of packageNames) { + let existingNpmLock: string; + let npmLockParsed: any; + try { + existingNpmLock = await getFile(npmLock); + npmLockParsed = JSON.parse(existingNpmLock); + } catch (err) { + logger.warn({ err }, 'Error parsing npm lock file'); + } + if (npmLockParsed) { + const packageNames = Object.keys(npmLockParsed?.packages || {}); // lockfileVersion=2 + const widens = []; + let lockFileChanged = false; + for (const upgrade of config.upgrades) { if ( - packageName === `node_modules/${depName}` || - packageName.startsWith(`node_modules/${depName}/`) + upgrade.rangeStrategy === 'widen' && + upgrade.npmLock === npmLock ) { - logger.trace({ packageName }, 'Massaging out package name'); - lockFileChanged = true; - delete npmLockParsed.packages[packageName]; + widens.push(upgrade.depName); } - } - } - if (widens.length) { - logger.debug( - `Removing ${String(widens)} from ${npmLock} to force an update` - ); - lockFileChanged = true; - try { - if (npmLockParsed.dependencies) { - widens.forEach((depName) => { - delete npmLockParsed.dependencies[depName]; - }); + const { depName } = upgrade; + for (const packageName of packageNames) { + if ( + packageName === `node_modules/${depName}` || + packageName.startsWith(`node_modules/${depName}/`) + ) { + logger.trace({ packageName }, 'Massaging out package name'); + lockFileChanged = true; + delete npmLockParsed.packages[packageName]; + } } - } catch (err) { - logger.warn( - { npmLock }, - 'Error massaging package-lock.json for widen' + } + if (widens.length) { + logger.debug( + `Removing ${String(widens)} from ${npmLock} to force an update` ); + lockFileChanged = true; + try { + if (npmLockParsed.dependencies) { + widens.forEach((depName) => { + delete npmLockParsed.dependencies[depName]; + }); + } + } catch (err) { + logger.warn( + { npmLock }, + 'Error massaging package-lock.json for widen' + ); + } } + if (lockFileChanged) { + logger.debug('Massaging npm lock file before writing to disk'); + existingNpmLock = JSON.stringify(npmLockParsed, null, 2); + } + await outputFile(npmLockPath, existingNpmLock); } - if (lockFileChanged) { - logger.debug('Massaging npm lock file before writing to disk'); - existingNpmLock = JSON.stringify(npmLockParsed, null, 2); - } - await outputFile(npmLockPath, existingNpmLock); } } const { yarnLock } = packageFile;