{"record":{"id":"a889d8d4f818fbab","repo":"denoland/deno","slug":"is-missing-version-field","errorCode":null,"errorMessage":"{} is missing 'version' field","messagePattern":"(.+?) is missing 'version' field","errorType":"exception","errorClass":"AnyError","httpStatus":null,"severity":"error","filePath":"cli/tools/publish/mod.rs","lineNumber":523,"sourceCode":"            );\n          }\n        }\n        Ok(diagnostics_by_folder.into_graph())\n      }\n    }\n  }\n\n  async fn prepare_publish(\n    &self,\n    package: &JsrPackageConfig,\n    graph: Arc<deno_graph::ModuleGraph>,\n    diagnostics_collector: &PublishDiagnosticsCollector,\n  ) -> Result<Rc<PreparedPublishPackage>, AnyError> {\n    let deno_json = &package.config_file;\n    let config_path = deno_json.specifier.to_file_path().unwrap();\n    let root_dir = config_path.parent().unwrap().to_path_buf();\n    let version = deno_json.json.version.clone().ok_or_else(|| {\n      deno_core::anyhow::anyhow!(\n        \"{} is missing 'version' field\",\n        deno_json.specifier\n      )\n    })?;\n    let (scope, name_no_scope) = registry::parse_package_name(&package.name)?;\n    let file_patterns = package.member_dir.to_publish_config()?.files;\n\n    let tarball = deno_core::unsync::spawn_blocking({\n      let diagnostics_collector = diagnostics_collector.clone();\n      let module_content_provider = self.module_content_provider.clone();\n      let cli_options = self.cli_options.clone();\n      let config_path = config_path.clone();\n      let config_url = deno_json.specifier.clone();\n      let has_license_field = package.license.is_some();\n      let current_package_name = package.name.clone();\n      move || {\n        let root_specifier =\n          ModuleSpecifier::from_directory_path(&root_dir).unwrap();","sourceCodeStart":505,"sourceCodeEnd":541,"githubUrl":"https://github.com/denoland/deno/blob/f7822238cab635a3a19f99f493f675fa81a7f9d8/cli/tools/publish/mod.rs#L505-L541","documentation":"Every package published to JSR must carry a version, so `deno publish` reads `version` from the member's deno.json (`deno_json.json.version`) during preparation and refuses to continue when the field is absent. The message names the exact config file specifier that is missing the field. This is checked per workspace member, so one member without a version fails the whole publish.","triggerScenarios":"A workspace member deno.json that declares `name`, `exports`, but no `version`; converting a private workspace package (never published, no version needed) into a publishable one without adding the field; publishing a single-package repo whose deno.json only has name/imports.","commonSituations":"Workspaces where the root deno.json has a version and the author assumes members inherit it (for deno.json members you must declare `\"version\": \"workspace:...\"` or a literal); scaffolding a new member by copying a template that omitted version; YAML/JSON typo like `Version` (fields are case-sensitive).","solutions":["Open the deno.json named in the error and add a valid semver version, e.g. `\"version\": \"1.0.0\"`.","In a workspace, reuse the root version with `\"version\": \"workspace:...\"` so members stay in sync with the root's `version` field.","Ensure the version is a plain semver string (no 'v' prefix, no range operators) — JSR rejects those at upload anyway.","Re-run `deno publish --dry-run` to confirm the member now passes preparation."],"exampleFix":"// before (member deno.json)\n{\n  \"name\": \"@scope/util\",\n  \"exports\": \"./mod.ts\"\n}\n\n// after\n{\n  \"name\": \"@scope/util\",\n  \"version\": \"workspace:...\",\n  \"exports\": \"./mod.ts\"\n}","handlingStrategy":"validation","validationCode":"import { readManifest } from './deps.ts';\nconst denoJson = JSON.parse(await Deno.readText(memberDenoJsonPath));\nif (!denoJson.version && denoJson.version !== 'workspace:...') {\n  throw new Error(`${memberDenoJsonPath} is missing 'version' field`);\n}","typeGuard":"function isPublishableManifest(\n  m: Record<string, unknown>,\n): boolean {\n  return typeof m.name === 'string' &&\n    (typeof m.version === 'string' || m.version === 'workspace:...');\n}","tryCatchPattern":"try {\n  await runDeno(['publish']);\n} catch (e) {\n  if (String(e.message).includes(\"missing 'version' field\")) {\n    // add \"version\" to the deno.json named in the message, then re-run\n  }\n}","preventionTips":["Scaffold new workspace members from a template that includes version.","In workspaces, use `\"version\": \"workspace:...\"` in members to inherit the root version.","Validate all member deno.json files in a pre-publish CI check."],"tags":["publish","jsr","deno-json","manifest-field","version"],"backgroundTag":"missing-manifest-field","analyzedSha":"f7822238cab635a3a19f99f493f675fa81a7f9d8","analyzedAt":"2026-08-20T13:07:44.778Z","contentChangedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}