denoland/deno · error

Invalid semver version '{}'. Please provide a valid semver v

Error message

Invalid semver version '{}'. Please provide a valid semver version (e.g., 1.0.0)

What it means

`deno pack --version <v>` (PackFlags::set_version) validates the override with `deno_semver::Version::parse_standard` before using it. Anything that is not standard semver — `1.x`, `v1.0.0`, `1.0`, `latest` — is rejected with this message.

Source

Thrown at cli/tools/pack/mod.rs:123

  for package in packages {
    // Validate package name format
    if !package.name.starts_with('@') || !package.name.contains('/') {
      bail!(
        "Invalid package name '{}'. Package name must be in the format '@scope/name'",
        package.name
      );
    }

    log::info!(
      "{} {}",
      colors::green("Packing"),
      colors::intense_blue(&package.name)
    );

    // Determine version
    let version = if let Some(ref v) = pack_flags.set_version {
      if deno_semver::Version::parse_standard(v).is_err() {
        bail!(
          "Invalid semver version '{}'. Please provide a valid semver version (e.g., 1.0.0)",
          v
        );
      }
      v.clone()
    } else {
      package
        .config_file
        .json
        .version
        .clone()
        .with_context(|| {
          format!(
            "Missing version in package '{}'. Add a version field or use --set-version",
            package.name
          )
        })?
    };

View on GitHub (pinned to 9ad36f7a2c)

Solutions

  1. Use full `MAJOR.MINOR.PATCH` without a `v` prefix: `deno pack --version 1.2.3`.
  2. Pre-release/build metadata is fine if formatted as standard semver: `1.2.3-beta.1`.
  3. If you wanted the version to come from the config, drop `--version` entirely.

Example fix

# before
deno pack --version v1.2.3
# after
deno pack --version 1.2.3
Defensive patterns

Strategy: validation

Validate before calling

// Validate before passing --version to deno pack
const SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$/;
const v = process.argv[2];
if (!SEMVER.test(v ?? "")) {
  console.error(`"${v}" is not standard semver (use MAJOR.MINOR.PATCH, no 'v' prefix)`);
  process.exit(1);
}

Type guard

const isStandardSemver = (v: string): boolean =>
  /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(v);

Prevention

When it happens

Trigger: Passing `--version` a non-semver string: `deno pack --version 1.0`, `--version v2.1.0`, `--version latest`.

Common situations: Copying a git tag like `v1.2.3` including the `v` prefix; two-component versions `1.2`; npm dist-tags such as `latest` where no leading `v`/short form is allowed by parse_standard.

Related errors


AI-assisted analysis of denoland/deno@9ad36f7a2c (2026-08-20). Data as JSON: /api/errors/094efe10b07703a9. Report an issue: GitHub.