0.2.0 • Published 17 days ago

swc-plugin-static-jsx v0.2.0

Weekly downloads
-
License
MIT OR Apache-2
Repository
github
Last release
17 days ago

swc-plugin-static-jsx

npm Rust Node.js E2E

SWC plugin to transform JSX calls to static templates

Install

npm i -D @swc/core swc-plugin-static-jsx

From source

git clone https://github.com/Desdaemon/swc-plugin-static-jsx
cd swc-plugin-static-jsx
rustup target add wasm32-wasi
npm run dist
npm link

Usage

// In .swcrc:
{
  "jsc": {
    "experimental": {
      "plugins": [
        // All config values are optional.
        [
          "swc-plugin-static-jsx",
          {
            // If an identifier is supplied, it should not be an ambient global. Can be null.
            "template": "String.raw",
            // If supplied, template will be imported as `import { template } from 'my-library'`
            "importSource": "my-library",
            "spread": "$$spread",
            "child": "$$child",
            "children": "$$children"
          }
        ]
      ]
    }
  }
}

In your tsconfig.json, compilerOptions.jsx should be set to 'preserve'. You will also need to provide your own JSX-related types under namespace JSX.

Sample

let unsanitized = '<script>alert("You\'ve been pwned!")</script>';
// input
function MyComponent() {
  return (
    <div foo="bar" baz={true} {...spread} {...{ "std::string": "value" }}>
      The quick brown fox jumps over the <strong>lazy</strong> dog.
      {unsanitized}
      {...children}
    </div>
  );
}

// output (approximate)
function MyComponent() {
  return html`<div foo="bar" baz ${{ $$spread: spread }} std::string="value">
    The quick brown fox jumps over the<strong>lazy</strong>dog. ${{
      $$child: unsanitized,
    }} ${{ $$children: children }}
  </div>`;
}

Sample implementation of html:

function html(raw, ...children: Record<string, unknown>[]) {
  all: for (const child of children) {
    if ("$$spread" in child) {
      // ..
      continue all;
    }
    if ("$$child" in child) {
      // ..
      continue all;
    }
    if ("$$children" in child) {
      // ..
      continue all;
    }
    // ..
  }
}

License

SPDX Identifier: MIT OR Apache-2

0.2.0

17 days ago

0.1.2

9 months ago

0.1.1

9 months ago

0.1.0

9 months ago