{"id":"ff9ea9f1b58426e9","repo":"eslint/eslint","slug":"key-processor-could-not-find-localprocessorn","errorCode":null,"errorMessage":"Key \"processor\": Could not find \"${localProcessorName}\" in plugin \"${pluginName}\".","messagePattern":"Key \"processor\": Could not find \"(.+?)\" in plugin \"(.+?)\"\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lib/config/config.js","lineNumber":534,"sourceCode":"\t\t}\n\n\t\t// Check processor value\n\t\tif (processor) {\n\t\t\tthis.processor = processor;\n\n\t\t\tif (typeof processor === \"string\") {\n\t\t\t\tconst { pluginName, objectName: localProcessorName } =\n\t\t\t\t\tsplitPluginIdentifier(processor);\n\n\t\t\t\tthis.#processorName = processor;\n\n\t\t\t\tif (\n\t\t\t\t\t!plugins ||\n\t\t\t\t\t!plugins[pluginName] ||\n\t\t\t\t\t!plugins[pluginName].processors ||\n\t\t\t\t\t!plugins[pluginName].processors[localProcessorName]\n\t\t\t\t) {\n\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t`Key \"processor\": Could not find \"${localProcessorName}\" in plugin \"${pluginName}\".`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.processor =\n\t\t\t\t\tplugins[pluginName].processors[localProcessorName];\n\t\t\t} else if (typeof processor === \"object\") {\n\t\t\t\tthis.#processorName = getObjectId(processor);\n\t\t\t\tthis.processor = processor;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\"Key 'processor' must be a string or an object.\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Process the rules\n\t\tif (this.rules) {","sourceCodeStart":516,"sourceCodeEnd":552,"githubUrl":"https://github.com/eslint/eslint/blob/f131c034ad91bbf06bcbb6b5e931447a8e419a46/lib/config/config.js#L516-L552","documentation":"Thrown as a TypeError in the Config constructor (config.js:534) when `processor` is a string but the referenced plugin/processor cannot be resolved. The lookup is plugins[pluginName].processors[localProcessorName]; missing plugin, missing `processors`, or a wrong processor name all trigger it.","triggerScenarios":"Setting `processor: 'foo/bar'` where plugin 'foo' is absent, or 'foo' exists but exports no `processors.bar`. Also typos/renames after a plugin upgrade.","commonSituations":"Referencing a processor (e.g. markdown processor) without registering its plugin; using the preprocessor name from an older plugin version; copy-pasting a config snippet whose plugin wasn't added.","solutions":["Add the plugin providing the processor to `plugins`.","Confirm the processor key: `console.log(Object.keys(plugin.processors))`.","Check spelling and version of the plugin; processors are sometimes renamed across majors."],"exampleFix":"// before\n{ processor: 'markdown/markdown', plugins: {} }\n\n// after\nimport markdown from 'eslint-plugin-markdown';\n{ processor: 'markdown/markdown', plugins: { markdown } }","handlingStrategy":"validation","validationCode":"function resolveProcessor(plugins, processor) {\n  const [pluginName, name] = processor.split('/');\n  return !!plugins?.[pluginName]?.processors?.[name];\n}","typeGuard":"null","tryCatchPattern":"try { new Config(block); }\ncatch (e) {\n  if (/Key \"processor\".*Could not find/.test(e.message)) { /* add plugin */ }\n}","preventionTips":["Register the plugin providing each processor in the same block.","Confirm processor names against the plugin's current export list.","Re-test configs after major plugin upgrades."],"tags":["config","processor","plugin","flat-config"],"analyzedSha":"f131c034ad91bbf06bcbb6b5e931447a8e419a46","analyzedAt":"2026-08-03T19:53:24.025Z","schemaVersion":2}