diff --git a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts index f48ed1e32ed7..bfcbb8bc4548 100644 --- a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts +++ b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts @@ -162,9 +162,9 @@ export const SUPPORTED_PACKAGE_MANAGERS = { saveExactFlag: '--exact', saveTildeFlag: '--tilde', saveDevFlag: '--dev', - noLockfileFlag: '--no-lockfile', - ignoreScriptsFlag: '--ignore-scripts', - getRegistryOptions: (registry: string) => ({ env: { NPM_CONFIG_REGISTRY: registry } }), + noLockfileFlag: '', + ignoreScriptsFlag: '--mode=skip-build', + getRegistryOptions: (registry: string) => ({ env: { YARN_NPM_REGISTRY_SERVER: registry } }), versionCommand: ['--version'], listDependenciesCommand: ['list', '--depth=0', '--json', '--recursive=false'], getManifestCommand: ['npm', 'info', '--json'], diff --git a/packages/angular/cli/src/package-managers/parsers.ts b/packages/angular/cli/src/package-managers/parsers.ts index 0e12fd5f0cfb..ca52fd49d817 100644 --- a/packages/angular/cli/src/package-managers/parsers.ts +++ b/packages/angular/cli/src/package-managers/parsers.ts @@ -254,7 +254,9 @@ export function parseNpmLikeManifest(stdout: string, logger?: Logger): PackageMa return null; } - return JSON.parse(stdout); + const result = JSON.parse(stdout); + + return Array.isArray(result) ? result[result.length - 1] : result; } /** diff --git a/packages/angular/cli/src/package-managers/parsers_spec.ts b/packages/angular/cli/src/package-managers/parsers_spec.ts index 8717a6d1a5a1..3b831d71a286 100644 --- a/packages/angular/cli/src/package-managers/parsers_spec.ts +++ b/packages/angular/cli/src/package-managers/parsers_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { parseNpmLikeError, parseYarnClassicError } from './parsers'; +import { parseNpmLikeError, parseNpmLikeManifest, parseYarnClassicError } from './parsers'; describe('parsers', () => { describe('parseNpmLikeError', () => { @@ -69,6 +69,25 @@ describe('parsers', () => { }); }); + describe('parseNpmLikeManifest', () => { + it('should parse a single manifest', () => { + const stdout = JSON.stringify({ name: 'foo', version: '1.0.0' }); + expect(parseNpmLikeManifest(stdout)).toEqual({ name: 'foo', version: '1.0.0' }); + }); + + it('should return the last manifest from an array', () => { + const stdout = JSON.stringify([ + { name: 'foo', version: '1.0.0' }, + { name: 'foo', version: '1.1.0' }, + ]); + expect(parseNpmLikeManifest(stdout)).toEqual({ name: 'foo', version: '1.1.0' }); + }); + + it('should return null for empty stdout', () => { + expect(parseNpmLikeManifest('')).toBeNull(); + }); + }); + describe('parseYarnClassicError', () => { it('should parse a 404 from verbose logs', () => { const stdout =