Amaro is a wrapper around @swc/wasm-typescript
, a WebAssembly port of the SWC TypeScript parser.
It's used as an internal in Node.js for Type Stripping but can also be used as a standalone package.
Amaro means "bitter" in Italian. It's a reference to Mount Amaro on whose slopes this package was conceived.
This package provides a stable API for the TypeScript parser and allows users to upgrade to the latest version of TypeScript transpiler indipendently from the one used internally in Node.js.
To install Amaro, run:
npm install amaro
By default Amaro exports a transformSync
function that performs type stripping.
Stack traces are preserved, by replacing removed types with white spaces.
const amaro = require('amaro');
const { code } = amaro.transformSync("const foo: string = 'bar';", { mode: "strip-only" });
console.log(code); // "const foo = 'bar';"
It is possible to use Amaro as an external loader to execute TypeScript files. This allows the installed Amaro to override the Amaro version used by Node.js. In order to use Amaro as an external loader, type stripping needs to be enabled.
In node v23 and later you can omit the --experimental-strip-types
flag, as it is enabled by default.
node --experimental-strip-types --import="amaro/strip" file.ts
Enabling TypeScript feature transformation:
node --experimental-transform-types --import="amaro/transform" file.ts
Note that the "amaro/transform" loader should be used with
--experimental-transform-types
flag, or at least with--enable-source-maps
flag, to preserve the original source maps.
Contrary to the Node.js TypeScript support, when used as a loader, Amaro handles TypeScript files inside folders under a node_modules
path.
Amaro makes working in monorepos smoother by removing the need to rebuild internal packages during development. When used with the --conditions
flag, you can reference TypeScript source files directly in exports:
"exports": {
".": {
"typescript": "./src/index.ts",
"types": "./dist/index.d.ts",
"require": "./dist/index.js",
"import": "./dist/index.js"
}
}
Then run your app with:
node --watch --import="amaro/strip" --conditions=typescript ./src/index.ts
This setup allows Node.js to load TypeScript files from linked packages without a build step. Changes to any package are picked up immediately, speeding up and simplifying local development in monorepos.
The supported TypeScript version is 5.8.
See LICENSE.md
.