From 5f5b585c7328328494f13802a4600ed9d5f7c54a Mon Sep 17 00:00:00 2001
From: nojaf <florian.verdonck@outlook.com>
Date: Mon, 18 Nov 2024 10:39:23 +0100
Subject: [PATCH 1/3] Proof of concept querySelector helpers

---
 README.md                               |  2 +-
 docs/content/docs/index.mdx             |  4 +-
 src/DOMAPI/Document.js                  | 12 +++++-
 src/DOMAPI/Document.res                 |  9 ++--
 src/DOMAPI/FillStyle.js                 |  8 ++--
 src/DOMAPI/HTMLCanvasElement.js         | 11 ++++-
 src/DOMAPI/HTMLCanvasElement.res        |  1 +
 src/DOMAPI/QuerySelector.js             | 22 ++++++++++
 src/DOMAPI/QuerySelector.res            | 36 ++++++++++++++++
 tests/DOMAPI/HTMLCanvasElement__tes.js  | 55 +++++++++++--------------
 tests/DOMAPI/HTMLCanvasElement__tes.res | 31 +++++++-------
 11 files changed, 132 insertions(+), 59 deletions(-)
 create mode 100644 src/DOMAPI/QuerySelector.js
 create mode 100644 src/DOMAPI/QuerySelector.res

diff --git a/README.md b/README.md
index 667fcf7..54c0e16 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ Experimental successor to [rescript-webapi](https://github.com/TheSpyder/rescrip
 Install the package using your favorite package manager:
 
 ```shell
-npm i -D @rescript/webapi@experimental
+npm i @rescript/webapi@experimental
 ```
 
 and add `@rescript/webapi` to your `rescript.json`:
diff --git a/docs/content/docs/index.mdx b/docs/content/docs/index.mdx
index 87c4d2c..15d4e4a 100644
--- a/docs/content/docs/index.mdx
+++ b/docs/content/docs/index.mdx
@@ -30,14 +30,14 @@ Install the package using your favorite package manager:
     <Code
       lang="shell"
       frame="none"
-      code="npm i -D @rescript/webapi@experimental"
+      code="npm i @rescript/webapi@experimental"
     />
   </TabItem>
   <TabItem label="bun">
     <Code
       lang="shell"
       frame="none"
-      code="bun i -D @rescript/webapi@experimental"
+      code="bun i @rescript/webapi@experimental"
     />
   </TabItem>
 </Tabs>
diff --git a/src/DOMAPI/Document.js b/src/DOMAPI/Document.js
index d856702..c6e4ad6 100644
--- a/src/DOMAPI/Document.js
+++ b/src/DOMAPI/Document.js
@@ -1,2 +1,12 @@
 // Generated by ReScript, PLEASE EDIT WITH CARE
-/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */
+
+import * as QuerySelector$WebAPI from "./QuerySelector.js";
+
+let include = QuerySelector$WebAPI.Impl({});
+
+let querySelector_htmlCanvasElement = include.querySelector_htmlCanvasElement;
+
+export {
+  querySelector_htmlCanvasElement,
+}
+/* include Not a pure module */
diff --git a/src/DOMAPI/Document.res b/src/DOMAPI/Document.res
index 8501ac2..c54b183 100644
--- a/src/DOMAPI/Document.res
+++ b/src/DOMAPI/Document.res
@@ -77,12 +77,9 @@ Throws a "HierarchyRequestError" DOMException if the constraints of the node tre
 @send
 external replaceChildren2: (document, string) => unit = "replaceChildren"
 
-/**
-Returns the first element that is a descendant of node that matches selectors.
-[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Document/querySelector)
-*/
-@send
-external querySelector: (document, string) => element = "querySelector"
+include QuerySelector.Impl({
+  type t = document
+})
 
 /**
 Returns all element descendants of node that match selectors.
diff --git a/src/DOMAPI/FillStyle.js b/src/DOMAPI/FillStyle.js
index 1e79cc4..d12dfc1 100644
--- a/src/DOMAPI/FillStyle.js
+++ b/src/DOMAPI/FillStyle.js
@@ -1,15 +1,15 @@
 // Generated by ReScript, PLEASE EDIT WITH CARE
 
-import * as CanvasPattern$WebApi from "../CanvasAPI/CanvasPattern.js";
-import * as CanvasGradient$WebApi from "../CanvasAPI/CanvasGradient.js";
+import * as CanvasPattern$WebAPI from "../CanvasAPI/CanvasPattern.js";
+import * as CanvasGradient$WebAPI from "../CanvasAPI/CanvasGradient.js";
 
 function decode(t) {
-  if (CanvasGradient$WebApi.isInstanceOf(t)) {
+  if (CanvasGradient$WebAPI.isInstanceOf(t)) {
     return {
       TAG: "CanvasGradient",
       _0: t
     };
-  } else if (CanvasPattern$WebApi.isInstanceOf(t)) {
+  } else if (CanvasPattern$WebAPI.isInstanceOf(t)) {
     return {
       TAG: "CanvasPattern",
       _0: t
diff --git a/src/DOMAPI/HTMLCanvasElement.js b/src/DOMAPI/HTMLCanvasElement.js
index d856702..25f61a2 100644
--- a/src/DOMAPI/HTMLCanvasElement.js
+++ b/src/DOMAPI/HTMLCanvasElement.js
@@ -1,2 +1,11 @@
 // Generated by ReScript, PLEASE EDIT WITH CARE
-/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */
+
+
+function isInstanceOf(param) {
+  return (param instanceof HTMLCanvasElement);
+}
+
+export {
+  isInstanceOf,
+}
+/* No side effect */
diff --git a/src/DOMAPI/HTMLCanvasElement.res b/src/DOMAPI/HTMLCanvasElement.res
index 6fcc4da..4ef7d6d 100644
--- a/src/DOMAPI/HTMLCanvasElement.res
+++ b/src/DOMAPI/HTMLCanvasElement.res
@@ -8,6 +8,7 @@ external asHTMLElement: htmlCanvasElement => htmlElement = "%identity"
 external asElement: htmlCanvasElement => element = "%identity"
 external asNode: htmlCanvasElement => node = "%identity"
 external asEventTarget: htmlCanvasElement => eventTarget = "%identity"
+let isInstanceOf = (_: 't): bool => %raw(`param instanceof HTMLCanvasElement`)
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/HTMLElement/focus)
 */
diff --git a/src/DOMAPI/QuerySelector.js b/src/DOMAPI/QuerySelector.js
new file mode 100644
index 0000000..70b1bd8
--- /dev/null
+++ b/src/DOMAPI/QuerySelector.js
@@ -0,0 +1,22 @@
+// Generated by ReScript, PLEASE EDIT WITH CARE
+
+import * as HTMLCanvasElement$WebAPI from "./HTMLCanvasElement.js";
+
+function Impl(T) {
+  let querySelector_htmlCanvasElement = (t, selector) => {
+    let e = t.querySelector(selector);
+    if (e === null || !HTMLCanvasElement$WebAPI.isInstanceOf(e)) {
+      return;
+    } else {
+      return e;
+    }
+  };
+  return {
+    querySelector_htmlCanvasElement: querySelector_htmlCanvasElement
+  };
+}
+
+export {
+  Impl,
+}
+/* No side effect */
diff --git a/src/DOMAPI/QuerySelector.res b/src/DOMAPI/QuerySelector.res
new file mode 100644
index 0000000..096ff96
--- /dev/null
+++ b/src/DOMAPI/QuerySelector.res
@@ -0,0 +1,36 @@
+open Prelude
+open DOMAPI
+
+module Impl = (
+  T: {
+    type t
+  },
+) => {
+  /**
+`querySelector(T.t, string)`
+
+Returns the first element that is a descendant of node that matches selectors.
+If nothing matches, the result is `null`. Use `querySelector_` helpers to get a typed result.
+
+```res
+t->querySelector("#myCanvas")
+```
+
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Document/querySelector)
+  */
+  @send
+  external querySelector: (T.t, string) => null<element> = "querySelector"
+
+  let querySelector_htmlCanvasElement = (t: T.t, selector: string): option<htmlCanvasElement> => {
+    let e = querySelector(t, selector)
+    switch e {
+    | Null.Null => None
+    | Null.Value(e) =>
+      if HTMLCanvasElement.isInstanceOf(e) {
+        Some(unsafeConversation(e))
+      } else {
+        None
+      }
+    }
+  }
+}
diff --git a/tests/DOMAPI/HTMLCanvasElement__tes.js b/tests/DOMAPI/HTMLCanvasElement__tes.js
index c135597..29e9f6a 100644
--- a/tests/DOMAPI/HTMLCanvasElement__tes.js
+++ b/tests/DOMAPI/HTMLCanvasElement__tes.js
@@ -1,39 +1,34 @@
 // Generated by ReScript, PLEASE EDIT WITH CARE
 
+import * as Option from "rescript/lib/es6/Option.js";
+import * as Document$WebAPI from "../../src/DOMAPI/Document.js";
 import * as FillStyle$WebAPI from "../../src/DOMAPI/FillStyle.js";
 
-let myCanvas = document.getElementById("myCanvas");
-
-let ctx = myCanvas.getContext("2d");
-
-ctx.fillStyle = "red";
-
-ctx.fillRect(50, 50, 200, 200);
-
-ctx.fillStyle = "black";
-
-ctx.font = "2px Tahoma";
-
-ctx.textBaseline = "top";
-
-ctx.fillText("MY TEXT", 60, 60);
-
-let color = FillStyle$WebAPI.decode(ctx.fillStyle);
-
-switch (color.TAG) {
-  case "String" :
-    console.log("Color: " + color._0);
-    break;
-  case "CanvasGradient" :
-    console.log("CanvasGradient");
-    break;
-  case "CanvasPattern" :
-    console.log("CanvasPattern");
-    break;
-}
+let myCanvas = Document$WebAPI.querySelector_htmlCanvasElement(document, "#myCanvas");
+
+Option.forEach(myCanvas, myCanvas => {
+  let ctx = myCanvas.getContext("2d");
+  ctx.fillStyle = "red";
+  ctx.fillRect(50, 50, 200, 200);
+  ctx.fillStyle = "black";
+  ctx.font = "2px Tahoma";
+  ctx.textBaseline = "top";
+  ctx.fillText("MY TEXT", 60, 60);
+  let color = FillStyle$WebAPI.decode(ctx.fillStyle);
+  switch (color.TAG) {
+    case "String" :
+      console.log("Color: " + color._0);
+      return;
+    case "CanvasGradient" :
+      console.log("CanvasGradient");
+      return;
+    case "CanvasPattern" :
+      console.log("CanvasPattern");
+      return;
+  }
+});
 
 export {
   myCanvas,
-  ctx,
 }
 /* myCanvas Not a pure module */
diff --git a/tests/DOMAPI/HTMLCanvasElement__tes.res b/tests/DOMAPI/HTMLCanvasElement__tes.res
index 920340b..a99fa9c 100644
--- a/tests/DOMAPI/HTMLCanvasElement__tes.res
+++ b/tests/DOMAPI/HTMLCanvasElement__tes.res
@@ -1,19 +1,22 @@
 open WebAPI.Global
 
-let myCanvas: DOMAPI.htmlCanvasElement =
-  document->Document.getElementById("myCanvas")->Prelude.unsafeConversation
-let ctx = myCanvas->HTMLCanvasElement.getContext_2D
+let myCanvas: option<DOMAPI.htmlCanvasElement> =
+  document->Document.querySelector_htmlCanvasElement("#myCanvas")
 
-ctx.fillStyle = FillStyle.fromString("red")
-ctx->CanvasRenderingContext2D.fillRect(~x=50., ~y=50., ~w=200., ~h=200.)
+myCanvas->Option.forEach(myCanvas => {
+  let ctx = myCanvas->HTMLCanvasElement.getContext_2D
 
-ctx.fillStyle = FillStyle.fromString("black")
-ctx.font = "2px Tahoma"
-ctx.textBaseline = CanvasAPI.Top
-ctx->CanvasRenderingContext2D.fillText(~text="MY TEXT", ~x=60., ~y=60.)
+  ctx.fillStyle = FillStyle.fromString("red")
+  ctx->CanvasRenderingContext2D.fillRect(~x=50., ~y=50., ~w=200., ~h=200.)
 
-switch ctx.fillStyle->FillStyle.decode {
-| FillStyle.String(color) => Console.log(`Color: ${color}`)
-| FillStyle.CanvasGradient(_) => Console.log("CanvasGradient")
-| FillStyle.CanvasPattern(_) => Console.log("CanvasPattern")
-}
+  ctx.fillStyle = FillStyle.fromString("black")
+  ctx.font = "2px Tahoma"
+  ctx.textBaseline = CanvasAPI.Top
+  ctx->CanvasRenderingContext2D.fillText(~text="MY TEXT", ~x=60., ~y=60.)
+
+  switch ctx.fillStyle->FillStyle.decode {
+  | FillStyle.String(color) => Console.log(`Color: ${color}`)
+  | FillStyle.CanvasGradient(_) => Console.log("CanvasGradient")
+  | FillStyle.CanvasPattern(_) => Console.log("CanvasPattern")
+  }
+})

From 374f47c5407fb7ec5c4d1860151f1d0a90c717bd Mon Sep 17 00:00:00 2001
From: nojaf <florian.verdonck@outlook.com>
Date: Mon, 18 Nov 2024 11:56:17 +0100
Subject: [PATCH 2/3] Add example about querySelector usage in inherited
 interfaces.

---
 src/DOMAPI/Document.js                  |  6 ++++++
 src/DOMAPI/HTMLCanvasElement.js         | 11 +----------
 src/DOMAPI/HTMLCanvasElement.res        |  2 +-
 src/DOMAPI/HTMLDivElement.js            | 18 +++++++++++++++++-
 src/DOMAPI/HTMLDivElement.res           |  9 +++------
 src/DOMAPI/QuerySelector.js             | 24 +++++++++++++++++++-----
 src/DOMAPI/QuerySelector.res            | 20 +++++++++++++-------
 tests/DOMAPI/HTMLCanvasElement__tes.js  |  8 ++++++--
 tests/DOMAPI/HTMLCanvasElement__tes.res |  4 +++-
 9 files changed, 69 insertions(+), 33 deletions(-)

diff --git a/src/DOMAPI/Document.js b/src/DOMAPI/Document.js
index c6e4ad6..e8c547a 100644
--- a/src/DOMAPI/Document.js
+++ b/src/DOMAPI/Document.js
@@ -4,9 +4,15 @@ import * as QuerySelector$WebAPI from "./QuerySelector.js";
 
 let include = QuerySelector$WebAPI.Impl({});
 
+let safeQuerySelector = include.safeQuerySelector;
+
 let querySelector_htmlCanvasElement = include.querySelector_htmlCanvasElement;
 
+let querySelector_htmlDivElement = include.querySelector_htmlDivElement;
+
 export {
+  safeQuerySelector,
   querySelector_htmlCanvasElement,
+  querySelector_htmlDivElement,
 }
 /* include Not a pure module */
diff --git a/src/DOMAPI/HTMLCanvasElement.js b/src/DOMAPI/HTMLCanvasElement.js
index 25f61a2..d856702 100644
--- a/src/DOMAPI/HTMLCanvasElement.js
+++ b/src/DOMAPI/HTMLCanvasElement.js
@@ -1,11 +1,2 @@
 // Generated by ReScript, PLEASE EDIT WITH CARE
-
-
-function isInstanceOf(param) {
-  return (param instanceof HTMLCanvasElement);
-}
-
-export {
-  isInstanceOf,
-}
-/* No side effect */
+/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */
diff --git a/src/DOMAPI/HTMLCanvasElement.res b/src/DOMAPI/HTMLCanvasElement.res
index 4ef7d6d..4d089cc 100644
--- a/src/DOMAPI/HTMLCanvasElement.res
+++ b/src/DOMAPI/HTMLCanvasElement.res
@@ -8,7 +8,7 @@ external asHTMLElement: htmlCanvasElement => htmlElement = "%identity"
 external asElement: htmlCanvasElement => element = "%identity"
 external asNode: htmlCanvasElement => node = "%identity"
 external asEventTarget: htmlCanvasElement => eventTarget = "%identity"
-let isInstanceOf = (_: 't): bool => %raw(`param instanceof HTMLCanvasElement`)
+
 /**
 [Read more on MDN](https://developer.mozilla.org/docs/Web/API/HTMLElement/focus)
 */
diff --git a/src/DOMAPI/HTMLDivElement.js b/src/DOMAPI/HTMLDivElement.js
index d856702..e8c547a 100644
--- a/src/DOMAPI/HTMLDivElement.js
+++ b/src/DOMAPI/HTMLDivElement.js
@@ -1,2 +1,18 @@
 // Generated by ReScript, PLEASE EDIT WITH CARE
-/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */
+
+import * as QuerySelector$WebAPI from "./QuerySelector.js";
+
+let include = QuerySelector$WebAPI.Impl({});
+
+let safeQuerySelector = include.safeQuerySelector;
+
+let querySelector_htmlCanvasElement = include.querySelector_htmlCanvasElement;
+
+let querySelector_htmlDivElement = include.querySelector_htmlDivElement;
+
+export {
+  safeQuerySelector,
+  querySelector_htmlCanvasElement,
+  querySelector_htmlDivElement,
+}
+/* include Not a pure module */
diff --git a/src/DOMAPI/HTMLDivElement.res b/src/DOMAPI/HTMLDivElement.res
index cfc7b51..a4732a0 100644
--- a/src/DOMAPI/HTMLDivElement.res
+++ b/src/DOMAPI/HTMLDivElement.res
@@ -72,12 +72,9 @@ Throws a "HierarchyRequestError" DOMException if the constraints of the node tre
 @send
 external replaceChildren2: (htmlDivElement, string) => unit = "replaceChildren"
 
-/**
-Returns the first element that is a descendant of node that matches selectors.
-[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Document/querySelector)
-*/
-@send
-external querySelector: (htmlDivElement, string) => element = "querySelector"
+include QuerySelector.Impl({
+  type t = htmlDivElement
+})
 
 /**
 Returns all element descendants of node that match selectors.
diff --git a/src/DOMAPI/QuerySelector.js b/src/DOMAPI/QuerySelector.js
index 70b1bd8..7e84cac 100644
--- a/src/DOMAPI/QuerySelector.js
+++ b/src/DOMAPI/QuerySelector.js
@@ -1,22 +1,36 @@
 // Generated by ReScript, PLEASE EDIT WITH CARE
 
-import * as HTMLCanvasElement$WebAPI from "./HTMLCanvasElement.js";
+import * as Primitive_option from "rescript/lib/es6/Primitive_option.js";
+
+function isInstanceOfHTMLCanvasElement(param) {
+  return (param instanceof HTMLCanvasElement);
+}
+
+function isInstanceOfHTMLDivElement(param) {
+  return (param instanceof HTMLDivElement);
+}
 
 function Impl(T) {
-  let querySelector_htmlCanvasElement = (t, selector) => {
+  let safeQuerySelector = (predicate, t, selector) => {
     let e = t.querySelector(selector);
-    if (e === null || !HTMLCanvasElement$WebAPI.isInstanceOf(e)) {
+    if (e === null || !predicate(t)) {
       return;
     } else {
-      return e;
+      return Primitive_option.some(e);
     }
   };
+  let querySelector_htmlCanvasElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLCanvasElement, t, selector);
+  let querySelector_htmlDivElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLDivElement, t, selector);
   return {
-    querySelector_htmlCanvasElement: querySelector_htmlCanvasElement
+    safeQuerySelector: safeQuerySelector,
+    querySelector_htmlCanvasElement: querySelector_htmlCanvasElement,
+    querySelector_htmlDivElement: querySelector_htmlDivElement
   };
 }
 
 export {
+  isInstanceOfHTMLCanvasElement,
+  isInstanceOfHTMLDivElement,
   Impl,
 }
 /* No side effect */
diff --git a/src/DOMAPI/QuerySelector.res b/src/DOMAPI/QuerySelector.res
index 096ff96..32b29da 100644
--- a/src/DOMAPI/QuerySelector.res
+++ b/src/DOMAPI/QuerySelector.res
@@ -1,6 +1,9 @@
 open Prelude
 open DOMAPI
 
+let isInstanceOfHTMLCanvasElement = (_: 't): bool => %raw(`param instanceof HTMLCanvasElement`)
+let isInstanceOfHTMLDivElement = (_: 't): bool => %raw(`param instanceof HTMLDivElement`)
+
 module Impl = (
   T: {
     type t
@@ -21,16 +24,19 @@ t->querySelector("#myCanvas")
   @send
   external querySelector: (T.t, string) => null<element> = "querySelector"
 
-  let querySelector_htmlCanvasElement = (t: T.t, selector: string): option<htmlCanvasElement> => {
+  let safeQuerySelector = (predicate: T.t => bool, t: T.t, selector: string): option<'return> => {
     let e = querySelector(t, selector)
     switch e {
     | Null.Null => None
-    | Null.Value(e) =>
-      if HTMLCanvasElement.isInstanceOf(e) {
-        Some(unsafeConversation(e))
-      } else {
-        None
-      }
+    | Null.Value(e) => predicate(t) ? Some(unsafeConversation(e)) : None
     }
   }
+
+  let querySelector_htmlCanvasElement = (t: T.t, selector: string): option<htmlCanvasElement> => {
+    safeQuerySelector(isInstanceOfHTMLCanvasElement, t, selector)
+  }
+
+  let querySelector_htmlDivElement = (t: T.t, selector: string): option<htmlDivElement> => {
+    safeQuerySelector(isInstanceOfHTMLDivElement, t, selector)
+  }
 }
diff --git a/tests/DOMAPI/HTMLCanvasElement__tes.js b/tests/DOMAPI/HTMLCanvasElement__tes.js
index 29e9f6a..f1e62e4 100644
--- a/tests/DOMAPI/HTMLCanvasElement__tes.js
+++ b/tests/DOMAPI/HTMLCanvasElement__tes.js
@@ -3,8 +3,11 @@
 import * as Option from "rescript/lib/es6/Option.js";
 import * as Document$WebAPI from "../../src/DOMAPI/Document.js";
 import * as FillStyle$WebAPI from "../../src/DOMAPI/FillStyle.js";
+import * as HTMLDivElement$WebAPI from "../../src/DOMAPI/HTMLDivElement.js";
 
-let myCanvas = Document$WebAPI.querySelector_htmlCanvasElement(document, "#myCanvas");
+let myDiv = Document$WebAPI.querySelector_htmlDivElement(document, "#myDiv");
+
+let myCanvas = Option.flatMap(myDiv, div => HTMLDivElement$WebAPI.querySelector_htmlCanvasElement(div, "#myCanvas"));
 
 Option.forEach(myCanvas, myCanvas => {
   let ctx = myCanvas.getContext("2d");
@@ -29,6 +32,7 @@ Option.forEach(myCanvas, myCanvas => {
 });
 
 export {
+  myDiv,
   myCanvas,
 }
-/* myCanvas Not a pure module */
+/* myDiv Not a pure module */
diff --git a/tests/DOMAPI/HTMLCanvasElement__tes.res b/tests/DOMAPI/HTMLCanvasElement__tes.res
index a99fa9c..d427b3a 100644
--- a/tests/DOMAPI/HTMLCanvasElement__tes.res
+++ b/tests/DOMAPI/HTMLCanvasElement__tes.res
@@ -1,7 +1,9 @@
 open WebAPI.Global
 
+let myDiv = document->Document.querySelector_htmlDivElement("#myDiv")
+
 let myCanvas: option<DOMAPI.htmlCanvasElement> =
-  document->Document.querySelector_htmlCanvasElement("#myCanvas")
+  myDiv->Option.flatMap(div => div->HTMLDivElement.querySelector_htmlCanvasElement("#myCanvas"))
 
 myCanvas->Option.forEach(myCanvas => {
   let ctx = myCanvas->HTMLCanvasElement.getContext_2D

From 54c0cc8ddfa25e5f9fd9fce7a805f1814776a854 Mon Sep 17 00:00:00 2001
From: nojaf <florian.verdonck@outlook.com>
Date: Mon, 18 Nov 2024 16:07:36 +0100
Subject: [PATCH 3/3] Add all querySelector helpers

---
 src/DOMAPI.res               |  29 +++
 src/DOMAPI/Document.js       | 186 +++++++++++++++
 src/DOMAPI/HTMLDivElement.js | 186 +++++++++++++++
 src/DOMAPI/QuerySelector.js  | 436 ++++++++++++++++++++++++++++++++++-
 src/DOMAPI/QuerySelector.res | 277 +++++++++++++++++++++-
 5 files changed, 1112 insertions(+), 2 deletions(-)

diff --git a/src/DOMAPI.res b/src/DOMAPI.res
index df04130..3261920 100644
--- a/src/DOMAPI.res
+++ b/src/DOMAPI.res
@@ -7442,6 +7442,19 @@ and htmlTableRowElement = {
   cells: htmlCollectionOf<htmlTableCellElement>,
 }
 
+/**
+Provides special properties (beyond the HTMLElement interface it also has available to it inheritance) for manipulating single or grouped table column elements.
+[See HTMLTableColElement on MDN](https://developer.mozilla.org/docs/Web/API/HTMLTableColElement)
+*/
+type htmlTableColElement = {
+  ...htmlElement,
+  /**
+    Sets or retrieves the number of columns in the group.
+    [Read more on MDN](https://developer.mozilla.org/docs/Web/API/HTMLTableColElement/span)
+    */
+  mutable span: int,
+}
+
 /**
 Provides properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <button> elements.
 [See HTMLButtonElement on MDN](https://developer.mozilla.org/docs/Web/API/HTMLButtonElement)
@@ -8307,6 +8320,22 @@ type htmlDataElement = {
   mutable value: string,
 }
 
+/**
+[See HTMLDetailsElement on MDN](https://developer.mozilla.org/docs/Web/API/HTMLDetailsElement)
+*/
+type htmlDetailsElement = {
+  ...htmlElement,
+  /**
+    [Read more on MDN](https://developer.mozilla.org/docs/Web/API/HTMLDetailsElement/open)
+    */
+  mutable name: string,
+  /**
+    [Read more on MDN](https://developer.mozilla.org/docs/Web/API/HTMLDetailsElement/open)
+    */
+  @as("open")
+  mutable open_: bool,
+}
+
 /**
 [See HTMLDialogElement on MDN](https://developer.mozilla.org/docs/Web/API/HTMLDialogElement)
 */
diff --git a/src/DOMAPI/Document.js b/src/DOMAPI/Document.js
index e8c547a..54c6311 100644
--- a/src/DOMAPI/Document.js
+++ b/src/DOMAPI/Document.js
@@ -6,13 +6,199 @@ let include = QuerySelector$WebAPI.Impl({});
 
 let safeQuerySelector = include.safeQuerySelector;
 
+let querySelector_htmlAnchorElement = include.querySelector_htmlAnchorElement;
+
+let querySelector_htmlAreaElement = include.querySelector_htmlAreaElement;
+
+let querySelector_htmlAudioElement = include.querySelector_htmlAudioElement;
+
+let querySelector_htmlBaseElement = include.querySelector_htmlBaseElement;
+
+let querySelector_htmlBodyElement = include.querySelector_htmlBodyElement;
+
+let querySelector_htmlBRElement = include.querySelector_htmlBRElement;
+
+let querySelector_htmlButtonElement = include.querySelector_htmlButtonElement;
+
 let querySelector_htmlCanvasElement = include.querySelector_htmlCanvasElement;
 
+let querySelector_htmlDataElement = include.querySelector_htmlDataElement;
+
+let querySelector_htmlDataListElement = include.querySelector_htmlDataListElement;
+
+let querySelector_htmlDetailsElement = include.querySelector_htmlDetailsElement;
+
+let querySelector_htmlDialogElement = include.querySelector_htmlDialogElement;
+
 let querySelector_htmlDivElement = include.querySelector_htmlDivElement;
 
+let querySelector_htmlDListElement = include.querySelector_htmlDListElement;
+
+let querySelector_htmlEmbedElement = include.querySelector_htmlEmbedElement;
+
+let querySelector_htmlFieldSetElement = include.querySelector_htmlFieldSetElement;
+
+let querySelector_htmlFormElement = include.querySelector_htmlFormElement;
+
+let querySelector_htmlHRElement = include.querySelector_htmlHRElement;
+
+let querySelector_htmlHeadElement = include.querySelector_htmlHeadElement;
+
+let querySelector_htmlHeadingElement = include.querySelector_htmlHeadingElement;
+
+let querySelector_htmlHtmlElement = include.querySelector_htmlHtmlElement;
+
+let querySelector_htmlIFrameElement = include.querySelector_htmlIFrameElement;
+
+let querySelector_htmlImageElement = include.querySelector_htmlImageElement;
+
+let querySelector_htmlInputElement = include.querySelector_htmlInputElement;
+
+let querySelector_htmlLabelElement = include.querySelector_htmlLabelElement;
+
+let querySelector_htmlLegendElement = include.querySelector_htmlLegendElement;
+
+let querySelector_htmlLIElement = include.querySelector_htmlLIElement;
+
+let querySelector_htmlLinkElement = include.querySelector_htmlLinkElement;
+
+let querySelector_htmlMapElement = include.querySelector_htmlMapElement;
+
+let querySelector_htmlMediaElement = include.querySelector_htmlMediaElement;
+
+let querySelector_htmlMenuElement = include.querySelector_htmlMenuElement;
+
+let querySelector_htmlMetaElement = include.querySelector_htmlMetaElement;
+
+let querySelector_htmlMeterElement = include.querySelector_htmlMeterElement;
+
+let querySelector_htmlModElement = include.querySelector_htmlModElement;
+
+let querySelector_htmlObjectElement = include.querySelector_htmlObjectElement;
+
+let querySelector_htmlOListElement = include.querySelector_htmlOListElement;
+
+let querySelector_htmlOptGroupElement = include.querySelector_htmlOptGroupElement;
+
+let querySelector_htmlOptionElement = include.querySelector_htmlOptionElement;
+
+let querySelector_htmlOutputElement = include.querySelector_htmlOutputElement;
+
+let querySelector_htmlParagraphElement = include.querySelector_htmlParagraphElement;
+
+let querySelector_htmlPictureElement = include.querySelector_htmlPictureElement;
+
+let querySelector_htmlPreElement = include.querySelector_htmlPreElement;
+
+let querySelector_htmlProgressElement = include.querySelector_htmlProgressElement;
+
+let querySelector_htmlQuoteElement = include.querySelector_htmlQuoteElement;
+
+let querySelector_htmlScriptElement = include.querySelector_htmlScriptElement;
+
+let querySelector_htmlSelectElement = include.querySelector_htmlSelectElement;
+
+let querySelector_htmlSlotElement = include.querySelector_htmlSlotElement;
+
+let querySelector_htmlSourceElement = include.querySelector_htmlSourceElement;
+
+let querySelector_htmlSpanElement = include.querySelector_htmlSpanElement;
+
+let querySelector_htmlStyleElement = include.querySelector_htmlStyleElement;
+
+let querySelector_htmlTableCaptionElement = include.querySelector_htmlTableCaptionElement;
+
+let querySelector_htmlTableCellElement = include.querySelector_htmlTableCellElement;
+
+let querySelector_htmlTableColElement = include.querySelector_htmlTableColElement;
+
+let querySelector_htmlTableElement = include.querySelector_htmlTableElement;
+
+let querySelector_htmlTableRowElement = include.querySelector_htmlTableRowElement;
+
+let querySelector_htmlTableSectionElement = include.querySelector_htmlTableSectionElement;
+
+let querySelector_htmlTemplateElement = include.querySelector_htmlTemplateElement;
+
+let querySelector_htmlTextAreaElement = include.querySelector_htmlTextAreaElement;
+
+let querySelector_htmlTimeElement = include.querySelector_htmlTimeElement;
+
+let querySelector_htmlTitleElement = include.querySelector_htmlTitleElement;
+
+let querySelector_htmlTrackElement = include.querySelector_htmlTrackElement;
+
+let querySelector_htmlUListElement = include.querySelector_htmlUListElement;
+
+let querySelector_htmlUnknownElement = include.querySelector_htmlUnknownElement;
+
+let querySelector_htmlVideoElement = include.querySelector_htmlVideoElement;
+
 export {
   safeQuerySelector,
+  querySelector_htmlAnchorElement,
+  querySelector_htmlAreaElement,
+  querySelector_htmlAudioElement,
+  querySelector_htmlBaseElement,
+  querySelector_htmlBodyElement,
+  querySelector_htmlBRElement,
+  querySelector_htmlButtonElement,
   querySelector_htmlCanvasElement,
+  querySelector_htmlDataElement,
+  querySelector_htmlDataListElement,
+  querySelector_htmlDetailsElement,
+  querySelector_htmlDialogElement,
   querySelector_htmlDivElement,
+  querySelector_htmlDListElement,
+  querySelector_htmlEmbedElement,
+  querySelector_htmlFieldSetElement,
+  querySelector_htmlFormElement,
+  querySelector_htmlHRElement,
+  querySelector_htmlHeadElement,
+  querySelector_htmlHeadingElement,
+  querySelector_htmlHtmlElement,
+  querySelector_htmlIFrameElement,
+  querySelector_htmlImageElement,
+  querySelector_htmlInputElement,
+  querySelector_htmlLabelElement,
+  querySelector_htmlLegendElement,
+  querySelector_htmlLIElement,
+  querySelector_htmlLinkElement,
+  querySelector_htmlMapElement,
+  querySelector_htmlMediaElement,
+  querySelector_htmlMenuElement,
+  querySelector_htmlMetaElement,
+  querySelector_htmlMeterElement,
+  querySelector_htmlModElement,
+  querySelector_htmlObjectElement,
+  querySelector_htmlOListElement,
+  querySelector_htmlOptGroupElement,
+  querySelector_htmlOptionElement,
+  querySelector_htmlOutputElement,
+  querySelector_htmlParagraphElement,
+  querySelector_htmlPictureElement,
+  querySelector_htmlPreElement,
+  querySelector_htmlProgressElement,
+  querySelector_htmlQuoteElement,
+  querySelector_htmlScriptElement,
+  querySelector_htmlSelectElement,
+  querySelector_htmlSlotElement,
+  querySelector_htmlSourceElement,
+  querySelector_htmlSpanElement,
+  querySelector_htmlStyleElement,
+  querySelector_htmlTableCaptionElement,
+  querySelector_htmlTableCellElement,
+  querySelector_htmlTableColElement,
+  querySelector_htmlTableElement,
+  querySelector_htmlTableRowElement,
+  querySelector_htmlTableSectionElement,
+  querySelector_htmlTemplateElement,
+  querySelector_htmlTextAreaElement,
+  querySelector_htmlTimeElement,
+  querySelector_htmlTitleElement,
+  querySelector_htmlTrackElement,
+  querySelector_htmlUListElement,
+  querySelector_htmlUnknownElement,
+  querySelector_htmlVideoElement,
 }
 /* include Not a pure module */
diff --git a/src/DOMAPI/HTMLDivElement.js b/src/DOMAPI/HTMLDivElement.js
index e8c547a..54c6311 100644
--- a/src/DOMAPI/HTMLDivElement.js
+++ b/src/DOMAPI/HTMLDivElement.js
@@ -6,13 +6,199 @@ let include = QuerySelector$WebAPI.Impl({});
 
 let safeQuerySelector = include.safeQuerySelector;
 
+let querySelector_htmlAnchorElement = include.querySelector_htmlAnchorElement;
+
+let querySelector_htmlAreaElement = include.querySelector_htmlAreaElement;
+
+let querySelector_htmlAudioElement = include.querySelector_htmlAudioElement;
+
+let querySelector_htmlBaseElement = include.querySelector_htmlBaseElement;
+
+let querySelector_htmlBodyElement = include.querySelector_htmlBodyElement;
+
+let querySelector_htmlBRElement = include.querySelector_htmlBRElement;
+
+let querySelector_htmlButtonElement = include.querySelector_htmlButtonElement;
+
 let querySelector_htmlCanvasElement = include.querySelector_htmlCanvasElement;
 
+let querySelector_htmlDataElement = include.querySelector_htmlDataElement;
+
+let querySelector_htmlDataListElement = include.querySelector_htmlDataListElement;
+
+let querySelector_htmlDetailsElement = include.querySelector_htmlDetailsElement;
+
+let querySelector_htmlDialogElement = include.querySelector_htmlDialogElement;
+
 let querySelector_htmlDivElement = include.querySelector_htmlDivElement;
 
+let querySelector_htmlDListElement = include.querySelector_htmlDListElement;
+
+let querySelector_htmlEmbedElement = include.querySelector_htmlEmbedElement;
+
+let querySelector_htmlFieldSetElement = include.querySelector_htmlFieldSetElement;
+
+let querySelector_htmlFormElement = include.querySelector_htmlFormElement;
+
+let querySelector_htmlHRElement = include.querySelector_htmlHRElement;
+
+let querySelector_htmlHeadElement = include.querySelector_htmlHeadElement;
+
+let querySelector_htmlHeadingElement = include.querySelector_htmlHeadingElement;
+
+let querySelector_htmlHtmlElement = include.querySelector_htmlHtmlElement;
+
+let querySelector_htmlIFrameElement = include.querySelector_htmlIFrameElement;
+
+let querySelector_htmlImageElement = include.querySelector_htmlImageElement;
+
+let querySelector_htmlInputElement = include.querySelector_htmlInputElement;
+
+let querySelector_htmlLabelElement = include.querySelector_htmlLabelElement;
+
+let querySelector_htmlLegendElement = include.querySelector_htmlLegendElement;
+
+let querySelector_htmlLIElement = include.querySelector_htmlLIElement;
+
+let querySelector_htmlLinkElement = include.querySelector_htmlLinkElement;
+
+let querySelector_htmlMapElement = include.querySelector_htmlMapElement;
+
+let querySelector_htmlMediaElement = include.querySelector_htmlMediaElement;
+
+let querySelector_htmlMenuElement = include.querySelector_htmlMenuElement;
+
+let querySelector_htmlMetaElement = include.querySelector_htmlMetaElement;
+
+let querySelector_htmlMeterElement = include.querySelector_htmlMeterElement;
+
+let querySelector_htmlModElement = include.querySelector_htmlModElement;
+
+let querySelector_htmlObjectElement = include.querySelector_htmlObjectElement;
+
+let querySelector_htmlOListElement = include.querySelector_htmlOListElement;
+
+let querySelector_htmlOptGroupElement = include.querySelector_htmlOptGroupElement;
+
+let querySelector_htmlOptionElement = include.querySelector_htmlOptionElement;
+
+let querySelector_htmlOutputElement = include.querySelector_htmlOutputElement;
+
+let querySelector_htmlParagraphElement = include.querySelector_htmlParagraphElement;
+
+let querySelector_htmlPictureElement = include.querySelector_htmlPictureElement;
+
+let querySelector_htmlPreElement = include.querySelector_htmlPreElement;
+
+let querySelector_htmlProgressElement = include.querySelector_htmlProgressElement;
+
+let querySelector_htmlQuoteElement = include.querySelector_htmlQuoteElement;
+
+let querySelector_htmlScriptElement = include.querySelector_htmlScriptElement;
+
+let querySelector_htmlSelectElement = include.querySelector_htmlSelectElement;
+
+let querySelector_htmlSlotElement = include.querySelector_htmlSlotElement;
+
+let querySelector_htmlSourceElement = include.querySelector_htmlSourceElement;
+
+let querySelector_htmlSpanElement = include.querySelector_htmlSpanElement;
+
+let querySelector_htmlStyleElement = include.querySelector_htmlStyleElement;
+
+let querySelector_htmlTableCaptionElement = include.querySelector_htmlTableCaptionElement;
+
+let querySelector_htmlTableCellElement = include.querySelector_htmlTableCellElement;
+
+let querySelector_htmlTableColElement = include.querySelector_htmlTableColElement;
+
+let querySelector_htmlTableElement = include.querySelector_htmlTableElement;
+
+let querySelector_htmlTableRowElement = include.querySelector_htmlTableRowElement;
+
+let querySelector_htmlTableSectionElement = include.querySelector_htmlTableSectionElement;
+
+let querySelector_htmlTemplateElement = include.querySelector_htmlTemplateElement;
+
+let querySelector_htmlTextAreaElement = include.querySelector_htmlTextAreaElement;
+
+let querySelector_htmlTimeElement = include.querySelector_htmlTimeElement;
+
+let querySelector_htmlTitleElement = include.querySelector_htmlTitleElement;
+
+let querySelector_htmlTrackElement = include.querySelector_htmlTrackElement;
+
+let querySelector_htmlUListElement = include.querySelector_htmlUListElement;
+
+let querySelector_htmlUnknownElement = include.querySelector_htmlUnknownElement;
+
+let querySelector_htmlVideoElement = include.querySelector_htmlVideoElement;
+
 export {
   safeQuerySelector,
+  querySelector_htmlAnchorElement,
+  querySelector_htmlAreaElement,
+  querySelector_htmlAudioElement,
+  querySelector_htmlBaseElement,
+  querySelector_htmlBodyElement,
+  querySelector_htmlBRElement,
+  querySelector_htmlButtonElement,
   querySelector_htmlCanvasElement,
+  querySelector_htmlDataElement,
+  querySelector_htmlDataListElement,
+  querySelector_htmlDetailsElement,
+  querySelector_htmlDialogElement,
   querySelector_htmlDivElement,
+  querySelector_htmlDListElement,
+  querySelector_htmlEmbedElement,
+  querySelector_htmlFieldSetElement,
+  querySelector_htmlFormElement,
+  querySelector_htmlHRElement,
+  querySelector_htmlHeadElement,
+  querySelector_htmlHeadingElement,
+  querySelector_htmlHtmlElement,
+  querySelector_htmlIFrameElement,
+  querySelector_htmlImageElement,
+  querySelector_htmlInputElement,
+  querySelector_htmlLabelElement,
+  querySelector_htmlLegendElement,
+  querySelector_htmlLIElement,
+  querySelector_htmlLinkElement,
+  querySelector_htmlMapElement,
+  querySelector_htmlMediaElement,
+  querySelector_htmlMenuElement,
+  querySelector_htmlMetaElement,
+  querySelector_htmlMeterElement,
+  querySelector_htmlModElement,
+  querySelector_htmlObjectElement,
+  querySelector_htmlOListElement,
+  querySelector_htmlOptGroupElement,
+  querySelector_htmlOptionElement,
+  querySelector_htmlOutputElement,
+  querySelector_htmlParagraphElement,
+  querySelector_htmlPictureElement,
+  querySelector_htmlPreElement,
+  querySelector_htmlProgressElement,
+  querySelector_htmlQuoteElement,
+  querySelector_htmlScriptElement,
+  querySelector_htmlSelectElement,
+  querySelector_htmlSlotElement,
+  querySelector_htmlSourceElement,
+  querySelector_htmlSpanElement,
+  querySelector_htmlStyleElement,
+  querySelector_htmlTableCaptionElement,
+  querySelector_htmlTableCellElement,
+  querySelector_htmlTableColElement,
+  querySelector_htmlTableElement,
+  querySelector_htmlTableRowElement,
+  querySelector_htmlTableSectionElement,
+  querySelector_htmlTemplateElement,
+  querySelector_htmlTextAreaElement,
+  querySelector_htmlTimeElement,
+  querySelector_htmlTitleElement,
+  querySelector_htmlTrackElement,
+  querySelector_htmlUListElement,
+  querySelector_htmlUnknownElement,
+  querySelector_htmlVideoElement,
 }
 /* include Not a pure module */
diff --git a/src/DOMAPI/QuerySelector.js b/src/DOMAPI/QuerySelector.js
index 7e84cac..8fd8a2e 100644
--- a/src/DOMAPI/QuerySelector.js
+++ b/src/DOMAPI/QuerySelector.js
@@ -2,14 +2,262 @@
 
 import * as Primitive_option from "rescript/lib/es6/Primitive_option.js";
 
+function isInstanceOfHTMLAnchorElement(param) {
+  return (param instanceof HTMLAnchorElement);
+}
+
+function isInstanceOfHTMLAreaElement(param) {
+  return (param instanceof HTMLAreaElement);
+}
+
+function isInstanceOfHTMLAudioElement(param) {
+  return (param instanceof HTMLAudioElement);
+}
+
+function isInstanceOfHTMLBaseElement(param) {
+  return (param instanceof HTMLBaseElement);
+}
+
+function isInstanceOfHTMLBodyElement(param) {
+  return (param instanceof HTMLBodyElement);
+}
+
+function isInstanceOfHTMLBRElement(param) {
+  return (param instanceof HTMLBRElement);
+}
+
+function isInstanceOfHTMLButtonElement(param) {
+  return (param instanceof HTMLButtonElement);
+}
+
 function isInstanceOfHTMLCanvasElement(param) {
   return (param instanceof HTMLCanvasElement);
 }
 
+function isInstanceOfHTMLDataElement(param) {
+  return (param instanceof HTMLDataElement);
+}
+
+function isInstanceOfHTMLDataListElement(param) {
+  return (param instanceof HTMLDataListElement);
+}
+
+function isInstanceOfHTMLDetailsElement(param) {
+  return (param instanceof HTMLDetailsElement);
+}
+
+function isInstanceOfHTMLDialogElement(param) {
+  return (param instanceof HTMLDialogElement);
+}
+
 function isInstanceOfHTMLDivElement(param) {
   return (param instanceof HTMLDivElement);
 }
 
+function isInstanceOfHTMLDListElement(param) {
+  return (param instanceof HTMLDListElement);
+}
+
+function isInstanceOfHTMLEmbedElement(param) {
+  return (param instanceof HTMLEmbedElement);
+}
+
+function isInstanceOfHTMLFieldSetElement(param) {
+  return (param instanceof HTMLFieldSetElement);
+}
+
+function isInstanceOfHTMLFormElement(param) {
+  return (param instanceof HTMLFormElement);
+}
+
+function isInstanceOfHTMLHRElement(param) {
+  return (param instanceof HTMLHRElement);
+}
+
+function isInstanceOfHTMLHeadElement(param) {
+  return (param instanceof HTMLHeadElement);
+}
+
+function isInstanceOfHTMLHeadingElement(param) {
+  return (param instanceof HTMLHeadingElement);
+}
+
+function isInstanceOfHTMLHtmlElement(param) {
+  return (param instanceof HTMLHtmlElement);
+}
+
+function isInstanceOfHTMLIFrameElement(param) {
+  return (param instanceof HTMLIFrameElement);
+}
+
+function isInstanceOfHTMLImageElement(param) {
+  return (param instanceof HTMLImageElement);
+}
+
+function isInstanceOfHTMLInputElement(param) {
+  return (param instanceof HTMLInputElement);
+}
+
+function isInstanceOfHTMLLabelElement(param) {
+  return (param instanceof HTMLLabelElement);
+}
+
+function isInstanceOfHTMLLegendElement(param) {
+  return (param instanceof HTMLLegendElement);
+}
+
+function isInstanceOfHTMLLIElement(param) {
+  return (param instanceof HTMLLIElement);
+}
+
+function isInstanceOfHTMLLinkElement(param) {
+  return (param instanceof HTMLLinkElement);
+}
+
+function isInstanceOfHTMLMapElement(param) {
+  return (param instanceof HTMLMapElement);
+}
+
+function isInstanceOfHTMLMediaElement(param) {
+  return (param instanceof HTMLMediaElement);
+}
+
+function isInstanceOfHTMLMenuElement(param) {
+  return (param instanceof HTMLMenuElement);
+}
+
+function isInstanceOfHTMLMetaElement(param) {
+  return (param instanceof HTMLMetaElement);
+}
+
+function isInstanceOfHTMLMeterElement(param) {
+  return (param instanceof HTMLMeterElement);
+}
+
+function isInstanceOfHTMLModElement(param) {
+  return (param instanceof HTMLModElement);
+}
+
+function isInstanceOfHTMLObjectElement(param) {
+  return (param instanceof HTMLObjectElement);
+}
+
+function isInstanceOfHTMLOListElement(param) {
+  return (param instanceof HTMLOListElement);
+}
+
+function isInstanceOfHTMLOptGroupElement(param) {
+  return (param instanceof HTMLOptGroupElement);
+}
+
+function isInstanceOfHTMLOptionElement(param) {
+  return (param instanceof HTMLOptionElement);
+}
+
+function isInstanceOfHTMLOutputElement(param) {
+  return (param instanceof HTMLOutputElement);
+}
+
+function isInstanceOfHTMLParagraphElement(param) {
+  return (param instanceof HTMLParagraphElement);
+}
+
+function isInstanceOfHTMLPictureElement(param) {
+  return (param instanceof HTMLPictureElement);
+}
+
+function isInstanceOfHTMLPreElement(param) {
+  return (param instanceof HTMLPreElement);
+}
+
+function isInstanceOfHTMLProgressElement(param) {
+  return (param instanceof HTMLProgressElement);
+}
+
+function isInstanceOfHTMLQuoteElement(param) {
+  return (param instanceof HTMLQuoteElement);
+}
+
+function isInstanceOfHTMLScriptElement(param) {
+  return (param instanceof HTMLScriptElement);
+}
+
+function isInstanceOfHTMLSelectElement(param) {
+  return (param instanceof HTMLSelectElement);
+}
+
+function isInstanceOfHTMLSlotElement(param) {
+  return (param instanceof HTMLSlotElement);
+}
+
+function isInstanceOfHTMLSourceElement(param) {
+  return (param instanceof HTMLSourceElement);
+}
+
+function isInstanceOfHTMLSpanElement(param) {
+  return (param instanceof HTMLSpanElement);
+}
+
+function isInstanceOfHTMLStyleElement(param) {
+  return (param instanceof HTMLStyleElement);
+}
+
+function isInstanceOfHTMLTableCaptionElement(param) {
+  return (param instanceof HTMLTableCaptionElement);
+}
+
+function isInstanceOfHTMLTableCellElement(param) {
+  return (param instanceof HTMLTableCellElement);
+}
+
+function isInstanceOfHTMLTableColElement(param) {
+  return (param instanceof HTMLTableColElement);
+}
+
+function isInstanceOfHTMLTableElement(param) {
+  return (param instanceof HTMLTableElement);
+}
+
+function isInstanceOfHTMLTableRowElement(param) {
+  return (param instanceof HTMLTableRowElement);
+}
+
+function isInstanceOfHTMLTableSectionElement(param) {
+  return (param instanceof HTMLTableSectionElement);
+}
+
+function isInstanceOfHTMLTemplateElement(param) {
+  return (param instanceof HTMLTemplateElement);
+}
+
+function isInstanceOfHTMLTextAreaElement(param) {
+  return (param instanceof HTMLTextAreaElement);
+}
+
+function isInstanceOfHTMLTimeElement(param) {
+  return (param instanceof HTMLTimeElement);
+}
+
+function isInstanceOfHTMLTitleElement(param) {
+  return (param instanceof HTMLTitleElement);
+}
+
+function isInstanceOfHTMLTrackElement(param) {
+  return (param instanceof HTMLTrackElement);
+}
+
+function isInstanceOfHTMLUListElement(param) {
+  return (param instanceof HTMLUListElement);
+}
+
+function isInstanceOfHTMLUnknownElement(param) {
+  return (param instanceof HTMLUnknownElement);
+}
+
+function isInstanceOfHTMLVideoElement(param) {
+  return (param instanceof HTMLVideoElement);
+}
+
 function Impl(T) {
   let safeQuerySelector = (predicate, t, selector) => {
     let e = t.querySelector(selector);
@@ -19,18 +267,204 @@ function Impl(T) {
       return Primitive_option.some(e);
     }
   };
+  let querySelector_htmlAnchorElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLAnchorElement, t, selector);
+  let querySelector_htmlAreaElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLAreaElement, t, selector);
+  let querySelector_htmlAudioElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLAudioElement, t, selector);
+  let querySelector_htmlBaseElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLBaseElement, t, selector);
+  let querySelector_htmlBodyElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLBodyElement, t, selector);
+  let querySelector_htmlBRElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLBRElement, t, selector);
+  let querySelector_htmlButtonElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLButtonElement, t, selector);
   let querySelector_htmlCanvasElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLCanvasElement, t, selector);
+  let querySelector_htmlDataElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLDataElement, t, selector);
+  let querySelector_htmlDataListElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLDataListElement, t, selector);
+  let querySelector_htmlDetailsElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLDetailsElement, t, selector);
+  let querySelector_htmlDialogElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLDialogElement, t, selector);
   let querySelector_htmlDivElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLDivElement, t, selector);
+  let querySelector_htmlDListElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLDListElement, t, selector);
+  let querySelector_htmlEmbedElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLEmbedElement, t, selector);
+  let querySelector_htmlFieldSetElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLFieldSetElement, t, selector);
+  let querySelector_htmlFormElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLFormElement, t, selector);
+  let querySelector_htmlHRElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLHRElement, t, selector);
+  let querySelector_htmlHeadElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLHeadElement, t, selector);
+  let querySelector_htmlHeadingElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLHeadingElement, t, selector);
+  let querySelector_htmlHtmlElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLHtmlElement, t, selector);
+  let querySelector_htmlIFrameElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLIFrameElement, t, selector);
+  let querySelector_htmlImageElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLImageElement, t, selector);
+  let querySelector_htmlInputElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLInputElement, t, selector);
+  let querySelector_htmlLabelElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLLabelElement, t, selector);
+  let querySelector_htmlLegendElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLLegendElement, t, selector);
+  let querySelector_htmlLIElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLLIElement, t, selector);
+  let querySelector_htmlLinkElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLLinkElement, t, selector);
+  let querySelector_htmlMapElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLMapElement, t, selector);
+  let querySelector_htmlMediaElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLMediaElement, t, selector);
+  let querySelector_htmlMenuElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLMenuElement, t, selector);
+  let querySelector_htmlMetaElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLMetaElement, t, selector);
+  let querySelector_htmlMeterElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLMeterElement, t, selector);
+  let querySelector_htmlModElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLModElement, t, selector);
+  let querySelector_htmlObjectElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLObjectElement, t, selector);
+  let querySelector_htmlOListElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLOListElement, t, selector);
+  let querySelector_htmlOptGroupElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLOptGroupElement, t, selector);
+  let querySelector_htmlOptionElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLOptionElement, t, selector);
+  let querySelector_htmlOutputElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLOutputElement, t, selector);
+  let querySelector_htmlParagraphElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLParagraphElement, t, selector);
+  let querySelector_htmlPictureElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLPictureElement, t, selector);
+  let querySelector_htmlPreElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLPreElement, t, selector);
+  let querySelector_htmlProgressElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLProgressElement, t, selector);
+  let querySelector_htmlQuoteElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLQuoteElement, t, selector);
+  let querySelector_htmlScriptElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLScriptElement, t, selector);
+  let querySelector_htmlSelectElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLSelectElement, t, selector);
+  let querySelector_htmlSlotElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLSlotElement, t, selector);
+  let querySelector_htmlSourceElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLSourceElement, t, selector);
+  let querySelector_htmlSpanElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLSpanElement, t, selector);
+  let querySelector_htmlStyleElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLStyleElement, t, selector);
+  let querySelector_htmlTableCaptionElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTableCaptionElement, t, selector);
+  let querySelector_htmlTableCellElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTableCellElement, t, selector);
+  let querySelector_htmlTableColElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTableColElement, t, selector);
+  let querySelector_htmlTableElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTableElement, t, selector);
+  let querySelector_htmlTableRowElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTableRowElement, t, selector);
+  let querySelector_htmlTableSectionElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTableSectionElement, t, selector);
+  let querySelector_htmlTemplateElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTemplateElement, t, selector);
+  let querySelector_htmlTextAreaElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTextAreaElement, t, selector);
+  let querySelector_htmlTimeElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTimeElement, t, selector);
+  let querySelector_htmlTitleElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTitleElement, t, selector);
+  let querySelector_htmlTrackElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLTrackElement, t, selector);
+  let querySelector_htmlUListElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLUListElement, t, selector);
+  let querySelector_htmlUnknownElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLUnknownElement, t, selector);
+  let querySelector_htmlVideoElement = (t, selector) => safeQuerySelector(isInstanceOfHTMLVideoElement, t, selector);
   return {
     safeQuerySelector: safeQuerySelector,
+    querySelector_htmlAnchorElement: querySelector_htmlAnchorElement,
+    querySelector_htmlAreaElement: querySelector_htmlAreaElement,
+    querySelector_htmlAudioElement: querySelector_htmlAudioElement,
+    querySelector_htmlBaseElement: querySelector_htmlBaseElement,
+    querySelector_htmlBodyElement: querySelector_htmlBodyElement,
+    querySelector_htmlBRElement: querySelector_htmlBRElement,
+    querySelector_htmlButtonElement: querySelector_htmlButtonElement,
     querySelector_htmlCanvasElement: querySelector_htmlCanvasElement,
-    querySelector_htmlDivElement: querySelector_htmlDivElement
+    querySelector_htmlDataElement: querySelector_htmlDataElement,
+    querySelector_htmlDataListElement: querySelector_htmlDataListElement,
+    querySelector_htmlDetailsElement: querySelector_htmlDetailsElement,
+    querySelector_htmlDialogElement: querySelector_htmlDialogElement,
+    querySelector_htmlDivElement: querySelector_htmlDivElement,
+    querySelector_htmlDListElement: querySelector_htmlDListElement,
+    querySelector_htmlEmbedElement: querySelector_htmlEmbedElement,
+    querySelector_htmlFieldSetElement: querySelector_htmlFieldSetElement,
+    querySelector_htmlFormElement: querySelector_htmlFormElement,
+    querySelector_htmlHRElement: querySelector_htmlHRElement,
+    querySelector_htmlHeadElement: querySelector_htmlHeadElement,
+    querySelector_htmlHeadingElement: querySelector_htmlHeadingElement,
+    querySelector_htmlHtmlElement: querySelector_htmlHtmlElement,
+    querySelector_htmlIFrameElement: querySelector_htmlIFrameElement,
+    querySelector_htmlImageElement: querySelector_htmlImageElement,
+    querySelector_htmlInputElement: querySelector_htmlInputElement,
+    querySelector_htmlLabelElement: querySelector_htmlLabelElement,
+    querySelector_htmlLegendElement: querySelector_htmlLegendElement,
+    querySelector_htmlLIElement: querySelector_htmlLIElement,
+    querySelector_htmlLinkElement: querySelector_htmlLinkElement,
+    querySelector_htmlMapElement: querySelector_htmlMapElement,
+    querySelector_htmlMediaElement: querySelector_htmlMediaElement,
+    querySelector_htmlMenuElement: querySelector_htmlMenuElement,
+    querySelector_htmlMetaElement: querySelector_htmlMetaElement,
+    querySelector_htmlMeterElement: querySelector_htmlMeterElement,
+    querySelector_htmlModElement: querySelector_htmlModElement,
+    querySelector_htmlObjectElement: querySelector_htmlObjectElement,
+    querySelector_htmlOListElement: querySelector_htmlOListElement,
+    querySelector_htmlOptGroupElement: querySelector_htmlOptGroupElement,
+    querySelector_htmlOptionElement: querySelector_htmlOptionElement,
+    querySelector_htmlOutputElement: querySelector_htmlOutputElement,
+    querySelector_htmlParagraphElement: querySelector_htmlParagraphElement,
+    querySelector_htmlPictureElement: querySelector_htmlPictureElement,
+    querySelector_htmlPreElement: querySelector_htmlPreElement,
+    querySelector_htmlProgressElement: querySelector_htmlProgressElement,
+    querySelector_htmlQuoteElement: querySelector_htmlQuoteElement,
+    querySelector_htmlScriptElement: querySelector_htmlScriptElement,
+    querySelector_htmlSelectElement: querySelector_htmlSelectElement,
+    querySelector_htmlSlotElement: querySelector_htmlSlotElement,
+    querySelector_htmlSourceElement: querySelector_htmlSourceElement,
+    querySelector_htmlSpanElement: querySelector_htmlSpanElement,
+    querySelector_htmlStyleElement: querySelector_htmlStyleElement,
+    querySelector_htmlTableCaptionElement: querySelector_htmlTableCaptionElement,
+    querySelector_htmlTableCellElement: querySelector_htmlTableCellElement,
+    querySelector_htmlTableColElement: querySelector_htmlTableColElement,
+    querySelector_htmlTableElement: querySelector_htmlTableElement,
+    querySelector_htmlTableRowElement: querySelector_htmlTableRowElement,
+    querySelector_htmlTableSectionElement: querySelector_htmlTableSectionElement,
+    querySelector_htmlTemplateElement: querySelector_htmlTemplateElement,
+    querySelector_htmlTextAreaElement: querySelector_htmlTextAreaElement,
+    querySelector_htmlTimeElement: querySelector_htmlTimeElement,
+    querySelector_htmlTitleElement: querySelector_htmlTitleElement,
+    querySelector_htmlTrackElement: querySelector_htmlTrackElement,
+    querySelector_htmlUListElement: querySelector_htmlUListElement,
+    querySelector_htmlUnknownElement: querySelector_htmlUnknownElement,
+    querySelector_htmlVideoElement: querySelector_htmlVideoElement
   };
 }
 
 export {
+  isInstanceOfHTMLAnchorElement,
+  isInstanceOfHTMLAreaElement,
+  isInstanceOfHTMLAudioElement,
+  isInstanceOfHTMLBaseElement,
+  isInstanceOfHTMLBodyElement,
+  isInstanceOfHTMLBRElement,
+  isInstanceOfHTMLButtonElement,
   isInstanceOfHTMLCanvasElement,
+  isInstanceOfHTMLDataElement,
+  isInstanceOfHTMLDataListElement,
+  isInstanceOfHTMLDetailsElement,
+  isInstanceOfHTMLDialogElement,
   isInstanceOfHTMLDivElement,
+  isInstanceOfHTMLDListElement,
+  isInstanceOfHTMLEmbedElement,
+  isInstanceOfHTMLFieldSetElement,
+  isInstanceOfHTMLFormElement,
+  isInstanceOfHTMLHRElement,
+  isInstanceOfHTMLHeadElement,
+  isInstanceOfHTMLHeadingElement,
+  isInstanceOfHTMLHtmlElement,
+  isInstanceOfHTMLIFrameElement,
+  isInstanceOfHTMLImageElement,
+  isInstanceOfHTMLInputElement,
+  isInstanceOfHTMLLabelElement,
+  isInstanceOfHTMLLegendElement,
+  isInstanceOfHTMLLIElement,
+  isInstanceOfHTMLLinkElement,
+  isInstanceOfHTMLMapElement,
+  isInstanceOfHTMLMediaElement,
+  isInstanceOfHTMLMenuElement,
+  isInstanceOfHTMLMetaElement,
+  isInstanceOfHTMLMeterElement,
+  isInstanceOfHTMLModElement,
+  isInstanceOfHTMLObjectElement,
+  isInstanceOfHTMLOListElement,
+  isInstanceOfHTMLOptGroupElement,
+  isInstanceOfHTMLOptionElement,
+  isInstanceOfHTMLOutputElement,
+  isInstanceOfHTMLParagraphElement,
+  isInstanceOfHTMLPictureElement,
+  isInstanceOfHTMLPreElement,
+  isInstanceOfHTMLProgressElement,
+  isInstanceOfHTMLQuoteElement,
+  isInstanceOfHTMLScriptElement,
+  isInstanceOfHTMLSelectElement,
+  isInstanceOfHTMLSlotElement,
+  isInstanceOfHTMLSourceElement,
+  isInstanceOfHTMLSpanElement,
+  isInstanceOfHTMLStyleElement,
+  isInstanceOfHTMLTableCaptionElement,
+  isInstanceOfHTMLTableCellElement,
+  isInstanceOfHTMLTableColElement,
+  isInstanceOfHTMLTableElement,
+  isInstanceOfHTMLTableRowElement,
+  isInstanceOfHTMLTableSectionElement,
+  isInstanceOfHTMLTemplateElement,
+  isInstanceOfHTMLTextAreaElement,
+  isInstanceOfHTMLTimeElement,
+  isInstanceOfHTMLTitleElement,
+  isInstanceOfHTMLTrackElement,
+  isInstanceOfHTMLUListElement,
+  isInstanceOfHTMLUnknownElement,
+  isInstanceOfHTMLVideoElement,
   Impl,
 }
 /* No side effect */
diff --git a/src/DOMAPI/QuerySelector.res b/src/DOMAPI/QuerySelector.res
index 32b29da..2cad642 100644
--- a/src/DOMAPI/QuerySelector.res
+++ b/src/DOMAPI/QuerySelector.res
@@ -1,8 +1,74 @@
 open Prelude
 open DOMAPI
 
+let isInstanceOfHTMLAnchorElement = (_: 't): bool => %raw(`param instanceof HTMLAnchorElement`)
+let isInstanceOfHTMLAreaElement = (_: 't): bool => %raw(`param instanceof HTMLAreaElement`)
+let isInstanceOfHTMLAudioElement = (_: 't): bool => %raw(`param instanceof HTMLAudioElement`)
+let isInstanceOfHTMLBaseElement = (_: 't): bool => %raw(`param instanceof HTMLBaseElement`)
+let isInstanceOfHTMLBodyElement = (_: 't): bool => %raw(`param instanceof HTMLBodyElement`)
+let isInstanceOfHTMLBRElement = (_: 't): bool => %raw(`param instanceof HTMLBRElement`)
+let isInstanceOfHTMLButtonElement = (_: 't): bool => %raw(`param instanceof HTMLButtonElement`)
 let isInstanceOfHTMLCanvasElement = (_: 't): bool => %raw(`param instanceof HTMLCanvasElement`)
+let isInstanceOfHTMLDataElement = (_: 't): bool => %raw(`param instanceof HTMLDataElement`)
+let isInstanceOfHTMLDataListElement = (_: 't): bool => %raw(`param instanceof HTMLDataListElement`)
+let isInstanceOfHTMLDetailsElement = (_: 't): bool => %raw(`param instanceof HTMLDetailsElement`)
+let isInstanceOfHTMLDialogElement = (_: 't): bool => %raw(`param instanceof HTMLDialogElement`)
 let isInstanceOfHTMLDivElement = (_: 't): bool => %raw(`param instanceof HTMLDivElement`)
+let isInstanceOfHTMLDListElement = (_: 't): bool => %raw(`param instanceof HTMLDListElement`)
+let isInstanceOfHTMLEmbedElement = (_: 't): bool => %raw(`param instanceof HTMLEmbedElement`)
+let isInstanceOfHTMLFieldSetElement = (_: 't): bool => %raw(`param instanceof HTMLFieldSetElement`)
+let isInstanceOfHTMLFormElement = (_: 't): bool => %raw(`param instanceof HTMLFormElement`)
+let isInstanceOfHTMLHRElement = (_: 't): bool => %raw(`param instanceof HTMLHRElement`)
+let isInstanceOfHTMLHeadElement = (_: 't): bool => %raw(`param instanceof HTMLHeadElement`)
+let isInstanceOfHTMLHeadingElement = (_: 't): bool => %raw(`param instanceof HTMLHeadingElement`)
+let isInstanceOfHTMLHtmlElement = (_: 't): bool => %raw(`param instanceof HTMLHtmlElement`)
+let isInstanceOfHTMLIFrameElement = (_: 't): bool => %raw(`param instanceof HTMLIFrameElement`)
+let isInstanceOfHTMLImageElement = (_: 't): bool => %raw(`param instanceof HTMLImageElement`)
+let isInstanceOfHTMLInputElement = (_: 't): bool => %raw(`param instanceof HTMLInputElement`)
+let isInstanceOfHTMLLabelElement = (_: 't): bool => %raw(`param instanceof HTMLLabelElement`)
+let isInstanceOfHTMLLegendElement = (_: 't): bool => %raw(`param instanceof HTMLLegendElement`)
+let isInstanceOfHTMLLIElement = (_: 't): bool => %raw(`param instanceof HTMLLIElement`)
+let isInstanceOfHTMLLinkElement = (_: 't): bool => %raw(`param instanceof HTMLLinkElement`)
+let isInstanceOfHTMLMapElement = (_: 't): bool => %raw(`param instanceof HTMLMapElement`)
+let isInstanceOfHTMLMediaElement = (_: 't): bool => %raw(`param instanceof HTMLMediaElement`)
+let isInstanceOfHTMLMenuElement = (_: 't): bool => %raw(`param instanceof HTMLMenuElement`)
+let isInstanceOfHTMLMetaElement = (_: 't): bool => %raw(`param instanceof HTMLMetaElement`)
+let isInstanceOfHTMLMeterElement = (_: 't): bool => %raw(`param instanceof HTMLMeterElement`)
+let isInstanceOfHTMLModElement = (_: 't): bool => %raw(`param instanceof HTMLModElement`)
+let isInstanceOfHTMLObjectElement = (_: 't): bool => %raw(`param instanceof HTMLObjectElement`)
+let isInstanceOfHTMLOListElement = (_: 't): bool => %raw(`param instanceof HTMLOListElement`)
+let isInstanceOfHTMLOptGroupElement = (_: 't): bool => %raw(`param instanceof HTMLOptGroupElement`)
+let isInstanceOfHTMLOptionElement = (_: 't): bool => %raw(`param instanceof HTMLOptionElement`)
+let isInstanceOfHTMLOutputElement = (_: 't): bool => %raw(`param instanceof HTMLOutputElement`)
+let isInstanceOfHTMLParagraphElement = (_: 't): bool =>
+  %raw(`param instanceof HTMLParagraphElement`)
+let isInstanceOfHTMLPictureElement = (_: 't): bool => %raw(`param instanceof HTMLPictureElement`)
+let isInstanceOfHTMLPreElement = (_: 't): bool => %raw(`param instanceof HTMLPreElement`)
+let isInstanceOfHTMLProgressElement = (_: 't): bool => %raw(`param instanceof HTMLProgressElement`)
+let isInstanceOfHTMLQuoteElement = (_: 't): bool => %raw(`param instanceof HTMLQuoteElement`)
+let isInstanceOfHTMLScriptElement = (_: 't): bool => %raw(`param instanceof HTMLScriptElement`)
+let isInstanceOfHTMLSelectElement = (_: 't): bool => %raw(`param instanceof HTMLSelectElement`)
+let isInstanceOfHTMLSlotElement = (_: 't): bool => %raw(`param instanceof HTMLSlotElement`)
+let isInstanceOfHTMLSourceElement = (_: 't): bool => %raw(`param instanceof HTMLSourceElement`)
+let isInstanceOfHTMLSpanElement = (_: 't): bool => %raw(`param instanceof HTMLSpanElement`)
+let isInstanceOfHTMLStyleElement = (_: 't): bool => %raw(`param instanceof HTMLStyleElement`)
+let isInstanceOfHTMLTableCaptionElement = (_: 't): bool =>
+  %raw(`param instanceof HTMLTableCaptionElement`)
+let isInstanceOfHTMLTableCellElement = (_: 't): bool =>
+  %raw(`param instanceof HTMLTableCellElement`)
+let isInstanceOfHTMLTableColElement = (_: 't): bool => %raw(`param instanceof HTMLTableColElement`)
+let isInstanceOfHTMLTableElement = (_: 't): bool => %raw(`param instanceof HTMLTableElement`)
+let isInstanceOfHTMLTableRowElement = (_: 't): bool => %raw(`param instanceof HTMLTableRowElement`)
+let isInstanceOfHTMLTableSectionElement = (_: 't): bool =>
+  %raw(`param instanceof HTMLTableSectionElement`)
+let isInstanceOfHTMLTemplateElement = (_: 't): bool => %raw(`param instanceof HTMLTemplateElement`)
+let isInstanceOfHTMLTextAreaElement = (_: 't): bool => %raw(`param instanceof HTMLTextAreaElement`)
+let isInstanceOfHTMLTimeElement = (_: 't): bool => %raw(`param instanceof HTMLTimeElement`)
+let isInstanceOfHTMLTitleElement = (_: 't): bool => %raw(`param instanceof HTMLTitleElement`)
+let isInstanceOfHTMLTrackElement = (_: 't): bool => %raw(`param instanceof HTMLTrackElement`)
+let isInstanceOfHTMLUListElement = (_: 't): bool => %raw(`param instanceof HTMLUListElement`)
+let isInstanceOfHTMLUnknownElement = (_: 't): bool => %raw(`param instanceof HTMLUnknownElement`)
+let isInstanceOfHTMLVideoElement = (_: 't): bool => %raw(`param instanceof HTMLVideoElement`)
 
 module Impl = (
   T: {
@@ -32,11 +98,220 @@ t->querySelector("#myCanvas")
     }
   }
 
+  let querySelector_htmlAnchorElement = (t: T.t, selector: string): option<htmlAnchorElement> => {
+    safeQuerySelector(isInstanceOfHTMLAnchorElement, t, selector)
+  }
+  let querySelector_htmlAreaElement = (t: T.t, selector: string): option<htmlAreaElement> => {
+    safeQuerySelector(isInstanceOfHTMLAreaElement, t, selector)
+  }
+  let querySelector_htmlAudioElement = (t: T.t, selector: string): option<htmlAudioElement> => {
+    safeQuerySelector(isInstanceOfHTMLAudioElement, t, selector)
+  }
+  let querySelector_htmlBaseElement = (t: T.t, selector: string): option<htmlBaseElement> => {
+    safeQuerySelector(isInstanceOfHTMLBaseElement, t, selector)
+  }
+  let querySelector_htmlBodyElement = (t: T.t, selector: string): option<htmlBodyElement> => {
+    safeQuerySelector(isInstanceOfHTMLBodyElement, t, selector)
+  }
+  let querySelector_htmlBRElement = (t: T.t, selector: string): option<htmlbrElement> => {
+    safeQuerySelector(isInstanceOfHTMLBRElement, t, selector)
+  }
+  let querySelector_htmlButtonElement = (t: T.t, selector: string): option<htmlButtonElement> => {
+    safeQuerySelector(isInstanceOfHTMLButtonElement, t, selector)
+  }
   let querySelector_htmlCanvasElement = (t: T.t, selector: string): option<htmlCanvasElement> => {
     safeQuerySelector(isInstanceOfHTMLCanvasElement, t, selector)
   }
-
+  let querySelector_htmlDataElement = (t: T.t, selector: string): option<htmlDataElement> => {
+    safeQuerySelector(isInstanceOfHTMLDataElement, t, selector)
+  }
+  let querySelector_htmlDataListElement = (t: T.t, selector: string): option<
+    htmlDataListElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLDataListElement, t, selector)
+  }
+  let querySelector_htmlDetailsElement = (t: T.t, selector: string): option<htmlDetailsElement> => {
+    safeQuerySelector(isInstanceOfHTMLDetailsElement, t, selector)
+  }
+  let querySelector_htmlDialogElement = (t: T.t, selector: string): option<htmlDialogElement> => {
+    safeQuerySelector(isInstanceOfHTMLDialogElement, t, selector)
+  }
   let querySelector_htmlDivElement = (t: T.t, selector: string): option<htmlDivElement> => {
     safeQuerySelector(isInstanceOfHTMLDivElement, t, selector)
   }
+  let querySelector_htmlDListElement = (t: T.t, selector: string): option<htmldListElement> => {
+    safeQuerySelector(isInstanceOfHTMLDListElement, t, selector)
+  }
+  let querySelector_htmlEmbedElement = (t: T.t, selector: string): option<htmlEmbedElement> => {
+    safeQuerySelector(isInstanceOfHTMLEmbedElement, t, selector)
+  }
+  let querySelector_htmlFieldSetElement = (t: T.t, selector: string): option<
+    htmlFieldSetElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLFieldSetElement, t, selector)
+  }
+  let querySelector_htmlFormElement = (t: T.t, selector: string): option<htmlFormElement> => {
+    safeQuerySelector(isInstanceOfHTMLFormElement, t, selector)
+  }
+  let querySelector_htmlHRElement = (t: T.t, selector: string): option<htmlhrElement> => {
+    safeQuerySelector(isInstanceOfHTMLHRElement, t, selector)
+  }
+  let querySelector_htmlHeadElement = (t: T.t, selector: string): option<htmlHeadElement> => {
+    safeQuerySelector(isInstanceOfHTMLHeadElement, t, selector)
+  }
+  let querySelector_htmlHeadingElement = (t: T.t, selector: string): option<htmlHeadingElement> => {
+    safeQuerySelector(isInstanceOfHTMLHeadingElement, t, selector)
+  }
+  let querySelector_htmlHtmlElement = (t: T.t, selector: string): option<htmlHtmlElement> => {
+    safeQuerySelector(isInstanceOfHTMLHtmlElement, t, selector)
+  }
+  let querySelector_htmlIFrameElement = (t: T.t, selector: string): option<htmliFrameElement> => {
+    safeQuerySelector(isInstanceOfHTMLIFrameElement, t, selector)
+  }
+  let querySelector_htmlImageElement = (t: T.t, selector: string): option<htmlImageElement> => {
+    safeQuerySelector(isInstanceOfHTMLImageElement, t, selector)
+  }
+  let querySelector_htmlInputElement = (t: T.t, selector: string): option<htmlInputElement> => {
+    safeQuerySelector(isInstanceOfHTMLInputElement, t, selector)
+  }
+  let querySelector_htmlLabelElement = (t: T.t, selector: string): option<htmlLabelElement> => {
+    safeQuerySelector(isInstanceOfHTMLLabelElement, t, selector)
+  }
+  let querySelector_htmlLegendElement = (t: T.t, selector: string): option<htmlLegendElement> => {
+    safeQuerySelector(isInstanceOfHTMLLegendElement, t, selector)
+  }
+  let querySelector_htmlLIElement = (t: T.t, selector: string): option<htmlliElement> => {
+    safeQuerySelector(isInstanceOfHTMLLIElement, t, selector)
+  }
+  let querySelector_htmlLinkElement = (t: T.t, selector: string): option<htmlLinkElement> => {
+    safeQuerySelector(isInstanceOfHTMLLinkElement, t, selector)
+  }
+  let querySelector_htmlMapElement = (t: T.t, selector: string): option<htmlMapElement> => {
+    safeQuerySelector(isInstanceOfHTMLMapElement, t, selector)
+  }
+  let querySelector_htmlMediaElement = (t: T.t, selector: string): option<htmlMediaElement> => {
+    safeQuerySelector(isInstanceOfHTMLMediaElement, t, selector)
+  }
+  let querySelector_htmlMenuElement = (t: T.t, selector: string): option<htmlMenuElement> => {
+    safeQuerySelector(isInstanceOfHTMLMenuElement, t, selector)
+  }
+  let querySelector_htmlMetaElement = (t: T.t, selector: string): option<htmlMetaElement> => {
+    safeQuerySelector(isInstanceOfHTMLMetaElement, t, selector)
+  }
+  let querySelector_htmlMeterElement = (t: T.t, selector: string): option<htmlMeterElement> => {
+    safeQuerySelector(isInstanceOfHTMLMeterElement, t, selector)
+  }
+  let querySelector_htmlModElement = (t: T.t, selector: string): option<htmlModElement> => {
+    safeQuerySelector(isInstanceOfHTMLModElement, t, selector)
+  }
+  let querySelector_htmlObjectElement = (t: T.t, selector: string): option<htmlObjectElement> => {
+    safeQuerySelector(isInstanceOfHTMLObjectElement, t, selector)
+  }
+  let querySelector_htmlOListElement = (t: T.t, selector: string): option<htmloListElement> => {
+    safeQuerySelector(isInstanceOfHTMLOListElement, t, selector)
+  }
+  let querySelector_htmlOptGroupElement = (t: T.t, selector: string): option<
+    htmlOptGroupElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLOptGroupElement, t, selector)
+  }
+  let querySelector_htmlOptionElement = (t: T.t, selector: string): option<htmlOptionElement> => {
+    safeQuerySelector(isInstanceOfHTMLOptionElement, t, selector)
+  }
+  let querySelector_htmlOutputElement = (t: T.t, selector: string): option<htmlOutputElement> => {
+    safeQuerySelector(isInstanceOfHTMLOutputElement, t, selector)
+  }
+  let querySelector_htmlParagraphElement = (t: T.t, selector: string): option<
+    htmlParagraphElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLParagraphElement, t, selector)
+  }
+  let querySelector_htmlPictureElement = (t: T.t, selector: string): option<htmlPictureElement> => {
+    safeQuerySelector(isInstanceOfHTMLPictureElement, t, selector)
+  }
+  let querySelector_htmlPreElement = (t: T.t, selector: string): option<htmlPreElement> => {
+    safeQuerySelector(isInstanceOfHTMLPreElement, t, selector)
+  }
+  let querySelector_htmlProgressElement = (t: T.t, selector: string): option<
+    htmlProgressElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLProgressElement, t, selector)
+  }
+  let querySelector_htmlQuoteElement = (t: T.t, selector: string): option<htmlQuoteElement> => {
+    safeQuerySelector(isInstanceOfHTMLQuoteElement, t, selector)
+  }
+  let querySelector_htmlScriptElement = (t: T.t, selector: string): option<htmlScriptElement> => {
+    safeQuerySelector(isInstanceOfHTMLScriptElement, t, selector)
+  }
+  let querySelector_htmlSelectElement = (t: T.t, selector: string): option<htmlSelectElement> => {
+    safeQuerySelector(isInstanceOfHTMLSelectElement, t, selector)
+  }
+  let querySelector_htmlSlotElement = (t: T.t, selector: string): option<htmlSlotElement> => {
+    safeQuerySelector(isInstanceOfHTMLSlotElement, t, selector)
+  }
+  let querySelector_htmlSourceElement = (t: T.t, selector: string): option<htmlSourceElement> => {
+    safeQuerySelector(isInstanceOfHTMLSourceElement, t, selector)
+  }
+  let querySelector_htmlSpanElement = (t: T.t, selector: string): option<htmlSpanElement> => {
+    safeQuerySelector(isInstanceOfHTMLSpanElement, t, selector)
+  }
+  let querySelector_htmlStyleElement = (t: T.t, selector: string): option<htmlStyleElement> => {
+    safeQuerySelector(isInstanceOfHTMLStyleElement, t, selector)
+  }
+  let querySelector_htmlTableCaptionElement = (t: T.t, selector: string): option<
+    htmlTableCaptionElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLTableCaptionElement, t, selector)
+  }
+  let querySelector_htmlTableCellElement = (t: T.t, selector: string): option<
+    htmlTableCellElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLTableCellElement, t, selector)
+  }
+  let querySelector_htmlTableColElement = (t: T.t, selector: string): option<
+    htmlTableColElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLTableColElement, t, selector)
+  }
+  let querySelector_htmlTableElement = (t: T.t, selector: string): option<htmlTableElement> => {
+    safeQuerySelector(isInstanceOfHTMLTableElement, t, selector)
+  }
+  let querySelector_htmlTableRowElement = (t: T.t, selector: string): option<
+    htmlTableRowElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLTableRowElement, t, selector)
+  }
+  let querySelector_htmlTableSectionElement = (t: T.t, selector: string): option<
+    htmlTableSectionElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLTableSectionElement, t, selector)
+  }
+  let querySelector_htmlTemplateElement = (t: T.t, selector: string): option<
+    htmlTemplateElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLTemplateElement, t, selector)
+  }
+  let querySelector_htmlTextAreaElement = (t: T.t, selector: string): option<
+    htmlTextAreaElement,
+  > => {
+    safeQuerySelector(isInstanceOfHTMLTextAreaElement, t, selector)
+  }
+  let querySelector_htmlTimeElement = (t: T.t, selector: string): option<htmlTimeElement> => {
+    safeQuerySelector(isInstanceOfHTMLTimeElement, t, selector)
+  }
+  let querySelector_htmlTitleElement = (t: T.t, selector: string): option<htmlTitleElement> => {
+    safeQuerySelector(isInstanceOfHTMLTitleElement, t, selector)
+  }
+  let querySelector_htmlTrackElement = (t: T.t, selector: string): option<htmlTrackElement> => {
+    safeQuerySelector(isInstanceOfHTMLTrackElement, t, selector)
+  }
+  let querySelector_htmlUListElement = (t: T.t, selector: string): option<htmluListElement> => {
+    safeQuerySelector(isInstanceOfHTMLUListElement, t, selector)
+  }
+  let querySelector_htmlUnknownElement = (t: T.t, selector: string): option<htmlUnknownElement> => {
+    safeQuerySelector(isInstanceOfHTMLUnknownElement, t, selector)
+  }
+  let querySelector_htmlVideoElement = (t: T.t, selector: string): option<htmlVideoElement> => {
+    safeQuerySelector(isInstanceOfHTMLVideoElement, t, selector)
+  }
 }