angular/angular-cli · error · Error

Incompatible peer dependencies found. See above for details.

Error message

Incompatible peer dependencies found. See above for details. You can bypass this check using the --force option.

What it means

During update resolution, _validateUpdatePackages walks forward and reverse peer dependencies of every package being updated. If any incompatibility is reported and --force was not passed, it throws so the user can review details logged above and consciously bypass with --force.

Source

Thrown at packages/angular/cli/src/commands/update/update-resolver.ts:311

  logger: logging.LoggerApi,
): void {
  logger.debug('Validating peer dependencies...');
  let error = false;

  for (const name of infoMap.keys()) {
    const info = infoMap.get(name);
    if (!info || !info.target) {
      continue;
    }

    logger.debug(`Checking ${name}...`);
    error = _validateForwardPeerDependencies(name, infoMap, logger) || error;
    error =
      _validateReversePeerDependencies(name, info.target.version, infoMap, logger, next) || error;
  }

  if (error && !force) {
    throw new Error(
      'Incompatible peer dependencies found. See above for details. ' +
        'You can bypass this check using the --force option.',
    );
  }
}

function _getUpdateMetadata(
  packageJson: PackageManifest,
  logger: logging.LoggerApi,
): UpdateMetadata {
  const metadata = packageJson['ng-update'] as Record<string, unknown> | undefined;

  const result: UpdateMetadata = {
    packageGroup: {},
    requirements: {},
  };

  if (!metadata || typeof metadata != 'object' || Array.isArray(metadata)) {

View on GitHub (pinned to bb72145f9a)

Solutions

  1. Read the peer dependency details logged above the error and align versions (update peer-related packages together).
  2. Update in the recommended order (e.g. @angular/core then @angular/material) via `ng update @angular/core @angular/material`.
  3. Rerun with --force if you accept the incompatibility and will fix it afterwards.
  4. Choose a package version whose peer range matches your current setup (check `npm info <pkg> peerDependencies`).

Example fix

// before
ng update @angular/material@17  # requires @angular/core@17, installed core@16
// error: Incompatible peer dependencies found...
// after
ng update @angular/core@17 @angular/material@17
Defensive patterns

Strategy: validation

Validate before calling

import { execSync } from 'child_process';
const peers = JSON.parse(execSync(`npm info ${pkg} peerDependencies --json`).toString());
for (const [dep, range] of Object.entries(peers)) {
  const installed = require(`${dep}/package.json`).version;
  if (!require('semver').satisfies(installed, range)) {
    console.warn(`${pkg} needs ${dep}@${range}, installed ${installed} — update ${dep} too`);
  }
}

Try / catch

try {
  await ngUpdate(packages);
} catch (e) {
  if (String(e.message).includes('Incompatible peer dependencies')) {
    console.error('Review logged peer conflicts; align versions before forcing.');
  } else throw e;
}

Prevention

When it happens

Trigger: Updating one or more packages whose peer dependency ranges conflict with installed versions — e.g. updating a plugin to a version requiring a different Angular core than installed — without the --force flag.

Common situations: Mixed-version upgrades (updating @angular/material before @angular/core); third-party libraries lagging behind new Angular majors; React/Vue plugin ecosystems with strict peer ranges.

Related errors


AI-assisted analysis of angular/angular-cli@bb72145f9a (2026-08-30). Data as JSON: /api/errors/79e30aacf6ed2042. Report an issue: GitHub.