{"record":{"id":"8ff27844392911f4","repo":"yarnpkg/yarn","slug":"noversion","errorCode":null,"errorMessage":"noVersion","messagePattern":"noVersion","errorType":"exception","errorClass":"MessageError","httpStatus":null,"severity":"error","filePath":"src/cli/commands/generate-lock-entry.js","lineNumber":23,"sourceCode":"import {MessageError} from '../../errors.js';\nimport {implodeEntry, stringify} from '../../lockfile';\n\nexport function hasWrapper(commander: Object, args: Array<string>): boolean {\n  return false;\n}\n\nexport async function run(config: Config, reporter: Reporter, flags: Object, args: Array<string>): Promise<void> {\n  let manifest;\n  if (flags.useManifest) {\n    manifest = await config.readJson(flags.useManifest);\n  } else {\n    manifest = await config.readRootManifest();\n  }\n  if (!manifest.name) {\n    throw new MessageError(reporter.lang('noName'));\n  }\n  if (!manifest.version) {\n    throw new MessageError(reporter.lang('noVersion'));\n  }\n\n  const entry = {\n    name: manifest.name,\n    version: manifest.version,\n    resolved: flags.resolved,\n    registry: flags.registry || manifest._registry,\n    optionalDependencies: manifest.optionalDependencies,\n    dependencies: manifest.dependencies,\n  };\n  const pattern = flags.pattern || `${entry.name}@${entry.version}`;\n  reporter.log(\n    stringify({\n      [pattern]: implodeEntry(pattern, entry),\n    }),\n  );\n}\n","sourceCodeStart":5,"sourceCodeEnd":41,"githubUrl":"https://github.com/yarnpkg/yarn/blob/c2dda503f3759b5be5f0e24ecd9cf5c97a540147/src/cli/commands/generate-lock-entry.js#L5-L41","documentation":"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.","triggerScenarios":"`!manifest.version` after the name check — manifest has a name but no (or empty) version.","commonSituations":"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.","solutions":["Add a semver `\"version\"` (e.g. `\"1.0.0\"`) to package.json.","If using `--useManifest`, ensure that file declares a version.","For private apps, still set a version (or avoid `generate-lock-entry`)."],"exampleFix":"// before\n{ \"name\": \"my-pkg\", \"dependencies\": {} }\n\n// after\n{ \"name\": \"my-pkg\", \"version\": \"1.0.0\", \"dependencies\": {} }","handlingStrategy":"validation","validationCode":"import semver from 'semver';\n\nfunction assertManifestHasVersion(m: { version?: string }): void {\n  if (!m.version || !semver.valid(m.version)) {\n    throw new Error('Manifest is missing a valid semver \"version\"');\n  }\n}","typeGuard":"function manifestHasVersion(m: unknown): m is { version: string } {\n  return typeof m === 'object' && m !== null && typeof (m as any).version === 'string' && (m as any).version.length > 0;\n}","tryCatchPattern":null,"preventionTips":["Use a package.json JSON-schema check in CI to catch missing required fields.","For libraries, set version at init and let a release tool (standard-version, semantic-release) bump it."],"tags":["generate-lock-entry","manifest","package-json","version"],"backgroundTag":null,"analyzedSha":"c2dda503f3759b5be5f0e24ecd9cf5c97a540147","analyzedAt":"2026-08-13T04:17:06.305Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}