From 6f490d5adb75e7e2a2b8b8ee4ab3610c1cb6a524 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 27 Nov 2024 11:26:20 +0100 Subject: [PATCH 1/5] Rename canvas test file --- .../{HTMLCanvasElement__tes.js => HTMLCanvasElement__test.js} | 0 .../{HTMLCanvasElement__tes.res => HTMLCanvasElement__test.res} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/DOMAPI/{HTMLCanvasElement__tes.js => HTMLCanvasElement__test.js} (100%) rename tests/DOMAPI/{HTMLCanvasElement__tes.res => HTMLCanvasElement__test.res} (100%) diff --git a/tests/DOMAPI/HTMLCanvasElement__tes.js b/tests/DOMAPI/HTMLCanvasElement__test.js similarity index 100% rename from tests/DOMAPI/HTMLCanvasElement__tes.js rename to tests/DOMAPI/HTMLCanvasElement__test.js diff --git a/tests/DOMAPI/HTMLCanvasElement__tes.res b/tests/DOMAPI/HTMLCanvasElement__test.res similarity index 100% rename from tests/DOMAPI/HTMLCanvasElement__tes.res rename to tests/DOMAPI/HTMLCanvasElement__test.res From 035ca3533aa80010e38822b2dccc7483929807a0 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 27 Nov 2024 11:27:38 +0100 Subject: [PATCH 2/5] Remove named parameters for addEventListener --- src/EventAPI/EventTarget.res | 16 ++++++++-------- src/Global.res | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/EventAPI/EventTarget.res b/src/EventAPI/EventTarget.res index 949f79c..8f3677c 100644 --- a/src/EventAPI/EventTarget.res +++ b/src/EventAPI/EventTarget.res @@ -32,8 +32,8 @@ The event listener is appended to target's event listener list and is not append @send external addEventListener: ( T.t, - ~type_: eventType, - ~callback: eventListener<'event>, + eventType, + eventListener<'event>, ~options: addEventListenerOptions=?, ) => unit = "addEventListener" @@ -56,8 +56,8 @@ The event listener is appended to target's event listener list and is not append @send external addEventListener_useCapture: ( T.t, - ~type_: eventType, - ~callback: eventListener<'event>, + eventType, + eventListener<'event>, @as(json`true`) _, ) => unit = "addEventListener" @@ -68,8 +68,8 @@ Removes the event listener in target's event listener list with the same type, c @send external removeEventListener: ( T.t, - ~type_: eventType, - ~callback: eventListener<'event>, + eventType, + eventListener<'event>, ~options: eventListenerOptions=?, ) => unit = "removeEventListener" @@ -80,8 +80,8 @@ Removes the event listener in target's event listener list with the same type, c @send external removeEventListener_useCapture: ( T.t, - ~type_: eventType, - ~callback: eventListener<'event>, + eventType, + eventListener<'event>, @as(json`true`) _, ) => unit = "removeEventListener" diff --git a/src/Global.res b/src/Global.res index 593312d..f436003 100644 --- a/src/Global.res +++ b/src/Global.res @@ -535,8 +535,8 @@ The event listener is appended to target's event listener list and is not append [Read more on MDN](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) */ external addEventListener: ( - ~type_: eventType, - ~callback: eventListener<'event>, + eventType, + eventListener<'event>, ~options: addEventListenerOptions=?, ) => unit = "addEventListener" @@ -557,8 +557,8 @@ The event listener is appended to target's event listener list and is not append [Read more on MDN](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) */ external addEventListener_useCapture: ( - ~type_: eventType, - ~callback: eventListener<'event>, + eventType, + eventListener<'event>, @as(json`true`) _, ) => unit = "addEventListener" @@ -567,8 +567,8 @@ Removes the event listener in target's event listener list with the same type, c [Read more on MDN](https://developer.mozilla.org/docs/Web/API/EventTarget/removeEventListener) */ external removeEventListener: ( - ~type_: string, - ~callback: eventListener<'event>, + string, + eventListener<'event>, ~options: eventListenerOptions=?, ) => unit = "removeEventListener" @@ -577,8 +577,8 @@ Removes the event listener in target's event listener list with the same type, c [Read more on MDN](https://developer.mozilla.org/docs/Web/API/EventTarget/removeEventListener) */ external removeEventListener_useCapture: ( - ~type_: eventType, - ~callback: eventListener<'event>, + eventType, + eventListener<'event>, @as(json`true`) _, ) => unit = "removeEventListener" From d57c1e8b81c3c3b0bdb8e7aacb56bb29e3bbf183 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 27 Nov 2024 13:06:57 +0100 Subject: [PATCH 3/5] Add UI Event module --- src/DOMAPI.res | 7 + src/UIEventsAPI.js | 2 + src/UIEventsAPI.res | 373 +++++++++++++++++++++++ src/UIEventsAPI/CompositionEvent.js | 7 + src/UIEventsAPI/CompositionEvent.res | 12 + src/UIEventsAPI/DataTransfer.js | 2 + src/UIEventsAPI/DataTransfer.res | 36 +++ src/UIEventsAPI/DataTransferItem.js | 2 + src/UIEventsAPI/DataTransferItem.res | 23 ++ src/UIEventsAPI/DataTransferItemList.js | 2 + src/UIEventsAPI/DataTransferItemList.res | 30 ++ src/UIEventsAPI/FocusEvent.js | 7 + src/UIEventsAPI/FocusEvent.res | 11 + src/UIEventsAPI/InputEvent.js | 7 + src/UIEventsAPI/InputEvent.res | 18 ++ src/UIEventsAPI/KeyboardEvent.js | 7 + src/UIEventsAPI/KeyboardEvent.res | 18 ++ src/UIEventsAPI/MouseEvent.js | 15 + src/UIEventsAPI/MouseEvent.res | 29 ++ src/UIEventsAPI/UIEvent.js | 15 + src/UIEventsAPI/UIEvent.res | 23 ++ src/UIEventsAPI/WheelEvent.js | 7 + src/UIEventsAPI/WheelEvent.res | 11 + 23 files changed, 664 insertions(+) create mode 100644 src/UIEventsAPI.js create mode 100644 src/UIEventsAPI.res create mode 100644 src/UIEventsAPI/CompositionEvent.js create mode 100644 src/UIEventsAPI/CompositionEvent.res create mode 100644 src/UIEventsAPI/DataTransfer.js create mode 100644 src/UIEventsAPI/DataTransfer.res create mode 100644 src/UIEventsAPI/DataTransferItem.js create mode 100644 src/UIEventsAPI/DataTransferItem.res create mode 100644 src/UIEventsAPI/DataTransferItemList.js create mode 100644 src/UIEventsAPI/DataTransferItemList.res create mode 100644 src/UIEventsAPI/FocusEvent.js create mode 100644 src/UIEventsAPI/FocusEvent.res create mode 100644 src/UIEventsAPI/InputEvent.js create mode 100644 src/UIEventsAPI/InputEvent.res create mode 100644 src/UIEventsAPI/KeyboardEvent.js create mode 100644 src/UIEventsAPI/KeyboardEvent.res create mode 100644 src/UIEventsAPI/MouseEvent.js create mode 100644 src/UIEventsAPI/MouseEvent.res create mode 100644 src/UIEventsAPI/UIEvent.js create mode 100644 src/UIEventsAPI/UIEvent.res create mode 100644 src/UIEventsAPI/WheelEvent.js create mode 100644 src/UIEventsAPI/WheelEvent.res diff --git a/src/DOMAPI.res b/src/DOMAPI.res index df04130..d8611e3 100644 --- a/src/DOMAPI.res +++ b/src/DOMAPI.res @@ -7131,6 +7131,13 @@ type range = { commonAncestorContainer: node, } +/** +[See StaticRange on MDN](https://developer.mozilla.org/docs/Web/API/StaticRange) +*/ +type staticRange = { + ...abstractRange, +} + type nodeFilter = {} /** diff --git a/src/UIEventsAPI.js b/src/UIEventsAPI.js new file mode 100644 index 0000000..d856702 --- /dev/null +++ b/src/UIEventsAPI.js @@ -0,0 +1,2 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE +/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */ diff --git a/src/UIEventsAPI.res b/src/UIEventsAPI.res new file mode 100644 index 0000000..2c43f58 --- /dev/null +++ b/src/UIEventsAPI.res @@ -0,0 +1,373 @@ +@@warning("-30") + +open EventAPI +open DOMAPI + +/** +Simple user interface events. +[See UIEvent on MDN](https://developer.mozilla.org/docs/Web/API/UIEvent) +*/ +type uiEvent = { + ...event, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/UIEvent/view) + */ + view: Null.t, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/UIEvent/detail) + */ + detail: int, +} + +/** +The DOM CompositionEvent represents events that occur due to the user indirectly entering text. +[See CompositionEvent on MDN](https://developer.mozilla.org/docs/Web/API/CompositionEvent) +*/ +type compositionEvent = { + ...uiEvent, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/CompositionEvent/data) + */ + data: string, +} + +/** +Focus-related events like focus, blur, focusin, or focusout. +[See FocusEvent on MDN](https://developer.mozilla.org/docs/Web/API/FocusEvent) +*/ +type focusEvent = { + ...uiEvent, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/FocusEvent/relatedTarget) + */ + relatedTarget: Null.t, +} + +/** +One drag data item. During a drag operation, each drag event has a dataTransfer property which contains a list of drag data items. Each item in the list is a DataTransferItem object. +[See DataTransferItem on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItem) +*/ +type dataTransferItem = { + /** + Returns the drag data item kind, one of: "string", "file". + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItem/kind) + */ + kind: string, + /** + Returns the drag data item type string. + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItem/type) + */ + @as("type") + type_: string, +} + +/** +A list of DataTransferItem objects representing items being dragged. During a drag operation, each DragEvent has a dataTransfer property and that property is a DataTransferItemList. +[See DataTransferItemList on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItemList) +*/ +type dataTransferItemList = { + /** + Returns the number of items in the drag data store. + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItemList/length) + */ + length: int, +} + +/** +Used to hold the data that is being dragged during a drag and drop operation. It may hold one or more data items, each of one or more data types. For more information about drag and drop, see HTML Drag and Drop API. +[See DataTransfer on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer) +*/ +type dataTransfer = { + /** + Returns the kind of operation that is currently selected. If the kind of operation isn't one of those that is allowed by the effectAllowed attribute, then the operation will fail. + +Can be set, to change the selected operation. + +The possible values are "none", "copy", "link", and "move". + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer/dropEffect) + */ + mutable dropEffect: string, + /** + Returns the kinds of operations that are to be allowed. + +Can be set (during the dragstart event), to change the allowed operations. + +The possible values are "none", "copy", "copyLink", "copyMove", "link", "linkMove", "move", "all", and "uninitialized", + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer/effectAllowed) + */ + mutable effectAllowed: string, + /** + Returns a DataTransferItemList object, with the drag data. + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer/items) + */ + items: dataTransferItemList, + /** + Returns a frozen array listing the formats that were set in the dragstart event. In addition, if any files are being dragged, then one of the types will be the string "Files". + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer/types) + */ + types: array, + /** + Returns a FileList of the files being dragged, if any. + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer/files) + */ + files: fileList, +} + +/** +[See InputEvent on MDN](https://developer.mozilla.org/docs/Web/API/InputEvent) +*/ +type inputEvent = { + ...uiEvent, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/InputEvent/data) + */ + data: Null.t, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/InputEvent/isComposing) + */ + isComposing: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/InputEvent/inputType) + */ + inputType: string, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/InputEvent/dataTransfer) + */ + dataTransfer: Null.t, +} + +/** +KeyboardEvent objects describe a user interaction with the keyboard; each event describes a single interaction between the user and a key (or combination of a key with modifier keys) on the keyboard. +[See KeyboardEvent on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent) +*/ +type keyboardEvent = { + ...uiEvent, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/key) + */ + key: string, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/code) + */ + code: string, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/location) + */ + location: int, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/ctrlKey) + */ + ctrlKey: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/shiftKey) + */ + shiftKey: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/altKey) + */ + altKey: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/metaKey) + */ + metaKey: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/repeat) + */ + repeat: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/isComposing) + */ + isComposing: bool, +} + +/** +Events that occur due to the user interacting with a pointing device (such as a mouse). Common events using this interface include click, dblclick, mouseup, mousedown. +[See MouseEvent on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent) +*/ +type mouseEvent = { + ...uiEvent, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/screenX) + */ + screenX: int, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/screenY) + */ + screenY: int, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/clientX) + */ + clientX: int, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/clientY) + */ + clientY: int, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/layerX) + */ + layerX: int, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/layerY) + */ + layerY: int, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/ctrlKey) + */ + ctrlKey: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/shiftKey) + */ + shiftKey: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/altKey) + */ + altKey: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/metaKey) + */ + metaKey: bool, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/button) + */ + button: int, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/buttons) + */ + buttons: int, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/relatedTarget) + */ + relatedTarget: Null.t, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/pageX) + */ + pageX: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/pageY) + */ + pageY: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/x) + */ + x: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/y) + */ + y: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/offsetX) + */ + offsetX: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/offsetY) + */ + offsetY: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/movementX) + */ + movementX: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/movementY) + */ + movementY: float, +} + +/** +Events that occur due to the user moving a mouse wheel or similar input device. +[See WheelEvent on MDN](https://developer.mozilla.org/docs/Web/API/WheelEvent) +*/ +type wheelEvent = { + ...mouseEvent, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/WheelEvent/deltaX) + */ + deltaX: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/WheelEvent/deltaY) + */ + deltaY: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/WheelEvent/deltaZ) + */ + deltaZ: float, + /** + [Read more on MDN](https://developer.mozilla.org/docs/Web/API/WheelEvent/deltaMode) + */ + deltaMode: int, +} + +type uiEventInit = { + ...eventInit, + mutable view?: Null.t, + mutable detail?: int, + mutable which?: int, +} + +type eventModifierInit = { + ...uiEventInit, + mutable ctrlKey?: bool, + mutable shiftKey?: bool, + mutable altKey?: bool, + mutable metaKey?: bool, + mutable modifierAltGraph?: bool, + mutable modifierCapsLock?: bool, + mutable modifierFn?: bool, + mutable modifierFnLock?: bool, + mutable modifierHyper?: bool, + mutable modifierNumLock?: bool, + mutable modifierScrollLock?: bool, + mutable modifierSuper?: bool, + mutable modifierSymbol?: bool, + mutable modifierSymbolLock?: bool, +} + +type mouseEventInit = { + ...eventModifierInit, + mutable screenX?: int, + mutable screenY?: int, + mutable clientX?: int, + mutable clientY?: int, + mutable button?: int, + mutable buttons?: int, + mutable relatedTarget?: Null.t, + mutable movementX?: float, + mutable movementY?: float, +} + +type focusEventInit = { + ...uiEventInit, + mutable relatedTarget?: Null.t, +} + +type compositionEventInit = { + ...uiEventInit, + mutable data?: string, +} + +type wheelEventInit = { + ...mouseEventInit, + mutable deltaX?: float, + mutable deltaY?: float, + mutable deltaZ?: float, + mutable deltaMode?: int, +} + +type keyboardEventInit = { + ...eventModifierInit, + mutable key?: string, + mutable code?: string, + mutable location?: int, + mutable repeat?: bool, + mutable isComposing?: bool, + mutable charCode?: int, + mutable keyCode?: int, +} + +type inputEventInit = { + ...uiEventInit, + mutable data?: Null.t, + mutable isComposing?: bool, + mutable inputType?: string, + mutable dataTransfer?: Null.t, + mutable targetRanges?: array, +} diff --git a/src/UIEventsAPI/CompositionEvent.js b/src/UIEventsAPI/CompositionEvent.js new file mode 100644 index 0000000..4d4d54b --- /dev/null +++ b/src/UIEventsAPI/CompositionEvent.js @@ -0,0 +1,7 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as UIEvent$WebAPI from "./UIEvent.js"; + +UIEvent$WebAPI.Impl({}); + +/* Not a pure module */ diff --git a/src/UIEventsAPI/CompositionEvent.res b/src/UIEventsAPI/CompositionEvent.res new file mode 100644 index 0000000..549b341 --- /dev/null +++ b/src/UIEventsAPI/CompositionEvent.res @@ -0,0 +1,12 @@ +open UIEventsAPI + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/CompositionEvent) +*/ +@new +external make: (~type_: string, ~eventInitDict: compositionEventInit=?) => compositionEvent = + "CompositionEvent" + +include UIEvent.Impl({ + type t = compositionEvent +}) diff --git a/src/UIEventsAPI/DataTransfer.js b/src/UIEventsAPI/DataTransfer.js new file mode 100644 index 0000000..d856702 --- /dev/null +++ b/src/UIEventsAPI/DataTransfer.js @@ -0,0 +1,2 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE +/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */ diff --git a/src/UIEventsAPI/DataTransfer.res b/src/UIEventsAPI/DataTransfer.res new file mode 100644 index 0000000..54be57f --- /dev/null +++ b/src/UIEventsAPI/DataTransfer.res @@ -0,0 +1,36 @@ +open UIEventsAPI +open DOMAPI + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer) +*/ +@new +external make: unit => dataTransfer = "DataTransfer" + +/** +Uses the given element to update the drag feedback, replacing any previously specified feedback. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer/setDragImage) +*/ +@send +external setDragImage: (dataTransfer, ~image: element, ~x: int, ~y: int) => unit = "setDragImage" + +/** +Returns the specified data. If there is no such data, returns the empty string. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer/getData) +*/ +@send +external getData: (dataTransfer, string) => string = "getData" + +/** +Adds the specified data. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer/setData) +*/ +@send +external setData: (dataTransfer, ~format: string, ~data: string) => unit = "setData" + +/** +Removes the data of the specified formats. Removes all data if the argument is omitted. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransfer/clearData) +*/ +@send +external clearData: (dataTransfer, ~format: string=?) => unit = "clearData" diff --git a/src/UIEventsAPI/DataTransferItem.js b/src/UIEventsAPI/DataTransferItem.js new file mode 100644 index 0000000..d856702 --- /dev/null +++ b/src/UIEventsAPI/DataTransferItem.js @@ -0,0 +1,2 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE +/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */ diff --git a/src/UIEventsAPI/DataTransferItem.res b/src/UIEventsAPI/DataTransferItem.res new file mode 100644 index 0000000..fcce6e9 --- /dev/null +++ b/src/UIEventsAPI/DataTransferItem.res @@ -0,0 +1,23 @@ +open UIEventsAPI +open FileAPI +open FileAndDirectoryEntriesAPI + +/** +Invokes the callback with the string data as the argument, if the drag data item kind is text. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItem/getAsString) +*/ +@send +external getAsString: (dataTransferItem, string => unit) => unit = "getAsString" + +/** +Returns a File object, if the drag data item kind is File. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItem/getAsFile) +*/ +@send +external getAsFile: dataTransferItem => file = "getAsFile" + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry) +*/ +@send +external webkitGetAsEntry: dataTransferItem => fileSystemEntry = "webkitGetAsEntry" diff --git a/src/UIEventsAPI/DataTransferItemList.js b/src/UIEventsAPI/DataTransferItemList.js new file mode 100644 index 0000000..d856702 --- /dev/null +++ b/src/UIEventsAPI/DataTransferItemList.js @@ -0,0 +1,2 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE +/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */ diff --git a/src/UIEventsAPI/DataTransferItemList.res b/src/UIEventsAPI/DataTransferItemList.res new file mode 100644 index 0000000..927bbb3 --- /dev/null +++ b/src/UIEventsAPI/DataTransferItemList.res @@ -0,0 +1,30 @@ +open UIEventsAPI +open FileAPI + +/** +Adds a new entry for the given data to the drag data store. If the data is plain text then a type string has to be provided also. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItemList/add) +*/ +@send +external add: (dataTransferItemList, ~data: string, ~type_: string) => dataTransferItem = "add" + +/** +Adds a new entry for the given data to the drag data store. If the data is plain text then a type string has to be provided also. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItemList/add) +*/ +@send +external add2: (dataTransferItemList, file) => dataTransferItem = "add" + +/** +Removes the indexth entry in the drag data store. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItemList/remove) +*/ +@send +external remove: (dataTransferItemList, int) => unit = "remove" + +/** +Removes all the entries in the drag data store. +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/DataTransferItemList/clear) +*/ +@send +external clear: dataTransferItemList => unit = "clear" diff --git a/src/UIEventsAPI/FocusEvent.js b/src/UIEventsAPI/FocusEvent.js new file mode 100644 index 0000000..4d4d54b --- /dev/null +++ b/src/UIEventsAPI/FocusEvent.js @@ -0,0 +1,7 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as UIEvent$WebAPI from "./UIEvent.js"; + +UIEvent$WebAPI.Impl({}); + +/* Not a pure module */ diff --git a/src/UIEventsAPI/FocusEvent.res b/src/UIEventsAPI/FocusEvent.res new file mode 100644 index 0000000..747ea02 --- /dev/null +++ b/src/UIEventsAPI/FocusEvent.res @@ -0,0 +1,11 @@ +open UIEventsAPI + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/FocusEvent) +*/ +@new +external make: (~type_: string, ~eventInitDict: focusEventInit=?) => focusEvent = "FocusEvent" + +include UIEvent.Impl({ + type t = focusEvent +}) diff --git a/src/UIEventsAPI/InputEvent.js b/src/UIEventsAPI/InputEvent.js new file mode 100644 index 0000000..4d4d54b --- /dev/null +++ b/src/UIEventsAPI/InputEvent.js @@ -0,0 +1,7 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as UIEvent$WebAPI from "./UIEvent.js"; + +UIEvent$WebAPI.Impl({}); + +/* Not a pure module */ diff --git a/src/UIEventsAPI/InputEvent.res b/src/UIEventsAPI/InputEvent.res new file mode 100644 index 0000000..82c6eb8 --- /dev/null +++ b/src/UIEventsAPI/InputEvent.res @@ -0,0 +1,18 @@ +open UIEventsAPI +open DOMAPI + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/InputEvent) +*/ +@new +external make: (~type_: string, ~eventInitDict: inputEventInit=?) => inputEvent = "InputEvent" + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/InputEvent/getTargetRanges) +*/ +@send +external getTargetRanges: inputEvent => array = "getTargetRanges" + +include UIEvent.Impl({ + type t = inputEvent +}) diff --git a/src/UIEventsAPI/KeyboardEvent.js b/src/UIEventsAPI/KeyboardEvent.js new file mode 100644 index 0000000..4d4d54b --- /dev/null +++ b/src/UIEventsAPI/KeyboardEvent.js @@ -0,0 +1,7 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as UIEvent$WebAPI from "./UIEvent.js"; + +UIEvent$WebAPI.Impl({}); + +/* Not a pure module */ diff --git a/src/UIEventsAPI/KeyboardEvent.res b/src/UIEventsAPI/KeyboardEvent.res new file mode 100644 index 0000000..a724de7 --- /dev/null +++ b/src/UIEventsAPI/KeyboardEvent.res @@ -0,0 +1,18 @@ +open UIEventsAPI + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent) +*/ +@new +external make: (~type_: string, ~eventInitDict: keyboardEventInit=?) => keyboardEvent = + "KeyboardEvent" + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/getModifierState) +*/ +@send +external getModifierState: (keyboardEvent, string) => bool = "getModifierState" + +include UIEvent.Impl({ + type t = keyboardEvent +}) diff --git a/src/UIEventsAPI/MouseEvent.js b/src/UIEventsAPI/MouseEvent.js new file mode 100644 index 0000000..bceb0e5 --- /dev/null +++ b/src/UIEventsAPI/MouseEvent.js @@ -0,0 +1,15 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as UIEvent$WebAPI from "./UIEvent.js"; + +function Impl(T) { + UIEvent$WebAPI.Impl({}); + return {}; +} + +UIEvent$WebAPI.Impl({}); + +export { + Impl, +} +/* Not a pure module */ diff --git a/src/UIEventsAPI/MouseEvent.res b/src/UIEventsAPI/MouseEvent.res new file mode 100644 index 0000000..a5eebe7 --- /dev/null +++ b/src/UIEventsAPI/MouseEvent.res @@ -0,0 +1,29 @@ +open UIEventsAPI + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent) +*/ +@new +external make: (~type_: string, ~eventInitDict: mouseEventInit=?) => mouseEvent = "MouseEvent" + +module Impl = ( + T: { + type t + }, +) => { + external asMouseEvent: T.t => mouseEvent = "%identity" + + include UIEvent.Impl({ + type t = T.t + }) + + /** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/MouseEvent/getModifierState) +*/ + @send + external getModifierState: (T.t, string) => bool = "getModifierState" +} + +include Impl({ + type t = mouseEvent +}) diff --git a/src/UIEventsAPI/UIEvent.js b/src/UIEventsAPI/UIEvent.js new file mode 100644 index 0000000..bff67bb --- /dev/null +++ b/src/UIEventsAPI/UIEvent.js @@ -0,0 +1,15 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as Event$WebAPI from "../EventAPI/Event.js"; + +function Impl(T) { + Event$WebAPI.Impl({}); + return {}; +} + +Event$WebAPI.Impl({}); + +export { + Impl, +} +/* Not a pure module */ diff --git a/src/UIEventsAPI/UIEvent.res b/src/UIEventsAPI/UIEvent.res new file mode 100644 index 0000000..67b7738 --- /dev/null +++ b/src/UIEventsAPI/UIEvent.res @@ -0,0 +1,23 @@ +open UIEventsAPI + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/UIEvent) +*/ +@new +external make: (~type_: string, ~eventInitDict: uiEventInit=?) => uiEvent = "UIEvent" + +module Impl = ( + T: { + type t + }, +) => { + external asUIEvent: T.t => uiEvent = "%identity" + + include Event.Impl({ + type t = T.t + }) +} + +include Impl({ + type t = uiEvent +}) diff --git a/src/UIEventsAPI/WheelEvent.js b/src/UIEventsAPI/WheelEvent.js new file mode 100644 index 0000000..3b36f96 --- /dev/null +++ b/src/UIEventsAPI/WheelEvent.js @@ -0,0 +1,7 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as MouseEvent$WebAPI from "./MouseEvent.js"; + +MouseEvent$WebAPI.Impl({}); + +/* Not a pure module */ diff --git a/src/UIEventsAPI/WheelEvent.res b/src/UIEventsAPI/WheelEvent.res new file mode 100644 index 0000000..eb43124 --- /dev/null +++ b/src/UIEventsAPI/WheelEvent.res @@ -0,0 +1,11 @@ +open UIEventsAPI + +/** +[Read more on MDN](https://developer.mozilla.org/docs/Web/API/WheelEvent) +*/ +@new +external make: (~type_: string, ~eventInitDict: wheelEventInit=?) => wheelEvent = "WheelEvent" + +include MouseEvent.Impl({ + type t = wheelEvent +}) From f03695087e52ca04b147c3515a7c94d693e3be86 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 27 Nov 2024 13:10:04 +0100 Subject: [PATCH 4/5] Add unit test --- tests/DOMAPI/AddEventListener__test.js | 37 +++++++++++++++++++++++++ tests/DOMAPI/AddEventListener__test.res | 21 ++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 tests/DOMAPI/AddEventListener__test.js create mode 100644 tests/DOMAPI/AddEventListener__test.res diff --git a/tests/DOMAPI/AddEventListener__test.js b/tests/DOMAPI/AddEventListener__test.js new file mode 100644 index 0000000..52bab52 --- /dev/null +++ b/tests/DOMAPI/AddEventListener__test.js @@ -0,0 +1,37 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as Int from "rescript/lib/es6/Int.js"; +import * as Primitive_option from "rescript/lib/es6/Primitive_option.js"; + +let button = document.querySelector("button"); + +let h2 = document.querySelector("h2"); + +if ((button == null) || (h2 == null)) { + console.log("Stuff not found"); +} else { + button.addEventListener("click", e => { + console.log("Button clicked, " + e.button.toString()); + let text = h2.textContent; + if (text === null) { + h2.textContent = "1"; + return; + } + let number = Int.fromString(text, undefined); + if (number !== undefined) { + h2.textContent = (number + 1 | 0).toString(); + } else { + h2.textContent = "1"; + } + }); +} + +let button$1 = (button == null) ? undefined : Primitive_option.some(button); + +let h2$1 = (h2 == null) ? undefined : Primitive_option.some(h2); + +export { + button$1 as button, + h2$1 as h2, +} +/* button Not a pure module */ diff --git a/tests/DOMAPI/AddEventListener__test.res b/tests/DOMAPI/AddEventListener__test.res new file mode 100644 index 0000000..6aafbe5 --- /dev/null +++ b/tests/DOMAPI/AddEventListener__test.res @@ -0,0 +1,21 @@ +open WebAPI +open WebAPI.Global + +let button = document->Document.querySelector("button")->Null.toOption +let h2 = document->Document.querySelector("h2")->Null.toOption + +switch (button, h2) { +| (Some(button), Some(h2)) => + button->Element.addEventListener(EventAPI.Click, (e: UIEventsAPI.mouseEvent) => { + Console.log(`Button clicked, ${Int.toString(e.button)}`) + switch h2.textContent { + | Null => h2.textContent = Value("1") + | Value(text) => + switch Int.fromString(text) { + | None => h2.textContent = Value("1") + | Some(number) => h2.textContent = Value(Int.toString(number + 1)) + } + } + }) +| _ => Console.log("Stuff not found") +} From 53416a8309d4e5f9e50095107a445663e0de0b0a Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 27 Nov 2024 17:56:11 +0100 Subject: [PATCH 5/5] Add examples --- astro.config.mjs | 4 +++ docs/pages/examples.astro | 56 +++++++++++++++++++++++++++++++++++++++ docs/utils.js | 34 ++++++++++++++++++++++-- 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 docs/pages/examples.astro diff --git a/astro.config.mjs b/astro.config.mjs index 6f6ccff..22645ac 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -51,6 +51,10 @@ export default defineConfig({ { slug: "design-philosophy", }, + { + label: "Examples", + link: "examples", + }, { slug: "project-status", }, diff --git a/docs/pages/examples.astro b/docs/pages/examples.astro new file mode 100644 index 0000000..871e59c --- /dev/null +++ b/docs/pages/examples.astro @@ -0,0 +1,56 @@ +--- +import StarlightPage from "@astrojs/starlight/components/StarlightPage.astro"; +import { Tabs, TabItem, Code } from "@astrojs/starlight/components"; +import { testFiles } from "../utils"; + +const frontmatter = { + title: "Examples", +}; + +const headings = testFiles.map(({ name }) => ({ + depth: 2, + slug: name, + text: name, +})); +--- + + +

+ The best example of usage of these bindings are the tests.
+ These typically contain tweaks made to the generated bindings to make them more + ergonomic. +

+ { + testFiles.map(({ source, output, name }) => { + return ( +
+

{name}

+ + + + + + + + +
+ ); + }) + } +
+ diff --git a/docs/utils.js b/docs/utils.js index 4bdf816..9c5a9a2 100644 --- a/docs/utils.js +++ b/docs/utils.js @@ -1,7 +1,7 @@ import * as path from "node:path"; import { exec } from "node:child_process"; import { promisify } from "node:util"; -import { readdirSync, existsSync } from "fs"; +import { readdirSync, existsSync, readFileSync } from "fs"; import { micromark } from "micromark"; const execAsync = promisify(exec); @@ -140,4 +140,34 @@ export async function getDoc(absoluteFilePath) { values, valueHeadings, }; -} \ No newline at end of file +} + +function trimRescriptOutput(output) { + return output + .replace("// Generated by ReScript, PLEASE EDIT WITH CARE", "") + .replace("/* response Not a pure module */", "") + .trim(); +} + +const testDir = path.resolve(process.cwd(), "tests"); +export const testFiles = + readdirSync(testDir, { recursive: true }) + .filter(f => f.endsWith(".res")) + .map(tf => { + const sourcePath = path.join(testDir, tf); + const source = readFileSync(sourcePath, "utf-8"); + const outputPath = sourcePath.replace(".res", ".js"); + const output = readFileSync(outputPath, "utf-8"); + + const parts = tf.split(path.sep); + const name = parts[parts.length - 1].replace("__tests.res", ""); + + return { + sourcePath: sourcePath.replace(testDir,""), + source, + output: trimRescriptOutput(output), + outputPath: outputPath.replace(testDir,""), + name, + }; + }) + .sort((a, b) => a.name.localeCompare(b.name)); \ No newline at end of file