From fca96a0ddefba31baf49e676ce0dadd8c8699ec0 Mon Sep 17 00:00:00 2001 From: skrtheboss Date: Wed, 14 Dec 2022 20:54:22 +0100 Subject: [PATCH] fix(core): fix lock file pruning optional dependencies --- .../nx/src/lock-file/__fixtures__/npm.lock.ts | 151 ++++++++++++++++++ .../src/lock-file/__fixtures__/pnpm.lock.ts | 64 ++++++++ .../src/lock-file/__fixtures__/yarn.lock.ts | 58 +++++++ packages/nx/src/lock-file/npm.spec.ts | 16 ++ packages/nx/src/lock-file/pnpm.spec.ts | 16 ++ packages/nx/src/lock-file/pnpm.ts | 5 +- .../nx/src/lock-file/utils/lock-file-type.ts | 2 + packages/nx/src/lock-file/yarn.spec.ts | 34 ++-- packages/nx/src/lock-file/yarn.ts | 9 +- 9 files changed, 340 insertions(+), 15 deletions(-) diff --git a/packages/nx/src/lock-file/__fixtures__/npm.lock.ts b/packages/nx/src/lock-file/__fixtures__/npm.lock.ts index 4e58f980f18500..873ae66a48f4b3 100644 --- a/packages/nx/src/lock-file/__fixtures__/npm.lock.ts +++ b/packages/nx/src/lock-file/__fixtures__/npm.lock.ts @@ -22642,3 +22642,154 @@ export const lockFileV1YargsAndDevkitOnly = `{ } } `; + +export const ssh2LockFile = `{ + "name": "test", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "test", + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "ssh2": "1.11.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/buildcheck": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", + "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/cpu-features": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", + "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", + "optional": true, + "hasInstallScript": true, + "dependencies": { + "buildcheck": "0.0.3", + "nan": "^2.15.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/ssh2": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", + "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.4", + "nan": "^2.16.0" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + } + }, + "dependencies": { + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "buildcheck": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", + "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", + "optional": true + }, + "cpu-features": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", + "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", + "optional": true, + "requires": { + "buildcheck": "0.0.3", + "nan": "^2.15.0" + } + }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "ssh2": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", + "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "requires": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2", + "cpu-features": "~0.0.4", + "nan": "^2.16.0" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + } + } +} +`; diff --git a/packages/nx/src/lock-file/__fixtures__/pnpm.lock.ts b/packages/nx/src/lock-file/__fixtures__/pnpm.lock.ts index 4a00a92906d847..cd1f5e19c2f967 100644 --- a/packages/nx/src/lock-file/__fixtures__/pnpm.lock.ts +++ b/packages/nx/src/lock-file/__fixtures__/pnpm.lock.ts @@ -6739,3 +6739,67 @@ packages: yargs-parser: 21.1.1 dev: false `; + +export const ssh2LockFile = `lockfileVersion: 5.4 + +specifiers: + ssh2: 1.11.0 + +dependencies: + ssh2: 1.11.0 + +packages: + + /asn1/0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /bcrypt-pbkdf/1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: false + + /buildcheck/0.0.3: + resolution: {integrity: sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==} + engines: {node: '>=10.0.0'} + dev: false + optional: true + + /cpu-features/0.0.4: + resolution: {integrity: sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + buildcheck: 0.0.3 + nan: 2.17.0 + dev: false + optional: true + + /nan/2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + dev: false + optional: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /ssh2/1.11.0: + resolution: {integrity: sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==} + engines: {node: '>=10.16.0'} + requiresBuild: true + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.4 + nan: 2.17.0 + dev: false + + /tweetnacl/0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: false +`; diff --git a/packages/nx/src/lock-file/__fixtures__/yarn.lock.ts b/packages/nx/src/lock-file/__fixtures__/yarn.lock.ts index 756021a741079e..25aa2c6d976377 100644 --- a/packages/nx/src/lock-file/__fixtures__/yarn.lock.ts +++ b/packages/nx/src/lock-file/__fixtures__/yarn.lock.ts @@ -7502,3 +7502,61 @@ __metadata: languageName: node linkType: hard `; + +export const ssh2LockFile = `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +asn1@^0.2.4: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +bcrypt-pbkdf@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +buildcheck@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.3.tgz#70451897a95d80f7807e68fc412eb2e7e35ff4d5" + integrity sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA== + +cpu-features@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.4.tgz#0023475bb4f4c525869c162e4108099e35bf19d8" + integrity sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A== + dependencies: + buildcheck "0.0.3" + nan "^2.15.0" + +nan@^2.15.0, nan@^2.16.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +ssh2@1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.11.0.tgz#ce60186216971e12f6deb553dcf82322498fe2e4" + integrity sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw== + dependencies: + asn1 "^0.2.4" + bcrypt-pbkdf "^1.0.2" + optionalDependencies: + cpu-features "~0.0.4" + nan "^2.16.0" + +tweetnacl@^0.14.3: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +`; diff --git a/packages/nx/src/lock-file/npm.spec.ts b/packages/nx/src/lock-file/npm.spec.ts index 24af232e912164..9717a5948ac533 100644 --- a/packages/nx/src/lock-file/npm.spec.ts +++ b/packages/nx/src/lock-file/npm.spec.ts @@ -13,6 +13,7 @@ import { lockFileV1JustTypescript, lockFileV1YargsAndDevkitOnly, lockFileV2YargsAndDevkitOnly, + ssh2LockFile, } from './__fixtures__/npm.lock'; import { vol } from 'memfs'; import { npmLockFileWithWorkspaces } from './__fixtures__/workspaces.lock'; @@ -38,6 +39,13 @@ const YargsAndDevkitPackage = { version: '0.0.0', dependencies: { '@nrwl/devkit': '15.0.13', yargs: '17.6.2' }, }; +const Ssh2Package = { + name: 'test', + version: '0.0.0', + dependencies: { + ssh2: '1.11.0', + }, +}; describe('npm LockFile utility', () => { describe('v3', () => { @@ -158,6 +166,14 @@ describe('npm LockFile utility', () => { ) ).toEqual(JSON.parse(lockFileV3YargsAndDevkitOnly)); }); + + it('should correctly prune lockfile with package that has optional dependencies', () => { + expect( + stringifyNpmLockFile( + pruneNpmLockFile(parseNpmLockFile(ssh2LockFile), Ssh2Package) + ) + ).toEqual(ssh2LockFile); + }); }); describe('v2', () => { diff --git a/packages/nx/src/lock-file/pnpm.spec.ts b/packages/nx/src/lock-file/pnpm.spec.ts index 16ccb40ee3b441..9b11f1112da439 100644 --- a/packages/nx/src/lock-file/pnpm.spec.ts +++ b/packages/nx/src/lock-file/pnpm.spec.ts @@ -8,6 +8,7 @@ import { lockFileJustTypescript, lockFileWithInlineSpecifiers, lockFileYargsAndDevkit, + ssh2LockFile, } from './__fixtures__/pnpm.lock'; import { pnpmLockFileWithInlineSpecifiersAndWorkspaces, @@ -24,6 +25,13 @@ const YargsAndDevkitPackage = { version: '1.2.3', dependencies: { '@nrwl/devkit': '15.0.13', yargs: '17.6.2' }, }; +const Ssh2Package = { + name: 'test', + version: '0.0.0', + dependencies: { + ssh2: '1.11.0', + }, +}; describe('pnpm LockFile utility', () => { describe('standard lock file', () => { @@ -153,6 +161,14 @@ describe('pnpm LockFile utility', () => { ) ).toEqual(lockFileYargsAndDevkit); }); + + it('should correctly prune lockfile with package that has optional dependencies', () => { + expect( + stringifyPnpmLockFile( + prunePnpmLockFile(parsePnpmLockFile(ssh2LockFile), Ssh2Package) + ) + ).toEqual(ssh2LockFile); + }); }); it('should parse lockfile with time-based resolution and workspaces', () => { diff --git a/packages/nx/src/lock-file/pnpm.ts b/packages/nx/src/lock-file/pnpm.ts index 2080fcb0a40390..a6f14a0a7224b1 100644 --- a/packages/nx/src/lock-file/pnpm.ts +++ b/packages/nx/src/lock-file/pnpm.ts @@ -539,7 +539,10 @@ function pruneTransitiveDependencies( rootVersion: false, packageMeta: [packageMeta], }); - if (parent.optionalDependencies?.[packageName]) { + if ( + parent.packageMeta[0].optional || + parent.optionalDependencies?.[packageName] + ) { packageMeta.optional = true; } pruneTransitiveDependencies( diff --git a/packages/nx/src/lock-file/utils/lock-file-type.ts b/packages/nx/src/lock-file/utils/lock-file-type.ts index 41dd2b8fc3b667..3d6650494f3a01 100644 --- a/packages/nx/src/lock-file/utils/lock-file-type.ts +++ b/packages/nx/src/lock-file/utils/lock-file-type.ts @@ -3,6 +3,8 @@ export interface PackageDependency { rootVersion?: boolean; packageMeta: any[]; dependencies?: Record; + + optionalDependencies?: Record; name?: string; [key: string]: any; } diff --git a/packages/nx/src/lock-file/yarn.spec.ts b/packages/nx/src/lock-file/yarn.spec.ts index 362710da29d157..6ad959f38f3ea6 100644 --- a/packages/nx/src/lock-file/yarn.spec.ts +++ b/packages/nx/src/lock-file/yarn.spec.ts @@ -4,11 +4,12 @@ import { stringifyYarnLockFile, } from './yarn'; import { - lockFile, berryLockFile, - lockFileJustTypescript, - lockFileDevkitAndYargs, berryLockFileDevkitAndYargs, + lockFile, + lockFileDevkitAndYargs, + lockFileJustTypescript, + ssh2LockFile, } from './__fixtures__/yarn.lock'; const TypeScriptOnlyPackage = { @@ -30,6 +31,13 @@ const YargsDevkitTypescriptPackage = { yargs: '17.6.2', }, }; +const Ssh2Package = { + name: 'test', + version: '0.0.0', + dependencies: { + ssh2: '1.11.0', + }, +}; describe('yarn LockFile utility', () => { describe('classic', () => { @@ -85,7 +93,7 @@ describe('yarn LockFile utility', () => { expect(stringifyYarnLockFile(parsedLockFile)).toEqual(lockFile); }); - it('shold prune the lock file', () => { + it('should prune the lock file', () => { expect( Object.keys( pruneYarnLockFile(parsedLockFile, TypeScriptOnlyPackage).dependencies @@ -98,7 +106,7 @@ describe('yarn LockFile utility', () => { ).toEqual(36); }); - it('shold correctly prune lockfile with single package', () => { + it('should correctly prune lockfile with single package', () => { expect( stringifyYarnLockFile( pruneYarnLockFile(parsedLockFile, TypeScriptOnlyPackage) @@ -106,13 +114,21 @@ describe('yarn LockFile utility', () => { ).toEqual(lockFileJustTypescript); }); - it('shold correctly prune lockfile with multiple packages', () => { + it('should correctly prune lockfile with multiple packages', () => { expect( stringifyYarnLockFile( pruneYarnLockFile(parsedLockFile, YargsAndDevkitPackage) ) ).toEqual(lockFileDevkitAndYargs); }); + + it('should correctly prune lockfile with package that has optional dependencies', () => { + expect( + stringifyYarnLockFile( + pruneYarnLockFile(parseYarnLockFile(ssh2LockFile), Ssh2Package) + ) + ).toEqual(ssh2LockFile); + }); }); describe('berry', () => { @@ -179,7 +195,7 @@ describe('yarn LockFile utility', () => { expect(removeComment(result)).toEqual(removeComment(berryLockFile)); }); - it('shold prune the lock file', () => { + it('should prune the lock file', () => { expect( Object.keys( pruneYarnLockFile(parsedLockFile, YargsDevkitTypescriptPackage) @@ -188,7 +204,7 @@ describe('yarn LockFile utility', () => { ).toEqual(37); }); - it('shold correctly prune lockfile with multiple packages', () => { + it('should correctly prune lockfile with multiple packages', () => { const result = stringifyYarnLockFile( pruneYarnLockFile(parsedLockFile, YargsDevkitTypescriptPackage) ); @@ -197,7 +213,7 @@ describe('yarn LockFile utility', () => { ); }); - it('shold correctly prune lockfile with multiple packages and custom name', () => { + it('should correctly prune lockfile with multiple packages and custom name', () => { const result = pruneYarnLockFile(parsedLockFile, { ...YargsDevkitTypescriptPackage, name: 'custom-name', diff --git a/packages/nx/src/lock-file/yarn.ts b/packages/nx/src/lock-file/yarn.ts index 03ebce3aa5777d..054b271314c23d 100644 --- a/packages/nx/src/lock-file/yarn.ts +++ b/packages/nx/src/lock-file/yarn.ts @@ -296,11 +296,10 @@ function pruneTransitiveDependencies( prunedDeps: LockFileData['dependencies'], value: PackageDependency ): void { - if (!value.dependencies) { - return; - } - - Object.entries(value.dependencies).forEach(([packageName, version]) => { + [ + ...Object.entries(value.dependencies ?? {}), + ...Object.entries(value.optionalDependencies ?? {}), + ].forEach(([packageName, version]) => { if (dependencies[packageName]) { // check if package with given version exists in data // if yes, return key, value and version expression from packageMeta