unstale

npm / markdown-to-jsx

markdown-to-jsx

What changed in markdown-to-jsx 9, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-21.

8 breaking1 security9 new APIs and options6 performance4 behavior and defaults40 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.2.1 on npm

markdown-to-jsx 968 changes

Breaking changes 8

  • Dangerous tags are escaped by default across React, HTML, Solid, Vue, and React Native outputs; their bodies and closing tags remain visible as inert text.

    9.10.0release notes

  • Heading ids are generated from plain text rather than raw Markdown, so links, formatting markers, and image alt text no longer affect anchors.

    9.10.0release notes

  • Destinations that conceal dangerous schemes with HTML entities are rejected; compilers omit unsafe href or src values, and direct AST rendering re-checks link targets.

    9.10.0release notes

  • Dangerous url(javascript:…) and similar payloads are stripped from HTML and Markdown string outputs.

    9.10.0release notes

  • Dangerous event-handler and URL attributes, srcdoc, and obfuscated unsafe schemes are stripped before output; safe attributes and data:image URLs remain supported.

    9.9.0release notes

  • A reference definition split across blockquote lines is no longer matched by a link using the raw, unnormalized label.

    9.8.2release notes

  • Each React Native styles key is narrowed to the style type accepted by its component, catching mismatched styles at compile time.

    9.8.0release notes

  • HTML block content on its own line without surrounding blank lines is preserved as literal text; content surrounded by blank lines continues to parse markdown.

    9.7.14release notes

Security 1

  • Markdown with long runs of brackets or footnote markers now parses in linear time, avoiding severe slowdowns when rendering untrusted input on a server.

    9.10.2release notes

New APIs and options 9

  • React Native elements can be replaced with custom components via overrides.

    9.9.0release notes

  • Adds a style key for the checkmark glyph of a GFM task item.

    9.9.0release notes

  • Adds styles.footnote to style React Native footnote references, which now render as superscript.

    9.9.0release notes

  • Adds a style key for the checked-box accent of a GFM task item.

    9.9.0release notes

  • Adds a style key for table cell grid lines.

    9.9.0release notes

  • Adds a style key for the bold table header run.

    9.9.0release notes

  • Adds a style key for table row grid lines.

    9.9.0release notes

  • styles.text sets a base font and color for all text at once.

    9.9.0release notes

  • Adds an option to skip frontmatter detection entirely.

    9.7.14release notes

Performance 6

  • With the option enabled, incomplete-syntax suppression scans only the block that can hold the live edge, reducing repeated work on deeply nested content.

    9.9.0release notes

  • Compiling a large document runs roughly 5–7% quicker, especially for list- and heading-heavy content.

    9.9.0release notes

  • Documents with many bold or italic spans now parse much faster, avoiding sharp slowdowns on very large or adversarial inputs.

    9.8.2release notes

  • The component no longer re-parses unchanged content when a parent re-renders with unchanged props.

    9.8.2release notes

  • Parsing is around 40% faster on large documents, with the biggest gains on link-heavy and code-heavy content.

    9.8.2release notes

  • Markdown with many malformed link starts parses quickly instead of slowing to a crawl on large inputs.

    9.8.1release notes

Behavior and default changes 4

  • The option now works in the React Native renderer, suppressing partial structures during streaming.

    9.9.0release notes

  • React Native output now has readable defaults for headings, code, block spacing, blockquotes, tables, and GFM task items; styles remain customizable.

    9.9.0release notes

  • The component accepts string[] children to support the common JSX case where children arrive as a coalesced array.

    9.8.0release notes

  • Task list items now use row and center-aligned defaults so checkboxes and labels sit on the same line; set styles.listItem to opt out.

    9.8.0release notes

Fixes and other changes 40

  • HTML tag overrides are applied regardless of the casing of the source tag.

    9.10.3release notes

  • Shortcut reference links labeled __proto__ or constructor no longer throw and resolve like any other reference label.

    9.10.3release notes

  • Link destinations preserve punctuation such as underscores while markdown is streamed, preventing generated links from being changed or broken.

    9.10.3release notes

  • Browser bundles no longer crash when reading environment checks because the library no longer imports Node's process module.

    9.10.1release notes

  • PascalCase custom JSX components and hyphenated custom elements retain Markdown children across a blank line, which no longer leaks following content as a sibling.

    9.10.0release notes

  • Headings with identical text receive unique HTML ids; custom slugify still sets the base string, with uniqueness applied afterward.

    9.10.0release notes

  • Rejected image destinations use null in the parsed AST, allowing TypeScript consumers to treat ImageNode.target as string | null.

    9.10.0release notes

  • TypeScript consumers can treat LinkNode.target as string | null, matching rejected link destinations on the parsed AST.

    9.10.0release notes

  • Processing instructions, CDATA sections, declarations, and orphan closing tags are re-emitted exactly as written instead of being reconstructed as generic self-closing elements.

    9.10.0release notes

  • Incomplete HTML is deferred consistently across compilers, including Solid and Vue, while ordinary less-than text continues rendering.

    9.10.0release notes

  • Backslashes before pipes in table cells are escaped when compiling to Markdown, preventing the pipe from splitting the row when reparsed.

    9.10.0release notes

  • Single-line script, style, pre, and textarea blocks preserve their text content when tagfilter is off, including under forceInline.

    9.10.0release notes

  • The last paragraph inside a blockquote no longer leaves extra space below it.

    9.9.0release notes

  • Compiled Markdown better round-trips to the same document, preserving literal characters, table and list structure, code delimiters, titles, raw HTML attributes, and empty inline elements.

    9.9.0release notes

  • Tables remain hidden until enough syntax has streamed to render them, then stay visible as rows arrive, across every renderer.

    9.9.0release notes

  • Footnote references render as superscript instead of bold, and notes in the list appear on one line next to their numbers.

    9.9.0release notes

  • Fixes React key warnings when raw HTML mixes with other content or a custom component follows a heading.

    9.9.0release notes

  • Prevents crashes when text, block elements, or images are mixed; image links remain tappable.

    9.9.0release notes

  • Vue renderRule types now allow a custom rule and its next callback to return arrays of nodes.

    9.9.0release notes

  • URLs containing emoji and other non-BMP Unicode characters render without crashing.

    9.9.0release notes

  • Text on its own line after a nested HTML element now renders when no blank line separates them, consistently across React, React Native, Solid, and Vue outputs.

    9.8.2release notes

  • Fast-skip no longer truncates bare email local-parts containing inline-special characters.

    9.8.1release notes

  • React Native overrides now fire for parsed markdown elements, including inline emphasis, fenced code, headings, lists, and GFM task checkboxes.

    9.8.0release notes

  • Lists, blockquotes, fenced code, and headings inside table cells now render as nested content without breaking surrounding rows or dropping closing tags.

    9.7.16release notes

  • Fixes the Vue adapter warning about a non-function default slot when component overrides are used.

    9.7.14release notes

  • The HTML compiler now preserves closing tags for empty non-void elements.

    9.7.14release notes

  • Frontmatter detection no longer consumes content when a thematic break starts the document; detection now validates YAML key-value syntax.

    9.7.14release notes

  • Markdown lists inside HTML table cells now render as proper nested lists instead of breaking the table structure.

    9.7.14release notes

  • Adds key props to thead and tbody in table rendering to resolve a React key warning.

    9.7.14release notes

  • Void HTML elements no longer drop subsequent content when they are not followed by a newline.

    9.7.14release notes

  • Fixes streaming mode incorrectly stripping self-closing custom component tags and leaking incomplete trailing tags as escaped text in inline content.

    9.7.13release notes

  • Fixes missing TypeScript declaration files in the published package so consumers can use its types.

    9.7.12release notes

  • Tables with only a header row and no data rows no longer render an empty tbody.

    9.7.11release notes

  • Fixes the development warning “Attempted to render without development properties” in React 19 RSC.

    9.7.11release notesrelease notes

  • Trailing asterisks are trimmed from bare URLs wrapped in bold Markdown so generated link hrefs are correct.

    9.7.10release notes

  • Emphasis delimiters closing before hard line breaks are now resolved correctly.

    9.7.10release notes

  • Raw React elements now unconditionally include _store so React dev-mode validation works across bundler environments.

    9.7.10release notes

  • Fixed broken exports in bundled output caused by a Bun bundler bug with cross-entry re-exports.

    9.7.8release notes

  • Nested HTML blocks with the same tag name now correctly match depth-paired closing tags.

    9.7.7release notes

  • Ambiguous Setext headings are suppressed during streaming to avoid premature heading rendering.

    9.7.7release notes