{"record":{"id":"44e4f8383cbd68b6","repo":"remix-run/react-router","slug":"package-json-pkgkey-are-invalid","errorCode":null,"errorMessage":"package.json ${pkgKey} are invalid","messagePattern":"package\\.json (.+?) are invalid","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/create-react-router/index.ts","lineNumber":695,"sourceCode":"    error(\n      \"Oh no!\",\n      \"The provided template must be a React Router project with a `package.json` \" +\n        `file, but that file is invalid.`,\n    );\n    throw err;\n  }\n\n  for (let pkgKey of [\"dependencies\", \"devDependencies\"] as const) {\n    let dependencies = packageJSON[pkgKey];\n    if (!dependencies) continue;\n\n    if (!isValidJsonObject(dependencies)) {\n      error(\n        \"Oh no!\",\n        \"The provided template must be a React Router project with a `package.json` \" +\n          `file, but its ${pkgKey} value is invalid.`,\n      );\n      throw new Error(`package.json ${pkgKey} are invalid`);\n    }\n\n    for (let dependency in dependencies) {\n      let version = dependencies[dependency];\n      if (\n        (dependency.startsWith(\"@react-router/\") ||\n          dependency === \"react-router\") &&\n        version === \"*\"\n      ) {\n        dependencies[dependency] = semver.prerelease(ctx.reactRouterVersion)\n          ? // Templates created from prereleases should pin to a specific version\n            ctx.reactRouterVersion\n          : \"^\" + ctx.reactRouterVersion;\n      }\n    }\n  }\n\n  packageJSON.name = ctx.projectName;","sourceCodeStart":677,"sourceCodeEnd":713,"githubUrl":"https://github.com/remix-run/react-router/blob/6beaca39526d5716c3c112ebb0782765baa5a9ce/packages/create-react-router/index.ts#L677-L713","documentation":"While normalizing the template's package.json, updatePackageJSON() iterates dependencies and devDependencies; if one of those fields is present but not a plain JSON object (isValidJsonObject fails — e.g. an array, string, or number), it cannot rewrite react-router versions and aborts. A missing field is fine; a malformed one is not.","triggerScenarios":"Template package.json containing \"dependencies\": [], \"devDependencies\": \"latest\", or similar non-object values; generated templates that emit strings instead of maps.","commonSituations":"Hand-edited or machine-generated templates with malformed manifest fields.","solutions":["Make dependencies/devDependencies objects mapping package names to version ranges","Remove the invalid field entirely if the template has no dependencies","Fix the template source and re-run the scaffold"],"exampleFix":"// before: template package.json\n{ \"name\": \"tpl\", \"dependencies\": [\"react-router\"] }\n\n// after\n{ \"name\": \"tpl\", \"dependencies\": { \"react-router\": \"*\", \"react\": \"^19.0.0\", \"react-dom\": \"^19.0.0\" } }","handlingStrategy":"validation","validationCode":"import fs from \"node:fs\";\n\nfunction isValidJsonObject(v: unknown): v is Record<string, unknown> {\n  return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction validateTemplateManifest(pkgPath: string): void {\n  const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"));\n  for (const key of [\"dependencies\", \"devDependencies\"] as const) {\n    if (pkg[key] !== undefined && !isValidJsonObject(pkg[key])) {\n      throw new Error(`package.json ${key} must be an object of name -> version range`);\n    }\n  }\n}\n\nvalidateTemplateManifest(\"./template/package.json\");","typeGuard":"function isValidJsonObject(v: unknown): v is Record<string, unknown> {\n  return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}","tryCatchPattern":"try {\n  await createReactRouter(args);\n} catch (e) {\n  const msg = e instanceof Error ? e.message : String(e);\n  if (/package\\.json (dependencies|devDependencies) are invalid/.test(msg)) {\n    console.error(\"Fix the template manifest: dependency fields must be objects.\");\n    process.exit(1);\n  }\n  throw e;\n}","preventionTips":["Run a manifest lint (npm pkg get dependencies) on templates before publishing","Generate package.json with npm/pkg-manager commands rather than string templates","Remember: a missing dependencies field is fine; an array or string is not"],"tags":["cli","template","package-json","validation"],"backgroundTag":"malformed-package-json","analyzedSha":"6beaca39526d5716c3c112ebb0782765baa5a9ce","analyzedAt":"2026-08-18T18:04:14.938Z","contentChangedAt":"2026-08-18T18:04:14.938Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}