diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index cf8ad0b..0000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const base = require('@umijs/fabric/dist/eslint');
-
-module.exports = {
- ...base,
- rules: {
- ...base.rules,
- 'no-template-curly-in-string': 0,
- 'prefer-promise-reject-errors': 0,
- 'react/no-array-index-key': 0,
- 'react/sort-comp': 0,
- '@typescript-eslint/no-explicit-any': 0,
- },
-};
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 3b730ef..5e6c7fa 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -8,6 +8,10 @@ updates:
time: '21:00'
timezone: Asia/Shanghai
open-pull-requests-limit: 10
+ groups:
+ npm-dependencies:
+ patterns:
+ - '*'
- package-ecosystem: github-actions
directory: '/'
@@ -17,3 +21,7 @@ updates:
time: '21:00'
timezone: Asia/Shanghai
open-pull-requests-limit: 10
+ groups:
+ github-actions:
+ patterns:
+ - '*'
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 3be35a8..c6139d2 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -11,6 +11,7 @@ on:
jobs:
analyze:
name: Analyze
+ if: github.event_name != 'pull_request'
runs-on: ubuntu-latest
permissions:
actions: read
diff --git a/README.md b/README.md
index 7a817b6..1ed89cf 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
@rc-component/input
-
Part of the Ant Design ecosystem.
+
Part of the Ant Design ecosystem.
๐ฆ โจ๏ธ Low-level React input primitives for building polished text fields and textareas.
@@ -106,18 +106,15 @@ Then open `http://localhost:8000`.
### Refs
```tsx | pure
-import React from 'react';
-import Input, {
- TextArea,
- type InputRef,
- type TextAreaRef,
-} from '@rc-component/input';
-
-const inputRef = React.useRef(null);
-const textareaRef = React.useRef(null);
-
-inputRef.current?.focus();
-textareaRef.current?.blur();
+import type { InputRef, TextAreaRef } from '@rc-component/input';
+
+function focusInput(inputRef: InputRef | null) {
+ inputRef?.focus();
+}
+
+function blurTextArea(textareaRef: TextAreaRef | null) {
+ textareaRef?.blur();
+}
```
| Ref | Methods |
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 4bc30a9..24a3aea 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -1,6 +1,6 @@
@rc-component/input
-
Ant Design ็ๆ็ไธ้จๅใ
+
Ant Design ็ๆ็ไธ้จๅใ
๐ฆ โจ๏ธ React ่พๅ
ฅๆกๅบ็ก็ปไปถ๏ผๆฏๆๅๅ็ผใๆธ
้คๆ้ฎใ่ฎกๆฐๅ็ปๅ่พๅ
ฅใ
@@ -106,18 +106,15 @@ npm start
### Refs
```tsx | pure
-import React from 'react';
-import Input, {
- TextArea,
- type InputRef,
- type TextAreaRef,
-} from '@rc-component/input';
-
-const inputRef = React.useRef(null);
-const textareaRef = React.useRef(null);
-
-inputRef.current?.focus();
-textareaRef.current?.blur();
+import type { InputRef, TextAreaRef } from '@rc-component/input';
+
+function focusInput(inputRef: InputRef | null) {
+ inputRef?.focus();
+}
+
+function blurTextArea(textareaRef: TextAreaRef | null) {
+ textareaRef?.blur();
+}
```
| Ref | ๆนๆณ |
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..40f08ec
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,115 @@
+import js from '@eslint/js';
+import { defineConfig } from 'eslint/config';
+import { dirname } from 'node:path';
+import { fileURLToPath } from 'node:url';
+import prettier from 'eslint-config-prettier';
+import jest from 'eslint-plugin-jest';
+import react from 'eslint-plugin-react';
+import reactHooks from 'eslint-plugin-react-hooks';
+import globals from 'globals';
+import tseslint from 'typescript-eslint';
+
+const tsconfigRootDir = dirname(fileURLToPath(import.meta.url));
+
+export default defineConfig([
+ {
+ plugins: {
+ '@typescript-eslint': tseslint.plugin,
+ },
+ },
+ {
+ linterOptions: {
+ reportUnusedDisableDirectives: 'warn',
+ },
+ },
+ {
+ ignores: [
+ 'node_modules/',
+ 'coverage/',
+ 'es/',
+ 'lib/',
+ 'dist/',
+ 'docs-dist/',
+ '.docs-dist/',
+ '.dumi/',
+ '.doc/',
+ '.vercel/',
+ ],
+ },
+ {
+ files: ['**/*.{js,jsx,ts,tsx}'],
+ extends: [
+ js.configs.recommended,
+ react.configs.flat.recommended,
+ react.configs.flat['jsx-runtime'],
+ prettier,
+ ],
+ plugins: {
+ 'react-hooks': reactHooks,
+ },
+ languageOptions: {
+ globals: {
+ ...globals.browser,
+ ...globals.node,
+ },
+ },
+ settings: {
+ react: {
+ version: 'detect',
+ },
+ },
+ rules: {
+ 'no-async-promise-executor': 'off',
+ 'no-empty-pattern': 'off',
+ 'no-irregular-whitespace': 'off',
+ 'no-prototype-builtins': 'off',
+ 'no-useless-escape': 'off',
+ 'no-extra-boolean-cast': 'off',
+ 'no-undef': 'off',
+ 'no-unused-vars': 'off',
+ 'react/no-find-dom-node': 'off',
+ 'react/display-name': 'off',
+ 'react/no-unknown-property': 'off',
+ 'react/prop-types': 'off',
+ 'react-hooks/exhaustive-deps': 'warn',
+ 'react-hooks/rules-of-hooks': 'error',
+ },
+ },
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [...tseslint.configs.recommended],
+ rules: {
+ '@typescript-eslint/ban-ts-comment': 'off',
+ '@typescript-eslint/no-empty-object-type': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-unsafe-function-type': 'off',
+ '@typescript-eslint/no-unnecessary-type-constraint': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ },
+ },
+ {
+ files: ['src/**/*.{ts,tsx}'],
+ languageOptions: {
+ parserOptions: {
+ projectService: true,
+ tsconfigRootDir,
+ },
+ },
+ },
+ {
+ files: ['tests/**/*.{js,jsx,ts,tsx}', '**/*.{test,spec}.{js,jsx,ts,tsx}'],
+ extends: [jest.configs['flat/recommended']],
+ rules: {
+ 'jest/no-disabled-tests': 'off',
+ 'jest/no-done-callback': 'off',
+ 'jest/no-identical-title': 'off',
+ 'jest/expect-expect': 'off',
+ 'jest/no-alias-methods': 'off',
+ 'jest/no-conditional-expect': 'off',
+ 'jest/no-export': 'off',
+ 'jest/no-standalone-expect': 'off',
+ 'jest/valid-expect': 'off',
+ 'jest/valid-title': 'off',
+ },
+ },
+]);
diff --git a/global.d.ts b/global.d.ts
new file mode 100644
index 0000000..e0bd355
--- /dev/null
+++ b/global.d.ts
@@ -0,0 +1,11 @@
+///
+///
+///
+///
+///
+
+declare module '*.css';
+declare module '*.less';
+declare module 'jsonp';
+
+declare module 'moment/locale/zh-cn';
diff --git a/package.json b/package.json
index 624fd95..41a6270 100644
--- a/package.json
+++ b/package.json
@@ -49,29 +49,36 @@
"clsx": "^2.1.1"
},
"devDependencies": {
+ "@eslint/js": "^9.39.4",
"@rc-component/father-plugin": "^2.2.0",
"@rc-component/np": "^1.0.4",
+ "@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1",
- "@testing-library/react": "^15.0.7",
- "@testing-library/user-event": "14.5.2",
- "@types/jest": "^29.5.14",
+ "@testing-library/react": "^16.3.2",
+ "@testing-library/user-event": "^14.6.1",
+ "@types/jest": "^30.0.0",
"@types/node": "^26.0.1",
- "@types/react": "^18.3.31",
- "@types/react-dom": "^18.3.7",
- "@umijs/fabric": "^4.0.1",
+ "@types/react": "^19.2.17",
+ "@types/react-dom": "^19.2.3",
"cross-env": "^10.1.0",
- "dumi": "^2.4.35",
- "eslint": "^8.57.1",
- "father": "^4.6.23",
+ "dumi": "^2.4.38",
+ "eslint": "^9.39.4",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-jest": "^29.15.4",
+ "eslint-plugin-react": "^7.37.5",
+ "eslint-plugin-react-hooks": "^7.1.1",
+ "father": "^4.6.24",
"gh-pages": "^6.3.0",
+ "globals": "^17.7.0",
"husky": "^9.1.7",
"less": "^4.6.7",
- "lint-staged": "^16.4.0",
- "prettier": "^3.9.0",
+ "lint-staged": "^17.0.8",
+ "prettier": "^3.9.4",
"rc-test": "^7.1.3",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
- "typescript": "^5.9.3"
+ "react": "^19.2.7",
+ "react-dom": "^19.2.7",
+ "typescript": "^6.0.3",
+ "typescript-eslint": "^8.62.1"
},
"peerDependencies": {
"react": ">=16.0.0",
diff --git a/src/utils/types.ts b/src/utils/types.ts
index e1bae8a..973d5c4 100644
--- a/src/utils/types.ts
+++ b/src/utils/types.ts
@@ -1,3 +1,2 @@
/** https://github.com/Microsoft/TypeScript/issues/29729 */
-// eslint-disable-next-line @typescript-eslint/ban-types
export type LiteralUnion = T | (U & Record);
diff --git a/tests/__snapshots__/BaseInput.test.tsx.snap b/tests/__snapshots__/BaseInput.test.tsx.snap
index 62f1def..f8dbea9 100644
--- a/tests/__snapshots__/BaseInput.test.tsx.snap
+++ b/tests/__snapshots__/BaseInput.test.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`BaseInput addon should render properly 1`] = `
@@ -14,9 +14,7 @@ exports[`BaseInput addon should render properly 1`] = `
>
addonBefore
-
+
@@ -27,9 +25,7 @@ exports[`BaseInput addon should render properly 1`] = `
-
+
@@ -52,18 +48,14 @@ exports[`BaseInput prefix and suffix should render properly 1`] = `
>
prefix
-
+
-
+
@@ -95,9 +87,7 @@ exports[`BaseInput should correct render with prefix and addon 1`] = `
>
prefix
-
+
@@ -106,9 +96,7 @@ exports[`BaseInput should correct render with prefix and addon 1`] = `
exports[`BaseInput should render perfectly 1`] = `
-
+
`;
@@ -133,9 +121,7 @@ exports[`BaseInput support use div as basic element 1`] = `
>
prefix
-
+
diff --git a/tests/__snapshots__/TextArea.allowClear.test.tsx.snap b/tests/__snapshots__/TextArea.allowClear.test.tsx.snap
index db1093c..c3777a1 100644
--- a/tests/__snapshots__/TextArea.allowClear.test.tsx.snap
+++ b/tests/__snapshots__/TextArea.allowClear.test.tsx.snap
@@ -1,4 +1,4 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`should support allowClear should not show icon if defaultValue is undefined, null or empty string 1`] = `