Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit e27b1f6

Browse files
author
Ben Grynhaus
authored
fix: TypeScript types broken with latest popperjs-core (#352)
* upgrade `@popperjs/core` to 2.3.3 * fix typescript types * better TypeScript modifier types for `usePopper` * add missing VirtualElement type for `usePopper` hook in TypeScript
1 parent 921eedb commit e27b1f6

File tree

4 files changed

+34
-13
lines changed

4 files changed

+34
-13
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
"@babel/preset-react": "^7.9.4",
7777
"@emotion/core": "^10.0.28",
7878
"@emotion/styled": "^10.0.27",
79-
"@popperjs/core": "^2.2.1",
79+
"@popperjs/core": "^2.3.3",
8080
"@rollup/plugin-commonjs": "^11.0.2",
8181
"@rollup/plugin-node-resolve": "^7.1.1",
8282
"@rollup/plugin-replace": "^2.3.1",

src/Popper.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
type Placement,
66
type PositioningStrategy,
77
type VirtualElement,
8+
type StrictModifiers,
89
type Modifier,
910
} from '@popperjs/core/lib';
1011
import { ManagerReferenceNodeContext } from './Manager';
@@ -13,7 +14,7 @@ import { unwrapArray, setRef } from './utils';
1314
import { usePopper } from './usePopper';
1415

1516
type ReferenceElement = ?(VirtualElement | HTMLElement);
16-
type Modifiers = Array<$Shape<Modifier<any>>>;
17+
type Modifiers = Array<StrictModifiers | $Shape<Modifier<string, {}>>>;
1718

1819
export type PopperArrowProps = {|
1920
ref: Ref,

typings/react-popper.d.ts

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
import * as React from 'react';
21
import * as PopperJS from '@popperjs/core';
2+
import * as React from 'react';
3+
4+
// Utility type
5+
type UnionWhere<U, M> = U extends M ? U : never;
36

47
interface ManagerProps {
58
children: React.ReactNode;
@@ -37,22 +40,39 @@ export interface PopperChildrenProps {
3740
arrowProps: PopperArrowProps;
3841
}
3942

40-
export interface PopperProps {
43+
type StrictModifierNames = NonNullable<PopperJS.StrictModifiers['name']>;
44+
45+
export type StrictModifier<
46+
Name extends StrictModifierNames = StrictModifierNames
47+
> = UnionWhere<PopperJS.StrictModifiers, { name?: Name }>;
48+
49+
export type Modifier<
50+
Name,
51+
Options extends object = object
52+
> = Name extends StrictModifierNames
53+
? StrictModifier<Name>
54+
: Partial<PopperJS.Modifier<Name, Options>>;
55+
56+
export interface PopperProps<Modifiers> {
4157
children: (props: PopperChildrenProps) => React.ReactNode;
4258
innerRef?: React.Ref<any>;
43-
modifiers?: Array<Partial<PopperJS.Modifier<any>>>;
59+
modifiers?: ReadonlyArray<Modifier<Modifiers>>;
4460
placement?: PopperJS.Placement;
4561
strategy?: PopperJS.PositioningStrategy;
4662
referenceElement?: HTMLElement | PopperJS.VirtualElement;
4763
onFirstUpdate?: (state: Partial<PopperJS.State>) => void;
4864
}
49-
export class Popper extends React.Component<PopperProps, {}> {}
65+
export class Popper<Modifiers> extends React.Component<
66+
PopperProps<Modifiers>,
67+
{}
68+
> {}
5069

51-
export function usePopper(
52-
referenceElement?: Element | null,
70+
export function usePopper<Modifiers>(
71+
referenceElement?: Element | PopperJS.VirtualElement | null,
5372
popperElement?: HTMLElement | null,
54-
options?: Partial<PopperJS.Options> & {
73+
options?: Omit<Partial<PopperJS.Options>, 'modifiers'> & {
5574
createPopper?: typeof PopperJS.createPopper;
75+
modifiers?: ReadonlyArray<Modifier<Modifiers>>;
5676
}
5777
): {
5878
styles: { [key: string]: React.CSSProperties };

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,10 +1251,10 @@
12511251
"@parcel/utils" "^1.11.0"
12521252
physical-cpu-count "^2.0.0"
12531253

1254-
"@popperjs/core@^2.2.1":
1255-
version "2.2.1"
1256-
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.2.1.tgz#d7d1d7fbdc1f2aa24e62f4ef4b001be7727340c5"
1257-
integrity sha512-BChdj3idQiLi+7vPhE6gEDiPzpozvSrUqbSMoSTlRbOQkU0p6u4si0UBydegTyphsYSZC2AUHGYYICP0gqmEVg==
1254+
"@popperjs/core@^2.3.3":
1255+
version "2.3.3"
1256+
resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.3.3.tgz#8731722aeb7330e8fd9eb5d424be6b98dea7d6da"
1257+
integrity sha512-yEvVC8RfhRPkD9TUn7cFcLcgoJePgZRAOR7T21rcRY5I8tpuhzeWfGa7We7tB14fe9R7wENdqUABcMdwD4SQLw==
12581258

12591259
"@rollup/plugin-commonjs@^11.0.2":
12601260
version "11.0.2"

0 commit comments

Comments
 (0)