happy-dom 8.9.0 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of happy-dom might be problematic. Click here for more details.

Files changed (360) hide show
  1. package/README.md +2 -2
  2. package/lib/cookie/CookieJar.js +1 -1
  3. package/lib/cookie/CookieJar.js.map +1 -1
  4. package/lib/dom-token-list/DOMTokenList.js +24 -20
  5. package/lib/dom-token-list/DOMTokenList.js.map +1 -1
  6. package/lib/event/EventTarget.js +6 -3
  7. package/lib/event/EventTarget.js.map +1 -1
  8. package/lib/exception/DOMExceptionNameEnum.d.ts +5 -1
  9. package/lib/exception/DOMExceptionNameEnum.js +4 -0
  10. package/lib/exception/DOMExceptionNameEnum.js.map +1 -1
  11. package/lib/fetch/AbortController.d.ts +19 -0
  12. package/lib/fetch/AbortController.js +30 -0
  13. package/lib/fetch/AbortController.js.map +1 -0
  14. package/lib/fetch/AbortSignal.d.ts +25 -0
  15. package/lib/fetch/AbortSignal.js +51 -0
  16. package/lib/fetch/AbortSignal.js.map +1 -0
  17. package/lib/fetch/Fetch.d.ts +117 -0
  18. package/lib/fetch/Fetch.js +530 -0
  19. package/lib/fetch/Fetch.js.map +1 -0
  20. package/lib/fetch/Headers.d.ts +81 -3
  21. package/lib/fetch/Headers.js +139 -24
  22. package/lib/fetch/Headers.js.map +1 -1
  23. package/lib/fetch/Request.d.ts +56 -32
  24. package/lib/fetch/Request.js +165 -110
  25. package/lib/fetch/Request.js.map +1 -1
  26. package/lib/fetch/{ResourceFetchHandler.d.ts → ResourceFetch.d.ts} +1 -1
  27. package/lib/fetch/{ResourceFetchHandler.js → ResourceFetch.js} +5 -5
  28. package/lib/fetch/ResourceFetch.js.map +1 -0
  29. package/lib/fetch/Response.d.ts +60 -26
  30. package/lib/fetch/Response.js +196 -104
  31. package/lib/fetch/Response.js.map +1 -1
  32. package/lib/fetch/data-uri/DataURIParser.d.ts +20 -0
  33. package/lib/fetch/data-uri/DataURIParser.js +60 -0
  34. package/lib/fetch/data-uri/DataURIParser.js.map +1 -0
  35. package/lib/fetch/multipart/MultipartFormDataParser.d.ts +40 -0
  36. package/lib/fetch/multipart/MultipartFormDataParser.js +81 -0
  37. package/lib/fetch/multipart/MultipartFormDataParser.js.map +1 -0
  38. package/lib/fetch/multipart/MultipartReader.d.ts +49 -0
  39. package/lib/fetch/multipart/MultipartReader.js +178 -0
  40. package/lib/fetch/multipart/MultipartReader.js.map +1 -0
  41. package/lib/fetch/types/IHeaders.d.ts +71 -0
  42. package/lib/fetch/{IHeaders.js.map → types/IHeaders.js.map} +1 -1
  43. package/lib/fetch/types/IHeadersInit.js.map +1 -0
  44. package/lib/fetch/types/IRequest.d.ts +60 -0
  45. package/lib/fetch/{IRequest.js.map → types/IRequest.js.map} +1 -1
  46. package/lib/fetch/types/IRequestBody.d.ts +7 -0
  47. package/lib/fetch/{IBody.js → types/IRequestBody.js} +1 -1
  48. package/lib/fetch/types/IRequestBody.js.map +1 -0
  49. package/lib/fetch/types/IRequestCredentials.d.ts +2 -0
  50. package/lib/fetch/types/IRequestCredentials.js +3 -0
  51. package/lib/fetch/types/IRequestCredentials.js.map +1 -0
  52. package/lib/fetch/{RequestInfo.d.ts → types/IRequestInfo.d.ts} +2 -2
  53. package/lib/fetch/types/IRequestInfo.js +3 -0
  54. package/lib/fetch/types/IRequestInfo.js.map +1 -0
  55. package/lib/fetch/types/IRequestInit.d.ts +21 -0
  56. package/lib/fetch/types/IRequestInit.js.map +1 -0
  57. package/lib/fetch/types/IRequestRedirect.d.ts +2 -0
  58. package/lib/fetch/types/IRequestRedirect.js +3 -0
  59. package/lib/fetch/types/IRequestRedirect.js.map +1 -0
  60. package/lib/fetch/types/IRequestReferrerPolicy.d.ts +2 -0
  61. package/lib/fetch/types/IRequestReferrerPolicy.js +3 -0
  62. package/lib/fetch/types/IRequestReferrerPolicy.js.map +1 -0
  63. package/lib/fetch/types/IResponse.d.ts +27 -0
  64. package/lib/fetch/{IResponse.js.map → types/IResponse.js.map} +1 -1
  65. package/lib/fetch/types/IResponseBody.d.ts +7 -0
  66. package/lib/fetch/types/IResponseBody.js +3 -0
  67. package/lib/fetch/types/IResponseBody.js.map +1 -0
  68. package/lib/fetch/types/IResponseInit.d.ts +9 -0
  69. package/lib/fetch/types/IResponseInit.js.map +1 -0
  70. package/lib/fetch/utilities/FetchBodyUtility.d.ts +44 -0
  71. package/lib/fetch/utilities/FetchBodyUtility.js +156 -0
  72. package/lib/fetch/utilities/FetchBodyUtility.js.map +1 -0
  73. package/lib/fetch/utilities/FetchCORSUtility.d.ts +12 -0
  74. package/lib/fetch/utilities/FetchCORSUtility.js +20 -0
  75. package/lib/fetch/utilities/FetchCORSUtility.js.map +1 -0
  76. package/lib/fetch/utilities/FetchRequestHeaderUtility.d.ts +12 -0
  77. package/lib/fetch/utilities/FetchRequestHeaderUtility.js +45 -0
  78. package/lib/fetch/utilities/FetchRequestHeaderUtility.js.map +1 -0
  79. package/lib/fetch/utilities/FetchRequestReferrerUtility.d.ts +55 -0
  80. package/lib/fetch/utilities/FetchRequestReferrerUtility.js +194 -0
  81. package/lib/fetch/utilities/FetchRequestReferrerUtility.js.map +1 -0
  82. package/lib/fetch/utilities/FetchRequestValidationUtility.d.ts +38 -0
  83. package/lib/fetch/utilities/FetchRequestValidationUtility.js +70 -0
  84. package/lib/fetch/utilities/FetchRequestValidationUtility.js.map +1 -0
  85. package/lib/file/Blob.d.ts +2 -2
  86. package/lib/file/Blob.js +1 -1
  87. package/lib/file/Blob.js.map +1 -1
  88. package/lib/file/File.d.ts +2 -1
  89. package/lib/file/File.js.map +1 -1
  90. package/lib/form-data/FormData.d.ts +98 -0
  91. package/lib/form-data/FormData.js +212 -0
  92. package/lib/form-data/FormData.js.map +1 -0
  93. package/lib/index.d.ts +14 -1
  94. package/lib/index.js +20 -2
  95. package/lib/index.js.map +1 -1
  96. package/lib/nodes/document/Document.d.ts +5 -17
  97. package/lib/nodes/document/Document.js +11 -54
  98. package/lib/nodes/document/Document.js.map +1 -1
  99. package/lib/nodes/document/IDocument.d.ts +1 -1
  100. package/lib/nodes/document-fragment/DocumentFragment.d.ts +3 -14
  101. package/lib/nodes/document-fragment/DocumentFragment.js +7 -51
  102. package/lib/nodes/document-fragment/DocumentFragment.js.map +1 -1
  103. package/lib/nodes/document-fragment/IDocumentFragment.d.ts +2 -1
  104. package/lib/nodes/element/Element.d.ts +8 -8
  105. package/lib/nodes/element/Element.js +28 -45
  106. package/lib/nodes/element/Element.js.map +1 -1
  107. package/lib/nodes/element/ElementUtility.d.ts +32 -0
  108. package/lib/nodes/element/ElementUtility.js +105 -0
  109. package/lib/nodes/element/ElementUtility.js.map +1 -0
  110. package/lib/nodes/element/HTMLCollection.d.ts +26 -3
  111. package/lib/nodes/element/HTMLCollection.js +51 -0
  112. package/lib/nodes/element/HTMLCollection.js.map +1 -1
  113. package/lib/nodes/element/IHTMLCollection.d.ts +9 -2
  114. package/lib/nodes/html-anchor-element/HTMLAnchorElement.js +24 -24
  115. package/lib/nodes/html-anchor-element/HTMLAnchorElement.js.map +1 -1
  116. package/lib/nodes/html-base-element/HTMLBaseElement.js +4 -4
  117. package/lib/nodes/html-base-element/HTMLBaseElement.js.map +1 -1
  118. package/lib/nodes/html-button-element/HTMLButtonElement.d.ts +84 -3
  119. package/lib/nodes/html-button-element/HTMLButtonElement.js +183 -10
  120. package/lib/nodes/html-button-element/HTMLButtonElement.js.map +1 -1
  121. package/lib/nodes/html-button-element/IHTMLButtonElement.d.ts +28 -2
  122. package/lib/nodes/html-dialog-element/HTMLDialogElement.js +3 -3
  123. package/lib/nodes/html-dialog-element/HTMLDialogElement.js.map +1 -1
  124. package/lib/nodes/html-element/HTMLElement.js +12 -12
  125. package/lib/nodes/html-element/HTMLElement.js.map +1 -1
  126. package/lib/nodes/html-form-element/HTMLFormControlsCollection.d.ts +32 -0
  127. package/lib/nodes/html-form-element/HTMLFormControlsCollection.js +58 -0
  128. package/lib/nodes/html-form-element/HTMLFormControlsCollection.js.map +1 -0
  129. package/lib/nodes/html-form-element/HTMLFormElement.d.ts +37 -17
  130. package/lib/nodes/html-form-element/HTMLFormElement.js +128 -37
  131. package/lib/nodes/html-form-element/HTMLFormElement.js.map +1 -1
  132. package/lib/nodes/html-form-element/IHTMLFormControlsCollection.d.ts +25 -0
  133. package/lib/nodes/html-form-element/IHTMLFormControlsCollection.js +3 -0
  134. package/lib/nodes/html-form-element/IHTMLFormControlsCollection.js.map +1 -0
  135. package/lib/nodes/html-form-element/IHTMLFormElement.d.ts +16 -6
  136. package/lib/nodes/html-form-element/IRadioNodeList.d.ts +15 -0
  137. package/lib/nodes/html-form-element/IRadioNodeList.js +3 -0
  138. package/lib/nodes/html-form-element/IRadioNodeList.js.map +1 -0
  139. package/lib/nodes/html-form-element/RadioNodeList.d.ts +16 -0
  140. package/lib/nodes/html-form-element/RadioNodeList.js +28 -0
  141. package/lib/nodes/html-form-element/RadioNodeList.js.map +1 -0
  142. package/lib/nodes/html-image-element/HTMLImageElement.js +19 -19
  143. package/lib/nodes/html-image-element/HTMLImageElement.js.map +1 -1
  144. package/lib/nodes/html-input-element/HTMLInputElement.d.ts +43 -19
  145. package/lib/nodes/html-input-element/HTMLInputElement.js +206 -111
  146. package/lib/nodes/html-input-element/HTMLInputElement.js.map +1 -1
  147. package/lib/nodes/html-input-element/IHTMLInputElement.d.ts +14 -1
  148. package/lib/nodes/html-label-element/HTMLLabelElement.js +3 -7
  149. package/lib/nodes/html-label-element/HTMLLabelElement.js.map +1 -1
  150. package/lib/nodes/html-link-element/HTMLLinkElement.js +21 -21
  151. package/lib/nodes/html-link-element/HTMLLinkElement.js.map +1 -1
  152. package/lib/nodes/html-media-element/HTMLMediaElement.js +21 -21
  153. package/lib/nodes/html-media-element/HTMLMediaElement.js.map +1 -1
  154. package/lib/nodes/html-meta-element/HTMLMetaElement.js +8 -8
  155. package/lib/nodes/html-meta-element/HTMLMetaElement.js.map +1 -1
  156. package/lib/nodes/html-opt-group-element/HTMLOptGroupElement.js +6 -6
  157. package/lib/nodes/html-opt-group-element/HTMLOptGroupElement.js.map +1 -1
  158. package/lib/nodes/html-option-element/HTMLOptionElement.d.ts +3 -4
  159. package/lib/nodes/html-option-element/HTMLOptionElement.js +26 -29
  160. package/lib/nodes/html-option-element/HTMLOptionElement.js.map +1 -1
  161. package/lib/nodes/html-script-element/HTMLScriptElement.js +16 -16
  162. package/lib/nodes/html-script-element/HTMLScriptElement.js.map +1 -1
  163. package/lib/nodes/html-script-element/ScriptUtility.js +5 -5
  164. package/lib/nodes/html-script-element/ScriptUtility.js.map +1 -1
  165. package/lib/nodes/{html-option-element → html-select-element}/HTMLOptionsCollection.d.ts +5 -6
  166. package/lib/nodes/{html-option-element → html-select-element}/HTMLOptionsCollection.js.map +1 -1
  167. package/lib/nodes/html-select-element/HTMLSelectElement.d.ts +42 -41
  168. package/lib/nodes/html-select-element/HTMLSelectElement.js +134 -138
  169. package/lib/nodes/html-select-element/HTMLSelectElement.js.map +1 -1
  170. package/lib/nodes/{html-option-element → html-select-element}/IHTMLOptionsCollection.d.ts +4 -5
  171. package/lib/nodes/html-select-element/IHTMLOptionsCollection.js.map +1 -0
  172. package/lib/nodes/html-select-element/IHTMLSelectElement.d.ts +22 -2
  173. package/lib/nodes/html-slot-element/HTMLSlotElement.js +2 -2
  174. package/lib/nodes/html-slot-element/HTMLSlotElement.js.map +1 -1
  175. package/lib/nodes/html-style-element/HTMLStyleElement.js +7 -7
  176. package/lib/nodes/html-style-element/HTMLStyleElement.js.map +1 -1
  177. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.d.ts +55 -2
  178. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js +150 -40
  179. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js.map +1 -1
  180. package/lib/nodes/html-text-area-element/IHTMLTextAreaElement.d.ts +16 -0
  181. package/lib/nodes/node/Node.d.ts +12 -1
  182. package/lib/nodes/node/Node.js +50 -4
  183. package/lib/nodes/node/Node.js.map +1 -1
  184. package/lib/nodes/node/NodeList.d.ts +2 -3
  185. package/lib/nodes/node/NodeList.js.map +1 -1
  186. package/lib/nodes/parent-node/IParentNode.d.ts +4 -4
  187. package/lib/nodes/parent-node/ParentNodeUtility.d.ts +3 -3
  188. package/lib/nodes/parent-node/ParentNodeUtility.js +13 -11
  189. package/lib/nodes/parent-node/ParentNodeUtility.js.map +1 -1
  190. package/lib/nodes/text/Text.d.ts +13 -0
  191. package/lib/nodes/text/Text.js +30 -0
  192. package/lib/nodes/text/Text.js.map +1 -1
  193. package/lib/query-selector/QuerySelector.js +2 -2
  194. package/lib/query-selector/QuerySelector.js.map +1 -1
  195. package/lib/query-selector/SelectorItem.js +2 -0
  196. package/lib/query-selector/SelectorItem.js.map +1 -1
  197. package/lib/validity-state/ValidityState.d.ts +87 -0
  198. package/lib/validity-state/ValidityState.js +171 -0
  199. package/lib/validity-state/ValidityState.js.map +1 -0
  200. package/lib/window/GlobalWindow.d.ts +0 -8
  201. package/lib/window/GlobalWindow.js +0 -2
  202. package/lib/window/GlobalWindow.js.map +1 -1
  203. package/lib/window/INodeJSGlobal.d.ts +71 -0
  204. package/lib/window/INodeJSGlobal.js +2 -0
  205. package/lib/window/INodeJSGlobal.js.map +1 -0
  206. package/lib/window/IWindow.d.ts +30 -10
  207. package/lib/window/Window.d.ts +36 -20
  208. package/lib/window/Window.js +16 -9
  209. package/lib/window/Window.js.map +1 -1
  210. package/lib/xml-http-request/XMLHttpRequest.js +20 -12
  211. package/lib/xml-http-request/XMLHttpRequest.js.map +1 -1
  212. package/lib/xml-parser/XMLParser.js +1 -1
  213. package/lib/xml-parser/XMLParser.js.map +1 -1
  214. package/package.json +2 -3
  215. package/src/cookie/CookieJar.ts +1 -1
  216. package/src/dom-token-list/DOMTokenList.ts +24 -20
  217. package/src/event/EventTarget.ts +7 -3
  218. package/src/exception/DOMExceptionNameEnum.ts +5 -1
  219. package/src/fetch/AbortController.ts +26 -0
  220. package/src/fetch/AbortSignal.ts +44 -0
  221. package/src/fetch/Fetch.ts +666 -0
  222. package/src/fetch/Headers.ts +151 -3
  223. package/src/fetch/Request.ts +226 -94
  224. package/src/fetch/{ResourceFetchHandler.ts → ResourceFetch.ts} +3 -3
  225. package/src/fetch/Response.ts +252 -89
  226. package/src/fetch/data-uri/DataURIParser.ts +66 -0
  227. package/src/fetch/multipart/MultipartFormDataParser.ts +113 -0
  228. package/src/fetch/multipart/MultipartReader.ts +217 -0
  229. package/src/fetch/types/IHeaders.ts +80 -0
  230. package/src/fetch/types/IRequest.ts +65 -0
  231. package/src/fetch/types/IRequestBody.ts +15 -0
  232. package/src/fetch/types/IRequestCredentials.ts +2 -0
  233. package/src/fetch/types/IRequestInfo.ts +6 -0
  234. package/src/fetch/types/IRequestInit.ts +21 -0
  235. package/src/fetch/types/IRequestRedirect.ts +3 -0
  236. package/src/fetch/types/IRequestReferrerPolicy.ts +11 -0
  237. package/src/fetch/types/IResponse.ts +27 -0
  238. package/src/fetch/types/IResponseBody.ts +15 -0
  239. package/src/fetch/types/IResponseInit.ts +10 -0
  240. package/src/fetch/utilities/FetchBodyUtility.ts +175 -0
  241. package/src/fetch/utilities/FetchCORSUtility.ts +18 -0
  242. package/src/fetch/utilities/FetchRequestHeaderUtility.ts +47 -0
  243. package/src/fetch/utilities/FetchRequestReferrerUtility.ts +241 -0
  244. package/src/fetch/utilities/FetchRequestValidationUtility.ts +82 -0
  245. package/src/file/Blob.ts +2 -2
  246. package/src/file/File.ts +5 -1
  247. package/src/form-data/FormData.ts +237 -0
  248. package/src/index.ts +27 -1
  249. package/src/nodes/document/Document.ts +23 -64
  250. package/src/nodes/document/IDocument.ts +1 -1
  251. package/src/nodes/document-fragment/DocumentFragment.ts +9 -59
  252. package/src/nodes/document-fragment/IDocumentFragment.ts +2 -1
  253. package/src/nodes/element/Element.ts +43 -56
  254. package/src/nodes/element/ElementUtility.ts +137 -0
  255. package/src/nodes/element/HTMLCollection.ts +60 -3
  256. package/src/nodes/element/IHTMLCollection.ts +10 -2
  257. package/src/nodes/html-anchor-element/HTMLAnchorElement.ts +24 -24
  258. package/src/nodes/html-base-element/HTMLBaseElement.ts +4 -4
  259. package/src/nodes/html-button-element/HTMLButtonElement.ts +213 -10
  260. package/src/nodes/html-button-element/IHTMLButtonElement.ts +31 -2
  261. package/src/nodes/html-dialog-element/HTMLDialogElement.ts +3 -3
  262. package/src/nodes/html-element/HTMLElement.ts +12 -12
  263. package/src/nodes/html-form-element/HTMLFormControlsCollection.ts +76 -0
  264. package/src/nodes/html-form-element/HTMLFormElement.ts +147 -41
  265. package/src/nodes/html-form-element/IHTMLFormControlsCollection.ts +45 -0
  266. package/src/nodes/html-form-element/IHTMLFormElement.ts +17 -6
  267. package/src/nodes/html-form-element/IRadioNodeList.ts +16 -0
  268. package/src/nodes/html-form-element/RadioNodeList.ts +24 -0
  269. package/src/nodes/html-image-element/HTMLImageElement.ts +19 -19
  270. package/src/nodes/html-input-element/HTMLInputElement.ts +232 -113
  271. package/src/nodes/html-input-element/IHTMLInputElement.ts +20 -1
  272. package/src/nodes/html-label-element/HTMLLabelElement.ts +3 -7
  273. package/src/nodes/html-link-element/HTMLLinkElement.ts +21 -21
  274. package/src/nodes/html-media-element/HTMLMediaElement.ts +21 -21
  275. package/src/nodes/html-meta-element/HTMLMetaElement.ts +8 -8
  276. package/src/nodes/html-opt-group-element/HTMLOptGroupElement.ts +6 -6
  277. package/src/nodes/html-option-element/HTMLOptionElement.ts +29 -30
  278. package/src/nodes/html-script-element/HTMLScriptElement.ts +16 -16
  279. package/src/nodes/html-script-element/ScriptUtility.ts +5 -5
  280. package/src/nodes/{html-option-element → html-select-element}/HTMLOptionsCollection.ts +5 -9
  281. package/src/nodes/html-select-element/HTMLSelectElement.ts +159 -170
  282. package/src/nodes/{html-option-element → html-select-element}/IHTMLOptionsCollection.ts +4 -8
  283. package/src/nodes/html-select-element/IHTMLSelectElement.ts +25 -2
  284. package/src/nodes/html-slot-element/HTMLSlotElement.ts +2 -2
  285. package/src/nodes/html-style-element/HTMLStyleElement.ts +7 -7
  286. package/src/nodes/html-text-area-element/HTMLTextAreaElement.ts +174 -41
  287. package/src/nodes/html-text-area-element/IHTMLTextAreaElement.ts +18 -0
  288. package/src/nodes/node/Node.ts +61 -6
  289. package/src/nodes/node/NodeList.ts +2 -3
  290. package/src/nodes/parent-node/IParentNode.ts +7 -4
  291. package/src/nodes/parent-node/ParentNodeUtility.ts +25 -15
  292. package/src/nodes/text/Text.ts +38 -0
  293. package/src/query-selector/QuerySelector.ts +2 -2
  294. package/src/query-selector/SelectorItem.ts +3 -0
  295. package/src/validity-state/ValidityState.ts +211 -0
  296. package/src/window/GlobalWindow.ts +0 -2
  297. package/src/window/INodeJSGlobal.ts +70 -0
  298. package/src/window/IWindow.ts +32 -10
  299. package/src/window/Window.ts +37 -20
  300. package/src/xml-http-request/XMLHttpRequest.ts +27 -26
  301. package/src/xml-parser/XMLParser.ts +1 -1
  302. package/lib/fetch/FetchHandler.d.ts +0 -18
  303. package/lib/fetch/FetchHandler.js +0 -83
  304. package/lib/fetch/FetchHandler.js.map +0 -1
  305. package/lib/fetch/IAbortSignal.d.ts +0 -16
  306. package/lib/fetch/IAbortSignal.js +0 -4
  307. package/lib/fetch/IAbortSignal.js.map +0 -1
  308. package/lib/fetch/IBody.d.ts +0 -17
  309. package/lib/fetch/IBody.js.map +0 -1
  310. package/lib/fetch/IHeaders.d.ts +0 -18
  311. package/lib/fetch/IHeadersInit.js.map +0 -1
  312. package/lib/fetch/IRequest.d.ts +0 -18
  313. package/lib/fetch/IRequestInit.d.ts +0 -16
  314. package/lib/fetch/IRequestInit.js.map +0 -1
  315. package/lib/fetch/IResponse.d.ts +0 -20
  316. package/lib/fetch/IResponseInit.d.ts +0 -9
  317. package/lib/fetch/IResponseInit.js.map +0 -1
  318. package/lib/fetch/RequestInfo.js +0 -3
  319. package/lib/fetch/RequestInfo.js.map +0 -1
  320. package/lib/fetch/ResourceFetchHandler.js.map +0 -1
  321. package/lib/form-data/IFormData.d.ts +0 -32
  322. package/lib/form-data/IFormData.js +0 -3
  323. package/lib/form-data/IFormData.js.map +0 -1
  324. package/lib/location/RelativeURL.d.ts +0 -15
  325. package/lib/location/RelativeURL.js +0 -19
  326. package/lib/location/RelativeURL.js.map +0 -1
  327. package/lib/nodes/element/HTMLCollectionFactory.d.ts +0 -21
  328. package/lib/nodes/element/HTMLCollectionFactory.js +0 -31
  329. package/lib/nodes/element/HTMLCollectionFactory.js.map +0 -1
  330. package/lib/nodes/html-option-element/IHTMLOptionsCollection.js.map +0 -1
  331. package/lib/nodes/node/NodeListFactory.d.ts +0 -21
  332. package/lib/nodes/node/NodeListFactory.js +0 -31
  333. package/lib/nodes/node/NodeListFactory.js.map +0 -1
  334. package/lib/nodes/validity-state/ValidityState.d.ts +0 -52
  335. package/lib/nodes/validity-state/ValidityState.js +0 -81
  336. package/lib/nodes/validity-state/ValidityState.js.map +0 -1
  337. package/src/fetch/FetchHandler.ts +0 -90
  338. package/src/fetch/IAbortSignal.ts +0 -34
  339. package/src/fetch/IBody.ts +0 -18
  340. package/src/fetch/IHeaders.ts +0 -18
  341. package/src/fetch/IRequest.ts +0 -59
  342. package/src/fetch/IRequestInit.ts +0 -41
  343. package/src/fetch/IResponse.ts +0 -22
  344. package/src/fetch/IResponseInit.ts +0 -10
  345. package/src/fetch/RequestInfo.ts +0 -6
  346. package/src/form-data/IFormData.ts +0 -33
  347. package/src/location/RelativeURL.ts +0 -17
  348. package/src/nodes/element/HTMLCollectionFactory.ts +0 -31
  349. package/src/nodes/node/NodeListFactory.ts +0 -31
  350. package/src/nodes/validity-state/ValidityState.ts +0 -84
  351. /package/lib/fetch/{IHeaders.js → types/IHeaders.js} +0 -0
  352. /package/lib/fetch/{IHeadersInit.d.ts → types/IHeadersInit.d.ts} +0 -0
  353. /package/lib/fetch/{IHeadersInit.js → types/IHeadersInit.js} +0 -0
  354. /package/lib/fetch/{IRequest.js → types/IRequest.js} +0 -0
  355. /package/lib/fetch/{IRequestInit.js → types/IRequestInit.js} +0 -0
  356. /package/lib/fetch/{IResponse.js → types/IResponse.js} +0 -0
  357. /package/lib/fetch/{IResponseInit.js → types/IResponseInit.js} +0 -0
  358. /package/lib/nodes/{html-option-element → html-select-element}/HTMLOptionsCollection.js +0 -0
  359. /package/lib/nodes/{html-option-element → html-select-element}/IHTMLOptionsCollection.js +0 -0
  360. /package/src/fetch/{IHeadersInit.ts → types/IHeadersInit.ts} +0 -0
@@ -29,8 +29,8 @@ import IComment from '../comment/IComment';
29
29
  import IText from '../text/IText';
30
30
  import IDocumentFragment from '../document-fragment/IDocumentFragment';
31
31
  import INodeList from '../node/INodeList';
32
+ import NodeList from '../node/NodeList';
32
33
  import IHTMLCollection from '../element/IHTMLCollection';
33
- import HTMLCollectionFactory from '../element/HTMLCollectionFactory';
34
34
  import IHTMLLinkElement from '../html-link-element/IHTMLLinkElement';
35
35
  import IHTMLStyleElement from '../html-style-element/IHTMLStyleElement';
36
36
  import DocumentReadyStateEnum from './DocumentReadyStateEnum';
@@ -43,6 +43,8 @@ import IHTMLBaseElement from '../html-base-element/IHTMLBaseElement';
43
43
  import IAttr from '../attr/IAttr';
44
44
  import IProcessingInstruction from '../processing-instruction/IProcessingInstruction';
45
45
  import ProcessingInstruction from '../processing-instruction/ProcessingInstruction';
46
+ import ElementUtility from '../element/ElementUtility';
47
+ import HTMLCollection from '../element/HTMLCollection';
46
48
  import VisibilityStateEnum from './VisibilityStateEnum';
47
49
 
48
50
  const PROCESSING_INSTRUCTION_TARGET_REGEXP = /^[a-z][a-z0-9-]+$/;
@@ -55,7 +57,10 @@ export default class Document extends Node implements IDocument {
55
57
  public nodeType = Node.DOCUMENT_NODE;
56
58
  public adoptedStyleSheets: CSSStyleSheet[] = [];
57
59
  public implementation: DOMImplementation;
58
- public readonly children: IHTMLCollection<IElement> = HTMLCollectionFactory.create();
60
+ public readonly children: IHTMLCollection<IElement, IElement> = new HTMLCollection<
61
+ IElement,
62
+ IElement
63
+ >();
59
64
  public readonly readyState = DocumentReadyStateEnum.interactive;
60
65
  public readonly isConnected: boolean = true;
61
66
  public readonly defaultView: IWindow;
@@ -416,8 +421,10 @@ export default class Document extends Node implements IDocument {
416
421
  *
417
422
  * @returns Scripts.
418
423
  */
419
- public get scripts(): IHTMLCollection<IHTMLScriptElement> {
420
- return <IHTMLCollection<IHTMLScriptElement>>this.getElementsByTagName('script');
424
+ public get scripts(): IHTMLCollection<IHTMLScriptElement, IHTMLScriptElement> {
425
+ return <IHTMLCollection<IHTMLScriptElement, IHTMLScriptElement>>(
426
+ this.getElementsByTagName('script')
427
+ );
421
428
  }
422
429
 
423
430
  /**
@@ -531,7 +538,7 @@ export default class Document extends Node implements IDocument {
531
538
  * @param className Tag name.
532
539
  * @returns Matching element.
533
540
  */
534
- public getElementsByClassName(className: string): IHTMLCollection<IElement> {
541
+ public getElementsByClassName(className: string): IHTMLCollection<IElement, IElement> {
535
542
  return ParentNodeUtility.getElementsByClassName(this, className);
536
543
  }
537
544
 
@@ -541,7 +548,7 @@ export default class Document extends Node implements IDocument {
541
548
  * @param tagName Tag name.
542
549
  * @returns Matching element.
543
550
  */
544
- public getElementsByTagName(tagName: string): IHTMLCollection<IElement> {
551
+ public getElementsByTagName(tagName: string): IHTMLCollection<IElement, IElement> {
545
552
  return ParentNodeUtility.getElementsByTagName(this, tagName);
546
553
  }
547
554
 
@@ -552,7 +559,10 @@ export default class Document extends Node implements IDocument {
552
559
  * @param tagName Tag name.
553
560
  * @returns Matching element.
554
561
  */
555
- public getElementsByTagNameNS(namespaceURI: string, tagName: string): IHTMLCollection<IElement> {
562
+ public getElementsByTagNameNS(
563
+ namespaceURI: string,
564
+ tagName: string
565
+ ): IHTMLCollection<IElement, IElement> {
556
566
  return ParentNodeUtility.getElementsByTagNameNS(this, namespaceURI, tagName);
557
567
  }
558
568
 
@@ -577,9 +587,9 @@ export default class Document extends Node implements IDocument {
577
587
  _parentNode: IElement | IDocumentFragment | IDocument,
578
588
  _name: string
579
589
  ): INodeList<IElement> => {
580
- const matches = HTMLCollectionFactory.create();
590
+ const matches = new NodeList<IElement>();
581
591
  for (const child of _parentNode.children) {
582
- if ((child.getAttributeNS(null, 'name') || '') === _name) {
592
+ if (child.getAttributeNS(null, 'name') === _name) {
583
593
  matches.push(child);
584
594
  }
585
595
  for (const match of _getElementsByName(<IElement>child, _name)) {
@@ -615,78 +625,27 @@ export default class Document extends Node implements IDocument {
615
625
  }
616
626
 
617
627
  /**
618
- * Append a child node to childNodes.
619
- *
620
628
  * @override
621
- * @param node Node to append.
622
- * @returns Appended node.
623
629
  */
624
630
  public appendChild(node: INode): INode {
625
- // If the type is DocumentFragment, then the child nodes of if it should be moved instead of the actual node.
626
- // See: https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment
627
- if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {
628
- if (node.parentNode && node.parentNode['children']) {
629
- const index = node.parentNode['children'].indexOf(node);
630
- if (index !== -1) {
631
- node.parentNode['children'].splice(index, 1);
632
- }
633
- }
634
- if (node !== this && node.nodeType === Node.ELEMENT_NODE) {
635
- this.children.push(<Element>node);
636
- }
637
- }
638
-
631
+ ElementUtility.appendChild(this, node);
639
632
  return super.appendChild(node);
640
633
  }
641
634
 
642
635
  /**
643
- * Remove Child element from childNodes array.
644
- *
645
636
  * @override
646
- * @param node Node to remove.
647
637
  */
648
638
  public removeChild(node: INode): INode {
649
- if (node.nodeType === Node.ELEMENT_NODE) {
650
- const index = this.children.indexOf(<Element>node);
651
- if (index !== -1) {
652
- this.children.splice(index, 1);
653
- }
654
- }
655
-
639
+ ElementUtility.removeChild(this, node);
656
640
  return super.removeChild(node);
657
641
  }
658
642
 
659
643
  /**
660
- * Inserts a node before another.
661
- *
662
644
  * @override
663
- * @param newNode Node to insert.
664
- * @param [referenceNode] Node to insert before.
665
- * @returns Inserted node.
666
645
  */
667
646
  public insertBefore(newNode: INode, referenceNode?: INode): INode {
668
- const returnValue = super.insertBefore(newNode, referenceNode);
669
-
670
- // If the type is DocumentFragment, then the child nodes of if it should be moved instead of the actual node.
671
- // See: https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment
672
- if (newNode.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {
673
- if (newNode.parentNode && newNode.parentNode['children']) {
674
- const index = newNode.parentNode['children'].indexOf(newNode);
675
- if (index !== -1) {
676
- newNode.parentNode['children'].splice(index, 1);
677
- }
678
- }
679
-
680
- this.children.length = 0;
681
-
682
- for (const node of this.childNodes) {
683
- if (node.nodeType === Node.ELEMENT_NODE) {
684
- this.children.push(<IElement>node);
685
- }
686
- }
687
- }
688
-
689
- return returnValue;
647
+ ElementUtility.insertBefore(this, newNode, referenceNode);
648
+ return super.insertBefore(newNode, referenceNode);
690
649
  }
691
650
 
692
651
  /**
@@ -32,7 +32,7 @@ export default interface IDocument extends IParentNode {
32
32
  readonly doctype: IDocumentType;
33
33
  readonly body: IHTMLElement;
34
34
  readonly head: IHTMLElement;
35
- readonly scripts: IHTMLCollection<IHTMLScriptElement>;
35
+ readonly scripts: IHTMLCollection<IHTMLScriptElement, IHTMLScriptElement>;
36
36
  readonly activeElement: IHTMLElement;
37
37
  readonly styleSheets: CSSStyleSheet[];
38
38
  readonly scrollingElement: IHTMLElement;
@@ -5,14 +5,16 @@ import ParentNodeUtility from '../parent-node/ParentNodeUtility';
5
5
  import IDocumentFragment from './IDocumentFragment';
6
6
  import INode from '../node/INode';
7
7
  import IHTMLCollection from '../element/IHTMLCollection';
8
- import HTMLCollectionFactory from '../element/HTMLCollectionFactory';
8
+ import ElementUtility from '../element/ElementUtility';
9
+ import HTMLCollection from '../element/HTMLCollection';
10
+ import INodeList from '../node/INodeList';
9
11
 
10
12
  /**
11
13
  * DocumentFragment.
12
14
  */
13
15
  export default class DocumentFragment extends Node implements IDocumentFragment {
14
16
  public nodeType = Node.DOCUMENT_FRAGMENT_NODE;
15
- public readonly children: IHTMLCollection<IElement> = HTMLCollectionFactory.create();
17
+ public readonly children: IHTMLCollection<IElement, IElement> = new HTMLCollection();
16
18
  public _rootNode: INode = this;
17
19
 
18
20
  /**
@@ -104,7 +106,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment
104
106
  * @param selector CSS selector.
105
107
  * @returns Matching elements.
106
108
  */
107
- public querySelectorAll(selector: string): IElement[] {
109
+ public querySelectorAll(selector: string): INodeList<IElement> {
108
110
  return QuerySelector.querySelectorAll(this, selector);
109
111
  }
110
112
 
@@ -150,78 +152,26 @@ export default class DocumentFragment extends Node implements IDocumentFragment
150
152
  }
151
153
 
152
154
  /**
153
- * Append a child node to childNodes.
154
- *
155
155
  * @override
156
- * @param node Node to append.
157
- * @returns Appended node.
158
156
  */
159
157
  public appendChild(node: INode): INode {
160
- // If the type is DocumentFragment, then the child nodes of if it should be moved instead of the actual node.
161
- // See: https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment
162
- if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {
163
- if (node.parentNode && node.parentNode['children']) {
164
- const index = node.parentNode['children'].indexOf(node);
165
- if (index !== -1) {
166
- node.parentNode['children'].splice(index, 1);
167
- }
168
- }
169
-
170
- if (node !== this && node.nodeType === Node.ELEMENT_NODE) {
171
- this.children.push(<IElement>node);
172
- }
173
- }
174
-
158
+ ElementUtility.appendChild(this, node);
175
159
  return super.appendChild(<INode>node);
176
160
  }
177
161
 
178
162
  /**
179
- * Remove Child element from childNodes array.
180
- *
181
163
  * @override
182
- * @param node Node to remove.
183
164
  */
184
165
  public removeChild(node: INode): INode {
185
- if (node.nodeType === Node.ELEMENT_NODE) {
186
- const index = this.children.indexOf(<IElement>node);
187
- if (index !== -1) {
188
- this.children.splice(index, 1);
189
- }
190
- }
191
-
166
+ ElementUtility.removeChild(this, node);
192
167
  return super.removeChild(<Node>node);
193
168
  }
194
169
 
195
170
  /**
196
- * Inserts a node before another.
197
- *
198
171
  * @override
199
- * @param newNode Node to insert.
200
- * @param [referenceNode] Node to insert before.
201
- * @returns Inserted node.
202
172
  */
203
173
  public insertBefore(newNode: INode, referenceNode?: INode): INode {
204
- const returnValue = super.insertBefore(newNode, referenceNode);
205
-
206
- // If the type is DocumentFragment, then the child nodes of if it should be moved instead of the actual node.
207
- // See: https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment
208
- if (newNode.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {
209
- if (newNode.parentNode && newNode.parentNode['children']) {
210
- const index = newNode.parentNode['children'].indexOf(newNode);
211
- if (index !== -1) {
212
- newNode.parentNode['children'].splice(index, 1);
213
- }
214
- }
215
-
216
- this.children.length = 0;
217
-
218
- for (const node of this.childNodes) {
219
- if (node.nodeType === Node.ELEMENT_NODE) {
220
- this.children.push(<IElement>node);
221
- }
222
- }
223
- }
224
-
225
- return returnValue;
174
+ ElementUtility.insertBefore(this, newNode, referenceNode);
175
+ return super.insertBefore(newNode, referenceNode);
226
176
  }
227
177
  }
@@ -1,5 +1,6 @@
1
1
  import IElement from '../element/IElement';
2
2
  import INode from '../node/INode';
3
+ import INodeList from '../node/INodeList';
3
4
 
4
5
  export default interface IDocumentFragment extends INode {
5
6
  readonly childElementCount: number;
@@ -35,7 +36,7 @@ export default interface IDocumentFragment extends INode {
35
36
  * @param selector CSS selector.
36
37
  * @returns Matching elements.
37
38
  */
38
- querySelectorAll(selector: string): IElement[];
39
+ querySelectorAll(selector: string): INodeList<IElement>;
39
40
 
40
41
  /**
41
42
  * Replaces the existing children of a node with a specified new set of children.
@@ -21,15 +21,15 @@ import INode from '../node/INode';
21
21
  import IDocument from '../document/IDocument';
22
22
  import IHTMLCollection from './IHTMLCollection';
23
23
  import INodeList from '../node/INodeList';
24
- import HTMLCollectionFactory from './HTMLCollectionFactory';
25
24
  import { TInsertAdjacentPositions } from './IElement';
26
25
  import IText from '../text/IText';
27
26
  import IDOMRectList from './IDOMRectList';
28
27
  import DOMRectListFactory from './DOMRectListFactory';
29
28
  import IAttr from '../attr/IAttr';
30
29
  import INamedNodeMap from '../../named-node-map/INamedNodeMap';
31
-
32
30
  import Event from '../../event/Event';
31
+ import ElementUtility from './ElementUtility';
32
+ import HTMLCollection from './HTMLCollection';
33
33
 
34
34
  /**
35
35
  * Element.
@@ -46,7 +46,7 @@ export default class Element extends Node implements IElement {
46
46
 
47
47
  public scrollTop = 0;
48
48
  public scrollLeft = 0;
49
- public children: IHTMLCollection<IElement> = HTMLCollectionFactory.create();
49
+ public children: IHTMLCollection<IElement, IElement> = new HTMLCollection<IElement, IElement>();
50
50
  public readonly namespaceURI: string = null;
51
51
 
52
52
  // Events
@@ -298,7 +298,7 @@ export default class Element extends Node implements IElement {
298
298
  * @param slot Slot.
299
299
  */
300
300
  public set slot(title: string) {
301
- this.setAttributeNS(null, 'slot', title);
301
+ this.setAttribute('slot', title);
302
302
  }
303
303
 
304
304
  /**
@@ -368,21 +368,7 @@ export default class Element extends Node implements IElement {
368
368
  * @override
369
369
  */
370
370
  public override appendChild(node: INode): INode {
371
- // If the type is DocumentFragment, then the child nodes of if it should be moved instead of the actual node.
372
- // See: https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment
373
- if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {
374
- if (node.parentNode && node.parentNode['children']) {
375
- const index = node.parentNode['children'].indexOf(node);
376
- if (index !== -1) {
377
- node.parentNode['children'].splice(index, 1);
378
- }
379
- }
380
-
381
- if (node !== this && node.nodeType === Node.ELEMENT_NODE) {
382
- this.children.push(<IElement>node);
383
- }
384
- }
385
-
371
+ ElementUtility.appendChild(this, node);
386
372
  return super.appendChild(node);
387
373
  }
388
374
 
@@ -390,49 +376,23 @@ export default class Element extends Node implements IElement {
390
376
  * @override
391
377
  */
392
378
  public override removeChild(node: INode): INode {
393
- if (node.nodeType === Node.ELEMENT_NODE) {
394
- const index = this.children.indexOf(<IElement>node);
395
- if (index !== -1) {
396
- this.children.splice(index, 1);
397
- }
398
- }
399
-
379
+ ElementUtility.removeChild(this, node);
400
380
  return super.removeChild(node);
401
381
  }
402
382
 
403
383
  /**
404
- * Removes the node from its parent.
384
+ * @override
405
385
  */
406
- public remove(): void {
407
- ChildNodeUtility.remove(this);
386
+ public override insertBefore(newNode: INode, referenceNode: INode | null): INode {
387
+ ElementUtility.insertBefore(this, newNode, referenceNode);
388
+ return super.insertBefore(newNode, referenceNode);
408
389
  }
409
390
 
410
391
  /**
411
- * @override
392
+ * Removes the node from its parent.
412
393
  */
413
- public override insertBefore(newNode: INode, referenceNode: INode | null): INode {
414
- const returnValue = super.insertBefore(newNode, referenceNode);
415
-
416
- // If the type is DocumentFragment, then the child nodes of if it should be moved instead of the actual node.
417
- // See: https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment
418
- if (newNode.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {
419
- if (newNode.parentNode && newNode.parentNode['children']) {
420
- const index = newNode.parentNode['children'].indexOf(newNode);
421
- if (index !== -1) {
422
- newNode.parentNode['children'].splice(index, 1);
423
- }
424
- }
425
-
426
- this.children.length = 0;
427
-
428
- for (const node of this.childNodes) {
429
- if (node.nodeType === Node.ELEMENT_NODE) {
430
- this.children.push(<IElement>node);
431
- }
432
- }
433
- }
434
-
435
- return returnValue;
394
+ public remove(): void {
395
+ ChildNodeUtility.remove(this);
436
396
  }
437
397
 
438
398
  /**
@@ -818,7 +778,7 @@ export default class Element extends Node implements IElement {
818
778
  * @param className Tag name.
819
779
  * @returns Matching element.
820
780
  */
821
- public getElementsByClassName(className: string): IHTMLCollection<IElement> {
781
+ public getElementsByClassName(className: string): IHTMLCollection<IElement, IElement> {
822
782
  return ParentNodeUtility.getElementsByClassName(this, className);
823
783
  }
824
784
 
@@ -828,7 +788,7 @@ export default class Element extends Node implements IElement {
828
788
  * @param tagName Tag name.
829
789
  * @returns Matching element.
830
790
  */
831
- public getElementsByTagName(tagName: string): IHTMLCollection<IElement> {
791
+ public getElementsByTagName(tagName: string): IHTMLCollection<IElement, IElement> {
832
792
  return ParentNodeUtility.getElementsByTagName(this, tagName);
833
793
  }
834
794
 
@@ -839,7 +799,10 @@ export default class Element extends Node implements IElement {
839
799
  * @param tagName Tag name.
840
800
  * @returns Matching element.
841
801
  */
842
- public getElementsByTagNameNS(namespaceURI: string, tagName: string): IHTMLCollection<IElement> {
802
+ public getElementsByTagNameNS(
803
+ namespaceURI: string,
804
+ tagName: string
805
+ ): IHTMLCollection<IElement, IElement> {
843
806
  return ParentNodeUtility.getElementsByTagNameNS(this, namespaceURI, tagName);
844
807
  }
845
808
 
@@ -868,6 +831,21 @@ export default class Element extends Node implements IElement {
868
831
  this._classList._updateIndices();
869
832
  }
870
833
 
834
+ if (attribute.name === 'id' || attribute.name === 'name') {
835
+ if (this.parentNode && (<IElement>this.parentNode).children && attribute.value !== oldValue) {
836
+ if (oldValue) {
837
+ (<HTMLCollection<IElement, IElement>>(
838
+ (<IElement>this.parentNode).children
839
+ ))._removeNamedItem(this, oldValue);
840
+ }
841
+ if (attribute.value) {
842
+ (<HTMLCollection<IElement, IElement>>(
843
+ (<IElement>this.parentNode).children
844
+ ))._appendNamedItem(this, attribute.value);
845
+ }
846
+ }
847
+ }
848
+
871
849
  if (
872
850
  this.attributeChangedCallback &&
873
851
  (<typeof Element>this.constructor)._observedAttributes &&
@@ -966,6 +944,15 @@ export default class Element extends Node implements IElement {
966
944
  this._classList._updateIndices();
967
945
  }
968
946
 
947
+ if (attribute.name === 'id' || attribute.name === 'name') {
948
+ if (this.parentNode && (<IElement>this.parentNode).children && attribute.value) {
949
+ (<HTMLCollection<IElement, IElement>>(<IElement>this.parentNode).children)._removeNamedItem(
950
+ this,
951
+ attribute.value
952
+ );
953
+ }
954
+ }
955
+
969
956
  if (
970
957
  this.attributeChangedCallback &&
971
958
  (<typeof Element>this.constructor)._observedAttributes &&
@@ -0,0 +1,137 @@
1
+ import NodeTypeEnum from '../node/NodeTypeEnum';
2
+ import IElement from './IElement';
3
+ import INode from '../node/INode';
4
+ import HTMLCollection from './HTMLCollection';
5
+ import IDocument from '../document/IDocument';
6
+ import IDocumentFragment from '../document-fragment/IDocumentFragment';
7
+ import IHTMLElement from '../html-element/IHTMLElement';
8
+ import Element from './Element';
9
+
10
+ const NAMED_ITEM_ATTRIBUTES = ['id', 'name'];
11
+
12
+ /**
13
+ * Element utility.
14
+ */
15
+ export default class ElementUtility {
16
+ /**
17
+ * Handles appending a child element to the "children" property.
18
+ *
19
+ * @param parentElement Parent element.
20
+ * @param node Node.
21
+ */
22
+ public static appendChild(
23
+ parentElement: IElement | IDocument | IDocumentFragment,
24
+ node: INode
25
+ ): void {
26
+ if (node.nodeType === NodeTypeEnum.elementNode && node !== parentElement) {
27
+ if (node.parentNode && (<IHTMLElement>node.parentNode).children) {
28
+ const index = (<IHTMLElement>node.parentNode).children.indexOf(<IHTMLElement>node);
29
+ if (index !== -1) {
30
+ for (const attribute of NAMED_ITEM_ATTRIBUTES) {
31
+ if ((<Element>node)._attributes[attribute]) {
32
+ (<HTMLCollection<IHTMLElement, IHTMLElement>>parentElement.children)._removeNamedItem(
33
+ <IHTMLElement>node,
34
+ (<Element>node)._attributes[attribute].value
35
+ );
36
+ }
37
+ }
38
+ (<IHTMLElement>node.parentNode).children.splice(index, 1);
39
+ }
40
+ }
41
+
42
+ for (const attribute of NAMED_ITEM_ATTRIBUTES) {
43
+ if ((<Element>node)._attributes[attribute]) {
44
+ (<HTMLCollection<IHTMLElement, IHTMLElement>>parentElement.children)._appendNamedItem(
45
+ <IHTMLElement>node,
46
+ (<Element>node)._attributes[attribute].value
47
+ );
48
+ }
49
+ }
50
+
51
+ parentElement.children.push(<IElement>node);
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Handles removing a child element from the "children" property.
57
+ *
58
+ * @param parentElement Parent element.
59
+ * @param node Node.
60
+ */
61
+ public static removeChild(
62
+ parentElement: IElement | IDocument | IDocumentFragment,
63
+ node: INode
64
+ ): void {
65
+ if (node.nodeType === NodeTypeEnum.elementNode) {
66
+ const index = parentElement.children.indexOf(<IElement>node);
67
+ if (index !== -1) {
68
+ for (const attribute of NAMED_ITEM_ATTRIBUTES) {
69
+ if ((<Element>node)._attributes[attribute]) {
70
+ (<HTMLCollection<IHTMLElement, IHTMLElement>>parentElement.children)._removeNamedItem(
71
+ <IHTMLElement>node,
72
+ (<Element>node)._attributes[attribute].value
73
+ );
74
+ }
75
+ }
76
+ parentElement.children.splice(index, 1);
77
+ }
78
+ }
79
+ }
80
+
81
+ /**
82
+ *
83
+ * Handles inserting a child element to the "children" property.
84
+ *
85
+ * @param parentElement Parent element.
86
+ * @param newNode
87
+ * @param referenceNode
88
+ */
89
+ public static insertBefore(
90
+ parentElement: IElement | IDocument | IDocumentFragment,
91
+ newNode: INode,
92
+ referenceNode: INode | null
93
+ ): void {
94
+ if (newNode.nodeType === NodeTypeEnum.elementNode) {
95
+ if (newNode.parentNode && (<IHTMLElement>newNode.parentNode).children) {
96
+ const index = (<IHTMLElement>newNode.parentNode).children.indexOf(<IHTMLElement>newNode);
97
+ if (index !== -1) {
98
+ for (const attribute of NAMED_ITEM_ATTRIBUTES) {
99
+ if ((<Element>newNode)._attributes[attribute]) {
100
+ (<HTMLCollection<IHTMLElement, IHTMLElement>>parentElement.children)._removeNamedItem(
101
+ <IHTMLElement>newNode,
102
+ (<Element>newNode)._attributes[attribute].value
103
+ );
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ if (referenceNode) {
110
+ if (referenceNode.nodeType === NodeTypeEnum.elementNode) {
111
+ const index = parentElement.children.indexOf(<IElement>referenceNode);
112
+ if (index !== -1) {
113
+ parentElement.children.splice(index, 0, <IElement>newNode);
114
+ }
115
+ } else {
116
+ for (const node of parentElement.childNodes) {
117
+ if (node === referenceNode) {
118
+ parentElement.children.push(<IElement>newNode);
119
+ }
120
+ if (node.nodeType === NodeTypeEnum.elementNode) {
121
+ parentElement.children.push(<IElement>node);
122
+ }
123
+ }
124
+ }
125
+
126
+ for (const attribute of NAMED_ITEM_ATTRIBUTES) {
127
+ if ((<Element>newNode)._attributes[attribute]) {
128
+ (<HTMLCollection<IHTMLElement, IHTMLElement>>parentElement.children)._appendNamedItem(
129
+ <IHTMLElement>newNode,
130
+ (<Element>newNode)._attributes[attribute].value
131
+ );
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }