{"record":{"id":"36ad5864452882a4","repo":"gatsbyjs/gatsby","slug":"you-must-pass-an-object-into-setpluginstatus-what","errorCode":null,"errorMessage":"You must pass an object into setPluginStatus. What was passed in was ${JSON.stringify(action.payload, null, 4)}","messagePattern":"You must pass an object into setPluginStatus\\. What was passed in was (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/gatsby/src/redux/reducers/status.ts","lineNumber":38,"sourceCode":"        cdnObfuscatedPrefix: state.cdnObfuscatedPrefix ?? ``,\n      }\n    case `INIT`: {\n      if (!state.cdnObfuscatedPrefix) {\n        state.cdnObfuscatedPrefix = uuid.v4()\n      }\n      return state\n    }\n    case `UPDATE_PLUGINS_HASH`:\n      return {\n        ...state,\n        PLUGINS_HASH: action.payload,\n      }\n    case `SET_PLUGIN_STATUS`:\n      if (!action.plugin || !action.plugin?.name) {\n        throw new Error(`You can't set plugin status without a plugin`)\n      }\n      if (!_.isObject(action.payload)) {\n        throw new Error(\n          `You must pass an object into setPluginStatus. What was passed in was ${JSON.stringify(\n            action.payload,\n            null,\n            4\n          )}`\n        )\n      }\n      return {\n        ...state,\n        plugins: {\n          ...state.plugins,\n          [action.plugin.name]: _.merge(\n            {},\n            state.plugins[action.plugin.name],\n            action.payload\n          ),\n        },\n      }","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/gatsbyjs/gatsby/blob/8b06340921ffdf23125a365b9c9923690cb62ce6/packages/gatsby/src/redux/reducers/status.ts#L20-L56","documentation":"The status reducer's SET_PLUGIN_STATUS case validates that action.payload is an object (via lodash _.isObject) before merging it into state.plugins[plugin.name]. It throws with a JSON dump of the bad payload if a non-object (string, number, array, null, etc.) is passed, because _.merge of a non-object would corrupt or overwrite plugin status incorrectly.","triggerScenarios":"Calling setPluginStatus with a primitive, string, array, or null/undefined payload. Note _.isObject returns true for arrays and functions too, so practically this fires for strings, numbers, booleans, and null.","commonSituations":"Passing a scalar where an object was intended (e.g. setPluginStatus('done') instead of setPluginStatus({ state: 'done' })); serializing status to a JSON string and forgetting to parse it; passing a configuration value directly.","solutions":["Pass a plain object: setPluginStatus({ key: value }).","If you serialized status to JSON, JSON.parse it before passing.","Wrap arrays/scalars in an object: setPluginStatus({ items: arr })."],"exampleFix":"// before\nactions.setPluginStatus('synced')\n// after\nactions.setPluginStatus({ lastSync: new Date().toISOString() })","handlingStrategy":"type-guard","validationCode":"function safeSetPluginStatus(actions, payload) {\n  if (payload === null || typeof payload !== 'object' || Array.isArray(payload)) {\n    throw new TypeError('setPluginStatus payload must be a plain object')\n  }\n  return actions.setPluginStatus(payload)\n}","typeGuard":"function isPlainObject(x) {\n  return !!x && typeof x === 'object' && !Array.isArray(x)\n}","tryCatchPattern":null,"preventionTips":["Always pass a plain object literal to setPluginStatus.","If you serialized status, JSON.parse before sending.","Wrap arrays/scalars in an object key."],"tags":["status","reducer","validation","plugin-api"],"backgroundTag":null,"analyzedSha":"8b06340921ffdf23125a365b9c9923690cb62ce6","analyzedAt":"2026-08-13T02:36:21.405Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}