From 41d8143291905e82791d89a16551ec64b619142a Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 5 May 2021 16:51:56 -0400 Subject: [PATCH 1/2] refactor(@angular-devkit/schematics): allow use of a package manager's force option This change allows consumers of the `NodeWorkflow` to configure the package installation task to use a package manager's `--force` option. This will be used by the `@angular/cli` update command when the update command's force option is used. This change is not intended to enable a schematic to adjust the force option. --- goldens/public-api/angular_devkit/schematics/tools/index.d.ts | 1 + .../schematics/tasks/package-manager/executor.ts | 4 ++++ .../schematics/tasks/package-manager/options.ts | 1 + .../angular_devkit/schematics/tools/workflow/node-workflow.ts | 2 ++ 4 files changed, 8 insertions(+) diff --git a/goldens/public-api/angular_devkit/schematics/tools/index.d.ts b/goldens/public-api/angular_devkit/schematics/tools/index.d.ts index 3573352ab41e..16a91b4ef4a5 100644 --- a/goldens/public-api/angular_devkit/schematics/tools/index.d.ts +++ b/goldens/public-api/angular_devkit/schematics/tools/index.d.ts @@ -138,6 +138,7 @@ export interface NodeWorkflowOptions { force?: boolean; optionTransforms?: OptionTransform[]; packageManager?: string; + packageManagerForce?: boolean; packageRegistry?: string; registry?: schema.CoreSchemaRegistry; resolvePaths?: string[]; diff --git a/packages/angular_devkit/schematics/tasks/package-manager/executor.ts b/packages/angular_devkit/schematics/tasks/package-manager/executor.ts index 51c902552ae3..3886d960f301 100644 --- a/packages/angular_devkit/schematics/tasks/package-manager/executor.ts +++ b/packages/angular_devkit/schematics/tasks/package-manager/executor.ts @@ -104,6 +104,10 @@ export default function ( args.push(`--registry="${factoryOptions.registry}"`); } + if (factoryOptions.force) { + args.push('--force'); + } + return new Observable((obs) => { const spinner = ora({ text: `Installing packages (${taskPackageManagerName})...`, diff --git a/packages/angular_devkit/schematics/tasks/package-manager/options.ts b/packages/angular_devkit/schematics/tasks/package-manager/options.ts index d584f3630a72..07727bacb03f 100644 --- a/packages/angular_devkit/schematics/tasks/package-manager/options.ts +++ b/packages/angular_devkit/schematics/tasks/package-manager/options.ts @@ -13,6 +13,7 @@ export interface NodePackageTaskFactoryOptions { packageManager?: string; allowPackageManagerOverride?: boolean; registry?: string; + force?: boolean; } export interface NodePackageTaskOptions { diff --git a/packages/angular_devkit/schematics/tools/workflow/node-workflow.ts b/packages/angular_devkit/schematics/tools/workflow/node-workflow.ts index 1ee03c79ce57..ba4900c67562 100644 --- a/packages/angular_devkit/schematics/tools/workflow/node-workflow.ts +++ b/packages/angular_devkit/schematics/tools/workflow/node-workflow.ts @@ -19,6 +19,7 @@ export interface NodeWorkflowOptions { force?: boolean; dryRun?: boolean; packageManager?: string; + packageManagerForce?: boolean; packageRegistry?: string; registry?: schema.CoreSchemaRegistry; resolvePaths?: string[]; @@ -60,6 +61,7 @@ export class NodeWorkflow extends workflow.BaseWorkflow { engineHost.registerTaskExecutor(BuiltinTaskExecutor.NodePackage, { allowPackageManagerOverride: true, packageManager: options.packageManager, + force: options.packageManagerForce, rootDirectory: root && getSystemPath(root), registry: options.packageRegistry, }); From af54bef31602d92564d18d3c678a99b6b74c8305 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 5 May 2021 17:00:22 -0400 Subject: [PATCH 2/2] fix(@angular/cli): propagate update's force option to package managers When the CLI update command's `--force` option is used, the underlying package manager will also be executed with its force option. This behavior is especially important with the advent of npm 7 which will fail installation if any peer dependency version ranges are mismatched. --- packages/angular/cli/commands/update-impl.ts | 3 ++- packages/angular/cli/commands/update.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/angular/cli/commands/update-impl.ts b/packages/angular/cli/commands/update-impl.ts index 37d0a17acfef..0c2965440acb 100644 --- a/packages/angular/cli/commands/update-impl.ts +++ b/packages/angular/cli/commands/update-impl.ts @@ -66,10 +66,11 @@ export class UpdateCommand extends Command { private workflow!: NodeWorkflow; private packageManager = PackageManager.Npm; - async initialize() { + async initialize(options: UpdateCommandSchema & Arguments) { this.packageManager = await getPackageManager(this.context.root); this.workflow = new NodeWorkflow(this.context.root, { packageManager: this.packageManager, + packageManagerForce: options.force, // __dirname -> favor @schematics/update from this package // Otherwise, use packages from the active workspace (migrations) resolvePaths: [__dirname, this.context.root], diff --git a/packages/angular/cli/commands/update.json b/packages/angular/cli/commands/update.json index c2eace203830..7de5a1935146 100644 --- a/packages/angular/cli/commands/update.json +++ b/packages/angular/cli/commands/update.json @@ -28,7 +28,7 @@ } }, "force": { - "description": "If false, will error out if installed packages are incompatible with the update.", + "description": "Ignore peer dependency version mismatches. Passes the `--force` flag to the package manager when installing packages.", "default": false, "type": "boolean" },