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

  1. Edit package.json and set a valid npm 'name' (lowercase, no spaces, dashes/underscores allowed, no leading '.' or '_', <=214 chars).
  2. Pass a valid name explicitly as the first CLI argument: 'yarn tag <valid-name>'.
  3. 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

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


AI-assisted analysis of yarnpkg/yarn@c2dda503f3 (2026-08-13). Data as JSON: /api/errors/c85527655a77101d. Report an issue: GitHub.