{"record":{"id":"ebd09af47aab377f","repo":"Foundry376/Mailspring","slug":"base-mark-plugin-does-not-look-at-nested-marks-fro","errorCode":null,"errorMessage":"base-mark-plugin does not look at nested marks from subsequent plugins","messagePattern":"base-mark-plugin does not look at nested marks from subsequent plugins","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/components/composer-editor/base-mark-plugins.tsx","lineNumber":260,"sourceCode":"          object: 'mark',\n          type: 'face',\n          data: { value: el.getAttribute('face') },\n        });\n      }\n\n      if (marks.length) {\n        // we are going to return a value! This means other plugins won't\n        // have a chance to execute on this node in the DOM. But we may want\n        // plugins (eg link-plugin), to add more marks. Manually run them\n        // and collect any additional marks:\n        plugins = plugins || require('./conversion').plugins;\n        const subsequentPlugins = plugins.slice(plugins.findIndex((p) => p.rules === rules) + 1);\n        for (const p of subsequentPlugins) {\n          for (const { deserialize } of p.rules || []) {\n            const result = deserialize && deserialize(el, () => []);\n            if (result && result.object === 'mark') {\n              if (result.object.nodes && result.object.nodes.length) {\n                console.warn(\n                  'base-mark-plugin does not look at nested marks from subsequent plugins'\n                );\n              }\n              marks.push(result);\n            }\n          }\n        }\n\n        // convert array of marks into a tree. If the marks are on a BLOCK\n        // tagname, also nest the marks within the block node that would\n        // have been created, since the block will not be created if we return\n        // a value.\n        let block = null;\n        for (const plugin of BaseBlockPlugins) {\n          if (block) break;\n          if (!plugin.rules) continue;\n          for (const { deserialize } of plugin.rules) {\n            block = deserialize(el, next);","sourceCodeStart":242,"sourceCodeEnd":278,"githubUrl":"https://github.com/Foundry376/Mailspring/blob/648c685d602ece6bb00c22534b8734de6ac644b3/app/src/components/composer-editor/base-mark-plugins.tsx#L242-L278","documentation":"Warning in base-mark-plugin's deserialize: when the plugin produces marks from an HTML node it returns immediately, skipping later plugins' rules. It manually re-runs subsequent plugins to collect nested marks, and this warning fires in that compatibility path to flag that legacy stacked formatting may be lossy.","triggerScenarios":"Thrown at app/src/components/composer-editor/base-mark-plugins.tsx:260 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["For plugin authors: register dedicated rules for combined formatting instead of relying on the manual re-run","For users: reapply lost formatting (e.g. a link inside bold text) after pasting HTML"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"648c685d602ece6bb00c22534b8734de6ac644b3","analyzedAt":"2026-09-03T02:00:24.311Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T07:17:11.731Z"}