# @wasmer/wasm-transformer

> Library to run transformations on WebAssembly binaries. 🦀♻️

Latest version **0.12.0** (published 2020-09-16) · MIT license · 0 weekly downloads

## Install

```sh
npm install @wasmer/wasm-transformer
pnpm add @wasmer/wasm-transformer
yarn add @wasmer/wasm-transformer
bun add @wasmer/wasm-transformer
```

## Health

**Score 40/100 (D)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high maintenance score.

Warnings: low downloads; pre 1.0.

Negative: abandoned.

## Facts

| | |
|---|---|
| Version | 0.12.0 |
| Published | 2020-09-16 |
| First published | 2019-09-30 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 1 |
| Unpacked size | 890.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 1181 |
| Author | Aaron Turner |
| Maintainers | syrusakbary |

## Links

- npm: https://www.npmjs.com/package/@wasmer/wasm-transformer
- Repository: https://github.com/wasmerio/wasmer-js
- Homepage: https://github.com/wasmerio/wasmer-js#readme
- Issues: https://github.com/wasmerio/wasmer-js/issues
- npm.io page: https://npm.io/package/@wasmer/wasm-transformer

## Dependencies (1)

- [wasm-feature-detect](https://npm.io/package/wasm-feature-detect.md) ^1.2.2

## Recent versions

- 0.12.0 (latest) — 2020-09-16
- 0.11.2 — 2020-05-14
- 0.11.1 — 2020-05-14
- 0.11.0 — 2020-05-13
- 0.10.2 — 2020-03-18
- 0.10.1 — 2020-03-10
- 0.10.0 — 2020-03-05
- 0.9.1 — 2020-03-02
- 0.9.0 — 2020-02-29
- 0.8.5 — 2020-02-24
- 0.8.4 — 2020-02-22
- 0.8.3 — 2020-02-21
- 0.8.2 — 2020-02-21
- 0.8.1 — 2020-02-21
- 0.8.0 — 2020-02-21
- … 21 more at https://npm.io/package/@wasmer/wasm-transformer/versions

## README

# wasm-transformer

Library to run transformations on WebAssembly binaries. 🦀♻️

Documentation for Wasmer-JS Stack can be found on the [Wasmer Docs](https://docs.wasmer.io/wasmer-js/wasmer-js).

**This README covers the instructions for installing, using, and contributing to the `wasm-transformer` Javascript package. [The `wasm_transformer` Rust crate is available here](../../packages/wasm-transformer).**

## Table of Contents

- [Features](#features)
- [Installation](#installation)
- [Quick Start](#quick-start)
  - [Node](#node)
  - [Browser](#browser)
- [Reference API](#reference-api)
- [Contributing](#contributing)
  - [Guidelines](#guidelines)
  - [Building the project](#building-the-project)

## Features

This project depends on [wasmparser](https://github.com/yurydelendik/wasmparser.rs), and the [wasm-pack](https://github.com/rustwasm/wasm-pack) workflow. Huge shoutout to them! 🙏

- Runs transformations on Wasm binaries to modify the actual code that gets run, and introduces new features (such as introducing trampoline functions for i64 WASI imports). ✨

- Installable on both crates.io, and npm! 📦

- The project builds with [wasm-pack](https://github.com/rustwasm/wasm-pack). Thus, you can use this library in a Javascript library, to modify WebAssembly Binaries, with WebAssembly. 🤯

- Super fast! Can run the `lower_i64_imports` transformations on my 2018 MackBook Pro, with the Chrome Devtools 6x CPU slowdown in ~ 1 second. ⚡

## Installation

```
npm install --save @wasmer/wasm-transformer
```

## Quick Start

For a larger example, see the [wasm-terminal](../../packages/wasm-terminal) package.

### Node

```js
const wasmTransformer = require("@wasmer/wasm-transformer");

// Read in the input Wasm file
const wasmBuffer = fs.readFileSync("./my-wasm-file.wasm");

// Transform the binary
const wasmBinary = new Uint8Array(wasmBuffer);
const loweredBinary = wasmTransformer.lowerI64Imports(wasmBinary);

// Do something with loweredBinary
```

### Browser

```js
import { lowerI64Imports } from "@wasmer/wasm-transformer";

const fetchAndTransformWasmBinary = async () => {
  // Get the original Wasm binary
  const fetchedOriginalWasmBinary = await fetch("/original-wasm-module.wasm");
  const originalWasmBinaryBuffer = await fetchedOriginalWasmBinary.arrayBuffer();
  const originalWasmBinary = new Uint8Array(originalWasmBinaryBuffer);

  // Transform the binary, by running the lower_i64_imports from the wasm-transformer
  const transformedBinary = await lowerI64Imports(originalWasmBinary);

  // Compile the transformed binary
  const transformedWasmModule = await WebAssembly.compile(transformedBinary);
  return transformedWasmModule;
};
```

## Reference API

The Reference API Documentation can be found on the [`@wasmer/wasm-transformer` Reference API Wasmer Docs](https://docs.wasmer.io/integrations/js/reference-api/wasmer-wasm-transformer).

## Contributing

### Guidelines

This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification.

Contributions of any kind are welcome! 👍

### Building the project

To get started using the project:

- Set up the [`wasm_transformer` rust crate](../../crates/wasm_transformer)

- Install the latest LTS version of Node.js (which includes `npm` and `npx`). An easy way to do so is with nvm. (Mac and Linux: [here](https://github.com/creationix/nvm), Windows: [here](https://github.com/coreybutler/nvm-windows)).

- `npm run build`.

---
_Source: https://npm.io/package/@wasmer/wasm-transformer · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
