UNPKG

@bytecodealliance/jco

Version:

JavaScript tooling for working with WebAssembly Components

171 lines (108 loc) 7.27 kB
<div align="center"> <h1><code>jco</code></h1> <p> <strong>JavaScript toolchain for working with <a href="https://github.com/WebAssembly/component-model">WebAssembly Components</a></strong> </p> <strong>A <a href="https://bytecodealliance.org/">Bytecode Alliance</a> project</strong> <p> <a href="https://github.com/bytecodealliance/jco/actions?query=workflow%3ACI"><img src="https://github.com/bytecodealliance/jco/workflows/CI/badge.svg" alt="build status" /></a> </p> <h3> <a href="https://bytecodealliance.github.io/jco/">Contributing</a> <span> | </span> <a href="https://bytecodealliance.zulipchat.com/#narrow/stream/409526-jco">Chat on Zulip</a> </h3> </div> ## Overview Jco provides a fully native JS toolchain for working with [WebAssembly Components](https://github.com/WebAssembly/component-model) in JavaScript. Features include: * "Transpiling" Wasm Component binaries into ES modules that can run in any JS environment. * WASI Preview2 support in Node.js & browsers (experimental). * Component builds of [Wasm Tools](https://github.com/bytecodealliance/wasm-tools) helpers, available for use as a library or CLI commands for use in native JS environments, as well as optimization helper for Components via Binaryen. * Run and serve commands like Wasmtime, as JS implementations of the Command and HTTP Proxy worlds. * "Componentize" command to easily create components written in JavaScript (wrapper of [ComponentizeJS](https://github.com/bytecodealliance/ComponentizeJS)). For creating components in other languages, see the [Cargo Component](https://github.com/bytecodealliance/cargo-Component) project for Rust and [Wit Bindgen](https://github.com/bytecodealliance/wit-bindgen) for various guest bindgen helpers. ## Installation ```shell npm install @bytecodealliance/jco ``` Jco can be used as either a library import or as a CLI via the `jco` command. ## Example See the [Example Workflow](https://bytecodealliance.github.io/jco/example.html) page for a full usage example. ## CLI ```shell Usage: jco <command> [options] jco - WebAssembly JS Component Tools JS Component Transpilation Bindgen & Wasm Tools for JS Options: -V, --version output the version number -h, --help display help for command Commands: componentize [options] <js-source> Create a component from a JavaScript module transpile [options] <component-path> Transpile a WebAssembly Component to JS + core Wasm for JavaScript execution types [options] <wit-path> Generate types for the given WIT guest-types [options] <wit-path> (experimental) Generate guest types for the given WIT run [options] <command> [args...] Run a WASI Command component serve [options] <server> [args...] Serve a WASI HTTP component opt [options] <component-file> optimizes a Wasm component, including running wasm-opt Binaryen optimizations wit [options] <component-path> extract the WIT from a WebAssembly Component [wasm-tools component wit] print [options] <input> print the WebAssembly WAT text for a binary file [wasm-tools print] metadata-show [options] [module] extract the producer metadata for a Wasm binary [wasm-tools metadata show] metadata-add [options] [module] add producer metadata for a Wasm binary [wasm-tools metadata add] parse [options] <input> parses the Wasm text format into a binary file [wasm-tools parse] new [options] <core-module> create a WebAssembly component adapted from a component core Wasm [wasm-tools component new] embed [options] [core-module] embed the component typing section into a core Wasm module [wasm-tools component embed] help [command] display help for command ``` For help with individual command options, use `jco <cmd> --help`. ### Transpile See the [Transpiling Docs](https://bytecodealliance.github.io/jco/transpiling.html) for more background and info. #### Bindgen Crate To directly call into the transpilation in Rust, the bindgen used in Jco is also available on crates.io as [js-component-bindgen](https://crates.io/crates/js-component-bindgen). ### Run & Serve For Wasm components that implement the WASI Command world, a `jco run` utility is provided to run these applications in Node.js. ``` jco run cowasy.component.wasm hello ``` Using the preview2-shim WASI implementation, full access to the underlying system primitives is provided, including filesystem and environment variable permissions. For HTTP Proxy components, `jco serve` provides a JS server implementation: ``` jco serve --port 8080 server.wasm ``` > [Wasmtime](https://github.com/bytecodealliance/wasmtime) generally provides the most performant implementation for executing command and proxy worlds to use. These implementations are rather for when JS virtualization is required or the most convenient approach. ### Componentize > **Note**: `jco componentize` is considered experimental, and breaking changes may be made without notice. To componentize a JS file run: ``` jco componentize app.js --wit wit -n world-name -o component.wasm ``` Creates a component from a JS module implementing a WIT world definition, via a Spidermonkey engine embedding. See [ComponentizeJS](https://github.com/bytecodealliance/componentize-js) for more details on this process. ## API #### `transpile(component: Uint8Array, opts?): Promise<{ files: Record<string, Uint8Array> }>` Transpile a Component to JS. #### `opt(component: Uint8Array, opts?): Promise<{ component: Uint8Array }>` Optimize a Component with the [Binaryen Wasm-opt](https://www.npmjs.com/package/binaryen) project. #### `componentWit(component: Uint8Array, document?: string): string` Extract the WIT world from a component binary. #### `print(component: Uint8Array): string` Print the WAT for a Component binary. #### `metadataShow(wasm: Uint8Array): Metadata` Extract the producer toolchain metadata for a component and its nested modules. #### `parse(wat: string): Uint8Array` Parse a compoment WAT to output a Component binary. #### `componentNew(coreWasm: Uint8Array | null, adapters?: [String, Uint8Array][]): Uint8Array` "WIT Component" Component creation tool, optionally providing a set of named adapter binaries. #### `componentEmbed(coreWasm: Uint8Array | null, wit: String, opts?: { stringEncoding?, dummy?, world?, metadata? }): Uint8Array` "WIT Component" Component embedding tool, for embedding component types into core binaries, as an advanced use case of component generation. #### `metadataAdd(wasm: Uint8Array, metadata): Uint8Array` Add new producer metadata to a component or core Wasm binary. ## Contributing See the [Contributing](https://bytecodealliance.github.io/jco/contributing.html) chapter of the Jco book. # License This project is licensed under the Apache 2.0 license with the LLVM exception. See [LICENSE](LICENSE) for more details. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be licensed as above, without any additional terms or conditions.