From 1a3e664e43c0d7cf6a9bdead3adcee88cf278945 Mon Sep 17 00:00:00 2001
From: Ivan Demchenko <idemchenko.js@gmail.com>
Date: Fri, 1 Dec 2023 15:42:49 +0100
Subject: [PATCH] feat: strict types for form events

---
 src/ReactEvent.res  | 27 ++++++++++++++++++++++++++-
 src/ReactEvent.resi |  6 +++---
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/ReactEvent.res b/src/ReactEvent.res
index 2d927a1..9905cb4 100644
--- a/src/ReactEvent.res
+++ b/src/ReactEvent.res
@@ -25,6 +25,31 @@ module MakeEventWithType = (
   @send external persist: Type.t => unit = "persist"
 }
 
+module MakeEventWithTypeStrict = (
+  Type: {
+    type t
+  },
+) => {
+  @get external bubbles: Type.t => bool = "bubbles"
+  @get external cancelable: Type.t => bool = "cancelable"
+  @get
+  external currentTarget: Type.t => Js.Json.t = "currentTarget" /* Should return Dom.eventTarget */
+  @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 => Js.Json.t = "nativeEvent" /* Should return Dom.event */
+  @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 => Js.Json.t = "target" /* Should return Dom.eventTarget */
+  @get external timeStamp: Type.t => float = "timeStamp"
+  @get external type_: Type.t => string = "type"
+  @send external persist: Type.t => unit = "persist"
+}
+
 module Synthetic = {
   type tag = JsxEvent.Synthetic.tag
   type t = synthetic<tag>
@@ -109,7 +134,7 @@ module Focus = {
 module Form = {
   type tag = JsxEvent.Form.tag
   type t = synthetic<tag>
-  include MakeEventWithType({
+  include MakeEventWithTypeStrict({
     type t = t
   })
 }
diff --git a/src/ReactEvent.resi b/src/ReactEvent.resi
index 61b5d4b..e40d61d 100644
--- a/src/ReactEvent.resi
+++ b/src/ReactEvent.resi
@@ -171,16 +171,16 @@ module Form: {
   type t = synthetic<tag>
   @get external bubbles: t => bool = "bubbles"
   @get external cancelable: t => bool = "cancelable"
-  @get external currentTarget: t => {..} = "currentTarget"
+  @get external currentTarget: t => Js.Json.t = "currentTarget"
   @get external defaultPrevented: t => bool = "defaultPrevented"
   @get external eventPhase: t => int = "eventPhase"
   @get external isTrusted: t => bool = "isTrusted"
-  @get external nativeEvent: t => {..} = "nativeEvent"
+  @get external nativeEvent: t => Js.Json.t = "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 => Js.Json.t = "target"
   @get external timeStamp: t => float = "timeStamp"
   @get external type_: t => string = "type"
   @send external persist: t => unit = "persist"