denoland/deno · error

Invalid package name '{}'. Package name must be in the forma

Error message

Invalid package name '{}'. Package name must be in the format '@scope/name'

What it means

`deno pack` validates that each package name is JSR-style scoped: it must start with `@` and contain a `/`. The check `!package.name.starts_with('@') || !package.name.contains('/')` rejects unscoped names such as `mypkg` or malformed ones like `@scope` because JSR requires `@scope/name`.

Source

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

            .license
            .as_ref()
            .and_then(|l| l.as_str().map(|s| s.to_string())),
          should_publish: true,
        });
      }
      None => {
        bail!("No deno.json found in current directory");
      }
    }
  }

  let module_graph_creator = cli_factory.module_graph_creator().await?;
  let parsed_source_cache = cli_factory.parsed_source_cache()?;

  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
        );

View on GitHub (pinned to 9ad36f7a2c)

Solutions

  1. Change the name to `@scope/name`, e.g. `"name": "@luca/flag"`.
  2. Create/choose a JSR scope matching your account or org, then prefix it.
  3. For local-only linking (no publish), consider `deno link` with the name field instead of packing.

Example fix

// deno.json (before)
{
  "name": "my-package"
}
// deno.json (after)
{
  "name": "@scope/my-package"
}
Defensive patterns

Strategy: validation

Validate before calling

const JSR_NAME = /^@[a-z0-9-]+\/[a-z0-9-]+$/;
const cfg = JSON.parse(readFileSync("deno.json", "utf8"));
if (!JSR_NAME.test(cfg.name ?? "")) {
  console.error(`"${cfg.name}" is not a @scope/name package name`);
  process.exit(1);
}

Type guard

const isScopedPackageName = (name: string): boolean =>
  /^@[a-z0-9][a-z0-9.-]*\/[a-z0-9][a-z0-9.-]*$/.test(name);

Prevention

When it happens

Trigger: Any packed package (workspace member or standalone deno.json) whose `name` lacks the `@scope/name` shape — e.g. `"name": "my-package"` or `"name": "@scope"`.

Common situations: Names copied from npm habits (npm allows unscoped names); typos dropping the slash; using a personal handle without converting it to a scope.

Related errors


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