angular/angular-cli · error · Error

Package was not found in package.json.

Error message

Package ${JSON.stringify(name)} was not found in package.json.

What it means

_buildLocalPackageInfo requires the package being updated to appear in the workspace's dependency ranges (dependencies/devDependencies read from package.json). _buildLocalPackageInfo throws when allDependencies.get(name) returns nothing, i.e. the package name isn't declared in package.json, so no version range can be resolved for the update plan.

Solutions

  1. Verify the name is listed in package.json dependencies/devDependencies (`npm ls <name>`).
  2. Fix typos in the package name passed to ng update.
  3. If updating a transitive package, update its direct parent instead: `ng update <parent>` or `npm update <name>`.
  4. Install the package first (`npm install <name>`) if you actually depend on it, then update.

Example fix

// before
ng update @angular-devkit/build-angular  # not in package.json, only transitive
// error: Package "@angular-devkit/build-angular" was not found in package.json.
// after
ng update @angular/cli  # the declared direct dependency
Defensive patterns

Strategy: validation

Validate before calling

const pkgJson = require('./package.json');
const declared = { ...pkgJson.dependencies, ...pkgJson.devDependencies };
if (!declared[name]) {
  throw new Error(`${name} is not a direct dependency; update its parent instead`);
}

Type guard

function isDirectDependency(name: string, pkgJson: { dependencies?: Record<string,string>; devDependencies?: Record<string,string> }): boolean {
  return name in (pkgJson.dependencies ?? {}) || name in (pkgJson.devDependencies ?? {});
}

Prevention

When it happens

Trigger: Running `ng update <name>` for a package not listed in package.json (e.g. a transitive dependency, a typo, or a package only present in another sub-project), while it is installed in node_modules.

Common situations: Updating transitive dependencies directly; typos in package names; workspaces/monorepos where the package is a dependency of a nested package.json, not the root; leftovers removed from package.json but still in node_modules.

Related errors


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

Appendix: source

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

  } catch {}

  return null;
}

function getInstalledVersion(packageName: string, workspaceRoot: string): string | null {
  const pkgJson = getInstalledPackageJson(packageName, workspaceRoot);

  return pkgJson?.version ?? null;
}

function _buildLocalPackageInfo(
  name: string,
  allDependencies: ReadonlyMap<string, VersionRange>,
  workspaceRoot: string,
): PackageInfo {
  const packageJsonRange = allDependencies.get(name);
  if (!packageJsonRange) {
    throw new Error(`Package ${JSON.stringify(name)} was not found in package.json.`);
  }

  const localPkgJson = getInstalledPackageJson(name, workspaceRoot);
  if (!localPkgJson) {
    throw new Error(`Package ${name} is not installed.`);
  }

  const installedVersion = localPkgJson.version;
  const npmPackageJson: PackageMetadata = {
    name,
    versions: [installedVersion],
    'dist-tags': {},
  };

  const logger = new logging.NullLogger();

  return {
    name,

View on GitHub (pinned to bb72145f9a)