From 8848a2c3284d537a2cd7fa784e0daa93fb613209 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Mon, 2 Nov 2026 11:08:47 +0000 Subject: [PATCH 1/2] fix(@angular/cli): default ignoreScripts to true when install options are provided Previously, `PackageManager.install()` used a parameter-level default `options = { ignoreScripts: true }`, which caused `ignoreScripts` to be `undefined` whenever any option (such as `ignorePeerDependencies` during `ng update`) was provided without explicitly specifying `ignoreScripts`. Similarly, `PackageManager.acquireTempPackage()` did not default `ignoreScripts` to `true` unless explicitly passed. Ensure `ignoreScripts` defaults to `true` in both methods unless explicitly set to `false`. --- .../src/package-managers/package-manager.ts | 15 ++++---- .../package-managers/package-manager_spec.ts | 35 +++++++++++++++++++ 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/packages/angular/cli/src/package-managers/package-manager.ts b/packages/angular/cli/src/package-managers/package-manager.ts index 8e68279a5c20..faceee96857e 100644 --- a/packages/angular/cli/src/package-managers/package-manager.ts +++ b/packages/angular/cli/src/package-managers/package-manager.ts @@ -391,13 +391,15 @@ export class PackageManager { registry?: string; ignoreScripts?: boolean; ignorePeerDependencies?: boolean; - } = { ignoreScripts: true }, + } = {}, ): Promise { + const { force, ignoreScripts = true, ignorePeerDependencies } = options; const flags = [ - options.force ? this.descriptor.forceFlag : '', - options.ignoreScripts ? this.descriptor.ignoreScriptsFlag : '', - options.ignorePeerDependencies ? (this.descriptor.ignorePeerDependenciesFlag ?? '') : '', + force ? this.descriptor.forceFlag : '', + ignoreScripts ? this.descriptor.ignoreScriptsFlag : '', + ignorePeerDependencies ? (this.descriptor.ignorePeerDependenciesFlag ?? '') : '', ].filter((flag) => flag); + const args = [...this.descriptor.installCommand, ...flags]; await this.#run(args, options); @@ -787,9 +789,8 @@ export class PackageManager { } } - const flags = [options.ignoreScripts ? this.descriptor.ignoreScriptsFlag : ''].filter( - (flag) => flag, - ); + const { ignoreScripts = true } = options; + const flags = [ignoreScripts ? this.descriptor.ignoreScriptsFlag : ''].filter((flag) => flag); const args: readonly string[] = [this.descriptor.addCommand, specifier, ...flags]; try { diff --git a/packages/angular/cli/src/package-managers/package-manager_spec.ts b/packages/angular/cli/src/package-managers/package-manager_spec.ts index e6b8f95c0c4c..3e19bc725107 100644 --- a/packages/angular/cli/src/package-managers/package-manager_spec.ts +++ b/packages/angular/cli/src/package-managers/package-manager_spec.ts @@ -118,6 +118,41 @@ describe('PackageManager', () => { }); }); + describe('install', () => { + it('should pass ignoreScriptsFlag by default when no options are provided', async () => { + const pm = new PackageManager(host, '/tmp', descriptor); + await pm.install(); + + expect(runCommandSpy).toHaveBeenCalledWith( + descriptor.binary, + [...descriptor.installCommand, descriptor.ignoreScriptsFlag], + jasmine.objectContaining({ cwd: '/tmp' }), + ); + }); + + it('should pass ignoreScriptsFlag by default when other options are provided', async () => { + const pm = new PackageManager(host, '/tmp', descriptor); + await pm.install({ force: true }); + + expect(runCommandSpy).toHaveBeenCalledWith( + descriptor.binary, + [...descriptor.installCommand, descriptor.forceFlag, descriptor.ignoreScriptsFlag], + jasmine.objectContaining({ cwd: '/tmp' }), + ); + }); + + it('should not pass ignoreScriptsFlag when ignoreScripts is explicitly false', async () => { + const pm = new PackageManager(host, '/tmp', descriptor); + await pm.install({ ignoreScripts: false }); + + expect(runCommandSpy).toHaveBeenCalledWith( + descriptor.binary, + [...descriptor.installCommand], + jasmine.objectContaining({ cwd: '/tmp' }), + ); + }); + }); + describe('acquireTempPackage', () => { it('should copy and sanitize pnpm-workspace.yaml when package manager is pnpm and workspace file exists', async () => { const pnpmDescriptor = SUPPORTED_PACKAGE_MANAGERS['pnpm']; From 5ef82278f72a940063fe8a8184aa7f207e3a0718 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Mon, 2 Nov 2026 12:15:25 +0000 Subject: [PATCH 2/2] fixup! fix(@angular/cli): default ignoreScripts to true when install options are provided --- .../package-managers/package-manager_spec.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/packages/angular/cli/src/package-managers/package-manager_spec.ts b/packages/angular/cli/src/package-managers/package-manager_spec.ts index 3e19bc725107..24885008f884 100644 --- a/packages/angular/cli/src/package-managers/package-manager_spec.ts +++ b/packages/angular/cli/src/package-managers/package-manager_spec.ts @@ -154,6 +154,42 @@ describe('PackageManager', () => { }); describe('acquireTempPackage', () => { + it('should pass ignoreScriptsFlag by default when no options are provided', async () => { + const testHost = new MockHost({ '/tmp/project/node_modules': true }); + const pm = new PackageManager(testHost, '/tmp/project', descriptor); + spyOn(testHost, 'createTempDirectory').and.resolveTo( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc', + ); + spyOn(testHost, 'writeFile').and.resolveTo(); + spyOn(testHost, 'runCommand').and.resolveTo({ stdout: '', stderr: '' }); + + await pm.acquireTempPackage('foo@1.0.0'); + + expect(testHost.runCommand).toHaveBeenCalledWith( + descriptor.binary, + [descriptor.addCommand, 'foo@1.0.0', descriptor.ignoreScriptsFlag], + jasmine.any(Object), + ); + }); + + it('should not pass ignoreScriptsFlag when ignoreScripts is explicitly false', async () => { + const testHost = new MockHost({ '/tmp/project/node_modules': true }); + const pm = new PackageManager(testHost, '/tmp/project', descriptor); + spyOn(testHost, 'createTempDirectory').and.resolveTo( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc', + ); + spyOn(testHost, 'writeFile').and.resolveTo(); + spyOn(testHost, 'runCommand').and.resolveTo({ stdout: '', stderr: '' }); + + await pm.acquireTempPackage('foo@1.0.0', { ignoreScripts: false }); + + expect(testHost.runCommand).toHaveBeenCalledWith( + descriptor.binary, + [descriptor.addCommand, 'foo@1.0.0'], + jasmine.any(Object), + ); + }); + it('should copy and sanitize pnpm-workspace.yaml when package manager is pnpm and workspace file exists', async () => { const pnpmDescriptor = SUPPORTED_PACKAGE_MANAGERS['pnpm']; const testHost = new MockHost({ '/tmp/project/node_modules': true });