Socket
Socket
Sign inDemoInstall

estree-util-build-jsx

Package Overview
Dependencies
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

estree-util-build-jsx

Transform JSX in estrees to function calls (for react, preact, and most hyperscript interfaces)


Version published
Weekly downloads
1.2M
increased by1.77%
Maintainers
1
Weekly downloads
 
Created
Source

estree-util-build-jsx

Build Coverage Downloads Size

Transform JSX to function calls: <x /> -> h('x')!

There is currently one project actively maintained that can transform JSX to function calls: Babel. Babel is amazing but ginormous (±300kb) and slow. Switching from it to estree in a project where Babel was only a small part made the whole project 68% smaller and 63% faster. So let’s make that two implementations.

Install

npm:

npm install estree-util-build-jsx

Use

Say we have the following file, example.jsx:

var x = require('xastscript')

console.log(
  <album id={123}>
    <name>Born in the U.S.A.</name>
    <artist>Bruce Springsteen</artist>
    <releasedate date="1984-04-06">April 6, 1984</releasedate>
  </album>
)

console.log(
  <>
    {1 + 1}
    <self-closing />
    <x name key="value" key={expression} {...spread} />
  </>
)

And our script, example.js, looks as follows:

var fs = require('fs')
var acorn = require('acorn')
var jsx = require('acorn-jsx')
var astring = require('astring')
var build = require('estree-util-build-jsx')

var doc = fs.readFileSync('example.jsx')

var tree = acorn.Parser.extend(jsx()).parse(doc)

build(tree, {pragma: 'x', pragmaFrag: 'null'})

console.log(astring.generate(tree))

Now, running node example yields:

var x = require('xastscript');
console.log(x("album", {
  id: 123
}, x("name", null, "Born in the U.S.A."), x("artist", null, "Bruce Springsteen"), x("releasedate", {
  date: "1984-04-06"
}, "April 6, 1984")));
console.log(x(null, null, 1 + 1, x("self-closing"), x("x", Object.assign({
  name: true,
  key: "value",
  key: expression
}, spread))));

API

buildJsx(tree, options?)

Turn JSX in tree (Program) into hyperscript calls.

options
options.runtime

Choose the runtime. (string, 'automatic' or 'classic', default: 'classic'). Comment form: @jsxRuntime theRuntime.

options.importSource

Place to import jsx, jsxs, and/or Fragment from, when the effective runtime is automatic (string, default: 'react'). Comment: @jsxImportSource theSource. Note that /jsx-runtime is appended to this provided source.

options.pragma

Identifier or member expression to call when the effective runtime is classic (string, default: 'React.createElement'). Comment: @jsx identifier.

options.pragmaFrag

Identifier or member expression to use as a sumbol for fragments when the effective runtime is classic (string, default: 'React.Fragment'). Comment: @jsxFrag identifier.

Returns

Node — The given tree.

Notes

To support configuration from comments, those comments have to be in the program. This is done automatically by espree. For acorn, it can be done like so:

var acorn = require('acorn')
var jsx = require('acorn-jsx')

var comments = []
var tree = acorn.Parser.extend(jsx()).parse(doc, {onComment: comments})
tree.comments = comments

In almost all cases, this utility is the same as the babel plugin, except that they work on slightly different syntax trees.

Some differences:

  • No pure annotations or dev things
  • this is not a component: <this> -> h('this'), not h(this)
  • Namespaces are supported: <a:b c:d> -> h('a:b', {'c:d': true}), which throws by default in Babel or can be turned on with throwIfNamespace
  • No useSpread, useBuiltIns, or filter options

License

MIT © Titus Wormer

Keywords

FAQs

Package last updated on 09 Feb 2021

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc