From a9f75faae0c3b344a59988c20adb878712dafce1 Mon Sep 17 00:00:00 2001 From: Freddy Harris Date: Fri, 18 Sep 2026 12:05:21 +0200 Subject: [PATCH] Refactor DOM and event types to use more specific types from the WebAPI. Updated external bindings in ReactDOM, ReactEvent, and RescriptReactRouter to replace Dom.element with Element.t and similar changes for event-related types. This improves type safety and aligns with the latest API standards. --- package-lock.json | 179 ++++++++++----------------------- package.json | 6 +- rescript.json | 5 +- src/ReactDOM.res | 17 ++-- src/ReactDOM.res.js | 2 +- src/ReactEvent.res | 38 +++---- src/ReactEvent.resi | 118 +++++++++++----------- src/ReactTestUtils.res | 40 ++++---- src/ReactTestUtils.res.js | 8 +- src/ReactTestUtils.resi | 44 ++++---- src/RescriptReactRouter.res | 43 ++++---- src/RescriptReactRouter.res.js | 19 ++-- 12 files changed, 235 insertions(+), 284 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c33cde..f8b45fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "@rescript/react", "version": "0.16.0-beta.1", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,21 +9,23 @@ "version": "0.16.0-beta.1", "license": "MIT", "devDependencies": { + "@rescript/webapi": "0.1.0-alpha-b1d58f9", "pkg-pr-new": "^0.0.75", "react": "^19.2.0", "react-dom": "^19.2.0", - "rescript": "^13.0.0-alpha.5" + "rescript": "^13.0.0-alpha.6" }, "peerDependencies": { - "@rescript/runtime": ">=13.0.0-alpha.5", + "@rescript/runtime": ">=13.0.0-alpha.6", + "@rescript/webapi": ">=0.1.0-alpha-b1d58f9", "react": ">=19.2.0", "react-dom": ">=19.2.0" } }, "node_modules/@rescript/darwin-arm64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-13.0.0-alpha.5.tgz", - "integrity": "sha512-OCpT4VYLkxTjm56y+CG4SfrqotMLCaqKY5pxGq75hOPRZLZ5n5BG3OvA1rBsmz5+gT7VpKm1Do9YhmO0JvYZfg==", + "version": "13.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-13.0.0-alpha.6.tgz", + "integrity": "sha512-wb08dh/miY3OGUTCJL/0m8Q9xgDkd5Klh+vi7dAVl1y94g/JgVzxsU6ElB6Bb3baQeXcZW5A8tu5QnAZwwdxdw==", "cpu": [ "arm64" ], @@ -38,9 +40,9 @@ } }, "node_modules/@rescript/darwin-x64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-13.0.0-alpha.5.tgz", - "integrity": "sha512-UT143XnOVmUUayrD/1ceKrXb8rbhNmXKhhfnTnRGRLWp1Hxyiq5uq3OGNorSIW6jHsszsP0VvjKA+Z31h04E6Q==", + "version": "13.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-13.0.0-alpha.6.tgz", + "integrity": "sha512-N0QJzzhvBC25zt8FVSRQYSVsM6Pv8OATVANbSZUZBX/wv5HCISgUWTaZ1q0RLHpEvRymalT+kXEZGG6fUvcDCg==", "cpu": [ "x64" ], @@ -55,9 +57,9 @@ } }, "node_modules/@rescript/linux-arm64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-13.0.0-alpha.5.tgz", - "integrity": "sha512-lQ3trljExrH1uqS3hsjjoi6fnaImG/tYppcF2X4Yk8u0AP1t6AC6LUM0KR2kjctG5b7OVUrujOu91NnjovN46A==", + "version": "13.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-13.0.0-alpha.6.tgz", + "integrity": "sha512-/HEgh1Ocsyy//VsQ3e+f0qNIi/9JGqcFCM95bh/Ee0m/8RbswmUtfFjvcs/WLrhSPW9BndkLWBGMRwIYpBkRgQ==", "cpu": [ "arm64" ], @@ -72,9 +74,9 @@ } }, "node_modules/@rescript/linux-x64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-13.0.0-alpha.5.tgz", - "integrity": "sha512-Cu73xGa2nMcSgW274tAJDexlBqJGFKpv/v9wHAxqFxXzIwSkET51N9xkf42GljejeVzwyDEfgQId2Znme/PWkg==", + "version": "13.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-13.0.0-alpha.6.tgz", + "integrity": "sha512-kQlCnbUPwyxrC3KGLIR7ASdDKVkDd4hNBD+eD3t/yIIfR6lCs00EeVWbbfHMbs/Rg7TmQvGKkZTgAEQ6IoIhoQ==", "cpu": [ "x64" ], @@ -89,15 +91,26 @@ } }, "node_modules/@rescript/runtime": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-13.0.0-alpha.5.tgz", - "integrity": "sha512-k0iQhrDasCD5K5orSrps21ZVgvMgOIwh03QjUAxtMkVwyPclg6LbgG5eAAgduyecXXm3ii30o3nDaXvCryu/Tw==", + "version": "13.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-13.0.0-alpha.6.tgz", + "integrity": "sha512-PtIAApHWITR8nX//wh7eMQIdQbyl/Ynhr+oMcyUtQN98mXnU/F5UpGDGAK6QXanDpdVSW6korsqHyDcMtIscEg==", + "dev": true, "license": "MIT" }, + "node_modules/@rescript/webapi": { + "version": "0.1.0-alpha-b1d58f9", + "resolved": "https://registry.npmjs.org/@rescript/webapi/-/webapi-0.1.0-alpha-b1d58f9.tgz", + "integrity": "sha512-vqV41M1H08/k7eX4Mihm0MWHPnQXMRMKEvq37C4jbTsUXkBysaS7uAUDNB1l3/Ga7H7JCKQsoLt3BH5bgJM2IA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "rescript": ">=13" + } + }, "node_modules/@rescript/win32-x64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-13.0.0-alpha.5.tgz", - "integrity": "sha512-7uUkUY0pXDdPB5znHQYWsGml3E2pQ68KSaM7HZoFfnOEIuPqGz/hssgLgsXHkfHxrHB0waX9fsqx2Qckn6IGsw==", + "version": "13.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-13.0.0-alpha.6.tgz", + "integrity": "sha512-JGHbh8xuRtOPJeE86vzDLqSnL471CeAV3uWacEBCi6K7ZNHZlihCQhEUqWf7ir9gf46xcpnS//8A5L1Baa6Q3w==", "cpu": [ "x64" ], @@ -122,9 +135,9 @@ } }, "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", "dev": true, "license": "MIT", "engines": { @@ -132,22 +145,22 @@ } }, "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", "dev": true, "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "scheduler": "^0.28.0" }, "peerDependencies": { - "react": "^19.2.4" + "react": "^19.3.0" } }, "node_modules/rescript": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-13.0.0-alpha.5.tgz", - "integrity": "sha512-rv/xA1OQLN5l90/szD82IR8p/bNzwKNPLnEVaR89oiuBZYG7IhHfRxEKAvpOHqlrpnV8zKmc16IXcjCQxlni/w==", + "version": "13.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-13.0.0-alpha.6.tgz", + "integrity": "sha512-8bnerL6UZ11xrbt8VSa2FuFYOW1pyEIx3CGYgVz2tXsG+cVlMPjHaalquLJdZCTdz7ypJJclxAFFuGfH7B+nKg==", "dev": true, "license": "(LGPL-3.0-or-later AND MIT)", "workspaces": [ @@ -157,6 +170,7 @@ "tests/dependencies/**", "tests/analysis_tests/**", "tests/docstring_tests", + "tests/belt_tests", "tests/gentype_tests/**", "tests/tests", "tests/tools_tests", @@ -164,7 +178,7 @@ "scripts/res" ], "dependencies": { - "@rescript/runtime": "13.0.0-alpha.5" + "@rescript/runtime": "13.0.0-alpha.6" }, "bin": { "bsc": "cli/bsc.js", @@ -175,102 +189,19 @@ "node": ">=22" }, "optionalDependencies": { - "@rescript/darwin-arm64": "13.0.0-alpha.5", - "@rescript/darwin-x64": "13.0.0-alpha.5", - "@rescript/linux-arm64": "13.0.0-alpha.5", - "@rescript/linux-x64": "13.0.0-alpha.5", - "@rescript/win32-x64": "13.0.0-alpha.5" + "@rescript/darwin-arm64": "13.0.0-alpha.6", + "@rescript/darwin-x64": "13.0.0-alpha.6", + "@rescript/linux-arm64": "13.0.0-alpha.6", + "@rescript/linux-x64": "13.0.0-alpha.6", + "@rescript/win32-x64": "13.0.0-alpha.6" } }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", "dev": true, "license": "MIT" } - }, - "dependencies": { - "@rescript/darwin-arm64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-13.0.0-alpha.5.tgz", - "integrity": "sha512-OCpT4VYLkxTjm56y+CG4SfrqotMLCaqKY5pxGq75hOPRZLZ5n5BG3OvA1rBsmz5+gT7VpKm1Do9YhmO0JvYZfg==", - "dev": true, - "optional": true - }, - "@rescript/darwin-x64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-13.0.0-alpha.5.tgz", - "integrity": "sha512-UT143XnOVmUUayrD/1ceKrXb8rbhNmXKhhfnTnRGRLWp1Hxyiq5uq3OGNorSIW6jHsszsP0VvjKA+Z31h04E6Q==", - "dev": true, - "optional": true - }, - "@rescript/linux-arm64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-13.0.0-alpha.5.tgz", - "integrity": "sha512-lQ3trljExrH1uqS3hsjjoi6fnaImG/tYppcF2X4Yk8u0AP1t6AC6LUM0KR2kjctG5b7OVUrujOu91NnjovN46A==", - "dev": true, - "optional": true - }, - "@rescript/linux-x64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-13.0.0-alpha.5.tgz", - "integrity": "sha512-Cu73xGa2nMcSgW274tAJDexlBqJGFKpv/v9wHAxqFxXzIwSkET51N9xkf42GljejeVzwyDEfgQId2Znme/PWkg==", - "dev": true, - "optional": true - }, - "@rescript/runtime": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-13.0.0-alpha.5.tgz", - "integrity": "sha512-k0iQhrDasCD5K5orSrps21ZVgvMgOIwh03QjUAxtMkVwyPclg6LbgG5eAAgduyecXXm3ii30o3nDaXvCryu/Tw==" - }, - "@rescript/win32-x64": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-13.0.0-alpha.5.tgz", - "integrity": "sha512-7uUkUY0pXDdPB5znHQYWsGml3E2pQ68KSaM7HZoFfnOEIuPqGz/hssgLgsXHkfHxrHB0waX9fsqx2Qckn6IGsw==", - "dev": true, - "optional": true - }, - "pkg-pr-new": { - "version": "0.0.75", - "resolved": "https://registry.npmjs.org/pkg-pr-new/-/pkg-pr-new-0.0.75.tgz", - "integrity": "sha512-u9mdErTewKSMsr+ceCt8VcNuNP0ro5AXiPXhUVApuEyqr2Zlvt+DdCFBcm+yGWN8mhOdZJ27meIDbnoZgfzpOw==", - "dev": true - }, - "react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", - "dev": true - }, - "react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", - "dev": true, - "requires": { - "scheduler": "^0.27.0" - } - }, - "rescript": { - "version": "13.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-13.0.0-alpha.5.tgz", - "integrity": "sha512-rv/xA1OQLN5l90/szD82IR8p/bNzwKNPLnEVaR89oiuBZYG7IhHfRxEKAvpOHqlrpnV8zKmc16IXcjCQxlni/w==", - "dev": true, - "requires": { - "@rescript/darwin-arm64": "13.0.0-alpha.5", - "@rescript/darwin-x64": "13.0.0-alpha.5", - "@rescript/linux-arm64": "13.0.0-alpha.5", - "@rescript/linux-x64": "13.0.0-alpha.5", - "@rescript/runtime": "13.0.0-alpha.5", - "@rescript/win32-x64": "13.0.0-alpha.5" - } - }, - "scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true - } } } diff --git a/package.json b/package.json index c957e3b..d60fb42 100644 --- a/package.json +++ b/package.json @@ -29,13 +29,15 @@ }, "homepage": "https://rescript-lang.org/docs/react/latest/introduction", "devDependencies": { + "@rescript/webapi": "0.1.0-alpha-b1d58f9", "pkg-pr-new": "^0.0.75", "react": "^19.2.0", "react-dom": "^19.2.0", - "rescript": "^13.0.0-alpha.5" + "rescript": "^13.0.0-alpha.6" }, "peerDependencies": { - "@rescript/runtime": ">=13.0.0-alpha.5", + "@rescript/webapi": ">=0.1.0-alpha-b1d58f9", + "@rescript/runtime": ">=13.0.0-alpha.6", "react": ">=19.2.0", "react-dom": ">=19.2.0" } diff --git a/rescript.json b/rescript.json index a0897f3..7209d75 100644 --- a/rescript.json +++ b/rescript.json @@ -14,5 +14,8 @@ "in-source": true } ], - "suffix": ".res.js" + "suffix": ".res.js", + "dependencies": [ + "@rescript/webapi" + ] } \ No newline at end of file diff --git a/src/ReactDOM.res b/src/ReactDOM.res index 64670af..2c6ccfc 100644 --- a/src/ReactDOM.res +++ b/src/ReactDOM.res @@ -6,8 +6,11 @@ calls and add the appropriate `require("react-dom")` in the file calling this `render` */ // Helper so that ReactDOM itself doesn't bring any runtime + +open WebAPI + @val @return(nullable) -external querySelector: string => option = "document.querySelector" +external querySelector: string => option = "document.querySelector" module Client = { module Root = { @@ -19,10 +22,10 @@ module Client = { } @module("react-dom/client") - external createRoot: Dom.element => Root.t = "createRoot" + external createRoot: Element.t => Root.t = "createRoot" @module("react-dom/client") - external hydrateRoot: (Dom.element, React.element) => Root.t = "hydrateRoot" + external hydrateRoot: (Element.t, React.element) => Root.t = "hydrateRoot" } // Very rudimentary form data bindings @@ -72,9 +75,9 @@ module FormData = { } @module("react-dom") -external createPortal: (React.element, Dom.element) => React.element = "createPortal" +external createPortal: (React.element, Element.t) => React.element = "createPortal" -external domElementToObj: Dom.element => {..} = "%identity" +external domElementToObj: Element.t => {..} = "%identity" type style = ReactDOMStyle.t @@ -82,8 +85,8 @@ type domRef = JsxDOM.domRef module Ref = { type t = domRef - type currentDomRef = React.ref> - type callbackDomRef = nullable => option unit> + type currentDomRef = React.ref> + type callbackDomRef = nullable => option unit> external domRef: currentDomRef => domRef = "%identity" external callbackDomRef: callbackDomRef => domRef = "%identity" diff --git a/src/ReactDOM.res.js b/src/ReactDOM.res.js index 766ec05..3e42e50 100644 --- a/src/ReactDOM.res.js +++ b/src/ReactDOM.res.js @@ -1,6 +1,6 @@ // Generated by ReScript, PLEASE EDIT WITH CARE -import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js"; +import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.mjs"; let Root = {}; diff --git a/src/ReactEvent.res b/src/ReactEvent.res index 54ac591..03e690d 100644 --- a/src/ReactEvent.res +++ b/src/ReactEvent.res @@ -5,40 +5,43 @@ module MakeEventWithType = ( type t }, ) => { + open WebAPI + @get external bubbles: Type.t => bool = "bubbles" @get external cancelable: Type.t => bool = "cancelable" @get - external currentTarget: Type.t => {..} = "currentTarget" /* Should return Dom.eventTarget */ + external currentTarget: Type.t => Node.t = "currentTarget" @get external defaultPrevented: Type.t => bool = "defaultPrevented" @get external eventPhase: Type.t => int = "eventPhase" @get external isTrusted: Type.t => bool = "isTrusted" - @get external nativeEvent: Type.t => {..} = "nativeEvent" /* Should return Dom.event */ + @get external nativeEvent: Type.t => DOM.event = "nativeEvent" @send external preventDefault: Type.t => unit = "preventDefault" @send external isDefaultPrevented: Type.t => bool = "isDefaultPrevented" @send external stopPropagation: Type.t => unit = "stopPropagation" @send external isPropagationStopped: Type.t => bool = "isPropagationStopped" - @get external target: Type.t => {..} = "target" /* Should return Dom.eventTarget */ + @get external target: Type.t => Node.t = "target" @get external timeStamp: Type.t => float = "timeStamp" @get external type_: Type.t => string = "type" @send external persist: Type.t => unit = "persist" } +open WebAPI + module Synthetic = { type tag = JsxEvent.Synthetic.tag type t = synthetic @get external bubbles: synthetic<'a> => bool = "bubbles" @get external cancelable: synthetic<'a> => bool = "cancelable" @get - external currentTarget: synthetic<'a> => {..} = - "currentTarget" /* Should return Dom.eventTarget */ + external currentTarget: synthetic<'a> => Node.t = "currentTarget" @get external defaultPrevented: synthetic<'a> => bool = "defaultPrevented" @get external eventPhase: synthetic<'a> => int = "eventPhase" @get external isTrusted: synthetic<'a> => bool = "isTrusted" @get - external nativeEvent: synthetic<'a> => {..} = "nativeEvent" /* Should return Dom.event */ + external nativeEvent: synthetic<'a> => DOM.event = "nativeEvent" @send external preventDefault: synthetic<'a> => unit = "preventDefault" @send @@ -47,7 +50,7 @@ module Synthetic = { external stopPropagation: synthetic<'a> => unit = "stopPropagation" @send external isPropagationStopped: synthetic<'a> => bool = "isPropagationStopped" - @get external target: synthetic<'a> => {..} = "target" /* Should return Dom.eventTarget */ + @get external target: synthetic<'a> => Node.t = "target" @get external timeStamp: synthetic<'a> => float = "timeStamp" @get external type_: synthetic<'a> => string = "type" @send external persist: synthetic<'a> => unit = "persist" @@ -59,8 +62,9 @@ external toSyntheticEvent: synthetic<'a> => Synthetic.t = "%identity" module Clipboard = { type tag = JsxEvent.Clipboard.tag type t = synthetic + include MakeEventWithType({type t = t}) - @get external clipboardData: t => {..} = "clipboardData" /* Should return Dom.dataTransfer */ + @get external clipboardData: t => UiEventsTypes.dataTransfer = "clipboardData" } module Composition = { @@ -95,7 +99,7 @@ module Focus = { type t = synthetic include MakeEventWithType({type t = t}) @get @return(nullable) - external relatedTarget: t => option<{..}> = "relatedTarget" /* Should return Dom.eventTarget */ + external relatedTarget: t => option = "relatedTarget" } module Form = { @@ -122,7 +126,7 @@ module Mouse = { @get external pageX: t => int = "pageX" @get external pageY: t => int = "pageY" @get @return(nullable) - external relatedTarget: t => option<{..}> = "relatedTarget" /* Should return Dom.eventTarget */ + external relatedTarget: t => option = "relatedTarget" @get external screenX: t => int = "screenX" @get external screenY: t => int = "screenY" @get external shiftKey: t => bool = "shiftKey" @@ -135,7 +139,7 @@ module Pointer = { // UIEvent @get external detail: t => int = "detail" - @get external view: t => Dom.window = "view" /* Should return DOMAbstractView/WindowProxy */ + @get external view: t => Window.t = "view" // MouseEvent @get external screenX: t => int = "screenX" @@ -158,10 +162,10 @@ module Pointer = { @get external buttons: t => int = "buttons" @get @return(nullable) - external relatedTarget: t => option<{..}> = "relatedTarget" /* Should return Dom.eventTarget */ + external relatedTarget: t => option = "relatedTarget" // PointerEvent - @get external pointerId: t => Dom.eventPointerId = "pointerId" + @get external pointerId: t => int = "pointerId" @get external width: t => float = "width" @get external height: t => float = "height" @get external pressure: t => float = "pressure" @@ -184,14 +188,14 @@ module Touch = { type t = synthetic include MakeEventWithType({type t = t}) @get external altKey: t => bool = "altKey" - @get external changedTouches: t => {..} = "changedTouches" /* Should return Dom.touchList */ + @get external changedTouches: t => UiEventsTypes.touchList = "changedTouches" @get external ctrlKey: t => bool = "ctrlKey" @send external getModifierState: (t, string) => bool = "getModifierState" @get external metaKey: t => bool = "metaKey" @get external shiftKey: t => bool = "shiftKey" - @get external targetTouches: t => {..} = "targetTouches" /* Should return Dom.touchList */ - @get external touches: t => {..} = "touches" /* Should return Dom.touchList */ + @get external targetTouches: t => UiEventsTypes.touchList = "targetTouches" + @get external touches: t => UiEventsTypes.touchList = "touches" } module UI = { @@ -199,7 +203,7 @@ module UI = { type t = synthetic include MakeEventWithType({type t = t}) @get external detail: t => int = "detail" - @get external view: t => Dom.window = "view" /* Should return DOMAbstractView/WindowProxy */ + @get external view: t => Window.t = "view" } module Wheel = { diff --git a/src/ReactEvent.resi b/src/ReactEvent.resi index 61b5d4b..52b704b 100644 --- a/src/ReactEvent.resi +++ b/src/ReactEvent.resi @@ -38,19 +38,21 @@ */ type synthetic<'a> = JsxEvent.synthetic<'a> +open WebAPI + module Synthetic: { type tag = JsxEvent.Synthetic.tag type t = synthetic @get external bubbles: synthetic<'a> => bool = "bubbles" @get external cancelable: synthetic<'a> => bool = "cancelable" @get - external currentTarget: synthetic<'a> => {..} = "currentTarget" + external currentTarget: synthetic<'a> => Node.t = "currentTarget" @get external defaultPrevented: synthetic<'a> => bool = "defaultPrevented" @get external eventPhase: synthetic<'a> => int = "eventPhase" @get external isTrusted: synthetic<'a> => bool = "isTrusted" @get - external nativeEvent: synthetic<'a> => {..} = "nativeEvent" + external nativeEvent: synthetic<'a> => DOM.event = "nativeEvent" @send external preventDefault: synthetic<'a> => unit = "preventDefault" @send @@ -59,7 +61,7 @@ module Synthetic: { external stopPropagation: synthetic<'a> => unit = "stopPropagation" @send external isPropagationStopped: synthetic<'a> => bool = "isPropagationStopped" - @get external target: synthetic<'a> => {..} = "target" + @get external target: synthetic<'a> => Node.t = "target" @get external timeStamp: synthetic<'a> => float = "timeStamp" @get external type_: synthetic<'a> => string = "type" @send external persist: synthetic<'a> => unit = "persist" @@ -73,20 +75,20 @@ module Clipboard: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" - @get external clipboardData: t => {..} = "clipboardData" /* Should return Dom.dataTransfer */ + @get external clipboardData: t => UiEventsTypes.dataTransfer = "clipboardData" } module Composition: { @@ -94,16 +96,16 @@ module Composition: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @@ -115,16 +117,16 @@ module Keyboard: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @@ -149,21 +151,21 @@ module Focus: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @get @return(nullable) - external relatedTarget: t => option<{..}> = "relatedTarget" /* Should return Dom.eventTarget */ + external relatedTarget: t => option = "relatedTarget" } module Form: { @@ -171,16 +173,16 @@ module Form: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @@ -191,16 +193,16 @@ module Mouse: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @@ -218,7 +220,7 @@ module Mouse: { @get external pageX: t => int = "pageX" @get external pageY: t => int = "pageY" @get @return(nullable) - external relatedTarget: t => option<{..}> = "relatedTarget" /* Should return Dom.eventTarget */ + external relatedTarget: t => option = "relatedTarget" @get external screenX: t => int = "screenX" @get external screenY: t => int = "screenY" @get external shiftKey: t => bool = "shiftKey" @@ -230,8 +232,8 @@ module Pointer: { // Event @get external type_: t => string = "type" - @get external target: t => {..} = "target" - @get external currentTarget: t => {..} = "currentTarget" + @get external target: t => Node.t = "target" + @get external currentTarget: t => Node.t = "currentTarget" @get external eventPhase: t => int = "eventPhase" @@ -245,14 +247,14 @@ module Pointer: { @get external timeStamp: t => float = "timeStamp" // SyntheticEvent - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external isPropagationStopped: t => bool = "isPropagationStopped" @send external persist: t => unit = "persist" // UIEvent @get external detail: t => int = "detail" - @get external view: t => Dom.window = "view" /* Should return DOMAbstractView/WindowProxy */ + @get external view: t => Window.t = "view" // MouseEvent @get external screenX: t => int = "screenX" @@ -275,10 +277,10 @@ module Pointer: { @get external buttons: t => int = "buttons" @get @return(nullable) - external relatedTarget: t => option<{..}> = "relatedTarget" /* Should return Dom.eventTarget */ + external relatedTarget: t => option = "relatedTarget" // PointerEvent - @get external pointerId: t => Dom.eventPointerId = "pointerId" + @get external pointerId: t => int = "pointerId" @get external width: t => float = "width" @get external height: t => float = "height" @get external pressure: t => float = "pressure" @@ -295,16 +297,16 @@ module Selection: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @@ -315,28 +317,28 @@ module Touch: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @get external altKey: t => bool = "altKey" - @get external changedTouches: t => {..} = "changedTouches" /* Should return Dom.touchList */ + @get external changedTouches: t => UiEventsTypes.touchList = "changedTouches" @get external ctrlKey: t => bool = "ctrlKey" @send external getModifierState: (t, string) => bool = "getModifierState" @get external metaKey: t => bool = "metaKey" @get external shiftKey: t => bool = "shiftKey" - @get external targetTouches: t => {..} = "targetTouches" /* Should return Dom.touchList */ - @get external touches: t => {..} = "touches" /* Should return Dom.touchList */ + @get external targetTouches: t => UiEventsTypes.touchList = "targetTouches" + @get external touches: t => UiEventsTypes.touchList = "touches" } module UI: { @@ -344,21 +346,21 @@ module UI: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @get external detail: t => int = "detail" - @get external view: t => Dom.window = "view" /* Should return DOMAbstractView/WindowProxy */ + @get external view: t => Window.t = "view" } module Wheel: { @@ -366,16 +368,16 @@ module Wheel: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @@ -390,16 +392,16 @@ module Media: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @@ -410,16 +412,16 @@ module Image: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @@ -430,16 +432,16 @@ module Animation: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" @@ -453,16 +455,16 @@ module Transition: { type t = synthetic @get external bubbles: t => bool = "bubbles" @get external cancelable: t => bool = "cancelable" - @get external currentTarget: t => {..} = "currentTarget" + @get external currentTarget: t => Node.t = "currentTarget" @get external defaultPrevented: t => bool = "defaultPrevented" @get external eventPhase: t => int = "eventPhase" @get external isTrusted: t => bool = "isTrusted" - @get external nativeEvent: t => {..} = "nativeEvent" + @get external nativeEvent: t => DOM.event = "nativeEvent" @send external preventDefault: t => unit = "preventDefault" @send external isDefaultPrevented: t => bool = "isDefaultPrevented" @send external stopPropagation: t => unit = "stopPropagation" @send external isPropagationStopped: t => bool = "isPropagationStopped" - @get external target: t => {..} = "target" + @get external target: t => Node.t = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" diff --git a/src/ReactTestUtils.res b/src/ReactTestUtils.res index 3b92614..139394e 100644 --- a/src/ReactTestUtils.res +++ b/src/ReactTestUtils.res @@ -39,15 +39,15 @@ external isCompositeComponentWithType: ('element, React.component<'props>) => bo module Simulate = { @module("react-dom/test-utils") @scope("Simulate") - external click: Dom.element => unit = "click" + external click: WebAPI.Element.t => unit = "click" @module("react-dom/test-utils") @scope("Simulate") - external clickWithEvent: (Dom.element, 'event) => unit = "click" + external clickWithEvent: (WebAPI.Element.t, 'event) => unit = "click" @module("react-dom/test-utils") @scope("Simulate") - external change: Dom.element => unit = "change" + external change: WebAPI.Element.t => unit = "change" @module("react-dom/test-utils") @scope("Simulate") - external blur: Dom.element => unit = "blur" + external blur: WebAPI.Element.t => unit = "blur" @module("react-dom/test-utils") @scope("Simulate") - external changeWithEvent: (Dom.element, 'event) => unit = "change" + external changeWithEvent: (WebAPI.Element.t, 'event) => unit = "change" let changeWithValue = (element, value) => { let event = { "target": { @@ -65,37 +65,37 @@ module Simulate = { changeWithEvent(element, event) } @module("react-dom/test-utils") @scope("Simulate") - external canPlay: Dom.element => unit = "canPlay" + external canPlay: WebAPI.Element.t => unit = "canPlay" @module("react-dom/test-utils") @scope("Simulate") - external timeUpdate: Dom.element => unit = "timeUpdate" + external timeUpdate: WebAPI.Element.t => unit = "timeUpdate" @module("react-dom/test-utils") @scope("Simulate") - external ended: Dom.element => unit = "ended" + external ended: WebAPI.Element.t => unit = "ended" @module("react-dom/test-utils") @scope("Simulate") - external focus: Dom.element => unit = "focus" + external focus: WebAPI.Element.t => unit = "focus" } -@val external document: Dom.document = "document" +@val external document: WebAPI.DOM.document = "document" @send -external querySelector: (Dom.element, string) => option = "querySelector" +external querySelector: (WebAPI.Element.t, string) => option = "querySelector" @send -external querySelectorAll: (Dom.element, string) => Array.arrayLike = +external querySelectorAll: (WebAPI.Element.t, string) => Array.arrayLike = "querySelectorAll" -@get external textContent: Dom.element => string = "textContent" -@get external body: Dom.document => option = "body" +@get external textContent: WebAPI.Element.t => string = "textContent" +@get external body: WebAPI.DOM.document => option = "body" @send -external createElement: (Dom.document, string) => Dom.element = "createElement" -@send external remove: Dom.element => unit = "remove" +external createElement: (WebAPI.DOM.document, string) => WebAPI.Element.t = "createElement" +@send external remove: WebAPI.Element.t => unit = "remove" @send -external appendChild: (Dom.element, Dom.element) => Dom.element = "appendChild" +external appendChild: (WebAPI.Element.t, WebAPI.Element.t) => WebAPI.Element.t = "appendChild" let querySelectorAll = (element, string) => Array.fromArrayLike(querySelectorAll(element, string)) module DOM = { @return(nullable) @get - external value: Dom.element => option = "value" + external value: WebAPI.Element.t => option = "value" let findBySelector = (element, selector) => querySelector(element, selector) @@ -110,7 +110,7 @@ module DOM = { ) } -let prepareContainer = (container: ref>, ()) => { +let prepareContainer = (container: ref>, ()) => { let containerElement = document->createElement("div") switch document->body { | Some(body) => body->appendChild(containerElement)->ignore @@ -119,7 +119,7 @@ let prepareContainer = (container: ref>, ()) => { container := Some(containerElement) } -let cleanupContainer = (container: ref>, ()) => { +let cleanupContainer = (container: ref>, ()) => { switch container.contents { | Some(contents) => remove(contents) | None => () diff --git a/src/ReactTestUtils.res.js b/src/ReactTestUtils.res.js index 2166cce..e454f86 100644 --- a/src/ReactTestUtils.res.js +++ b/src/ReactTestUtils.res.js @@ -1,6 +1,6 @@ // Generated by ReScript, PLEASE EDIT WITH CARE -import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js"; +import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.mjs"; import * as TestUtils from "react-dom/test-utils"; function act(func) { @@ -64,15 +64,15 @@ function prepareContainer(container, param) { let containerElement = document.createElement("div"); let body = document.body; if (body !== undefined) { - Primitive_option.valFromOption(body).appendChild(containerElement); + body.appendChild(containerElement); } - container.contents = Primitive_option.some(containerElement); + container.contents = containerElement; } function cleanupContainer(container, param) { let contents = container.contents; if (contents !== undefined) { - Primitive_option.valFromOption(contents).remove(); + contents.remove(); } container.contents = undefined; } diff --git a/src/ReactTestUtils.resi b/src/ReactTestUtils.resi index f87e6d1..5327c26 100644 --- a/src/ReactTestUtils.resi +++ b/src/ReactTestUtils.resi @@ -20,37 +20,41 @@ external isCompositeComponentWithType: ('element, React.component<'props>) => bo module Simulate: { @module("react-dom/test-utils") @scope("Simulate") - external click: Dom.element => unit = "click" + external click: WebAPI.Element.t => unit = "click" @module("react-dom/test-utils") @scope("Simulate") - external clickWithEvent: (Dom.element, 'event) => unit = "click" + external clickWithEvent: (WebAPI.Element.t, 'event) => unit = "click" @module("react-dom/test-utils") @scope("Simulate") - external change: Dom.element => unit = "change" + external change: WebAPI.Element.t => unit = "change" @module("react-dom/test-utils") @scope("Simulate") - external blur: Dom.element => unit = "blur" + external blur: WebAPI.Element.t => unit = "blur" @module("react-dom/test-utils") @scope("Simulate") - external changeWithEvent: (Dom.element, 'event) => unit = "change" - let changeWithValue: (Dom.element, string) => unit - let changeWithChecked: (Dom.element, bool) => unit + external changeWithEvent: (WebAPI.Element.t, 'event) => unit = "change" + let changeWithValue: (WebAPI.Element.t, string) => unit + let changeWithChecked: (WebAPI.Element.t, bool) => unit @module("react-dom/test-utils") @scope("Simulate") - external canPlay: Dom.element => unit = "canPlay" + external canPlay: WebAPI.Element.t => unit = "canPlay" @module("react-dom/test-utils") @scope("Simulate") - external timeUpdate: Dom.element => unit = "timeUpdate" + external timeUpdate: WebAPI.Element.t => unit = "timeUpdate" @module("react-dom/test-utils") @scope("Simulate") - external ended: Dom.element => unit = "ended" + external ended: WebAPI.Element.t => unit = "ended" @module("react-dom/test-utils") @scope("Simulate") - external focus: Dom.element => unit = "focus" + external focus: WebAPI.Element.t => unit = "focus" } module DOM: { @return(nullable) @get - external value: Dom.element => option = "value" - - let findBySelector: (Dom.element, string) => option - let findByAllSelector: (Dom.element, string) => array - let findBySelectorAndTextContent: (Dom.element, string, string) => option - let findBySelectorAndPartialTextContent: (Dom.element, string, string) => option + external value: WebAPI.Element.t => option = "value" + + let findBySelector: (WebAPI.Element.t, string) => option + let findByAllSelector: (WebAPI.Element.t, string) => array + let findBySelectorAndTextContent: (WebAPI.Element.t, string, string) => option + let findBySelectorAndPartialTextContent: ( + WebAPI.Element.t, + string, + string, + ) => option } -let prepareContainer: (ref>, unit) => unit -let cleanupContainer: (ref>, unit) => unit -let getContainer: ref> => Dom.element +let prepareContainer: (ref>, unit) => unit +let cleanupContainer: (ref>, unit) => unit +let getContainer: ref> => WebAPI.Element.t diff --git a/src/RescriptReactRouter.res b/src/RescriptReactRouter.res index 7471541..dacfed8 100644 --- a/src/RescriptReactRouter.res +++ b/src/RescriptReactRouter.res @@ -1,32 +1,35 @@ +open WebAPI + @scope("globalThis") -external window: option = "window" +external window: option = "window" @scope("globalThis") -external history: option = "history" +external history: option = "history" -@get external location: Dom.window => Dom.location = "location" +@get external location: Window.t => Location.t = "location" -/* actually the cb is Dom.event => unit, but let's restrict the access for now */ +/* actually the cb is DOM.event => unit, but let's restrict the access for now */ @send -external addEventListener: (Dom.window, string, unit => unit) => unit = "addEventListener" +external addEventListener: (Window.t, string, unit => unit) => unit = "addEventListener" @send -external removeEventListener: (Dom.window, string, unit => unit) => unit = "removeEventListener" +external removeEventListener: (Window.t, string, unit => unit) => unit = "removeEventListener" @send -external dispatchEvent: (Dom.window, Dom.event) => unit = "dispatchEvent" +external dispatchEvent: (Window.t, DOM.event) => unit = "dispatchEvent" -@get external pathname: Dom.location => string = "pathname" +@get external pathname: Location.t => string = "pathname" -@get external hash: Dom.location => string = "hash" +@get external hash: Location.t => string = "hash" -@get external search: Dom.location => string = "search" +@get external search: Location.t => string = "search" @send -external pushState: (Dom.history, @as(json`null`) _, @as("") _, ~href: string) => unit = "pushState" +external pushState: (HistoryTypes.history, @as(json`null`) _, @as("") _, ~href: string) => unit = + "pushState" @send -external replaceState: (Dom.history, @as(json`null`) _, @as("") _, ~href: string) => unit = +external replaceState: (HistoryTypes.history, @as(json`null`) _, @as("") _, ~href: string) => unit = "replaceState" type makeEventOptions = { @@ -34,7 +37,7 @@ type makeEventOptions = { cancelable?: bool, composed?: bool, } -@new external makeEvent: (string, ~options: makeEventOptions=?) => Dom.event = "Event" +@new external makeEvent: (string, ~options: makeEventOptions=?) => DOM.event = "Event" /* This is copied from array.ml. We want to cut dependencies for rescript-react so that it's friendlier to use in size-constrained codebases */ @@ -78,12 +81,12 @@ let path = (~serverUrlString=?, ()) => switch (serverUrlString, window) { | (None, None) => list{} | (Some(serverUrlString), _) => pathParse(serverUrlString) - | (_, Some(window: Dom.window)) => pathParse(window->location->pathname) + | (_, Some(window: Window.t)) => pathParse(window->location->pathname) } let hash = () => switch window { | None => "" - | Some(window: Dom.window) => + | Some(window: Window.t) => switch window->location->hash { | "" | "#" => "" @@ -108,14 +111,14 @@ let search = (~serverUrlString=?, ()) => switch (serverUrlString, window) { | (None, None) => "" | (Some(serverUrlString), _) => searchParse(serverUrlString) - | (_, Some(window: Dom.window)) => searchParse(window->location->search) + | (_, Some(window: Window.t)) => searchParse(window->location->search) } let push = path => switch (history, window) { | (None, _) | (_, None) => () - | (Some(history: Dom.history), Some(window: Dom.window)) => + | (Some(history: HistoryTypes.history), Some(window: Window.t)) => pushState(history, ~href=path) dispatchEvent(window, makeEvent("popstate", ~options={bubbles: true, cancelable: true})) } @@ -124,7 +127,7 @@ let replace = path => switch (history, window) { | (None, _) | (_, None) => () - | (Some(history: Dom.history), Some(window: Dom.window)) => + | (Some(history: HistoryTypes.history), Some(window: Window.t)) => replaceState(history, ~href=path) dispatchEvent(window, makeEvent("popstate", ~options={bubbles: true, cancelable: true})) } @@ -165,7 +168,7 @@ let dangerouslyGetInitialUrl = url let watchUrl = callback => switch window { | None => () => () - | Some(window: Dom.window) => + | Some(window: Window.t) => let watcherID = () => callback(url()) addEventListener(window, "popstate", watcherID) watcherID @@ -174,7 +177,7 @@ let watchUrl = callback => let unwatchUrl = watcherID => switch window { | None => () - | Some(window: Dom.window) => removeEventListener(window, "popstate", watcherID) + | Some(window: Window.t) => removeEventListener(window, "popstate", watcherID) } let useUrl = (~serverUrl=?, ()) => { diff --git a/src/RescriptReactRouter.res.js b/src/RescriptReactRouter.res.js index 0a17734..9c2e768 100644 --- a/src/RescriptReactRouter.res.js +++ b/src/RescriptReactRouter.res.js @@ -1,7 +1,6 @@ // Generated by ReScript, PLEASE EDIT WITH CARE import * as React from "react"; -import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js"; function pathParse(str) { switch (str) { @@ -38,7 +37,7 @@ function path(serverUrlString, param) { if (serverUrlString !== undefined) { return pathParse(serverUrlString); } else if (match !== undefined) { - return pathParse(Primitive_option.valFromOption(match).location.pathname); + return pathParse(match.location.pathname); } else { return /* [] */0; } @@ -49,7 +48,7 @@ function hash() { if (window === undefined) { return ""; } - let raw = Primitive_option.valFromOption(window).location.hash; + let raw = window.location.hash; switch (raw) { case "" : case "#" : @@ -79,7 +78,7 @@ function search(serverUrlString, param) { if (serverUrlString !== undefined) { return searchParse(serverUrlString); } else if (match !== undefined) { - return searchParse(Primitive_option.valFromOption(match).location.search); + return searchParse(match.location.search); } else { return ""; } @@ -89,8 +88,8 @@ function push(path) { let match = globalThis.history; let match$1 = globalThis.window; if (match !== undefined && match$1 !== undefined) { - Primitive_option.valFromOption(match).pushState(null, "", path); - Primitive_option.valFromOption(match$1).dispatchEvent(new Event("popstate", { + match.pushState(null, "", path); + match$1.dispatchEvent(new Event("popstate", { bubbles: true, cancelable: true })); @@ -102,8 +101,8 @@ function replace(path) { let match = globalThis.history; let match$1 = globalThis.window; if (match !== undefined && match$1 !== undefined) { - Primitive_option.valFromOption(match).replaceState(null, "", path); - Primitive_option.valFromOption(match$1).dispatchEvent(new Event("popstate", { + match.replaceState(null, "", path); + match$1.dispatchEvent(new Event("popstate", { bubbles: true, cancelable: true })); @@ -150,14 +149,14 @@ function watchUrl(callback) { return () => {}; } let watcherID = () => callback(url(undefined, undefined)); - Primitive_option.valFromOption(window).addEventListener("popstate", watcherID); + window.addEventListener("popstate", watcherID); return watcherID; } function unwatchUrl(watcherID) { let window = globalThis.window; if (window !== undefined) { - Primitive_option.valFromOption(window).removeEventListener("popstate", watcherID); + window.removeEventListener("popstate", watcherID); return; } }