vercel/turborepo · error · ConvertError

package_manager-unsupported_version

package_manager-unsupported_version

Error message

Unsupported package manager version.

What it means

install() selects install instructions via getPackageManagerMeta(): with a known version it finds the PACKAGE_MANAGERS entry whose semver range matches (pnpm '6.x' vs '>=7', yarn '<2' vs '>=2', bun '^1.0.1'); with no version it takes the default entry. If the version satisfies no range, it throws ConvertError type package_manager-unsupported_version before running the install command.

Source

Thrown at packages/turbo-workspaces/src/install.ts:130

  const { version, name } = packageManager;
  if (version) {
    return PACKAGE_MANAGERS[name].find((manager) =>
      satisfies(version, manager.semver)
    );
  }
  return PACKAGE_MANAGERS[name].find((manager) => {
    return manager.default;
  });
}

export async function install(args: InstallArgs) {
  const { to, logger, options } = args;

  const installLogger = logger ?? new Logger(options);
  const packageManager = getPackageManagerMeta(to);

  if (!packageManager) {
    throw new ConvertError("Unsupported package manager version.", {
      type: "package_manager-unsupported_version"
    });
  }

  installLogger.subStep(
    `running "${packageManager.command} ${packageManager.installArgs.join(
      " "
    )}"`
  );
  if (!options?.dry) {
    let spinner;
    if (installLogger.interactive) {
      spinner = ora({
        text: "installing dependencies...",
        spinner: {
          frames: installLogger.installerFrames()
        }
      }).start();

View on GitHub (pinned to 9f94a7d215)

Solutions

  1. Upgrade the target manager to a supported major (pnpm >= 7, yarn 1.x or >= 2, bun >= 1.0.1) and re-run
  2. Omit the explicit version so the default PACKAGE_MANAGERS entry is used
  3. Check the detected version (`pnpm --version`) against the ranges declared in packages/turbo-workspaces/src/install.ts

Example fix

# before: pnpm 5.18 detected, satisfies neither 6.x nor >=7
pnpm --version # 5.18.10

# after
npm i -g pnpm@latest
pnpm --version # 9.x — retry the conversion
Defensive patterns

Strategy: validation

Validate before calling

import { satisfies } from "semver";

const SUPPORTED: Record<string, Array<string>> = {
  pnpm: ["6.x", ">=7"],
  yarn: ["<2", ">=2"],
  bun: ["^1.0.1"],
  npm: ["*"]
};

const version = execSync(`${convertTo.name} --version`).toString().trim();
const supported = SUPPORTED[convertTo.name]?.some((range) => satisfies(version, range));
if (!supported) throw new Error(`${convertTo.name}@${version} is unsupported; upgrade first`);

Type guard

function isUnsupportedVersionError(e: unknown): boolean {
  return e instanceof ConvertError && e.type === "package_manager-unsupported_version";
}

Try / catch

try {
  await install({ project, to, logger, options });
} catch (e) {
  if (e instanceof ConvertError && e.type === "package_manager-unsupported_version") {
    // suggest upgrading the target manager, then re-run the conversion
  } else throw e;
}

Prevention

When it happens

Trigger: Converting with a target version outside every supported range: pnpm 5.x or older, bun 0.x, or a prerelease version string that semver.satisfies rejects (prereleases don't satisfy ranges by default).

Common situations: Legacy repos pinned to pnpm 5; old global manager installs; user-supplied version strings in conversion scripts; experimental canary versions.

Related errors


AI-assisted analysis of vercel/turborepo@9f94a7d215 (2026-08-16). Data as JSON: /api/errors/142ab1b9ada4d585. Report an issue: GitHub.