{"record":{"id":"5ad2e53579152e52","repo":"denoland/deno","slug":"missing-exports-field-in-add-an-exports-fi","errorCode":null,"errorMessage":"Missing 'exports' field in '{}'. Add an exports field like:\n  {\n    \"exports\": \"./mod.ts\",\n    ...\n  }","messagePattern":"Missing 'exports' field in '(.+?)'\\. Add an exports field like:\n  (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/tools/pack/mod.rs","lineNumber":78,"sourceCode":"  // Get package configs\n  let mut packages = cli_options.start_dir.jsr_packages_for_publish();\n  if packages.is_empty() {\n    match cli_options.start_dir.member_deno_json() {\n      Some(deno_json) => {\n        let Some(name) = deno_json.json.name.clone() else {\n          bail!(\n            \"Missing 'name' field in '{}'. Add a package name like:\\n  {{\\n    \\\"name\\\": \\\"@scope/package-name\\\",\\n    ...\\n  }}\",\n            deno_json.specifier\n          );\n        };\n        if deno_json.json.version.is_none() {\n          bail!(\n            \"Missing 'version' field in '{}'. Add a version like:\\n  {{\\n    \\\"version\\\": \\\"1.0.0\\\",\\n    ...\\n  }}\",\n            deno_json.specifier\n          );\n        }\n        if deno_json.json.exports.is_none() {\n          bail!(\n            \"Missing 'exports' field in '{}'. Add an exports field like:\\n  {{\\n    \\\"exports\\\": \\\"./mod.ts\\\",\\n    ...\\n  }}\",\n            deno_json.specifier\n          );\n        }\n\n        packages.push(JsrPackageConfig {\n          name,\n          member_dir: cli_options.start_dir.workspace.root_dir().clone(),\n          config_file: deno_json.clone(),\n          license: deno_json\n            .json\n            .license\n            .as_ref()\n            .and_then(|l| l.as_str().map(|s| s.to_string())),\n          should_publish: true,\n        });\n      }\n      None => {","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/cli/tools/pack/mod.rs#L60-L96","documentation":"`deno pack` requires an `exports` field in the standalone deno.json because JSR packages must declare their entrypoint(s). Without `exports` there is no public API surface to pack. The message suggests the minimal `\"./mod.ts\"` shape.","triggerScenarios":"Running `deno pack` in a directory whose deno.json has `name` and `version` but no `exports` field.","commonSituations":"Library scaffolding where mod.ts exists but exports were never wired up; private scripts mistaken for publishable packages.","solutions":["Add `\"exports\": \"./mod.ts\"` (or an exports map object) pointing at the real entrypoint.","For multi-entry packages use an exports map: `{\"exports\": {\".\": \"./mod.ts\", \"./sub\": \"./sub.ts\"}}`.","If you did not intend to publish this directory, run `deno pack` from the actual package directory instead."],"exampleFix":"// deno.json (before)\n{\n  \"name\": \"@scope/pkg\",\n  \"version\": \"1.0.0\"\n}\n// deno.json (after)\n{\n  \"name\": \"@scope/pkg\",\n  \"version\": \"1.0.0\",\n  \"exports\": \"./mod.ts\"\n}","handlingStrategy":"validation","validationCode":"const cfg = JSON.parse(readFileSync(\"deno.json\", \"utf8\"));\nif (cfg.exports == null) {\n  console.error(\"deno.json is missing required field: exports\");\n  process.exit(1);\n}","typeGuard":"const hasExports = (cfg: unknown): boolean =>\n  typeof cfg === \"object\" && cfg !== null && \"exports\" in cfg;","tryCatchPattern":null,"preventionTips":["Every publishable package needs an entrypoint; fill exports first when scaffolding.","Run `deno publish --dry-run` to validate the manifest shape early.","Use a deno.json JSON schema in your editor to catch missing fields as you type."],"tags":["pack","deno-json","exports"],"backgroundTag":"package-manifest-field-missing","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-08-31T04:17:50.494Z"}