Skip to content

fix(@angular/cli): fixes Yarn v2 support for registry configuration #26860

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion packages/angular/cli/src/commands/add/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,10 @@ export default class AddCommandModule

spinner.start('Determining package manager...');
const usingYarn = packageManager.name === PackageManager.Yarn;
spinner.info(`Using package manager: ${colors.grey(packageManager.name)}`);
const packageManagerVersion = packageManager.version;
spinner.info(
`Using package manager: ${colors.grey(packageManager.name)} ${packageManagerVersion}`,
);

if (
packageIdentifier.name &&
Expand All @@ -155,6 +158,7 @@ export default class AddCommandModule
let packageMetadata;
try {
packageMetadata = await fetchPackageMetadata(packageIdentifier.name, logger, {
packageManagerVersion,
registry,
usingYarn,
verbose,
Expand Down Expand Up @@ -241,6 +245,7 @@ export default class AddCommandModule
try {
spinner.start('Loading package information from registry...');
const manifest = await fetchPackageManifest(packageIdentifier.toString(), logger, {
packageManagerVersion,
registry,
verbose,
usingYarn,
Expand Down
11 changes: 10 additions & 1 deletion packages/angular/cli/src/commands/update/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -601,14 +601,21 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
options: Options<UpdateCommandArgs>,
packages: PackageIdentifier[],
): Promise<number> {
const { logger } = this.context;
const { logger, packageManager } = this.context;
packageManager.ensureCompatibility();

const logVerbose = (message: string) => {
if (options.verbose) {
logger.info(message);
}
};

const usingYarn = packageManager.name === PackageManager.Yarn;
const packageManagerVersion = packageManager.version;
logger.info(
`Using package manager: ${colors.grey(packageManager.name)} ${packageManagerVersion}`,
);

const requests: {
identifier: PackageIdentifier;
node: PackageTreeNode;
Expand Down Expand Up @@ -647,6 +654,8 @@ export default class UpdateCommandModule extends CommandModule<UpdateCommandArgs
// Metadata requests are internally cached; multiple requests for same name
// does not result in additional network traffic
metadata = await fetchPackageMetadata(packageName, logger, {
packageManagerVersion: packageManagerVersion,
usingYarn: usingYarn,
verbose: options.verbose,
});
} catch (e) {
Expand Down
49 changes: 40 additions & 9 deletions packages/angular/cli/src/utilities/package-metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import * as ini from 'ini';
import { homedir } from 'os';
import type { Manifest, Packument } from 'pacote';
import * as path from 'path';
import * as semver from 'semver';

export interface PackageMetadata extends Packument, NgPackageManifestProperties {
tags: Record<string, PackageManifest>;
Expand Down Expand Up @@ -58,15 +59,20 @@ interface PackageManagerOptions extends Record<string, unknown> {
let npmrc: PackageManagerOptions;
const npmPackageJsonCache = new Map<string, Promise<Partial<NpmRepositoryPackageJson>>>();

function ensureNpmrc(logger: logging.LoggerApi, usingYarn: boolean, verbose: boolean): void {
function ensureNpmrc(
logger: logging.LoggerApi,
usingYarn: boolean,
verbose: boolean,
packageManagerVersion?: string,
): void {
if (!npmrc) {
try {
npmrc = readOptions(logger, false, verbose);
} catch {}

if (usingYarn) {
try {
npmrc = { ...npmrc, ...readOptions(logger, true, verbose) };
npmrc = { ...npmrc, ...readOptions(logger, true, verbose, packageManagerVersion) };
} catch {}
}
}
Expand All @@ -76,9 +82,20 @@ function readOptions(
logger: logging.LoggerApi,
yarn = false,
showPotentials = false,
packageManagerVersion?: string,
): PackageManagerOptions {
const cwd = process.cwd();
const baseFilename = yarn ? 'yarnrc' : 'npmrc';
let baseFilename: string;
if (yarn) {
// adds support for the yarnrc.yml format used by yarn v2+
if (packageManagerVersion != null && semver.gt(packageManagerVersion, '2.0.0')) {
baseFilename = 'yarnrc.yml';
} else {
baseFilename = 'yarnrc';
}
} else {
baseFilename = 'npmrc';
}
const dotFilename = '.' + baseFilename;

let globalPrefix: string;
Expand Down Expand Up @@ -229,19 +246,21 @@ export async function fetchPackageMetadata(
name: string,
logger: logging.LoggerApi,
options?: {
packageManagerVersion?: string;
registry?: string;
usingYarn?: boolean;
verbose?: boolean;
},
): Promise<PackageMetadata> {
const { usingYarn, verbose, registry } = {
const { packageManagerVersion, usingYarn, verbose, registry } = {
packageManagerVersion: undefined,
registry: undefined,
usingYarn: false,
verbose: false,
...options,
};

ensureNpmrc(logger, usingYarn, verbose);
ensureNpmrc(logger, usingYarn, verbose, packageManagerVersion);
const { packument } = await import('pacote');
const response = await packument(name, {
fullMetadata: true,
Expand Down Expand Up @@ -278,13 +297,19 @@ export async function fetchPackageManifest(
name: string,
logger: logging.LoggerApi,
options: {
packageManagerVersion?: string;
registry?: string;
usingYarn?: boolean;
verbose?: boolean;
} = {},
): Promise<PackageManifest> {
const { usingYarn = false, verbose = false, registry } = options;
ensureNpmrc(logger, usingYarn, verbose);
const {
packageManagerVersion = undefined,
usingYarn = false,
verbose = false,
registry,
} = options;
ensureNpmrc(logger, usingYarn, verbose, packageManagerVersion);
const { manifest } = await import('pacote');

const response = await manifest(name, {
Expand All @@ -300,6 +325,7 @@ export async function getNpmPackageJson(
packageName: string,
logger: logging.LoggerApi,
options: {
packageManagerVersion?: string;
registry?: string;
usingYarn?: boolean;
verbose?: boolean;
Expand All @@ -310,8 +336,13 @@ export async function getNpmPackageJson(
return cachedResponse;
}

const { usingYarn = false, verbose = false, registry } = options;
ensureNpmrc(logger, usingYarn, verbose);
const {
packageManagerVersion = undefined,
usingYarn = false,
verbose = false,
registry,
} = options;
ensureNpmrc(logger, usingYarn, verbose, packageManagerVersion);
const { packument } = await import('pacote');
const response = packument(packageName, {
fullMetadata: true,
Expand Down