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
- Read the peer dependency details logged above the error and align versions (update peer-related packages together).
- Update in the recommended order (e.g. @angular/core then @angular/material) via `ng update @angular/core @angular/material`.
- Rerun with --force if you accept the incompatibility and will fix it afterwards.
- 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
- Update peer-coupled packages together (ng update @angular/core @angular/material).
- Check `npm info <pkg> peerDependencies` before choosing a target version.
- Treat --force as last resort; schedule fixes for whatever it skips.
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
- Unable to install packages
- Package ${JSON.stringify(name)} was not found in package.jso
- Package ${name} is not installed.
- Repository is not clean. Please commit or stash any changes
- A single package must be specified when using the 'migrate-o
AI-assisted analysis of angular/angular-cli@bb72145f9a (2026-08-30).
Data as JSON: /api/errors/79e30aacf6ed2042.
Report an issue: GitHub.