@dooboostore/dom-parser 1.0.0

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 (519) hide show
  1. package/README.MD +280 -0
  2. package/dist/cjs/DomParser.js +360 -0
  3. package/dist/cjs/DomParser.js.map +7 -0
  4. package/dist/cjs/factory/ElementFactory.js +76 -0
  5. package/dist/cjs/factory/ElementFactory.js.map +7 -0
  6. package/dist/cjs/factory/index.js +24 -0
  7. package/dist/cjs/factory/index.js.map +7 -0
  8. package/dist/cjs/index.js +34 -0
  9. package/dist/cjs/index.js.map +7 -0
  10. package/dist/cjs/node/CharacterData.js +16 -0
  11. package/dist/cjs/node/CharacterData.js.map +7 -0
  12. package/dist/cjs/node/ChildNode.js +16 -0
  13. package/dist/cjs/node/ChildNode.js.map +7 -0
  14. package/dist/cjs/node/ChildNodeBase.js +62 -0
  15. package/dist/cjs/node/ChildNodeBase.js.map +7 -0
  16. package/dist/cjs/node/Comment.js +86 -0
  17. package/dist/cjs/node/Comment.js.map +7 -0
  18. package/dist/cjs/node/Document.js +28 -0
  19. package/dist/cjs/node/Document.js.map +7 -0
  20. package/dist/cjs/node/DocumentBase.js +378 -0
  21. package/dist/cjs/node/DocumentBase.js.map +7 -0
  22. package/dist/cjs/node/DocumentFragment.js +16 -0
  23. package/dist/cjs/node/DocumentFragment.js.map +7 -0
  24. package/dist/cjs/node/DocumentFragmentBase.js +88 -0
  25. package/dist/cjs/node/DocumentFragmentBase.js.map +7 -0
  26. package/dist/cjs/node/GetRootNodeOptions.js +16 -0
  27. package/dist/cjs/node/GetRootNodeOptions.js.map +7 -0
  28. package/dist/cjs/node/Node.js +58 -0
  29. package/dist/cjs/node/Node.js.map +7 -0
  30. package/dist/cjs/node/NodeBase.js +380 -0
  31. package/dist/cjs/node/NodeBase.js.map +7 -0
  32. package/dist/cjs/node/NodeIterator.js +163 -0
  33. package/dist/cjs/node/NodeIterator.js.map +7 -0
  34. package/dist/cjs/node/ParentNode.js +16 -0
  35. package/dist/cjs/node/ParentNode.js.map +7 -0
  36. package/dist/cjs/node/ParentNodeBase.js +134 -0
  37. package/dist/cjs/node/ParentNodeBase.js.map +7 -0
  38. package/dist/cjs/node/Text.js +16 -0
  39. package/dist/cjs/node/Text.js.map +7 -0
  40. package/dist/cjs/node/TextBase.js +106 -0
  41. package/dist/cjs/node/TextBase.js.map +7 -0
  42. package/dist/cjs/node/collection/HTMLCollection.js +105 -0
  43. package/dist/cjs/node/collection/HTMLCollection.js.map +7 -0
  44. package/dist/cjs/node/collection/HTMLCollectionOf.js +36 -0
  45. package/dist/cjs/node/collection/HTMLCollectionOf.js.map +7 -0
  46. package/dist/cjs/node/collection/NodeList.js +135 -0
  47. package/dist/cjs/node/collection/NodeList.js.map +7 -0
  48. package/dist/cjs/node/collection/NodeListOf.js +38 -0
  49. package/dist/cjs/node/collection/NodeListOf.js.map +7 -0
  50. package/dist/cjs/node/collection/index.js +30 -0
  51. package/dist/cjs/node/collection/index.js.map +7 -0
  52. package/dist/cjs/node/elements/Element.js +16 -0
  53. package/dist/cjs/node/elements/Element.js.map +7 -0
  54. package/dist/cjs/node/elements/ElementBase.js +936 -0
  55. package/dist/cjs/node/elements/ElementBase.js.map +7 -0
  56. package/dist/cjs/node/elements/HTMLAnchorElement.js +71 -0
  57. package/dist/cjs/node/elements/HTMLAnchorElement.js.map +7 -0
  58. package/dist/cjs/node/elements/HTMLAreaElement.js +77 -0
  59. package/dist/cjs/node/elements/HTMLAreaElement.js.map +7 -0
  60. package/dist/cjs/node/elements/HTMLBaseElement.js +77 -0
  61. package/dist/cjs/node/elements/HTMLBaseElement.js.map +7 -0
  62. package/dist/cjs/node/elements/HTMLBodyElement.js +29 -0
  63. package/dist/cjs/node/elements/HTMLBodyElement.js.map +7 -0
  64. package/dist/cjs/node/elements/HTMLButtonElement.js +89 -0
  65. package/dist/cjs/node/elements/HTMLButtonElement.js.map +7 -0
  66. package/dist/cjs/node/elements/HTMLCanvasElement.js +79 -0
  67. package/dist/cjs/node/elements/HTMLCanvasElement.js.map +7 -0
  68. package/dist/cjs/node/elements/HTMLCaptionElement.js +41 -0
  69. package/dist/cjs/node/elements/HTMLCaptionElement.js.map +7 -0
  70. package/dist/cjs/node/elements/HTMLDivElement.js +29 -0
  71. package/dist/cjs/node/elements/HTMLDivElement.js.map +7 -0
  72. package/dist/cjs/node/elements/HTMLElement.js +16 -0
  73. package/dist/cjs/node/elements/HTMLElement.js.map +7 -0
  74. package/dist/cjs/node/elements/HTMLElementBase.js +182 -0
  75. package/dist/cjs/node/elements/HTMLElementBase.js.map +7 -0
  76. package/dist/cjs/node/elements/HTMLEmbedElement.js +45 -0
  77. package/dist/cjs/node/elements/HTMLEmbedElement.js.map +7 -0
  78. package/dist/cjs/node/elements/HTMLFormElement.js +127 -0
  79. package/dist/cjs/node/elements/HTMLFormElement.js.map +7 -0
  80. package/dist/cjs/node/elements/HTMLGenericElement.js +32 -0
  81. package/dist/cjs/node/elements/HTMLGenericElement.js.map +7 -0
  82. package/dist/cjs/node/elements/HTMLH1Element.js +29 -0
  83. package/dist/cjs/node/elements/HTMLH1Element.js.map +7 -0
  84. package/dist/cjs/node/elements/HTMLHeadElement.js +29 -0
  85. package/dist/cjs/node/elements/HTMLHeadElement.js.map +7 -0
  86. package/dist/cjs/node/elements/HTMLHtmlElement.js +92 -0
  87. package/dist/cjs/node/elements/HTMLHtmlElement.js.map +7 -0
  88. package/dist/cjs/node/elements/HTMLImgElement.js +99 -0
  89. package/dist/cjs/node/elements/HTMLImgElement.js.map +7 -0
  90. package/dist/cjs/node/elements/HTMLInputElement.js +157 -0
  91. package/dist/cjs/node/elements/HTMLInputElement.js.map +7 -0
  92. package/dist/cjs/node/elements/HTMLLIElement.js +57 -0
  93. package/dist/cjs/node/elements/HTMLLIElement.js.map +7 -0
  94. package/dist/cjs/node/elements/HTMLLinkElement.js +99 -0
  95. package/dist/cjs/node/elements/HTMLLinkElement.js.map +7 -0
  96. package/dist/cjs/node/elements/HTMLMetaElement.js +29 -0
  97. package/dist/cjs/node/elements/HTMLMetaElement.js.map +7 -0
  98. package/dist/cjs/node/elements/HTMLOListElement.js +89 -0
  99. package/dist/cjs/node/elements/HTMLOListElement.js.map +7 -0
  100. package/dist/cjs/node/elements/HTMLPElement.js +29 -0
  101. package/dist/cjs/node/elements/HTMLPElement.js.map +7 -0
  102. package/dist/cjs/node/elements/HTMLScriptElement.js +127 -0
  103. package/dist/cjs/node/elements/HTMLScriptElement.js.map +7 -0
  104. package/dist/cjs/node/elements/HTMLSpanElement.js +29 -0
  105. package/dist/cjs/node/elements/HTMLSpanElement.js.map +7 -0
  106. package/dist/cjs/node/elements/HTMLStyleElement.js +71 -0
  107. package/dist/cjs/node/elements/HTMLStyleElement.js.map +7 -0
  108. package/dist/cjs/node/elements/HTMLTableElement.js +112 -0
  109. package/dist/cjs/node/elements/HTMLTableElement.js.map +7 -0
  110. package/dist/cjs/node/elements/HTMLTbodyElement.js +54 -0
  111. package/dist/cjs/node/elements/HTMLTbodyElement.js.map +7 -0
  112. package/dist/cjs/node/elements/HTMLTdElement.js +72 -0
  113. package/dist/cjs/node/elements/HTMLTdElement.js.map +7 -0
  114. package/dist/cjs/node/elements/HTMLTemplateElement.js +97 -0
  115. package/dist/cjs/node/elements/HTMLTemplateElement.js.map +7 -0
  116. package/dist/cjs/node/elements/HTMLTfootElement.js +56 -0
  117. package/dist/cjs/node/elements/HTMLTfootElement.js.map +7 -0
  118. package/dist/cjs/node/elements/HTMLThElement.js +72 -0
  119. package/dist/cjs/node/elements/HTMLThElement.js.map +7 -0
  120. package/dist/cjs/node/elements/HTMLTheadElement.js +54 -0
  121. package/dist/cjs/node/elements/HTMLTheadElement.js.map +7 -0
  122. package/dist/cjs/node/elements/HTMLTitleElement.js +38 -0
  123. package/dist/cjs/node/elements/HTMLTitleElement.js.map +7 -0
  124. package/dist/cjs/node/elements/HTMLTrElement.js +77 -0
  125. package/dist/cjs/node/elements/HTMLTrElement.js.map +7 -0
  126. package/dist/cjs/node/elements/HTMLUListElement.js +29 -0
  127. package/dist/cjs/node/elements/HTMLUListElement.js.map +7 -0
  128. package/dist/cjs/node/elements/MathMLElement.js +32 -0
  129. package/dist/cjs/node/elements/MathMLElement.js.map +7 -0
  130. package/dist/cjs/node/elements/SVGCircleElement.js +69 -0
  131. package/dist/cjs/node/elements/SVGCircleElement.js.map +7 -0
  132. package/dist/cjs/node/elements/SVGElement.js +32 -0
  133. package/dist/cjs/node/elements/SVGElement.js.map +7 -0
  134. package/dist/cjs/node/elements/SVGRectElement.js +80 -0
  135. package/dist/cjs/node/elements/SVGRectElement.js.map +7 -0
  136. package/dist/cjs/node/elements/index.js +183 -0
  137. package/dist/cjs/node/elements/index.js.map +7 -0
  138. package/dist/cjs/node/index.js +73 -0
  139. package/dist/cjs/node/index.js.map +7 -0
  140. package/dist/cjs/package.json +5 -0
  141. package/dist/cjs/utils/CSSSelector.js +271 -0
  142. package/dist/cjs/utils/CSSSelector.js.map +7 -0
  143. package/dist/cjs/window/Window.js +16 -0
  144. package/dist/cjs/window/Window.js.map +7 -0
  145. package/dist/cjs/window/WindowBase.js +847 -0
  146. package/dist/cjs/window/WindowBase.js.map +7 -0
  147. package/dist/cjs/window/index.js +29 -0
  148. package/dist/cjs/window/index.js.map +7 -0
  149. package/dist/esm/DomParser.js +341 -0
  150. package/dist/esm/DomParser.js.map +7 -0
  151. package/dist/esm/factory/ElementFactory.js +57 -0
  152. package/dist/esm/factory/ElementFactory.js.map +7 -0
  153. package/dist/esm/factory/index.js +5 -0
  154. package/dist/esm/factory/index.js.map +7 -0
  155. package/dist/esm/index.js +15 -0
  156. package/dist/esm/index.js.map +7 -0
  157. package/dist/esm/node/CharacterData.js +1 -0
  158. package/dist/esm/node/CharacterData.js.map +7 -0
  159. package/dist/esm/node/ChildNode.js +1 -0
  160. package/dist/esm/node/ChildNode.js.map +7 -0
  161. package/dist/esm/node/ChildNodeBase.js +43 -0
  162. package/dist/esm/node/ChildNodeBase.js.map +7 -0
  163. package/dist/esm/node/Comment.js +67 -0
  164. package/dist/esm/node/Comment.js.map +7 -0
  165. package/dist/esm/node/Document.js +9 -0
  166. package/dist/esm/node/Document.js.map +7 -0
  167. package/dist/esm/node/DocumentBase.js +359 -0
  168. package/dist/esm/node/DocumentBase.js.map +7 -0
  169. package/dist/esm/node/DocumentFragment.js +1 -0
  170. package/dist/esm/node/DocumentFragment.js.map +7 -0
  171. package/dist/esm/node/DocumentFragmentBase.js +69 -0
  172. package/dist/esm/node/DocumentFragmentBase.js.map +7 -0
  173. package/dist/esm/node/GetRootNodeOptions.js +1 -0
  174. package/dist/esm/node/GetRootNodeOptions.js.map +7 -0
  175. package/dist/esm/node/Node.js +39 -0
  176. package/dist/esm/node/Node.js.map +7 -0
  177. package/dist/esm/node/NodeBase.js +380 -0
  178. package/dist/esm/node/NodeBase.js.map +7 -0
  179. package/dist/esm/node/NodeIterator.js +144 -0
  180. package/dist/esm/node/NodeIterator.js.map +7 -0
  181. package/dist/esm/node/ParentNode.js +1 -0
  182. package/dist/esm/node/ParentNode.js.map +7 -0
  183. package/dist/esm/node/ParentNodeBase.js +115 -0
  184. package/dist/esm/node/ParentNodeBase.js.map +7 -0
  185. package/dist/esm/node/Text.js +1 -0
  186. package/dist/esm/node/Text.js.map +7 -0
  187. package/dist/esm/node/TextBase.js +87 -0
  188. package/dist/esm/node/TextBase.js.map +7 -0
  189. package/dist/esm/node/collection/HTMLCollection.js +86 -0
  190. package/dist/esm/node/collection/HTMLCollection.js.map +7 -0
  191. package/dist/esm/node/collection/HTMLCollectionOf.js +17 -0
  192. package/dist/esm/node/collection/HTMLCollectionOf.js.map +7 -0
  193. package/dist/esm/node/collection/NodeList.js +116 -0
  194. package/dist/esm/node/collection/NodeList.js.map +7 -0
  195. package/dist/esm/node/collection/NodeListOf.js +19 -0
  196. package/dist/esm/node/collection/NodeListOf.js.map +7 -0
  197. package/dist/esm/node/collection/index.js +11 -0
  198. package/dist/esm/node/collection/index.js.map +7 -0
  199. package/dist/esm/node/elements/Element.js +1 -0
  200. package/dist/esm/node/elements/Element.js.map +7 -0
  201. package/dist/esm/node/elements/ElementBase.js +917 -0
  202. package/dist/esm/node/elements/ElementBase.js.map +7 -0
  203. package/dist/esm/node/elements/HTMLAnchorElement.js +52 -0
  204. package/dist/esm/node/elements/HTMLAnchorElement.js.map +7 -0
  205. package/dist/esm/node/elements/HTMLAreaElement.js +58 -0
  206. package/dist/esm/node/elements/HTMLAreaElement.js.map +7 -0
  207. package/dist/esm/node/elements/HTMLBaseElement.js +58 -0
  208. package/dist/esm/node/elements/HTMLBaseElement.js.map +7 -0
  209. package/dist/esm/node/elements/HTMLBodyElement.js +10 -0
  210. package/dist/esm/node/elements/HTMLBodyElement.js.map +7 -0
  211. package/dist/esm/node/elements/HTMLButtonElement.js +70 -0
  212. package/dist/esm/node/elements/HTMLButtonElement.js.map +7 -0
  213. package/dist/esm/node/elements/HTMLCanvasElement.js +60 -0
  214. package/dist/esm/node/elements/HTMLCanvasElement.js.map +7 -0
  215. package/dist/esm/node/elements/HTMLCaptionElement.js +22 -0
  216. package/dist/esm/node/elements/HTMLCaptionElement.js.map +7 -0
  217. package/dist/esm/node/elements/HTMLDivElement.js +10 -0
  218. package/dist/esm/node/elements/HTMLDivElement.js.map +7 -0
  219. package/dist/esm/node/elements/HTMLElement.js +1 -0
  220. package/dist/esm/node/elements/HTMLElement.js.map +7 -0
  221. package/dist/esm/node/elements/HTMLElementBase.js +163 -0
  222. package/dist/esm/node/elements/HTMLElementBase.js.map +7 -0
  223. package/dist/esm/node/elements/HTMLEmbedElement.js +26 -0
  224. package/dist/esm/node/elements/HTMLEmbedElement.js.map +7 -0
  225. package/dist/esm/node/elements/HTMLFormElement.js +108 -0
  226. package/dist/esm/node/elements/HTMLFormElement.js.map +7 -0
  227. package/dist/esm/node/elements/HTMLGenericElement.js +13 -0
  228. package/dist/esm/node/elements/HTMLGenericElement.js.map +7 -0
  229. package/dist/esm/node/elements/HTMLH1Element.js +10 -0
  230. package/dist/esm/node/elements/HTMLH1Element.js.map +7 -0
  231. package/dist/esm/node/elements/HTMLHeadElement.js +10 -0
  232. package/dist/esm/node/elements/HTMLHeadElement.js.map +7 -0
  233. package/dist/esm/node/elements/HTMLHtmlElement.js +73 -0
  234. package/dist/esm/node/elements/HTMLHtmlElement.js.map +7 -0
  235. package/dist/esm/node/elements/HTMLImgElement.js +80 -0
  236. package/dist/esm/node/elements/HTMLImgElement.js.map +7 -0
  237. package/dist/esm/node/elements/HTMLInputElement.js +138 -0
  238. package/dist/esm/node/elements/HTMLInputElement.js.map +7 -0
  239. package/dist/esm/node/elements/HTMLLIElement.js +38 -0
  240. package/dist/esm/node/elements/HTMLLIElement.js.map +7 -0
  241. package/dist/esm/node/elements/HTMLLinkElement.js +80 -0
  242. package/dist/esm/node/elements/HTMLLinkElement.js.map +7 -0
  243. package/dist/esm/node/elements/HTMLMetaElement.js +10 -0
  244. package/dist/esm/node/elements/HTMLMetaElement.js.map +7 -0
  245. package/dist/esm/node/elements/HTMLOListElement.js +70 -0
  246. package/dist/esm/node/elements/HTMLOListElement.js.map +7 -0
  247. package/dist/esm/node/elements/HTMLPElement.js +10 -0
  248. package/dist/esm/node/elements/HTMLPElement.js.map +7 -0
  249. package/dist/esm/node/elements/HTMLScriptElement.js +108 -0
  250. package/dist/esm/node/elements/HTMLScriptElement.js.map +7 -0
  251. package/dist/esm/node/elements/HTMLSpanElement.js +10 -0
  252. package/dist/esm/node/elements/HTMLSpanElement.js.map +7 -0
  253. package/dist/esm/node/elements/HTMLStyleElement.js +52 -0
  254. package/dist/esm/node/elements/HTMLStyleElement.js.map +7 -0
  255. package/dist/esm/node/elements/HTMLTableElement.js +93 -0
  256. package/dist/esm/node/elements/HTMLTableElement.js.map +7 -0
  257. package/dist/esm/node/elements/HTMLTbodyElement.js +35 -0
  258. package/dist/esm/node/elements/HTMLTbodyElement.js.map +7 -0
  259. package/dist/esm/node/elements/HTMLTdElement.js +53 -0
  260. package/dist/esm/node/elements/HTMLTdElement.js.map +7 -0
  261. package/dist/esm/node/elements/HTMLTemplateElement.js +78 -0
  262. package/dist/esm/node/elements/HTMLTemplateElement.js.map +7 -0
  263. package/dist/esm/node/elements/HTMLTfootElement.js +37 -0
  264. package/dist/esm/node/elements/HTMLTfootElement.js.map +7 -0
  265. package/dist/esm/node/elements/HTMLThElement.js +53 -0
  266. package/dist/esm/node/elements/HTMLThElement.js.map +7 -0
  267. package/dist/esm/node/elements/HTMLTheadElement.js +35 -0
  268. package/dist/esm/node/elements/HTMLTheadElement.js.map +7 -0
  269. package/dist/esm/node/elements/HTMLTitleElement.js +19 -0
  270. package/dist/esm/node/elements/HTMLTitleElement.js.map +7 -0
  271. package/dist/esm/node/elements/HTMLTrElement.js +58 -0
  272. package/dist/esm/node/elements/HTMLTrElement.js.map +7 -0
  273. package/dist/esm/node/elements/HTMLUListElement.js +10 -0
  274. package/dist/esm/node/elements/HTMLUListElement.js.map +7 -0
  275. package/dist/esm/node/elements/MathMLElement.js +13 -0
  276. package/dist/esm/node/elements/MathMLElement.js.map +7 -0
  277. package/dist/esm/node/elements/SVGCircleElement.js +50 -0
  278. package/dist/esm/node/elements/SVGCircleElement.js.map +7 -0
  279. package/dist/esm/node/elements/SVGElement.js +13 -0
  280. package/dist/esm/node/elements/SVGElement.js.map +7 -0
  281. package/dist/esm/node/elements/SVGRectElement.js +61 -0
  282. package/dist/esm/node/elements/SVGRectElement.js.map +7 -0
  283. package/dist/esm/node/elements/index.js +164 -0
  284. package/dist/esm/node/elements/index.js.map +7 -0
  285. package/dist/esm/node/index.js +53 -0
  286. package/dist/esm/node/index.js.map +7 -0
  287. package/dist/esm/utils/CSSSelector.js +252 -0
  288. package/dist/esm/utils/CSSSelector.js.map +7 -0
  289. package/dist/esm/window/Window.js +1 -0
  290. package/dist/esm/window/Window.js.map +7 -0
  291. package/dist/esm/window/WindowBase.js +828 -0
  292. package/dist/esm/window/WindowBase.js.map +7 -0
  293. package/dist/esm/window/index.js +10 -0
  294. package/dist/esm/window/index.js.map +7 -0
  295. package/dist/esm-bundle/dooboostore-dom-parser.esm.js +6176 -0
  296. package/dist/esm-bundle/dooboostore-dom-parser.esm.js.map +7 -0
  297. package/dist/types/DomParser.d.ts +30 -0
  298. package/dist/types/DomParser.d.ts.map +1 -0
  299. package/dist/types/factory/ElementFactory.d.ts +27 -0
  300. package/dist/types/factory/ElementFactory.d.ts.map +1 -0
  301. package/dist/types/factory/index.d.ts +2 -0
  302. package/dist/types/factory/index.d.ts.map +1 -0
  303. package/dist/types/index.d.ts +9 -0
  304. package/dist/types/index.d.ts.map +1 -0
  305. package/dist/types/node/CharacterData.d.ts +52 -0
  306. package/dist/types/node/CharacterData.d.ts.map +1 -0
  307. package/dist/types/node/ChildNode.d.ts +39 -0
  308. package/dist/types/node/ChildNode.d.ts.map +1 -0
  309. package/dist/types/node/ChildNodeBase.d.ts +12 -0
  310. package/dist/types/node/ChildNodeBase.d.ts.map +1 -0
  311. package/dist/types/node/Comment.d.ts +26 -0
  312. package/dist/types/node/Comment.d.ts.map +1 -0
  313. package/dist/types/node/Document.d.ts +857 -0
  314. package/dist/types/node/Document.d.ts.map +1 -0
  315. package/dist/types/node/DocumentBase.d.ts +153 -0
  316. package/dist/types/node/DocumentBase.d.ts.map +1 -0
  317. package/dist/types/node/DocumentFragment.d.ts +39 -0
  318. package/dist/types/node/DocumentFragment.d.ts.map +1 -0
  319. package/dist/types/node/DocumentFragmentBase.d.ts +51 -0
  320. package/dist/types/node/DocumentFragmentBase.d.ts.map +1 -0
  321. package/dist/types/node/GetRootNodeOptions.d.ts +14 -0
  322. package/dist/types/node/GetRootNodeOptions.d.ts.map +1 -0
  323. package/dist/types/node/Node.d.ts +232 -0
  324. package/dist/types/node/Node.d.ts.map +1 -0
  325. package/dist/types/node/NodeBase.d.ts +98 -0
  326. package/dist/types/node/NodeBase.d.ts.map +1 -0
  327. package/dist/types/node/NodeIterator.d.ts +61 -0
  328. package/dist/types/node/NodeIterator.d.ts.map +1 -0
  329. package/dist/types/node/ParentNode.d.ts +85 -0
  330. package/dist/types/node/ParentNode.d.ts.map +1 -0
  331. package/dist/types/node/ParentNodeBase.d.ts +22 -0
  332. package/dist/types/node/ParentNodeBase.d.ts.map +1 -0
  333. package/dist/types/node/Text.d.ts +25 -0
  334. package/dist/types/node/Text.d.ts.map +1 -0
  335. package/dist/types/node/TextBase.d.ts +26 -0
  336. package/dist/types/node/TextBase.d.ts.map +1 -0
  337. package/dist/types/node/collection/HTMLCollection.d.ts +37 -0
  338. package/dist/types/node/collection/HTMLCollection.d.ts.map +1 -0
  339. package/dist/types/node/collection/HTMLCollectionOf.d.ts +14 -0
  340. package/dist/types/node/collection/HTMLCollectionOf.d.ts.map +1 -0
  341. package/dist/types/node/collection/NodeList.d.ts +55 -0
  342. package/dist/types/node/collection/NodeList.d.ts.map +1 -0
  343. package/dist/types/node/collection/NodeListOf.d.ts +14 -0
  344. package/dist/types/node/collection/NodeListOf.d.ts.map +1 -0
  345. package/dist/types/node/collection/index.d.ts +5 -0
  346. package/dist/types/node/collection/index.d.ts.map +1 -0
  347. package/dist/types/node/elements/Element.d.ts +687 -0
  348. package/dist/types/node/elements/Element.d.ts.map +1 -0
  349. package/dist/types/node/elements/ElementBase.d.ts +143 -0
  350. package/dist/types/node/elements/ElementBase.d.ts.map +1 -0
  351. package/dist/types/node/elements/HTMLAnchorElement.d.ts +18 -0
  352. package/dist/types/node/elements/HTMLAnchorElement.d.ts.map +1 -0
  353. package/dist/types/node/elements/HTMLAreaElement.d.ts +59 -0
  354. package/dist/types/node/elements/HTMLAreaElement.d.ts.map +1 -0
  355. package/dist/types/node/elements/HTMLBaseElement.d.ts +25 -0
  356. package/dist/types/node/elements/HTMLBaseElement.d.ts.map +1 -0
  357. package/dist/types/node/elements/HTMLBodyElement.d.ts +10 -0
  358. package/dist/types/node/elements/HTMLBodyElement.d.ts.map +1 -0
  359. package/dist/types/node/elements/HTMLButtonElement.d.ts +21 -0
  360. package/dist/types/node/elements/HTMLButtonElement.d.ts.map +1 -0
  361. package/dist/types/node/elements/HTMLCanvasElement.d.ts +15 -0
  362. package/dist/types/node/elements/HTMLCanvasElement.d.ts.map +1 -0
  363. package/dist/types/node/elements/HTMLCaptionElement.d.ts +18 -0
  364. package/dist/types/node/elements/HTMLCaptionElement.d.ts.map +1 -0
  365. package/dist/types/node/elements/HTMLDivElement.d.ts +10 -0
  366. package/dist/types/node/elements/HTMLDivElement.d.ts.map +1 -0
  367. package/dist/types/node/elements/HTMLElement.d.ts +90 -0
  368. package/dist/types/node/elements/HTMLElement.d.ts.map +1 -0
  369. package/dist/types/node/elements/HTMLElementBase.d.ts +42 -0
  370. package/dist/types/node/elements/HTMLElementBase.d.ts.map +1 -0
  371. package/dist/types/node/elements/HTMLEmbedElement.d.ts +27 -0
  372. package/dist/types/node/elements/HTMLEmbedElement.d.ts.map +1 -0
  373. package/dist/types/node/elements/HTMLFormElement.d.ts +30 -0
  374. package/dist/types/node/elements/HTMLFormElement.d.ts.map +1 -0
  375. package/dist/types/node/elements/HTMLGenericElement.d.ts +6 -0
  376. package/dist/types/node/elements/HTMLGenericElement.d.ts.map +1 -0
  377. package/dist/types/node/elements/HTMLH1Element.d.ts +10 -0
  378. package/dist/types/node/elements/HTMLH1Element.d.ts.map +1 -0
  379. package/dist/types/node/elements/HTMLHeadElement.d.ts +10 -0
  380. package/dist/types/node/elements/HTMLHeadElement.d.ts.map +1 -0
  381. package/dist/types/node/elements/HTMLHtmlElement.d.ts +17 -0
  382. package/dist/types/node/elements/HTMLHtmlElement.d.ts.map +1 -0
  383. package/dist/types/node/elements/HTMLImgElement.d.ts +24 -0
  384. package/dist/types/node/elements/HTMLImgElement.d.ts.map +1 -0
  385. package/dist/types/node/elements/HTMLInputElement.d.ts +33 -0
  386. package/dist/types/node/elements/HTMLInputElement.d.ts.map +1 -0
  387. package/dist/types/node/elements/HTMLLIElement.d.ts +15 -0
  388. package/dist/types/node/elements/HTMLLIElement.d.ts.map +1 -0
  389. package/dist/types/node/elements/HTMLLinkElement.d.ts +24 -0
  390. package/dist/types/node/elements/HTMLLinkElement.d.ts.map +1 -0
  391. package/dist/types/node/elements/HTMLMetaElement.d.ts +10 -0
  392. package/dist/types/node/elements/HTMLMetaElement.d.ts.map +1 -0
  393. package/dist/types/node/elements/HTMLOListElement.d.ts +21 -0
  394. package/dist/types/node/elements/HTMLOListElement.d.ts.map +1 -0
  395. package/dist/types/node/elements/HTMLPElement.d.ts +10 -0
  396. package/dist/types/node/elements/HTMLPElement.d.ts.map +1 -0
  397. package/dist/types/node/elements/HTMLScriptElement.d.ts +29 -0
  398. package/dist/types/node/elements/HTMLScriptElement.d.ts.map +1 -0
  399. package/dist/types/node/elements/HTMLSpanElement.d.ts +10 -0
  400. package/dist/types/node/elements/HTMLSpanElement.d.ts.map +1 -0
  401. package/dist/types/node/elements/HTMLStyleElement.d.ts +18 -0
  402. package/dist/types/node/elements/HTMLStyleElement.d.ts.map +1 -0
  403. package/dist/types/node/elements/HTMLTableElement.d.ts +25 -0
  404. package/dist/types/node/elements/HTMLTableElement.d.ts.map +1 -0
  405. package/dist/types/node/elements/HTMLTbodyElement.d.ts +15 -0
  406. package/dist/types/node/elements/HTMLTbodyElement.d.ts.map +1 -0
  407. package/dist/types/node/elements/HTMLTdElement.d.ts +21 -0
  408. package/dist/types/node/elements/HTMLTdElement.d.ts.map +1 -0
  409. package/dist/types/node/elements/HTMLTemplateElement.d.ts +32 -0
  410. package/dist/types/node/elements/HTMLTemplateElement.d.ts.map +1 -0
  411. package/dist/types/node/elements/HTMLTfootElement.d.ts +16 -0
  412. package/dist/types/node/elements/HTMLTfootElement.d.ts.map +1 -0
  413. package/dist/types/node/elements/HTMLThElement.d.ts +21 -0
  414. package/dist/types/node/elements/HTMLThElement.d.ts.map +1 -0
  415. package/dist/types/node/elements/HTMLTheadElement.d.ts +15 -0
  416. package/dist/types/node/elements/HTMLTheadElement.d.ts.map +1 -0
  417. package/dist/types/node/elements/HTMLTitleElement.d.ts +15 -0
  418. package/dist/types/node/elements/HTMLTitleElement.d.ts.map +1 -0
  419. package/dist/types/node/elements/HTMLTrElement.d.ts +17 -0
  420. package/dist/types/node/elements/HTMLTrElement.d.ts.map +1 -0
  421. package/dist/types/node/elements/HTMLUListElement.d.ts +10 -0
  422. package/dist/types/node/elements/HTMLUListElement.d.ts.map +1 -0
  423. package/dist/types/node/elements/MathMLElement.d.ts +11 -0
  424. package/dist/types/node/elements/MathMLElement.d.ts.map +1 -0
  425. package/dist/types/node/elements/SVGCircleElement.d.ts +20 -0
  426. package/dist/types/node/elements/SVGCircleElement.d.ts.map +1 -0
  427. package/dist/types/node/elements/SVGElement.d.ts +11 -0
  428. package/dist/types/node/elements/SVGElement.d.ts.map +1 -0
  429. package/dist/types/node/elements/SVGRectElement.d.ts +23 -0
  430. package/dist/types/node/elements/SVGRectElement.d.ts.map +1 -0
  431. package/dist/types/node/elements/index.d.ts +128 -0
  432. package/dist/types/node/elements/index.d.ts.map +1 -0
  433. package/dist/types/node/index.d.ts +16 -0
  434. package/dist/types/node/index.d.ts.map +1 -0
  435. package/dist/types/utils/CSSSelector.d.ts +36 -0
  436. package/dist/types/utils/CSSSelector.d.ts.map +1 -0
  437. package/dist/types/window/Window.d.ts +620 -0
  438. package/dist/types/window/Window.d.ts.map +1 -0
  439. package/dist/types/window/WindowBase.d.ts +342 -0
  440. package/dist/types/window/WindowBase.d.ts.map +1 -0
  441. package/dist/types/window/index.d.ts +3 -0
  442. package/dist/types/window/index.d.ts.map +1 -0
  443. package/dist/umd-bundle/dooboostore-dom-parser.umd.js +6182 -0
  444. package/dist/umd-bundle/dooboostore-dom-parser.umd.js.map +7 -0
  445. package/package.json +120 -0
  446. package/src/DomParser.ts +491 -0
  447. package/src/factory/ElementFactory.ts +69 -0
  448. package/src/factory/index.ts +1 -0
  449. package/src/index.ts +28 -0
  450. package/src/node/CharacterData.ts +58 -0
  451. package/src/node/ChildNode.ts +42 -0
  452. package/src/node/ChildNodeBase.ts +54 -0
  453. package/src/node/Comment.ts +98 -0
  454. package/src/node/Document.ts +882 -0
  455. package/src/node/DocumentBase.ts +465 -0
  456. package/src/node/DocumentFragment.ts +44 -0
  457. package/src/node/DocumentFragmentBase.ts +109 -0
  458. package/src/node/GetRootNodeOptions.ts +13 -0
  459. package/src/node/Node.ts +245 -0
  460. package/src/node/NodeBase.ts +506 -0
  461. package/src/node/NodeIterator.ts +200 -0
  462. package/src/node/ParentNode.ts +93 -0
  463. package/src/node/ParentNodeBase.ts +145 -0
  464. package/src/node/Text.ts +30 -0
  465. package/src/node/TextBase.ts +113 -0
  466. package/src/node/collection/HTMLCollection.ts +107 -0
  467. package/src/node/collection/HTMLCollectionOf.ts +26 -0
  468. package/src/node/collection/NodeList.ts +140 -0
  469. package/src/node/collection/NodeListOf.ts +28 -0
  470. package/src/node/collection/index.ts +4 -0
  471. package/src/node/elements/Element.ts +771 -0
  472. package/src/node/elements/ElementBase.ts +1239 -0
  473. package/src/node/elements/HTMLAnchorElement.ts +63 -0
  474. package/src/node/elements/HTMLAreaElement.ts +73 -0
  475. package/src/node/elements/HTMLBaseElement.ts +70 -0
  476. package/src/node/elements/HTMLBodyElement.ts +12 -0
  477. package/src/node/elements/HTMLButtonElement.ts +83 -0
  478. package/src/node/elements/HTMLCanvasElement.ts +71 -0
  479. package/src/node/elements/HTMLCaptionElement.ts +26 -0
  480. package/src/node/elements/HTMLDivElement.ts +12 -0
  481. package/src/node/elements/HTMLElement.ts +105 -0
  482. package/src/node/elements/HTMLElementBase.ts +198 -0
  483. package/src/node/elements/HTMLEmbedElement.ts +33 -0
  484. package/src/node/elements/HTMLFormElement.ts +131 -0
  485. package/src/node/elements/HTMLGenericElement.ts +13 -0
  486. package/src/node/elements/HTMLH1Element.ts +12 -0
  487. package/src/node/elements/HTMLHeadElement.ts +12 -0
  488. package/src/node/elements/HTMLHtmlElement.ts +82 -0
  489. package/src/node/elements/HTMLImgElement.ts +96 -0
  490. package/src/node/elements/HTMLInputElement.ts +160 -0
  491. package/src/node/elements/HTMLLIElement.ts +47 -0
  492. package/src/node/elements/HTMLLinkElement.ts +95 -0
  493. package/src/node/elements/HTMLMetaElement.ts +12 -0
  494. package/src/node/elements/HTMLOListElement.ts +83 -0
  495. package/src/node/elements/HTMLPElement.ts +12 -0
  496. package/src/node/elements/HTMLScriptElement.ts +127 -0
  497. package/src/node/elements/HTMLSpanElement.ts +12 -0
  498. package/src/node/elements/HTMLStyleElement.ts +63 -0
  499. package/src/node/elements/HTMLTableElement.ts +117 -0
  500. package/src/node/elements/HTMLTbodyElement.ts +46 -0
  501. package/src/node/elements/HTMLTdElement.ts +67 -0
  502. package/src/node/elements/HTMLTemplateElement.ts +112 -0
  503. package/src/node/elements/HTMLTfootElement.ts +47 -0
  504. package/src/node/elements/HTMLThElement.ts +67 -0
  505. package/src/node/elements/HTMLTheadElement.ts +46 -0
  506. package/src/node/elements/HTMLTitleElement.ts +23 -0
  507. package/src/node/elements/HTMLTrElement.ts +72 -0
  508. package/src/node/elements/HTMLUListElement.ts +12 -0
  509. package/src/node/elements/MathMLElement.ts +16 -0
  510. package/src/node/elements/SVGCircleElement.ts +61 -0
  511. package/src/node/elements/SVGElement.ts +16 -0
  512. package/src/node/elements/SVGRectElement.ts +74 -0
  513. package/src/node/elements/index.ts +186 -0
  514. package/src/node/index.ts +28 -0
  515. package/src/utils/CSSSelector.ts +360 -0
  516. package/src/window/Window.ts +715 -0
  517. package/src/window/WindowBase.ts +1018 -0
  518. package/src/window/index.ts +2 -0
  519. package/tsconfig.json +24 -0
@@ -0,0 +1,1018 @@
1
+ import { Window, Location, History, Navigator } from './Window';
2
+ import { Document } from '../node/Document';
3
+ import { DocumentBase } from '../node/DocumentBase';
4
+ import { NodeBase } from '../node/NodeBase';
5
+ import { ElementBase } from '../node/elements/ElementBase';
6
+
7
+ // Import all element classes
8
+ import { HTMLAnchorElement } from '../node/elements/HTMLAnchorElement';
9
+ import { HTMLBodyElement } from '../node/elements/HTMLBodyElement';
10
+ import { HTMLButtonElement } from '../node/elements/HTMLButtonElement';
11
+ import { HTMLCanvasElement } from '../node/elements/HTMLCanvasElement';
12
+ import { HTMLDivElement } from '../node/elements/HTMLDivElement';
13
+ import { HTMLH1Element } from '../node/elements/HTMLH1Element';
14
+ import { HTMLHeadElement } from '../node/elements/HTMLHeadElement';
15
+ import { HTMLHtmlElement } from '../node/elements/HTMLHtmlElement';
16
+ import { HTMLImgElement } from '../node/elements/HTMLImgElement';
17
+ import { HTMLInputElement } from '../node/elements/HTMLInputElement';
18
+ import { HTMLPElement } from '../node/elements/HTMLPElement';
19
+ import { HTMLSpanElement } from '../node/elements/HTMLSpanElement';
20
+ import { HTMLTitleElement } from '../node/elements/HTMLTitleElement';
21
+ import { HTMLLinkElement } from '../node/elements/HTMLLinkElement';
22
+ import { HTMLScriptElement } from '../node/elements/HTMLScriptElement';
23
+ import { HTMLStyleElement } from '../node/elements/HTMLStyleElement';
24
+ import { HTMLFormElement } from '../node/elements/HTMLFormElement';
25
+ import { HTMLTableElement } from '../node/elements/HTMLTableElement';
26
+ import { HTMLUListElement } from '../node/elements/HTMLUListElement';
27
+ import { HTMLOListElement } from '../node/elements/HTMLOListElement';
28
+ import { HTMLLIElement } from '../node/elements/HTMLLIElement';
29
+ import { HTMLMetaElement } from '../node/elements/HTMLMetaElement';
30
+ import { HTMLTemplateElement } from '../node/elements/HTMLTemplateElement';
31
+ import { HTMLTheadElement } from '../node/elements/HTMLTheadElement';
32
+ import { HTMLTfootElement } from '../node/elements/HTMLTfootElement';
33
+ import { HTMLTrElement } from '../node/elements/HTMLTrElement';
34
+ import { HTMLTdElement } from '../node/elements/HTMLTdElement';
35
+ import { HTMLThElement } from '../node/elements/HTMLThElement';
36
+ import { HTMLCaptionElement } from '../node/elements/HTMLCaptionElement';
37
+ import { HTMLTbodyElement } from '../node/elements/HTMLTbodyElement';
38
+
39
+ class LocationBase implements Location {
40
+ private _href: string = 'about:blank';
41
+ private _protocol: string = 'about:';
42
+ private _host: string = '';
43
+ private _hostname: string = '';
44
+ private _port: string = '';
45
+ private _pathname: string = 'blank';
46
+ private _search: string = '';
47
+ private _hash: string = '';
48
+ private _origin: string = 'null';
49
+ private urlChangeCallback?: (url: string) => void;
50
+
51
+ constructor(initialUrl: string = 'about:blank', urlChangeCallback?: (url: string) => void) {
52
+ this.urlChangeCallback = urlChangeCallback;
53
+ this.parseUrl(initialUrl);
54
+ }
55
+
56
+ get href(): string {
57
+ return this._href;
58
+ }
59
+
60
+ set href(url: string) {
61
+ const oldHref = this._href;
62
+ this.parseUrl(url);
63
+
64
+ // Call URL change callback if URL actually changed
65
+ if (this._href !== oldHref && this.urlChangeCallback) {
66
+ this.urlChangeCallback(this._href);
67
+ }
68
+ }
69
+
70
+ get protocol(): string {
71
+ return this._protocol;
72
+ }
73
+
74
+ set protocol(value: string) {
75
+ if (!value.endsWith(':')) {
76
+ value += ':';
77
+ }
78
+ this._protocol = value;
79
+ this.reconstructUrl();
80
+ }
81
+
82
+ get host(): string {
83
+ return this._host;
84
+ }
85
+
86
+ set host(value: string) {
87
+ this._host = value;
88
+ // Parse hostname and port from host
89
+ const colonIndex = value.lastIndexOf(':');
90
+ if (colonIndex !== -1 && colonIndex > value.lastIndexOf(']')) {
91
+ // IPv6 addresses are enclosed in brackets, so check if colon is after the closing bracket
92
+ this._hostname = value.substring(0, colonIndex);
93
+ this._port = value.substring(colonIndex + 1);
94
+ } else {
95
+ this._hostname = value;
96
+ this._port = '';
97
+ }
98
+ this.reconstructUrl();
99
+ }
100
+
101
+ get hostname(): string {
102
+ return this._hostname;
103
+ }
104
+
105
+ set hostname(value: string) {
106
+ this._hostname = value;
107
+ this._host = this._port ? `${value}:${this._port}` : value;
108
+ this.reconstructUrl();
109
+ }
110
+
111
+ get port(): string {
112
+ return this._port;
113
+ }
114
+
115
+ set port(value: string) {
116
+ this._port = value;
117
+ this._host = value ? `${this._hostname}:${value}` : this._hostname;
118
+ this.reconstructUrl();
119
+ }
120
+
121
+ get pathname(): string {
122
+ return this._pathname;
123
+ }
124
+
125
+ set pathname(value: string) {
126
+ if (!value.startsWith('/')) {
127
+ value = '/' + value;
128
+ }
129
+ this._pathname = value;
130
+ this.reconstructUrl();
131
+ }
132
+
133
+ get search(): string {
134
+ return this._search;
135
+ }
136
+
137
+ set search(value: string) {
138
+ if (value && !value.startsWith('?')) {
139
+ value = '?' + value;
140
+ }
141
+ this._search = value;
142
+ this.reconstructUrl();
143
+ }
144
+
145
+ get hash(): string {
146
+ return this._hash;
147
+ }
148
+
149
+ set hash(value: string) {
150
+ if (value && !value.startsWith('#')) {
151
+ value = '#' + value;
152
+ }
153
+ this._hash = value;
154
+ this.reconstructUrl();
155
+ }
156
+
157
+ get origin(): string {
158
+ return this._origin;
159
+ }
160
+
161
+ assign(url: string): void {
162
+ const oldHref = this._href;
163
+ this.parseUrl(url);
164
+
165
+ // Call URL change callback if URL actually changed
166
+ if (this._href !== oldHref && this.urlChangeCallback) {
167
+ this.urlChangeCallback(this._href);
168
+ }
169
+ }
170
+
171
+ replace(url: string): void {
172
+ const oldHref = this._href;
173
+ this.parseUrl(url);
174
+
175
+ // Call URL change callback if URL actually changed
176
+ if (this._href !== oldHref && this.urlChangeCallback) {
177
+ this.urlChangeCallback(this._href);
178
+ }
179
+ }
180
+
181
+ reload(forcedReload?: boolean): void {
182
+ // No-op in server-side environment
183
+ // In a real browser, this would reload the page
184
+ }
185
+
186
+ toString(): string {
187
+ return this._href;
188
+ }
189
+
190
+ private parseUrl(url: string): void {
191
+ try {
192
+ // Handle relative URLs by creating a base URL
193
+ let parsedUrl: URL;
194
+
195
+ if (url.startsWith('//')) {
196
+ // Protocol-relative URL
197
+ parsedUrl = new URL(this._protocol + url);
198
+ } else if (url.startsWith('/')) {
199
+ // Absolute path
200
+ parsedUrl = new URL(url, `${this._protocol}//${this._host}`);
201
+ } else if (url.includes('://')) {
202
+ // Absolute URL
203
+ parsedUrl = new URL(url);
204
+ } else {
205
+ // Relative URL
206
+ const base = `${this._protocol}//${this._host}${this._pathname}`;
207
+ parsedUrl = new URL(url, base);
208
+ }
209
+
210
+ this._href = parsedUrl.href;
211
+ this._protocol = parsedUrl.protocol;
212
+ this._host = parsedUrl.host;
213
+ this._hostname = parsedUrl.hostname;
214
+ this._port = parsedUrl.port;
215
+ this._pathname = parsedUrl.pathname;
216
+ this._search = parsedUrl.search;
217
+ this._hash = parsedUrl.hash;
218
+ this._origin = parsedUrl.origin;
219
+ } catch (e) {
220
+ // Invalid URL, handle special cases
221
+ if (url === 'about:blank') {
222
+ this._href = 'about:blank';
223
+ this._protocol = 'about:';
224
+ this._host = '';
225
+ this._hostname = '';
226
+ this._port = '';
227
+ this._pathname = 'blank';
228
+ this._search = '';
229
+ this._hash = '';
230
+ this._origin = 'null';
231
+ }
232
+ // For other invalid URLs, keep current values
233
+ }
234
+ }
235
+
236
+ private reconstructUrl(): void {
237
+ try {
238
+ // Reconstruct the URL from components
239
+ let url = this._protocol;
240
+
241
+ if (this._protocol !== 'about:' && this._protocol !== 'data:') {
242
+ url += '//';
243
+ if (this._host) {
244
+ url += this._host;
245
+ }
246
+ }
247
+
248
+ url += this._pathname;
249
+ url += this._search;
250
+ url += this._hash;
251
+
252
+ // Validate the reconstructed URL
253
+ const testUrl = new URL(url);
254
+ this._href = testUrl.href;
255
+ this._origin = testUrl.origin;
256
+ } catch (e) {
257
+ // If reconstruction fails, keep the current href
258
+ }
259
+ }
260
+ }
261
+
262
+ class HistoryBase implements History {
263
+ length: number = 1;
264
+ state: any = null;
265
+ private window: WindowBase;
266
+ private historyStack: Array<{ state: any; title: string; url?: string }> = [];
267
+ private currentIndex: number = -1;
268
+
269
+ constructor(window: WindowBase) {
270
+ this.window = window;
271
+ }
272
+
273
+ back(): void {
274
+ this.go(-1);
275
+ }
276
+
277
+ forward(): void {
278
+ this.go(1);
279
+ }
280
+
281
+ go(delta?: number): void {
282
+ if (!delta || this.historyStack.length === 0) return;
283
+
284
+ const newIndex = this.currentIndex + delta;
285
+ if (newIndex >= 0 && newIndex < this.historyStack.length) {
286
+ this.currentIndex = newIndex;
287
+ const entry = this.historyStack[this.currentIndex];
288
+ this.state = entry.state;
289
+
290
+ // Update location if URL is provided
291
+ if (entry.url && this.window.location) {
292
+ (this.window.location as any)._href = entry.url;
293
+ (this.window.location as any).parseUrl(entry.url);
294
+ }
295
+
296
+ // Dispatch popstate event
297
+ (this.window as any).dispatchPopStateEvent(entry.state, entry.url);
298
+ }
299
+ }
300
+
301
+ pushState(data: any, title: string, url?: string): void {
302
+ // Remove any forward history when pushing new state
303
+ this.historyStack = this.historyStack.slice(0, this.currentIndex + 1);
304
+
305
+ // Add new state
306
+ this.historyStack.push({ state: data, title, url });
307
+ this.currentIndex = this.historyStack.length - 1;
308
+ this.state = data;
309
+ this.length = this.historyStack.length;
310
+
311
+ // Update location if URL is provided
312
+ if (url && this.window.location) {
313
+ const oldHref = (this.window.location as any)._href;
314
+ (this.window.location as any)._href = url;
315
+ (this.window.location as any).parseUrl(url);
316
+
317
+ // Trigger URL change callback for dynamic HTML loading
318
+ if (url !== oldHref && (this.window.location as any).urlChangeCallback) {
319
+ (this.window.location as any).urlChangeCallback(url);
320
+ }
321
+ }
322
+
323
+ // Note: pushState does NOT dispatch popstate event (per HTML spec)
324
+ }
325
+
326
+ replaceState(data: any, title: string, url?: string): void {
327
+ if (this.currentIndex >= 0 && this.currentIndex < this.historyStack.length) {
328
+ // Replace current state
329
+ this.historyStack[this.currentIndex] = { state: data, title, url };
330
+ } else {
331
+ // No current state, create one
332
+ this.historyStack = [{ state: data, title, url }];
333
+ this.currentIndex = 0;
334
+ this.length = 1;
335
+ }
336
+
337
+ this.state = data;
338
+
339
+ // Update location if URL is provided
340
+ if (url && this.window.location) {
341
+ const oldHref = (this.window.location as any)._href;
342
+ (this.window.location as any)._href = url;
343
+ (this.window.location as any).parseUrl(url);
344
+
345
+ // Trigger URL change callback for dynamic HTML loading
346
+ if (url !== oldHref && (this.window.location as any).urlChangeCallback) {
347
+ (this.window.location as any).urlChangeCallback(url);
348
+ }
349
+ }
350
+
351
+ // Note: replaceState does NOT dispatch popstate event (per HTML spec)
352
+ }
353
+ }
354
+
355
+ class NavigatorBase implements Navigator {
356
+ userAgent: string = 'Mozilla/5.0 (Server-Side Rendering)';
357
+ language: string = 'en-US';
358
+ languages: readonly string[] = ['en-US', 'en'];
359
+ platform: string = 'Server';
360
+ cookieEnabled: boolean = false;
361
+ onLine: boolean = true;
362
+ }
363
+
364
+ // Simple event system for WindowBase
365
+ interface EventListener {
366
+ type: string;
367
+ listener: (event: any) => void;
368
+ options?: boolean | AddEventListenerOptions;
369
+ }
370
+
371
+ interface PopStateEvent {
372
+ type: 'popstate';
373
+ state: any;
374
+ url?: string;
375
+ }
376
+
377
+ export class WindowBase {
378
+ // Suppress type errors for complex event handler types
379
+ [key: string]: any;
380
+
381
+ // Event system
382
+ private _eventListeners: EventListener[] = [];
383
+ // Properties
384
+ readonly clientInformation: Navigator;
385
+ readonly closed: boolean = false;
386
+ readonly cookieStore: CookieStore = {} as CookieStore;
387
+ readonly customElements: CustomElementRegistry = {} as CustomElementRegistry;
388
+ readonly devicePixelRatio: number = 1;
389
+ readonly document: Document;
390
+ readonly event: Event | undefined = undefined;
391
+ readonly external: External = {} as External;
392
+ readonly frameElement: Element | null = null;
393
+ readonly frames: WindowProxy = {} as WindowProxy;
394
+ readonly history: History;
395
+ readonly innerHeight: number = 768;
396
+ readonly innerWidth: number = 1024;
397
+ readonly length: number = 0;
398
+ readonly locationbar: BarProp = {} as BarProp;
399
+ readonly menubar: BarProp = {} as BarProp;
400
+ name: string = '';
401
+ readonly navigator: Navigator;
402
+ ondevicemotion: ((this: Window, ev: DeviceMotionEvent) => any) | null = null;
403
+ ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) => any) | null = null;
404
+ ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null = null;
405
+ onorientationchange: ((this: Window, ev: Event) => any) | null = null;
406
+ opener: any = null;
407
+ readonly orientation: number = 0;
408
+ readonly originAgentCluster: boolean = false;
409
+ readonly outerHeight: number = 768;
410
+ readonly outerWidth: number = 1024;
411
+ readonly pageXOffset: number = 0;
412
+ readonly pageYOffset: number = 0;
413
+ readonly parent: WindowProxy = {} as WindowProxy;
414
+ readonly personalbar: BarProp = {} as BarProp;
415
+ readonly screen: Screen = {} as Screen;
416
+ readonly screenLeft: number = 0;
417
+ readonly screenTop: number = 0;
418
+ readonly screenX: number = 0;
419
+ readonly screenY: number = 0;
420
+ readonly scrollX: number = 0;
421
+ readonly scrollY: number = 0;
422
+ readonly scrollbars: BarProp = {} as BarProp;
423
+ readonly self: Window & typeof globalThis = this as any;
424
+ readonly speechSynthesis: SpeechSynthesis = {} as SpeechSynthesis;
425
+ status: string = '';
426
+ readonly statusbar: BarProp = {} as BarProp;
427
+ readonly toolbar: BarProp = {} as BarProp;
428
+ readonly top: WindowProxy | null = null;
429
+ readonly visualViewport: VisualViewport | null = null;
430
+ readonly window: Window & typeof globalThis = this as any;
431
+
432
+ // Location property with getter/setter
433
+ private _location: Location;
434
+ get location(): Location {
435
+ return this._location;
436
+ }
437
+ set location(href: string | Location) {
438
+ if (typeof href === 'string') {
439
+ this._location.href = href;
440
+ } else {
441
+ this._location.href = href.href;
442
+ }
443
+ }
444
+
445
+ // Global constructors
446
+ Node = NodeBase;
447
+ Element = ElementBase;
448
+ HTMLElement = ElementBase;
449
+ Event = class Event { };
450
+ PopStateEvent = class PopStateEvent extends this.Event { };
451
+ IntersectionObserver = class IntersectionObserver { };
452
+ NodeFilter = class NodeFilter { };
453
+ DocumentFragment = class DocumentFragment { };
454
+ HTMLMetaElement = HTMLMetaElement;
455
+ HTMLCanvasElement = HTMLCanvasElement;
456
+ CanvasRenderingContext2D = class CanvasRenderingContext2D { };
457
+ CanvasPattern = class CanvasPattern { };
458
+ CanvasGradient = class CanvasGradient { };
459
+ Path2D = class Path2D { };
460
+ ImageData = class ImageData { };
461
+
462
+ // HTML element constructors
463
+ HTMLAnchorElement = HTMLAnchorElement;
464
+ HTMLBodyElement = HTMLBodyElement;
465
+ HTMLButtonElement = HTMLButtonElement;
466
+ HTMLDivElement = HTMLDivElement;
467
+ HTMLH1Element = HTMLH1Element;
468
+ HTMLHeadElement = HTMLHeadElement;
469
+ HTMLHtmlElement = HTMLHtmlElement;
470
+ HTMLImgElement = HTMLImgElement;
471
+ HTMLInputElement = HTMLInputElement;
472
+ HTMLPElement = HTMLPElement;
473
+ HTMLSpanElement = HTMLSpanElement;
474
+ HTMLTitleElement = HTMLTitleElement;
475
+ HTMLLinkElement = HTMLLinkElement;
476
+ HTMLScriptElement = HTMLScriptElement;
477
+ HTMLStyleElement = HTMLStyleElement;
478
+ HTMLFormElement = HTMLFormElement;
479
+ HTMLTableElement = HTMLTableElement;
480
+ HTMLUListElement = HTMLUListElement;
481
+ HTMLOListElement = HTMLOListElement;
482
+ HTMLLIElement = HTMLLIElement;
483
+ HTMLTemplateElement = HTMLTemplateElement;
484
+ HTMLTheadElement = HTMLTheadElement;
485
+ HTMLTfootElement = HTMLTfootElement;
486
+ HTMLTrElement = HTMLTrElement;
487
+ HTMLTdElement = HTMLTdElement;
488
+ HTMLThElement = HTMLThElement;
489
+ HTMLCaptionElement = HTMLCaptionElement;
490
+ HTMLTbodyElement = HTMLTbodyElement;
491
+
492
+ constructor(document?: Document, initialUrl?: string) {
493
+ this.document = document || new DocumentBase();
494
+
495
+ // Set window reference in document for load event
496
+ if (this.document && (this.document as any).setWindow) {
497
+ (this.document as any).setWindow(this);
498
+ }
499
+
500
+ this._location = new LocationBase(initialUrl);
501
+ this.history = new HistoryBase(this);
502
+ this.navigator = new NavigatorBase();
503
+ this.clientInformation = this.navigator;
504
+
505
+ // Return a Proxy to handle the [index: number]: Window signature
506
+ return new Proxy(this, {
507
+ get(target: WindowBase, prop: string | symbol): any {
508
+ // Handle numeric indices - return the window itself
509
+ if (typeof prop === 'string' && /^\d+$/.test(prop)) {
510
+ return target;
511
+ }
512
+ // Return the actual property
513
+ return (target as any)[prop];
514
+ },
515
+
516
+ set(target: WindowBase, prop: string | symbol, value: any): boolean {
517
+ // Handle numeric indices - ignore setting
518
+ if (typeof prop === 'string' && /^\d+$/.test(prop)) {
519
+ return true;
520
+ }
521
+ // Set the actual property
522
+ (target as any)[prop] = value;
523
+ return true;
524
+ },
525
+
526
+ has(target: WindowBase, prop: string | symbol): boolean {
527
+ // Handle numeric indices
528
+ if (typeof prop === 'string' && /^\d+$/.test(prop)) {
529
+ return true;
530
+ }
531
+ // Check if property exists
532
+ return prop in target;
533
+ },
534
+
535
+ ownKeys(target: WindowBase): ArrayLike<string | symbol> {
536
+ // Get all own keys plus numeric indices for length
537
+ const keys = Object.getOwnPropertyNames(target);
538
+ // Add numeric indices based on length property
539
+ for (let i = 0; i < target.length; i++) {
540
+ keys.push(i.toString());
541
+ }
542
+ return keys;
543
+ },
544
+
545
+ getOwnPropertyDescriptor(target: WindowBase, prop: string | symbol): PropertyDescriptor | undefined {
546
+ // Handle numeric indices
547
+ if (typeof prop === 'string' && /^\d+$/.test(prop)) {
548
+ return {
549
+ enumerable: true,
550
+ configurable: true,
551
+ value: target
552
+ };
553
+ }
554
+ // Return actual property descriptor
555
+ return Object.getOwnPropertyDescriptor(target, prop);
556
+ }
557
+ });
558
+ }
559
+
560
+ // Window methods - all with empty implementations for server-side
561
+ alert(message?: any): void { }
562
+
563
+ blur(): void { }
564
+
565
+ cancelIdleCallback(handle: number): void { }
566
+
567
+ captureEvents(): void { }
568
+
569
+ close(): void { }
570
+
571
+ confirm(message?: string): boolean {
572
+ return false;
573
+ }
574
+
575
+ focus(): void { }
576
+
577
+ getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration {
578
+ return {} as CSSStyleDeclaration;
579
+ }
580
+
581
+ getSelection(): Selection | null {
582
+ return null;
583
+ }
584
+
585
+ matchMedia(query: string): MediaQueryList {
586
+ return {} as MediaQueryList;
587
+ }
588
+
589
+ moveBy(x: number, y: number): void { }
590
+
591
+ moveTo(x: number, y: number): void { }
592
+
593
+ open(url?: string | URL, target?: string, features?: string): WindowProxy | null {
594
+ return null;
595
+ }
596
+
597
+ postMessage(message: any, targetOrigin: string, transfer?: Transferable[]): void;
598
+ postMessage(message: any, options?: WindowPostMessageOptions): void;
599
+ postMessage(message: any, targetOriginOrOptions?: string | WindowPostMessageOptions, transfer?: Transferable[]): void { }
600
+
601
+ print(): void { }
602
+
603
+ prompt(message?: string, _default?: string): string | null {
604
+ return null;
605
+ }
606
+
607
+ releaseEvents(): void { }
608
+
609
+ requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number {
610
+ return 0;
611
+ }
612
+
613
+ resizeBy(x: number, y: number): void { }
614
+
615
+ resizeTo(width: number, height: number): void { }
616
+
617
+ scroll(options?: ScrollToOptions): void;
618
+ scroll(x: number, y: number): void;
619
+ scroll(optionsOrX?: ScrollToOptions | number, y?: number): void { }
620
+
621
+ scrollBy(options?: ScrollToOptions): void;
622
+ scrollBy(x: number, y: number): void;
623
+ scrollBy(optionsOrX?: ScrollToOptions | number, y?: number): void { }
624
+
625
+ scrollTo(options?: ScrollToOptions): void;
626
+ scrollTo(x: number, y: number): void;
627
+ scrollTo(optionsOrX?: ScrollToOptions | number, y?: number): void { }
628
+
629
+ stop(): void { }
630
+
631
+ // Timer methods
632
+ setTimeout(callback: Function, delay?: number, ...args: any[]): number {
633
+ return setTimeout(callback, delay, ...args) as any;
634
+ }
635
+
636
+ clearTimeout(id: number): void {
637
+ clearTimeout(id);
638
+ }
639
+
640
+ setInterval(callback: Function, delay?: number, ...args: any[]): number {
641
+ return setInterval(callback, delay, ...args) as any;
642
+ }
643
+
644
+ clearInterval(id: number): void {
645
+ clearInterval(id);
646
+ }
647
+
648
+ // Animation methods
649
+ requestAnimationFrame(callback: FrameRequestCallback): number {
650
+ return this.setTimeout(callback, 16) as number;
651
+ }
652
+
653
+ cancelAnimationFrame(id: number): void {
654
+ this.clearTimeout(id);
655
+ }
656
+
657
+ // Event methods
658
+ addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
659
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
660
+ addEventListener(type: any, listener: any, options?: any): void {
661
+ // Support popstate, load, unload, and beforeunload events
662
+ if (type === 'popstate' || type === 'load' || type === 'unload' || type === 'beforeunload') {
663
+ this._eventListeners.push({
664
+ type,
665
+ listener: typeof listener === 'function' ? listener : listener.handleEvent,
666
+ options
667
+ });
668
+ }
669
+ }
670
+
671
+ removeEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
672
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
673
+ removeEventListener(type: any, listener: any, options?: any): void {
674
+ if (type === 'popstate' || type === 'load' || type === 'unload' || type === 'beforeunload') {
675
+ const targetListener = typeof listener === 'function' ? listener : listener.handleEvent;
676
+ this._eventListeners = this._eventListeners.filter(
677
+ eventListener => !(eventListener.type === type && eventListener.listener === targetListener)
678
+ );
679
+ }
680
+ }
681
+
682
+ dispatchEvent(event: any): boolean {
683
+ const eventListeners = this._eventListeners.filter(listener => listener.type === event.type);
684
+
685
+ for (const eventListener of eventListeners) {
686
+ try {
687
+ eventListener.listener.call(this, event);
688
+
689
+ // Handle 'once' option
690
+ if (eventListener.options && typeof eventListener.options === 'object' && eventListener.options.once) {
691
+ this.removeEventListener(event.type, eventListener.listener);
692
+ }
693
+ } catch (error) {
694
+ console.error('Error in event listener:', error);
695
+ }
696
+ }
697
+
698
+ return true;
699
+ }
700
+
701
+ /**
702
+ * Dispatch a popstate event to registered listeners
703
+ */
704
+ private dispatchPopStateEvent(state: any, url?: string): void {
705
+ const popStateEvent: PopStateEvent = {
706
+ type: 'popstate',
707
+ state,
708
+ url
709
+ };
710
+
711
+ this.dispatchEvent(popStateEvent);
712
+ }
713
+
714
+ // EventTarget methods (inherited)
715
+ // These are already covered by addEventListener/removeEventListener/dispatchEvent
716
+
717
+ // GlobalEventHandlers - empty implementations
718
+ onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null;
719
+ onanimationcancel: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;
720
+ onanimationend: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;
721
+ onanimationiteration: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;
722
+ onanimationstart: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;
723
+ onauxclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
724
+ onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null = null;
725
+ onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null;
726
+ oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
727
+ oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
728
+ oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
729
+ onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
730
+ onclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
731
+ onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
732
+ oncontextmenu: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
733
+ oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;
734
+ oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
735
+ oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;
736
+ ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
737
+ ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
738
+ ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
739
+ ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
740
+ ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
741
+ ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
742
+ ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
743
+ ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
744
+ ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
745
+ onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
746
+ onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
747
+ onerror: OnErrorEventHandler = null;
748
+ onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null;
749
+ onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null = null;
750
+ ongotpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
751
+ oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
752
+ oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
753
+ onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;
754
+ onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;
755
+ onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;
756
+ onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
757
+ onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
758
+ onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
759
+ onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
760
+ onlostpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
761
+ onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
762
+ onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
763
+ onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
764
+ onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
765
+ onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
766
+ onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
767
+ onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
768
+ onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;
769
+ onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
770
+ onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
771
+ onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
772
+ onpointercancel: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
773
+ onpointerdown: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
774
+ onpointerenter: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
775
+ onpointerleave: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
776
+ onpointermove: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
777
+ onpointerout: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
778
+ onpointerover: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
779
+ onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
780
+ onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent<EventTarget>) => any) | null = null;
781
+ onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
782
+ onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
783
+ onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null;
784
+ onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
785
+ onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
786
+ onsecuritypolicyviolation: ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any) | null = null;
787
+ onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
788
+ onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
789
+ onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
790
+ onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
791
+ onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
792
+ onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
793
+ onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
794
+ onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null = null;
795
+ onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
796
+ ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
797
+ ontoggle: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
798
+ ontouchcancel?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;
799
+ ontouchend?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;
800
+ ontouchmove?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;
801
+ ontouchstart?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;
802
+ ontransitioncancel: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;
803
+ ontransitionend: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;
804
+ ontransitionrun: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;
805
+ ontransitionstart: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;
806
+ onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
807
+ onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
808
+ onwebkitanimationend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
809
+ onwebkitanimationiteration: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
810
+ onwebkitanimationstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
811
+ onwebkittransitionend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
812
+ onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null;
813
+
814
+ // WindowEventHandlers - empty implementations
815
+ onafterprint: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
816
+ onbeforeprint: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
817
+ onbeforeunload: ((this: WindowEventHandlers, ev: BeforeUnloadEvent) => any) | null = null;
818
+ onhashchange: ((this: WindowEventHandlers, ev: HashChangeEvent) => any) | null = null;
819
+ onlanguagechange: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
820
+ onmessage: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null = null;
821
+ onmessageerror: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null = null;
822
+ onoffline: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
823
+ ononline: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
824
+ onpagehide: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null = null;
825
+ onpageshow: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null = null;
826
+ onpopstate: ((this: WindowEventHandlers, ev: PopStateEvent) => any) | null = null;
827
+ onrejectionhandled: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null = null;
828
+ onstorage: ((this: WindowEventHandlers, ev: StorageEvent) => any) | null = null;
829
+ onunhandledrejection: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null = null;
830
+ onunload: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
831
+
832
+ // WindowLocalStorage
833
+ readonly localStorage: Storage = {} as Storage;
834
+
835
+ // WindowOrWorkerGlobalScope - empty implementations
836
+ readonly caches: CacheStorage = {} as CacheStorage;
837
+ readonly crossOriginIsolated: boolean = false;
838
+ readonly crypto: Crypto = {} as Crypto;
839
+ readonly indexedDB: IDBFactory = {} as IDBFactory;
840
+ readonly isSecureContext: boolean = false;
841
+ readonly origin: string = 'null';
842
+ readonly performance: Performance = {} as Performance;
843
+
844
+ atob(data: string): string { return ''; }
845
+ btoa(data: string): string { return ''; }
846
+ createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
847
+ createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
848
+ createImageBitmap(...args: any[]): Promise<ImageBitmap> { return Promise.resolve({} as ImageBitmap); }
849
+
850
+ fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> { return Promise.resolve({} as Response); }
851
+ queueMicrotask(callback: VoidFunction): void { }
852
+ reportError(e: any): void { }
853
+ structuredClone(value: any, options?: StructuredSerializeOptions): any { return value; }
854
+
855
+ // WindowSessionStorage
856
+ readonly sessionStorage: Storage = {} as Storage;
857
+
858
+ // AnimationFrameProvider - already implemented above
859
+
860
+ // Index signature - getter implementation
861
+ [index: number]: Window;
862
+
863
+
864
+
865
+ /**
866
+ * Recursive HTML parsing
867
+ */
868
+ private parseHTMLRecursive(html: string, parent: any): void {
869
+ let position = 0;
870
+
871
+ while (position < html.length) {
872
+ const tagStart = html.indexOf('<', position);
873
+
874
+ if (tagStart === -1) {
875
+ const remainingText = html.substring(position).trim();
876
+ if (remainingText) {
877
+ const textNode = this.document.createTextNode(remainingText);
878
+ parent.appendChild(textNode);
879
+ }
880
+ break;
881
+ }
882
+
883
+ if (tagStart > position) {
884
+ const textContent = html.substring(position, tagStart).trim();
885
+ if (textContent) {
886
+ const textNode = this.document.createTextNode(textContent);
887
+ parent.appendChild(textNode);
888
+ }
889
+ }
890
+
891
+ const tagEnd = html.indexOf('>', tagStart);
892
+ if (tagEnd === -1) break;
893
+
894
+ const tagContent = html.substring(tagStart + 1, tagEnd);
895
+
896
+ if (tagContent.startsWith('/')) {
897
+ position = tagEnd + 1;
898
+ break;
899
+ }
900
+
901
+ const isSelfClosing = tagContent.endsWith('/') || this.isSelfClosingTag(tagContent.split(/\s+/)[0]);
902
+ const spaceIndex = tagContent.indexOf(' ');
903
+ const tagName = spaceIndex === -1 ? tagContent.replace('/', '') : tagContent.substring(0, spaceIndex);
904
+ const attributes = spaceIndex === -1 ? '' : tagContent.substring(spaceIndex + 1).replace('/', '');
905
+
906
+ const element = this.document.createElement(tagName.toLowerCase());
907
+
908
+ if (attributes.trim()) {
909
+ this.parseAttributes(attributes, element);
910
+ }
911
+
912
+ // Handle special HTML structure tags
913
+ if (tagName.toLowerCase() === 'html') {
914
+ // Replace documentElement
915
+ (this.document as any).documentElement = element;
916
+ this.document.appendChild(element);
917
+ } else if (tagName.toLowerCase() === 'head') {
918
+ (this.document as any).head = element;
919
+ if (this.document.documentElement) {
920
+ this.document.documentElement.appendChild(element);
921
+ } else {
922
+ parent.appendChild(element);
923
+ }
924
+ } else if (tagName.toLowerCase() === 'body') {
925
+ (this.document as any).body = element;
926
+ if (this.document.documentElement) {
927
+ this.document.documentElement.appendChild(element);
928
+ } else {
929
+ parent.appendChild(element);
930
+ }
931
+ } else {
932
+ parent.appendChild(element);
933
+ }
934
+
935
+ if (isSelfClosing) {
936
+ position = tagEnd + 1;
937
+ } else {
938
+ const closingTag = `</${tagName}>`;
939
+ const closingTagIndex = this.findMatchingClosingTag(html, tagEnd + 1, tagName);
940
+
941
+ if (closingTagIndex !== -1) {
942
+ const innerContent = html.substring(tagEnd + 1, closingTagIndex);
943
+ if (innerContent.trim()) {
944
+ this.parseHTMLRecursive(innerContent, element);
945
+ }
946
+ position = closingTagIndex + closingTag.length;
947
+ } else {
948
+ position = tagEnd + 1;
949
+ }
950
+ }
951
+ }
952
+ }
953
+
954
+ private findMatchingClosingTag(html: string, startPos: number, tagName: string): number {
955
+ const openTag = `<${tagName}`;
956
+ const closeTag = `</${tagName}>`;
957
+ let depth = 1;
958
+ let pos = startPos;
959
+
960
+ while (pos < html.length && depth > 0) {
961
+ const nextOpen = html.indexOf(openTag, pos);
962
+ const nextClose = html.indexOf(closeTag, pos);
963
+
964
+ if (nextClose === -1) return -1;
965
+
966
+ if (nextOpen !== -1 && nextOpen < nextClose) {
967
+ depth++;
968
+ pos = nextOpen + openTag.length;
969
+ } else {
970
+ depth--;
971
+ if (depth === 0) return nextClose;
972
+ pos = nextClose + closeTag.length;
973
+ }
974
+ }
975
+
976
+ return -1;
977
+ }
978
+
979
+ private parseAttributes(attributeString: string, element: any): void {
980
+ // Updated regex to handle hyphenated attribute names like dr-for-of, data-bind, etc.
981
+ const attrRegex = /([\w:-]+)(?:\s*=\s*(['"])(.*?)\2)?/g;
982
+ let match;
983
+
984
+ while ((match = attrRegex.exec(attributeString)) !== null) {
985
+ const name = match[1];
986
+ let value = match[3] || ''; // match[3] is the content between quotes
987
+ element.setAttribute(name, value);
988
+ }
989
+ }
990
+
991
+ private isSelfClosingTag(tagName: string): boolean {
992
+ const selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
993
+ return selfClosingTags.includes(tagName.toLowerCase());
994
+ }
995
+
996
+ /**
997
+ * Clear current document content
998
+ */
999
+ private clearDocumentContent(): void {
1000
+ const doc = this.document as any;
1001
+
1002
+ // Clear head content
1003
+ if (doc.head) {
1004
+ while (doc.head.firstChild) {
1005
+ doc.head.removeChild(doc.head.firstChild);
1006
+ }
1007
+ }
1008
+
1009
+ // Clear body content
1010
+ if (doc.body) {
1011
+ while (doc.body.firstChild) {
1012
+ doc.body.removeChild(doc.body.firstChild);
1013
+ }
1014
+ }
1015
+ }
1016
+
1017
+
1018
+ }