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
5 changes: 5 additions & 0 deletions packages/react-signals-transform/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## 0.1.0 (2026-03-15)

### Features

- add the React Signals transform plugin
60 changes: 60 additions & 0 deletions packages/react-signals-transform/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# @rolldown/plugin-react-signals-transform [![npm](https://img.shields.io/npm/v/@rolldown/plugin-react-signals-transform.svg)](https://npmx.dev/package/@rolldown/plugin-react-signals-transform)

Rolldown plugin for the React Signals transform.

It applies the Signals React transform during Rolldown builds with Rolldown's native magic string pipeline, so React components and hooks can automatically subscribe to signal reads without wiring Babel up manually.

## Install

```bash
pnpm add -D @rolldown/plugin-react-signals-transform
pnpm add react @preact/signals-react
```

## Usage

```ts
import reactSignalsTransform from '@rolldown/plugin-react-signals-transform'

export default {
plugins: [
reactSignalsTransform({
mode: 'auto',
}),
],
}
```

## Options

This plugin forwards the same options as `@preact/signals-react-transform`:

- `mode`
- `importSource`
- `detectTransformedJSX`
- `experimental`

Example:

```ts
reactSignalsTransform({
detectTransformedJSX: true,
experimental: {
debug: true,
},
})
```

## Notes

- Run it before other JSX transforms.
- The generated code imports `useSignals` from `@preact/signals-react/runtime` by default.
- When your code is already compiled to `react/jsx-runtime` or `React.createElement`, enable `detectTransformedJSX`.

## License

MIT

## Credits

The transform logic is adapted from [`packages/react-transform`](https://github.com/preactjs/signals/tree/main/packages/react-transform) in the Preact Signals repository. The test cases are ported from the same package.
69 changes: 69 additions & 0 deletions packages/react-signals-transform/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{
"name": "@rolldown/plugin-react-signals-transform",
"version": "0.1.0",
"description": "Rolldown plugin for the React Signals transform",
"keywords": [
"plugin",
"react",
"rolldown",
"rolldown-plugin",
"signals"
],
"homepage": "https://github.com/rolldown/plugins/tree/main/packages/react-signals-transform#readme",
"bugs": {
"url": "https://github.com/rolldown/plugins/issues"
},
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/rolldown/plugins.git",
"directory": "packages/react-signals-transform"
},
"files": [
"dist"
],
"type": "module",
"exports": "./dist/index.mjs",
"scripts": {
"dev": "tsdown --watch",
"build": "tsdown",
"test": "vitest --project react-signals-transform",
"prepublishOnly": "pnpm run build"
},
"dependencies": {
"rolldown-string": "^0.3.0"
},
"devDependencies": {
"@preact/signals-core": "^1.12.1",
"@preact/signals-react": "^3.9.1",
"@types/react": "^18.3.23",
"@types/react-dom": "^18.3.7",
"jsdom": "^26.1.0",
"prettier": "^3.6.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"rolldown": "^1.0.0-rc.9",
"vite": "^8.0.0"
},
"peerDependencies": {
"@preact/signals-react": "^3.9.1",
"react": "^16.14.0 || 17.x || 18.x || 19.x",
"rolldown": "^1.0.0-rc.9",
"vite": "^8.0.0"
},
"peerDependenciesMeta": {
"vite": {
"optional": true
}
},
"engines": {
"node": ">=22.12.0 || ^24.0.0"
},
"compatiblePackages": {
"schemaVersion": 1,
"rollup": {
"type": "incompatible",
"reason": "Uses Rolldown-specific APIs"
}
}
}
Loading