Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,9 @@ Cargo.lock
# idea
.idea/

# Serena
.serena

*.node
lib
artifacts
Expand Down
3 changes: 2 additions & 1 deletion packages/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ function transformOption(path: string, options?: Options, jest = false): SwcOpti
keepImportAttributes: true,
},
},
minify: false,
// Smaller output for cache
minify: true,
isModule: true,
module: options?.swc?.swcrc
? undefined
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,12 @@ Generated by [AVA](https://avajs.dev).

> Snapshot 1

`"use strict";␊
const Button = ({ text })=>/*#__PURE__*/ h("div", null, text);␊
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIlxuICBjb25zdCBCdXR0b24gPSAoeyB0ZXh0IH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAge3RleHR9XG4gICAgPC9kaXY+XG4gIClcbiJdLCJuYW1lcyI6WyJCdXR0b24iLCJ0ZXh0IiwiZGl2Il0sIm1hcHBpbmdzIjoiO0FBQ0UsTUFBTUEsU0FBUyxDQUFDLEVBQUVDLElBQUksRUFBRSxpQkFDdEIsRUFBQ0MsYUFDRUQifQ==`
`"use strict";const Button=({text})=>h("div",null,text);␊
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIlxuICBjb25zdCBCdXR0b24gPSAoeyB0ZXh0IH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAge3RleHR9XG4gICAgPC9kaXY+XG4gIClcbiJdLCJuYW1lcyI6WyJCdXR0b24iLCJ0ZXh0IiwiZGl2Il0sIm1hcHBpbmdzIjoiYUFDRSxNQUFNQSxPQUFTLENBQUMsQ0FBRUMsSUFBSSxDQUFFLEdBQ3RCLEVBQUNDLFdBQ0VEIn0=`

## should transform jsx into new jsx runtime

> Snapshot 1

`"use strict";␊
Object.defineProperty(exports, "__esModule", {␊
value: true␊
});␊
const _jsxruntime = require("react/jsx-runtime");␊
const Button = ({ text })=>/*#__PURE__*/ (0, _jsxruntime.jsx)("div", {␊
children: text␊
});␊
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIlxuICBjb25zdCBCdXR0b24gPSAoeyB0ZXh0IH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAge3RleHR9XG4gICAgPC9kaXY+XG4gIClcbiJdLCJuYW1lcyI6WyJCdXR0b24iLCJ0ZXh0IiwiZGl2Il0sIm1hcHBpbmdzIjoiOzs7OztBQUNFLE1BQU1BLFNBQVMsQ0FBQyxFQUFFQyxJQUFJLEVBQUUsaUJBQ3RCLHFCQUFDQztrQkFDRUQifQ==`
`"use strict";Object.defineProperty(exports,"__esModule",{value:true});const _jsxruntime=require("react/jsx-runtime");const Button=({text})=>(0,_jsxruntime.jsx)("div",{children:text});␊
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIlxuICBjb25zdCBCdXR0b24gPSAoeyB0ZXh0IH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAge3RleHR9XG4gICAgPC9kaXY+XG4gIClcbiJdLCJuYW1lcyI6WyJCdXR0b24iLCJ0ZXh0IiwiZGl2Il0sIm1hcHBpbmdzIjoicUhBQ0UsTUFBTUEsT0FBUyxDQUFDLENBQUVDLElBQUksQ0FBRSxHQUN0QixvQkFBQ0MsZ0JBQ0VEIn0=`
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ Generated by [AVA](https://avajs.dev).

> Snapshot 1

`Error:
at /packages/integrate/__tests__/sourcemaps/sourcemaps.spec.ts:18:26
`Error␊
at <anonymous> (/packages/integrate/__tests__/sourcemaps/sourcemaps.spec.ts:30:9)
at Test.callFn (file:///node_modules/.pnpm/ava@6.4.1_encoding@0.1.13/node_modules/ava/lib/test.js:525:26)␊
at Test.run (file:///node_modules/.pnpm/ava@6.4.1_encoding@0.1.13/node_modules/ava/lib/test.js:534:33)␊
at Runner.runSingle (file:///node_modules/.pnpm/ava@6.4.1_encoding@0.1.13/node_modules/ava/lib/runner.js:280:33)␊
at Runner.runTest (file:///node_modules/.pnpm/ava@6.4.1_encoding@0.1.13/node_modules/ava/lib/runner.js:362:30)␊
at async Promise.all (index 0)␊
at file:///node_modules/.pnpm/ava@6.4.1_encoding@0.1.13/node_modules/ava/lib/runner.js:515:21␊
at Runner.start (file:///node_modules/.pnpm/ava@6.4.1_encoding@0.1.13/node_modules/ava/lib/runner.js:523:15)`
at async file:///node_modules/.pnpm/ava@6.4.1_encoding@0.1.13/node_modules/ava/lib/runner.js:515:21␊
at async Runner.start (file:///node_modules/.pnpm/ava@6.4.1_encoding@0.1.13/node_modules/ava/lib/runner.js:523:15)`
Binary file not shown.
36 changes: 2 additions & 34 deletions packages/jest/__test__/hoist-top-level.spec.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,37 +8,5 @@ Generated by [AVA](https://avajs.dev).

> Snapshot 1

`"use strict";␊
jest.enableAutomock();␊
jest.disableAutomock();␊
jest.mock('./foo');␊
jest.mock('./foo/bar', ()=>'bar');␊
jest.deepUnmock('./foo');␊
jest.mock('./foo').mock('./bar');␊
const foo = 'foo';␊
console.log(foo);␊
jest.unmock('./bar/foo').dontMock('./bar/bar');␊
const func = ()=>{␊
jest.unmock('./foo');␊
jest.mock('./bar');␊
jest.mock('./bar/foo', ()=>'foo');␊
jest.unmock('./foo/bar');␊
jest.deepUnmock('./bar');␊
jest.mock('./foo').mock('./bar');␊
const bar = 'bar';␊
console.log(bar);␊
jest.unmock('./bar/foo').dontMock('./bar/bar');␊
};␊
const func2 = ()=>{␊
jest.mock('./bar');␊
jest.unmock('./foo/bar');␊
jest.mock('./bar/foo', ()=>'foo');␊
jest.unmock('./foo');␊
jest.deepUnmock('./bar');␊
jest.mock('./foo').mock('./bar');␊
const bar = 'bar';␊
console.log(bar);␊
jest.unmock('./bar/foo').dontMock('./bar/bar');␊
};␊
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImplc3Quc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGZvbyA9ICdmb28nXG5jb25zb2xlLmxvZyhmb28pXG5qZXN0LmVuYWJsZUF1dG9tb2NrKClcbmplc3QuZGlzYWJsZUF1dG9tb2NrKClcbmplc3QubW9jaygnLi9mb28nKVxuamVzdC5tb2NrKCcuL2Zvby9iYXInLCAoKSA9PiAnYmFyJylcbmplc3QudW5tb2NrKCcuL2Jhci9mb28nKS5kb250TW9jaygnLi9iYXIvYmFyJylcbmplc3QuZGVlcFVubW9jaygnLi9mb28nKVxuamVzdC5tb2NrKCcuL2ZvbycpLm1vY2soJy4vYmFyJylcbmNvbnN0IGZ1bmMgPSAoKSA9PiB7XG4gIGNvbnN0IGJhciA9ICdiYXInXG4gIGNvbnNvbGUubG9nKGJhcilcbiAgamVzdC51bm1vY2soJy4vZm9vJylcbiAgamVzdC5tb2NrKCcuL2JhcicpXG4gIGplc3QubW9jaygnLi9iYXIvZm9vJywgKCkgPT4gJ2ZvbycpXG4gIGplc3QudW5tb2NrKCcuL2Zvby9iYXInKVxuICBqZXN0LnVubW9jaygnLi9iYXIvZm9vJykuZG9udE1vY2soJy4vYmFyL2JhcicpXG4gIGplc3QuZGVlcFVubW9jaygnLi9iYXInKVxuICBqZXN0Lm1vY2soJy4vZm9vJykubW9jaygnLi9iYXInKVxufVxuY29uc3QgZnVuYzIgPSAoKSA9PiB7XG4gIGNvbnN0IGJhciA9ICdiYXInXG4gIGNvbnNvbGUubG9nKGJhcilcbiAgamVzdC5tb2NrKCcuL2JhcicpXG4gIGplc3QudW5tb2NrKCcuL2Zvby9iYXInKVxuICBqZXN0Lm1vY2soJy4vYmFyL2ZvbycsICgpID0+ICdmb28nKVxuICBqZXN0LnVubW9jaygnLi9mb28nKVxuICBqZXN0LnVubW9jaygnLi9iYXIvZm9vJykuZG9udE1vY2soJy4vYmFyL2JhcicpXG4gIGplc3QuZGVlcFVubW9jaygnLi9iYXInKVxuICBqZXN0Lm1vY2soJy4vZm9vJykubW9jaygnLi9iYXInKVxufVxuIl0sIm5hbWVzIjpbImplc3QiLCJlbmFibGVBdXRvbW9jayIsImRpc2FibGVBdXRvbW9jayIsIm1vY2siLCJkZWVwVW5tb2NrIiwiZm9vIiwiY29uc29sZSIsImxvZyIsInVubW9jayIsImRvbnRNb2NrIiwiZnVuYyIsImJhciIsImZ1bmMyIl0sIm1hcHBpbmdzIjoiO0FBR0FBLEtBQUtDLGNBQWM7QUFDbkJELEtBQUtFLGVBQWU7QUFDcEJGLEtBQUtHLElBQUksQ0FBQztBQUNWSCxLQUFLRyxJQUFJLENBQUMsYUFBYSxJQUFNO0FBRTdCSCxLQUFLSSxVQUFVLENBQUM7QUFDaEJKLEtBQUtHLElBQUksQ0FBQyxTQUFTQSxJQUFJLENBQUM7QUFSeEIsTUFBTUUsTUFBTTtBQUNaQyxRQUFRQyxHQUFHLENBQUNGO0FBS1pMLEtBQUtRLE1BQU0sQ0FBQyxhQUFhQyxRQUFRLENBQUM7QUFHbEMsTUFBTUMsT0FBTztJQUdYVixLQUFLUSxNQUFNLENBQUM7SUFDWlIsS0FBS0csSUFBSSxDQUFDO0lBQ1ZILEtBQUtHLElBQUksQ0FBQyxhQUFhLElBQU07SUFDN0JILEtBQUtRLE1BQU0sQ0FBQztJQUVaUixLQUFLSSxVQUFVLENBQUM7SUFDaEJKLEtBQUtHLElBQUksQ0FBQyxTQUFTQSxJQUFJLENBQUM7SUFSeEIsTUFBTVEsTUFBTTtJQUNaTCxRQUFRQyxHQUFHLENBQUNJO0lBS1pYLEtBQUtRLE1BQU0sQ0FBQyxhQUFhQyxRQUFRLENBQUM7QUFHcEM7QUFDQSxNQUFNRyxRQUFRO0lBR1paLEtBQUtHLElBQUksQ0FBQztJQUNWSCxLQUFLUSxNQUFNLENBQUM7SUFDWlIsS0FBS0csSUFBSSxDQUFDLGFBQWEsSUFBTTtJQUM3QkgsS0FBS1EsTUFBTSxDQUFDO0lBRVpSLEtBQUtJLFVBQVUsQ0FBQztJQUNoQkosS0FBS0csSUFBSSxDQUFDLFNBQVNBLElBQUksQ0FBQztJQVJ4QixNQUFNUSxNQUFNO0lBQ1pMLFFBQVFDLEdBQUcsQ0FBQ0k7SUFLWlgsS0FBS1EsTUFBTSxDQUFDLGFBQWFDLFFBQVEsQ0FBQztBQUdwQyJ9`
`"use strict";jest.enableAutomock();jest.disableAutomock();jest.mock("./foo");jest.mock("./foo/bar",()=>"bar");jest.deepUnmock("./foo");jest.mock("./foo").mock("./bar");const foo="foo";console.log(foo);jest.unmock("./bar/foo").dontMock("./bar/bar");const func=()=>{jest.unmock("./foo");jest.mock("./bar");jest.mock("./bar/foo",()=>"foo");jest.unmock("./foo/bar");jest.deepUnmock("./bar");jest.mock("./foo").mock("./bar");const bar="bar";console.log(bar);jest.unmock("./bar/foo").dontMock("./bar/bar")};const func2=()=>{jest.mock("./bar");jest.unmock("./foo/bar");jest.mock("./bar/foo",()=>"foo");jest.unmock("./foo");jest.deepUnmock("./bar");jest.mock("./foo").mock("./bar");const bar="bar";console.log(bar);jest.unmock("./bar/foo").dontMock("./bar/bar")};␊
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImplc3Quc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGZvbyA9ICdmb28nXG5jb25zb2xlLmxvZyhmb28pXG5qZXN0LmVuYWJsZUF1dG9tb2NrKClcbmplc3QuZGlzYWJsZUF1dG9tb2NrKClcbmplc3QubW9jaygnLi9mb28nKVxuamVzdC5tb2NrKCcuL2Zvby9iYXInLCAoKSA9PiAnYmFyJylcbmplc3QudW5tb2NrKCcuL2Jhci9mb28nKS5kb250TW9jaygnLi9iYXIvYmFyJylcbmplc3QuZGVlcFVubW9jaygnLi9mb28nKVxuamVzdC5tb2NrKCcuL2ZvbycpLm1vY2soJy4vYmFyJylcbmNvbnN0IGZ1bmMgPSAoKSA9PiB7XG4gIGNvbnN0IGJhciA9ICdiYXInXG4gIGNvbnNvbGUubG9nKGJhcilcbiAgamVzdC51bm1vY2soJy4vZm9vJylcbiAgamVzdC5tb2NrKCcuL2JhcicpXG4gIGplc3QubW9jaygnLi9iYXIvZm9vJywgKCkgPT4gJ2ZvbycpXG4gIGplc3QudW5tb2NrKCcuL2Zvby9iYXInKVxuICBqZXN0LnVubW9jaygnLi9iYXIvZm9vJykuZG9udE1vY2soJy4vYmFyL2JhcicpXG4gIGplc3QuZGVlcFVubW9jaygnLi9iYXInKVxuICBqZXN0Lm1vY2soJy4vZm9vJykubW9jaygnLi9iYXInKVxufVxuY29uc3QgZnVuYzIgPSAoKSA9PiB7XG4gIGNvbnN0IGJhciA9ICdiYXInXG4gIGNvbnNvbGUubG9nKGJhcilcbiAgamVzdC5tb2NrKCcuL2JhcicpXG4gIGplc3QudW5tb2NrKCcuL2Zvby9iYXInKVxuICBqZXN0Lm1vY2soJy4vYmFyL2ZvbycsICgpID0+ICdmb28nKVxuICBqZXN0LnVubW9jaygnLi9mb28nKVxuICBqZXN0LnVubW9jaygnLi9iYXIvZm9vJykuZG9udE1vY2soJy4vYmFyL2JhcicpXG4gIGplc3QuZGVlcFVubW9jaygnLi9iYXInKVxuICBqZXN0Lm1vY2soJy4vZm9vJykubW9jaygnLi9iYXInKVxufVxuIl0sIm5hbWVzIjpbImplc3QiLCJlbmFibGVBdXRvbW9jayIsImRpc2FibGVBdXRvbW9jayIsIm1vY2siLCJkZWVwVW5tb2NrIiwiZm9vIiwiY29uc29sZSIsImxvZyIsInVubW9jayIsImRvbnRNb2NrIiwiZnVuYyIsImJhciIsImZ1bmMyIl0sIm1hcHBpbmdzIjoiYUFHQUEsS0FBS0MsY0FBYyxHQUNuQkQsS0FBS0UsZUFBZSxHQUNwQkYsS0FBS0csSUFBSSxDQUFDLFNBQ1ZILEtBQUtHLElBQUksQ0FBQyxZQUFhLElBQU0sT0FFN0JILEtBQUtJLFVBQVUsQ0FBQyxTQUNoQkosS0FBS0csSUFBSSxDQUFDLFNBQVNBLElBQUksQ0FBQyxTQVJ4QixNQUFNRSxJQUFNLE1BQ1pDLFFBQVFDLEdBQUcsQ0FBQ0YsS0FLWkwsS0FBS1EsTUFBTSxDQUFDLGFBQWFDLFFBQVEsQ0FBQyxhQUdsQyxNQUFNQyxLQUFPLEtBR1hWLEtBQUtRLE1BQU0sQ0FBQyxTQUNaUixLQUFLRyxJQUFJLENBQUMsU0FDVkgsS0FBS0csSUFBSSxDQUFDLFlBQWEsSUFBTSxPQUM3QkgsS0FBS1EsTUFBTSxDQUFDLGFBRVpSLEtBQUtJLFVBQVUsQ0FBQyxTQUNoQkosS0FBS0csSUFBSSxDQUFDLFNBQVNBLElBQUksQ0FBQyxTQVJ4QixNQUFNUSxJQUFNLE1BQ1pMLFFBQVFDLEdBQUcsQ0FBQ0ksS0FLWlgsS0FBS1EsTUFBTSxDQUFDLGFBQWFDLFFBQVEsQ0FBQyxZQUdwQyxFQUNBLE1BQU1HLE1BQVEsS0FHWlosS0FBS0csSUFBSSxDQUFDLFNBQ1ZILEtBQUtRLE1BQU0sQ0FBQyxhQUNaUixLQUFLRyxJQUFJLENBQUMsWUFBYSxJQUFNLE9BQzdCSCxLQUFLUSxNQUFNLENBQUMsU0FFWlIsS0FBS0ksVUFBVSxDQUFDLFNBQ2hCSixLQUFLRyxJQUFJLENBQUMsU0FBU0EsSUFBSSxDQUFDLFNBUnhCLE1BQU1RLElBQU0sTUFDWkwsUUFBUUMsR0FBRyxDQUFDSSxLQUtaWCxLQUFLUSxNQUFNLENBQUMsYUFBYUMsUUFBUSxDQUFDLFlBR3BDIn0=`
Binary file modified packages/jest/__test__/hoist-top-level.spec.ts.snap
Binary file not shown.
37 changes: 37 additions & 0 deletions packages/register/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,40 @@ Respect the boolean value in `tsconfig`.
`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.
161 changes: 161 additions & 0 deletions packages/register/__test__/register-runtime-tuning.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
import test from 'ava'
import sinon from 'sinon'
import * as ts from 'typescript'

import * as swcCore from '@swc-node/core'
import { SourcemapMap } from '@swc-node/sourcemap-support'

import { compile } from '../register'
import { clearTransformCache } from '../transform-cache'

const originalEnv = { ...process.env }
const emptyMap = '{"version":3,"sources":[],"names":[],"mappings":""}'

function uniquePath(label: string, extension: string) {
return `/tmp/${label}-${Date.now()}-${Math.random().toString(16).slice(2)}.${extension}`
}

test.beforeEach(() => {
process.env.SWC_NODE_CACHE_DIR = `/tmp/swc-node-test-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`
})

test.afterEach.always(() => {
sinon.restore()
SourcemapMap.clear()
clearTransformCache({ memory: true, disk: false })
process.env = { ...originalEnv }
})

test.serial('reuses transform cache for sync compile', (t) => {
const transformSyncStub = sinon.stub(swcCore, 'transformSync').returns({
code: 'console.log("cached")',
map: emptyMap,
})

const filename = uniquePath('cache-sync', 'ts')
const source = `const value: number = ${Date.now()}`

const first = compile(source, filename, {
module: ts.ModuleKind.CommonJS,
sourceMap: true,
})
const second = compile(source, filename, {
module: ts.ModuleKind.CommonJS,
sourceMap: true,
})

t.is(first, second)
t.is(transformSyncStub.callCount, 1)
})

test.serial('reuses transform cache for async compile', async (t) => {
const transformStub = sinon.stub(swcCore, 'transform').resolves({
code: 'console.log("cached-async")',
map: emptyMap,
})

const filename = uniquePath('cache-async', 'ts')
const source = `const value: number = ${Date.now()}`

const first = await compile(
source,
filename,
{
module: ts.ModuleKind.ESNext,
sourceMap: true,
},
true,
)
const second = await compile(
source,
filename,
{
module: ts.ModuleKind.ESNext,
sourceMap: true,
},
true,
)

t.is(first, second)
t.true(transformStub.callCount <= 1)
})

test.serial('supports sourcemap inline-only mode to reduce map-store memory', (t) => {
process.env.SWC_NODE_SOURCE_MAP_MODE = 'inline'

sinon.stub(swcCore, 'transformSync').returns({
code: 'console.log("inline-only")',
map: emptyMap,
})

const filename = uniquePath('sourcemap-inline', 'ts')
const output = compile('const x = 1', filename, {
module: ts.ModuleKind.CommonJS,
sourceMap: true,
})

t.true(output.includes('sourceMappingURL'))
t.false(SourcemapMap.has(filename))
})

test.serial('supports sourcemap store-only mode to avoid inline map payload', (t) => {
process.env.SWC_NODE_SOURCE_MAP_MODE = 'store'

sinon.stub(swcCore, 'transformSync').returns({
code: 'console.log("store-only")',
map: emptyMap,
})

const filename = uniquePath('sourcemap-store', 'ts')
const output = compile('const x = 1', filename, {
module: ts.ModuleKind.CommonJS,
sourceMap: true,
})

t.false(output.includes('sourceMappingURL'))
t.true(SourcemapMap.has(filename))
})

test.serial('skips transform for plain js in commonjs mode', (t) => {
const transformSyncStub = sinon.stub(swcCore, 'transformSync')

const output = compile('module.exports = 42', uniquePath('plain-cjs', 'js'), {
module: ts.ModuleKind.CommonJS,
sourceMap: true,
})

t.is(output, 'module.exports = 42')
t.false(transformSyncStub.called)
})

test.serial('still transforms js with esm syntax in commonjs mode', (t) => {
const transformSyncStub = sinon.stub(swcCore, 'transformSync').returns({
code: 'exports.value = 42',
map: emptyMap,
})

const output = compile('export const value = 42', uniquePath('esm-in-js', 'js'), {
module: ts.ModuleKind.CommonJS,
sourceMap: true,
})

t.true(output.includes('exports.value = 42'))
t.true(transformSyncStub.calledOnce)
})

test.serial('skips transform for runtime js in esm mode', async (t) => {
const transformStub = sinon.stub(swcCore, 'transform')

const output = await compile(
'export const value = 42',
uniquePath('plain-esm', 'mjs'),
{
module: ts.ModuleKind.ESNext,
sourceMap: true,
},
true,
)

t.is(output, 'export const value = 42')
t.false(transformStub.called)
})
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,14 @@ test('should set all values', (t) => {
}
t.deepEqual(swcConfig, expected)
})

test('sourceMap without inlineSourceMap keeps external map output', (t) => {
const options: ts.CompilerOptions = {
sourceMap: true,
inlineSourceMap: false,
}

const swcConfig = tsCompilerOptionsToSwcConfig(options, 'some-file.ts')

t.is(swcConfig.sourcemap, true)
})
11 changes: 11 additions & 0 deletions packages/register/esm.mts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import ts from 'typescript'
import { readDefaultTsConfig } from '../lib/read-default-tsconfig.js'
// @ts-expect-error
import { compile } from '../lib/register.js'
// @ts-expect-error
import { shouldSkipTransformForRuntimeJs } from '../lib/transform-cache.js'

const debug = debugFactory('@swc-node')

Expand Down Expand Up @@ -317,6 +319,15 @@ export const load: LoadHook = async (url, context, nextLoad) => {
// and would likely be a breaking change anyway. Do a best effort to give a real path
// like it expects, which at least fixes relative input sourcemap paths.
const filename = url.startsWith('file:') ? fileURLToPath(url) : url

if (shouldSkipTransformForRuntimeJs(filename, code, tsconfigForSWCNode.module)) {
debug('skip compile: runtime js module', url)
return addShortCircuitSignal({
format: resolvedFormat,
source,
})
}

const compiled = await compile(code, filename, tsconfigForSWCNode, true)

debug('compiled', url, resolvedFormat)
Expand Down
1 change: 1 addition & 0 deletions packages/register/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"@swc-node/sourcemap-support": "^0.6.1",
"colorette": "^2.0.20",
"debug": "^4.4.1",
"json-stable-stringify": "^1.3.0",
"oxc-resolver": "^11.6.1",
"pirates": "^4.0.7",
"tslib": "^2.8.1"
Expand Down
Loading