README
hast-util-to-estree
hast utility to transform a tree to estree JSX.
Install
This package is ESM only:
Node 12+ is needed to use it and it must be import
ed instead of require
d.
npm:
npm install hast-util-to-estree
Use
Say we have the following HTML file, example.html
:
<!doctype html>
<html lang=en>
<title>Hi!</title>
<link rel=stylesheet href=index.css>
<h1>Hello, world!</h1>
<a download style="width:1;height:10px"></a>
<!--commentz-->
<svg xmlns="http://www.w3.org/2000/svg">
<title>SVG `<ellipse>` element</title>
<ellipse
cx="120"
cy="70"
rx="100"
ry="50"
/>
</svg>
<script src="index.js"></script>
And our script, example.js
, is:
import fs from 'node:fs'
import parse5 from 'parse5'
import {fromParse5} from 'hast-util-from-parse5'
import {toEstree} from 'hast-util-to-estree'
import recast from 'recast'
const hast = fromParse5(parse5.parse(String(fs.readFileSync('example.html'))))
const estree = toEstree(hast)
estree.comments = null // `recast` doesn’t like comments on the root.
console.log(recast.prettyPrint(estree).code)
Now, node example
(and prettier), yields:
;<>
<html lang="en">
<head>
<title>{'Hi!'}</title>
{'\n'}
<link rel="stylesheet" href="index.css" />
{'\n'}
</head>
<body>
<h1>{'Hello, world!'}</h1>
{'\n'}
<a
download
style={{
width: '1',
height: '10px'
}}
/>
{'\n'}
{/*commentz*/}
{'\n'}
<svg xmlns="http://www.w3.org/2000/svg">
{'\n '}
<title>{'SVG `<ellipse>` element'}</title>
{'\n '}
<ellipse cx="120" cy="70" rx="100" ry="50" />
{'\n'}
</svg>
{'\n'}
<script src="index.js" />
{'\n'}
</body>
</html>
</>
API
This package exports the following identifiers: toEstree
.
There is no default export.
toEstree(tree, options?)
Transform a hast tree to an estree (JSX).
options
space
(enum,'svg'
or'html'
, default:'html'
) — Whether node is in the'html'
or'svg'
space. If ansvg
element is found when inside the HTML space,toEstree
automatically switches to the SVG space when entering the element, and switches back when exiting
Returns
estree — a Program node, whose last child in body
is most
likely an ExpressionStatement
whose expression is a JSXFragment
or a
JSXElement
.
Typically, there is only one node in body
, however, this utility also supports
embedded MDX nodes in the HTML (when mdast-util-mdx
is used
with mdast to parse markdown before passing its nodes through to hast).
When MDX ESM import/exports are used, those nodes are added before the fragment
or element in body.
Note
Comments are both attached to the tree in their neighbouring nodes (recast and
babel style), and added as a comments
array on the program node (espree
style).
You may have to do program.comments = null
for certain compilers.
There aren’t many great estree serializers out there that support JSX.
recast does a fine job.
Or use estree-util-build-jsx
to turn JSX into function
calls and then serialize with whatever (astring, escodegen).
Security
You’re working with JavaScript. It’s not safe.
Related
hastscript
— Hyperscript compatible interface for creating nodeshast-util-from-dom
— Transform a DOM tree to hastunist-builder
— Create any unist treexastscript
— Create a xast treeestree-util-build-jsx
— Transform JSX to function calls
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.