hast-util-to-jsx-runtime

hast utility to transform a tree to preact, react, solid, svelte, vue, etc.,
with an automatic JSX runtime.
Contents
What is this?
This package is a utility that takes a hast tree and an
automatic JSX runtime and turns the tree into anything you
whish.
When should I use this?
You can use this package when you have a hast syntax tree and want to use it
with whatever framework.
This package uses an automatic JSX runtime, which is a sort of lingua franca
for frameworks to support JSX.
Notably, automatic runtimes have support for passing extra information in
development, and have guaranteed support for fragments.
Install
This package is ESM only.
In Node.js (version 14.14+ and 16.0+), install with npm:
npm install hast-util-to-jsx-runtime
In Deno with esm.sh
:
import {toJsxRuntime} from "https://esm.sh/hast-util-to-jsx-runtime@1"
In browsers with esm.sh
:
<script type="module">
import {toJsxRuntime} from "https://esm.sh/hast-util-to-jsx-runtime@1?bundle"
</script>
Use
import {h} from 'hastscript'
import {toJsxRuntime} from 'hast-util-to-jsx-runtime'
import {Fragment, jsx, jsxs} from 'react/jsx-runtime'
import {renderToStaticMarkup} from 'react-dom/server'
const tree = h('h1', 'Hello, world!')
const doc = renderToStaticMarkup(toJsxRuntime(tree, {Fragment, jsx, jsxs}))
console.log(doc)
Yields:
<h1>Hello, world!</h1>
API
This package exports the identifier toJsxRuntime
.
There is no default export.
toJsxRuntime(tree, options)
Transform a hast tree to preact, react, solid, svelte, vue, etc., with an
automatic JSX runtime.
Parameters
tree
(Node
)
— tree to transformoptions
(Options
, required)
— configuration
Returns
Result from your configured JSX runtime (JSX.Element
).
Options
Configuration (TypeScript type).
Fields
Fragment
Fragment (Fragment
, required).
jsx
Dynamic JSX (Jsx
, required in production).
jsxs
Static JSX (Jsx
, required in production).
jsxDEV
Development JSX (JsxDev
, required in development).
development
Whether to use jsxDEV
when on or jsx
and jsxs
when off (boolean
,
default: false
).
filePath
File path to the original source file (string
, optional).
Passed in source info to jsxDEV
when using the automatic runtime with
development: true
.
space
Whether tree
is in the 'html'
or 'svg'
space (Space
, default:
'html'
).
When an <svg>
element is found in the HTML space, this package already
automatically switches to and from the SVG space when entering and exiting
it.
👉 Note: hast is not XML.
It supports SVG as embedded in HTML.
It does not support the features available in XML.
Passing SVG might break but fragments of modern SVG should be fine.
Use xast
if you need to support SVG as XML.
Fragment
Represent the children, typically a symbol (TypeScript type).
Type
type Fragment = unknown
Jsx
Create a production element (TypeScript type).
Parameters
type
(unknown
)
— element type: the Fragment
symbol or a tag name (string
)props
(Props
)
— element props and also includes children
key
(string
or undefined
)
— dynamicly generated key to use
Returns
An element from your framework (JSX.Element
).
JsxDev
Create a development element (TypeScript type).
Parameters
type
(unknown
)
— element type: the Fragment
symbol or a tag name (string
)props
(Props
)
— element props and also includes children
key
(string
or undefined
)
— dynamicly generated key to useisStaticChildren
(boolean
)
— whether more than one children are usedsource
(Source
)
— info about sourceself
(undefined
)
— nothing (this is used by frameworks that have components, we don’t)
Returns
An element from your framework (JSX.Element
).
Props
Properties and children (TypeScript type).
Type
type Props = {
children: Array<JSX.Element | string>
[prop: string]:
| string
| number
| boolean
| Record<string, string>
| Array<JSX.Element | string>
}
Source
Info about source (TypeScript type).
Fields
fileName
(string
or undefined
)
— name of source filelineNumber
(number
or undefined
)
— line where thing starts (1-indexed)columnNumber
(number
or undefined
)
— column where thing starts (0-indexed)
Space
Namespace (TypeScript type).
Type
type Space = 'html' | 'svg'
Examples
Example: Preact
import {h} from 'hastscript'
import {toJsxRuntime} from 'hast-util-to-jsx-runtime'
import {Fragment, jsx, jsxs} from 'preact/jsx-runtime'
import {render} from 'preact-render-to-string'
const result = render(toJsxRuntime(h('h1', 'hi!'), {Fragment, jsx, jsxs}))
console.log(result)
Yields:
<h1>hi!</h1>
Example: Vue
import {h} from 'hastscript'
import {toJsxRuntime} from 'hast-util-to-jsx-runtime'
import {Fragment, jsx, jsxs} from 'vue-jsx-runtime/jsx-runtime'
import serverRenderer from '@vue/server-renderer'
console.log(
await serverRenderer.renderToString(
toJsxRuntime(h('h1', 'hi!'), {Fragment, jsx, jsxs})
)
)
Yields:
<h1>hi!</h1>
Example: Solid
import {h} from 'hastscript'
import {toJsxRuntime} from 'hast-util-to-jsx-runtime'
import {Fragment, jsx, jsxs} from 'solid-jsx/jsx-runtime'
console.log(toJsxRuntime(h('h1', 'hi!'), {Fragment, jsx, jsxs}).t)
Yields:
<h1 >hi!</h1>
Example: Svelte
I have no clue how to render a Svelte component in Node, but you can get that
component with:
import {h} from 'hastscript'
import {toJsxRuntime} from 'hast-util-to-jsx-runtime'
import {Fragment, jsx, jsxs} from 'svelte-jsx'
const svelteComponent = toJsxRuntime(h('h1', 'hi!'), {Fragment, jsx, jsxs})
console.log(svelteComponent)
Yields:
[class Component extends SvelteComponent]
Syntax
HTML is parsed according to WHATWG HTML (the living standard), which is also
followed by browsers such as Chrome, Firefox, and Safari.
Types
This package is fully typed with TypeScript.
It exports the additional types Fragment
, Jsx
,
JsxDev
, Options
, Props
, Source
,
and Space
.
The function toJsxRuntime
returns a JSX.Element
, which means that the JSX
namespace has to by typed.
Typically this is done by installing your frameworks types (e.g.,
@types/react
), which you likely already have.
Compatibility
Projects maintained by the unified collective are compatible with all maintained
versions of Node.js.
As of now, that is Node.js 14.14+ and 16.0+.
Our projects sometimes work with older versions, but this is not guaranteed.
Security
Be careful with user input in your hast tree.
Use hast-util-santize
to make hast trees safe.
Related
Contribute
See contributing.md
in syntax-tree/.github
for
ways to get started.
See support.md
for ways to get help.
This project has a code of conduct.
By interacting with this repository, organization, or community you agree to
abide by its terms.
License
MIT © Titus Wormer