@dooboostore/dom-parser 1.0.2 → 1.0.4

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.
Files changed (727) hide show
  1. package/README.MD +369 -6
  2. package/dist/cjs/DomParser.js +11 -1
  3. package/dist/cjs/DomParser.js.map +2 -2
  4. package/dist/cjs/bundle-entry.js +36 -0
  5. package/dist/cjs/bundle-entry.js.map +7 -0
  6. package/dist/cjs/factory/ElementFactory.js +31 -7
  7. package/dist/cjs/factory/ElementFactory.js.map +2 -2
  8. package/dist/cjs/index.js +26 -0
  9. package/dist/cjs/index.js.map +2 -2
  10. package/dist/cjs/node/CharacterData.js.map +1 -1
  11. package/dist/cjs/node/ChildNode.js +0 -15
  12. package/dist/cjs/node/ChildNode.js.map +3 -3
  13. package/dist/cjs/node/ChildNodeBase.js +20 -0
  14. package/dist/cjs/node/ChildNodeBase.js.map +2 -2
  15. package/dist/cjs/node/Comment.js.map +2 -2
  16. package/dist/cjs/node/Document.js +0 -27
  17. package/dist/cjs/node/Document.js.map +4 -4
  18. package/dist/cjs/node/DocumentBase.js +168 -205
  19. package/dist/cjs/node/DocumentBase.js.map +2 -2
  20. package/dist/cjs/node/DocumentFragment.js +0 -15
  21. package/dist/cjs/node/DocumentFragment.js.map +3 -3
  22. package/dist/cjs/node/DocumentFragmentBase.js.map +2 -2
  23. package/dist/cjs/node/Node.js.map +1 -1
  24. package/dist/cjs/node/NodeBase.js +44 -2
  25. package/dist/cjs/node/NodeBase.js.map +2 -2
  26. package/dist/cjs/node/NodeFilter.js +43 -0
  27. package/dist/cjs/node/NodeFilter.js.map +7 -0
  28. package/dist/cjs/node/NodeIterator.js +1 -28
  29. package/dist/cjs/node/NodeIterator.js.map +2 -2
  30. package/dist/cjs/node/ParentNode.js +0 -15
  31. package/dist/cjs/node/ParentNode.js.map +3 -3
  32. package/dist/cjs/node/ParentNodeBase.js +10 -10
  33. package/dist/cjs/node/ParentNodeBase.js.map +3 -3
  34. package/dist/cjs/node/ShadowRootBase.js +79 -0
  35. package/dist/cjs/node/ShadowRootBase.js.map +7 -0
  36. package/dist/cjs/node/Text.js +0 -15
  37. package/dist/cjs/node/Text.js.map +3 -3
  38. package/dist/cjs/node/TextBase.js +0 -3
  39. package/dist/cjs/node/TextBase.js.map +2 -2
  40. package/dist/cjs/node/TreeWalker.js +272 -0
  41. package/dist/cjs/node/TreeWalker.js.map +7 -0
  42. package/dist/cjs/node/collection/{HTMLCollection.js → HTMLCollectionImp.js} +7 -6
  43. package/dist/cjs/node/collection/HTMLCollectionImp.js.map +7 -0
  44. package/dist/cjs/node/collection/HTMLCollectionOfImp.js +26 -0
  45. package/dist/cjs/node/collection/HTMLCollectionOfImp.js.map +7 -0
  46. package/dist/cjs/node/collection/NodeList.js.map +1 -1
  47. package/dist/cjs/node/collection/{NodeListOf.js → NodeListOfImp.js} +6 -6
  48. package/dist/cjs/node/collection/NodeListOfImp.js.map +7 -0
  49. package/dist/cjs/node/collection/StylePropertyMapImpl.js +65 -0
  50. package/dist/cjs/node/collection/StylePropertyMapImpl.js.map +7 -0
  51. package/dist/cjs/node/collection/index.js +6 -6
  52. package/dist/cjs/node/collection/index.js.map +2 -2
  53. package/dist/cjs/node/elements/Element.js +0 -15
  54. package/dist/cjs/node/elements/Element.js.map +3 -3
  55. package/dist/cjs/node/elements/ElementBase.js +163 -331
  56. package/dist/cjs/node/elements/ElementBase.js.map +3 -3
  57. package/dist/cjs/node/elements/HTMLAnchorElement.js +2 -2
  58. package/dist/cjs/node/elements/HTMLAnchorElement.js.map +2 -2
  59. package/dist/cjs/node/elements/HTMLAreaElement.js +2 -2
  60. package/dist/cjs/node/elements/HTMLAreaElement.js.map +2 -2
  61. package/dist/cjs/node/elements/{HTMLGenericElement.js → HTMLAudioElement.js} +8 -11
  62. package/dist/cjs/node/elements/HTMLAudioElement.js.map +7 -0
  63. package/dist/cjs/node/elements/HTMLBaseElement.js +2 -2
  64. package/dist/cjs/node/elements/HTMLBaseElement.js.map +2 -2
  65. package/dist/cjs/node/elements/HTMLBodyElement.js +2 -2
  66. package/dist/cjs/node/elements/HTMLBodyElement.js.map +2 -2
  67. package/dist/cjs/node/elements/HTMLButtonElement.js +3 -3
  68. package/dist/cjs/node/elements/HTMLButtonElement.js.map +2 -2
  69. package/dist/cjs/node/elements/HTMLCanvasElement.js +2 -2
  70. package/dist/cjs/node/elements/HTMLCanvasElement.js.map +2 -2
  71. package/dist/cjs/node/elements/HTMLCaptionElement.js +2 -2
  72. package/dist/cjs/node/elements/HTMLCaptionElement.js.map +2 -2
  73. package/dist/cjs/node/{collection/HTMLCollectionOf.js → elements/HTMLDListElement.js} +9 -16
  74. package/dist/cjs/node/elements/HTMLDListElement.js.map +7 -0
  75. package/dist/cjs/node/elements/HTMLDataElement.js +29 -0
  76. package/dist/cjs/node/elements/HTMLDataElement.js.map +7 -0
  77. package/dist/cjs/node/elements/HTMLDataListElement.js +29 -0
  78. package/dist/cjs/node/elements/HTMLDataListElement.js.map +7 -0
  79. package/dist/cjs/node/elements/HTMLDetailsElement.js +29 -0
  80. package/dist/cjs/node/elements/HTMLDetailsElement.js.map +7 -0
  81. package/dist/cjs/node/elements/HTMLDialogElement.js +29 -0
  82. package/dist/cjs/node/elements/HTMLDialogElement.js.map +7 -0
  83. package/dist/cjs/node/elements/HTMLDivElement.js +2 -2
  84. package/dist/cjs/node/elements/HTMLDivElement.js.map +2 -2
  85. package/dist/cjs/node/elements/HTMLElement.js +13 -0
  86. package/dist/cjs/node/elements/HTMLElement.js.map +2 -2
  87. package/dist/cjs/node/elements/HTMLElementBase.js +44 -44
  88. package/dist/cjs/node/elements/HTMLElementBase.js.map +2 -2
  89. package/dist/cjs/node/elements/HTMLEmbedElement.js +2 -2
  90. package/dist/cjs/node/elements/HTMLEmbedElement.js.map +2 -2
  91. package/dist/cjs/node/elements/HTMLFieldSetElement.js +29 -0
  92. package/dist/cjs/node/elements/HTMLFieldSetElement.js.map +7 -0
  93. package/dist/cjs/node/elements/HTMLFormElement.js +2 -2
  94. package/dist/cjs/node/elements/HTMLFormElement.js.map +2 -2
  95. package/dist/cjs/node/elements/HTMLH1Element.js +2 -2
  96. package/dist/cjs/node/elements/HTMLH1Element.js.map +2 -2
  97. package/dist/cjs/node/elements/HTMLHRElement.js +29 -0
  98. package/dist/cjs/node/elements/HTMLHRElement.js.map +7 -0
  99. package/dist/cjs/node/elements/HTMLHeadElement.js +2 -2
  100. package/dist/cjs/node/elements/HTMLHeadElement.js.map +2 -2
  101. package/dist/cjs/node/elements/HTMLHtmlElement.js +2 -2
  102. package/dist/cjs/node/elements/HTMLHtmlElement.js.map +2 -2
  103. package/dist/cjs/node/elements/HTMLIFrameElement.js +29 -0
  104. package/dist/cjs/node/elements/HTMLIFrameElement.js.map +7 -0
  105. package/dist/cjs/node/elements/HTMLImgElement.js +2 -2
  106. package/dist/cjs/node/elements/HTMLImgElement.js.map +2 -2
  107. package/dist/cjs/node/elements/HTMLInputElement.js +2 -2
  108. package/dist/cjs/node/elements/HTMLInputElement.js.map +2 -2
  109. package/dist/cjs/node/elements/HTMLLIElement.js +2 -2
  110. package/dist/cjs/node/elements/HTMLLIElement.js.map +2 -2
  111. package/dist/cjs/node/elements/HTMLLabelElement.js +29 -0
  112. package/dist/cjs/node/elements/HTMLLabelElement.js.map +7 -0
  113. package/dist/cjs/node/elements/HTMLLegendElement.js +29 -0
  114. package/dist/cjs/node/elements/HTMLLegendElement.js.map +7 -0
  115. package/dist/cjs/node/elements/HTMLLinkElement.js +2 -2
  116. package/dist/cjs/node/elements/HTMLLinkElement.js.map +2 -2
  117. package/dist/cjs/node/elements/HTMLMapElement.js +29 -0
  118. package/dist/cjs/node/elements/HTMLMapElement.js.map +7 -0
  119. package/dist/cjs/node/elements/HTMLMetaElement.js +2 -2
  120. package/dist/cjs/node/elements/HTMLMetaElement.js.map +2 -2
  121. package/dist/cjs/node/elements/HTMLMeterElement.js +29 -0
  122. package/dist/cjs/node/elements/HTMLMeterElement.js.map +7 -0
  123. package/dist/cjs/node/elements/HTMLModElement.js +29 -0
  124. package/dist/cjs/node/elements/HTMLModElement.js.map +7 -0
  125. package/dist/cjs/node/elements/HTMLOListElement.js +2 -2
  126. package/dist/cjs/node/elements/HTMLOListElement.js.map +2 -2
  127. package/dist/cjs/node/elements/HTMLObjectElement.js +29 -0
  128. package/dist/cjs/node/elements/HTMLObjectElement.js.map +7 -0
  129. package/dist/cjs/node/elements/HTMLOptGroupElement.js +29 -0
  130. package/dist/cjs/node/elements/HTMLOptGroupElement.js.map +7 -0
  131. package/dist/cjs/node/elements/HTMLOptionElement.js +29 -0
  132. package/dist/cjs/node/elements/HTMLOptionElement.js.map +7 -0
  133. package/dist/cjs/node/elements/HTMLOutputElement.js +29 -0
  134. package/dist/cjs/node/elements/HTMLOutputElement.js.map +7 -0
  135. package/dist/cjs/node/elements/HTMLPElement.js +2 -2
  136. package/dist/cjs/node/elements/HTMLPElement.js.map +2 -2
  137. package/dist/cjs/node/elements/HTMLParamElement.js +29 -0
  138. package/dist/cjs/node/elements/HTMLParamElement.js.map +7 -0
  139. package/dist/cjs/node/elements/HTMLPictureElement.js +29 -0
  140. package/dist/cjs/node/elements/HTMLPictureElement.js.map +7 -0
  141. package/dist/cjs/node/elements/HTMLPreElement.js +29 -0
  142. package/dist/cjs/node/elements/HTMLPreElement.js.map +7 -0
  143. package/dist/cjs/node/elements/HTMLProgressElement.js +29 -0
  144. package/dist/cjs/node/elements/HTMLProgressElement.js.map +7 -0
  145. package/dist/cjs/node/elements/HTMLQuoteElement.js +29 -0
  146. package/dist/cjs/node/elements/HTMLQuoteElement.js.map +7 -0
  147. package/dist/cjs/node/elements/HTMLScriptElement.js +2 -2
  148. package/dist/cjs/node/elements/HTMLScriptElement.js.map +2 -2
  149. package/dist/cjs/node/elements/HTMLSelectElement.js +29 -0
  150. package/dist/cjs/node/elements/HTMLSelectElement.js.map +7 -0
  151. package/dist/cjs/node/elements/HTMLSlotElement.js +29 -0
  152. package/dist/cjs/node/elements/HTMLSlotElement.js.map +7 -0
  153. package/dist/cjs/node/elements/HTMLSourceElement.js +29 -0
  154. package/dist/cjs/node/elements/HTMLSourceElement.js.map +7 -0
  155. package/dist/cjs/node/elements/HTMLSpanElement.js +2 -2
  156. package/dist/cjs/node/elements/HTMLSpanElement.js.map +2 -2
  157. package/dist/cjs/node/elements/HTMLStyleElement.js +2 -2
  158. package/dist/cjs/node/elements/HTMLStyleElement.js.map +2 -2
  159. package/dist/cjs/node/elements/HTMLTableElement.js +2 -2
  160. package/dist/cjs/node/elements/HTMLTableElement.js.map +2 -2
  161. package/dist/cjs/node/elements/HTMLTbodyElement.js +2 -2
  162. package/dist/cjs/node/elements/HTMLTbodyElement.js.map +2 -2
  163. package/dist/cjs/node/elements/HTMLTdElement.js +2 -2
  164. package/dist/cjs/node/elements/HTMLTdElement.js.map +2 -2
  165. package/dist/cjs/node/elements/HTMLTemplateElement.js +2 -2
  166. package/dist/cjs/node/elements/HTMLTemplateElement.js.map +2 -2
  167. package/dist/cjs/node/elements/HTMLTextAreaElement.js +29 -0
  168. package/dist/cjs/node/elements/HTMLTextAreaElement.js.map +7 -0
  169. package/dist/cjs/node/elements/HTMLTfootElement.js +2 -2
  170. package/dist/cjs/node/elements/HTMLTfootElement.js.map +2 -2
  171. package/dist/cjs/node/elements/HTMLThElement.js +2 -2
  172. package/dist/cjs/node/elements/HTMLThElement.js.map +2 -2
  173. package/dist/cjs/node/elements/HTMLTheadElement.js +2 -2
  174. package/dist/cjs/node/elements/HTMLTheadElement.js.map +2 -2
  175. package/dist/cjs/node/elements/HTMLTimeElement.js +29 -0
  176. package/dist/cjs/node/elements/HTMLTimeElement.js.map +7 -0
  177. package/dist/cjs/node/elements/HTMLTitleElement.js +2 -2
  178. package/dist/cjs/node/elements/HTMLTitleElement.js.map +2 -2
  179. package/dist/cjs/node/elements/HTMLTrElement.js +2 -2
  180. package/dist/cjs/node/elements/HTMLTrElement.js.map +2 -2
  181. package/dist/cjs/node/elements/HTMLTrackElement.js +29 -0
  182. package/dist/cjs/node/elements/HTMLTrackElement.js.map +7 -0
  183. package/dist/cjs/node/elements/HTMLUListElement.js +2 -2
  184. package/dist/cjs/node/elements/HTMLUListElement.js.map +2 -2
  185. package/dist/cjs/node/elements/HTMLVideoElement.js +29 -0
  186. package/dist/cjs/node/elements/HTMLVideoElement.js.map +7 -0
  187. package/dist/cjs/node/elements/MathMLElement.js +2 -2
  188. package/dist/cjs/node/elements/MathMLElement.js.map +2 -2
  189. package/dist/cjs/node/elements/SVGElement.js +2 -2
  190. package/dist/cjs/node/elements/SVGElement.js.map +2 -2
  191. package/dist/cjs/node/elements/index.js +181 -94
  192. package/dist/cjs/node/elements/index.js.map +2 -2
  193. package/dist/cjs/node/index.js +6 -16
  194. package/dist/cjs/node/index.js.map +2 -2
  195. package/dist/cjs/utils/CSSSelector.js.map +2 -2
  196. package/dist/cjs/window/CustomElementRegistryImp.js +113 -0
  197. package/dist/cjs/window/CustomElementRegistryImp.js.map +7 -0
  198. package/dist/cjs/window/Window.js +0 -15
  199. package/dist/cjs/window/Window.js.map +3 -3
  200. package/dist/cjs/window/WindowBase.js +210 -613
  201. package/dist/cjs/window/WindowBase.js.map +2 -2
  202. package/dist/cjs/window/index.js +0 -5
  203. package/dist/cjs/window/index.js.map +2 -2
  204. package/dist/esm/DomParser.js +11 -1
  205. package/dist/esm/DomParser.js.map +2 -2
  206. package/dist/esm/bundle-entry.js +6 -0
  207. package/dist/esm/bundle-entry.js.map +7 -0
  208. package/dist/esm/factory/ElementFactory.js +32 -8
  209. package/dist/esm/factory/ElementFactory.js.map +2 -2
  210. package/dist/esm/index.js +26 -0
  211. package/dist/esm/index.js.map +2 -2
  212. package/dist/esm/node/ChildNodeBase.js +20 -0
  213. package/dist/esm/node/ChildNodeBase.js.map +2 -2
  214. package/dist/esm/node/Comment.js.map +2 -2
  215. package/dist/esm/node/Document.js +0 -8
  216. package/dist/esm/node/Document.js.map +4 -4
  217. package/dist/esm/node/DocumentBase.js +165 -202
  218. package/dist/esm/node/DocumentBase.js.map +2 -2
  219. package/dist/esm/node/DocumentFragmentBase.js.map +2 -2
  220. package/dist/esm/node/Node.js.map +1 -1
  221. package/dist/esm/node/NodeBase.js +45 -22
  222. package/dist/esm/node/NodeBase.js.map +2 -2
  223. package/dist/esm/node/NodeFilter.js +24 -0
  224. package/dist/esm/node/NodeFilter.js.map +7 -0
  225. package/dist/esm/node/NodeIterator.js +1 -28
  226. package/dist/esm/node/NodeIterator.js.map +2 -2
  227. package/dist/esm/node/ParentNodeBase.js +4 -4
  228. package/dist/esm/node/ParentNodeBase.js.map +2 -2
  229. package/dist/esm/node/ShadowRootBase.js +60 -0
  230. package/dist/esm/node/ShadowRootBase.js.map +7 -0
  231. package/dist/esm/node/TextBase.js +0 -3
  232. package/dist/esm/node/TextBase.js.map +2 -2
  233. package/dist/esm/node/TreeWalker.js +253 -0
  234. package/dist/esm/node/TreeWalker.js.map +7 -0
  235. package/dist/esm/node/collection/{HTMLCollection.js → HTMLCollectionImp.js} +4 -3
  236. package/dist/esm/node/collection/HTMLCollectionImp.js.map +7 -0
  237. package/dist/esm/node/collection/HTMLCollectionOfImp.js +7 -0
  238. package/dist/esm/node/collection/HTMLCollectionOfImp.js.map +7 -0
  239. package/dist/esm/node/collection/NodeList.js.map +1 -1
  240. package/dist/esm/node/collection/{NodeListOf.js → NodeListOfImp.js} +3 -3
  241. package/dist/esm/node/collection/NodeListOfImp.js.map +7 -0
  242. package/dist/esm/node/collection/StylePropertyMapImpl.js +46 -0
  243. package/dist/esm/node/collection/StylePropertyMapImpl.js.map +7 -0
  244. package/dist/esm/node/collection/index.js +6 -6
  245. package/dist/esm/node/collection/index.js.map +2 -2
  246. package/dist/esm/node/elements/ElementBase.js +163 -331
  247. package/dist/esm/node/elements/ElementBase.js.map +3 -3
  248. package/dist/esm/node/elements/HTMLAnchorElement.js +2 -2
  249. package/dist/esm/node/elements/HTMLAnchorElement.js.map +2 -2
  250. package/dist/esm/node/elements/HTMLAreaElement.js +2 -2
  251. package/dist/esm/node/elements/HTMLAreaElement.js.map +2 -2
  252. package/dist/esm/node/elements/HTMLAudioElement.js +10 -0
  253. package/dist/esm/node/elements/HTMLAudioElement.js.map +7 -0
  254. package/dist/esm/node/elements/HTMLBaseElement.js +2 -2
  255. package/dist/esm/node/elements/HTMLBaseElement.js.map +2 -2
  256. package/dist/esm/node/elements/HTMLBodyElement.js +2 -2
  257. package/dist/esm/node/elements/HTMLBodyElement.js.map +2 -2
  258. package/dist/esm/node/elements/HTMLButtonElement.js +3 -3
  259. package/dist/esm/node/elements/HTMLButtonElement.js.map +2 -2
  260. package/dist/esm/node/elements/HTMLCanvasElement.js +2 -2
  261. package/dist/esm/node/elements/HTMLCanvasElement.js.map +2 -2
  262. package/dist/esm/node/elements/HTMLCaptionElement.js +2 -2
  263. package/dist/esm/node/elements/HTMLCaptionElement.js.map +2 -2
  264. package/dist/esm/node/elements/HTMLDListElement.js +10 -0
  265. package/dist/esm/node/elements/HTMLDListElement.js.map +7 -0
  266. package/dist/esm/node/elements/HTMLDataElement.js +10 -0
  267. package/dist/esm/node/elements/HTMLDataElement.js.map +7 -0
  268. package/dist/esm/node/elements/HTMLDataListElement.js +10 -0
  269. package/dist/esm/node/elements/HTMLDataListElement.js.map +7 -0
  270. package/dist/esm/node/elements/HTMLDetailsElement.js +10 -0
  271. package/dist/esm/node/elements/HTMLDetailsElement.js.map +7 -0
  272. package/dist/esm/node/elements/HTMLDialogElement.js +10 -0
  273. package/dist/esm/node/elements/HTMLDialogElement.js.map +7 -0
  274. package/dist/esm/node/elements/HTMLDivElement.js +2 -2
  275. package/dist/esm/node/elements/HTMLDivElement.js.map +2 -2
  276. package/dist/esm/node/elements/HTMLElement.js +9 -0
  277. package/dist/esm/node/elements/HTMLElement.js.map +3 -3
  278. package/dist/esm/node/elements/HTMLElementBase.js +43 -43
  279. package/dist/esm/node/elements/HTMLElementBase.js.map +2 -2
  280. package/dist/esm/node/elements/HTMLEmbedElement.js +2 -2
  281. package/dist/esm/node/elements/HTMLEmbedElement.js.map +2 -2
  282. package/dist/esm/node/elements/HTMLFieldSetElement.js +10 -0
  283. package/dist/esm/node/elements/HTMLFieldSetElement.js.map +7 -0
  284. package/dist/esm/node/elements/HTMLFormElement.js +2 -2
  285. package/dist/esm/node/elements/HTMLFormElement.js.map +2 -2
  286. package/dist/esm/node/elements/HTMLH1Element.js +2 -2
  287. package/dist/esm/node/elements/HTMLH1Element.js.map +2 -2
  288. package/dist/esm/node/elements/HTMLHRElement.js +10 -0
  289. package/dist/esm/node/elements/HTMLHRElement.js.map +7 -0
  290. package/dist/esm/node/elements/HTMLHeadElement.js +2 -2
  291. package/dist/esm/node/elements/HTMLHeadElement.js.map +2 -2
  292. package/dist/esm/node/elements/HTMLHtmlElement.js +2 -2
  293. package/dist/esm/node/elements/HTMLHtmlElement.js.map +2 -2
  294. package/dist/esm/node/elements/HTMLIFrameElement.js +10 -0
  295. package/dist/esm/node/elements/HTMLIFrameElement.js.map +7 -0
  296. package/dist/esm/node/elements/HTMLImgElement.js +2 -2
  297. package/dist/esm/node/elements/HTMLImgElement.js.map +2 -2
  298. package/dist/esm/node/elements/HTMLInputElement.js +2 -2
  299. package/dist/esm/node/elements/HTMLInputElement.js.map +2 -2
  300. package/dist/esm/node/elements/HTMLLIElement.js +2 -2
  301. package/dist/esm/node/elements/HTMLLIElement.js.map +2 -2
  302. package/dist/esm/node/elements/HTMLLabelElement.js +10 -0
  303. package/dist/esm/node/elements/HTMLLabelElement.js.map +7 -0
  304. package/dist/esm/node/elements/HTMLLegendElement.js +10 -0
  305. package/dist/esm/node/elements/HTMLLegendElement.js.map +7 -0
  306. package/dist/esm/node/elements/HTMLLinkElement.js +2 -2
  307. package/dist/esm/node/elements/HTMLLinkElement.js.map +2 -2
  308. package/dist/esm/node/elements/HTMLMapElement.js +10 -0
  309. package/dist/esm/node/elements/HTMLMapElement.js.map +7 -0
  310. package/dist/esm/node/elements/HTMLMetaElement.js +2 -2
  311. package/dist/esm/node/elements/HTMLMetaElement.js.map +2 -2
  312. package/dist/esm/node/elements/HTMLMeterElement.js +10 -0
  313. package/dist/esm/node/elements/HTMLMeterElement.js.map +7 -0
  314. package/dist/esm/node/elements/HTMLModElement.js +10 -0
  315. package/dist/esm/node/elements/HTMLModElement.js.map +7 -0
  316. package/dist/esm/node/elements/HTMLOListElement.js +2 -2
  317. package/dist/esm/node/elements/HTMLOListElement.js.map +2 -2
  318. package/dist/esm/node/elements/HTMLObjectElement.js +10 -0
  319. package/dist/esm/node/elements/HTMLObjectElement.js.map +7 -0
  320. package/dist/esm/node/elements/HTMLOptGroupElement.js +10 -0
  321. package/dist/esm/node/elements/HTMLOptGroupElement.js.map +7 -0
  322. package/dist/esm/node/elements/HTMLOptionElement.js +10 -0
  323. package/dist/esm/node/elements/HTMLOptionElement.js.map +7 -0
  324. package/dist/esm/node/elements/HTMLOutputElement.js +10 -0
  325. package/dist/esm/node/elements/HTMLOutputElement.js.map +7 -0
  326. package/dist/esm/node/elements/HTMLPElement.js +2 -2
  327. package/dist/esm/node/elements/HTMLPElement.js.map +2 -2
  328. package/dist/esm/node/elements/HTMLParamElement.js +10 -0
  329. package/dist/esm/node/elements/HTMLParamElement.js.map +7 -0
  330. package/dist/esm/node/elements/HTMLPictureElement.js +10 -0
  331. package/dist/esm/node/elements/HTMLPictureElement.js.map +7 -0
  332. package/dist/esm/node/elements/HTMLPreElement.js +10 -0
  333. package/dist/esm/node/elements/HTMLPreElement.js.map +7 -0
  334. package/dist/esm/node/elements/HTMLProgressElement.js +10 -0
  335. package/dist/esm/node/elements/HTMLProgressElement.js.map +7 -0
  336. package/dist/esm/node/elements/HTMLQuoteElement.js +10 -0
  337. package/dist/esm/node/elements/HTMLQuoteElement.js.map +7 -0
  338. package/dist/esm/node/elements/HTMLScriptElement.js +2 -2
  339. package/dist/esm/node/elements/HTMLScriptElement.js.map +2 -2
  340. package/dist/esm/node/elements/HTMLSelectElement.js +10 -0
  341. package/dist/esm/node/elements/HTMLSelectElement.js.map +7 -0
  342. package/dist/esm/node/elements/HTMLSlotElement.js +10 -0
  343. package/dist/esm/node/elements/HTMLSlotElement.js.map +7 -0
  344. package/dist/esm/node/elements/HTMLSourceElement.js +10 -0
  345. package/dist/esm/node/elements/HTMLSourceElement.js.map +7 -0
  346. package/dist/esm/node/elements/HTMLSpanElement.js +2 -2
  347. package/dist/esm/node/elements/HTMLSpanElement.js.map +2 -2
  348. package/dist/esm/node/elements/HTMLStyleElement.js +2 -2
  349. package/dist/esm/node/elements/HTMLStyleElement.js.map +2 -2
  350. package/dist/esm/node/elements/HTMLTableElement.js +2 -2
  351. package/dist/esm/node/elements/HTMLTableElement.js.map +2 -2
  352. package/dist/esm/node/elements/HTMLTbodyElement.js +2 -2
  353. package/dist/esm/node/elements/HTMLTbodyElement.js.map +2 -2
  354. package/dist/esm/node/elements/HTMLTdElement.js +2 -2
  355. package/dist/esm/node/elements/HTMLTdElement.js.map +2 -2
  356. package/dist/esm/node/elements/HTMLTemplateElement.js +2 -2
  357. package/dist/esm/node/elements/HTMLTemplateElement.js.map +2 -2
  358. package/dist/esm/node/elements/HTMLTextAreaElement.js +10 -0
  359. package/dist/esm/node/elements/HTMLTextAreaElement.js.map +7 -0
  360. package/dist/esm/node/elements/HTMLTfootElement.js +2 -2
  361. package/dist/esm/node/elements/HTMLTfootElement.js.map +2 -2
  362. package/dist/esm/node/elements/HTMLThElement.js +2 -2
  363. package/dist/esm/node/elements/HTMLThElement.js.map +2 -2
  364. package/dist/esm/node/elements/HTMLTheadElement.js +2 -2
  365. package/dist/esm/node/elements/HTMLTheadElement.js.map +2 -2
  366. package/dist/esm/node/elements/HTMLTimeElement.js +10 -0
  367. package/dist/esm/node/elements/HTMLTimeElement.js.map +7 -0
  368. package/dist/esm/node/elements/HTMLTitleElement.js +2 -2
  369. package/dist/esm/node/elements/HTMLTitleElement.js.map +2 -2
  370. package/dist/esm/node/elements/HTMLTrElement.js +2 -2
  371. package/dist/esm/node/elements/HTMLTrElement.js.map +2 -2
  372. package/dist/esm/node/elements/HTMLTrackElement.js +10 -0
  373. package/dist/esm/node/elements/HTMLTrackElement.js.map +7 -0
  374. package/dist/esm/node/elements/HTMLUListElement.js +2 -2
  375. package/dist/esm/node/elements/HTMLUListElement.js.map +2 -2
  376. package/dist/esm/node/elements/HTMLVideoElement.js +10 -0
  377. package/dist/esm/node/elements/HTMLVideoElement.js.map +7 -0
  378. package/dist/esm/node/elements/MathMLElement.js +2 -2
  379. package/dist/esm/node/elements/MathMLElement.js.map +2 -2
  380. package/dist/esm/node/elements/SVGElement.js +2 -2
  381. package/dist/esm/node/elements/SVGElement.js.map +2 -2
  382. package/dist/esm/node/elements/index.js +182 -95
  383. package/dist/esm/node/elements/index.js.map +2 -2
  384. package/dist/esm/node/index.js +7 -17
  385. package/dist/esm/node/index.js.map +2 -2
  386. package/dist/esm/utils/CSSSelector.js.map +2 -2
  387. package/dist/esm/window/CustomElementRegistryImp.js +94 -0
  388. package/dist/esm/window/CustomElementRegistryImp.js.map +7 -0
  389. package/dist/esm/window/WindowBase.js +259 -597
  390. package/dist/esm/window/WindowBase.js.map +2 -2
  391. package/dist/esm/window/index.js +0 -5
  392. package/dist/esm/window/index.js.map +2 -2
  393. package/dist/esm-bundle/dooboostore-dom-parser.esm.js +3477 -3558
  394. package/dist/esm-bundle/dooboostore-dom-parser.esm.js.map +4 -4
  395. package/dist/types/DomParser.d.ts.map +1 -1
  396. package/dist/types/bundle-entry.d.ts +3 -0
  397. package/dist/types/bundle-entry.d.ts.map +1 -0
  398. package/dist/types/factory/ElementFactory.d.ts +1 -1
  399. package/dist/types/factory/ElementFactory.d.ts.map +1 -1
  400. package/dist/types/index.d.ts +14 -1
  401. package/dist/types/index.d.ts.map +1 -1
  402. package/dist/types/node/CharacterData.d.ts +0 -2
  403. package/dist/types/node/CharacterData.d.ts.map +1 -1
  404. package/dist/types/node/ChildNode.d.ts +0 -38
  405. package/dist/types/node/ChildNode.d.ts.map +1 -1
  406. package/dist/types/node/ChildNodeBase.d.ts +6 -4
  407. package/dist/types/node/ChildNodeBase.d.ts.map +1 -1
  408. package/dist/types/node/Comment.d.ts +1 -1
  409. package/dist/types/node/Comment.d.ts.map +1 -1
  410. package/dist/types/node/Document.d.ts +0 -856
  411. package/dist/types/node/Document.d.ts.map +1 -1
  412. package/dist/types/node/DocumentBase.d.ts +68 -110
  413. package/dist/types/node/DocumentBase.d.ts.map +1 -1
  414. package/dist/types/node/DocumentFragment.d.ts +0 -38
  415. package/dist/types/node/DocumentFragment.d.ts.map +1 -1
  416. package/dist/types/node/DocumentFragmentBase.d.ts +1 -8
  417. package/dist/types/node/DocumentFragmentBase.d.ts.map +1 -1
  418. package/dist/types/node/Node.d.ts +0 -213
  419. package/dist/types/node/Node.d.ts.map +1 -1
  420. package/dist/types/node/NodeBase.d.ts +11 -8
  421. package/dist/types/node/NodeBase.d.ts.map +1 -1
  422. package/dist/types/node/NodeFilter.d.ts +25 -0
  423. package/dist/types/node/NodeFilter.d.ts.map +1 -0
  424. package/dist/types/node/NodeIterator.d.ts +0 -34
  425. package/dist/types/node/NodeIterator.d.ts.map +1 -1
  426. package/dist/types/node/ParentNode.d.ts +0 -84
  427. package/dist/types/node/ParentNode.d.ts.map +1 -1
  428. package/dist/types/node/ParentNodeBase.d.ts +0 -5
  429. package/dist/types/node/ParentNodeBase.d.ts.map +1 -1
  430. package/dist/types/node/ShadowRootBase.d.ts +36 -0
  431. package/dist/types/node/ShadowRootBase.d.ts.map +1 -0
  432. package/dist/types/node/Text.d.ts +0 -24
  433. package/dist/types/node/Text.d.ts.map +1 -1
  434. package/dist/types/node/TextBase.d.ts +2 -3
  435. package/dist/types/node/TextBase.d.ts.map +1 -1
  436. package/dist/types/node/TreeWalker.d.ts +48 -0
  437. package/dist/types/node/TreeWalker.d.ts.map +1 -0
  438. package/dist/types/node/collection/{HTMLCollection.d.ts → HTMLCollectionImp.d.ts} +2 -3
  439. package/dist/types/node/collection/HTMLCollectionImp.d.ts.map +1 -0
  440. package/dist/types/node/collection/HTMLCollectionOfImp.d.ts +9 -0
  441. package/dist/types/node/collection/HTMLCollectionOfImp.d.ts.map +1 -0
  442. package/dist/types/node/collection/NodeList.d.ts +0 -1
  443. package/dist/types/node/collection/NodeList.d.ts.map +1 -1
  444. package/dist/types/node/collection/{NodeListOf.d.ts → NodeListOfImp.d.ts} +3 -4
  445. package/dist/types/node/collection/NodeListOfImp.d.ts.map +1 -0
  446. package/dist/types/node/collection/StylePropertyMapImpl.d.ts +20 -0
  447. package/dist/types/node/collection/StylePropertyMapImpl.d.ts.map +1 -0
  448. package/dist/types/node/collection/index.d.ts +3 -3
  449. package/dist/types/node/collection/index.d.ts.map +1 -1
  450. package/dist/types/node/elements/Element.d.ts +0 -687
  451. package/dist/types/node/elements/Element.d.ts.map +1 -1
  452. package/dist/types/node/elements/ElementBase.d.ts +98 -74
  453. package/dist/types/node/elements/ElementBase.d.ts.map +1 -1
  454. package/dist/types/node/elements/HTMLAnchorElement.d.ts +2 -2
  455. package/dist/types/node/elements/HTMLAnchorElement.d.ts.map +1 -1
  456. package/dist/types/node/elements/HTMLAreaElement.d.ts +2 -3
  457. package/dist/types/node/elements/HTMLAreaElement.d.ts.map +1 -1
  458. package/dist/types/node/elements/HTMLAudioElement.d.ts +8 -0
  459. package/dist/types/node/elements/HTMLAudioElement.d.ts.map +1 -0
  460. package/dist/types/node/elements/HTMLBaseElement.d.ts +2 -2
  461. package/dist/types/node/elements/HTMLBaseElement.d.ts.map +1 -1
  462. package/dist/types/node/elements/HTMLBodyElement.d.ts +2 -2
  463. package/dist/types/node/elements/HTMLBodyElement.d.ts.map +1 -1
  464. package/dist/types/node/elements/HTMLButtonElement.d.ts +3 -3
  465. package/dist/types/node/elements/HTMLButtonElement.d.ts.map +1 -1
  466. package/dist/types/node/elements/HTMLCanvasElement.d.ts +2 -2
  467. package/dist/types/node/elements/HTMLCanvasElement.d.ts.map +1 -1
  468. package/dist/types/node/elements/HTMLCaptionElement.d.ts +2 -2
  469. package/dist/types/node/elements/HTMLCaptionElement.d.ts.map +1 -1
  470. package/dist/types/node/elements/HTMLDListElement.d.ts +5 -0
  471. package/dist/types/node/elements/HTMLDListElement.d.ts.map +1 -0
  472. package/dist/types/node/elements/HTMLDataElement.d.ts +5 -0
  473. package/dist/types/node/elements/HTMLDataElement.d.ts.map +1 -0
  474. package/dist/types/node/elements/HTMLDataListElement.d.ts +5 -0
  475. package/dist/types/node/elements/HTMLDataListElement.d.ts.map +1 -0
  476. package/dist/types/node/elements/HTMLDetailsElement.d.ts +5 -0
  477. package/dist/types/node/elements/HTMLDetailsElement.d.ts.map +1 -0
  478. package/dist/types/node/elements/HTMLDialogElement.d.ts +5 -0
  479. package/dist/types/node/elements/HTMLDialogElement.d.ts.map +1 -0
  480. package/dist/types/node/elements/HTMLDivElement.d.ts +2 -2
  481. package/dist/types/node/elements/HTMLDivElement.d.ts.map +1 -1
  482. package/dist/types/node/elements/HTMLElement.d.ts +3 -119
  483. package/dist/types/node/elements/HTMLElement.d.ts.map +1 -1
  484. package/dist/types/node/elements/HTMLElementBase.d.ts +126 -5
  485. package/dist/types/node/elements/HTMLElementBase.d.ts.map +1 -1
  486. package/dist/types/node/elements/HTMLEmbedElement.d.ts +2 -3
  487. package/dist/types/node/elements/HTMLEmbedElement.d.ts.map +1 -1
  488. package/dist/types/node/elements/HTMLFieldSetElement.d.ts +5 -0
  489. package/dist/types/node/elements/HTMLFieldSetElement.d.ts.map +1 -0
  490. package/dist/types/node/elements/HTMLFormElement.d.ts +2 -2
  491. package/dist/types/node/elements/HTMLFormElement.d.ts.map +1 -1
  492. package/dist/types/node/elements/HTMLH1Element.d.ts +2 -2
  493. package/dist/types/node/elements/HTMLH1Element.d.ts.map +1 -1
  494. package/dist/types/node/elements/HTMLHRElement.d.ts +5 -0
  495. package/dist/types/node/elements/HTMLHRElement.d.ts.map +1 -0
  496. package/dist/types/node/elements/HTMLHeadElement.d.ts +2 -2
  497. package/dist/types/node/elements/HTMLHeadElement.d.ts.map +1 -1
  498. package/dist/types/node/elements/HTMLHtmlElement.d.ts +2 -2
  499. package/dist/types/node/elements/HTMLHtmlElement.d.ts.map +1 -1
  500. package/dist/types/node/elements/HTMLIFrameElement.d.ts +5 -0
  501. package/dist/types/node/elements/HTMLIFrameElement.d.ts.map +1 -0
  502. package/dist/types/node/elements/HTMLImgElement.d.ts +2 -2
  503. package/dist/types/node/elements/HTMLImgElement.d.ts.map +1 -1
  504. package/dist/types/node/elements/HTMLInputElement.d.ts +2 -2
  505. package/dist/types/node/elements/HTMLInputElement.d.ts.map +1 -1
  506. package/dist/types/node/elements/HTMLLIElement.d.ts +2 -2
  507. package/dist/types/node/elements/HTMLLIElement.d.ts.map +1 -1
  508. package/dist/types/node/elements/HTMLLabelElement.d.ts +5 -0
  509. package/dist/types/node/elements/HTMLLabelElement.d.ts.map +1 -0
  510. package/dist/types/node/elements/HTMLLegendElement.d.ts +5 -0
  511. package/dist/types/node/elements/HTMLLegendElement.d.ts.map +1 -0
  512. package/dist/types/node/elements/HTMLLinkElement.d.ts +2 -2
  513. package/dist/types/node/elements/HTMLLinkElement.d.ts.map +1 -1
  514. package/dist/types/node/elements/HTMLMapElement.d.ts +5 -0
  515. package/dist/types/node/elements/HTMLMapElement.d.ts.map +1 -0
  516. package/dist/types/node/elements/HTMLMetaElement.d.ts +2 -2
  517. package/dist/types/node/elements/HTMLMetaElement.d.ts.map +1 -1
  518. package/dist/types/node/elements/HTMLMeterElement.d.ts +5 -0
  519. package/dist/types/node/elements/HTMLMeterElement.d.ts.map +1 -0
  520. package/dist/types/node/elements/HTMLModElement.d.ts +5 -0
  521. package/dist/types/node/elements/HTMLModElement.d.ts.map +1 -0
  522. package/dist/types/node/elements/HTMLOListElement.d.ts +2 -2
  523. package/dist/types/node/elements/HTMLOListElement.d.ts.map +1 -1
  524. package/dist/types/node/elements/HTMLObjectElement.d.ts +5 -0
  525. package/dist/types/node/elements/HTMLObjectElement.d.ts.map +1 -0
  526. package/dist/types/node/elements/HTMLOptGroupElement.d.ts +5 -0
  527. package/dist/types/node/elements/HTMLOptGroupElement.d.ts.map +1 -0
  528. package/dist/types/node/elements/HTMLOptionElement.d.ts +5 -0
  529. package/dist/types/node/elements/HTMLOptionElement.d.ts.map +1 -0
  530. package/dist/types/node/elements/HTMLOutputElement.d.ts +5 -0
  531. package/dist/types/node/elements/HTMLOutputElement.d.ts.map +1 -0
  532. package/dist/types/node/elements/HTMLPElement.d.ts +2 -2
  533. package/dist/types/node/elements/HTMLPElement.d.ts.map +1 -1
  534. package/dist/types/node/elements/HTMLParamElement.d.ts +5 -0
  535. package/dist/types/node/elements/HTMLParamElement.d.ts.map +1 -0
  536. package/dist/types/node/elements/HTMLPictureElement.d.ts +5 -0
  537. package/dist/types/node/elements/HTMLPictureElement.d.ts.map +1 -0
  538. package/dist/types/node/elements/HTMLPreElement.d.ts +5 -0
  539. package/dist/types/node/elements/HTMLPreElement.d.ts.map +1 -0
  540. package/dist/types/node/elements/HTMLProgressElement.d.ts +5 -0
  541. package/dist/types/node/elements/HTMLProgressElement.d.ts.map +1 -0
  542. package/dist/types/node/elements/HTMLQuoteElement.d.ts +5 -0
  543. package/dist/types/node/elements/HTMLQuoteElement.d.ts.map +1 -0
  544. package/dist/types/node/elements/HTMLScriptElement.d.ts +2 -2
  545. package/dist/types/node/elements/HTMLScriptElement.d.ts.map +1 -1
  546. package/dist/types/node/elements/HTMLSelectElement.d.ts +5 -0
  547. package/dist/types/node/elements/HTMLSelectElement.d.ts.map +1 -0
  548. package/dist/types/node/elements/HTMLSlotElement.d.ts +5 -0
  549. package/dist/types/node/elements/HTMLSlotElement.d.ts.map +1 -0
  550. package/dist/types/node/elements/HTMLSourceElement.d.ts +5 -0
  551. package/dist/types/node/elements/HTMLSourceElement.d.ts.map +1 -0
  552. package/dist/types/node/elements/HTMLSpanElement.d.ts +2 -2
  553. package/dist/types/node/elements/HTMLSpanElement.d.ts.map +1 -1
  554. package/dist/types/node/elements/HTMLStyleElement.d.ts +2 -2
  555. package/dist/types/node/elements/HTMLStyleElement.d.ts.map +1 -1
  556. package/dist/types/node/elements/HTMLTableElement.d.ts +5 -6
  557. package/dist/types/node/elements/HTMLTableElement.d.ts.map +1 -1
  558. package/dist/types/node/elements/HTMLTbodyElement.d.ts +3 -4
  559. package/dist/types/node/elements/HTMLTbodyElement.d.ts.map +1 -1
  560. package/dist/types/node/elements/HTMLTdElement.d.ts +2 -2
  561. package/dist/types/node/elements/HTMLTdElement.d.ts.map +1 -1
  562. package/dist/types/node/elements/HTMLTemplateElement.d.ts +2 -3
  563. package/dist/types/node/elements/HTMLTemplateElement.d.ts.map +1 -1
  564. package/dist/types/node/elements/HTMLTextAreaElement.d.ts +5 -0
  565. package/dist/types/node/elements/HTMLTextAreaElement.d.ts.map +1 -0
  566. package/dist/types/node/elements/HTMLTfootElement.d.ts +4 -5
  567. package/dist/types/node/elements/HTMLTfootElement.d.ts.map +1 -1
  568. package/dist/types/node/elements/HTMLThElement.d.ts +2 -2
  569. package/dist/types/node/elements/HTMLThElement.d.ts.map +1 -1
  570. package/dist/types/node/elements/HTMLTheadElement.d.ts +4 -5
  571. package/dist/types/node/elements/HTMLTheadElement.d.ts.map +1 -1
  572. package/dist/types/node/elements/HTMLTimeElement.d.ts +5 -0
  573. package/dist/types/node/elements/HTMLTimeElement.d.ts.map +1 -0
  574. package/dist/types/node/elements/HTMLTitleElement.d.ts +2 -2
  575. package/dist/types/node/elements/HTMLTitleElement.d.ts.map +1 -1
  576. package/dist/types/node/elements/HTMLTrElement.d.ts +4 -5
  577. package/dist/types/node/elements/HTMLTrElement.d.ts.map +1 -1
  578. package/dist/types/node/elements/HTMLTrackElement.d.ts +5 -0
  579. package/dist/types/node/elements/HTMLTrackElement.d.ts.map +1 -0
  580. package/dist/types/node/elements/HTMLUListElement.d.ts +2 -2
  581. package/dist/types/node/elements/HTMLUListElement.d.ts.map +1 -1
  582. package/dist/types/node/elements/HTMLVideoElement.d.ts +8 -0
  583. package/dist/types/node/elements/HTMLVideoElement.d.ts.map +1 -0
  584. package/dist/types/node/elements/MathMLElement.d.ts +2 -2
  585. package/dist/types/node/elements/MathMLElement.d.ts.map +1 -1
  586. package/dist/types/node/elements/SVGElement.d.ts +2 -2
  587. package/dist/types/node/elements/SVGElement.d.ts.map +1 -1
  588. package/dist/types/node/elements/index.d.ts +108 -55
  589. package/dist/types/node/elements/index.d.ts.map +1 -1
  590. package/dist/types/node/index.d.ts +4 -7
  591. package/dist/types/node/index.d.ts.map +1 -1
  592. package/dist/types/utils/CSSSelector.d.ts +0 -1
  593. package/dist/types/utils/CSSSelector.d.ts.map +1 -1
  594. package/dist/types/window/CustomElementRegistryImp.d.ts +19 -0
  595. package/dist/types/window/CustomElementRegistryImp.d.ts.map +1 -0
  596. package/dist/types/window/Window.d.ts +0 -619
  597. package/dist/types/window/Window.d.ts.map +1 -1
  598. package/dist/types/window/WindowBase.d.ts +253 -286
  599. package/dist/types/window/WindowBase.d.ts.map +1 -1
  600. package/dist/types/window/index.d.ts +0 -1
  601. package/dist/types/window/index.d.ts.map +1 -1
  602. package/dist/umd-bundle/dooboostore-dom-parser.umd.js +3482 -3563
  603. package/dist/umd-bundle/dooboostore-dom-parser.umd.js.map +4 -4
  604. package/package.json +6 -1
  605. package/src/DomParser.ts +29 -20
  606. package/src/bundle-entry.ts +2 -0
  607. package/src/factory/ElementFactory.ts +87 -54
  608. package/src/index.ts +22 -10
  609. package/src/node/CharacterData.ts +0 -2
  610. package/src/node/ChildNode.ts +42 -42
  611. package/src/node/ChildNodeBase.ts +60 -39
  612. package/src/node/Comment.ts +60 -60
  613. package/src/node/Document.ts +129 -882
  614. package/src/node/DocumentBase.ts +371 -467
  615. package/src/node/DocumentFragment.ts +38 -44
  616. package/src/node/DocumentFragmentBase.ts +4 -9
  617. package/src/node/Node.ts +231 -224
  618. package/src/node/NodeBase.ts +469 -443
  619. package/src/node/NodeFilter.ts +50 -0
  620. package/src/node/NodeIterator.ts +117 -172
  621. package/src/node/ParentNode.ts +93 -93
  622. package/src/node/ParentNodeBase.ts +7 -10
  623. package/src/node/ShadowRootBase.ts +87 -0
  624. package/src/node/Text.ts +30 -30
  625. package/src/node/TextBase.ts +92 -94
  626. package/src/node/TreeWalker.ts +280 -0
  627. package/src/node/collection/{HTMLCollection.ts → HTMLCollectionImp.ts} +3 -2
  628. package/src/node/collection/HTMLCollectionOfImp.ts +12 -0
  629. package/src/node/collection/NodeList.ts +1 -1
  630. package/src/node/collection/{NodeListOf.ts → NodeListOfImp.ts} +3 -3
  631. package/src/node/collection/StylePropertyMapImpl.ts +60 -0
  632. package/src/node/collection/index.ts +3 -3
  633. package/src/node/elements/Element.ts +212 -772
  634. package/src/node/elements/ElementBase.ts +840 -1204
  635. package/src/node/elements/HTMLAnchorElement.ts +2 -1
  636. package/src/node/elements/HTMLAreaElement.ts +2 -2
  637. package/src/node/elements/HTMLAudioElement.ts +11 -0
  638. package/src/node/elements/HTMLBaseElement.ts +2 -1
  639. package/src/node/elements/HTMLBodyElement.ts +2 -1
  640. package/src/node/elements/HTMLButtonElement.ts +65 -64
  641. package/src/node/elements/HTMLCanvasElement.ts +2 -1
  642. package/src/node/elements/HTMLCaptionElement.ts +2 -1
  643. package/src/node/elements/HTMLDListElement.ts +8 -0
  644. package/src/node/elements/HTMLDataElement.ts +7 -0
  645. package/src/node/elements/HTMLDataListElement.ts +8 -0
  646. package/src/node/elements/HTMLDetailsElement.ts +8 -0
  647. package/src/node/elements/HTMLDialogElement.ts +8 -0
  648. package/src/node/elements/HTMLDivElement.ts +2 -1
  649. package/src/node/elements/HTMLElement.ts +6 -137
  650. package/src/node/elements/HTMLElementBase.ts +472 -355
  651. package/src/node/elements/HTMLEmbedElement.ts +2 -2
  652. package/src/node/elements/HTMLFieldSetElement.ts +8 -0
  653. package/src/node/elements/HTMLFormElement.ts +2 -1
  654. package/src/node/elements/HTMLH1Element.ts +2 -1
  655. package/src/node/elements/HTMLHRElement.ts +8 -0
  656. package/src/node/elements/HTMLHeadElement.ts +2 -1
  657. package/src/node/elements/HTMLHtmlElement.ts +2 -1
  658. package/src/node/elements/HTMLIFrameElement.ts +8 -0
  659. package/src/node/elements/HTMLImgElement.ts +2 -1
  660. package/src/node/elements/HTMLInputElement.ts +2 -1
  661. package/src/node/elements/HTMLLIElement.ts +2 -1
  662. package/src/node/elements/HTMLLabelElement.ts +3 -0
  663. package/src/node/elements/HTMLLegendElement.ts +3 -0
  664. package/src/node/elements/HTMLLinkElement.ts +2 -1
  665. package/src/node/elements/HTMLMapElement.ts +3 -0
  666. package/src/node/elements/HTMLMetaElement.ts +2 -1
  667. package/src/node/elements/HTMLMeterElement.ts +3 -0
  668. package/src/node/elements/HTMLModElement.ts +3 -0
  669. package/src/node/elements/HTMLOListElement.ts +2 -1
  670. package/src/node/elements/HTMLObjectElement.ts +3 -0
  671. package/src/node/elements/HTMLOptGroupElement.ts +3 -0
  672. package/src/node/elements/HTMLOptionElement.ts +3 -0
  673. package/src/node/elements/HTMLOutputElement.ts +3 -0
  674. package/src/node/elements/HTMLPElement.ts +2 -1
  675. package/src/node/elements/HTMLParamElement.ts +3 -0
  676. package/src/node/elements/HTMLPictureElement.ts +3 -0
  677. package/src/node/elements/HTMLPreElement.ts +3 -0
  678. package/src/node/elements/HTMLProgressElement.ts +3 -0
  679. package/src/node/elements/HTMLQuoteElement.ts +3 -0
  680. package/src/node/elements/HTMLScriptElement.ts +2 -1
  681. package/src/node/elements/HTMLSelectElement.ts +3 -0
  682. package/src/node/elements/HTMLSlotElement.ts +3 -0
  683. package/src/node/elements/HTMLSourceElement.ts +3 -0
  684. package/src/node/elements/HTMLSpanElement.ts +2 -1
  685. package/src/node/elements/HTMLStyleElement.ts +2 -1
  686. package/src/node/elements/HTMLTableElement.ts +5 -8
  687. package/src/node/elements/HTMLTbodyElement.ts +4 -4
  688. package/src/node/elements/HTMLTdElement.ts +3 -2
  689. package/src/node/elements/HTMLTemplateElement.ts +5 -7
  690. package/src/node/elements/HTMLTextAreaElement.ts +3 -0
  691. package/src/node/elements/HTMLTfootElement.ts +4 -4
  692. package/src/node/elements/HTMLThElement.ts +2 -1
  693. package/src/node/elements/HTMLTheadElement.ts +5 -5
  694. package/src/node/elements/HTMLTimeElement.ts +3 -0
  695. package/src/node/elements/HTMLTitleElement.ts +2 -1
  696. package/src/node/elements/HTMLTrElement.ts +7 -5
  697. package/src/node/elements/HTMLTrackElement.ts +3 -0
  698. package/src/node/elements/HTMLUListElement.ts +2 -1
  699. package/src/node/elements/HTMLVideoElement.ts +11 -0
  700. package/src/node/elements/MathMLElement.ts +2 -1
  701. package/src/node/elements/SVGElement.ts +2 -1
  702. package/src/node/elements/index.ts +231 -153
  703. package/src/node/index.ts +8 -8
  704. package/src/utils/CSSSelector.ts +0 -1
  705. package/src/window/CustomElementRegistryImp.ts +138 -0
  706. package/src/window/Window.ts +716 -715
  707. package/src/window/WindowBase.ts +482 -847
  708. package/src/window/index.ts +0 -1
  709. package/tsconfig.json +1 -0
  710. package/dist/cjs/node/collection/HTMLCollection.js.map +0 -7
  711. package/dist/cjs/node/collection/HTMLCollectionOf.js.map +0 -7
  712. package/dist/cjs/node/collection/NodeListOf.js.map +0 -7
  713. package/dist/cjs/node/elements/HTMLGenericElement.js.map +0 -7
  714. package/dist/esm/node/collection/HTMLCollection.js.map +0 -7
  715. package/dist/esm/node/collection/HTMLCollectionOf.js +0 -17
  716. package/dist/esm/node/collection/HTMLCollectionOf.js.map +0 -7
  717. package/dist/esm/node/collection/NodeListOf.js.map +0 -7
  718. package/dist/esm/node/elements/HTMLGenericElement.js +0 -13
  719. package/dist/esm/node/elements/HTMLGenericElement.js.map +0 -7
  720. package/dist/types/node/collection/HTMLCollection.d.ts.map +0 -1
  721. package/dist/types/node/collection/HTMLCollectionOf.d.ts +0 -14
  722. package/dist/types/node/collection/HTMLCollectionOf.d.ts.map +0 -1
  723. package/dist/types/node/collection/NodeListOf.d.ts.map +0 -1
  724. package/dist/types/node/elements/HTMLGenericElement.d.ts +0 -6
  725. package/dist/types/node/elements/HTMLGenericElement.d.ts.map +0 -1
  726. package/src/node/collection/HTMLCollectionOf.ts +0 -26
  727. package/src/node/elements/HTMLGenericElement.ts +0 -13
@@ -1,1248 +1,884 @@
1
1
  import { ParentNodeBase } from '../ParentNodeBase';
2
- import { ChildNodeBase } from '../ChildNodeBase';
3
- import { HTMLCollection } from "../collection";
4
- import { Text } from "../Text";
5
- import { ElementFactory } from "../../factory/ElementFactory";
6
- import { Element, DOMTokenList, Attr, NamedNodeMap, DOMRect } from './Element';
2
+ import { HTMLCollectionImp, HTMLCollectionOfImp } from '../collection';
7
3
  import { ELEMENT_NODE, TEXT_NODE, ATTRIBUTE_NODE } from '../Node';
8
4
  import { CSSSelector } from '../../utils/CSSSelector';
9
- import { HTMLElementTagNameMap } from "./index";
10
5
  import { NodeBase } from '../NodeBase';
11
-
12
- // InsertPosition type for insertAdjacent methods
13
- type InsertPosition = 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend';
6
+ import { ShadowRootBase } from '../ShadowRootBase';
14
7
 
15
8
  // Simple DOMException class for error handling
16
9
  class DOMException extends Error {
17
- constructor(message: string, public name: string = 'DOMException') {
18
- super(message);
19
- this.name = name;
20
- }
10
+ constructor(
11
+ message: string,
12
+ public name: string = 'DOMException'
13
+ ) {
14
+ super(message);
15
+ this.name = name;
16
+ }
21
17
  }
18
+
22
19
  /**
23
20
  * Base implementation of the Element interface
24
21
  */
22
+ // @ts-ignore
25
23
  export abstract class ElementBase extends ParentNodeBase implements Element {
26
- private _id: string = '';
27
- private _className: string = '';
28
- private _attributes: Map<string, string> = new Map();
29
-
30
- constructor(
31
- public _tagName: string,
32
- ownerDocument?: any
33
- ) {
34
- super(ELEMENT_NODE, _tagName.toUpperCase(), ownerDocument);
35
- }
36
-
37
- get tagName(): string {
38
- return this._tagName.toUpperCase();
39
- }
40
-
41
- get localName(): string {
42
- return this._tagName.toLowerCase();
43
- }
44
-
45
- // Element interface implementation
46
- get id(): string {
47
- return this._id;
48
- }
49
-
50
- set id(value: string) {
51
- this._id = value;
52
- this._attributes.set('id', value);
53
- }
54
-
55
- get className(): string {
56
- return this._className;
57
- }
58
-
59
- set className(value: string) {
60
- this._className = value;
61
- this._attributes.set('class', value);
62
- }
63
-
64
- get classList(): DOMTokenList {
65
- return new DOMTokenListImpl(this);
66
- }
67
-
68
- get innerHTML(): string {
69
- // Generate innerHTML from actual child nodes
70
- let html = '';
71
- for (const child of this._childNodesInternal) {
72
- if (child.nodeType === TEXT_NODE) {
73
- // For text nodes, use the escaped content stored in _nodeValue
74
- html += (child as any)._nodeValue || '';
75
- } else if (child.nodeType === ELEMENT_NODE) {
76
- // Generate outerHTML directly to avoid circular dependency
77
- html += this.generateChildElementHTML(child as any);
78
- } else if (child.nodeType === 8) { // COMMENT_NODE
79
- html += `<!--${(child as any).textContent || ''}-->`;
80
- }
81
- }
82
- return html;
83
- }
84
-
85
- get innerText(): string {
86
- // innerText should return the decoded text content
87
- return this.textContent || '';
88
- }
89
-
90
- set innerText(value: string | null) {
91
- // Clear all children and add escaped text content
92
- this._childNodesInternal = [];
93
- if (value !== null && value !== undefined) {
94
- const stringValue = String(value);
95
- const escapedValue = this.escapeHTMLEntities(stringValue);
96
- // Create text node with escaped content
97
- const { TextBase } = require('../TextBase');
98
- const textNode = new TextBase(escapedValue, this._ownerDocument);
99
- this._childNodesInternal.push(textNode);
100
- textNode._parentNodeInternal = this;
24
+ /**
25
+ * Static dependencies to break circular references without using 'require' or 'global'.
26
+ * These are injected by the main DomParser entry point.
27
+ */
28
+ public static dependencies: {
29
+ ElementFactory?: any;
30
+ TextBase?: any;
31
+ Comment?: any;
32
+ } = {};
33
+
34
+ private _id: string = '';
35
+ private _className: string = '';
36
+ private _attributes: Map<string, string> = new Map();
37
+ private _shadowRoot: ShadowRoot | null = null;
38
+
39
+ constructor(
40
+ public _tagName: string = 'DIV',
41
+ ownerDocument?: any
42
+ ) {
43
+ super(ELEMENT_NODE, _tagName.toUpperCase(), ownerDocument);
44
+ }
45
+
46
+ ariaActiveDescendantElement: Element;
47
+ ariaAtomic: string;
48
+ ariaAutoComplete: string;
49
+ ariaBrailleLabel: string;
50
+ ariaBrailleRoleDescription: string;
51
+ ariaBusy: string;
52
+ ariaChecked: string;
53
+ ariaColCount: string;
54
+ ariaColIndex: string;
55
+ ariaColIndexText: string;
56
+ ariaColSpan: string;
57
+ ariaControlsElements: readonly Element[];
58
+ ariaCurrent: string;
59
+ ariaDescribedByElements: readonly Element[];
60
+ ariaDescription: string;
61
+ ariaDetailsElements: readonly Element[];
62
+ ariaDisabled: string;
63
+ ariaErrorMessageElements: readonly Element[];
64
+ ariaExpanded: string;
65
+ ariaFlowToElements: readonly Element[];
66
+ ariaHasPopup: string;
67
+ ariaHidden: string;
68
+ ariaInvalid: string;
69
+ ariaKeyShortcuts: string;
70
+ ariaLabel: string;
71
+ ariaLabelledByElements: readonly Element[];
72
+ ariaLevel: string;
73
+ ariaLive: string;
74
+ ariaModal: string;
75
+ ariaMultiLine: string;
76
+ ariaMultiSelectable: string;
77
+ ariaOrientation: string;
78
+ ariaOwnsElements: readonly Element[];
79
+ ariaPlaceholder: string;
80
+ ariaPosInSet: string;
81
+ ariaPressed: string;
82
+ ariaReadOnly: string;
83
+ ariaRelevant: string;
84
+ ariaRequired: string;
85
+ ariaRoleDescription: string;
86
+ ariaRowCount: string;
87
+ ariaRowIndex: string;
88
+ ariaRowIndexText: string;
89
+ ariaRowSpan: string;
90
+ ariaSelected: string;
91
+ ariaSetSize: string;
92
+ ariaSort: string;
93
+ ariaValueMax: string;
94
+ ariaValueMin: string;
95
+ ariaValueNow: string;
96
+ ariaValueText: string;
97
+ role: string;
98
+ animate(keyframes: Keyframe[] | PropertyIndexedKeyframes | null, options?: number | KeyframeAnimationOptions): Animation {
99
+ throw new Error('Method not implemented.');
100
+ }
101
+ getAnimations(options?: GetAnimationsOptions): Animation[] {
102
+ throw new Error('Method not implemented.');
103
+ }
104
+
105
+ get tagName(): string {
106
+ return this._tagName.toUpperCase();
107
+ }
108
+
109
+ get localName(): string {
110
+ return this._tagName.toLowerCase();
111
+ }
112
+
113
+ // Element interface implementation
114
+ get id(): string {
115
+ return this._id;
116
+ }
117
+
118
+ set id(value: string) {
119
+ this._id = value;
120
+ this._attributes.set('id', value);
121
+ }
122
+
123
+ get className(): string {
124
+ return this._className;
125
+ }
126
+
127
+ set className(value: string) {
128
+ this._className = value;
129
+ this._attributes.set('class', value);
130
+ }
131
+
132
+ get classList(): DOMTokenList {
133
+ return new (DOMTokenListImpl as any)(this);
134
+ }
135
+
136
+ get innerHTML(): string {
137
+ // Generate innerHTML from actual child nodes
138
+ let html = '';
139
+ for (const child of this._childNodesInternal) {
140
+ if (child.nodeType === TEXT_NODE) {
141
+ // For text nodes, use the escaped content stored in _nodeValue
142
+ html += (child as any)._nodeValue || '';
143
+ } else if (child.nodeType === ELEMENT_NODE) {
144
+ // Generate outerHTML directly to avoid circular dependency
145
+ html += this.generateChildElementHTML(child as any);
146
+ } else if (child.nodeType === 8) {
147
+ // COMMENT_NODE
148
+ html += `<!--${(child as any).textContent || ''}-->`;
149
+ }
150
+ }
151
+ return html;
152
+ }
153
+
154
+ get innerText(): string {
155
+ // innerText should return the decoded text content
156
+ return this.textContent || '';
157
+ }
158
+
159
+ set innerText(value: string | null) {
160
+ // Clear all children and add escaped text content
161
+ this._childNodesInternal = [];
162
+ if (value !== null && value !== undefined) {
163
+ const stringValue = String(value);
164
+ const escapedValue = this.escapeHTMLEntities(stringValue);
165
+
166
+ const { TextBase } = ElementBase.dependencies;
167
+ if (TextBase) {
168
+ const textNode = new TextBase(escapedValue, this._ownerDocument);
169
+ this._childNodesInternal.push(textNode);
170
+ (textNode as any)._parentNodeInternal = this;
171
+ }
172
+ }
173
+ }
174
+
175
+ set innerHTML(value: string) {
176
+ // Clear existing children
177
+ while (this._childNodesInternal.length > 0) {
178
+ const child = this._childNodesInternal[0];
179
+ if (child) {
180
+ this.removeChild(child);
181
+ }
182
+ }
183
+
184
+ // Parse HTML and create child nodes
185
+ if (value.trim()) {
186
+ this.parseAndAppendHTML(value);
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Generate HTML for a child element without using outerHTML to avoid circular dependency
192
+ */
193
+ private generateChildElementHTML(element: any): string {
194
+ const tagName = element.tagName.toLowerCase();
195
+ // Get attributes
196
+ const attrs = Array.from(element._attributes?.entries() || [])
197
+ .map(([name, value]: [string, string]) => (value === '' ? ` ${name}` : ` ${name}="${String(value).replace(/"/g, '&quot;')}"`))
198
+ .join('');
199
+
200
+ // Check if it's a self-closing tag
201
+ const selfClosingTags = ['img', 'input', 'br', 'hr', 'meta', 'link', 'area', 'base', 'col', 'embed', 'source', 'track', 'wbr'];
202
+ const isSelfClosing = selfClosingTags.includes(tagName);
203
+
204
+ if (isSelfClosing) {
205
+ return `<${tagName}${attrs} />`;
206
+ } else {
207
+ // Generate innerHTML directly without calling element.innerHTML to avoid recursion
208
+ let childHTML = '';
209
+
210
+ // Add Declarative Shadow DOM if present
211
+ if (element.shadowRoot) {
212
+ childHTML += `<template shadowrootmode="${element.shadowRoot.mode}">${element.shadowRoot.innerHTML}</template>`;
213
+ }
214
+
215
+ for (const child of element._childNodesInternal || []) {
216
+ if (child.nodeType === TEXT_NODE) {
217
+ childHTML += (child as any)._nodeValue || '';
218
+ } else if (child.nodeType === ELEMENT_NODE) {
219
+ childHTML += this.generateChildElementHTML(child as any);
220
+ } else if (child.nodeType === 8) {
221
+ // COMMENT_NODE
222
+ childHTML += `<!--${(child as any).textContent || ''}-->`;
101
223
  }
224
+ }
225
+ return `<${tagName}${attrs}>${childHTML}</${tagName}>`;
102
226
  }
227
+ }
103
228
 
104
- set innerHTML(value: string) {
105
- // Clear existing children
106
- while (this._childNodesInternal.length > 0) {
107
- const child = this._childNodesInternal[0];
108
- if (child) {
109
- this.removeChild(child);
110
- }
111
- }
229
+ /**
230
+ * Improved HTML parser for innerHTML using a stack-based approach
231
+ */
232
+ private parseAndAppendHTML(html: string, targetNode: any = this): void {
233
+ const { ElementFactory, TextBase, Comment } = ElementBase.dependencies;
112
234
 
113
- // Parse HTML and create child nodes
114
- if (value.trim()) {
115
- this.parseAndAppendHTML(value);
116
- }
235
+ if (!ElementFactory) {
236
+ // Fallback for direct library usage without entry point initialization
237
+ console.error('SWC DOM Parser: ElementFactory dependency not injected.');
238
+ return;
117
239
  }
118
240
 
119
- /**
120
- * Generate HTML for a child element without using outerHTML to avoid circular dependency
121
- */
122
- private generateChildElementHTML(element: any): string {
123
- const tagName = element.tagName.toLowerCase();
124
- // Get attributes
125
- const attrs = Array.from(element._attributes?.entries() || [])
126
- .map(([name, value]: [string, string]) => value === '' ? ` ${name}` : ` ${name}="${String(value).replace(/"/g, '&quot;')}"`)
127
- .join('');
241
+ let i = 0;
242
+ const length = html.length;
128
243
 
129
- // Check if it's a self-closing tag
130
- const selfClosingTags = ['img', 'input', 'br', 'hr', 'meta', 'link', 'area', 'base', 'col', 'embed', 'source', 'track', 'wbr'];
131
- const isSelfClosing = selfClosingTags.includes(tagName);
244
+ while (i < length) {
245
+ const nextTagStart = html.indexOf('<', i);
132
246
 
133
- if (isSelfClosing) {
134
- return `<${tagName}${attrs} />`;
135
- } else {
136
- // Generate innerHTML directly without calling element.innerHTML to avoid recursion
137
- let childHTML = '';
138
- for (const child of element._childNodesInternal || []) {
139
- if (child.nodeType === TEXT_NODE) {
140
- childHTML += (child as any)._nodeValue || '';
141
- } else if (child.nodeType === ELEMENT_NODE) {
142
- childHTML += this.generateChildElementHTML(child as any);
143
- } else if (child.nodeType === 8) { // COMMENT_NODE
144
- childHTML += `<!--${(child as any).textContent || ''}-->`;
145
- }
146
- }
147
- return `<${tagName}${attrs}>${childHTML}</${tagName}>`;
247
+ // Handle text content before next tag
248
+ if (nextTagStart === -1) {
249
+ let text = html.substring(i).trim();
250
+ if (text) {
251
+ text = this.fixBrokenClosingTags(text);
252
+ if (TextBase) targetNode.appendChild(new TextBase(text, this._ownerDocument));
148
253
  }
149
- }
150
-
151
- /**
152
- * Improved HTML parser for innerHTML using a stack-based approach
153
- */
154
- private parseAndAppendHTML(html: string): void {
155
- const ElementFactory = require('../../factory/ElementFactory').ElementFactory;
156
-
157
- let i = 0;
158
- const length = html.length;
159
-
160
- while (i < length) {
161
- const nextTagStart = html.indexOf('<', i);
162
-
163
- // Handle text content before next tag
164
- if (nextTagStart === -1) {
165
- // No more tags, rest is text
166
- let text = html.substring(i).trim();
167
- if (text) {
168
- // Fix broken closing tags (e.g., "/div>" -> "</div>")
169
- text = this.fixBrokenClosingTags(text);
170
- const { TextBase } = require('../TextBase');
171
- const textNode = new TextBase(text, this._ownerDocument);
172
- this.appendChild(textNode);
173
- }
174
- break;
175
- } else if (nextTagStart > i) {
176
- // Text content before the tag
177
- let text = html.substring(i, nextTagStart).trim();
178
- if (text) {
179
- // Fix broken closing tags (e.g., "/div>" -> "</div>")
180
- text = this.fixBrokenClosingTags(text);
181
- const { TextBase } = require('../TextBase');
182
- const textNode = new TextBase(text, this._ownerDocument);
183
- this.appendChild(textNode);
184
- }
185
- }
186
-
187
- i = nextTagStart;
188
-
189
- // Parse the tag - find the real tag end, considering quoted attributes
190
- const tagEnd = this.findTagEnd(html, i);
191
- if (tagEnd === -1) break;
192
-
193
- const tagContent = html.substring(i + 1, tagEnd);
194
-
195
- // Handle comments
196
- if (tagContent.startsWith('!--')) {
197
- const commentEnd = html.indexOf('-->', i);
198
- if (commentEnd !== -1) {
199
- const commentContent = html.substring(i + 4, commentEnd);
200
- const { Comment } = require('../Comment');
201
- const commentNode = new Comment(commentContent, this._ownerDocument);
202
- this.appendChild(commentNode);
203
- i = commentEnd + 3;
204
- continue;
205
- }
206
- }
207
-
208
- // Handle self-closing tags
209
- if (tagContent.endsWith('/')) {
210
- const parts = tagContent.slice(0, -1).trim().split(/\s+/);
211
- const tagName = parts[0];
212
- const attributeString = tagContent.slice(tagName.length, -1).trim();
213
-
214
- const element = ElementFactory.createElement(tagName, this._ownerDocument);
215
- this.parseAttributes(element, attributeString);
216
- this.appendChild(element);
217
- i = tagEnd + 1;
218
- continue;
219
- }
220
-
221
- // Handle closing tags - if they don't have matching opening tags, treat as text
222
- if (tagContent.startsWith('/')) {
223
- // For now, treat unmatched closing tags as text content
224
- const closingTagText = `<${tagContent}>`;
225
- const { TextBase } = require('../TextBase');
226
- const textNode = new TextBase(closingTagText, this._ownerDocument);
227
- this.appendChild(textNode);
228
- i = tagEnd + 1;
229
- continue;
230
- }
231
-
232
- // Handle opening tags
233
- const parts = tagContent.split(/\s+/);
234
- const tagName = parts[0];
235
- const attributeString = tagContent.slice(tagName.length).trim();
236
-
237
- // Special handling for style and script tags
238
- if (tagName === 'style' || tagName === 'script') {
239
- const closingTag = `</${tagName}>`;
240
- const closingTagIndex = html.indexOf(closingTag, tagEnd + 1);
241
-
242
- if (closingTagIndex !== -1) {
243
- const element = ElementFactory.createElement(tagName, this._ownerDocument);
244
- this.parseAttributes(element, attributeString);
245
-
246
- const content = html.substring(tagEnd + 1, closingTagIndex);
247
- if (content) {
248
- const { TextBase } = require('../TextBase');
249
- const textNode = new TextBase(content, this._ownerDocument);
250
- element.appendChild(textNode);
251
- }
252
-
253
- this.appendChild(element);
254
- i = closingTagIndex + closingTag.length;
255
- continue;
256
- }
257
- }
258
-
259
- // Handle regular opening tags with content
260
- const closingTag = `</${tagName}>`;
261
- const closingTagIndex = this.findMatchingClosingTag(html, tagName, tagEnd + 1);
262
-
263
- if (closingTagIndex !== -1) {
264
- const element = ElementFactory.createElement(tagName, this._ownerDocument);
265
- this.parseAttributes(element, attributeString);
266
-
267
- const content = html.substring(tagEnd + 1, closingTagIndex);
268
- if (content.trim()) {
269
- element.innerHTML = content;
270
- }
271
-
272
- this.appendChild(element);
273
- i = closingTagIndex + closingTag.length;
274
- } else {
275
- // No matching closing tag found, treat as self-closing
276
- const element = ElementFactory.createElement(tagName, this._ownerDocument);
277
- this.parseAttributes(element, attributeString);
278
- this.appendChild(element);
279
- i = tagEnd + 1;
280
- }
254
+ break;
255
+ } else if (nextTagStart > i) {
256
+ let text = html.substring(i, nextTagStart).trim();
257
+ if (text) {
258
+ text = this.fixBrokenClosingTags(text);
259
+ if (TextBase) targetNode.appendChild(new TextBase(text, this._ownerDocument));
281
260
  }
282
- }
283
-
284
- /**
285
- * Find the real end of a tag, considering quoted attributes
286
- */
287
- private findTagEnd(html: string, startIndex: number): number {
288
- let i = startIndex + 1; // Skip the '<'
289
- let inQuotes = false;
290
- let quoteChar = '';
291
-
292
- while (i < html.length) {
293
- const char = html[i];
294
-
295
- if (!inQuotes) {
296
- if (char === '"' || char === "'") {
297
- inQuotes = true;
298
- quoteChar = char;
299
- } else if (char === '>') {
300
- return i;
301
- }
302
- } else {
303
- if (char === quoteChar) {
304
- inQuotes = false;
305
- quoteChar = '';
306
- }
307
- }
308
-
309
- i++;
261
+ }
262
+
263
+ i = nextTagStart;
264
+ const tagEnd = this.findTagEnd(html, i);
265
+ if (tagEnd === -1) break;
266
+
267
+ const tagContent = html.substring(i + 1, tagEnd);
268
+
269
+ // Handle comments
270
+ if (tagContent.startsWith('!--')) {
271
+ const commentEnd = html.indexOf('-->', i);
272
+ if (commentEnd !== -1) {
273
+ const commentContent = html.substring(i + 4, commentEnd);
274
+ if (Comment) targetNode.appendChild(new Comment(commentContent, this._ownerDocument));
275
+ i = commentEnd + 3;
276
+ continue;
310
277
  }
311
-
312
- return -1; // No closing '>' found
313
- }
314
-
315
- /**
316
- * Fix broken closing tags in text content
317
- * Converts patterns like "/div>" to "</div>"
318
- */
319
- private fixBrokenClosingTags(text: string): string {
320
- // Pattern to match broken closing tags: /tagname>
321
- return text.replace(/\/(\w+)>/g, '</$1>');
322
- }
323
-
324
- /**
325
- * Find the matching closing tag, accounting for nested tags of the same type
326
- */
327
- private findMatchingClosingTag(html: string, tagName: string, startIndex: number): number {
328
- const openTag = `<${tagName}`;
329
- const closeTag = `</${tagName}>`;
330
- let depth = 1;
331
- let i = startIndex;
332
-
333
- while (i < html.length && depth > 0) {
334
- const nextOpen = html.indexOf(openTag, i);
335
- const nextClose = html.indexOf(closeTag, i);
336
-
337
- if (nextClose === -1) {
338
- return -1; // No closing tag found
339
- }
340
-
341
- if (nextOpen !== -1 && nextOpen < nextClose) {
342
- // Found another opening tag before the closing tag
343
- // Make sure it's a complete tag (not just a substring)
344
- const afterTag = html.charAt(nextOpen + openTag.length);
345
- if (afterTag === ' ' || afterTag === '>' || afterTag === '/') {
346
- depth++;
347
- }
348
- i = nextOpen + openTag.length;
349
- } else {
350
- // Found a closing tag
351
- depth--;
352
- if (depth === 0) {
353
- return nextClose;
354
- }
355
- i = nextClose + closeTag.length;
356
- }
278
+ }
279
+
280
+ // Handle self-closing tags
281
+ if (tagContent.endsWith('/')) {
282
+ const parts = tagContent.slice(0, -1).trim().split(/\s+/);
283
+ const tagName = parts[0];
284
+ const attributeString = tagContent.slice(tagName.length, -1).trim();
285
+ const element = ElementFactory.createElement(tagName, this._ownerDocument);
286
+ this.parseAttributes(element, attributeString);
287
+ targetNode.appendChild(element);
288
+ i = tagEnd + 1;
289
+ continue;
290
+ }
291
+
292
+ // Handle closing tags
293
+ if (tagContent.startsWith('/')) {
294
+ const closingTagText = `<${tagContent}>`;
295
+ if (TextBase) targetNode.appendChild(new TextBase(closingTagText, this._ownerDocument));
296
+ i = tagEnd + 1;
297
+ continue;
298
+ }
299
+
300
+ // Handle opening tags
301
+ const parts = tagContent.split(/\s+/);
302
+ const tagName = parts[0];
303
+ const attributeString = tagContent.slice(tagName.length).trim();
304
+
305
+ // Special handling for style and script tags
306
+ if (tagName === 'style' || tagName === 'script') {
307
+ const closingTag = `</${tagName}>`;
308
+ const closingTagIndex = html.indexOf(closingTag, tagEnd + 1);
309
+
310
+ if (closingTagIndex !== -1) {
311
+ const element = ElementFactory.createElement(tagName, this._ownerDocument);
312
+ this.parseAttributes(element, attributeString);
313
+ const content = html.substring(tagEnd + 1, closingTagIndex);
314
+ if (content && TextBase) {
315
+ element.appendChild(new TextBase(content, this._ownerDocument));
316
+ }
317
+ targetNode.appendChild(element);
318
+ i = closingTagIndex + closingTag.length;
319
+ continue;
357
320
  }
321
+ }
358
322
 
359
- return -1;
360
- }
361
-
362
- /**
363
- * Parse attributes from attribute string
364
- */
365
- private parseAttributes(element: any, attributeString: string): void {
366
- // Improved attribute parsing that handles complex JavaScript expressions
367
- let position = 0;
368
- const length = attributeString.length;
323
+ // Handle regular opening tags with content
324
+ const closingTagIndex = this.findMatchingClosingTag(html, tagName, tagEnd + 1);
369
325
 
370
- while (position < length) {
371
- // Skip whitespace
372
- while (position < length && /\s/.test(attributeString[position])) {
373
- position++;
374
- }
375
-
376
- if (position >= length) break;
377
-
378
- // Find attribute name
379
- const nameStart = position;
380
- while (position < length && /[\w:-]/.test(attributeString[position])) {
381
- position++;
382
- }
383
-
384
- if (position === nameStart) {
385
- // Invalid character, skip it
386
- position++;
387
- continue;
388
- }
389
-
390
- const name = attributeString.substring(nameStart, position);
391
-
392
- // Skip whitespace
393
- while (position < length && /\s/.test(attributeString[position])) {
394
- position++;
395
- }
396
-
397
- let value = '';
398
-
399
- // Check if there's an equals sign
400
- if (position < length && attributeString[position] === '=') {
401
- position++; // Skip '='
402
-
403
- // Skip whitespace
404
- while (position < length && /\s/.test(attributeString[position])) {
405
- position++;
406
- }
407
-
408
- if (position < length) {
409
- const quote = attributeString[position];
410
-
411
- if (quote === '"' || quote === "'") {
412
- // Quoted value - find matching closing quote
413
- position++; // Skip opening quote
414
- const valueStart = position;
415
-
416
- while (position < length && attributeString[position] !== quote) {
417
- position++;
418
- }
419
-
420
- value = attributeString.substring(valueStart, position);
421
-
422
- if (position < length && attributeString[position] === quote) {
423
- position++; // Skip closing quote
424
- }
425
- } else {
426
- // Unquoted value - read until whitespace or end
427
- const valueStart = position;
428
- while (position < length && !/\s/.test(attributeString[position])) {
429
- position++;
430
- }
431
- value = attributeString.substring(valueStart, position);
432
- }
433
- }
434
- }
435
-
436
- // Decode HTML entities in attribute values
437
- value = this.decodeHTMLEntities(value);
438
-
439
- element.setAttribute(name, value);
326
+ if (closingTagIndex !== -1) {
327
+ const element = ElementFactory.createElement(tagName, this._ownerDocument);
328
+ this.parseAttributes(element, attributeString);
329
+ const content = html.substring(tagEnd + 1, closingTagIndex);
330
+ if (content.trim()) {
331
+ element.innerHTML = content;
440
332
  }
441
- }
442
-
443
- /**
444
- * Escape HTML entities in a string to prevent XSS
445
- */
446
- protected escapeHTMLEntities(str: string): string {
447
- const entityMap: { [key: string]: string } = {
448
- '&': '&amp;',
449
- '<': '&lt;',
450
- '>': '&gt;',
451
- '"': '&quot;',
452
- "'": '&#39;'
453
- };
454
-
455
- return str.replace(/[&<>"']/g, (char) => {
456
- return entityMap[char] || char;
457
- });
458
- }
459
-
460
- /**
461
- * Decode HTML entities in a string
462
- */
463
- protected decodeHTMLEntities(str: string): string {
464
- const entityMap: { [key: string]: string } = {
465
- '&amp;': '&',
466
- '&lt;': '<',
467
- '&gt;': '>',
468
- '&quot;': '"',
469
- '&#39;': "'",
470
- '&#34;': '"',
471
- '&apos;': "'",
472
- '&copy;': '©',
473
- '&reg;': '®',
474
- '&trade;': '™',
475
- '&nbsp;': ' ',
476
- '&hellip;': '…',
477
- '&mdash;': '—',
478
- '&ndash;': '–',
479
- '&lsquo;': '\u2018',
480
- '&rsquo;': '\u2019',
481
- '&ldquo;': '"',
482
- '&rdquo;': '"'
483
- };
484
-
485
- return str.replace(/&[a-zA-Z0-9#]+;/g, (entity) => {
486
- // Handle named entities
487
- if (entityMap[entity]) {
488
- return entityMap[entity];
489
- }
490
-
491
- // Handle numeric entities like &#39; &#34;
492
- if (entity.startsWith('&#') && entity.endsWith(';')) {
493
- const numStr = entity.slice(2, -1);
494
- const num = parseInt(numStr, 10);
495
- if (!isNaN(num)) {
496
- return String.fromCharCode(num);
497
- }
498
- }
499
-
500
- // Handle hex entities like &#x27;
501
- if (entity.startsWith('&#x') && entity.endsWith(';')) {
502
- const hexStr = entity.slice(3, -1);
503
- const num = parseInt(hexStr, 16);
504
- if (!isNaN(num)) {
505
- return String.fromCharCode(num);
506
- }
507
- }
508
-
509
- // Return original if not recognized
510
- return entity;
511
- });
512
- }
513
-
514
- get outerHTML(): string {
515
- const attrs = Array.from(this._attributes.entries())
516
- .map(([name, value]) => value === '' ? ` ${name}` : ` ${name}="${value.replace(/"/g, '&quot;')}"`)
517
- .join('');
518
-
519
- // Check if it's a self-closing tag
520
- const selfClosingTags = ['img', 'input', 'br', 'hr', 'meta', 'link', 'area', 'base', 'col', 'embed', 'source', 'track', 'wbr'];
521
- const isSelfClosing = selfClosingTags.includes(this.tagName.toLowerCase());
522
-
523
- if (isSelfClosing) {
524
- return `<${this.tagName.toLowerCase()}${attrs} />`;
525
- } else {
526
- return `<${this.tagName.toLowerCase()}${attrs}>${this.innerHTML}</${this.tagName.toLowerCase()}>`;
333
+ targetNode.appendChild(element);
334
+ i = closingTagIndex + (tagName.length + 3); // </tagName>
335
+ } else {
336
+ const element = ElementFactory.createElement(tagName, this._ownerDocument);
337
+ this.parseAttributes(element, attributeString);
338
+ targetNode.appendChild(element);
339
+ i = tagEnd + 1;
340
+ }
341
+ }
342
+ }
343
+
344
+ private findTagEnd(html: string, startIndex: number): number {
345
+ let i = startIndex + 1;
346
+ let inQuotes = false;
347
+ let quoteChar = '';
348
+ while (i < html.length) {
349
+ const char = html[i];
350
+ if (!inQuotes) {
351
+ if (char === '"' || char === "'") {
352
+ inQuotes = true;
353
+ quoteChar = char;
354
+ } else if (char === '>') return i;
355
+ } else {
356
+ if (char === quoteChar) {
357
+ inQuotes = false;
358
+ quoteChar = '';
527
359
  }
528
- }
529
-
530
- get namespaceURI(): string | null {
531
- return 'http://www.w3.org/1999/xhtml';
532
- }
533
-
534
- get prefix(): string | null {
535
- return null;
536
- }
537
-
538
- // Attribute methods
539
- getAttribute(qualifiedName: string): string | null {
540
- const value = this._attributes.get(qualifiedName.toLowerCase());
541
- return value !== undefined ? value : null;
542
- }
543
-
544
- setAttribute(qualifiedName: string, value: string): void {
545
- const name = qualifiedName.toLowerCase();
546
- this._attributes.set(name, value);
547
-
548
- // Update special properties
549
- if (name === 'id') {
550
- this._id = value;
551
- } else if (name === 'class') {
552
- this._className = value;
360
+ }
361
+ i++;
362
+ }
363
+ return -1;
364
+ }
365
+
366
+ private fixBrokenClosingTags(text: string): string {
367
+ return text.replace(/\/(\w+)>/g, '</$1>');
368
+ }
369
+
370
+ private findMatchingClosingTag(html: string, tagName: string, startIndex: number): number {
371
+ const openTag = `<${tagName}`;
372
+ const closeTag = `</${tagName}>`;
373
+ let depth = 1;
374
+ let i = startIndex;
375
+ while (i < html.length && depth > 0) {
376
+ const nextOpen = html.indexOf(openTag, i);
377
+ const nextClose = html.indexOf(closeTag, i);
378
+ if (nextClose === -1) return -1;
379
+ if (nextOpen !== -1 && nextOpen < nextClose) {
380
+ const afterTag = html.charAt(nextOpen + openTag.length);
381
+ if (afterTag === ' ' || afterTag === '>' || afterTag === '/') depth++;
382
+ i = nextOpen + openTag.length;
383
+ } else {
384
+ depth--;
385
+ if (depth === 0) return nextClose;
386
+ i = nextClose + closeTag.length;
387
+ }
388
+ }
389
+ return -1;
390
+ }
391
+
392
+ private parseAttributes(element: any, attributeString: string): void {
393
+ let position = 0;
394
+ const length = attributeString.length;
395
+ while (position < length) {
396
+ while (position < length && /\s/.test(attributeString[position])) position++;
397
+ if (position >= length) break;
398
+ const nameStart = position;
399
+ while (position < length && /[\w:-]/.test(attributeString[position])) position++;
400
+ if (position === nameStart) {
401
+ position++;
402
+ continue;
403
+ }
404
+ const name = attributeString.substring(nameStart, position);
405
+ while (position < length && /\s/.test(attributeString[position])) position++;
406
+ let value = '';
407
+ if (position < length && attributeString[position] === '=') {
408
+ position++;
409
+ while (position < length && /\s/.test(attributeString[position])) position++;
410
+ if (position < length) {
411
+ const quote = attributeString[position];
412
+ if (quote === '"' || quote === "'") {
413
+ position++;
414
+ const valueStart = position;
415
+ while (position < length && attributeString[position] !== quote) position++;
416
+ value = attributeString.substring(valueStart, position);
417
+ if (position < length && attributeString[position] === quote) position++;
418
+ } else {
419
+ const valueStart = position;
420
+ while (position < length && !/\s/.test(attributeString[position])) position++;
421
+ value = attributeString.substring(valueStart, position);
422
+ }
553
423
  }
554
- }
555
-
556
- removeAttribute(qualifiedName: string): void {
557
- const name = qualifiedName.toLowerCase();
558
- this._attributes.delete(name);
559
-
560
- // Update special properties
561
- if (name === 'id') {
562
- this._id = '';
563
- } else if (name === 'class') {
564
- this._className = '';
424
+ }
425
+ element.setAttribute(name, this.decodeHTMLEntities(value));
426
+ }
427
+ }
428
+
429
+ protected escapeHTMLEntities(str: string): string {
430
+ const entityMap: any = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
431
+ return str.replace(/[&<>"']/g, char => entityMap[char] || char);
432
+ }
433
+
434
+ protected decodeHTMLEntities(str: string): string {
435
+ const entityMap: any = { '&amp;': '&', '&lt;': '<', '&gt;': '>', '&quot;': '"', '&#39;': "'", '&#34;': '"', '&apos;': "'", '&copy;': '©', '&reg;': '®', '&trade;': '™', '&nbsp;': ' ', '&hellip;': '…', '&mdash;': '—', '&ndash;': '–', '&lsquo;': '\u2018', '&rsquo;': '\u2019', '&ldquo;': '"', '&rdquo;': '"' };
436
+ return str.replace(/&[a-zA-Z0-9#]+;/g, entity => {
437
+ if (entityMap[entity]) return entityMap[entity];
438
+ if (entity.startsWith('&#') && entity.endsWith(';')) {
439
+ const num = parseInt(entity.slice(2, -1), 10);
440
+ return isNaN(num) ? entity : String.fromCharCode(num);
441
+ }
442
+ if (entity.startsWith('&#x') && entity.endsWith(';')) {
443
+ const num = parseInt(entity.slice(3, -1), 16);
444
+ return isNaN(num) ? entity : String.fromCharCode(num);
445
+ }
446
+ return entity;
447
+ });
448
+ }
449
+
450
+ get outerHTML(): string {
451
+ const attrs = Array.from(this._attributes.entries())
452
+ .map(([name, value]) => (value === '' ? ` ${name}` : ` ${name}="${value.replace(/"/g, '&quot;')}"`))
453
+ .join('');
454
+ const selfClosingTags = ['img', 'input', 'br', 'hr', 'meta', 'link', 'area', 'base', 'col', 'embed', 'source', 'track', 'wbr'];
455
+ const isSelfClosing = selfClosingTags.includes(this.tagName.toLowerCase());
456
+ return isSelfClosing ? `<${this.tagName.toLowerCase()}${attrs} />` : `<${this.tagName.toLowerCase()}${attrs}>${this.innerHTML}</${this.tagName.toLowerCase()}>`;
457
+ }
458
+
459
+ get namespaceURI(): string | null {
460
+ return 'http://www.w3.org/1999/xhtml';
461
+ }
462
+ get prefix(): string | null {
463
+ return null;
464
+ }
465
+ getAttribute(qualifiedName: string): string | null {
466
+ return this._attributes.get(qualifiedName.toLowerCase()) ?? null;
467
+ }
468
+ setAttribute(qualifiedName: string, value: string): void {
469
+ const name = qualifiedName.toLowerCase();
470
+ this._attributes.set(name, value);
471
+ if (name === 'id') this._id = value;
472
+ else if (name === 'class') this._className = value;
473
+ }
474
+ removeAttribute(qualifiedName: string): void {
475
+ const name = qualifiedName.toLowerCase();
476
+ this._attributes.delete(name);
477
+ if (name === 'id') this._id = '';
478
+ else if (name === 'class') this._className = '';
479
+ }
480
+ hasAttribute(qualifiedName: string): boolean {
481
+ return this._attributes.has(qualifiedName.toLowerCase());
482
+ }
483
+ closest(selectors: string): any {
484
+ let element: Element | null = this as any;
485
+ while (element) {
486
+ if (element.matches && element.matches(selectors)) return element;
487
+ element = element.parentElement;
488
+ }
489
+ return null;
490
+ }
491
+ matches(selectors: string): boolean {
492
+ return CSSSelector.matches(this as any, selectors);
493
+ }
494
+ get attributes(): any {
495
+ return new (NamedNodeMapImpl as any)(this._attributes);
496
+ }
497
+ get clientHeight(): number {
498
+ return 0;
499
+ }
500
+ get clientLeft(): number {
501
+ return 0;
502
+ }
503
+ get clientTop(): number {
504
+ return 0;
505
+ }
506
+ get clientWidth(): number {
507
+ return 0;
508
+ }
509
+ get currentCSSZoom(): number {
510
+ return 1;
511
+ }
512
+ onfullscreenchange: any = null;
513
+ onfullscreenerror: any = null;
514
+ get part(): any {
515
+ return { length: 0, value: '', add: () => {}, remove: () => {}, contains: () => false, toggle: () => false, replace: () => false, item: () => null };
516
+ }
517
+ get scrollHeight(): number {
518
+ return 0;
519
+ }
520
+ get scrollLeft(): number {
521
+ return 0;
522
+ }
523
+ set scrollLeft(_: number) {}
524
+ get scrollTop(): number {
525
+ return 0;
526
+ }
527
+ set scrollTop(_: number) {}
528
+ get scrollWidth(): number {
529
+ return 0;
530
+ }
531
+ get shadowRoot(): ShadowRoot | null {
532
+ return this._shadowRoot;
533
+ }
534
+ get slot(): string {
535
+ return this.getAttribute('slot') || '';
536
+ }
537
+ set slot(value: string) {
538
+ this.setAttribute('slot', value);
539
+ }
540
+ attachShadow(init: ShadowRootInit): ShadowRoot {
541
+ if (this._shadowRoot) throw new DOMException('Shadow root already attached', 'NotSupportedError');
542
+ this._shadowRoot = new ShadowRootBase(this as any, init, this._ownerDocument) as unknown as ShadowRoot;
543
+ return this._shadowRoot;
544
+ }
545
+ checkVisibility(_options?: any): boolean {
546
+ return true;
547
+ }
548
+ computedStyleMap(): any {
549
+ return new Map();
550
+ }
551
+ getAttributeNS(_ns: string | null, localName: string): string | null {
552
+ return this.getAttribute(localName);
553
+ }
554
+ getAttributeNames(): string[] {
555
+ return Array.from(this._attributes.keys());
556
+ }
557
+ getAttributeNode(qualifiedName: string): any {
558
+ const value = this.getAttribute(qualifiedName);
559
+ return value !== null ? new AttrImpl(qualifiedName, value) : null;
560
+ }
561
+ getAttributeNodeNS(_ns: string | null, localName: string): any {
562
+ return this.getAttributeNode(localName);
563
+ }
564
+ getBoundingClientRect(): any {
565
+ return { bottom: 0, height: 0, left: 0, right: 0, top: 0, width: 0, x: 0, y: 0, toJSON: () => ({}) };
566
+ }
567
+ getClientRects(): any {
568
+ return { length: 0, item: () => null, [Symbol.iterator]: function* () {} };
569
+ }
570
+
571
+ getElementsByClassName(classNames: string): HTMLCollectionOf<Element> {
572
+ const result: Element[] = [];
573
+ const classNameList = classNames.trim().split(/\s+/);
574
+ const hasAllClasses = (element: Element, classes: string[]): boolean => {
575
+ const elementClasses = element.className.trim().split(/\s+/);
576
+ return classes.every(cls => elementClasses.includes(cls));
577
+ };
578
+ const traverse = (node: any) => {
579
+ if (node.nodeType === ELEMENT_NODE && hasAllClasses(node as Element, classNameList)) result.push(node as Element);
580
+ for (let i = 0; i < node.childNodes.length; i++) traverse(node.childNodes[i]);
581
+ };
582
+ for (let i = 0; i < this.childNodes.length; i++) traverse(this.childNodes[i]);
583
+ // @ts-ignore
584
+ return new HTMLCollectionOfImp(result);
585
+ }
586
+
587
+ getElementsByTagName(qualifiedName: string): HTMLCollection {
588
+ const result: Element[] = [];
589
+ const tagName = qualifiedName.toLowerCase();
590
+ const isWildcard = tagName === '*';
591
+ const traverse = (node: any) => {
592
+ if (node.nodeType === ELEMENT_NODE && (isWildcard || node.localName === tagName)) result.push(node as Element);
593
+ for (let i = 0; i < node.childNodes.length; i++) traverse(node.childNodes[i]);
594
+ };
595
+ for (let i = 0; i < this.childNodes.length; i++) traverse(this.childNodes[i]);
596
+ // @ts-ignore
597
+ return new HTMLCollectionImp(result);
598
+ }
599
+ getElementsByTagNameNS(_ns: string | null, localName: string): any {
600
+ return this.getElementsByTagName(localName);
601
+ }
602
+ getHTML(_options?: any): string {
603
+ return this.outerHTML;
604
+ }
605
+ hasAttributeNS(_ns: string | null, localName: string): boolean {
606
+ return this.hasAttribute(localName);
607
+ }
608
+ hasAttributes(): boolean {
609
+ return this._attributes.size > 0;
610
+ }
611
+ hasPointerCapture(_id: number): boolean {
612
+ return false;
613
+ }
614
+ insertAdjacentElement(where: InsertPosition, element: Element): Element | null {
615
+ const position = where.toLowerCase();
616
+ switch (position) {
617
+ case 'beforebegin':
618
+ if (this.parentNode) {
619
+ this.parentNode.insertBefore(element as any, this as any);
620
+ return element;
565
621
  }
566
- }
567
-
568
- hasAttribute(qualifiedName: string): boolean {
569
- return this._attributes.has(qualifiedName.toLowerCase());
570
- }
571
-
572
- /**
573
- * Returns the closest ancestor element (including the element itself) that matches the specified CSS selector.
574
- *
575
- * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/closest)
576
- */
577
- closest<K extends keyof HTMLElementTagNameMap>(selector: K): HTMLElementTagNameMap[K] | null;
578
- closest<K extends keyof SVGElementTagNameMap>(selector: K): SVGElementTagNameMap[K] | null;
579
- closest<K extends keyof MathMLElementTagNameMap>(selector: K): MathMLElementTagNameMap[K] | null;
580
- closest<E extends Element = Element>(selectors: string): E | null;
581
- closest(selectors: string): Element | null {
582
- let element: Element | null = this as any;
583
-
584
- while (element) {
585
- if (element.matches && element.matches(selectors)) {
586
- return element;
587
- }
588
- element = element.parentElement;
589
- }
590
-
591
622
  return null;
592
- }
593
-
594
- /**
595
- * Returns true if the element would be selected by the specified CSS selector; otherwise, returns false.
596
- *
597
- * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/matches)
598
- */
599
- matches(selectors: string): boolean {
600
- return CSSSelector.matches(this as any, selectors);
601
- }
602
-
603
- // ChildNode methods are inherited from ParentNodeBase -> ChildNodeBase
604
-
605
- // Additional Element properties and methods - Not implemented yet
606
-
607
- get attributes(): NamedNodeMap {
608
- return new NamedNodeMapImpl(this._attributes);
609
- }
610
-
611
- get clientHeight(): number {
612
- throw new Error('Element.clientHeight is not implemented yet');
613
- }
614
-
615
- get clientLeft(): number {
616
- throw new Error('Element.clientLeft is not implemented yet');
617
- }
618
-
619
- get clientTop(): number {
620
- throw new Error('Element.clientTop is not implemented yet');
621
- }
622
-
623
- get clientWidth(): number {
624
- throw new Error('Element.clientWidth is not implemented yet');
625
- }
626
-
627
- get currentCSSZoom(): number {
628
- throw new Error('Element.currentCSSZoom is not implemented yet');
629
- }
630
-
631
- onfullscreenchange: ((this: Element, ev: Event) => any) | null = null;
632
- onfullscreenerror: ((this: Element, ev: Event) => any) | null = null;
633
-
634
- get part(): any {
635
- throw new Error('Element.part is not implemented yet');
636
- }
637
-
638
- get scrollHeight(): number {
639
- throw new Error('Element.scrollHeight is not implemented yet');
640
- }
641
-
642
- get scrollLeft(): number {
643
- throw new Error('Element.scrollLeft is not implemented yet');
644
- }
645
-
646
- set scrollLeft(value: number) {
647
- throw new Error('Element.scrollLeft setter is not implemented yet');
648
- }
649
-
650
- get scrollTop(): number {
651
- throw new Error('Element.scrollTop is not implemented yet');
652
- }
653
-
654
- set scrollTop(value: number) {
655
- throw new Error('Element.scrollTop setter is not implemented yet');
656
- }
657
-
658
- get scrollWidth(): number {
659
- throw new Error('Element.scrollWidth is not implemented yet');
660
- }
661
-
662
- get shadowRoot(): any {
663
- throw new Error('Element.shadowRoot is not implemented yet');
664
- }
665
-
666
- get slot(): string {
667
- throw new Error('Element.slot is not implemented yet');
668
- }
669
-
670
- set slot(value: string) {
671
- throw new Error('Element.slot setter is not implemented yet');
672
- }
673
-
674
- // Methods - Not implemented yet
675
-
676
- attachShadow(init: any): any {
677
- throw new Error('Element.attachShadow() is not implemented yet');
678
- }
679
-
680
- checkVisibility(options?: any): boolean {
681
- throw new Error('Element.checkVisibility() is not implemented yet');
682
- }
683
-
684
- computedStyleMap(): any {
685
- throw new Error('Element.computedStyleMap() is not implemented yet');
686
- }
687
-
688
- getAttributeNS(namespace: string | null, localName: string): string | null {
689
- // For simplicity, we'll ignore namespace and use localName
690
- return this.getAttribute(localName);
691
- }
692
-
693
- getAttributeNames(): string[] {
694
- return Array.from(this._attributes.keys());
695
- }
696
-
697
- getAttributeNode(qualifiedName: string): Attr | null {
698
- const value = this.getAttribute(qualifiedName);
699
- if (value !== null) {
700
- return new AttrImpl(qualifiedName, value);
623
+ case 'afterbegin':
624
+ if (this.firstChild) this.insertBefore(element as any, this.firstChild);
625
+ else this.appendChild(element as any);
626
+ return element;
627
+ case 'beforeend':
628
+ this.appendChild(element as any);
629
+ return element;
630
+ case 'afterend':
631
+ if (this.parentNode) {
632
+ if (this.nextSibling) this.parentNode.insertBefore(element as any, this.nextSibling);
633
+ else this.parentNode.appendChild(element as any);
634
+ return element;
701
635
  }
702
636
  return null;
703
- }
704
-
705
- getAttributeNodeNS(namespace: string | null, localName: string): Attr | null {
706
- // For simplicity, we'll ignore namespace and use localName
707
- return this.getAttributeNode(localName);
708
- }
709
-
710
- getBoundingClientRect(): DOMRect {
711
- return {
712
- bottom: 0,
713
- height: 0,
714
- left: 0,
715
- right: 0,
716
- top: 0,
717
- width: 0,
718
- x: 0,
719
- y: 0,
720
- toJSON: () => ({})
721
- };
722
- }
723
-
724
- getClientRects(): any {
725
- throw new Error('Element.getClientRects() is not implemented yet');
726
- }
727
-
728
- getElementsByClassName(classNames: string): HTMLCollection {
729
- const result: Element[] = [];
730
- const classNameList = classNames.trim().split(/\s+/);
731
-
732
- // Helper function to check if element has all specified classes
733
- const hasAllClasses = (element: Element, classes: string[]): boolean => {
734
- const elementClasses = element.className.trim().split(/\s+/);
735
- return classes.every(cls => elementClasses.includes(cls));
736
- };
737
-
738
- // Recursive function to traverse all descendants
739
- const traverse = (node: any) => {
740
- if (node.nodeType === ELEMENT_NODE) {
741
- const element = node as Element;
742
- if (hasAllClasses(element, classNameList)) {
743
- result.push(element);
744
- }
745
- }
746
-
747
- // Traverse children
748
- for (let i = 0; i < node.childNodes.length; i++) {
749
- traverse(node.childNodes[i]);
750
- }
751
- };
752
-
753
- // Start traversal from this element's children
754
- for (let i = 0; i < this.childNodes.length; i++) {
755
- traverse(this.childNodes[i]);
756
- }
757
-
758
- return new HTMLCollection(result);
759
- }
760
-
761
- getElementsByTagName(qualifiedName: string): HTMLCollection {
762
- const result: Element[] = [];
763
- const tagName = qualifiedName.toLowerCase();
764
- const isWildcard = tagName === '*';
765
-
766
- // Recursive function to traverse all descendants
767
- const traverse = (node: any) => {
768
- if (node.nodeType === ELEMENT_NODE) {
769
- const element = node as Element;
770
- if (isWildcard || element.localName === tagName) {
771
- result.push(element);
772
- }
773
- }
774
-
775
- // Traverse children
776
- for (let i = 0; i < node.childNodes.length; i++) {
777
- traverse(node.childNodes[i]);
778
- }
779
- };
780
-
781
- // Start traversal from this element's children
782
- for (let i = 0; i < this.childNodes.length; i++) {
783
- traverse(this.childNodes[i]);
784
- }
785
-
786
- return new HTMLCollection(result);
787
- }
788
-
789
- getElementsByTagNameNS(namespace: string | null, localName: string): any {
790
- // For simplicity, we'll implement this similar to getElementsByTagName
791
- // In a full implementation, namespace handling would be more complex
792
- return this.getElementsByTagName(localName);
793
- }
794
-
795
- getHTML(options?: any): string {
796
- throw new Error('Element.getHTML() is not implemented yet');
797
- }
798
-
799
- hasAttributeNS(namespace: string | null, localName: string): boolean {
800
- // For simplicity, we'll ignore namespace and use localName
801
- return this.hasAttribute(localName);
802
- }
803
-
804
- hasAttributes(): boolean {
805
- return this._attributes.size > 0;
806
- }
807
-
808
- hasPointerCapture(pointerId: number): boolean {
809
- throw new Error('Element.hasPointerCapture() is not implemented yet');
810
- }
811
-
812
- insertAdjacentElement(where: InsertPosition, element: Element): Element | null {
813
- const position = where.toLowerCase();
814
-
815
- switch (position) {
816
- case 'beforebegin':
817
- // Insert before this element
818
- if (this.parentNode) {
819
- this.parentNode.insertBefore(element as any, this as any);
820
- return element;
821
- }
822
- return null;
823
-
824
- case 'afterbegin':
825
- // Insert as first child of this element
826
- if (this.firstChild) {
827
- this.insertBefore(element as any, this.firstChild);
828
- } else {
829
- this.appendChild(element as any);
830
- }
831
- return element;
832
-
833
- case 'beforeend':
834
- // Insert as last child of this element
835
- this.appendChild(element as any);
836
- return element;
837
-
838
- case 'afterend':
839
- // Insert after this element
840
- if (this.parentNode) {
841
- if (this.nextSibling) {
842
- this.parentNode.insertBefore(element as any, this.nextSibling);
843
- } else {
844
- this.parentNode.appendChild(element as any);
845
- }
846
- return element;
847
- }
848
- return null;
849
-
850
- default:
851
- throw new DOMException(`Invalid position: ${where}`, 'SyntaxError');
637
+ default:
638
+ throw new DOMException(`Invalid position: ${where}`, 'SyntaxError');
639
+ }
640
+ }
641
+ insertAdjacentHTML(position: InsertPosition, html: string): void {
642
+ const pos = position.toLowerCase();
643
+ const tempDiv = this._ownerDocument.createElement('div');
644
+ tempDiv.innerHTML = html;
645
+ const fragment = this._ownerDocument.createDocumentFragment();
646
+ while (tempDiv.firstChild) fragment.appendChild(tempDiv.firstChild);
647
+ switch (pos) {
648
+ case 'beforebegin':
649
+ if (this.parentNode) this.parentNode.insertBefore(fragment, this as any);
650
+ break;
651
+ case 'afterbegin':
652
+ if (this.firstChild) this.insertBefore(fragment, this.firstChild);
653
+ else this.appendChild(fragment);
654
+ break;
655
+ case 'beforeend':
656
+ this.appendChild(fragment);
657
+ break;
658
+ case 'afterend':
659
+ if (this.parentNode) {
660
+ if (this.nextSibling) this.parentNode.insertBefore(fragment, this.nextSibling);
661
+ else this.parentNode.appendChild(fragment);
852
662
  }
853
- }
854
-
855
- insertAdjacentHTML(position: InsertPosition, html: string): void {
856
- const pos = position.toLowerCase();
857
-
858
- // Parse HTML string into elements
859
- const tempDiv = this._ownerDocument.createElement('div');
860
- tempDiv.innerHTML = html;
861
-
862
- // Move all parsed nodes to the target position
863
- const fragment = this._ownerDocument.createDocumentFragment();
864
- while (tempDiv.firstChild) {
865
- fragment.appendChild(tempDiv.firstChild);
663
+ break;
664
+ default:
665
+ throw new DOMException(`Invalid position: ${position}`, 'SyntaxError');
666
+ }
667
+ }
668
+ insertAdjacentText(where: InsertPosition, data: string): void {
669
+ const position = where.toLowerCase();
670
+ const textNode = this._ownerDocument.createTextNode(data);
671
+ switch (position) {
672
+ case 'beforebegin':
673
+ if (this.parentNode) this.parentNode.insertBefore(textNode, this as any);
674
+ break;
675
+ case 'afterbegin':
676
+ if (this.firstChild) this.insertBefore(textNode, this.firstChild);
677
+ else this.appendChild(textNode);
678
+ break;
679
+ case 'beforeend':
680
+ this.appendChild(textNode);
681
+ break;
682
+ case 'afterend':
683
+ if (this.parentNode) {
684
+ if (this.nextSibling) this.parentNode.insertBefore(textNode, this.nextSibling);
685
+ else this.parentNode.appendChild(textNode);
866
686
  }
867
-
868
- switch (pos) {
869
- case 'beforebegin':
870
- if (this.parentNode) {
871
- this.parentNode.insertBefore(fragment, this as any);
872
- }
873
- break;
874
-
875
- case 'afterbegin':
876
- if (this.firstChild) {
877
- this.insertBefore(fragment, this.firstChild);
878
- } else {
879
- this.appendChild(fragment);
880
- }
881
- break;
882
-
883
- case 'beforeend':
884
- this.appendChild(fragment);
885
- break;
886
-
887
- case 'afterend':
888
- if (this.parentNode) {
889
- if (this.nextSibling) {
890
- this.parentNode.insertBefore(fragment, this.nextSibling);
891
- } else {
892
- this.parentNode.appendChild(fragment);
893
- }
894
- }
895
- break;
896
-
897
- default:
898
- throw new DOMException(`Invalid position: ${position}`, 'SyntaxError');
899
- }
900
- }
901
-
902
- insertAdjacentText(where: InsertPosition, data: string): void {
903
- const position = where.toLowerCase();
904
-
905
- // Create text node
906
- const textNode = this._ownerDocument.createTextNode(data);
907
-
908
- switch (position) {
909
- case 'beforebegin':
910
- if (this.parentNode) {
911
- this.parentNode.insertBefore(textNode, this as any);
912
- }
913
- break;
914
-
915
- case 'afterbegin':
916
- if (this.firstChild) {
917
- this.insertBefore(textNode, this.firstChild);
918
- } else {
919
- this.appendChild(textNode);
920
- }
921
- break;
922
-
923
- case 'beforeend':
924
- this.appendChild(textNode);
925
- break;
926
-
927
- case 'afterend':
928
- if (this.parentNode) {
929
- if (this.nextSibling) {
930
- this.parentNode.insertBefore(textNode, this.nextSibling);
931
- } else {
932
- this.parentNode.appendChild(textNode);
933
- }
934
- }
935
- break;
936
-
937
- default:
938
- throw new DOMException(`Invalid position: ${where}`, 'SyntaxError');
939
- }
940
- }
941
-
942
- releasePointerCapture(pointerId: number): void {
943
- // throw new Error('Element.releasePointerCapture() is not implemented yet');
944
- }
945
-
946
- removeAttributeNS(namespace: string | null, localName: string): void {
947
- // For simplicity, we'll ignore namespace and use localName
948
- this.removeAttribute(localName);
949
- }
950
-
951
- removeAttributeNode(attr: Attr): Attr {
952
- const oldValue = this.getAttribute(attr.name);
953
- if (oldValue !== null) {
954
- this.removeAttribute(attr.name);
955
- return new AttrImpl(attr.name, oldValue);
956
- }
957
- throw new DOMException('The attribute node is not an attribute of this element', 'NotFoundError');
958
- }
959
-
960
- requestFullscreen(options?: any): Promise<void> {
961
- throw new Error('Element.requestFullscreen() is not implemented yet');
962
- }
963
-
964
- requestPointerLock(options?: any): Promise<void> {
965
- throw new Error('Element.requestPointerLock() is not implemented yet');
966
- }
967
-
968
- scroll(options?: any): void;
969
- scroll(x: number, y: number): void;
970
- scroll(optionsOrX?: any, y?: number): void {
971
- // throw new Error('Element.scroll() is not implemented yet');
972
- }
973
-
974
- scrollBy(options?: any): void;
975
- scrollBy(x: number, y: number): void;
976
- scrollBy(optionsOrX?: any, y?: number): void {
977
- // throw new Error('Element.scrollBy() is not implemented yet');
978
- }
979
-
980
- scrollIntoView(arg?: boolean | any): void {
981
- // throw new Error('Element.scrollIntoView() is not implemented yet');
982
- }
983
-
984
- scrollTo(options?: any): void;
985
- scrollTo(x: number, y: number): void;
986
- scrollTo(optionsOrX?: any, y?: number): void {
987
- // throw new Error('Element.scrollTo() is not implemented yet');
988
- }
989
-
990
- setAttributeNS(namespace: string | null, qualifiedName: string, value: string): void {
991
- // For simplicity, we'll ignore namespace and use qualifiedName
992
- this.setAttribute(qualifiedName, value);
993
- }
994
-
995
- setAttributeNode(attr: Attr): Attr | null {
996
- const oldAttr = this.getAttributeNode(attr.name);
997
- this.setAttribute(attr.name, attr.value);
998
- return oldAttr;
999
- }
1000
-
1001
- setAttributeNodeNS(attr: Attr): Attr | null {
1002
- // For simplicity, we'll ignore namespace
1003
- return this.setAttributeNode(attr);
1004
- }
1005
-
1006
- setHTMLUnsafe(html: string): void {
1007
- // throw new Error('Element.setHTMLUnsafe() is not implemented yet');
1008
- }
1009
-
1010
- setPointerCapture(pointerId: number): void {
1011
- // throw new Error('Element.setPointerCapture() is not implemented yet');
1012
- }
1013
-
1014
- toggleAttribute(qualifiedName: string, force?: boolean): boolean {
1015
- const hasAttr = this.hasAttribute(qualifiedName);
1016
-
1017
- if (force === true || (force === undefined && !hasAttr)) {
1018
- this.setAttribute(qualifiedName, '');
1019
- return true;
1020
- } else if (force === false || (force === undefined && hasAttr)) {
1021
- this.removeAttribute(qualifiedName);
1022
- return false;
1023
- }
1024
-
1025
- return hasAttr;
1026
- }
1027
-
1028
- webkitMatchesSelector(selectors: string): boolean {
1029
- // throw new Error('Element.webkitMatchesSelector() is not implemented yet');
1030
- return false;
1031
- }
1032
-
1033
- // EventTarget methods - Not implemented yet
1034
- addEventListener(type: string, listener: any, options?: any): void {
1035
- // throw new Error('Element.addEventListener() is not implemented yet');
1036
- }
1037
-
1038
- removeEventListener(type: string, listener: any, options?: any): void {
1039
- // throw new Error('Element.removeEventListener() is not implemented yet');
1040
- }
1041
-
1042
- dispatchEvent(event: any): boolean {
1043
- // throw new Error('Element.dispatchEvent() is not implemented yet');
1044
- return true;
1045
- }
1046
-
1047
- cloneNode(deep?: boolean): ElementBase {
1048
- // Use ElementFactory to create the correct element type
1049
- const clone = ElementFactory.createElement(this.tagName, this._ownerDocument);
1050
-
1051
- // Copy attributes
1052
- for (const [name, value] of this._attributes) {
1053
- clone.setAttribute(name, value);
1054
- }
1055
-
1056
- // Copy children if deep clone
1057
- if (deep) {
1058
- for (const child of this._childNodesInternal) {
1059
- if (child && 'cloneNode' in child) {
1060
- clone.appendChild((child as any).cloneNode(true));
1061
- }
1062
- }
1063
- }
1064
-
1065
- return clone;
1066
- }
687
+ break;
688
+ default:
689
+ throw new DOMException(`Invalid position: ${where}`, 'SyntaxError');
690
+ }
691
+ }
692
+ releasePointerCapture(_id: number): void {}
693
+ removeAttributeNS(_ns: string | null, localName: string): void {
694
+ this.removeAttribute(localName);
695
+ }
696
+ removeAttributeNode(attr: any): any {
697
+ const oldValue = this.getAttribute(attr.name);
698
+ if (oldValue !== null) {
699
+ this.removeAttribute(attr.name);
700
+ return new AttrImpl(attr.name, oldValue);
701
+ }
702
+ throw new DOMException('The attribute node is not an attribute of this element', 'NotFoundError');
703
+ }
704
+ requestFullscreen(_opt?: any): Promise<void> {
705
+ return Promise.resolve();
706
+ }
707
+ requestPointerLock(_opt?: any): Promise<void> {
708
+ return Promise.resolve();
709
+ }
710
+ scroll(_x?: any, _y?: any): void {}
711
+ scrollBy(_x?: any, _y?: any): void {}
712
+ scrollIntoView(_arg?: any): void {}
713
+ scrollTo(_x?: any, _y?: any): void {}
714
+ setAttributeNS(_ns: string | null, qualifiedName: string, value: string): void {
715
+ this.setAttribute(qualifiedName, value);
716
+ }
717
+ setAttributeNode(attr: any): any {
718
+ const oldAttr = this.getAttributeNode(attr.name);
719
+ this.setAttribute(attr.name, attr.value);
720
+ return oldAttr;
721
+ }
722
+ setAttributeNodeNS(attr: any): any {
723
+ return this.setAttributeNode(attr);
724
+ }
725
+ setHTMLUnsafe(html: string): void {
726
+ this.innerHTML = html;
727
+ }
728
+ setPointerCapture(_id: number): void {}
729
+ toggleAttribute(qualifiedName: string, force?: boolean): boolean {
730
+ const hasAttr = this.hasAttribute(qualifiedName);
731
+ if (force === true || (force === undefined && !hasAttr)) {
732
+ this.setAttribute(qualifiedName, '');
733
+ return true;
734
+ } else if (force === false || (force === undefined && hasAttr)) {
735
+ this.removeAttribute(qualifiedName);
736
+ return false;
737
+ }
738
+ return hasAttr;
739
+ }
740
+ webkitMatchesSelector(selectors: string): boolean {
741
+ return this.matches(selectors);
742
+ }
743
+ addEventListener(type: string, listener: any, options?: any): void {}
744
+ removeEventListener(type: string, listener: any, options?: any): void {}
745
+ dispatchEvent(_event: any): boolean {
746
+ return true;
747
+ }
748
+ cloneNode(deep?: boolean): any {
749
+ const { ElementFactory } = ElementBase.dependencies;
750
+ const clone = ElementFactory.createElement(this.tagName, this._ownerDocument);
751
+ for (const [name, value] of this._attributes) clone.setAttribute(name, value);
752
+ if (deep) for (const child of this._childNodesInternal) if (child && 'cloneNode' in child) clone.appendChild((child as any).cloneNode(true));
753
+ return clone;
754
+ }
1067
755
  }
1068
756
 
1069
- // DOMTokenList implementation
757
+ //@ts-ignore
1070
758
  class DOMTokenListImpl implements DOMTokenList {
1071
- constructor(private element: ElementBase) { }
1072
-
1073
- get length(): number {
1074
- return this.element.className.split(/\s+/).filter(c => c.length > 0).length;
1075
- }
1076
-
1077
- get value(): string {
1078
- return this.element.className;
1079
- }
1080
-
1081
- set value(value: string) {
1082
- this.element.className = value;
1083
- }
1084
-
1085
- add(...tokens: string[]): void {
1086
- const classes = new Set(this.element.className.split(/\s+/).filter(c => c.length > 0));
1087
- for (const token of tokens) {
1088
- classes.add(token);
1089
- }
1090
- this.element.className = Array.from(classes).join(' ');
1091
- }
1092
-
1093
- remove(...tokens: string[]): void {
1094
- const classes = new Set(this.element.className.split(/\s+/).filter(c => c.length > 0));
1095
- for (const token of tokens) {
1096
- classes.delete(token);
1097
- }
1098
- this.element.className = Array.from(classes).join(' ');
1099
- }
1100
-
1101
- contains(token: string): boolean {
1102
- return this.element.className.split(/\s+/).includes(token);
1103
- }
1104
-
1105
- toggle(token: string, force?: boolean): boolean {
1106
- const hasToken = this.contains(token);
1107
-
1108
- if (force === true || (force === undefined && !hasToken)) {
1109
- this.add(token);
1110
- return true;
1111
- } else {
1112
- this.remove(token);
1113
- return false;
1114
- }
1115
- }
1116
-
1117
- replace(oldToken: string, newToken: string): boolean {
1118
- if (this.contains(oldToken)) {
1119
- this.remove(oldToken);
1120
- this.add(newToken);
1121
- return true;
1122
- }
1123
- return false;
1124
- }
1125
-
1126
- item(index: number): string | null {
1127
- const classes = this.element.className.split(/\s+/).filter(c => c.length > 0);
1128
- return index >= 0 && index < classes.length ? classes[index] : null;
1129
- }
1130
-
1131
- [index: number]: string;
759
+ constructor(private element: ElementBase) {}
760
+
761
+ get length(): number {
762
+ return this.element.className.split(/\s+/).filter(c => c.length > 0).length;
763
+ }
764
+ get value(): string {
765
+ return this.element.className;
766
+ }
767
+ set value(value: string) {
768
+ this.element.className = value;
769
+ }
770
+ add(...tokens: string[]): void {
771
+ const classes = new Set(this.element.className.split(/\s+/).filter(c => c.length > 0));
772
+ tokens.forEach(t => classes.add(t));
773
+ this.element.className = Array.from(classes).join(' ');
774
+ }
775
+ remove(...tokens: string[]): void {
776
+ const classes = new Set(this.element.className.split(/\s+/).filter(c => c.length > 0));
777
+ tokens.forEach(t => classes.delete(t));
778
+ this.element.className = Array.from(classes).join(' ');
779
+ }
780
+ contains(token: string): boolean {
781
+ return this.element.className.split(/\s+/).includes(token);
782
+ }
783
+ toggle(token: string, force?: boolean): boolean {
784
+ const hasToken = this.contains(token);
785
+ if (force === true || (force === undefined && !hasToken)) {
786
+ this.add(token);
787
+ return true;
788
+ } else {
789
+ this.remove(token);
790
+ return false;
791
+ }
792
+ }
793
+ replace(oldToken: string, newToken: string): boolean {
794
+ if (this.contains(oldToken)) {
795
+ this.remove(oldToken);
796
+ this.add(newToken);
797
+ return true;
798
+ }
799
+ return false;
800
+ }
801
+ item(index: number): string | null {
802
+ const classes = this.element.className.split(/\s+/).filter(c => c.length > 0);
803
+ return index >= 0 && index < classes.length ? classes[index] : null;
804
+ }
805
+ [index: number]: string;
1132
806
  }
1133
807
 
1134
-
1135
-
1136
- // Attr implementation
808
+ //@ts-ignore
1137
809
  class AttrImpl extends NodeBase implements Attr {
1138
- public ownerElement: Element | null = null;
1139
- public namespaceURI: string | null = null;
1140
- public prefix: string | null = null;
1141
- public specified: boolean = true;
1142
-
1143
- constructor(public name: string, public value: string) {
1144
- super(ATTRIBUTE_NODE, name);
1145
- }
1146
-
1147
- get localName(): string {
1148
- return this.name;
1149
- }
810
+ public ownerElement: Element | null = null;
811
+ public namespaceURI: string | null = null;
812
+ public prefix: string | null = null;
813
+ public specified: boolean = true;
814
+ constructor(
815
+ public name: string,
816
+ public value: string
817
+ ) {
818
+ super(ATTRIBUTE_NODE, name);
819
+ }
820
+ get localName(): string {
821
+ return this.name;
822
+ }
1150
823
  }
1151
824
 
1152
- // NamedNodeMap implementation
1153
825
  class NamedNodeMapImpl implements NamedNodeMap {
1154
- constructor(private attributes: Map<string, string>) { }
1155
-
1156
- get length(): number {
1157
- return this.attributes.size;
1158
- }
1159
-
1160
- getNamedItem(qualifiedName: string): Attr | null {
1161
- const value = this.attributes.get(qualifiedName.toLowerCase());
1162
- return value !== undefined ? new AttrImpl(qualifiedName, value) : null;
1163
- }
1164
-
1165
- getNamedItemNS(namespace: string | null, localName: string): Attr | null {
1166
- // For simplicity, ignore namespace
1167
- return this.getNamedItem(localName);
1168
- }
1169
-
1170
- item(index: number): Attr | null {
1171
- const keys = Array.from(this.attributes.keys());
1172
- if (index >= 0 && index < keys.length) {
1173
- const key = keys[index];
1174
- const value = this.attributes.get(key)!;
1175
- return new AttrImpl(key, value);
1176
- }
1177
- return null;
1178
- }
1179
-
1180
- removeNamedItem(qualifiedName: string): Attr {
1181
- const value = this.attributes.get(qualifiedName.toLowerCase());
1182
- if (value !== undefined) {
1183
- this.attributes.delete(qualifiedName.toLowerCase());
1184
- return new AttrImpl(qualifiedName, value);
1185
- }
1186
- throw new DOMException('The attribute is not found', 'NotFoundError');
1187
- }
1188
-
1189
- removeNamedItemNS(namespace: string | null, localName: string): Attr {
1190
- // For simplicity, ignore namespace
1191
- return this.removeNamedItem(localName);
1192
- }
1193
-
1194
- setNamedItem(attr: Attr): Attr | null {
1195
- const oldValue = this.attributes.get(attr.name.toLowerCase());
1196
- this.attributes.set(attr.name.toLowerCase(), attr.value);
1197
- return oldValue !== undefined ? new AttrImpl(attr.name, oldValue) : null;
1198
- }
1199
-
1200
- setNamedItemNS(attr: Attr): Attr | null {
1201
- // For simplicity, ignore namespace
1202
- return this.setNamedItem(attr);
1203
- }
1204
-
1205
- // Iterator implementation
1206
- *[Symbol.iterator](): IterableIterator<Attr> {
1207
- const keys = Array.from(this.attributes.keys());
1208
- for (const key of keys) {
1209
- const value = this.attributes.get(key)!;
1210
- yield new AttrImpl(key, value);
1211
- }
1212
- }
1213
-
1214
- // Additional iterator methods for compatibility
1215
- keys(): IterableIterator<string> {
1216
- return this.attributes.keys();
1217
- }
1218
-
1219
- values(): IterableIterator<Attr> {
1220
- const self = this;
1221
- return (function* () {
1222
- for (const [key, value] of self.attributes) {
1223
- yield new AttrImpl(key, value);
1224
- }
1225
- })();
1226
- }
1227
-
1228
- entries(): IterableIterator<[string, Attr]> {
1229
- const self = this;
1230
- return (function* () {
1231
- for (const [key, value] of self.attributes) {
1232
- yield [key, new AttrImpl(key, value)] as [string, Attr];
1233
- }
1234
- })();
1235
- }
1236
-
1237
- // forEach method for compatibility
1238
- forEach(callback: (attr: Attr, index: number, map: NamedNodeMap) => void, thisArg?: any): void {
1239
- const keys = Array.from(this.attributes.keys());
1240
- keys.forEach((key, index) => {
1241
- const value = this.attributes.get(key)!;
1242
- const attr = new AttrImpl(key, value);
1243
- callback.call(thisArg, attr, index, this);
1244
- });
1245
- }
1246
-
1247
- [index: number]: Attr;
1248
- }
826
+ constructor(private attributes: Map<string, string>) {}
827
+ get length(): number {
828
+ return this.attributes.size;
829
+ }
830
+ getNamedItem(qualifiedName: string): any {
831
+ const value = this.attributes.get(qualifiedName.toLowerCase());
832
+ return value !== undefined ? new AttrImpl(qualifiedName, value) : null;
833
+ }
834
+ getNamedItemNS(_ns: string | null, localName: string): any {
835
+ return this.getNamedItem(localName);
836
+ }
837
+ item(index: number): any {
838
+ const keys = Array.from(this.attributes.keys());
839
+ if (index >= 0 && index < keys.length) return new AttrImpl(keys[index], this.attributes.get(keys[index])!);
840
+ return null;
841
+ }
842
+ removeNamedItem(qualifiedName: string): any {
843
+ const value = this.attributes.get(qualifiedName.toLowerCase());
844
+ if (value !== undefined) {
845
+ this.attributes.delete(qualifiedName.toLowerCase());
846
+ return new AttrImpl(qualifiedName, value);
847
+ }
848
+ throw new DOMException('The attribute is not found', 'NotFoundError');
849
+ }
850
+ removeNamedItemNS(_ns: string | null, localName: string): any {
851
+ return this.removeNamedItem(localName);
852
+ }
853
+ setNamedItem(attr: any): any {
854
+ const oldValue = this.attributes.get(attr.name.toLowerCase());
855
+ this.attributes.set(attr.name.toLowerCase(), attr.value);
856
+ return oldValue !== undefined ? new AttrImpl(attr.name, oldValue) : null;
857
+ }
858
+ setNamedItemNS(attr: any): any {
859
+ return this.setNamedItem(attr);
860
+ }
861
+ *[Symbol.iterator](): any {
862
+ for (const [key, value] of this.attributes) yield new AttrImpl(key, value);
863
+ }
864
+ keys(): any {
865
+ return this.attributes.keys();
866
+ }
867
+ values(): any {
868
+ const self = this;
869
+ return (function* () {
870
+ for (const [key, value] of self.attributes) yield new AttrImpl(key, value);
871
+ })();
872
+ }
873
+ entries(): any {
874
+ const self = this;
875
+ return (function* () {
876
+ for (const [key, value] of self.attributes) yield [key, new AttrImpl(key, value)];
877
+ })();
878
+ }
879
+ forEach(callback: any, thisArg?: any): void {
880
+ const keys = Array.from(this.attributes.keys());
881
+ keys.forEach((key, index) => callback.call(thisArg, new AttrImpl(key, this.attributes.get(key)!), index, this));
882
+ }
883
+ [index: number]: any;
884
+ }