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" }] -} 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(); }); });