Foundry376/Mailspring · error
base-mark-plugin does not look at nested marks from subseque
Error message
base-mark-plugin does not look at nested marks from subsequent plugins
What it means
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.
Source
Thrown at app/src/components/composer-editor/base-mark-plugins.tsx:260
object: 'mark',
type: 'face',
data: { value: el.getAttribute('face') },
});
}
if (marks.length) {
// we are going to return a value! This means other plugins won't
// have a chance to execute on this node in the DOM. But we may want
// plugins (eg link-plugin), to add more marks. Manually run them
// and collect any additional marks:
plugins = plugins || require('./conversion').plugins;
const subsequentPlugins = plugins.slice(plugins.findIndex((p) => p.rules === rules) + 1);
for (const p of subsequentPlugins) {
for (const { deserialize } of p.rules || []) {
const result = deserialize && deserialize(el, () => []);
if (result && result.object === 'mark') {
if (result.object.nodes && result.object.nodes.length) {
console.warn(
'base-mark-plugin does not look at nested marks from subsequent plugins'
);
}
marks.push(result);
}
}
}
// convert array of marks into a tree. If the marks are on a BLOCK
// tagname, also nest the marks within the block node that would
// have been created, since the block will not be created if we return
// a value.
let block = null;
for (const plugin of BaseBlockPlugins) {
if (block) break;
if (!plugin.rules) continue;
for (const { deserialize } of plugin.rules) {
block = deserialize(el, next);View on GitHub (pinned to 648c685d60)
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
Defensive patterns
Strategy: fallback
When it happens
Trigger: Thrown at app/src/components/composer-editor/base-mark-plugins.tsx:260 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of Foundry376/Mailspring@648c685d60 (2026-09-03).
Data as JSON: /api/errors/ebd09af47aab377f.
Report an issue: GitHub.