Skip to content

Commit c432f8a

Browse files
committed
Prototype type safe query selector
1 parent a2ab3fd commit c432f8a

File tree

6 files changed

+75
-0
lines changed

6 files changed

+75
-0
lines changed

src/DOMAPI/Document.js

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/DOMAPI/Document.res

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ Returns the first element that is a descendant of node that matches selectors.
8686
@send
8787
external querySelector: (document, string) => Null.t<element> = "querySelector"
8888

89+
/**
90+
Invoke querySelector and checks if the element is an HTMLHeadingElement.
91+
[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Document/querySelector)
92+
*/
93+
let querySelectorAsHeading = (document, selector): option<htmlHeadingElement> => {
94+
switch querySelector(document, selector) {
95+
| Value(element) if HTMLHeadingElement.isInstanceOf(element) => Some(element->Obj.magic)
96+
| _ => None
97+
}
98+
}
99+
89100
/**
90101
Returns all element descendants of node that match selectors.
91102
[Read more on MDN](https://developer.mozilla.org/docs/Web/API/Document/querySelectorAll)

src/DOMAPI/HTMLHeadingElement.js

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/DOMAPI/HTMLHeadingElement.res

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,12 @@ open DOMAPI
33
include HTMLElement.Impl({
44
type t = htmlHeadingElement
55
})
6+
7+
let isInstanceOf = (_: 't): bool => %raw(`param instanceof HTMLHeadingElement`)
8+
9+
let tryParse = (element: 't): option<htmlHeadingElement> =>
10+
if isInstanceOf(element) {
11+
Some(element->Obj.magic)
12+
} else {
13+
None
14+
}

tests/DOMAPI/QuerySelector__test.js

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/DOMAPI/QuerySelector__test.res

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Option 1
2+
Global.document
3+
->Document.querySelectorAsHeading("h2")
4+
->Option.forEach(heading => {
5+
heading.style.color = "red"
6+
})
7+
8+
// Option 2
9+
Global.document
10+
->Document.querySelectorAsHeading("h2")
11+
->Option.flatMap(HTMLHeadingElement.tryParse)
12+
->Option.forEach(heading => {
13+
heading.style.color = "red"
14+
})

0 commit comments

Comments
 (0)