diff --git a/lib/react-dom.js b/lib/react-dom.js index 59761671c81..bebe3030ebb 100644 --- a/lib/react-dom.js +++ b/lib/react-dom.js @@ -272,116 +272,116 @@ declare class SyntheticTransitionEvent< // prettier-ignore declare type $JSXIntrinsics = { // HTML - a: {instance: HTMLAnchorElement, props: {children?: React$Node, [key: string]: any}}, - abbr: ReactDOM$HTMLElementJSXIntrinsic, - address: ReactDOM$HTMLElementJSXIntrinsic, - area: ReactDOM$HTMLElementJSXIntrinsic, - article: ReactDOM$HTMLElementJSXIntrinsic, - aside: ReactDOM$HTMLElementJSXIntrinsic, - audio: {instance: HTMLAudioElement, props: {children?: React$Node, [key: string]: any}}, - b: ReactDOM$HTMLElementJSXIntrinsic, - base: ReactDOM$HTMLElementJSXIntrinsic, - bdi: ReactDOM$HTMLElementJSXIntrinsic, - bdo: ReactDOM$HTMLElementJSXIntrinsic, - big: ReactDOM$HTMLElementJSXIntrinsic, - blockquote: ReactDOM$HTMLElementJSXIntrinsic, - body: ReactDOM$HTMLElementJSXIntrinsic, - br: {instance: HTMLBRElement, props: {children?: React$Node, [key: string]: any}}, - button: {instance: HTMLButtonElement, props: {children?: React$Node, [key: string]: any}}, - canvas: {instance: HTMLCanvasElement, props: {children?: React$Node, [key: string]: any}}, - caption: {instance: HTMLTableCaptionElement, props: {children?: React$Node, [key: string]: any}}, - cite: ReactDOM$HTMLElementJSXIntrinsic, - code: ReactDOM$HTMLElementJSXIntrinsic, - col: ReactDOM$HTMLElementJSXIntrinsic, - colgroup: ReactDOM$HTMLElementJSXIntrinsic, - data: ReactDOM$HTMLElementJSXIntrinsic, - datalist: ReactDOM$HTMLElementJSXIntrinsic, - dd: ReactDOM$HTMLElementJSXIntrinsic, - del: ReactDOM$HTMLElementJSXIntrinsic, - details: {instance: HTMLDetailsElement, props: {children?: React$Node, [key: string]: any}}, - dfn: ReactDOM$HTMLElementJSXIntrinsic, - dialog: ReactDOM$HTMLElementJSXIntrinsic, - div: {instance: HTMLDivElement, props: {children?: React$Node, [key: string]: any}}, - dl: {instance: HTMLDListElement, props: {children?: React$Node, [key: string]: any}}, - dt: ReactDOM$HTMLElementJSXIntrinsic, - em: ReactDOM$HTMLElementJSXIntrinsic, - embed: ReactDOM$HTMLElementJSXIntrinsic, - fieldset: {instance: HTMLFieldSetElement, props: {children?: React$Node, [key: string]: any}}, - figcaption: ReactDOM$HTMLElementJSXIntrinsic, - figure: ReactDOM$HTMLElementJSXIntrinsic, - footer: ReactDOM$HTMLElementJSXIntrinsic, - form: {instance: HTMLFormElement, props: {children?: React$Node, [key: string]: any}}, - h1: {instance: HTMLHeadingElement, props: {children?: React$Node, [key: string]: any}}, - h2: {instance: HTMLHeadingElement, props: {children?: React$Node, [key: string]: any}}, - h3: {instance: HTMLHeadingElement, props: {children?: React$Node, [key: string]: any}}, - h4: {instance: HTMLHeadingElement, props: {children?: React$Node, [key: string]: any}}, - h5: {instance: HTMLHeadingElement, props: {children?: React$Node, [key: string]: any}}, - h6: {instance: HTMLHeadingElement, props: {children?: React$Node, [key: string]: any}}, - head: ReactDOM$HTMLElementJSXIntrinsic, - header: ReactDOM$HTMLElementJSXIntrinsic, - hgroup: ReactDOM$HTMLElementJSXIntrinsic, - hr: {instance: HTMLHRElement, props: {children?: React$Node, [key: string]: any}}, - html: ReactDOM$HTMLElementJSXIntrinsic, - i: ReactDOM$HTMLElementJSXIntrinsic, - iframe: {instance: HTMLIFrameElement, props: {children?: React$Node, [key: string]: any}}, - img: {instance: HTMLImageElement, props: {children?: React$Node, [key: string]: any}}, - ins: ReactDOM$HTMLElementJSXIntrinsic, - kbd: ReactDOM$HTMLElementJSXIntrinsic, - keygen: ReactDOM$HTMLElementJSXIntrinsic, - label: {instance: HTMLLabelElement, props: {children?: React$Node, [key: string]: any}}, - legend: {instance: HTMLLegendElement, props: {children?: React$Node, [key: string]: any}}, - li: {instance: HTMLLIElement, props: {children?: React$Node, [key: string]: any}}, - link: {instance: HTMLLinkElement, props: {children?: React$Node, [key: string]: any}}, - main: ReactDOM$HTMLElementJSXIntrinsic, - map: ReactDOM$HTMLElementJSXIntrinsic, - mark: ReactDOM$HTMLElementJSXIntrinsic, - menu: ReactDOM$HTMLElementJSXIntrinsic, - menuitem: ReactDOM$HTMLElementJSXIntrinsic, - meta: {instance: HTMLMetaElement, props: {children?: React$Node, [key: string]: any}}, - meter: ReactDOM$HTMLElementJSXIntrinsic, - nav: ReactDOM$HTMLElementJSXIntrinsic, - noscript: ReactDOM$HTMLElementJSXIntrinsic, - object: ReactDOM$HTMLElementJSXIntrinsic, - ol: {instance: HTMLOListElement, props: {children?: React$Node, [key: string]: any}}, - optgroup: {instance: HTMLOptGroupElement, props: {children?: React$Node, [key: string]: any}}, - option: {instance: HTMLOptionElement, props: {children?: React$Node, [key: string]: any}}, - output: ReactDOM$HTMLElementJSXIntrinsic, - p: {instance: HTMLParagraphElement, props: {children?: React$Node, [key: string]: any}}, - param: ReactDOM$HTMLElementJSXIntrinsic, - picture: ReactDOM$HTMLElementJSXIntrinsic, - pre: {instance: HTMLPreElement, props: {children?: React$Node, [key: string]: any}}, - progress: ReactDOM$HTMLElementJSXIntrinsic, - q: ReactDOM$HTMLElementJSXIntrinsic, - rp: ReactDOM$HTMLElementJSXIntrinsic, - rt: ReactDOM$HTMLElementJSXIntrinsic, - ruby: ReactDOM$HTMLElementJSXIntrinsic, - s: ReactDOM$HTMLElementJSXIntrinsic, - samp: ReactDOM$HTMLElementJSXIntrinsic, - script: {instance: HTMLScriptElement, props: {children?: React$Node, [key: string]: any}}, - section: ReactDOM$HTMLElementJSXIntrinsic, - small: ReactDOM$HTMLElementJSXIntrinsic, - source: {instance: HTMLSourceElement, props: {children?: React$Node, [key: string]: any}}, - span: {instance: HTMLSpanElement, props: {children?: React$Node, [key: string]: any}}, - strong: ReactDOM$HTMLElementJSXIntrinsic, - style: {instance: HTMLStyleElement, props: {children?: React$Node, [key: string]: any}}, - sub: ReactDOM$HTMLElementJSXIntrinsic, - summary: ReactDOM$HTMLElementJSXIntrinsic, - sup: ReactDOM$HTMLElementJSXIntrinsic, - table: {instance: HTMLTableElement, props: {children?: React$Node, [key: string]: any}}, - tbody: {instance: HTMLTableSectionElement, props: {children?: React$Node, [key: string]: any}}, - td: {instance: HTMLTableCellElement, props: {children?: React$Node, [key: string]: any}}, - tfoot: {instance: HTMLTableSectionElement, props: {children?: React$Node, [key: string]: any}}, - th: {instance: HTMLTableCellElement, props: {children?: React$Node, [key: string]: any}}, - thead: {instance: HTMLTableSectionElement, props: {children?: React$Node, [key: string]: any}}, - time: ReactDOM$HTMLElementJSXIntrinsic, - title: ReactDOM$HTMLElementJSXIntrinsic, - tr: {instance: HTMLTableRowElement, props: {children?: React$Node, [key: string]: any}}, - track: ReactDOM$HTMLElementJSXIntrinsic, - u: ReactDOM$HTMLElementJSXIntrinsic, - ul: {instance: HTMLUListElement, props: {children?: React$Node, [key: string]: any}}, - 'var': ReactDOM$HTMLElementJSXIntrinsic, - video: {instance: HTMLVideoElement, props: {children?: React$Node, [key: string]: any}}, - wbr: ReactDOM$HTMLElementJSXIntrinsic, + a: ReactDOM$HTMLElementJSXIntrinsic, + abbr: ReactDOM$HTMLElementJSXIntrinsic<>, + address: ReactDOM$HTMLElementJSXIntrinsic<>, + area: ReactDOM$HTMLElementJSXIntrinsic>, + article: ReactDOM$HTMLElementJSXIntrinsic<>, + aside: ReactDOM$HTMLElementJSXIntrinsic<>, + audio: ReactDOM$HTMLElementJSXIntrinsic, + b: ReactDOM$HTMLElementJSXIntrinsic<>, + base: ReactDOM$HTMLElementJSXIntrinsic>, + bdi: ReactDOM$HTMLElementJSXIntrinsic<>, + bdo: ReactDOM$HTMLElementJSXIntrinsic<>, + big: ReactDOM$HTMLElementJSXIntrinsic<>, + blockquote: ReactDOM$HTMLElementJSXIntrinsic<>, + body: ReactDOM$HTMLElementJSXIntrinsic<>, + br: ReactDOM$HTMLElementJSXIntrinsic>, + button: ReactDOM$HTMLElementJSXIntrinsic, + canvas: ReactDOM$HTMLElementJSXIntrinsic, + caption: ReactDOM$HTMLElementJSXIntrinsic, + cite: ReactDOM$HTMLElementJSXIntrinsic<>, + code: ReactDOM$HTMLElementJSXIntrinsic<>, + col: ReactDOM$HTMLElementJSXIntrinsic>, + colgroup: ReactDOM$HTMLElementJSXIntrinsic<>, + data: ReactDOM$HTMLElementJSXIntrinsic<>, + datalist: ReactDOM$HTMLElementJSXIntrinsic<>, + dd: ReactDOM$HTMLElementJSXIntrinsic<>, + del: ReactDOM$HTMLElementJSXIntrinsic<>, + details: ReactDOM$HTMLElementJSXIntrinsic, + dfn: ReactDOM$HTMLElementJSXIntrinsic<>, + dialog: ReactDOM$HTMLElementJSXIntrinsic<>, + div: ReactDOM$HTMLElementJSXIntrinsic, + dl: ReactDOM$HTMLElementJSXIntrinsic, + dt: ReactDOM$HTMLElementJSXIntrinsic<>, + em: ReactDOM$HTMLElementJSXIntrinsic<>, + embed: ReactDOM$HTMLElementJSXIntrinsic>, + fieldset: ReactDOM$HTMLElementJSXIntrinsic, + figcaption: ReactDOM$HTMLElementJSXIntrinsic<>, + figure: ReactDOM$HTMLElementJSXIntrinsic<>, + footer: ReactDOM$HTMLElementJSXIntrinsic<>, + form: ReactDOM$HTMLElementJSXIntrinsic, + h1: ReactDOM$HTMLElementJSXIntrinsic, + h2: ReactDOM$HTMLElementJSXIntrinsic, + h3: ReactDOM$HTMLElementJSXIntrinsic, + h4: ReactDOM$HTMLElementJSXIntrinsic, + h5: ReactDOM$HTMLElementJSXIntrinsic, + h6: ReactDOM$HTMLElementJSXIntrinsic, + head: ReactDOM$HTMLElementJSXIntrinsic<>, + header: ReactDOM$HTMLElementJSXIntrinsic<>, + hgroup: ReactDOM$HTMLElementJSXIntrinsic<>, + hr: ReactDOM$HTMLElementJSXIntrinsic>, + html: ReactDOM$HTMLElementJSXIntrinsic<>, + i: ReactDOM$HTMLElementJSXIntrinsic<>, + iframe: ReactDOM$HTMLElementJSXIntrinsic, + img: ReactDOM$HTMLElementJSXIntrinsic>, + ins: ReactDOM$HTMLElementJSXIntrinsic<>, + kbd: ReactDOM$HTMLElementJSXIntrinsic<>, + keygen: ReactDOM$HTMLElementJSXIntrinsic>, + label: ReactDOM$HTMLElementJSXIntrinsic, + legend: ReactDOM$HTMLElementJSXIntrinsic, + li: ReactDOM$HTMLElementJSXIntrinsic, + link: ReactDOM$HTMLElementJSXIntrinsic>, + main: ReactDOM$HTMLElementJSXIntrinsic<>, + map: ReactDOM$HTMLElementJSXIntrinsic<>, + mark: ReactDOM$HTMLElementJSXIntrinsic<>, + menu: ReactDOM$HTMLElementJSXIntrinsic<>, + menuitem: ReactDOM$HTMLElementJSXIntrinsic>, + meta: ReactDOM$HTMLElementJSXIntrinsic>, + meter: ReactDOM$HTMLElementJSXIntrinsic<>, + nav: ReactDOM$HTMLElementJSXIntrinsic<>, + noscript: ReactDOM$HTMLElementJSXIntrinsic<>, + object: ReactDOM$HTMLElementJSXIntrinsic<>, + ol: ReactDOM$HTMLElementJSXIntrinsic, + optgroup: ReactDOM$HTMLElementJSXIntrinsic, + option: ReactDOM$HTMLElementJSXIntrinsic, + output: ReactDOM$HTMLElementJSXIntrinsic<>, + p: ReactDOM$HTMLElementJSXIntrinsic, + param: ReactDOM$HTMLElementJSXIntrinsic>, + picture: ReactDOM$HTMLElementJSXIntrinsic<>, + pre: ReactDOM$HTMLElementJSXIntrinsic, + progress: ReactDOM$HTMLElementJSXIntrinsic<>, + q: ReactDOM$HTMLElementJSXIntrinsic<>, + rp: ReactDOM$HTMLElementJSXIntrinsic<>, + rt: ReactDOM$HTMLElementJSXIntrinsic<>, + ruby: ReactDOM$HTMLElementJSXIntrinsic<>, + s: ReactDOM$HTMLElementJSXIntrinsic<>, + samp: ReactDOM$HTMLElementJSXIntrinsic<>, + script: ReactDOM$HTMLElementJSXIntrinsic, + section: ReactDOM$HTMLElementJSXIntrinsic<>, + small: ReactDOM$HTMLElementJSXIntrinsic<>, + source: ReactDOM$HTMLElementJSXIntrinsic>, + span: ReactDOM$HTMLElementJSXIntrinsic, + strong: ReactDOM$HTMLElementJSXIntrinsic<>, + style: ReactDOM$HTMLElementJSXIntrinsic, + sub: ReactDOM$HTMLElementJSXIntrinsic<>, + summary: ReactDOM$HTMLElementJSXIntrinsic<>, + sup: ReactDOM$HTMLElementJSXIntrinsic<>, + table: ReactDOM$HTMLElementJSXIntrinsic, + tbody: ReactDOM$HTMLElementJSXIntrinsic, + td: ReactDOM$HTMLElementJSXIntrinsic, + tfoot: ReactDOM$HTMLElementJSXIntrinsic, + th: ReactDOM$HTMLElementJSXIntrinsic, + thead: ReactDOM$HTMLElementJSXIntrinsic, + time: ReactDOM$HTMLElementJSXIntrinsic<>, + title: ReactDOM$HTMLElementJSXIntrinsic<>, + tr: ReactDOM$HTMLElementJSXIntrinsic, + track: ReactDOM$HTMLElementJSXIntrinsic>, + u: ReactDOM$HTMLElementJSXIntrinsic<>, + ul: ReactDOM$HTMLElementJSXIntrinsic, + 'var': ReactDOM$HTMLElementJSXIntrinsic<>, + video: ReactDOM$HTMLElementJSXIntrinsic, + wbr: ReactDOM$HTMLElementJSXIntrinsic>, // SVG svg: ReactDOM$SVGElementJSXIntrinsic, animate: ReactDOM$SVGElementJSXIntrinsic, @@ -405,19 +405,279 @@ declare type $JSXIntrinsics = { tspan: ReactDOM$SVGElementJSXIntrinsic, use: ReactDOM$SVGElementJSXIntrinsic, // Elements React adds extra props for. - input: {instance: HTMLInputElement, props: {children?: React$Node, [key: string]: any}}, - textarea: {instance: HTMLTextAreaElement, props: {children?: React$Node, [key: string]: any}}, - select: {instance: HTMLSelectElement, props: {children?: React$Node, [key: string]: any}}, + input: ReactDOM$HTMLElementJSXIntrinsic>, + textarea: ReactDOM$HTMLElementJSXIntrinsic, + select: ReactDOM$HTMLElementJSXIntrinsic, // Catch-all for custom elements. - [string]: ReactDOM$HTMLElementJSXIntrinsic, + [string]: ReactDOM$HTMLElementJSXIntrinsic<>, }; -type ReactDOM$HTMLElementJSXIntrinsic = { - instance: HTMLElement, - props: {children?: React$Node, [key: string]: any}, +type ReactDOM$GlobalEventHandlers = { + onAbort?: (SyntheticEvent) => void, + onAbortCapture?: (SyntheticEvent) => void, + onAnimationEnd?: (SyntheticAnimationEvent) => void, + onAnimationEndCapture?: (SyntheticAnimationEvent) => void, + onAnimationIteration?: (SyntheticAnimationEvent) => void, + onAnimationIterationCapture?: (SyntheticAnimationEvent) => void, + onAnimationStart?: (SyntheticAnimationEvent) => void, + onAnimationStartCapture?: (SyntheticAnimationEvent) => void, + onAuxClick?: (SyntheticMouseEvent) => void, + onAuxClickCapture?: (SyntheticMouseEvent) => void, + onBeforeInput?: (SyntheticInputEvent) => void, + onBeforeInputCapture?: (SyntheticInputEvent) => void, + onBlur?: (SyntheticFocusEvent) => void, + onBlurCapture?: (SyntheticFocusEvent) => void, + onCancel?: (SyntheticEvent) => void, + onCancelCapture?: (SyntheticEvent) => void, + onCanPlay?: (SyntheticEvent) => void, + onCanPlayCapture?: (SyntheticEvent) => void, + onCanPlayThrough?: (SyntheticEvent) => void, + onCanPlayThroughCapture?: (SyntheticEvent) => void, + onChange?: (SyntheticEvent) => void, + onChangeCapture?: (SyntheticEvent) => void, + onClick?: (SyntheticMouseEvent) => void, + onClickCapture?: (SyntheticMouseEvent) => void, + onClose?: (SyntheticEvent) => void, + onCloseCapture?: (SyntheticEvent) => void, + onCompositionEnd?: (SyntheticCompositionEvent) => void, + onCompositionEndCapture?: (SyntheticCompositionEvent) => void, + onCompositionStart?: (SyntheticCompositionEvent) => void, + onCompositionStartCapture?: (SyntheticCompositionEvent) => void, + onCompositionUpdate?: (SyntheticCompositionEvent) => void, + onCompositionUpdateCapture?: (SyntheticCompositionEvent) => void, + onContextMenu?: (SyntheticMouseEvent) => void, + onContextMenuCapture?: (SyntheticMouseEvent) => void, + onCopy?: (SyntheticEvent) => void, + onCopyCapture?: (SyntheticEvent) => void, + onCut?: (SyntheticEvent) => void, + onCutCapture?: (SyntheticEvent) => void, + onDoubleClick?: (SyntheticMouseEvent) => void, + onDoubleClickCapture?: (SyntheticMouseEvent) => void, + onDrag?: (SyntheticDragEvent) => void, + onDragCapture?: (SyntheticDragEvent) => void, + onDragEnd?: (SyntheticDragEvent) => void, + onDragEndCapture?: (SyntheticDragEvent) => void, + onDragEnter?: (SyntheticDragEvent) => void, + onDragEnterCapture?: (SyntheticDragEvent) => void, + onDragExit?: (SyntheticDragEvent) => void, + onDragExitCapture?: (SyntheticDragEvent) => void, + onDragLeave?: (SyntheticDragEvent) => void, + onDragLeaveCapture?: (SyntheticDragEvent) => void, + onDragOver?: (SyntheticDragEvent) => void, + onDragOverCapture?: (SyntheticDragEvent) => void, + onDragStart?: (SyntheticDragEvent) => void, + onDragStartCapture?: (SyntheticDragEvent) => void, + onDrop?: (SyntheticDragEvent) => void, + onDropCapture?: (SyntheticDragEvent) => void, + onDurationChange?: (SyntheticEvent) => void, + onDurationChangeCapture?: (SyntheticEvent) => void, + onEmptied?: (SyntheticEvent) => void, + onEmptiedCapture?: (SyntheticEvent) => void, + onEncrypted?: (SyntheticEvent) => void, + onEncryptedCapture?: (SyntheticEvent) => void, + onEnded?: (SyntheticEvent) => void, + onEndedCapture?: (SyntheticEvent) => void, + onError?: (SyntheticEvent) => void, + onErrorCapture?: (SyntheticEvent) => void, + onFocus?: (SyntheticFocusEvent) => void, + onFocusCapture?: (SyntheticFocusEvent) => void, + onGotPointerCapture?: (SyntheticPointerEvent) => void, + onGotPointerCaptureCapture?: (SyntheticPointerEvent) => void, + onInput?: (SyntheticEvent) => void, + onInputCapture?: (SyntheticEvent) => void, + onInvalid?: (SyntheticEvent) => void, + onInvalidCapture?: (SyntheticEvent) => void, + onKeyDown?: (SyntheticKeyboardEvent) => void, + onKeyDownCapture?: (SyntheticKeyboardEvent) => void, + onKeyPress?: (SyntheticKeyboardEvent) => void, + onKeyPressCapture?: (SyntheticKeyboardEvent) => void, + onKeyUp?: (SyntheticKeyboardEvent) => void, + onKeyUpCapture?: (SyntheticKeyboardEvent) => void, + onLoad?: (SyntheticEvent) => void, + onLoadCapture?: (SyntheticEvent) => void, + onLoadedData?: (SyntheticEvent) => void, + onLoadedDataCapture?: (SyntheticEvent) => void, + onLoadedMetadata?: (SyntheticEvent) => void, + onLoadedMetadataCapture?: (SyntheticEvent) => void, + onLoadStart?: (SyntheticEvent) => void, + onLoadStartCapture?: (SyntheticEvent) => void, + onLostPointerCapture?: (SyntheticPointerEvent) => void, + onLostPointerCaptureCapture?: (SyntheticPointerEvent) => void, + onMouseDown?: (SyntheticMouseEvent) => void, + onMouseDownCapture?: (SyntheticMouseEvent) => void, + onMouseEnter?: (SyntheticMouseEvent) => void, + onMouseLeave?: (SyntheticMouseEvent) => void, + onMouseMove?: (SyntheticMouseEvent) => void, + onMouseMoveCapture?: (SyntheticMouseEvent) => void, + onMouseOut?: (SyntheticMouseEvent) => void, + onMouseOutCapture?: (SyntheticMouseEvent) => void, + onMouseOver?: (SyntheticMouseEvent) => void, + onMouseOverCapture?: (SyntheticMouseEvent) => void, + onMouseUp?: (SyntheticMouseEvent) => void, + onMouseUpCapture?: (SyntheticMouseEvent) => void, + onPaste?: (SyntheticEvent) => void, + onPasteCapture?: (SyntheticEvent) => void, + onPause?: (SyntheticEvent) => void, + onPauseCapture?: (SyntheticEvent) => void, + onPlay?: (SyntheticEvent) => void, + onPlayCapture?: (SyntheticEvent) => void, + onPlaying?: (SyntheticEvent) => void, + onPlayingCapture?: (SyntheticEvent) => void, + onPointerCancel?: (SyntheticPointerEvent) => void, + onPointerCancelCapture?: (SyntheticPointerEvent) => void, + onPointerDown?: (SyntheticPointerEvent) => void, + onPointerDownCapture?: (SyntheticPointerEvent) => void, + onPointerEnter?: (SyntheticPointerEvent) => void, + onPointerLeave?: (SyntheticPointerEvent) => void, + onPointerMove?: (SyntheticPointerEvent) => void, + onPointerMoveCapture?: (SyntheticPointerEvent) => void, + onPointerOut?: (SyntheticPointerEvent) => void, + onPointerOutCapture?: (SyntheticPointerEvent) => void, + onPointerOver?: (SyntheticPointerEvent) => void, + onPointerOverCapture?: (SyntheticPointerEvent) => void, + onPointerUp?: (SyntheticPointerEvent) => void, + onPointerUpCapture?: (SyntheticPointerEvent) => void, + onProgress?: (SyntheticEvent) => void, + onProgressCapture?: (SyntheticEvent) => void, + onRateChange?: (SyntheticEvent) => void, + onRateChangeCapture?: (SyntheticEvent) => void, + onReset?: (SyntheticEvent) => void, + onResetCapture?: (SyntheticEvent) => void, + onScroll?: (SyntheticUIEvent) => void, + onScrollCapture?: (SyntheticUIEvent) => void, + onSeeked?: (SyntheticEvent) => void, + onSeekedCapture?: (SyntheticEvent) => void, + onSeeking?: (SyntheticEvent) => void, + onSeekingCapture?: (SyntheticEvent) => void, + onSelect?: (SyntheticEvent) => void, + onSelectCapture?: (SyntheticEvent) => void, + onStalled?: (SyntheticEvent) => void, + onStalledCapture?: (SyntheticEvent) => void, + onSubmit?: (SyntheticEvent) => void, + onSubmitCapture?: (SyntheticEvent) => void, + onSuspend?: (SyntheticEvent) => void, + onSuspendCapture?: (SyntheticEvent) => void, + onTimeUpdate?: (SyntheticEvent) => void, + onTimeUpdateCapture?: (SyntheticEvent) => void, + onToggle?: (SyntheticEvent) => void, + onToggleCapture?: (SyntheticEvent) => void, + onTouchCancel?: (SyntheticTouchEvent) => void, + onTouchCancelCapture?: (SyntheticTouchEvent) => void, + onTouchEnd?: (SyntheticTouchEvent) => void, + onTouchEndCapture?: (SyntheticTouchEvent) => void, + onTouchMove?: (SyntheticEvent) => void, + onTouchMoveCapture?: (SyntheticEvent) => void, + onTouchStart?: (SyntheticTouchEvent) => void, + onTouchStartCapture?: (SyntheticTouchEvent) => void, + onTouchTap?: (SyntheticUIEvent) => void, + onTouchTapCapture?: (SyntheticUIEvent) => void, + onTransitionEnd?: (SyntheticTransitionEvent) => void, + onTransitionEndCapture?: (SyntheticTransitionEvent) => void, + onVolumeChange?: (SyntheticEvent) => void, + onVolumeChangeCapture?: (SyntheticEvent) => void, + onWaiting?: (SyntheticEvent) => void, + onWaitingCapture?: (SyntheticEvent) => void, + onWheel?: (SyntheticWheelEvent) => void, + onWheelCapture?: (SyntheticWheelEvent) => void, +}; + +type ReactDOM$ElementProps = { + children?: React$Node, + className?: ?string, + dangerouslySetInnerHTML?: { __html: string }, + id?: string, + lang?: string, + style?: ReactDOM$Style, + suppressHydrationWarning?: boolean, + tabIndex?: ReactDOM$Number, + + // NOTE: There is no way we can enumerate all acceptable/standard props of DOM + // intrinsics. If we ever got a Flow feature allowing regexes for keys, we + // could express open-ended namespaces like data-* attributes, custom + // attributes etc more precisely, and then maybe think about making this + // definition complete/exact (thus detecting more classes of errors). + // + // For now the typing philosophy here is: be reasonably strict with the types + // of known attributes, but lenient otherwise. + + [key: string]: any +}; + +type ReactDOM$HTMLElementProps = ReactDOM$ElementProps & { + accessKey?: string, + autoCapitalize?: $TODO$CaseInsensitive<"off" | "none" | "on" | "sentences" | "words" | "characters">, + contentEditable?: ReactDOM$BooleanishString, + contextMenu?: string, + dir?: $TODO$CaseInsensitive<"ltr" | "rtl" | "LTR" | "RTL" | "auto">, + draggable?: ReactDOM$BooleanishString, + hidden?: ReactDOM$Boolean<"hidden">, + is?: string, + itemProp?: string, + itemRef?: string, + itemScope?: ReactDOM$Boolean<"itemScope" | "itemscope">, + itemType?: string, + slot?: string, + spellCheck?: ReactDOM$BooleanishString, + suppressContentEditableWarning?: boolean, + title?: string, + translate?: $TODO$CaseInsensitive<"yes" | "no"> +}; + +type ReactDOM$SVGElementProps = ReactDOM$ElementProps & { + xlinkActuate?: string, + xlinkArcrole?: string, + xlinkHref?: string, + xlinkRole?: string, + xlinkShow?: string, + xlinkTitle?: string, + xlinkType?: string, + xmlBase?: string, + xmlLang?: string, + xmlSpace?: string + + // TODO: SVG presentation props + // TODO: SVG filters props + // TODO: SVG animation props + // TODO: SVG event props +}; + +type ReactDOM$BooleanishString = + | $TODO$CaseInsensitive<"true" | "false"> + | boolean; + +type ReactDOM$Boolean = + | $TODO$CaseInsensitive + | boolean; + +type ReactDOM$HTMLElementJSXIntrinsic = { + instance: Instance, + props: Props & ReactDOM$GlobalEventHandlers, }; type ReactDOM$SVGElementJSXIntrinsic = { instance: Element, - props: {children?: React$Node, [key: string]: any}, + props: ReactDOM$SVGElementProps, +}; + +// TODO: Can we get an actual Flow $CaseInsensitive builtin for singleton +// strings and enums? +type $TODO$CaseInsensitive = Value; + +type ReactDOM$Style = Object; // TODO + +type ReactDOM$Number = number | string; + +// Changes children and dangerouslySetInnerHTML in a given props type to be +// optional (if they're not already) and limits them to empty values. +// This helps model the React dev mode warning emitted when setting either of +// these props on an empty HTML element. +type ReactDOM$VoidElementProps = $Diff< + Props, + { + children: any, + dangerouslySetInnerHTML: any + } +> & { + children?: ?void, // Empty elements cannot have children + dangerouslySetInnerHTML?: ?void // innerHTML cannot be set on empty elements }; diff --git a/tests/jsx_intrinsics.builtin/strings.js b/tests/jsx_intrinsics.builtin/strings.js index f63649cec5f..2f74b2dff6b 100644 --- a/tests/jsx_intrinsics.builtin/strings.js +++ b/tests/jsx_intrinsics.builtin/strings.js @@ -15,4 +15,4 @@ var Str: string = 'str'; React.createElement('div', {}); // This is fine React.createElement('bad', {}); // This is fine -
; // This is fine +
; // This is fine diff --git a/tests/react_16_3/react_16_3.exp b/tests/react_16_3/react_16_3.exp index ccaaafcfb9b..9a391c1cd65 100644 --- a/tests/react_16_3/react_16_3.exp +++ b/tests/react_16_3/react_16_3.exp @@ -41,9 +41,9 @@ References: forwardRef.js:19:32 19| const badRef = React.createRef(); ^^^^^^^^^^^^^^ [1] - /react-dom.js:290:22 - 290| button: {instance: HTMLButtonElement, props: {children?: React$Node, [key: string]: any}}, - ^^^^^^^^^^^^^^^^^ [2] + /react-dom.js:290:44 + 290| button: ReactDOM$HTMLElementJSXIntrinsic, + ^^^^^^^^^^^^^^^^^ [2] /react.js:240:6 240| ): {|current: null | T|}; ^^^^^^^^^^^^^^^^^^^^^ [3] @@ -72,9 +72,9 @@ References: forwardRef.js:23:50 23| const _g = x} />; // Incorrect ref type ^^^^^^^^^^^^^^ [3] - /react-dom.js:290:22 - 290| button: {instance: HTMLButtonElement, props: {children?: React$Node, [key: string]: any}}, - ^^^^^^^^^^^^^^^^^ [4] + /react-dom.js:290:44 + 290| button: ReactDOM$HTMLElementJSXIntrinsic, + ^^^^^^^^^^^^^^^^^ [4] Error ---------------------------------------------------------------------------------------------- forwardRef.js:42:12 diff --git a/tests/react_dom/.flowconfig b/tests/react_dom/.flowconfig new file mode 100644 index 00000000000..de38d19537d --- /dev/null +++ b/tests/react_dom/.flowconfig @@ -0,0 +1,2 @@ +[options] +no_flowlib=false diff --git a/tests/react_dom/dangerouslySetInnerHTML.js b/tests/react_dom/dangerouslySetInnerHTML.js new file mode 100644 index 00000000000..196a4baae2a --- /dev/null +++ b/tests/react_dom/dangerouslySetInnerHTML.js @@ -0,0 +1,8 @@ +// @flow + +import React from "react"; + +
; // Error: Expected object +
; // Error: Expected object +
Hello" }} />; // OK +
Hello" }} />; // Error: Missing __html diff --git a/tests/react_dom/events.js b/tests/react_dom/events.js new file mode 100644 index 00000000000..8aba0f68bf1 --- /dev/null +++ b/tests/react_dom/events.js @@ -0,0 +1,19 @@ +// @flow + +import React from "react"; + +