yarnpkg/yarn · error · MessageError

noVersion

Error message

noVersion

What it means

Immediately after the `name` check, `generate-lock-entry.js:23` requires a `version` field (`if (!manifest.version)` → `noVersion`, 'Package doesn't have a version.'). A lockfile entry needs `name@version` to form its pattern, so a missing version is fatal.

Source

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

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 semver `"version"` (e.g. `"1.0.0"`) to package.json.
  2. If using `--useManifest`, ensure that file declares a version.
  3. For private apps, still set a version (or avoid `generate-lock-entry`).

Example fix

// before
{ "name": "my-pkg", "dependencies": {} }

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

Strategy: validation

Validate before calling

import semver from 'semver';

function assertManifestHasVersion(m: { version?: string }): void {
  if (!m.version || !semver.valid(m.version)) {
    throw new Error('Manifest is missing a valid semver "version"');
  }
}

Type guard

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

Prevention

When it happens

Trigger: `!manifest.version` after the name check — manifest has a name but no (or empty) version.

Common situations: Work-in-progress package.json with a name but version not yet set, or `"version"` removed for a private app that was never meant to publish but is now fed to this command.

Related errors


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