Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 0 additions & 16 deletions .eslintrc.js

This file was deleted.

8 changes: 8 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: '/'
Expand All @@ -17,3 +21,7 @@ updates:
time: '21:00'
timezone: Asia/Shanghai
open-pull-requests-limit: 10
groups:
github-actions:
patterns:
- '*'
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<div align="center">
<h1>@rc-component/dropdown</h1>
<p><sub><img alt="Ant Design" height="14" src="https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg" style="vertical-align: -0.125em;" /> Part of the Ant Design ecosystem.</sub></p>
<p><sub><a href="https://ant.design"><img alt="Ant Design" height="14" src="https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg" style="vertical-align: -0.125em;" /></a> Part of the Ant Design ecosystem.</sub></p>
<p>🔽 A trigger-driven dropdown component for React.</p>

<p>
Expand Down
2 changes: 1 addition & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<div align="center">
<h1>@rc-component/dropdown</h1>
<p><sub><img alt="Ant Design" height="14" src="https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg" style="vertical-align: -0.125em;" /> Ant Design 生态的一部分。</sub></p>
<p><sub><a href="https://ant.design"><img alt="Ant Design" height="14" src="https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg" style="vertical-align: -0.125em;" /></a> Ant Design 生态的一部分。</sub></p>
<p>🔽 ⬇️ React 下拉菜单基础组件,基于 trigger 和 menu 能力构建。</p>

<p>
Expand Down
5 changes: 5 additions & 0 deletions codecov.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
coverage:
status:
project:
default:
threshold: 1%
115 changes: 115 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -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',
},
},
]);
11 changes: 11 additions & 0 deletions global.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/// <reference types="jest" />
/// <reference types="node" />
/// <reference types="react" />
/// <reference types="react-dom" />
/// <reference types="@testing-library/jest-dom" />

declare module '*.css';
declare module '*.less';
declare module 'jsonp';

declare module 'moment/locale/zh-cn';
35 changes: 21 additions & 14 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,31 +47,38 @@
"clsx": "^2.1.1"
},
"devDependencies": {
"@eslint/js": "^9.39.4",
"@rc-component/father-plugin": "^2.2.0",
"@rc-component/menu": "^1.0.0",
"@rc-component/np": "^1.0.4",
"@rc-component/resize-observer": "^1.0.0",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^15.0.7",
"@types/jest": "^29.5.14",
"@testing-library/react": "^16.3.2",
"@types/jest": "^30.0.0",
"@types/node": "^26.0.1",
"@types/react": "^18.3.31",
"@types/react-dom": "^18.3.7",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@types/warning": "^3.0.4",
"@umijs/fabric": "^4.0.1",
"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",
"glob": "^13.0.6",
"globals": "^17.7.0",
"husky": "^9.1.7",
"jest-environment-jsdom": "^29.7.0",
"jest-environment-jsdom": "^30.4.1",
"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.11.0",
Expand Down
2 changes: 1 addition & 1 deletion src/Overlay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const Overlay = forwardRef<HTMLElement, OverlayProps>((props, ref) => {
return (
<>
{arrow && <div className={`${prefixCls}-arrow`} />}
{React.cloneElement(overlayNode, {
{React.cloneElement(overlayNode as React.ReactElement<any>, {
ref: supportRef(overlayNode) ? composedRef : undefined,
})}
</>
Expand Down
4 changes: 2 additions & 2 deletions tests/__snapshots__/basic.test.tsx.snap
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing

exports[`dropdown simply works 1`] = `
<div>
Expand All @@ -9,7 +9,7 @@ exports[`dropdown simply works 1`] = `
</button>
<div
class="rc-dropdown rc-dropdown-placement-bottomLeft"
style="--arrow-x: 0px; --arrow-y: 0px; left: -1000vw; top: -1000vh; box-sizing: border-box; min-width: 100px;"
style="--arrow-x: 0px; --arrow-y: 0px; left: -1000vw; top: -1000vh; right: auto; bottom: auto; box-sizing: border-box; min-width: 100px;"
>
<ul
class="rc-menu rc-menu-root rc-menu-vertical"
Expand Down
17 changes: 16 additions & 1 deletion tests/basic.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,19 @@ describe('dropdown', () => {
expect(onVisibleChange).toHaveBeenCalledWith(false);
});

it('forwards ref to trigger', () => {
const ref = createRef<any>();
const { container } = render(
<Dropdown ref={ref} overlay={<div>Test</div>}>
<button className="my-button">open</button>
</Dropdown>,
);

expect(ref.current.nativeElement).toBe(
container.querySelector('.my-button'),
);
});

it('simply works', async () => {
let clicked;

Expand Down Expand Up @@ -296,7 +309,9 @@ describe('dropdown', () => {
</Dropdown>,
);

expect(container.querySelector('.my-button')).toHaveClass('rc-dropdown-open');
expect(container.querySelector('.my-button')).toHaveClass(
'rc-dropdown-open',
);
});

it('overlay callback', async () => {
Expand Down
16 changes: 4 additions & 12 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,26 +1,18 @@
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"baseUrl": "./",
"declaration": true,
"module": "esnext",
"target": "esnext",
"moduleResolution": "node",
"moduleResolution": "bundler",
"jsx": "react",
"skipLibCheck": true,
"paths": {
"@@/*": [
".dumi/tmp/*"
]
"@@/*": ["./.dumi/tmp/*"]
},
"ignoreDeprecations": "5.0"
"strict": false
},
"include": [
".fatherrc.ts",
"./src",
"./tests",
"./typings/"
],
"include": ["global.d.ts", ".fatherrc.ts", "./src", "./tests", "./typings/"],
"typings": "./typings/index.d.ts",
"exclude": [
"node_modules",
Expand Down
Loading