From 57098447bf4df65296615d885f6e3e00312a8e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E8=89=B3=E5=85=B5?= Date: Thu, 21 May 2026 10:19:18 +0800 Subject: [PATCH 1/2] fix: avoid rc package deep imports --- package.json | 4 ++-- src/InputNumber.tsx | 6 ++--- src/StepHandler.tsx | 2 +- src/hooks/useCursor.ts | 2 +- src/hooks/useFrame.ts | 4 ++-- tests/click.test.tsx | 6 ++--- tests/cursor.test.tsx | 48 ++++++++++++++++++++++------------------ tests/focus.test.tsx | 4 ++-- tests/formatter.test.tsx | 2 +- tests/github.test.tsx | 2 +- tests/input.test.tsx | 2 +- tests/keyboard.test.tsx | 2 +- tests/precision.test.tsx | 6 ++--- tests/props.test.tsx | 10 +++++---- tests/wheel.test.tsx | 32 ++++++++++++++++----------- 15 files changed, 72 insertions(+), 60 deletions(-) diff --git a/package.json b/package.json index 39073d39..37963cab 100644 --- a/package.json +++ b/package.json @@ -46,11 +46,11 @@ }, "dependencies": { "@rc-component/mini-decimal": "^1.1.1", - "@rc-component/util": "^1.4.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "devDependencies": { - "@rc-component/father-plugin": "^2.0.2", + "@rc-component/father-plugin": "^2.2.0", "@rc-component/np": "^1.0.3", "@swc-node/jest": "^1.5.5", "@testing-library/jest-dom": "^6.1.5", diff --git a/src/InputNumber.tsx b/src/InputNumber.tsx index 7ffc2bdc..8b400a90 100644 --- a/src/InputNumber.tsx +++ b/src/InputNumber.tsx @@ -6,16 +6,14 @@ import getMiniDecimal, { validateNumber, ValueType, } from '@rc-component/mini-decimal'; -import { useLayoutUpdateEffect } from '@rc-component/util/lib/hooks/useLayoutEffect'; -import proxyObject from '@rc-component/util/lib/proxyObject'; +import type { InputFocusOptions } from '@rc-component/util'; +import { proxyObject, triggerFocus, useEvent, useLayoutUpdateEffect } from '@rc-component/util'; import { clsx } from 'clsx'; import * as React from 'react'; import useCursor from './hooks/useCursor'; import StepHandler from './StepHandler'; import { getDecupleSteps } from './utils/numberUtil'; -import { useEvent } from '@rc-component/util'; -import { triggerFocus, type InputFocusOptions } from '@rc-component/util/lib/Dom/focus'; import useFrame from './hooks/useFrame'; export type { ValueType }; diff --git a/src/StepHandler.tsx b/src/StepHandler.tsx index 67d81eec..bf437b18 100644 --- a/src/StepHandler.tsx +++ b/src/StepHandler.tsx @@ -1,5 +1,5 @@ /* eslint-disable react/no-unknown-property */ -import raf from '@rc-component/util/lib/raf'; +import { raf } from '@rc-component/util'; import { clsx } from 'clsx'; import * as React from 'react'; diff --git a/src/hooks/useCursor.ts b/src/hooks/useCursor.ts index 5a70a877..72e0be77 100644 --- a/src/hooks/useCursor.ts +++ b/src/hooks/useCursor.ts @@ -1,5 +1,5 @@ +import { warning } from '@rc-component/util'; import { useRef } from 'react'; -import warning from '@rc-component/util/lib/warning'; /** * Keep input cursor in the correct position if possible. * Is this necessary since we have `formatter` which may mass the content? diff --git a/src/hooks/useFrame.ts b/src/hooks/useFrame.ts index 44634ef4..c88e3ec9 100644 --- a/src/hooks/useFrame.ts +++ b/src/hooks/useFrame.ts @@ -1,5 +1,5 @@ -import { useRef, useEffect } from 'react'; -import raf from '@rc-component/util/lib/raf'; +import { raf } from '@rc-component/util'; +import { useEffect, useRef } from 'react'; /** * Always trigger latest once when call multiple time diff --git a/tests/click.test.tsx b/tests/click.test.tsx index 808c2830..ba9625b0 100644 --- a/tests/click.test.tsx +++ b/tests/click.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { render, fireEvent, act } from '@testing-library/react'; import InputNumber, { InputNumberProps } from '../src'; -import KeyCode from '@rc-component/util/lib/KeyCode'; +import { KeyCode } from '@rc-component/util'; jest.mock('@rc-component/mini-decimal/lib/supportUtil'); const { supportBigInt } = require('@rc-component/mini-decimal/lib/supportUtil'); @@ -37,7 +37,7 @@ describe('InputNumber.Click', () => { fireEvent.click(container.querySelector(selector)); expect(onChange).toHaveBeenCalledTimes(1); expect(onChange).toHaveBeenCalledWith(changedValue); - expect(onStep).toHaveBeenCalledWith(changedValue, { offset: 1, type: stepType, emitter }); + expect(onStep).toHaveBeenCalledWith(changedValue, { offset: 1, type: stepType, emitter }); unmount(); }); } @@ -186,7 +186,7 @@ describe('InputNumber.Click', () => { }); expect(onChange).toHaveBeenCalledWith(1.1); - expect(onStep).toHaveBeenCalledWith(1.1, { offset: '0.1', type: 'down', emitter: 'keyboard' }); + expect(onStep).toHaveBeenCalledWith(1.1, { offset: '0.1', type: 'down', emitter: 'keyboard' }); }); it('click up button with pressing shift key', () => { diff --git a/tests/cursor.test.tsx b/tests/cursor.test.tsx index 90669640..9ee939ff 100644 --- a/tests/cursor.test.tsx +++ b/tests/cursor.test.tsx @@ -1,11 +1,10 @@ +import { KeyCode } from '@rc-component/util'; import React from 'react'; -import KeyCode from '@rc-component/util/lib/KeyCode'; -import { render, fireEvent } from './util/wrapper'; import InputNumber from '../src'; +import { fireEvent, render } from './util/wrapper'; describe('InputNumber.Cursor', () => { function cursorInput(input: HTMLInputElement, pos?: number) { - if (pos !== undefined) { input.setSelectionRange(pos, pos); } @@ -17,12 +16,12 @@ describe('InputNumber.Cursor', () => { changeValue: string, cursorPos: number, which?: number, - key?: number|string, + key?: number | string, ) { - fireEvent.focus(input) - fireEvent.keyDown(input,{which,keyCode:which,key}) - fireEvent.change(input,{ target: { value: changeValue, selectionStart: 1 }}) - fireEvent.keyUp(input,{which,keyCode:which,key}) + fireEvent.focus(input); + fireEvent.keyDown(input, { which, keyCode: which, key }); + fireEvent.change(input, { target: { value: changeValue, selectionStart: 1 } }); + fireEvent.keyUp(input, { which, keyCode: which, key }); } // https://github.com/react-component/input-number/issues/235 @@ -42,12 +41,14 @@ describe('InputNumber.Cursor', () => { describe('pre-pend string', () => { it('quick typing', () => { // `$ ` => `9$ ` => `$ 9` - const { container } = render( `$ ${val}`} />); + const { container } = render( + `$ ${val}`} />, + ); const input = container.querySelector('input'); - fireEvent.focus(input) + fireEvent.focus(input); cursorInput(input, 0); - changeOnPos(input, '9$ ', 1, KeyCode.NUM_ONE,'1'); - expect(cursorInput(input,3)).toEqual(3); + changeOnPos(input, '9$ ', 1, KeyCode.NUM_ONE, '1'); + expect(cursorInput(input, 3)).toEqual(3); }); describe('[LEGACY]', () => { @@ -70,14 +71,14 @@ describe('InputNumber.Cursor', () => { const { container } = render(); const input = container.querySelector('input'); - fireEvent.focus(input) + fireEvent.focus(input); for (let i = 0; i < prependValue.length; i += 1) { - fireEvent.keyDown(input,{which: KeyCode.ONE,keyCode: KeyCode.ONE}) + fireEvent.keyDown(input, { which: KeyCode.ONE, keyCode: KeyCode.ONE }); } const finalValue = prependValue + initValue; cursorInput(input, prependValue.length); - fireEvent.change(input,{ target: { value: finalValue } }); + fireEvent.change(input, { target: { value: finalValue } }); return input; }; @@ -85,35 +86,40 @@ describe('InputNumber.Cursor', () => { it('should fix caret position on case 1', () => { // '$ 1' const input = setUpCursorTest('', '1'); - expect(cursorInput(input,3)).toEqual(3); + expect(cursorInput(input, 3)).toEqual(3); }); it('should fix caret position on case 2', () => { // '$ 111' const input = setUpCursorTest('', '111'); - expect(cursorInput(input,5)).toEqual(5); + expect(cursorInput(input, 5)).toEqual(5); }); it('should fix caret position on case 3', () => { // '$ 111' const input = setUpCursorTest('1', '11'); - expect(cursorInput(input,4)).toEqual(4); + expect(cursorInput(input, 4)).toEqual(4); }); it('should fix caret position on case 4', () => { // '$ 123,456' const input = setUpCursorTest('456', '123'); - expect(cursorInput(input,6)).toEqual(6); + expect(cursorInput(input, 6)).toEqual(6); }); }); }); describe('append string', () => { it('position caret before appended characters', () => { - const { container } = render( `${value}%`} parser={(value) => value.replace('%', '')} />); + const { container } = render( + `${value}%`} + parser={(value) => value.replace('%', '')} + />, + ); const input = container.querySelector('input'); fireEvent.focus(input); - fireEvent.change(input,{ target: { value: '5' } }); + fireEvent.change(input, { target: { value: '5' } }); expect(cursorInput(input)).toEqual(1); }); }); diff --git a/tests/focus.test.tsx b/tests/focus.test.tsx index 33a69c8f..c441bbf5 100644 --- a/tests/focus.test.tsx +++ b/tests/focus.test.tsx @@ -1,7 +1,7 @@ +import { spyElementPrototypes } from '@rc-component/util'; import { fireEvent, render } from '@testing-library/react'; -import InputNumber, { InputNumberRef } from '../src'; -import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; import React from 'react'; +import InputNumber, { InputNumberRef } from '../src'; const getInputRef = () => { const ref = React.createRef(); diff --git a/tests/formatter.test.tsx b/tests/formatter.test.tsx index 98cdab88..0e3d5b29 100644 --- a/tests/formatter.test.tsx +++ b/tests/formatter.test.tsx @@ -1,4 +1,4 @@ -import KeyCode from '@rc-component/util/lib/KeyCode'; +import { KeyCode } from '@rc-component/util'; import React from 'react'; import InputNumber from '../src'; import { fireEvent, render } from './util/wrapper'; diff --git a/tests/github.test.tsx b/tests/github.test.tsx index 1aa3aaa7..706c2ad1 100644 --- a/tests/github.test.tsx +++ b/tests/github.test.tsx @@ -1,4 +1,4 @@ -import KeyCode from '@rc-component/util/lib/KeyCode'; +import { KeyCode } from '@rc-component/util'; import React from 'react'; import InputNumber from '../src'; import { act, fireEvent, render, screen, waitFor } from './util/wrapper'; diff --git a/tests/input.test.tsx b/tests/input.test.tsx index df9aa462..798a4e25 100644 --- a/tests/input.test.tsx +++ b/tests/input.test.tsx @@ -1,4 +1,4 @@ -import KeyCode from '@rc-component/util/lib/KeyCode'; +import { KeyCode } from '@rc-component/util'; import React from 'react'; import InputNumber, { InputNumberProps, InputNumberRef } from '../src'; import { fireEvent, render } from './util/wrapper'; diff --git a/tests/keyboard.test.tsx b/tests/keyboard.test.tsx index 596735c6..789be3ad 100644 --- a/tests/keyboard.test.tsx +++ b/tests/keyboard.test.tsx @@ -1,4 +1,4 @@ -import KeyCode from '@rc-component/util/lib/KeyCode'; +import { KeyCode } from '@rc-component/util'; import InputNumber from '../src'; import { fireEvent, render } from './util/wrapper'; diff --git a/tests/precision.test.tsx b/tests/precision.test.tsx index 60f8fc20..99db99d6 100644 --- a/tests/precision.test.tsx +++ b/tests/precision.test.tsx @@ -1,7 +1,7 @@ -import React from 'react'; +import { KeyCode } from '@rc-component/util'; import '@testing-library/jest-dom'; -import { render, fireEvent } from '@testing-library/react'; -import KeyCode from '@rc-component/util/lib/KeyCode'; +import { fireEvent, render } from '@testing-library/react'; +import React from 'react'; import InputNumber from '../src'; describe('InputNumber.Precision', () => { diff --git a/tests/props.test.tsx b/tests/props.test.tsx index 24d1539f..9d893e6f 100644 --- a/tests/props.test.tsx +++ b/tests/props.test.tsx @@ -1,7 +1,7 @@ -import React from 'react'; +import { KeyCode } from '@rc-component/util'; import '@testing-library/jest-dom'; -import { render, fireEvent } from '@testing-library/react'; -import KeyCode from '@rc-component/util/lib/KeyCode'; +import { fireEvent, render } from '@testing-library/react'; +import React from 'react'; import type { ValueType } from '../src'; import InputNumber from '../src'; @@ -410,7 +410,9 @@ describe('InputNumber.Props', () => { describe('mode props', () => { it('render spinner mode', () => { const { container } = render(); - expect(container.querySelector('.rc-input-number')).toHaveClass('rc-input-number-mode-spinner'); + expect(container.querySelector('.rc-input-number')).toHaveClass( + 'rc-input-number-mode-spinner', + ); }); }); diff --git a/tests/wheel.test.tsx b/tests/wheel.test.tsx index 1e0404e0..533e60ac 100644 --- a/tests/wheel.test.tsx +++ b/tests/wheel.test.tsx @@ -1,4 +1,4 @@ -import KeyCode from '@rc-component/util/lib/KeyCode'; +import { KeyCode } from '@rc-component/util'; import InputNumber from '../src'; import { fireEvent, render } from './util/wrapper'; @@ -7,13 +7,15 @@ describe('InputNumber.Wheel', () => { const onChange = jest.fn(); const { container } = render(); fireEvent.focus(container.firstChild); - fireEvent.wheel(container.querySelector('input'), {deltaY: -1}); + fireEvent.wheel(container.querySelector('input'), { deltaY: -1 }); expect(onChange).toHaveBeenCalledWith(1); }); it('wheel up with pressing shift key', () => { const onChange = jest.fn(); - const { container } = render(); + const { container } = render( + , + ); fireEvent.focus(container.firstChild); fireEvent.keyDown(container.querySelector('input'), { which: KeyCode.SHIFT, @@ -21,7 +23,7 @@ describe('InputNumber.Wheel', () => { keyCode: KeyCode.SHIFT, shiftKey: true, }); - fireEvent.wheel(container.querySelector('input'), {deltaY: -1}); + fireEvent.wheel(container.querySelector('input'), { deltaY: -1 }); expect(onChange).toHaveBeenCalledWith(1.3); }); @@ -29,13 +31,15 @@ describe('InputNumber.Wheel', () => { const onChange = jest.fn(); const { container } = render(); fireEvent.focus(container.firstChild); - fireEvent.wheel(container.querySelector('input'), {deltaY: 1}); + fireEvent.wheel(container.querySelector('input'), { deltaY: 1 }); expect(onChange).toHaveBeenCalledWith(-1); }); it('wheel down with pressing shift key', () => { const onChange = jest.fn(); - const { container } = render(); + const { container } = render( + , + ); fireEvent.focus(container.firstChild); fireEvent.keyDown(container.querySelector('input'), { which: KeyCode.SHIFT, @@ -43,7 +47,7 @@ describe('InputNumber.Wheel', () => { keyCode: KeyCode.SHIFT, shiftKey: true, }); - fireEvent.wheel(container.querySelector('input'), {deltaY: 1}); + fireEvent.wheel(container.querySelector('input'), { deltaY: 1 }); expect(onChange).toHaveBeenCalledWith(1.1); }); @@ -52,22 +56,24 @@ describe('InputNumber.Wheel', () => { const { container, rerender } = render(); fireEvent.focus(container.firstChild); - fireEvent.wheel(container.querySelector('input'), {deltaY: -1}); + fireEvent.wheel(container.querySelector('input'), { deltaY: -1 }); expect(onChange).not.toHaveBeenCalled(); - fireEvent.wheel(container.querySelector('input'), {deltaY: 1}); + fireEvent.wheel(container.querySelector('input'), { deltaY: 1 }); expect(onChange).not.toHaveBeenCalled(); rerender(); fireEvent.focus(container.firstChild); - fireEvent.wheel(container.querySelector('input'), {deltaY: 1}); + fireEvent.wheel(container.querySelector('input'), { deltaY: 1 }); expect(onChange).toHaveBeenCalledWith(-1); }); it('wheel is limited to range', () => { const onChange = jest.fn(); - const { container } = render(); + const { container } = render( + , + ); fireEvent.focus(container.firstChild); fireEvent.keyDown(container.querySelector('input'), { which: KeyCode.SHIFT, @@ -75,9 +81,9 @@ describe('InputNumber.Wheel', () => { keyCode: KeyCode.SHIFT, shiftKey: true, }); - fireEvent.wheel(container.querySelector('input'), {deltaY: -1}); + fireEvent.wheel(container.querySelector('input'), { deltaY: -1 }); expect(onChange).toHaveBeenCalledWith(3); - fireEvent.wheel(container.querySelector('input'), {deltaY: 1}); + fireEvent.wheel(container.querySelector('input'), { deltaY: 1 }); expect(onChange).toHaveBeenCalledWith(-3); }); }); From 2c6b77186f736c61d574107a04b82db5e81ebebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E8=89=B3=E5=85=B5?= Date: Thu, 21 May 2026 14:31:29 +0800 Subject: [PATCH 2/2] chore: address import review comments --- src/InputNumber.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/InputNumber.tsx b/src/InputNumber.tsx index 8b400a90..f3b4a2a7 100644 --- a/src/InputNumber.tsx +++ b/src/InputNumber.tsx @@ -6,8 +6,13 @@ import getMiniDecimal, { validateNumber, ValueType, } from '@rc-component/mini-decimal'; -import type { InputFocusOptions } from '@rc-component/util'; -import { proxyObject, triggerFocus, useEvent, useLayoutUpdateEffect } from '@rc-component/util'; +import { + type InputFocusOptions, + proxyObject, + triggerFocus, + useEvent, + useLayoutUpdateEffect, +} from '@rc-component/util'; import { clsx } from 'clsx'; import * as React from 'react'; import useCursor from './hooks/useCursor';