--- /dev/null
+type Comment := {
+ data: String,
+ length: Number,
+ nodeName: "#comment",
+ nodeType: 8,
+ nodeValue: String,
+ ownerDoucment: null | Document,
+
+ toString: (this: Comment) => String
+}
+
+type DOMText := {
+ data: String,
+ type: "DOMTextNode",
+ length: Number,
+ nodeType: 3,
+
+ toString: (this: DOMText) => String,
+ replaceChild: (
+ this: DOMText,
+ index: Number,
+ length: Number,
+ value: String
+ ) => void
+}
+
+type DOMNode := DOMText | DOMElement | DocumentFragment
+type DOMChild := DOMText | DOMElement
+
+type DOMElement := {
+ tagName: String,
+ className: String,
+ dataset: Object<String, Any>,
+ childNodes: Array<DOMChild>,
+ parentNode: null | DOMElement,
+ style: Object<String, String>,
+ type: "DOMElement",
+ nodeType: 1,
+ ownerDoucment: null | Document,
+ namespaceURI: null | String,
+
+ appendChild: (this: DOMElement, child: DOMChild) => DOMChild,
+ replaceChild:(
+ this: DOMElement,
+ elem: DOMChild,
+ needle: DOMChild
+ ) => DOMChild,
+ removeChild: (this: DOMElement, child: DOMChild) => DOMChild,
+ insertBefore: (
+ this: DOMElement,
+ elem: DOMChild,
+ needle: DOMChild | null | undefined
+ ) => DOMChild,
+ addEventListener: addEventListener,
+ dispatchEvent: dispatchEvent,
+ focus: () => void,
+ toString: (this: DOMElement) => String,
+ getElementsByClassName: (
+ this: DOMElement,
+ className: String
+ ) => Array<DOMElement>,
+ getElementsByTagName: (
+ this: DOMElement,
+ tagName: String
+ ) => Array<DOMElement>,
+}
+
+type DocumentFragment := {
+ childNodes: Array<DOMChild>,
+ parentNode: null | DOMElement,
+ type: "DocumentFragment",
+ nodeType: 11,
+ nodeName: "#document-fragment",
+ ownerDoucment: Document | null,
+
+ appendChild: (this: DocumentFragment, child: DOMChild),
+ replaceChild:
+ (this: DocumentFragment, elem: DOMChild, needle: DOMChild),
+ removeChild: (this: DocumentFragment, child: DOMChild),
+ toString: (this: DocumentFragment) => String
+}
+
+type Document := {
+ body: DOMElement,
+ childNodes: Array<DOMChild>,
+ documentElement: DOMElement,
+ nodeType: 9,
+
+ createComment: (this: Document, data: String) => Commment,
+ createTextNode: (this: Document, value: String) => DOMText,
+ createElement: (this: Document, tagName: String) => DOMElement,
+ createElementNS: (
+ this: Document,
+ namespace: String | null,
+ tagName: String
+ ) => DOMElement,
+ createDocumentFragment: (this: Document) => DocumentFragment,
+ createEvent: () => Event,
+ getElementById: (
+ this: Document,
+ id: String,
+ ) => null | DOMElement,
+ getElementsByClassName: (
+ this: Document,
+ className: String
+ ) => Array<DOMElement>,
+ getElementsByTagName: (
+ this: Document,
+ tagName: String
+ ) => Array<DOMElement>
+}
+
+type Event := {
+ type: String,
+ bubbles: Boolean,
+ cancelable: Boolean,
+
+ initEvent: (
+ this: Event,
+ type: String,
+ bubbles: Boolean,
+ cancelable: Boolean
+ ) => void
+}
+
+type addEventListener := (
+ this: DOMElement,
+ type: String,
+ listener: Listener
+) => void
+
+type dispatchEvent := (
+ this: DOMElement,
+ ev: Event
+)
+
+min-document/event/add-event-listener := addEventListener
+
+min-document/event/dispatch-event := dispatchEvent
+
+min-document/document := () => Document
+
+min-document/dom-element :=
+ (tagName: String, owner?: Document, namespace?: String | null) => DOMElement
+
+min-document/dom-fragment :=
+ (owner?: Document) => DocumentFragment
+
+min-document/dom-text :=
+ (value: String, owner?: Document) => DOMText
+
+min-document/event := () => Event
+
+min-document/serialize := (DOMElement) => String
+
+min-document := Document