yarnpkg/yarn · error · MessageError
invalidPackageName
Error message
invalidPackageName
What it means
Thrown by getName() in 'yarn tag' when the resolved package name fails npm's package-name validation (isValidPackageName). The name is resolved from the first positional arg, falling back to the root manifest's 'name' field; if that name violates npm naming rules (lowercase only, no leading '.'/'_', <=214 chars, no spaces), the command aborts before contacting the registry.
Source
Thrown at src/cli/commands/tag.js:22
import type Config from '../../config.js';
import buildSubCommands from './_build-sub-commands.js';
import {getToken} from './login.js';
import NpmRegistry from '../../registries/npm-registry.js';
import {MessageError} from '../../errors.js';
import {normalizePattern} from '../../util/normalize-pattern.js';
import {isValidPackageName} from '../../util/normalize-manifest/validate.js';
export async function getName(args: Array<string>, config: Config): Promise<string> {
let name = args.shift();
if (!name) {
const pkg = await config.readRootManifest();
name = pkg.name;
}
if (name) {
if (!isValidPackageName(name)) {
throw new MessageError(config.reporter.lang('invalidPackageName'));
}
return NpmRegistry.escapeName(name);
} else {
throw new MessageError(config.reporter.lang('unknownPackageName'));
}
}
async function list(config: Config, reporter: Reporter, flags: Object, args: Array<string>): Promise<void> {
const name = await getName(args, config);
reporter.step(1, 1, reporter.lang('gettingTags'));
const tags = await config.registries.npm.request(`-/package/${name}/dist-tags`);
if (tags) {
reporter.info(`Package ${name}`);
for (const name in tags) {
reporter.info(`${name}: ${tags[name]}`);View on GitHub (pinned to c2dda503f3)
Solutions
- Edit package.json and set a valid npm 'name' (lowercase, no spaces, dashes/underscores allowed, no leading '.' or '_', <=214 chars).
- Pass a valid name explicitly as the first CLI argument: 'yarn tag <valid-name>'.
- If scoped, ensure the format is '@scope/name' with lowercase scope and name.
Example fix
// before (package.json)
{ "name": "My.App" }
// after
{ "name": "my-app" } Defensive patterns
Strategy: validation
Validate before calling
import {isValidPackageName} from '../../util/normalize-manifest/validate.js';
function assertValidName(name: string) {
if (!isValidPackageName(name)) {
throw new Error(`Refusing to run 'yarn tag': invalid package name "${name}"`);
}
}
// before calling getName / tag:
assertValidName(nameFromArgOrManifest); Type guard
const NPM_NAME_RE = /^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/;
function isValidNpmName(name: unknown): name is string {
return typeof name === 'string'
&& name.length > 0
&& name.length <= 214
&& !name.startsWith('.') && !name.startsWith('_')
&& NPM_NAME_RE.test(name);
} Prevention
- Lint package.json 'name' at commit time (e.g. via a CI check or npm-package-arg validation).
- Always pass an explicit, validated name to 'yarn tag' rather than relying on the manifest.
- Keep names lowercase and dash-separated by convention.
When it happens
Trigger: Running 'yarn tag', 'yarn tag add', or 'yarn tag rm' where args[0] (or pkg.name from readRootManifest) is e.g. 'My.Pkg', 'foo bar', or exceeds 214 characters, so isValidPackageName(name) returns false.
Common situations: package.json 'name' contains uppercase letters, spaces, or a leading dot/underscore; user passes a scoped name with bad formatting (@scope/x is fine, '@Scope/x' is not); copy-pasted name from a non-npm source.
Related errors
- Name should not start with "/", got "${str}"
- Name should not start with ".", got "${str}"
- invalidPackageName
- requiredVersionInRange
- tooFewArguments
AI-assisted analysis of yarnpkg/yarn@c2dda503f3 (2026-08-13).
Data as JSON: /api/errors/c85527655a77101d.
Report an issue: GitHub.