New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

hast-util-to-jsx-runtime

Package Overview
Dependencies
Maintainers
1
Versions
14
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

hast-util-to-jsx-runtime

hast utility to transform to preact, react, solid, svelte, vue, etc

  • 1.1.0
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
2.7M
increased by7.12%
Maintainers
1
Weekly downloads
 
Created
Source

hast-util-to-jsx-runtime

Build Coverage Downloads Size Sponsors Backers Chat

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 transform
  • options (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).

components

Components to use (Partial<Components>, optional).

Each key is the name of an HTML (or SVG) element to override. The value is the component to render instead.

filePath

File path to the original source file (string, optional).

Passed in source info to jsxDEV when using the automatic runtime with development: true.

passNode

Pass the hast element node to components (boolean, default: false).

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.

Components

Possible components to use (TypeScript type).

Each key is a tag name typed in JSX.IntrinsicElements. Each value is either a different tag name, or a component accepting the corresponding props (and an optional node prop if passNode is on).

You can access props at JSX.IntrinsicElements. For example, to find props for a, use JSX.IntrinsicElements['a'].

Type
import type {Element} from 'hast'

type Components = {
  [TagName in keyof JSX.IntrinsicElements]:
    | Component<JSX.IntrinsicElements[TagName] & ExtraProps>
    | keyof JSX.IntrinsicElements
}

type ExtraProps = {node?: Element | undefined}

type Component<ComponentProps> =
  // Function component:
  | ((props: ComponentProps) => JSX.Element | string | null | undefined)
  // Class component:
  | (new (props: ComponentProps) => JSX.ElementClass)

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: Fragment symbol, tag name (string), component
  • props (Props) — element props, children, and maybe node
  • 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: Fragment symbol, tag name (string), component
  • props (Props) — element props, children, and maybe node
  • key (string or undefined) — dynamicly generated key to use
  • isStaticChildren (boolean) — whether more than one children are used
  • source (Source) — info about source
  • self (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
import type {Element} from 'hast'

type Props = {
  [prop: string]:
    | Element // For `node`.
    | Array<JSX.Element | string | null | undefined> // For `children`.
    | Record<string, string> // For `style`.
    | string
    | number
    | boolean
    | undefined
  children: Array<JSX.Element | string | null | undefined>
  node?: Element | undefined
}

Source

Info about source (TypeScript type).

Fields
  • fileName (string or undefined) — name of source file
  • lineNumber (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 Components, 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.

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

Keywords

FAQs

Package last updated on 18 Jan 2023

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