From 44e0f440eb9c1d98d0fedb4fd19ebf6973841090 Mon Sep 17 00:00:00 2001 From: nojaf Date: Fri, 6 Dec 2024 09:08:26 +0100 Subject: [PATCH 1/4] Update to ReScript 12 --- package-lock.json | 99 +++-------------- package.json | 3 + rescript.json | 7 +- src/React.bs.js | 32 ++++++ src/ReactDOM.bs.js | 57 ++++++++++ src/ReactEvent.bs.js | 54 +++++++++ src/ReactTestUtils.bs.js | 100 +++++++++++++++++ src/RescriptReactRouter.bs.js | 199 ++++++++++++++++++++++++++++++++++ 8 files changed, 464 insertions(+), 87 deletions(-) create mode 100644 src/React.bs.js create mode 100644 src/ReactDOM.bs.js create mode 100644 src/ReactEvent.bs.js create mode 100644 src/ReactTestUtils.bs.js create mode 100644 src/RescriptReactRouter.bs.js diff --git a/package-lock.json b/package-lock.json index be0cbd5..55ba7d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,16 @@ { "name": "@rescript/react", "version": "0.15.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rescript/react", "version": "0.15.0", "license": "MIT", + "dependencies": { + "@rescript/webapi": "^0.1.0-experimental-2090589" + }, "devDependencies": { "react": "^19.2.0", "react-dom": "^19.2.0", @@ -26,7 +29,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "(LGPL-3.0-or-later AND MIT)", "optional": true, "os": [ @@ -43,7 +45,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "(LGPL-3.0-or-later AND MIT)", "optional": true, "os": [ @@ -60,7 +61,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "(LGPL-3.0-or-later AND MIT)", "optional": true, "os": [ @@ -77,7 +77,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "(LGPL-3.0-or-later AND MIT)", "optional": true, "os": [ @@ -94,6 +93,15 @@ "license": "MIT", "peer": true }, + "node_modules/@rescript/webapi": { + "version": "0.1.0-experimental-29b94b3", + "resolved": "https://registry.npmjs.org/@rescript/webapi/-/webapi-0.1.0-experimental-29b94b3.tgz", + "integrity": "sha512-bm91qEV//VFCtK4R6hqndbGk+Ht/La1Cpw/VmaiKfUiTRmQmHP28SaorUjWEl9D/AP9JziWQGcAJegLlAPfT2Q==", + "license": "MIT", + "dependencies": { + "rescript": "^12.0.0-alpha.4" + } + }, "node_modules/@rescript/win32-x64": { "version": "12.2.0", "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-12.2.0.tgz", @@ -101,7 +109,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "(LGPL-3.0-or-later AND MIT)", "optional": true, "os": [ @@ -139,7 +146,6 @@ "version": "12.2.0", "resolved": "https://registry.npmjs.org/rescript/-/rescript-12.2.0.tgz", "integrity": "sha512-1Jf2cmNhyx5Mj2vwZ4XXPcXvNSjGj9D1jPBUcoqIOqRpLPo1ch2Ta/7eWh23xAHWHK5ow7BCDyYFjvZSjyjLzg==", - "dev": true, "license": "(LGPL-3.0-or-later AND MIT)", "workspaces": [ "packages/playground", @@ -180,84 +186,5 @@ "dev": true, "license": "MIT" } - }, - "dependencies": { - "@rescript/darwin-arm64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-12.2.0.tgz", - "integrity": "sha512-xc3K/J7Ujl1vPiFY2009mRf3kWRlUe/VZyJWprseKxlcEtUQv89ter7r6pY+YFbtYvA/fcaEncL9CVGEdattAg==", - "dev": true, - "optional": true - }, - "@rescript/darwin-x64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-12.2.0.tgz", - "integrity": "sha512-qqcTvnlSeoKkywLjG7cXfYvKZ1e4Gz2kUKcD6SiqDgCqm8TF+spwlFAiM6sloRUOFsc0bpC/0R0B3yr01FCB1A==", - "dev": true, - "optional": true - }, - "@rescript/linux-arm64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-12.2.0.tgz", - "integrity": "sha512-ODmpG3ji+Nj/8d5yvXkeHlfKkmbw1Q4t1iIjVuNwtmFpz7TiEa7n/sQqoYdE+WzbDX3DoJfmJNbp3Ob7qCUoOg==", - "dev": true, - "optional": true - }, - "@rescript/linux-x64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-12.2.0.tgz", - "integrity": "sha512-2W9Y9/g19Y4F/subl8yV3T8QBG2oRaP+HciNRcBjptyEdw9LmCKH8+rhWO6sp3E+nZLwoE2IAkwH0WKV3wqlxQ==", - "dev": true, - "optional": true - }, - "@rescript/runtime": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-12.2.0.tgz", - "integrity": "sha512-NwfljDRq1rjFPHUaca1nzFz13xsa9ZGkBkLvMhvVgavJT5+A4rMcLu8XAaVTi/oAhO/tlHf9ZDoOTF1AfyAk9Q==", - "peer": true - }, - "@rescript/win32-x64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-12.2.0.tgz", - "integrity": "sha512-fhf8CBj3p1lkIXPeNko3mVTKQfXXm4BoxJtR1xAXxUn43wDpd8Lox4w8/EPBbbW6C/YFQW6H7rtpY+2AKuNaDA==", - "dev": true, - "optional": true - }, - "react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", - "dev": true, - "peer": 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": "12.2.0", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-12.2.0.tgz", - "integrity": "sha512-1Jf2cmNhyx5Mj2vwZ4XXPcXvNSjGj9D1jPBUcoqIOqRpLPo1ch2Ta/7eWh23xAHWHK5ow7BCDyYFjvZSjyjLzg==", - "dev": true, - "requires": { - "@rescript/darwin-arm64": "12.2.0", - "@rescript/darwin-x64": "12.2.0", - "@rescript/linux-arm64": "12.2.0", - "@rescript/linux-x64": "12.2.0", - "@rescript/runtime": "12.2.0", - "@rescript/win32-x64": "12.2.0" - } - }, - "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 3762776..10f5d6e 100644 --- a/package.json +++ b/package.json @@ -37,5 +37,8 @@ "@rescript/runtime": ">=12.0.0", "react": ">=19.2.0", "react-dom": ">=19.2.0" + }, + "dependencies": { + "@rescript/webapi": "^0.1.0-experimental-2090589" } } \ No newline at end of file diff --git a/rescript.json b/rescript.json index a0897f3..0f19abe 100644 --- a/rescript.json +++ b/rescript.json @@ -14,5 +14,10 @@ "in-source": true } ], - "suffix": ".res.js" + "suffix": ".res.js", + "dependencies": [ + "@rescript/webapi" + ], + "dev-dependencies": [], + "compiler-flags": [] } \ No newline at end of file diff --git a/src/React.bs.js b/src/React.bs.js new file mode 100644 index 0000000..1d52802 --- /dev/null +++ b/src/React.bs.js @@ -0,0 +1,32 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as React from "react"; + +let Children = {}; + +let Context = {}; + +let Fragment = {}; + +let StrictMode = {}; + +let Suspense = {}; + +function lazy_(load) { + return React.lazy(async () => ({ + default: await load() + })); +} + +let Uncurried = {}; + +export { + Children, + Context, + Fragment, + StrictMode, + Suspense, + lazy_, + Uncurried, +} +/* react Not a pure module */ diff --git a/src/ReactDOM.bs.js b/src/ReactDOM.bs.js new file mode 100644 index 0000000..766ec05 --- /dev/null +++ b/src/ReactDOM.bs.js @@ -0,0 +1,57 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js"; + +let Root = {}; + +let Client = { + Root: Root +}; + +function getString(formData, name) { + let value = formData.get(name); + if (!(value == null) && typeof value === "string") { + return Primitive_option.some(value); + } +} + +function getFile(formData, name) { + let value = formData.get(name); + if (!(value == null) && typeof value !== "string") { + return Primitive_option.some(value); + } +} + +function getAll(t, string) { + return t.getAll(string).map(value => { + if (typeof value === "string") { + return { + TAG: "String", + _0: value + }; + } else { + return { + TAG: "File", + _0: value + }; + } + }); +} + +let FormData = { + getString: getString, + getFile: getFile, + getAll: getAll +}; + +let Ref = {}; + +let Style; + +export { + Client, + FormData, + Ref, + Style, +} +/* No side effect */ diff --git a/src/ReactEvent.bs.js b/src/ReactEvent.bs.js new file mode 100644 index 0000000..5303ddd --- /dev/null +++ b/src/ReactEvent.bs.js @@ -0,0 +1,54 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + + +let Synthetic = {}; + +let Clipboard = {}; + +let Composition = {}; + +let Keyboard = {}; + +let Focus = {}; + +let Form = {}; + +let Mouse = {}; + +let Pointer = {}; + +let Selection = {}; + +let Touch = {}; + +let UI = {}; + +let Wheel = {}; + +let Media = {}; + +let Image = {}; + +let Animation = {}; + +let Transition = {}; + +export { + Synthetic, + Clipboard, + Composition, + Keyboard, + Focus, + Form, + Mouse, + Pointer, + Selection, + Touch, + UI, + Wheel, + Media, + Image, + Animation, + Transition, +} +/* No side effect */ diff --git a/src/ReactTestUtils.bs.js b/src/ReactTestUtils.bs.js new file mode 100644 index 0000000..2166cce --- /dev/null +++ b/src/ReactTestUtils.bs.js @@ -0,0 +1,100 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js"; +import * as TestUtils from "react-dom/test-utils"; + +function act(func) { + let reactFunc = () => { + func(); + }; + TestUtils.act(reactFunc); +} + +function actAsync(func) { + return TestUtils.act(() => func()); +} + +function changeWithValue(element, value) { + let event = { + target: { + value: value + } + }; + TestUtils.Simulate.change(element, event); +} + +function changeWithChecked(element, value) { + let event = { + target: { + checked: value + } + }; + TestUtils.Simulate.change(element, event); +} + +let Simulate = { + changeWithValue: changeWithValue, + changeWithChecked: changeWithChecked +}; + +function findBySelector(element, selector) { + return element.querySelector(selector); +} + +function findByAllSelector(element, selector) { + return Array.from(element.querySelectorAll(selector)); +} + +function findBySelectorAndTextContent(element, selector, content) { + return Array.from(element.querySelectorAll(selector)).find(node => node.textContent === content); +} + +function findBySelectorAndPartialTextContent(element, selector, content) { + return Array.from(element.querySelectorAll(selector)).find(node => node.textContent.includes(content)); +} + +let DOM = { + findBySelector: findBySelector, + findByAllSelector: findByAllSelector, + findBySelectorAndTextContent: findBySelectorAndTextContent, + findBySelectorAndPartialTextContent: findBySelectorAndPartialTextContent +}; + +function prepareContainer(container, param) { + let containerElement = document.createElement("div"); + let body = document.body; + if (body !== undefined) { + Primitive_option.valFromOption(body).appendChild(containerElement); + } + container.contents = Primitive_option.some(containerElement); +} + +function cleanupContainer(container, param) { + let contents = container.contents; + if (contents !== undefined) { + Primitive_option.valFromOption(contents).remove(); + } + container.contents = undefined; +} + +function getContainer(container) { + let contents = container.contents; + if (contents !== undefined) { + return Primitive_option.valFromOption(contents); + } + throw { + RE_EXN_ID: "Not_found", + Error: new Error() + }; +} + +export { + act, + actAsync, + Simulate, + DOM, + prepareContainer, + cleanupContainer, + getContainer, +} +/* react-dom/test-utils Not a pure module */ diff --git a/src/RescriptReactRouter.bs.js b/src/RescriptReactRouter.bs.js new file mode 100644 index 0000000..3bee765 --- /dev/null +++ b/src/RescriptReactRouter.bs.js @@ -0,0 +1,199 @@ +// 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 safeMakeEvent(eventName) { + if (typeof Event === "function") { + return new Event(eventName); + } + let event = document.createEvent("Event"); + event.initEvent(eventName, true, true); + return event; +} + +function pathParse(str) { + switch (str) { + case "" : + case "/" : + return /* [] */0; + default: + let raw = str.slice(1); + let match = raw[raw.length - 1 | 0]; + let raw$1 = match === "/" ? raw.slice(0, -1) : raw; + let match$1 = raw$1.split("?", 2); + let raw$2 = match$1.length !== 2 ? raw$1 : match$1[0]; + let a = raw$2.split("/").filter(item => item.length !== 0); + let _i = a.length - 1 | 0; + let _res = /* [] */0; + while (true) { + let res = _res; + let i = _i; + if (i < 0) { + return res; + } + _res = { + hd: a[i], + tl: res + }; + _i = i - 1 | 0; + continue; + }; + } +} + +function path(serverUrlString, param) { + let match = globalThis.window; + if (serverUrlString !== undefined) { + return pathParse(serverUrlString); + } else if (match !== undefined) { + return pathParse(Primitive_option.valFromOption(match).location.pathname); + } else { + return /* [] */0; + } +} + +function hash() { + let window = globalThis.window; + if (window === undefined) { + return ""; + } + let raw = Primitive_option.valFromOption(window).location.hash; + switch (raw) { + case "" : + case "#" : + return ""; + default: + return raw.slice(1); + } +} + +function searchParse(str) { + switch (str) { + case "" : + case "?" : + return ""; + default: + let match = str.split("?", 2); + if (match.length !== 2) { + return ""; + } else { + return match[1]; + } + } +} + +function search(serverUrlString, param) { + let match = globalThis.window; + if (serverUrlString !== undefined) { + return searchParse(serverUrlString); + } else if (match !== undefined) { + return searchParse(Primitive_option.valFromOption(match).location.search); + } else { + return ""; + } +} + +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(safeMakeEvent("popstate")); + return; + } +} + +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(safeMakeEvent("popstate")); + return; + } +} + +function urlNotEqual(a, b) { + if (a.hash !== b.hash || a.search !== b.search) { + return true; + } else { + let _aList = a.path; + let _bList = b.path; + while (true) { + let bList = _bList; + let aList = _aList; + if (aList === 0) { + return bList !== 0; + } + if (bList === 0) { + return true; + } + if (aList.hd !== bList.hd) { + return true; + } + _bList = bList.tl; + _aList = aList.tl; + continue; + }; + } +} + +function url(serverUrlString, param) { + return { + path: path(serverUrlString, undefined), + hash: hash(), + search: search(serverUrlString, undefined) + }; +} + +function watchUrl(callback) { + let window = globalThis.window; + if (window === undefined) { + return () => {}; + } + let watcherID = () => callback(url(undefined, undefined)); + Primitive_option.valFromOption(window).addEventListener("popstate", watcherID); + return watcherID; +} + +function unwatchUrl(watcherID) { + let window = globalThis.window; + if (window !== undefined) { + Primitive_option.valFromOption(window).removeEventListener("popstate", watcherID); + return; + } +} + +function useUrl(serverUrl, param) { + let match = React.useState(() => { + if (serverUrl !== undefined) { + return serverUrl; + } else { + return url(undefined, undefined); + } + }); + let setUrl = match[1]; + let url$1 = match[0]; + React.useEffect(() => { + let watcherId = watchUrl(url => setUrl(param => url)); + let newUrl = url(undefined, undefined); + if (urlNotEqual(newUrl, url$1)) { + setUrl(param => newUrl); + } + return () => unwatchUrl(watcherId); + }, []); + return url$1; +} + +let dangerouslyGetInitialUrl = url; + +export { + push, + replace, + watchUrl, + unwatchUrl, + dangerouslyGetInitialUrl, + useUrl, +} +/* react Not a pure module */ From 11a1a5c14b90529de68ee359b8398330fac72a2d Mon Sep 17 00:00:00 2001 From: nojaf Date: Fri, 6 Dec 2024 10:17:52 +0100 Subject: [PATCH 2/4] Use WebAPI types in events --- src/ReactDOM.res | 17 ++++--- src/ReactEvent.res | 36 ++++++++------ src/ReactEvent.resi | 116 ++++++++++++++++++++++---------------------- 3 files changed, 89 insertions(+), 80 deletions(-) diff --git a/src/ReactDOM.res b/src/ReactDOM.res index 7e094ef..324bffe 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: DOMAPI.element => Root.t = "createRoot" @module("react-dom/client") - external hydrateRoot: (Dom.element, React.element) => Root.t = "hydrateRoot" + external hydrateRoot: (DOMAPI.element, 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, DOMAPI.element) => React.element = "createPortal" -external domElementToObj: Dom.element => {..} = "%identity" +external domElementToObj: DOMAPI.element => {..} = "%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/ReactEvent.res b/src/ReactEvent.res index 54ac591..1eba918 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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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> => DOMAPI.node = "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> => EventAPI.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> => DOMAPI.node = "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 => WebAPI.UIEventsAPI.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 => DOMAPI.window = "view" // MouseEvent @get external screenX: t => int = "screenX" @@ -158,7 +162,7 @@ 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" @@ -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 => UIEventsAPI.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 => UIEventsAPI.touchList = "targetTouches" + @get external touches: t => UIEventsAPI.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 => DOMAPI.window = "view" } module Wheel = { diff --git a/src/ReactEvent.resi b/src/ReactEvent.resi index 61b5d4b..eb9132c 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> => DOMAPI.node = "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> => EventAPI.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> => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => WebAPI.UIEventsAPI.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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "target" + @get external currentTarget: t => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.window = "view" // MouseEvent @get external screenX: t => int = "screenX" @@ -275,7 +277,7 @@ 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" @@ -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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => UIEventsAPI.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 => UIEventsAPI.touchList = "targetTouches" + @get external touches: t => UIEventsAPI.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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.window = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "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 => DOMAPI.node = "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 => EventAPI.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 => DOMAPI.node = "target" @get external timeStamp: t => float = "timeStamp" @get external type_: t => string = "type" @send external persist: t => unit = "persist" From 9945b34d5ed29cc1014e84f867cd32eee68b4044 Mon Sep 17 00:00:00 2001 From: Freddy Harris Date: Fri, 17 Apr 2026 16:14:01 +0200 Subject: [PATCH 3/4] fix webapi experimental version --- package-lock.json | 27 ++++++++++++++------------- package.json | 2 +- rescript.json | 3 ++- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 55ba7d5..5774e56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.15.0", "license": "MIT", "dependencies": { - "@rescript/webapi": "^0.1.0-experimental-2090589" + "@rescript/webapi": "0.1.0-experimental-61b1074" }, "devDependencies": { "react": "^19.2.0", @@ -94,12 +94,12 @@ "peer": true }, "node_modules/@rescript/webapi": { - "version": "0.1.0-experimental-29b94b3", - "resolved": "https://registry.npmjs.org/@rescript/webapi/-/webapi-0.1.0-experimental-29b94b3.tgz", - "integrity": "sha512-bm91qEV//VFCtK4R6hqndbGk+Ht/La1Cpw/VmaiKfUiTRmQmHP28SaorUjWEl9D/AP9JziWQGcAJegLlAPfT2Q==", + "version": "0.1.0-experimental-61b1074", + "resolved": "https://registry.npmjs.org/@rescript/webapi/-/webapi-0.1.0-experimental-61b1074.tgz", + "integrity": "sha512-m9dg8Hsly/h/pngaqZYSgr3FSR2F2gyKCvPH5y3Xt1Fnd6BYKSxwhdAQWDy93xMHGt/RSjRXS7az9ltLDoYtwA==", "license": "MIT", - "dependencies": { - "rescript": "^12.0.0-alpha.4" + "peerDependencies": { + "rescript": ">=12.0.0 <13" } }, "node_modules/@rescript/win32-x64": { @@ -119,9 +119,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.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", "dev": true, "license": "MIT", "peer": true, @@ -130,16 +130,16 @@ } }, "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.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", "dev": true, "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.4" + "react": "^19.2.5" } }, "node_modules/rescript": { @@ -147,6 +147,7 @@ "resolved": "https://registry.npmjs.org/rescript/-/rescript-12.2.0.tgz", "integrity": "sha512-1Jf2cmNhyx5Mj2vwZ4XXPcXvNSjGj9D1jPBUcoqIOqRpLPo1ch2Ta/7eWh23xAHWHK5ow7BCDyYFjvZSjyjLzg==", "license": "(LGPL-3.0-or-later AND MIT)", + "peer": true, "workspaces": [ "packages/playground", "packages/@rescript/*", diff --git a/package.json b/package.json index 10f5d6e..919e153 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,6 @@ "react-dom": ">=19.2.0" }, "dependencies": { - "@rescript/webapi": "^0.1.0-experimental-2090589" + "@rescript/webapi": "0.1.0-experimental-61b1074" } } \ No newline at end of file diff --git a/rescript.json b/rescript.json index 0f19abe..a180113 100644 --- a/rescript.json +++ b/rescript.json @@ -5,7 +5,8 @@ }, "sources": [ { - "dir": "src" + "dir": "src", + "subdirs": true } ], "package-specs": [ From c4a828457cbf202345fca79a160960f47b66577d Mon Sep 17 00:00:00 2001 From: Freddy Harris Date: Fri, 17 Apr 2026 16:30:24 +0200 Subject: [PATCH 4/4] delete bs files --- src/React.bs.js | 32 ------ src/ReactDOM.bs.js | 57 ---------- src/ReactEvent.bs.js | 54 --------- src/ReactTestUtils.bs.js | 100 ----------------- src/RescriptReactRouter.bs.js | 199 ---------------------------------- 5 files changed, 442 deletions(-) delete mode 100644 src/React.bs.js delete mode 100644 src/ReactDOM.bs.js delete mode 100644 src/ReactEvent.bs.js delete mode 100644 src/ReactTestUtils.bs.js delete mode 100644 src/RescriptReactRouter.bs.js diff --git a/src/React.bs.js b/src/React.bs.js deleted file mode 100644 index 1d52802..0000000 --- a/src/React.bs.js +++ /dev/null @@ -1,32 +0,0 @@ -// Generated by ReScript, PLEASE EDIT WITH CARE - -import * as React from "react"; - -let Children = {}; - -let Context = {}; - -let Fragment = {}; - -let StrictMode = {}; - -let Suspense = {}; - -function lazy_(load) { - return React.lazy(async () => ({ - default: await load() - })); -} - -let Uncurried = {}; - -export { - Children, - Context, - Fragment, - StrictMode, - Suspense, - lazy_, - Uncurried, -} -/* react Not a pure module */ diff --git a/src/ReactDOM.bs.js b/src/ReactDOM.bs.js deleted file mode 100644 index 766ec05..0000000 --- a/src/ReactDOM.bs.js +++ /dev/null @@ -1,57 +0,0 @@ -// Generated by ReScript, PLEASE EDIT WITH CARE - -import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js"; - -let Root = {}; - -let Client = { - Root: Root -}; - -function getString(formData, name) { - let value = formData.get(name); - if (!(value == null) && typeof value === "string") { - return Primitive_option.some(value); - } -} - -function getFile(formData, name) { - let value = formData.get(name); - if (!(value == null) && typeof value !== "string") { - return Primitive_option.some(value); - } -} - -function getAll(t, string) { - return t.getAll(string).map(value => { - if (typeof value === "string") { - return { - TAG: "String", - _0: value - }; - } else { - return { - TAG: "File", - _0: value - }; - } - }); -} - -let FormData = { - getString: getString, - getFile: getFile, - getAll: getAll -}; - -let Ref = {}; - -let Style; - -export { - Client, - FormData, - Ref, - Style, -} -/* No side effect */ diff --git a/src/ReactEvent.bs.js b/src/ReactEvent.bs.js deleted file mode 100644 index 5303ddd..0000000 --- a/src/ReactEvent.bs.js +++ /dev/null @@ -1,54 +0,0 @@ -// Generated by ReScript, PLEASE EDIT WITH CARE - - -let Synthetic = {}; - -let Clipboard = {}; - -let Composition = {}; - -let Keyboard = {}; - -let Focus = {}; - -let Form = {}; - -let Mouse = {}; - -let Pointer = {}; - -let Selection = {}; - -let Touch = {}; - -let UI = {}; - -let Wheel = {}; - -let Media = {}; - -let Image = {}; - -let Animation = {}; - -let Transition = {}; - -export { - Synthetic, - Clipboard, - Composition, - Keyboard, - Focus, - Form, - Mouse, - Pointer, - Selection, - Touch, - UI, - Wheel, - Media, - Image, - Animation, - Transition, -} -/* No side effect */ diff --git a/src/ReactTestUtils.bs.js b/src/ReactTestUtils.bs.js deleted file mode 100644 index 2166cce..0000000 --- a/src/ReactTestUtils.bs.js +++ /dev/null @@ -1,100 +0,0 @@ -// Generated by ReScript, PLEASE EDIT WITH CARE - -import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js"; -import * as TestUtils from "react-dom/test-utils"; - -function act(func) { - let reactFunc = () => { - func(); - }; - TestUtils.act(reactFunc); -} - -function actAsync(func) { - return TestUtils.act(() => func()); -} - -function changeWithValue(element, value) { - let event = { - target: { - value: value - } - }; - TestUtils.Simulate.change(element, event); -} - -function changeWithChecked(element, value) { - let event = { - target: { - checked: value - } - }; - TestUtils.Simulate.change(element, event); -} - -let Simulate = { - changeWithValue: changeWithValue, - changeWithChecked: changeWithChecked -}; - -function findBySelector(element, selector) { - return element.querySelector(selector); -} - -function findByAllSelector(element, selector) { - return Array.from(element.querySelectorAll(selector)); -} - -function findBySelectorAndTextContent(element, selector, content) { - return Array.from(element.querySelectorAll(selector)).find(node => node.textContent === content); -} - -function findBySelectorAndPartialTextContent(element, selector, content) { - return Array.from(element.querySelectorAll(selector)).find(node => node.textContent.includes(content)); -} - -let DOM = { - findBySelector: findBySelector, - findByAllSelector: findByAllSelector, - findBySelectorAndTextContent: findBySelectorAndTextContent, - findBySelectorAndPartialTextContent: findBySelectorAndPartialTextContent -}; - -function prepareContainer(container, param) { - let containerElement = document.createElement("div"); - let body = document.body; - if (body !== undefined) { - Primitive_option.valFromOption(body).appendChild(containerElement); - } - container.contents = Primitive_option.some(containerElement); -} - -function cleanupContainer(container, param) { - let contents = container.contents; - if (contents !== undefined) { - Primitive_option.valFromOption(contents).remove(); - } - container.contents = undefined; -} - -function getContainer(container) { - let contents = container.contents; - if (contents !== undefined) { - return Primitive_option.valFromOption(contents); - } - throw { - RE_EXN_ID: "Not_found", - Error: new Error() - }; -} - -export { - act, - actAsync, - Simulate, - DOM, - prepareContainer, - cleanupContainer, - getContainer, -} -/* react-dom/test-utils Not a pure module */ diff --git a/src/RescriptReactRouter.bs.js b/src/RescriptReactRouter.bs.js deleted file mode 100644 index 3bee765..0000000 --- a/src/RescriptReactRouter.bs.js +++ /dev/null @@ -1,199 +0,0 @@ -// 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 safeMakeEvent(eventName) { - if (typeof Event === "function") { - return new Event(eventName); - } - let event = document.createEvent("Event"); - event.initEvent(eventName, true, true); - return event; -} - -function pathParse(str) { - switch (str) { - case "" : - case "/" : - return /* [] */0; - default: - let raw = str.slice(1); - let match = raw[raw.length - 1 | 0]; - let raw$1 = match === "/" ? raw.slice(0, -1) : raw; - let match$1 = raw$1.split("?", 2); - let raw$2 = match$1.length !== 2 ? raw$1 : match$1[0]; - let a = raw$2.split("/").filter(item => item.length !== 0); - let _i = a.length - 1 | 0; - let _res = /* [] */0; - while (true) { - let res = _res; - let i = _i; - if (i < 0) { - return res; - } - _res = { - hd: a[i], - tl: res - }; - _i = i - 1 | 0; - continue; - }; - } -} - -function path(serverUrlString, param) { - let match = globalThis.window; - if (serverUrlString !== undefined) { - return pathParse(serverUrlString); - } else if (match !== undefined) { - return pathParse(Primitive_option.valFromOption(match).location.pathname); - } else { - return /* [] */0; - } -} - -function hash() { - let window = globalThis.window; - if (window === undefined) { - return ""; - } - let raw = Primitive_option.valFromOption(window).location.hash; - switch (raw) { - case "" : - case "#" : - return ""; - default: - return raw.slice(1); - } -} - -function searchParse(str) { - switch (str) { - case "" : - case "?" : - return ""; - default: - let match = str.split("?", 2); - if (match.length !== 2) { - return ""; - } else { - return match[1]; - } - } -} - -function search(serverUrlString, param) { - let match = globalThis.window; - if (serverUrlString !== undefined) { - return searchParse(serverUrlString); - } else if (match !== undefined) { - return searchParse(Primitive_option.valFromOption(match).location.search); - } else { - return ""; - } -} - -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(safeMakeEvent("popstate")); - return; - } -} - -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(safeMakeEvent("popstate")); - return; - } -} - -function urlNotEqual(a, b) { - if (a.hash !== b.hash || a.search !== b.search) { - return true; - } else { - let _aList = a.path; - let _bList = b.path; - while (true) { - let bList = _bList; - let aList = _aList; - if (aList === 0) { - return bList !== 0; - } - if (bList === 0) { - return true; - } - if (aList.hd !== bList.hd) { - return true; - } - _bList = bList.tl; - _aList = aList.tl; - continue; - }; - } -} - -function url(serverUrlString, param) { - return { - path: path(serverUrlString, undefined), - hash: hash(), - search: search(serverUrlString, undefined) - }; -} - -function watchUrl(callback) { - let window = globalThis.window; - if (window === undefined) { - return () => {}; - } - let watcherID = () => callback(url(undefined, undefined)); - Primitive_option.valFromOption(window).addEventListener("popstate", watcherID); - return watcherID; -} - -function unwatchUrl(watcherID) { - let window = globalThis.window; - if (window !== undefined) { - Primitive_option.valFromOption(window).removeEventListener("popstate", watcherID); - return; - } -} - -function useUrl(serverUrl, param) { - let match = React.useState(() => { - if (serverUrl !== undefined) { - return serverUrl; - } else { - return url(undefined, undefined); - } - }); - let setUrl = match[1]; - let url$1 = match[0]; - React.useEffect(() => { - let watcherId = watchUrl(url => setUrl(param => url)); - let newUrl = url(undefined, undefined); - if (urlNotEqual(newUrl, url$1)) { - setUrl(param => newUrl); - } - return () => unwatchUrl(watcherId); - }, []); - return url$1; -} - -let dangerouslyGetInitialUrl = url; - -export { - push, - replace, - watchUrl, - unwatchUrl, - dangerouslyGetInitialUrl, - useUrl, -} -/* react Not a pure module */