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

  1. For plugin authors: register dedicated rules for combined formatting instead of relying on the manual re-run
  2. 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.