Skip to content

Commit ce12fed

Browse files
committed
Experimental support for React 19 [publish]
1 parent 370e275 commit ce12fed

File tree

15 files changed

+786
-2104
lines changed

15 files changed

+786
-2104
lines changed

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"typescript.tsdk": "node_modules/typescript/lib"
3+
}

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 3.1.0
4+
5+
- Experimental support for React 19. `_debugSource` [was removed](https://github.com/facebook/react/pull/28265) in React 19. The PR says that tools should lazily generate component stack strace, but I couldn't find a way to use the React devtools globals to generate one for a given Fiber node. I've aksed some React team members about insights on how to make this works, but for now I decided to patch the jsx dev runtime (when serving it) to reinject into Fiber node the source prop added by JSX transform.
6+
37
## 3.0.1
48

59
- Add vite@6 to peer dependency ranges

bun.lock

Lines changed: 568 additions & 0 deletions
Large diffs are not rendered by default.

bun.lockb

-91.9 KB
Binary file not shown.

bunfig.toml

Lines changed: 0 additions & 2 deletions
This file was deleted.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "vite-plugin-react-click-to-component",
33
"type": "module",
4-
"version": "3.0.1",
4+
"version": "3.1.0",
55
"license": "MIT",
66
"scripts": {
77
"postinstall": "cd playground && bun i",
@@ -18,7 +18,7 @@
1818
"trailingComma": "all"
1919
},
2020
"peerDependencies": {
21-
"react": "^18.3.1",
21+
"react": "^18.3.1 || ^19.0.0",
2222
"vite": "^4 || ^5 || ^6"
2323
},
2424
"devDependencies": {

playground/bun.lock

Lines changed: 177 additions & 0 deletions
Large diffs are not rendered by default.

playground/bun.lockb

-29.1 KB
Binary file not shown.

playground/bunfig.toml

Lines changed: 0 additions & 2 deletions
This file was deleted.

playground/package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
"lint-ci": "eslint --max-warnings 0"
99
},
1010
"dependencies": {
11-
"react": "^18.3.1",
12-
"react-dom": "^18.3.1"
11+
"react": "^19.0.0",
12+
"react-dom": "^19.0.0",
13+
"vite-plugin-restart": "^0.4.2"
1314
},
1415
"devDependencies": {
15-
"@types/react-dom": "^18.3.1",
16+
"@types/react-dom": "^19.0.2",
1617
"@vitejs/plugin-react-swc": "^3.7.2"
1718
}
1819
}

playground/vite.config.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import { defineConfig } from "vite";
22
import react from "@vitejs/plugin-react-swc";
33
import { reactClickToComponent } from "../dist/index.mjs";
4+
import restart from "vite-plugin-restart";
45

56
export default defineConfig({
6-
plugins: [react(), reactClickToComponent()],
7+
plugins: [
8+
react(),
9+
reactClickToComponent(),
10+
restart({ restart: ["../dist/client.js", "../dist/index.mjs"] }),
11+
],
712
server: { open: true },
813
});

playground/yarn.lock

Lines changed: 0 additions & 463 deletions
This file was deleted.

src/client.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -157,20 +157,23 @@ const getLayersForElement = (element: Element) => {
157157
};
158158

159159
const getPath = (fiber: Fiber) => {
160-
if (!fiber._debugSource) {
160+
const source = fiber._debugSource ?? fiber._debugInfo;
161+
if (!source) {
161162
console.debug("Couldn't find a React instance for the element", fiber);
162163
return;
163164
}
164-
const { columnNumber = 1, fileName, lineNumber = 1 } = fiber._debugSource;
165+
const { columnNumber = 1, fileName, lineNumber = 1 } = source;
165166
return `${fileName}:${lineNumber}:${columnNumber}`;
166167
};
167168

169+
type Source = {
170+
columnNumber?: number;
171+
fileName: string;
172+
lineNumber?: number;
173+
};
168174
type Fiber = {
169-
_debugSource?: {
170-
columnNumber?: number;
171-
fileName: string;
172-
lineNumber?: number;
173-
};
175+
_debugSource?: Source;
176+
_debugInfo?: Source; // Injected by React jsxDev patch for React 19
174177
_debugOwner?: Fiber;
175178
type: string | { displayName?: string; name: string };
176179
};

src/index.mts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ let root = "";
88
export const reactClickToComponent = (): PluginOption => ({
99
name: "react-click-to-component",
1010
apply: "serve",
11-
configResolved: (config) => {
11+
configResolved(config) {
1212
root = config.root;
1313
},
1414
transformIndexHtml: () => [
@@ -21,4 +21,15 @@ export const reactClickToComponent = (): PluginOption => ({
2121
).replace("__ROOT__", root),
2222
},
2323
],
24+
transform(code, id) {
25+
if (!id.includes("jsx-dev-runtime.js")) return;
26+
if (code.includes("_source")) return;
27+
const defineIndex = code.indexOf('"_debugInfo"');
28+
if (defineIndex === -1) return;
29+
const valueIndex = code.indexOf("value: null", defineIndex);
30+
if (valueIndex === -1) return;
31+
return (
32+
code.slice(0, valueIndex) + "value: source" + code.slice(valueIndex + 11)
33+
);
34+
},
2435
});

0 commit comments

Comments
 (0)