yarnpkg/yarn · error · MessageError

noName

Error message

noName

What it means

`yarn generate-lock-entry` reads a manifest (from `--useManifest <file>` or the root `package.json`) and at `generate-lock-entry.js:20` requires a `name` field. Its absence throws `noName` ('Package doesn't have a name.') because a lockfile entry cannot be keyed without a package name.

Source

Thrown at src/cli/commands/generate-lock-entry.js:20

import type {Reporter} from '../../reporters/index.js';
import type Config from '../../config.js';
import {MessageError} from '../../errors.js';
import {implodeEntry, stringify} from '../../lockfile';

export function hasWrapper(commander: Object, args: Array<string>): boolean {
  return false;
}

export async function run(config: Config, reporter: Reporter, flags: Object, args: Array<string>): Promise<void> {
  let manifest;
  if (flags.useManifest) {
    manifest = await config.readJson(flags.useManifest);
  } else {
    manifest = await config.readRootManifest();
  }
  if (!manifest.name) {
    throw new MessageError(reporter.lang('noName'));
  }
  if (!manifest.version) {
    throw new MessageError(reporter.lang('noVersion'));
  }

  const entry = {
    name: manifest.name,
    version: manifest.version,
    resolved: flags.resolved,
    registry: flags.registry || manifest._registry,
    optionalDependencies: manifest.optionalDependencies,
    dependencies: manifest.dependencies,
  };
  const pattern = flags.pattern || `${entry.name}@${entry.version}`;
  reporter.log(
    stringify({
      [pattern]: implodeEntry(pattern, entry),
    }),

View on GitHub (pinned to c2dda503f3)

Solutions

  1. Add a `"name"` field to the relevant package.json.
  2. Point `--useManifest` at a complete manifest file.
  3. Validate the manifest with `npm-package-arg`/`normalize-package-data` before generating.

Example fix

// before
// package.json
{ "version": "1.0.0", "dependencies": {} }
$ yarn generate-lock-entry
→ Package doesn't have a name.

// after
{ "name": "my-pkg", "version": "1.0.0", "dependencies": {} }
Defensive patterns

Strategy: validation

Validate before calling

import {readJson} from './io';

async function assertManifestHasName(file: string): Promise<void> {
  const m = await readJson(file);
  if (!m || typeof m.name !== 'string' || !m.name) {
    throw new Error(`Manifest ${file} is missing a "name" field`);
  }
}
// await assertManifestHasName(flags.useManifest || './package.json');

Type guard

function manifestHasName(m: unknown): m is { name: string } {
  return typeof m === 'object' && m !== null && typeof (m as any).name === 'string' && (m as any).name.length > 0;
}

Prevention

When it happens

Trigger: `!manifest.name` after `config.readJson(flags.useManifest)` or `config.readRootManifest()` — the loaded manifest object has no `name` property.

Common situations: A scratch/private `package.json` with only dependencies and no name, or pointing `--useManifest` at a JSON file that is not a real manifest.

Related errors


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