# @swc-node/register

> SWC node register

Latest version **1.12.1** (published 2026-07-18) · MIT license · 0 weekly downloads

## Install

```sh
npm install @swc-node/register
pnpm add @swc-node/register
yarn add @swc-node/register
bun add @swc-node/register
```

## Health

**Score 65/100 (B)** — status: active.

Positive: esm support; no vulnerabilities; has provenance; recently updated; high maintenance score.

Warnings: low downloads; no types.

## Facts

| | |
|---|---|
| Version | 1.12.1 |
| Published | 2026-07-18 |
| First published | 2020-07-30 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | ESM + CommonJS |
| Dependencies | 9 |
| Unpacked size | 177 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Provenance | attested (GitHub Actions) |
| GitHub stars | 1981 |
| Author | LongYinan <github@lyn.one> |
| Maintainers | broooooklyn |
| Keywords | swc, babel, ts-node, napi-rs, uglify, node-rs, napi-rs, napi, n-api, esbuild, tsc, webpack |

## Links

- npm: https://www.npmjs.com/package/@swc-node/register
- Repository: https://github.com/swc-project/swc-node
- Issues: https://github.com/swc-project/swc-node/issues
- Funding: https://github.com/sponsors/Brooooooklyn
- npm.io page: https://npm.io/package/@swc-node/register

## Dependencies (9)

- [debug](https://npm.io/package/debug.md) ^4.4.1
- [tslib](https://npm.io/package/tslib.md) ^2.8.1
- [pirates](https://npm.io/package/pirates.md) ^4.0.7
- [colorette](https://npm.io/package/colorette.md) ^2.0.20
- [oxc-resolver](https://npm.io/package/oxc-resolver.md) ^11.6.1
- [@swc-node/core](https://npm.io/package/@swc-node/core.md) 1.15.0
- [@node-rs/xxhash](https://npm.io/package/@node-rs/xxhash.md) ^1.7.6
- [fast-json-stable-stringify](https://npm.io/package/fast-json-stable-stringify.md) ^2.1.0
- [@swc-node/sourcemap-support](https://npm.io/package/@swc-node/sourcemap-support.md) ^0.6.1

## Alternatives

- [@openai/codex-sdk](https://npm.io/package/@openai/codex-sdk.md) — 731.4K weekly downloads
- [babel-plugin-transform-react-jsx](https://npm.io/package/babel-plugin-transform-react-jsx.md) — 565.0K weekly downloads
- [babel-helper-remove-or-void](https://npm.io/package/babel-helper-remove-or-void.md) — 508.5K weekly downloads
- [@pnpm/store-controller-types](https://npm.io/package/@pnpm/store-controller-types.md) — 186.9K weekly downloads
- [react-native-signature-canvas](https://npm.io/package/react-native-signature-canvas.md) — 155.6K weekly downloads

## Recent versions

- 1.12.1 (latest) — 2026-07-18
- 1.12.0 — 2026-07-16
- 1.11.1 — 2025-08-17
- 1.10.10 — 2025-03-13
- 1.10.9 — 2024-07-17
- 1.10.8 — 2024-07-16
- 1.10.7 — 2024-07-14
- 1.10.6 — 2024-07-13
- 1.10.5 — 2024-07-13
- 1.10.4 — 2024-07-12
- 1.10.3 — 2024-07-08
- 1.10.2 — 2024-07-05
- 1.10.1 — 2024-07-05
- 1.10.0 — 2024-06-28
- 1.9.2 — 2024-06-08
- … 74 more at https://npm.io/package/@swc-node/register/versions

## README

# `@swc-node/register`

<a href="https://npmcharts.com/compare/@swc-node/register?minimal=true"><img src="https://img.shields.io/npm/dm/@swc-node/register.svg?sanitize=true" alt="Downloads" /></a>

> 🚀 Help me to become a full-time open-source developer by [sponsoring me on Github](https://github.com/sponsors/Brooooooklyn)

## Usage

```ts
const { register } = require('@swc-node/register/register')

register({
  ...
})
```

### CLI

```
node -r @swc-node/register index.ts
```

### Mocha

```
mocha --require @swc-node/register --watch-extensions ts,tsx "test/**/*.{ts,tsx}" [...args]
```

### ava

```json
// package.json

{
  "ava": {
    "extensions": ["ts", "tsx"],
    "require": ["@swc-node/register"],
    "files": ["packages/**/*.spec.{ts,tsx}"]
  }
}
```

## Read `tsconfig.json`

set `SWC_NODE_PROJECT` or `TS_NODE_PROJECT` env:

```bash
SWC_NODE_PROJECT=./tsconfig.test.json mocha --require @swc-node/register --watch-extensions ts,tsx "test/**/*.{ts,tsx}" [...args]
```

`@swc-node/register` respect the following option in `tsconfig`:

### `extends`

`@swc-node/register` respect the extends key in `tsconfig.json`, and use the **merged** values.

### `compilerOptions.target`

```ts
switch (target) {
  case ts.ScriptTarget.ES3:
    return 'es3'
  case ts.ScriptTarget.ES5:
    return 'es5'
  case ts.ScriptTarget.ES2015:
    return 'es2015'
  case ts.ScriptTarget.ES2016:
    return 'es2016'
  case ts.ScriptTarget.ES2017:
    return 'es2017'
  case ts.ScriptTarget.ES2018:
    return 'es2018'
  case ts.ScriptTarget.ES2019:
    return 'es2019'
  case ts.ScriptTarget.ES2020:
  case ts.ScriptTarget.ES2021:
  case ts.ScriptTarget.ES2022:
  case ts.ScriptTarget.ESNext:
  case ts.ScriptTarget.Latest:
    return 'es2020'
  case ts.ScriptTarget.JSON:
    return 'es5'
}
```

### `compilerOptions.jsx`

If `filename` endsWith `.jsx` or `.tsx`, always set the `jsx: true` in `swc config` regards the `jsx` option in `tsconfig`.
If `filename` not endsWith `.jsx` or `.tsx`, set the `jsx: Boolean(tsconfig.compilerOptions.jsx)` in `swc config`.

### compilerOptions.module

> notes, if `compilerOptions.module` higher than `es2020`, the `dynamicImport` in `swc config` will be set to `true`.

```ts
switch (moduleKind) {
  case ts.ModuleKind.CommonJS:
    return 'commonjs'
  case ts.ModuleKind.UMD:
    return 'umd'
  case ts.ModuleKind.AMD:
    return 'amd'
  case ts.ModuleKind.ES2015:
  case ts.ModuleKind.ES2020:
  case ts.ModuleKind.ESNext:
  case ts.ModuleKind.None:
    return 'es6'
  case ts.ModuleKind.System:
    throw new TypeError('Do not support system kind module')
}
```

### compilerOptions.experimentalDecorators

Respect the boolean value in `tsconfig`.

### compilerOptions.emitDecoratorMetadata

Respect the boolean value in `tsconfig`.

### compilerOptions.esModuleInterop

Respect the boolean value in `tsconfig`.

### include/exclude

`TypeScript` gives files list to `@swc-node/register`, if parse `tsconfig.json` failed or files list empty, `@swc-node/register` will transform all files which were required.

And if failed to parse `tsconfig.json`, `@swc-node/register` will print warning which contains failed reason.

## Performance tuning

### Transform cache

`@swc-node/register` now keeps a transform cache (memory + disk) keyed by source, filename, compiler options, and runtime versions.

Environment variables:

- `SWC_NODE_CACHE=0` disable cache.
- `SWC_NODE_CACHE_DIR=./path/to/cache` choose disk cache directory.
- `SWC_NODE_CACHE_MEMORY_LIMIT=2000` max in-process transform entries.

Programmatic cache control:

```js
const { clearTransformCache, getTransformCacheDirectory } = require('@swc-node/register/register')

// clear memory + disk (default)
clearTransformCache()

// clear only memory cache
clearTransformCache({ memory: true, disk: false })

// inspect resolved disk cache path
console.log(getTransformCacheDirectory())
```

### Source map memory mode

Use `SWC_NODE_SOURCE_MAP_MODE` to tune source map memory behavior:

- `auto` (default): inline maps when Node native source maps are enabled, otherwise map-store mode.
- `inline`: inline data URL source maps only.
- `store`: in-memory map store only (`source-map-support` path).
- `both`: inline + store (highest memory use, mainly for compatibility/debug edge cases).
- `none`: disable both inline/store map injection.

### Skipping compilation for runtime JS

Plain JavaScript files (`.js`, `.mjs`, `.cjs`, `.es`, `.es6`) that Node can already
execute are passed through without an SWC transform, which speeds up startup. A
file is still transformed when it needs to be — it contains JSX, it uses ESM
syntax under CommonJS output, or an `.swcrc` is in effect.

Known caveats (kept intentionally, for speed):

- A `tsconfig.json` `paths` alias imported via **dynamic** `import('@alias/…')` in a
  passed-through `.js` file is not rewritten, so the alias will not resolve. Static
  `import`/`require` are unaffected. Use `.ts`/`.mts` (or a static import) if you
  rely on alias resolution here.
- Dynamically `import()`-ing a CommonJS module from a passed-through `.js` file
  yields a native module namespace rather than SWC's interop shape (`ns.default`
  instead of `ns`).

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