oxc/wasm/parser
2024-02-05 21:10:11 +08:00
..
src chore(wasm): remove console_error_panic_hook 2024-02-02 17:02:01 +08:00
.gitignore feat: setup wasm parser for npm (#2221) 2024-01-30 21:40:10 +08:00
Cargo.toml chore(wasm): remove console_error_panic_hook 2024-02-02 17:02:01 +08:00
package.json Release @oxc-parser/wasm v0.0.5 2024-02-05 21:10:11 +08:00
pnpm-lock.yaml feat: setup wasm parser for npm (#2221) 2024-01-30 21:40:10 +08:00
README.md feat(wasm/parser): improve FFI (#2232) 2024-01-31 15:53:32 +08:00

About

Experimental wasm package for the oxc parser, with full TypeScript typings support.

This package is built with wasm-pack build --release --target web for bundler (webpack / vite) consumption. Checkout oxc-parser for usage in node.js.

Source code: https://github.com/oxc-project/oxc/tree/main/wasm/parser

Usage

import initWasm, { parseSync } from "@oxc-parser/wasm";

async function main() {
  await initWasm();

  const code = "let foo";
  const result = parseSync(code, { sourceFilename: "test.ts" });
  console.log(result);
}

main();

Notes

UTF8 vs UTF16 byte offsets

The span value returned from the ASTs and diagnostics is in UTF8 byte offsets. Converting to UTF16 byte offsets:

let sourceTextUtf8 = new TextEncoder().encode(sourceText);

const convertToUtf8 = (sourceTextUtf8, d) => {
  return new TextDecoder().decode(sourceTextUtf8.slice(0, d)).length;
}

const diagnostics = result.errors.map((d) => ({
    from: convertToUtf8(sourceTextUtf8, d.start),
    to: convertToUtf8(sourceTextUtf8, d.end),
    severity: d.severity.toLowerCase(),
    message: d.message,
}));

Vite

wasm-pack build --target web is used for the wasm build.

You may need something like https://github.com/nshen/vite-plugin-wasm-pack to get it working with vite, otherwise vite will load the wasm file as a HTML file causing a CompileError: WebAssembly.instantiate(): expected magic word error.