hast-util-to-estree
hast utility to transform a tree to estree JSX.
Install
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:
var fs = require('fs')
var parse5 = require('parse5')
var fromParse5 = require('hast-util-from-parse5')
var toEstree = require('hast-util-to-estree')
var recast = require('recast')
var hast = fromParse5(parse5.parse(String(fs.readFileSync('example.html'))))
var 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" />
API
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.