denoland/deno · error

Missing 'version' field in '{}'. Add a version like: {

Error message

Missing 'version' field in '{}'. Add a version like:
  {
    "version": "1.0.0",
    ...
  }

What it means

When `deno pack` packs the current directory's deno.json and no `--version` override is supplied, the config must carry a `version` so the tarball gets an explicit semver. This check fires before any version parsing or graph work, right after the name check.

Source

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

    bail!(
      "Git repository has uncommitted changes. Use --allow-dirty to pack anyway.\n{}",
      dirty
    );
  }

  // Get package configs
  let mut packages = cli_options.start_dir.jsr_packages_for_publish();
  if packages.is_empty() {
    match cli_options.start_dir.member_deno_json() {
      Some(deno_json) => {
        let Some(name) = deno_json.json.name.clone() else {
          bail!(
            "Missing 'name' field in '{}'. Add a package name like:\n  {{\n    \"name\": \"@scope/package-name\",\n    ...\n  }}",
            deno_json.specifier
          );
        };
        if deno_json.json.version.is_none() {
          bail!(
            "Missing 'version' field in '{}'. Add a version like:\n  {{\n    \"version\": \"1.0.0\",\n    ...\n  }}",
            deno_json.specifier
          );
        }
        if deno_json.json.exports.is_none() {
          bail!(
            "Missing 'exports' field in '{}'. Add an exports field like:\n  {{\n    \"exports\": \"./mod.ts\",\n    ...\n  }}",
            deno_json.specifier
          );
        }

        packages.push(JsrPackageConfig {
          name,
          member_dir: cli_options.start_dir.workspace.root_dir().clone(),
          config_file: deno_json.clone(),
          license: deno_json
            .json
            .license

View on GitHub (pinned to 9ad36f7a2c)

Solutions

  1. Add `"version": "1.0.0"` (valid semver) to deno.json.
  2. Or pass the version on the command line: `deno pack --version 1.0.0`.
  3. Automate keeping deno.json version in sync with release tooling so it never regresses.

Example fix

// deno.json (before)
{
  "name": "@scope/pkg"
}
// deno.json (after)
{
  "name": "@scope/pkg",
  "version": "1.0.0"
}
Defensive patterns

Strategy: validation

Validate before calling

const cfg = JSON.parse(readFileSync("deno.json", "utf8"));
if (!cfg.version) {
  console.error("deno.json is missing required field: version");
  process.exit(1);
}

Type guard

const hasVersion = (cfg: unknown): boolean =>
  typeof cfg === "object" && cfg !== null && "version" in cfg && typeof (cfg as any).version === "string";

Prevention

When it happens

Trigger: Running `deno pack` (without `--version`) in a directory whose deno.json has a `name` but no `version` field.

Common situations: Freshly created packages where only name/exports were filled in; teams that version via git tags and forget the deno.json mirror.

Related errors


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