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
- Change the name to `@scope/name`, e.g. `"name": "@luca/flag"`.
- Create/choose a JSR scope matching your account or org, then prefix it.
- 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
- Register a JSR scope once and prefix every package name with it.
- Add a CI lint for package names matching /^@scope\//.
- Remember: unlike npm, JSR has no unscoped names.
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
- refusing to write tarball with unsafe name derived from pack
- package name must not contain additional path segments
- package name must use the '@<scope>/<package>' format
- package name must not contain dot path segments
- package name contains a URL path or delimiter character
AI-assisted analysis of denoland/deno@9ad36f7a2c (2026-08-20).
Data as JSON: /api/errors/e134d0da8a6de594.
Report an issue: GitHub.