From 4c156578edf6eb6aae24f5f8e75ba0f24c2c0255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Thu, 5 Dec 2024 18:08:08 +0800 Subject: [PATCH 1/4] refactor: use props check instead of version check --- package.json | 2 ++ src/ref.ts | 26 ++++++++++---------------- tests/ref-19.test.tsx | 30 ++++++++++++++++++++++++++++++ tests/ref.test.tsx | 8 ++++++++ 4 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 tests/ref-19.test.tsx diff --git a/package.json b/package.json index 73cd97bc..7afcebbd 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,8 @@ "rc-test": "^7.0.14", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-19": "npm:react@19.0.0-rc-de68d2f4-20241204", + "react-dom-19": "npm:react-dom@19.0.0-rc-de68d2f4-20241204", "typescript": "^5.3.2" }, "peerDependencies": { diff --git a/src/ref.ts b/src/ref.ts index 3bf07656..66e39d88 100644 --- a/src/ref.ts +++ b/src/ref.ts @@ -81,19 +81,13 @@ export const supportNodeRef = ( */ export const getNodeRef: ( node: React.ReactNode, -) => React.Ref | null = - Number(version.split('.')[0]) >= 19 - ? // >= React 19 - node => { - if (isReactElement(node)) { - return (node as any).props.ref; - } - return null; - } - : // < React 19 - node => { - if (isReactElement(node)) { - return (node as any).ref; - } - return null; - }; +) => React.Ref | null = node => { + if (node && isReactElement(node)) { + const ele = node as any; + + // Source from: + // https://github.com/mui/material-ui/blob/master/packages/mui-utils/src/getReactNodeRef/getReactNodeRef.ts + return ele.props.propertyIsEnumerable('ref') ? ele.props.ref : ele.ref; + } + return null; +}; diff --git a/tests/ref-19.test.tsx b/tests/ref-19.test.tsx new file mode 100644 index 00000000..2d3d3341 --- /dev/null +++ b/tests/ref-19.test.tsx @@ -0,0 +1,30 @@ +/* eslint-disable no-eval */ +import React from 'react'; +import { getNodeRef } from '../src/ref'; + +jest.mock('react', () => { + const react19 = jest.requireActual('react-19'); + return react19; +}); + +jest.mock('react-dom', () => { + const reactDom19 = jest.requireActual('react-dom-19'); + return reactDom19; +}); + +describe('ref: React 19', () => { + const errSpy = jest.spyOn(console, 'error'); + + beforeEach(() => { + errSpy.mockReset(); + }); + + it('getNodeRef', () => { + const ref = React.createRef(); + const node =
; + + expect(getNodeRef(node)).toBe(ref); + + expect(errSpy).not.toHaveBeenCalled(); + }); +}); diff --git a/tests/ref.test.tsx b/tests/ref.test.tsx index cbcb0ae5..6ca63d0c 100644 --- a/tests/ref.test.tsx +++ b/tests/ref.test.tsx @@ -12,6 +12,12 @@ import { } from '../src/ref'; describe('ref', () => { + const errSpy = jest.spyOn(console, 'error'); + + beforeEach(() => { + errSpy.mockReset(); + }); + describe('composeRef', () => { it('basic', () => { const refFunc1 = jest.fn(); @@ -207,5 +213,7 @@ describe('ref', () => { const node =
; expect(getNodeRef(node)).toBe(ref); + + expect(errSpy).not.toHaveBeenCalled(); }); }); From 2061d7fd7627b12175f0062abdcd0be892c52ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Thu, 5 Dec 2024 19:16:23 +0800 Subject: [PATCH 2/4] chore: update peer --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7afcebbd..5e9b34ef 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "typescript": "^5.3.2" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=16.9.0 || >=19.0.0-rc-de68d2f4-20241204", + "react-dom": ">=16.9.0 || >=19.0.0-rc-de68d2f4-20241204" } } From 2d529413ed86e8ab3861d350b15a1231e7248a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Thu, 5 Dec 2024 19:21:27 +0800 Subject: [PATCH 3/4] chore: clean up --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5e9b34ef..7afcebbd 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "typescript": "^5.3.2" }, "peerDependencies": { - "react": ">=16.9.0 || >=19.0.0-rc-de68d2f4-20241204", - "react-dom": ">=16.9.0 || >=19.0.0-rc-de68d2f4-20241204" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } } From ce78edf4f00bdc942faf50e30ddc624112a15e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Thu, 5 Dec 2024 19:26:29 +0800 Subject: [PATCH 4/4] chore: update build --- now.json | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 now.json diff --git a/now.json b/now.json deleted file mode 100644 index 66876ceb..00000000 --- a/now.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": 2, - "name": "rc-util", - "builds": [ - { - "src": "package.json", - "use": "@now/static-build", - "config": { "distDir": ".doc" } - } - ], - "routes": [{ "src": "/(.*)", "dest": "/dist/$1" }] -}