{"record":{"id":"bf303b4822b0ae73","repo":"angular/angular-cli","slug":"unknown-package-manager-options-packagemanager","errorCode":null,"errorMessage":"Unknown package manager \"${options.packageManager}\".","messagePattern":"Unknown package manager \"(.+?)\"\\.","errorType":"exception","errorClass":"UnknownPackageManagerException","httpStatus":null,"severity":"error","filePath":"packages/angular_devkit/schematics/tasks/package-manager/executor.ts","lineNumber":73,"sourceCode":"\nexport default function (\n  factoryOptions: NodePackageTaskFactoryOptions = {},\n): TaskExecutor<NodePackageTaskOptions> {\n  const packageManagerName = factoryOptions.packageManager || 'npm';\n  const packageManagerProfile = packageManagers[packageManagerName];\n  if (!packageManagerProfile) {\n    throw new UnknownPackageManagerException(packageManagerName);\n  }\n\n  const rootDirectory = factoryOptions.rootDirectory || process.cwd();\n\n  return (options: NodePackageTaskOptions = { command: 'install' }) => {\n    let taskPackageManagerProfile = packageManagerProfile;\n    let taskPackageManagerName = packageManagerName;\n    if (factoryOptions.allowPackageManagerOverride && options.packageManager) {\n      taskPackageManagerProfile = packageManagers[options.packageManager];\n      if (!taskPackageManagerProfile) {\n        throw new UnknownPackageManagerException(options.packageManager);\n      }\n      taskPackageManagerName = options.packageManager;\n    }\n\n    const bufferedOutput: { stream: NodeJS.WriteStream; data: Buffer }[] = [];\n    const spawnOptions: SpawnOptions = {\n      shell: true,\n      cwd: path.join(rootDirectory, options.workingDirectory || ''),\n    };\n    if (options.hideOutput) {\n      spawnOptions.stdio = options.quiet ? ['ignore', 'ignore', 'pipe'] : 'pipe';\n    } else {\n      spawnOptions.stdio = options.quiet ? ['ignore', 'ignore', 'inherit'] : 'inherit';\n    }\n\n    const args: string[] = [];\n\n    if (options.packageName) {","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/angular/angular-cli/blob/bb72145f9ab45aee29f523236b3a25cd0813a841/packages/angular_devkit/schematics/tasks/package-manager/executor.ts#L55-L91","documentation":"Same exception family as the factory-level check, but raised inside the returned executor: when factoryOptions.allowPackageManagerOverride is true and options.packageManager is provided, the per-task manager name is looked up in packageManagers; an unknown value throws UnknownPackageManagerException.","triggerScenarios":"Scheduling a NodePackage task with options.packageManager set (e.g. { command: 'install', packageManager: 'bun' }) while allowPackageManagerOverride is enabled and the name isn't in the supported map.","commonSituations":"Schematics/tasks that let users pick the install command's manager; CI configs injecting packageManager into task options; newer manager names on older toolchains; typos in task options.","solutions":["Use a supported options.packageManager value ('npm', 'yarn', 'pnpm')","Remove options.packageManager from the task options so the factory default is used","Upgrade the devkit to a version whose packageManagers map includes your manager","Validate user input before scheduling the task"],"exampleFix":"// before\ncontext.addTask(new NodePackageTask({ command: 'install', packageManager: 'bun' }));\n// after\ncontext.addTask(new NodePackageTask({ command: 'install', packageManager: 'pnpm' }));","handlingStrategy":"validation","validationCode":"const supported = ['npm', 'yarn', 'pnpm'];\nif (options.packageManager && !supported.includes(options.packageManager)) {\n  throw new Error(`Unsupported package manager option: ${options.packageManager}`);\n}","typeGuard":"type PackageManager = 'npm' | 'yarn' | 'pnpm';\nfunction isPackageManagerOption(o: unknown): o is { packageManager: PackageManager } {\n  const v = o as { packageManager?: unknown };\n  return typeof v.packageManager === 'string' &&\n    ['npm', 'yarn', 'pnpm'].includes(v.packageManager);\n}","tryCatchPattern":"try {\n  await executor({ command: 'install', packageManager: userChoice });\n} catch (e) {\n  if (/Unknown package manager/.test(String(e))) {\n    await executor({ command: 'install' }); // fall back to default\n  } else throw e;\n}","preventionTips":["Validate per-task packageManager options against the supported set before addTask","Only enable allowPackageManagerOverride when inputs are trusted/validated","Keep the devkit version aligned with the managers your CI allows"],"tags":["schematics","package-manager","tasks","configuration"],"backgroundTag":"unknown-package-manager","analyzedSha":"bb72145f9ab45aee29f523236b3a25cd0813a841","analyzedAt":"2026-08-30T02:47:34.745Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}