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
- Add a `"name"` field to the relevant package.json.
- Point `--useManifest` at a complete manifest file.
- 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
- Run manifests through `normalize-package-data` (or validate-package-json schema) before codegen.
- Keep a package.json template that already has name+version.
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.