Binaryen.TS
    Preparing search index...

    Binaryen.TS

    Binaryen.TS

    Binaryen API ported to TypeScript for use in the browser and in Node.JS.

    $ npm install binaryen.ts
    
    import * as binaryen from "binaryen.ts";

    const mod: binaryen.Module = new binaryen.Module();

    mod.functions.add("add", binaryen.createType([binaryen.i32, binaryen.i32]), binaryen.i32, [binaryen.i32], (() => {
    const {block, local, i32} = mod.wasm;
    const param0: binaryen.ExpressionRef = local.get(0, binaryen.i32);
    const param1: binaryen.ExpressionRef = local.get(1, binaryen.i32);
    const result: binaryen.ExpressionRef = i32.add(param0, param1);
    return block(null, [
    local.set(2, result),
    local.get(2, binaryen.i32),
    ], binaryen.i32);
    })());
    mod.exports.addFunction("add", "add");
    mod.optimize();
    if (!mod.validate()) {
    throw new Error("Invalid WebAssembly module.");
    }

    const textData = mod.emitText();
    const wasmData = mod.emitBinary() as Uint8Array<ArrayBuffer>;
    const compiled = new WebAssembly.Module(wasmData);
    const instance = new WebAssembly.Instance(compiled, {});

    console.log(instance.exports.add(41, 1)); // 42

    Contributions are welcome! Make sure you have Git and Node (and NPM) installed on your machine, and have already cloned the WebAssembly/binaryen repo.

    From the repo’s root:

    $ cd ./ts/
    $ npm ci
    $ npm run build

    The core of this project is written in TS, best paired with a powerful editor and some nice extensions.

    $ npm run compile # emits javascript output to ./dist/
    

    Don’t put anything important in ./dist/, as it gets deleted and rebuilt each time.

    Before committing, ensure only the best code quality by running ESLint.

    $ npm run lint # reports linter errors & warnings
    $ npm run lint -- --fix # tries to auto-fix problems (some may need manual fixing)

    Use Conventional Commits commit message format. Messages should be in the present tense / command tense.

    $ git commit -m "feat: add a new feature"
    $ git commit -m "feat!: add a new breaking feature" # API consumers need to know about these
    $ git commit -m "fix: fix a bug"
    $ git commit -m "refactor: reorganize code"
    $ git commit -m "lint: fix a coding style issue"
    $ git commit -m "docs: update documentation"
    $ git commit -m "test: add/update tests"
    $ git commit -m "build: make a change related to the package build system"

    Generated documentation is built with TypeDoc, a tool that parses comments in the TS source files and produces beautiful HTML.

    After developing and updating doc-comments, regenerate docs and view them locally in your browser.

    $ npm run docs # builds a static site to ../docs/binaryen.ts/
    $ open ../docs/binaryen.ts/index.html

    Don’t put anything important in ../docs/.

    Documentation is hosted online via GitHub Pages at https://chharvey.github.io/binaryen/binaryen.ts/, and will be moved to https://webassembly.github.io/binaryen/binaryen.ts/ once this fork is merged in.

    Upon every release, public docs should be redeployed via updating the gh-pages branch. On that branch, the ../docs/ folder is checked in. You need to switch to that branch, merge in your changes, rebuild the docs, then commit and push.

    $ git switch gh-pages
    $ git merge --no-commit main
    $ npm run docs
    $ git add ../docs/binaryen.ts/
    $ git merge --continue
    $ git push

    The test suite is still in progress, migrating from ../test/binaryen.js/. The new test suite uses the Node v26+ test runner.

    $ npm run test
    

    TypeScript only compiles the source files to ./dist/. After that we need a bundler to optimize and minify it into one giant JS file, which will then get processed with Emscripten’s build so that it can be used by consumers. This will look a lot like AssemblyScript’s build process.

    TODO: more details

    Before pushing, rebuild the entire project to catch any errors.

    $ npm run build

    # if all goes well…

    $ git push

    TODO: this section

    • README.md: you are here

    • .editorconfig, .gitignore: standard repo files

    • package{,-lock}.json: Node package & npm registry details

    • node_modules/ (gitignored): npm dependencies

    • tsconfig.json: TypeScript configuration

    • eslint.config.js: JS/TS coding style conventions

    • typedoc.config.js: documentation generator configuration

    • build/ (gitignored): output of Emscripten; this is imported by the src/ library

    • src/: human-written source code

      • binaryen.ts: the entrypoint; exports everything available to consumers

      • -pre.ts: artifacts provided by Emscripten

      • {lib,utils}.ts: internal tools

      • {constants,globals}.ts: top-level exported globals

      • -deprecations.ts: everything deprecated, all in one place

      • classes/: all the modular code

        • {TypeBuilder,ExpressionRunner,Relooper}.ts: Binaryen tools

        • module/: Module and related classes

        • expression/: Expression info classes, and source for WASM expression generation

      • services/: namespace-like, stateless classes

    • dist/ (gitignored): output of tsc; this gets bundled and published to NPM for consumers

    • docs/: documentation assets

    • ../docs/binaryen.ts/ (gitignored): output of typedoc; hosted online