@dooboostore/dom-parser 1.0.0 → 1.0.2

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 (49) hide show
  1. package/README.MD +47 -94
  2. package/dist/cjs/DomParser.js +33 -12
  3. package/dist/cjs/DomParser.js.map +2 -2
  4. package/dist/cjs/node/DocumentBase.js +4 -0
  5. package/dist/cjs/node/DocumentBase.js.map +2 -2
  6. package/dist/cjs/node/elements/Element.js.map +1 -1
  7. package/dist/cjs/node/elements/ElementBase.js +12 -2
  8. package/dist/cjs/node/elements/ElementBase.js.map +2 -2
  9. package/dist/cjs/node/elements/HTMLElement.js.map +1 -1
  10. package/dist/cjs/node/elements/HTMLElementBase.js +154 -2
  11. package/dist/cjs/node/elements/HTMLElementBase.js.map +2 -2
  12. package/dist/cjs/window/WindowBase.js +128 -7
  13. package/dist/cjs/window/WindowBase.js.map +2 -2
  14. package/dist/esm/DomParser.js +33 -12
  15. package/dist/esm/DomParser.js.map +2 -2
  16. package/dist/esm/node/DocumentBase.js +4 -0
  17. package/dist/esm/node/DocumentBase.js.map +2 -2
  18. package/dist/esm/node/elements/ElementBase.js +12 -2
  19. package/dist/esm/node/elements/ElementBase.js.map +2 -2
  20. package/dist/esm/node/elements/HTMLElementBase.js +154 -2
  21. package/dist/esm/node/elements/HTMLElementBase.js.map +2 -2
  22. package/dist/esm/window/WindowBase.js +128 -7
  23. package/dist/esm/window/WindowBase.js.map +2 -2
  24. package/dist/esm-bundle/dooboostore-dom-parser.esm.js +504 -195
  25. package/dist/esm-bundle/dooboostore-dom-parser.esm.js.map +3 -3
  26. package/dist/types/DomParser.d.ts +4 -0
  27. package/dist/types/DomParser.d.ts.map +1 -1
  28. package/dist/types/node/DocumentBase.d.ts +2 -0
  29. package/dist/types/node/DocumentBase.d.ts.map +1 -1
  30. package/dist/types/node/elements/Element.d.ts +1 -0
  31. package/dist/types/node/elements/Element.d.ts.map +1 -1
  32. package/dist/types/node/elements/ElementBase.d.ts +2 -2
  33. package/dist/types/node/elements/ElementBase.d.ts.map +1 -1
  34. package/dist/types/node/elements/HTMLElement.d.ts +32 -1
  35. package/dist/types/node/elements/HTMLElement.d.ts.map +1 -1
  36. package/dist/types/node/elements/HTMLElementBase.d.ts +11 -2
  37. package/dist/types/node/elements/HTMLElementBase.d.ts.map +1 -1
  38. package/dist/types/window/WindowBase.d.ts +12 -2
  39. package/dist/types/window/WindowBase.d.ts.map +1 -1
  40. package/dist/umd-bundle/dooboostore-dom-parser.umd.js +504 -195
  41. package/dist/umd-bundle/dooboostore-dom-parser.umd.js.map +3 -3
  42. package/package.json +3 -10
  43. package/src/DomParser.ts +457 -436
  44. package/src/node/DocumentBase.ts +7 -2
  45. package/src/node/elements/Element.ts +24 -23
  46. package/src/node/elements/ElementBase.ts +50 -41
  47. package/src/node/elements/HTMLElement.ts +36 -1
  48. package/src/node/elements/HTMLElementBase.ts +191 -5
  49. package/src/window/WindowBase.ts +1128 -919
package/README.MD CHANGED
@@ -4,21 +4,20 @@
4
4
  [![Build and Test](https://github.com/dooboostore-develop/packages/actions/workflows/main.yaml/badge.svg?branch=main)](https://github.com/dooboostore-develop/packages/actions/workflows/main.yaml)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
6
6
 
7
- **Full Documentation:** [https://dooboostore-develop.github.io/packages/dom-parser](https://dooboostore-develop.github.io/packages/dom-parser)
7
+ **Full Documentation:** [https://dooboostore-develop.github.io/@dooboostore/dom-parser](https://dooboostore-develop.github.io/@dooboostore/dom-parser)
8
8
 
9
- A lightweight DOM parser for server-side HTML parsing and manipulation with full DOM API support. Features advanced JavaScript expression parsing for modern framework templates.
9
+ A lightweight DOM parser for server-side HTML parsing and manipulation with full DOM API support.
10
10
 
11
11
  ---
12
12
 
13
13
  ## Features
14
14
 
15
- - **🚀 Advanced JavaScript Expression Parsing**: Handles complex expressions like `${(data) => @this@?.handleChange?.(data)}$`
16
- - **đŸŽ¯ Framework Template Support**: Perfect for parsing modern framework templates with custom syntax
17
- - **⚡ Server-Side DOM**: Complete DOM implementation for Node.js environments without browser dependencies
18
- - **🔍 CSS Selector Queries**: Full support for `querySelector` and `querySelectorAll` with complex selectors
19
- - **đŸ“Ļ Multi-Format Support**: Available as ESM, CJS, and UMD bundles
20
- - **đŸ›Ąī¸ TypeScript Support**: Full TypeScript definitions for type-safe development
21
- - **đŸĒļ Lightweight**: Zero dependencies with fast parsing performance
15
+ - **⚡ Server-Side DOM**: Complete DOM implementation for Node.js environments
16
+ - **🔍 CSS Selector Support**: Full `querySelector` and `querySelectorAll` support
17
+ - **đŸ“Ļ Multi-Format**: Available as ESM, CJS, and UMD bundles
18
+ - **đŸ›Ąī¸ TypeScript**: Full TypeScript definitions included
19
+ - **đŸĒļ Zero Dependencies**: Lightweight with fast parsing performance
20
+ - **đŸŽ¯ HTML Templates**: Handles complex HTML templates and attributes
22
21
 
23
22
  ## Installation
24
23
 
@@ -80,40 +79,30 @@ global.window = window;
80
79
  global.document = document;
81
80
  ```
82
81
 
83
- ### Advanced: Framework Template Parsing
82
+ ### Template Processing
84
83
 
85
84
  ```typescript
86
85
  import { DomParser } from '@dooboostore/dom-parser';
87
86
 
88
- // Parse complex framework templates with JavaScript expressions
87
+ // Parse HTML templates with complex attributes
89
88
  const templateHtml = `
90
89
  <div class="container">
91
- <dr-select
92
- changeSelected="\${(data) => @this@?.handleSelectChange?.(data, #it#)}$"
93
- items="@this@.items"
94
- >
95
- <option value="1">Option 1</option>
96
- </dr-select>
97
- <dr-button
98
- onClick="\${() => @this@.submit?.()}$"
99
- disabled="@this@.loading ? 'true' : 'false'"
100
- >
101
- Submit
102
- </dr-button>
90
+ <button onclick="handleClick(data)" disabled="false">
91
+ Click Me
92
+ </button>
93
+ <input value="user.name" placeholder="Enter name" />
103
94
  </div>
104
95
  `;
105
96
 
106
97
  const parser = new DomParser(templateHtml);
107
98
  const document = parser.document;
108
99
 
109
- // Access complex attributes
110
- const select = document.querySelector('dr-select');
111
- console.log(select?.getAttribute('changeSelected'));
112
- // "${(data) => @this@?.handleSelectChange?.(data, #it#)}$"
100
+ // Access and modify elements
101
+ const button = document.querySelector('button');
102
+ console.log(button?.getAttribute('onclick')); // "handleClick(data)"
113
103
 
114
- const button = document.querySelector('dr-button');
115
- console.log(button?.getAttribute('onClick'));
116
- // "${() => @this@.submit?.()}$"
104
+ const input = document.querySelector('input');
105
+ input?.setAttribute('value', 'new value');
117
106
  ```
118
107
 
119
108
  ## API Reference
@@ -130,7 +119,13 @@ Creates a new DOM parser instance with the provided HTML string.
130
119
  **Parameters:**
131
120
  - `html`: HTML string to parse
132
121
  - `options`: Optional configuration object
133
- - `href?: string`: Base URL for the document
122
+
123
+ **DomParserOptions:**
124
+ ```typescript
125
+ interface DomParserOptions {
126
+ href?: string; // Base URL for the document
127
+ }
128
+ ```
134
129
 
135
130
  #### Properties
136
131
 
@@ -163,25 +158,7 @@ const h1 = document.querySelector('h1');
163
158
  console.log(h1?.textContent); // "Hello"
164
159
  ```
165
160
 
166
- ### Key Features
167
-
168
- #### 🚀 Advanced JavaScript Expression Support
169
-
170
- Handles complex JavaScript expressions that would break other parsers:
171
-
172
- ```typescript
173
- // ✅ Supported: Arrow functions with '>' operators
174
- changeSelected="${(data) => data.value > 0 ? data : null}$"
175
-
176
- // ✅ Supported: Ternary operators with nested expressions
177
- condition="${user?.role === 'admin' ? 'show' : 'hide'}$"
178
-
179
- // ✅ Supported: Framework-specific syntax
180
- items="@this@.items"
181
- handler="#item#.onClick"
182
- ```
183
-
184
- #### 🔍 Complete DOM API Support
161
+ ### Supported DOM APIs
185
162
 
186
163
  - `document.querySelector()` / `document.querySelectorAll()`
187
164
  - `document.getElementById()` / `document.getElementsByClassName()`
@@ -193,29 +170,30 @@ handler="#item#.onClick"
193
170
 
194
171
  ## Use Cases
195
172
 
196
- ### đŸŽ¯ Framework Template Processing
197
-
198
- Perfect for processing modern framework templates with complex JavaScript expressions:
173
+ ### đŸŽ¯ HTML Processing & Manipulation
199
174
 
200
175
  ```typescript
201
176
  import { DomParser } from '@dooboostore/dom-parser';
202
177
 
203
- // Parse framework components with complex expressions
204
- const componentHtml = `
205
- <my-component
206
- data-handler="\${(event) => @this@?.onEvent?.(event)}$"
207
- condition="@user@.isLoggedIn ? 'show' : 'hide'"
208
- >
209
- <nested-component items="@data@.items" />
210
- </my-component>
211
- `;
212
-
213
- const parser = new DomParser(componentHtml);
214
- const component = parser.document.querySelector('my-component');
215
-
216
- // Extract and process JavaScript expressions
217
- const handler = component?.getAttribute('data-handler');
218
- // Safely parse complex expressions without breaking on '>' characters
178
+ function processHtml(html: string) {
179
+ const parser = new DomParser(html);
180
+ const document = parser.document;
181
+
182
+ // Modify the DOM
183
+ const title = document.querySelector('title');
184
+ if (title) {
185
+ title.textContent = 'Processed Title';
186
+ }
187
+
188
+ // Add meta tags
189
+ const head = document.querySelector('head');
190
+ const meta = document.createElement('meta');
191
+ meta.setAttribute('name', 'description');
192
+ meta.setAttribute('content', 'Processed content');
193
+ head?.appendChild(meta);
194
+
195
+ return document.documentElement.outerHTML;
196
+ }
219
197
  ```
220
198
 
221
199
  ### 🔧 Server-Side Rendering (SSR)
@@ -243,37 +221,12 @@ global.document = parser.document;
243
221
  global.window = parser.window;
244
222
  ```
245
223
 
246
- ### 📝 HTML Processing & Manipulation
247
224
 
248
- ```typescript
249
- import { DomParser } from '@dooboostore/dom-parser';
250
-
251
- function processHtml(html: string) {
252
- const parser = new DomParser(html);
253
- const document = parser.document;
254
-
255
- // Modify the DOM
256
- const title = document.querySelector('title');
257
- if (title) {
258
- title.textContent = 'Processed Title';
259
- }
260
-
261
- // Add meta tags
262
- const head = document.querySelector('head');
263
- const meta = document.createElement('meta');
264
- meta.setAttribute('name', 'description');
265
- meta.setAttribute('content', 'Processed content');
266
- head?.appendChild(meta);
267
-
268
- return document.documentElement.outerHTML;
269
- }
270
- ```
271
225
 
272
226
  ## Learn More
273
227
 
274
228
  The detailed API documentation, including all supported DOM methods and usage examples, is available on our documentation website.
275
229
 
276
- **[Explore the full @dooboostore/dom-parser documentation &raquo;](https://dooboostore-develop.github.io/packages/dom-parser)**
277
230
 
278
231
  ## License
279
232
 
@@ -20,49 +20,70 @@ __export(DomParser_exports, {
20
20
  DomParser: () => DomParser
21
21
  });
22
22
  module.exports = __toCommonJS(DomParser_exports);
23
- var import_DocumentBase = require("./node/DocumentBase");
24
23
  var import_TextBase = require("./node/TextBase");
25
24
  var import_Comment = require("./node/Comment");
26
25
  var import_WindowBase = require("./window/WindowBase");
27
26
  class DomParser {
28
27
  constructor(html, option) {
29
- const document = new import_DocumentBase.DocumentBase();
30
- const windowBase = new import_WindowBase.WindowBase(document, option?.href);
28
+ const windowBase = new import_WindowBase.WindowBase({ initialUrl: option?.href });
31
29
  this._window = windowBase;
32
- this._document = document;
30
+ this._document = windowBase.document;
33
31
  this.parseHTML(html);
34
32
  this.setupDocumentReferences();
35
- if (document && document.simulateLoading) {
36
- document.simulateLoading();
33
+ if (this._document && this._document.simulateLoading) {
34
+ this._document.simulateLoading();
37
35
  }
38
36
  }
39
37
  get window() {
38
+ if (!this._window) {
39
+ throw new Error("DomParser has been destroyed");
40
+ }
40
41
  return this._window;
41
42
  }
42
43
  get document() {
44
+ if (!this._document) {
45
+ throw new Error("DomParser has been destroyed");
46
+ }
43
47
  return this._document;
44
48
  }
49
+ /**
50
+ * Destroy the DomParser instance and free memory
51
+ */
52
+ destroy() {
53
+ if (this._window) {
54
+ this._window.close();
55
+ this._window = null;
56
+ }
57
+ this._document = null;
58
+ }
45
59
  /**
46
60
  * Load new HTML content and replace the current document
47
61
  */
48
62
  loadHTML(html) {
63
+ if (!this._document) {
64
+ throw new Error("DomParser has been destroyed");
65
+ }
49
66
  this.clearDocument();
50
67
  this.parseHTML(html);
51
68
  this.setupDocumentReferences();
52
69
  }
53
70
  clearDocument() {
54
- if (this.document.head) {
55
- while (this.document.head.firstChild) {
56
- this.document.head.removeChild(this.document.head.firstChild);
71
+ if (!this._document) return;
72
+ if (this._document.head) {
73
+ while (this._document.head.firstChild) {
74
+ this._document.head.removeChild(this._document.head.firstChild);
57
75
  }
58
76
  }
59
- if (this.document.body) {
60
- while (this.document.body.firstChild) {
61
- this.document.body.removeChild(this.document.body.firstChild);
77
+ if (this._document.body) {
78
+ while (this._document.body.firstChild) {
79
+ this._document.body.removeChild(this._document.body.firstChild);
62
80
  }
63
81
  }
64
82
  }
65
83
  parseHTML(html) {
84
+ if (!this._document) {
85
+ throw new Error("DomParser has been destroyed");
86
+ }
66
87
  if (!html.trim()) {
67
88
  return;
68
89
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/DomParser.ts"],
4
- "sourcesContent": ["import { DocumentBase } from './node/DocumentBase';\nimport { TextBase } from './node/TextBase';\nimport { Comment } from './node/Comment';\nimport { WindowBase } from './window/WindowBase';\n\nexport interface DomParserOptions {\n href?: string;\n}\n\nexport class DomParser {\n private _window: Window;\n private _document: Document;\n\n constructor(html: string, option?: DomParserOptions) {\n // Create a new document instance\n const document = new DocumentBase();\n\n // Create WindowBase instance with the document\n const windowBase = new WindowBase(document, option?.href);\n \n this._window = windowBase as unknown as Window;\n this._document = document as any;\n\n // Parse the provided HTML string\n this.parseHTML(html);\n \n // Set up document references after parsing\n this.setupDocumentReferences();\n \n // Simulate document loading process\n if (document && (document as any).simulateLoading) {\n (document as any).simulateLoading();\n }\n }\n\n get window(): Window {\n return this._window;\n }\n\n get document(): Document {\n return this._document;\n }\n /**\n * Load new HTML content and replace the current document\n */\n loadHTML(html: string): void {\n // Clear current document content\n this.clearDocument();\n \n // Parse new HTML\n this.parseHTML(html);\n \n // Set up document references after parsing\n this.setupDocumentReferences();\n }\n\n private clearDocument(): void {\n // Clear document body and head content while preserving structure\n if (this.document.head) {\n while (this.document.head.firstChild) {\n this.document.head.removeChild(this.document.head.firstChild);\n }\n }\n \n if (this.document.body) {\n while (this.document.body.firstChild) {\n this.document.body.removeChild(this.document.body.firstChild);\n }\n }\n }\n\n parseHTML(html: string): void {\n // Simple HTML parsing implementation\n if (!html.trim()) {\n return;\n }\n\n // Basic HTML parsing - this is a simplified version\n // In a real implementation, you'd use a proper HTML parser\n this.parseHTMLString(html, this.document);\n }\n\n private parseHTMLString(html: string, parent: any): void {\n // Remove DOCTYPE if present\n html = html.replace(/<!DOCTYPE[^>]*>/i, '').trim();\n\n if (!html) return;\n\n // Handle template tags specially\n const templateRegex = /<template([^>]*)>(.*?)<\\/template>/gs;\n html = html.replace(templateRegex, (match, attributes, content) => {\n const element = this.document.createElement('template');\n\n // Parse attributes\n if (attributes.trim()) {\n this.parseAttributes(attributes, element);\n }\n\n // Parse content directly into the template's content fragment\n if (content.trim()) {\n // Use internal method to avoid appendChild side effects\n this.parseHTMLString(content.trim(), element.content);\n }\n\n parent.appendChild(element);\n return ''; // Remove from HTML string\n });\n\n // Improved HTML parsing with proper nesting support\n this.parseHTMLRecursive(html, parent);\n }\n\n private parseHTMLRecursive(html: string, parent: any): void {\n let position = 0;\n\n while (position < html.length) {\n // Find next tag or comment\n const tagStart = html.indexOf('<', position);\n\n if (tagStart === -1) {\n // No more tags, add remaining text if any\n const remainingText = html.substring(position).trim();\n if (remainingText) {\n const textNode = new TextBase(remainingText, this.document);\n parent.appendChild(textNode);\n }\n break;\n }\n\n // Add text before tag if any\n if (tagStart > position) {\n const textContent = html.substring(position, tagStart).trim();\n if (textContent) {\n const textNode = new TextBase(textContent, this.document);\n parent.appendChild(textNode);\n }\n }\n\n // Check if this is a comment\n if (html.substring(tagStart, tagStart + 4) === '<!--') {\n const commentEnd = html.indexOf('-->', tagStart + 4);\n if (commentEnd !== -1) {\n const commentContent = html.substring(tagStart + 4, commentEnd);\n const commentNode = new Comment(commentContent, this.document);\n parent.appendChild(commentNode);\n position = commentEnd + 3;\n continue;\n } else {\n // Malformed comment, treat as text\n const textNode = new TextBase(html.substring(tagStart, tagStart + 4), this.document);\n parent.appendChild(textNode);\n position = tagStart + 4;\n continue;\n }\n }\n\n // Find tag end\n const tagEnd = html.indexOf('>', tagStart);\n if (tagEnd === -1) break;\n\n const tagContent = html.substring(tagStart + 1, tagEnd);\n\n // Check if it's a closing tag\n if (tagContent.startsWith('/')) {\n // This is a closing tag, we should return to parent\n position = tagEnd + 1;\n break;\n }\n\n // Check if it's a self-closing tag\n const isSelfClosing = tagContent.endsWith('/') || this.isSelfClosingTag(tagContent.split(/\\s+/)[0]);\n\n // Parse tag name and attributes\n const spaceIndex = tagContent.indexOf(' ');\n const tagName = spaceIndex === -1 ? tagContent.replace('/', '') : tagContent.substring(0, spaceIndex);\n let attributes = spaceIndex === -1 ? '' : tagContent.substring(spaceIndex + 1);\n \n // Only remove trailing slash for self-closing tags (not from attribute values)\n if (attributes.endsWith('/')) {\n attributes = attributes.slice(0, -1).trim();\n }\n\n\n\n // Create element\n const element = this.document.createElement(tagName.toLowerCase());\n\n\n\n // Parse attributes\n if (attributes.trim()) {\n this.parseAttributes(attributes, element);\n }\n\n parent.appendChild(element);\n\n if (isSelfClosing) {\n position = tagEnd + 1;\n } else {\n // Find matching closing tag and parse content\n const closingTag = `</${tagName}>`;\n const closingTagIndex = this.findMatchingClosingTag(html, tagEnd + 1, tagName);\n\n if (closingTagIndex !== -1) {\n const innerContent = html.substring(tagEnd + 1, closingTagIndex);\n if (innerContent.trim()) {\n this.parseHTMLRecursive(innerContent, element);\n }\n position = closingTagIndex + closingTag.length;\n } else {\n // No matching closing tag found, treat as self-closing\n position = tagEnd + 1;\n }\n }\n }\n }\n\n private findMatchingClosingTag(html: string, startPos: number, tagName: string): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n let depth = 1;\n let pos = startPos;\n\n while (pos < html.length && depth > 0) {\n const nextOpen = html.indexOf(openTag, pos);\n const nextClose = html.indexOf(closeTag, pos);\n\n if (nextClose === -1) {\n // No more closing tags\n return -1;\n }\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Found another opening tag before the closing tag\n depth++;\n pos = nextOpen + openTag.length;\n } else {\n // Found a closing tag\n depth--;\n if (depth === 0) {\n return nextClose;\n }\n pos = nextClose + closeTag.length;\n }\n }\n\n return -1;\n }\n\n private parseAttributes(attributeString: string, element: any): void {\n // Improved attribute parsing that handles complex JavaScript expressions\n let position = 0;\n const length = attributeString.length;\n\n while (position < length) {\n // Skip whitespace\n while (position < length && /\\s/.test(attributeString[position])) {\n position++;\n }\n\n if (position >= length) break;\n\n // Find attribute name\n const nameStart = position;\n while (position < length && /[\\w:-]/.test(attributeString[position])) {\n position++;\n }\n\n if (position === nameStart) {\n // Invalid character, skip it\n position++;\n continue;\n }\n\n const name = attributeString.substring(nameStart, position);\n\n // Skip whitespace\n while (position < length && /\\s/.test(attributeString[position])) {\n position++;\n }\n\n let value = '';\n\n // Check if there's an equals sign\n if (position < length && attributeString[position] === '=') {\n position++; // Skip '='\n\n // Skip whitespace\n while (position < length && /\\s/.test(attributeString[position])) {\n position++;\n }\n\n if (position < length) {\n const quote = attributeString[position];\n \n if (quote === '\"' || quote === \"'\") {\n // Quoted value - find matching closing quote\n position++; // Skip opening quote\n const valueStart = position;\n \n while (position < length && attributeString[position] !== quote) {\n position++;\n }\n \n value = attributeString.substring(valueStart, position);\n \n if (position < length && attributeString[position] === quote) {\n position++; // Skip closing quote\n }\n } else {\n // Unquoted value - read until whitespace or end\n const valueStart = position;\n while (position < length && !/\\s/.test(attributeString[position])) {\n position++;\n }\n value = attributeString.substring(valueStart, position);\n }\n }\n }\n\n // Decode HTML entities in attribute values\n value = this.decodeHTMLEntities(value);\n \n element.setAttribute(name, value);\n }\n }\n\n /**\n * Decode HTML entities in a string\n */\n private decodeHTMLEntities(str: string): string {\n const entityMap: { [key: string]: string } = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n '&#34;': '\"',\n '&apos;': \"'\",\n '&copy;': '\u00A9',\n '&reg;': '\u00AE',\n '&trade;': '\u2122',\n '&nbsp;': ' ',\n '&hellip;': '\u2026',\n '&mdash;': '\u2014',\n '&ndash;': '\u2013',\n '&lsquo;': '\\u2018',\n '&rsquo;': '\\u2019',\n '&ldquo;': '\"',\n '&rdquo;': '\"'\n };\n\n return str.replace(/&[a-zA-Z0-9#]+;/g, (entity) => {\n // Handle named entities\n if (entityMap[entity]) {\n return entityMap[entity];\n }\n \n // Handle numeric entities like &#39; &#34;\n if (entity.startsWith('&#') && entity.endsWith(';')) {\n const numStr = entity.slice(2, -1);\n const num = parseInt(numStr, 10);\n if (!isNaN(num)) {\n return String.fromCharCode(num);\n }\n }\n \n // Handle hex entities like &#x27;\n if (entity.startsWith('&#x') && entity.endsWith(';')) {\n const hexStr = entity.slice(3, -1);\n const num = parseInt(hexStr, 16);\n if (!isNaN(num)) {\n return String.fromCharCode(num);\n }\n }\n \n // Return original if not recognized\n return entity;\n });\n }\n\n private isSelfClosingTag(tagName: string): boolean {\n const selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n return selfClosingTags.includes(tagName.toLowerCase());\n }\n\n /**\n * Set up document references after HTML parsing\n */\n private setupDocumentReferences(): void {\n // Find HTML, HEAD, and BODY elements\n const allHtmlElements = this.document.querySelectorAll('html');\n const allHeadElements = this.document.querySelectorAll('head');\n const allBodyElements = this.document.querySelectorAll('body');\n \n // Choose the HTML element with content, then attributes, then first one\n let htmlElement = null;\n // First priority: HTML with attributes (lang, data-theme \uB4F1)\n for (let i = 0; i < allHtmlElements.length; i++) {\n const html = allHtmlElements[i];\n if (html.attributes.length > 0) {\n htmlElement = html;\n break;\n }\n }\n // Second priority: HTML with child nodes (content)\n if (!htmlElement) {\n for (let i = 0; i < allHtmlElements.length; i++) {\n const html = allHtmlElements[i];\n if (html.childNodes.length > 0) {\n htmlElement = html;\n break;\n }\n }\n }\n // Last resort: first HTML\n if (!htmlElement && allHtmlElements.length > 0) {\n htmlElement = allHtmlElements[0];\n }\n \n // Choose the HEAD element with content, then attributes, then first one\n let headElement = null;\n // First priority: HEAD with child nodes (content)\n for (let i = 0; i < allHeadElements.length; i++) {\n const head = allHeadElements[i];\n if (head.childNodes.length > 0) {\n headElement = head;\n break;\n }\n }\n // Second priority: HEAD with attributes\n if (!headElement) {\n for (let i = 0; i < allHeadElements.length; i++) {\n const head = allHeadElements[i];\n if (head.attributes.length > 0) {\n headElement = head;\n break;\n }\n }\n }\n // Last resort: first HEAD\n if (!headElement && allHeadElements.length > 0) {\n headElement = allHeadElements[0];\n }\n \n // Choose the BODY element with content, then attributes, then first one\n let bodyElement = null;\n\n \n // First priority: BODY with child nodes (content)\n for (let i = 0; i < allBodyElements.length; i++) {\n const body = allBodyElements[i];\n if (body.childNodes.length > 0) {\n bodyElement = body;\n break;\n }\n }\n \n // Second priority: BODY with attributes\n if (!bodyElement) {\n for (let i = 0; i < allBodyElements.length; i++) {\n const body = allBodyElements[i];\n if (body.attributes.length > 0) {\n bodyElement = body;\n break;\n }\n }\n }\n \n // Last resort: first BODY\n if (!bodyElement && allBodyElements.length > 0) {\n bodyElement = allBodyElements[0];\n }\n \n\n \n // For now, just use the elements as they are parsed\n // TODO: Implement proper DOM structure reorganization later\n \n // Set document references\n if (htmlElement) {\n (this.document as any).documentElement = htmlElement;\n }\n if (headElement) {\n (this.document as any).head = headElement;\n }\n if (bodyElement) {\n (this.document as any).body = bodyElement;\n }\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {DocumentBase} from './node/DocumentBase';\nimport {TextBase} from './node/TextBase';\nimport {Comment} from './node/Comment';\nimport {WindowBase} from './window/WindowBase';\n\nexport interface DomParserOptions {\n href?: string;\n}\n\nexport class DomParser {\n private _window: Window | null;\n private _document: Document | null;\n\n constructor(html: string, option?: DomParserOptions) {\n // Create WindowBase instance with the document\n const windowBase = new WindowBase({initialUrl: option?.href});\n this._window = windowBase as unknown as Window;\n this._document = windowBase.document as any;\n\n // Parse the provided HTML string\n this.parseHTML(html);\n\n // Set up document references after parsing\n this.setupDocumentReferences();\n\n // Simulate document loading process\n if (this._document && (this._document as any).simulateLoading) {\n (this._document as any).simulateLoading();\n }\n }\n\n get window(): Window {\n if (!this._window) {\n throw new Error('DomParser has been destroyed');\n }\n return this._window;\n }\n\n get document(): Document {\n if (!this._document) {\n throw new Error('DomParser has been destroyed');\n }\n return this._document;\n }\n\n /**\n * Destroy the DomParser instance and free memory\n */\n destroy(): void {\n if (this._window) {\n this._window.close();\n this._window = null;\n }\n \n this._document = null;\n }\n\n /**\n * Load new HTML content and replace the current document\n */\n loadHTML(html: string): void {\n if (!this._document) {\n throw new Error('DomParser has been destroyed');\n }\n \n // Clear current document content\n this.clearDocument();\n\n // Parse new HTML\n this.parseHTML(html);\n\n // Set up document references after parsing\n this.setupDocumentReferences();\n }\n\n private clearDocument(): void {\n if (!this._document) return;\n \n // Clear document body and head content while preserving structure\n if (this._document.head) {\n while (this._document.head.firstChild) {\n this._document.head.removeChild(this._document.head.firstChild);\n }\n }\n\n if (this._document.body) {\n while (this._document.body.firstChild) {\n this._document.body.removeChild(this._document.body.firstChild);\n }\n }\n }\n\n parseHTML(html: string): void {\n if (!this._document) {\n throw new Error('DomParser has been destroyed');\n }\n // Simple HTML parsing implementation\n if (!html.trim()) {\n return;\n }\n\n // Basic HTML parsing - this is a simplified version\n // In a real implementation, you'd use a proper HTML parser\n this.parseHTMLString(html, this.document);\n }\n\n private parseHTMLString(html: string, parent: any): void {\n // Remove DOCTYPE if present\n html = html.replace(/<!DOCTYPE[^>]*>/i, '').trim();\n\n if (!html) return;\n\n // Handle template tags specially\n const templateRegex = /<template([^>]*)>(.*?)<\\/template>/gs;\n html = html.replace(templateRegex, (match, attributes, content) => {\n const element = this.document.createElement('template');\n\n // Parse attributes\n if (attributes.trim()) {\n this.parseAttributes(attributes, element);\n }\n\n // Parse content directly into the template's content fragment\n if (content.trim()) {\n // Use internal method to avoid appendChild side effects\n this.parseHTMLString(content.trim(), element.content);\n }\n\n parent.appendChild(element);\n return ''; // Remove from HTML string\n });\n\n // Improved HTML parsing with proper nesting support\n this.parseHTMLRecursive(html, parent);\n }\n\n private parseHTMLRecursive(html: string, parent: any): void {\n let position = 0;\n\n while (position < html.length) {\n // Find next tag or comment\n const tagStart = html.indexOf('<', position);\n\n if (tagStart === -1) {\n // No more tags, add remaining text if any\n const remainingText = html.substring(position).trim();\n if (remainingText) {\n const textNode = new TextBase(remainingText, this.document);\n parent.appendChild(textNode);\n }\n break;\n }\n\n // Add text before tag if any\n if (tagStart > position) {\n const textContent = html.substring(position, tagStart).trim();\n if (textContent) {\n const textNode = new TextBase(textContent, this.document);\n parent.appendChild(textNode);\n }\n }\n\n // Check if this is a comment\n if (html.substring(tagStart, tagStart + 4) === '<!--') {\n const commentEnd = html.indexOf('-->', tagStart + 4);\n if (commentEnd !== -1) {\n const commentContent = html.substring(tagStart + 4, commentEnd);\n const commentNode = new Comment(commentContent, this.document);\n parent.appendChild(commentNode);\n position = commentEnd + 3;\n continue;\n } else {\n // Malformed comment, treat as text\n const textNode = new TextBase(html.substring(tagStart, tagStart + 4), this.document);\n parent.appendChild(textNode);\n position = tagStart + 4;\n continue;\n }\n }\n\n // Find tag end\n const tagEnd = html.indexOf('>', tagStart);\n if (tagEnd === -1) break;\n\n const tagContent = html.substring(tagStart + 1, tagEnd);\n\n // Check if it's a closing tag\n if (tagContent.startsWith('/')) {\n // This is a closing tag, we should return to parent\n position = tagEnd + 1;\n break;\n }\n\n // Check if it's a self-closing tag\n const isSelfClosing = tagContent.endsWith('/') || this.isSelfClosingTag(tagContent.split(/\\s+/)[0]);\n\n // Parse tag name and attributes\n const spaceIndex = tagContent.indexOf(' ');\n const tagName = spaceIndex === -1 ? tagContent.replace('/', '') : tagContent.substring(0, spaceIndex);\n let attributes = spaceIndex === -1 ? '' : tagContent.substring(spaceIndex + 1);\n\n // Only remove trailing slash for self-closing tags (not from attribute values)\n if (attributes.endsWith('/')) {\n attributes = attributes.slice(0, -1).trim();\n }\n\n\n // Create element\n const element = this.document.createElement(tagName.toLowerCase());\n\n\n // Parse attributes\n if (attributes.trim()) {\n this.parseAttributes(attributes, element);\n }\n\n parent.appendChild(element);\n\n if (isSelfClosing) {\n position = tagEnd + 1;\n } else {\n // Find matching closing tag and parse content\n const closingTag = `</${tagName}>`;\n const closingTagIndex = this.findMatchingClosingTag(html, tagEnd + 1, tagName);\n\n if (closingTagIndex !== -1) {\n const innerContent = html.substring(tagEnd + 1, closingTagIndex);\n if (innerContent.trim()) {\n this.parseHTMLRecursive(innerContent, element);\n }\n position = closingTagIndex + closingTag.length;\n } else {\n // No matching closing tag found, treat as self-closing\n position = tagEnd + 1;\n }\n }\n }\n }\n\n private findMatchingClosingTag(html: string, startPos: number, tagName: string): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n let depth = 1;\n let pos = startPos;\n\n while (pos < html.length && depth > 0) {\n const nextOpen = html.indexOf(openTag, pos);\n const nextClose = html.indexOf(closeTag, pos);\n\n if (nextClose === -1) {\n // No more closing tags\n return -1;\n }\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Found another opening tag before the closing tag\n depth++;\n pos = nextOpen + openTag.length;\n } else {\n // Found a closing tag\n depth--;\n if (depth === 0) {\n return nextClose;\n }\n pos = nextClose + closeTag.length;\n }\n }\n\n return -1;\n }\n\n private parseAttributes(attributeString: string, element: any): void {\n // Improved attribute parsing that handles complex JavaScript expressions\n let position = 0;\n const length = attributeString.length;\n\n while (position < length) {\n // Skip whitespace\n while (position < length && /\\s/.test(attributeString[position])) {\n position++;\n }\n\n if (position >= length) break;\n\n // Find attribute name\n const nameStart = position;\n while (position < length && /[\\w:-]/.test(attributeString[position])) {\n position++;\n }\n\n if (position === nameStart) {\n // Invalid character, skip it\n position++;\n continue;\n }\n\n const name = attributeString.substring(nameStart, position);\n\n // Skip whitespace\n while (position < length && /\\s/.test(attributeString[position])) {\n position++;\n }\n\n let value = '';\n\n // Check if there's an equals sign\n if (position < length && attributeString[position] === '=') {\n position++; // Skip '='\n\n // Skip whitespace\n while (position < length && /\\s/.test(attributeString[position])) {\n position++;\n }\n\n if (position < length) {\n const quote = attributeString[position];\n\n if (quote === '\"' || quote === \"'\") {\n // Quoted value - find matching closing quote\n position++; // Skip opening quote\n const valueStart = position;\n\n while (position < length && attributeString[position] !== quote) {\n position++;\n }\n\n value = attributeString.substring(valueStart, position);\n\n if (position < length && attributeString[position] === quote) {\n position++; // Skip closing quote\n }\n } else {\n // Unquoted value - read until whitespace or end\n const valueStart = position;\n while (position < length && !/\\s/.test(attributeString[position])) {\n position++;\n }\n value = attributeString.substring(valueStart, position);\n }\n }\n }\n\n // Decode HTML entities in attribute values\n value = this.decodeHTMLEntities(value);\n\n element.setAttribute(name, value);\n }\n }\n\n /**\n * Decode HTML entities in a string\n */\n private decodeHTMLEntities(str: string): string {\n const entityMap: { [key: string]: string } = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n '&#34;': '\"',\n '&apos;': \"'\",\n '&copy;': '\u00A9',\n '&reg;': '\u00AE',\n '&trade;': '\u2122',\n '&nbsp;': ' ',\n '&hellip;': '\u2026',\n '&mdash;': '\u2014',\n '&ndash;': '\u2013',\n '&lsquo;': '\\u2018',\n '&rsquo;': '\\u2019',\n '&ldquo;': '\"',\n '&rdquo;': '\"'\n };\n\n return str.replace(/&[a-zA-Z0-9#]+;/g, (entity) => {\n // Handle named entities\n if (entityMap[entity]) {\n return entityMap[entity];\n }\n\n // Handle numeric entities like &#39; &#34;\n if (entity.startsWith('&#') && entity.endsWith(';')) {\n const numStr = entity.slice(2, -1);\n const num = parseInt(numStr, 10);\n if (!isNaN(num)) {\n return String.fromCharCode(num);\n }\n }\n\n // Handle hex entities like &#x27;\n if (entity.startsWith('&#x') && entity.endsWith(';')) {\n const hexStr = entity.slice(3, -1);\n const num = parseInt(hexStr, 16);\n if (!isNaN(num)) {\n return String.fromCharCode(num);\n }\n }\n\n // Return original if not recognized\n return entity;\n });\n }\n\n private isSelfClosingTag(tagName: string): boolean {\n const selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n return selfClosingTags.includes(tagName.toLowerCase());\n }\n\n /**\n * Set up document references after HTML parsing\n */\n private setupDocumentReferences(): void {\n // Find HTML, HEAD, and BODY elements\n const allHtmlElements = this.document.querySelectorAll('html');\n const allHeadElements = this.document.querySelectorAll('head');\n const allBodyElements = this.document.querySelectorAll('body');\n\n // Choose the HTML element with content, then attributes, then first one\n let htmlElement = null;\n // First priority: HTML with attributes (lang, data-theme \uB4F1)\n for (let i = 0; i < allHtmlElements.length; i++) {\n const html = allHtmlElements[i];\n if (html.attributes.length > 0) {\n htmlElement = html;\n break;\n }\n }\n // Second priority: HTML with child nodes (content)\n if (!htmlElement) {\n for (let i = 0; i < allHtmlElements.length; i++) {\n const html = allHtmlElements[i];\n if (html.childNodes.length > 0) {\n htmlElement = html;\n break;\n }\n }\n }\n // Last resort: first HTML\n if (!htmlElement && allHtmlElements.length > 0) {\n htmlElement = allHtmlElements[0];\n }\n\n // Choose the HEAD element with content, then attributes, then first one\n let headElement = null;\n // First priority: HEAD with child nodes (content)\n for (let i = 0; i < allHeadElements.length; i++) {\n const head = allHeadElements[i];\n if (head.childNodes.length > 0) {\n headElement = head;\n break;\n }\n }\n // Second priority: HEAD with attributes\n if (!headElement) {\n for (let i = 0; i < allHeadElements.length; i++) {\n const head = allHeadElements[i];\n if (head.attributes.length > 0) {\n headElement = head;\n break;\n }\n }\n }\n // Last resort: first HEAD\n if (!headElement && allHeadElements.length > 0) {\n headElement = allHeadElements[0];\n }\n\n // Choose the BODY element with content, then attributes, then first one\n let bodyElement = null;\n\n\n // First priority: BODY with child nodes (content)\n for (let i = 0; i < allBodyElements.length; i++) {\n const body = allBodyElements[i];\n if (body.childNodes.length > 0) {\n bodyElement = body;\n break;\n }\n }\n\n // Second priority: BODY with attributes\n if (!bodyElement) {\n for (let i = 0; i < allBodyElements.length; i++) {\n const body = allBodyElements[i];\n if (body.attributes.length > 0) {\n bodyElement = body;\n break;\n }\n }\n }\n\n // Last resort: first BODY\n if (!bodyElement && allBodyElements.length > 0) {\n bodyElement = allBodyElements[0];\n }\n\n\n // For now, just use the elements as they are parsed\n // TODO: Implement proper DOM structure reorganization later\n\n // Set document references\n if (htmlElement) {\n (this.document as any).documentElement = htmlElement;\n }\n if (headElement) {\n (this.document as any).head = headElement;\n }\n if (bodyElement) {\n (this.document as any).body = bodyElement;\n }\n }\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -90,6 +90,7 @@ class DocumentBase extends import_ParentNodeBase.ParentNodeBase {
90
90
  },
91
91
  reload: () => {
92
92
  },
93
+ // @ts-ignore
93
94
  toString: () => this._location.href
94
95
  };
95
96
  // Event handlers
@@ -119,6 +120,9 @@ class DocumentBase extends import_ParentNodeBase.ParentNodeBase {
119
120
  this.head = head;
120
121
  this.body = body;
121
122
  }
123
+ setLocation(location) {
124
+ this._location = location;
125
+ }
122
126
  get location() {
123
127
  return this._location;
124
128
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/node/DocumentBase.ts"],
4
- "sourcesContent": ["import {ParentNodeBase} from './ParentNodeBase';\nimport {DOCUMENT_NODE, Node} from './Node';\nimport {Document, ElementCreationOptions, DocumentReadyState, DocumentVisibilityState, ImportNodeOptions, CaretPositionFromPointOptions, StartViewTransitionOptions, ViewTransitionUpdateCallback} from './Document';\nimport {Comment} from './Comment';\nimport {Text} from './Text';\nimport {DocumentFragment} from './DocumentFragment';\nimport {DocumentFragmentBase} from './DocumentFragmentBase';\nimport {Element} from './elements/Element';\nimport {HTMLElement} from './elements/HTMLElement';\nimport {HTMLCollection, HTMLCollectionOf} from './collection';\nimport {HTMLElementTagNameMap, SVGElementTagNameMap, MathMLElementTagNameMap, HTMLElementDeprecatedTagNameMap} from './elements';\nimport {NodeListOf} from './collection/NodeListOf';\nimport {ElementFactory} from '../factory';\nimport {NodeIterator, NodeFilter} from './NodeIterator';\n\n// Document event listener interface\ninterface DocumentEventListener {\n type: string;\n listener: (event: any) => void;\n options?: boolean | AddEventListenerOptions;\n}\n\n/**\n * The **`DocumentBase`** class is the concrete implementation of the Document interface.\n */\nexport class DocumentBase extends ParentNodeBase implements Document {\n // Event system\n private _eventListeners: DocumentEventListener[] = [];\n private _readyState: DocumentReadyState = 'uninitialized' as any;\n private _window: any = null; // Reference to window for load event\n // Properties\n readonly URL: string = 'about:blank';\n alinkColor: string = '';\n readonly all: any = null;\n readonly anchors: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n readonly applets: HTMLCollection = new HTMLCollection([]);\n bgColor: string = '';\n body: HTMLElement = null as any;\n readonly characterSet: string = 'UTF-8';\n readonly charset: string = 'UTF-8';\n readonly compatMode: string = 'CSS1Compat';\n readonly contentType: string = 'text/html';\n cookie: string = '';\n readonly currentScript: any = null;\n readonly defaultView: any = null;\n designMode: string = 'off';\n dir: string = '';\n readonly doctype: any = null;\n readonly documentElement: HTMLElement = null as any;\n readonly documentURI: string = 'about:blank';\n domain: string = '';\n readonly embeds: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n fgColor: string = '';\n readonly forms: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n readonly fragmentDirective: any = null;\n readonly fullscreen: boolean = false;\n readonly fullscreenEnabled: boolean = false;\n readonly head: any = null;\n readonly hidden: boolean = false;\n readonly images: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n readonly implementation: any = null;\n readonly inputEncoding: string = 'UTF-8';\n readonly lastModified: string = new Date().toString();\n linkColor: string = '';\n readonly links: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n \n // Location property - simple implementation for Document\n private _location: any = {\n href: 'about:blank',\n protocol: 'about:',\n host: '',\n hostname: '',\n port: '',\n pathname: 'blank',\n search: '',\n hash: '',\n origin: 'null',\n assign: (url: string) => { this._location.href = url; },\n replace: (url: string) => { this._location.href = url; },\n reload: () => {},\n toString: () => this._location.href\n };\n \n get location(): any {\n return this._location;\n }\n \n set location(href: string) {\n this._location.href = href;\n // Simple URL parsing for document location\n try {\n const url = new URL(href);\n this._location.protocol = url.protocol;\n this._location.host = url.host;\n this._location.hostname = url.hostname;\n this._location.port = url.port;\n this._location.pathname = url.pathname;\n this._location.search = url.search;\n this._location.hash = url.hash;\n this._location.origin = url.origin;\n } catch (e) {\n // Keep defaults for invalid URLs\n }\n }\n \n // Event handlers\n onfullscreenchange: ((this: Document, ev: Event) => any) | null = null;\n onfullscreenerror: ((this: Document, ev: Event) => any) | null = null;\n onpointerlockchange: ((this: Document, ev: Event) => any) | null = null;\n onpointerlockerror: ((this: Document, ev: Event) => any) | null = null;\n onreadystatechange: ((this: Document, ev: Event) => any) | null = null;\n onvisibilitychange: ((this: Document, ev: Event) => any) | null = null;\n \n get ownerDocument(): null {\n return null;\n }\n readonly pictureInPictureEnabled: boolean = false;\n readonly plugins: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n get readyState(): DocumentReadyState {\n return this._readyState;\n }\n readonly referrer: string = '';\n readonly rootElement: any = null;\n readonly scripts: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n readonly scrollingElement: Element | null = null;\n readonly timeline: any = null;\n get title(): string {\n const titleElement = this.querySelector('title');\n return titleElement ? titleElement.textContent || '' : '';\n }\n \n set title(value: string) {\n let titleElement = this.querySelector('title');\n if (!titleElement) {\n // Create title element if it doesn't exist\n titleElement = this.createElement('title');\n const head = this.head || this.querySelector('head');\n if (head) {\n head.appendChild(titleElement);\n }\n }\n titleElement.textContent = value;\n }\n readonly visibilityState: DocumentVisibilityState = 'visible';\n vlinkColor: string = '';\n\n constructor() {\n super(DOCUMENT_NODE, '#document');\n this._ownerDocument = null;\n\n // Create basic document structure\n const documentElement = this.createElement('html') as HTMLElement;\n const head = this.createElement('head') as HTMLElement;\n const body = this.createElement('body') as HTMLElement;\n\n documentElement.appendChild(head);\n documentElement.appendChild(body);\n this.appendChild(documentElement);\n\n // Set readonly properties\n (this as any).documentElement = documentElement;\n (this as any).head = head;\n this.body = body;\n }\n\n get textContent(): null {\n return null;\n }\n\n // Methods\n adoptNode<T extends Node>(node: T): T {\n (node as any)._ownerDocument = this;\n return node;\n }\n\n captureEvents(): void {}\n\n caretPositionFromPoint(_x: number, _y: number, _options?: CaretPositionFromPointOptions): any {\n return null;\n }\n\n caretRangeFromPoint(_x: number, _y: number): any {\n return null;\n }\n\n clear(): void {}\n\n close(): void {}\n\n createAttribute(localName: string): any {\n return { name: localName, value: '' };\n }\n\n createAttributeNS(_namespace: string | null, qualifiedName: string): any {\n return { name: qualifiedName, value: '' };\n }\n\n createCDATASection(data: string): any {\n return { data, nodeType: 4 };\n }\n\n createComment(data: string): Comment {\n return new Comment(data, this);\n }\n\n createDocumentFragment(): DocumentFragment {\n return new DocumentFragmentBase(this);\n }\n\n createElement<K extends keyof HTMLElementTagNameMap>(tagName: K, _options?: ElementCreationOptions): HTMLElementTagNameMap[K];\n createElement<K extends keyof HTMLElementDeprecatedTagNameMap>(tagName: K, _options?: ElementCreationOptions): HTMLElementDeprecatedTagNameMap[K];\n createElement(tagName: string, _options?: ElementCreationOptions): HTMLElement;\n createElement(tagName: string, _options?: ElementCreationOptions): HTMLElement {\n return ElementFactory.createElement(tagName, this);\n }\n\n createElementNS(namespaceURI: \"http://www.w3.org/1999/xhtml\", qualifiedName: string): HTMLElement;\n createElementNS<K extends keyof SVGElementTagNameMap>(namespaceURI: \"http://www.w3.org/2000/svg\", qualifiedName: K): SVGElementTagNameMap[K];\n createElementNS(namespaceURI: \"http://www.w3.org/2000/svg\", qualifiedName: string): any;\n createElementNS<K extends keyof MathMLElementTagNameMap>(namespaceURI: \"http://www.w3.org/1998/Math/MathML\", qualifiedName: K): MathMLElementTagNameMap[K];\n createElementNS(namespaceURI: \"http://www.w3.org/1998/Math/MathML\", qualifiedName: string): any;\n createElementNS(namespaceURI: string | null, qualifiedName: string, options?: ElementCreationOptions): Element;\n createElementNS(_namespace: string | null, qualifiedName: string, _options?: string | ElementCreationOptions): Element;\n createElementNS(_namespaceURI: string | null, qualifiedName: string, _options?: ElementCreationOptions | string): Element {\n return ElementFactory.createElement(qualifiedName, this);\n }\n\n createEvent(_eventInterface: string): any {\n return {};\n }\n\n createNodeIterator(root: Node, whatToShow: number = NodeFilter.SHOW_ALL, filter: NodeFilter | null = null): NodeIterator {\n return new NodeIterator(root, whatToShow, filter);\n }\n\n createProcessingInstruction(target: string, data: string): any {\n return { target, data, nodeType: 7 };\n }\n\n createRange(): any {\n return {};\n }\n\n createTextNode(data: string): Text {\n const { TextBase } = require('./TextBase');\n return new TextBase(data, this);\n }\n\n createTreeWalker(_root: Node, _whatToShow?: number, _filter?: any): any {\n return {};\n }\n\n execCommand(_commandId: string, _showUI?: boolean, _value?: string): boolean {\n return false;\n }\n\n exitFullscreen(): Promise<void> {\n return Promise.resolve();\n }\n\n exitPictureInPicture(): Promise<void> {\n return Promise.resolve();\n }\n\n exitPointerLock(): void {}\n\n getElementById(elementId: string): HTMLElement | null {\n const elements = this.querySelectorAll(`#${elementId}`);\n return elements.length > 0 ? elements[0] as HTMLElement : null;\n }\n\n getElementsByClassName(classNames: string): HTMLCollectionOf<Element> {\n const elements = this.querySelectorAll(`.${classNames.split(' ').join('.')}`);\n return new HTMLCollectionOf(Array.from(elements));\n }\n\n getElementsByName(elementName: string): NodeListOf<HTMLElement> {\n const elements = this.querySelectorAll(`[name=\"${elementName}\"]`);\n return new NodeListOf(Array.from(elements) as HTMLElement[]);\n }\n\n getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>;\n getElementsByTagName<K extends keyof SVGElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<SVGElementTagNameMap[K]>;\n getElementsByTagName<K extends keyof MathMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<MathMLElementTagNameMap[K]>;\n getElementsByTagName<K extends keyof HTMLElementDeprecatedTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementDeprecatedTagNameMap[K]>;\n getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>;\n getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element> {\n const elements = this.querySelectorAll<Element>(qualifiedName);\n return new HTMLCollectionOf(Array.from(elements));\n }\n\n getElementsByTagNameNS(namespaceURI: \"http://www.w3.org/1999/xhtml\", localName: string): HTMLCollectionOf<HTMLElement>;\n getElementsByTagNameNS(namespaceURI: \"http://www.w3.org/2000/svg\", localName: string): HTMLCollectionOf<any>;\n getElementsByTagNameNS(namespaceURI: \"http://www.w3.org/1998/Math/MathML\", localName: string): HTMLCollectionOf<any>;\n getElementsByTagNameNS(_namespace: string | null, localName: string): HTMLCollectionOf<Element>;\n getElementsByTagNameNS(_namespace: string | null, localName: string): HTMLCollectionOf<Element> {\n return this.getElementsByTagName(localName);\n }\n\n getSelection(): any {\n return null;\n }\n\n hasFocus(): boolean {\n return false;\n }\n\n hasStorageAccess(): Promise<boolean> {\n return Promise.resolve(false);\n }\n\n importNode<T extends Node>(node: T, _options?: boolean | ImportNodeOptions): T {\n const cloned = (node as any).cloneNode(typeof _options === 'boolean' ? _options : _options?.deep);\n (cloned as any)._ownerDocument = this;\n return cloned;\n }\n\n open(_unused1?: string, _unused2?: string): Document;\n open(_url: string | URL, _name: string, _features: string): any;\n open(_arg1?: string | URL, _arg2?: string, _arg3?: string): Document | any {\n if (arguments.length <= 2) {\n return this;\n }\n return null;\n }\n\n queryCommandEnabled(_commandId: string): boolean {\n return false;\n }\n\n queryCommandIndeterm(_commandId: string): boolean {\n return false;\n }\n\n queryCommandState(_commandId: string): boolean {\n return false;\n }\n\n queryCommandSupported(_commandId: string): boolean {\n return false;\n }\n\n queryCommandValue(_commandId: string): string {\n return '';\n }\n\n releaseEvents(): void {}\n\n requestStorageAccess(): Promise<void> {\n return Promise.resolve();\n }\n\n startViewTransition(_callbackOptions?: ViewTransitionUpdateCallback | StartViewTransitionOptions): any {\n return {};\n }\n\n write(...text: string[]): void {\n console.log('Document.write:', text.join(''));\n }\n\n writeln(...text: string[]): void {\n this.write(...text, '\\n');\n }\n\n addEventListener(type: string, listener: any, options?: boolean | any): void {\n // Support DOMContentLoaded and readystatechange events\n if (type === 'DOMContentLoaded' || type === 'readystatechange') {\n this._eventListeners.push({\n type,\n listener: typeof listener === 'function' ? listener : listener.handleEvent,\n options\n });\n }\n }\n\n removeEventListener(type: string, listener: any, options?: boolean | any): void {\n if (type === 'DOMContentLoaded' || type === 'readystatechange') {\n const targetListener = typeof listener === 'function' ? listener : listener.handleEvent;\n this._eventListeners = this._eventListeners.filter(\n eventListener => !(eventListener.type === type && eventListener.listener === targetListener)\n );\n }\n }\n\n dispatchEvent(event: any): boolean {\n const eventListeners = this._eventListeners.filter(listener => listener.type === event.type);\n \n for (const eventListener of eventListeners) {\n try {\n eventListener.listener.call(this, event);\n \n // Handle 'once' option\n if (eventListener.options && typeof eventListener.options === 'object' && eventListener.options.once) {\n this.removeEventListener(event.type, eventListener.listener);\n }\n } catch (error) {\n console.error('Error in document event listener:', error);\n }\n }\n \n return true;\n }\n\n /**\n * Set window reference for load event dispatching\n */\n setWindow(window: any): void {\n this._window = window;\n }\n\n /**\n * Change document ready state and dispatch events\n */\n setReadyState(state: DocumentReadyState): void {\n if (this._readyState === state) return;\n \n this._readyState = state;\n \n // Dispatch readystatechange event\n this.dispatchEvent({\n type: 'readystatechange',\n target: this,\n readyState: state\n });\n \n // Dispatch DOMContentLoaded when interactive\n if (state === 'interactive') {\n this.dispatchEvent({\n type: 'DOMContentLoaded',\n target: this\n });\n }\n \n // Dispatch load event on window when complete\n if (state === 'complete' && this._window) {\n // Use setTimeout to ensure it's dispatched after current execution\n setTimeout(() => {\n if (this._window && this._window.dispatchEvent) {\n this._window.dispatchEvent({\n type: 'load',\n target: this._window\n });\n }\n }, 0);\n }\n }\n\n /**\n * Simulate document loading process\n */\n simulateLoading(): void {\n // Start with loading state\n this.setReadyState('loading');\n \n // Simulate DOM parsing completion\n setTimeout(() => {\n this.setReadyState('interactive');\n \n // Simulate resource loading completion\n setTimeout(() => {\n this.setReadyState('complete');\n }, 10);\n }, 5);\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {ParentNodeBase} from './ParentNodeBase';\nimport {DOCUMENT_NODE, Node} from './Node';\nimport {Document, ElementCreationOptions, DocumentReadyState, DocumentVisibilityState, ImportNodeOptions, CaretPositionFromPointOptions, StartViewTransitionOptions, ViewTransitionUpdateCallback} from './Document';\nimport {Location} from '../window/Window';\nimport {Comment} from './Comment';\nimport {Text} from './Text';\nimport {DocumentFragment} from './DocumentFragment';\nimport {DocumentFragmentBase} from './DocumentFragmentBase';\nimport {Element} from './elements/Element';\nimport {HTMLElement} from './elements/HTMLElement';\nimport {HTMLCollection, HTMLCollectionOf} from './collection';\nimport {HTMLElementTagNameMap, SVGElementTagNameMap, MathMLElementTagNameMap, HTMLElementDeprecatedTagNameMap} from './elements';\nimport {NodeListOf} from './collection/NodeListOf';\nimport {ElementFactory} from '../factory';\nimport {NodeIterator, NodeFilter} from './NodeIterator';\n\n// Document event listener interface\ninterface DocumentEventListener {\n type: string;\n listener: (event: any) => void;\n options?: boolean | AddEventListenerOptions;\n}\n\n/**\n * The **`DocumentBase`** class is the concrete implementation of the Document interface.\n */\nexport class DocumentBase extends ParentNodeBase implements Document {\n // Event system\n private _eventListeners: DocumentEventListener[] = [];\n private _readyState: DocumentReadyState = 'uninitialized' as any;\n private _window: any = null; // Reference to window for load event\n // Properties\n readonly URL: string = 'about:blank';\n alinkColor: string = '';\n readonly all: any = null;\n readonly anchors: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n readonly applets: HTMLCollection = new HTMLCollection([]);\n bgColor: string = '';\n body: HTMLElement = null as any;\n readonly characterSet: string = 'UTF-8';\n readonly charset: string = 'UTF-8';\n readonly compatMode: string = 'CSS1Compat';\n readonly contentType: string = 'text/html';\n cookie: string = '';\n readonly currentScript: any = null;\n readonly defaultView: any = null;\n designMode: string = 'off';\n dir: string = '';\n readonly doctype: any = null;\n readonly documentElement: HTMLElement = null as any;\n readonly documentURI: string = 'about:blank';\n domain: string = '';\n readonly embeds: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n fgColor: string = '';\n readonly forms: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n readonly fragmentDirective: any = null;\n readonly fullscreen: boolean = false;\n readonly fullscreenEnabled: boolean = false;\n readonly head: any = null;\n readonly hidden: boolean = false;\n readonly images: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n readonly implementation: any = null;\n readonly inputEncoding: string = 'UTF-8';\n readonly lastModified: string = new Date().toString();\n linkColor: string = '';\n readonly links: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n \n // Location property - simple implementation for Document\n private _location: Location = {\n href: 'about:blank',\n protocol: 'about:',\n host: '',\n hostname: '',\n port: '',\n pathname: 'blank',\n search: '',\n hash: '',\n origin: 'null',\n assign: (url: string) => { this._location.href = url; },\n replace: (url: string) => { this._location.href = url; },\n reload: () => {},\n // @ts-ignore\n toString: () => this._location.href\n };\n\n setLocation(location: Location): void {\n this._location = location;\n }\n get location(): any {\n return this._location;\n }\n \n set location(href: string) {\n this._location.href = href;\n // Simple URL parsing for document location\n try {\n const url = new URL(href);\n this._location.protocol = url.protocol;\n this._location.host = url.host;\n this._location.hostname = url.hostname;\n this._location.port = url.port;\n this._location.pathname = url.pathname;\n this._location.search = url.search;\n this._location.hash = url.hash;\n this._location.origin = url.origin;\n } catch (e) {\n // Keep defaults for invalid URLs\n }\n }\n \n // Event handlers\n onfullscreenchange: ((this: Document, ev: Event) => any) | null = null;\n onfullscreenerror: ((this: Document, ev: Event) => any) | null = null;\n onpointerlockchange: ((this: Document, ev: Event) => any) | null = null;\n onpointerlockerror: ((this: Document, ev: Event) => any) | null = null;\n onreadystatechange: ((this: Document, ev: Event) => any) | null = null;\n onvisibilitychange: ((this: Document, ev: Event) => any) | null = null;\n \n get ownerDocument(): null {\n return null;\n }\n readonly pictureInPictureEnabled: boolean = false;\n readonly plugins: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n get readyState(): DocumentReadyState {\n return this._readyState;\n }\n readonly referrer: string = '';\n readonly rootElement: any = null;\n readonly scripts: HTMLCollectionOf<any> = new HTMLCollectionOf([]);\n readonly scrollingElement: Element | null = null;\n readonly timeline: any = null;\n get title(): string {\n const titleElement = this.querySelector('title');\n return titleElement ? titleElement.textContent || '' : '';\n }\n \n set title(value: string) {\n let titleElement = this.querySelector('title');\n if (!titleElement) {\n // Create title element if it doesn't exist\n titleElement = this.createElement('title');\n const head = this.head || this.querySelector('head');\n if (head) {\n head.appendChild(titleElement);\n }\n }\n titleElement.textContent = value;\n }\n readonly visibilityState: DocumentVisibilityState = 'visible';\n vlinkColor: string = '';\n\n constructor() {\n super(DOCUMENT_NODE, '#document');\n this._ownerDocument = null;\n\n // Create basic document structure\n const documentElement = this.createElement('html') as HTMLElement;\n const head = this.createElement('head') as HTMLElement;\n const body = this.createElement('body') as HTMLElement;\n\n documentElement.appendChild(head);\n documentElement.appendChild(body);\n this.appendChild(documentElement);\n\n // Set readonly properties\n (this as any).documentElement = documentElement;\n (this as any).head = head;\n this.body = body;\n }\n\n get textContent(): null {\n return null;\n }\n\n // Methods\n adoptNode<T extends Node>(node: T): T {\n (node as any)._ownerDocument = this;\n return node;\n }\n\n captureEvents(): void {}\n\n caretPositionFromPoint(_x: number, _y: number, _options?: CaretPositionFromPointOptions): any {\n return null;\n }\n\n caretRangeFromPoint(_x: number, _y: number): any {\n return null;\n }\n\n clear(): void {}\n\n close(): void {}\n\n createAttribute(localName: string): any {\n return { name: localName, value: '' };\n }\n\n createAttributeNS(_namespace: string | null, qualifiedName: string): any {\n return { name: qualifiedName, value: '' };\n }\n\n createCDATASection(data: string): any {\n return { data, nodeType: 4 };\n }\n\n createComment(data: string): Comment {\n return new Comment(data, this);\n }\n\n createDocumentFragment(): DocumentFragment {\n return new DocumentFragmentBase(this);\n }\n\n createElement<K extends keyof HTMLElementTagNameMap>(tagName: K, _options?: ElementCreationOptions): HTMLElementTagNameMap[K];\n createElement<K extends keyof HTMLElementDeprecatedTagNameMap>(tagName: K, _options?: ElementCreationOptions): HTMLElementDeprecatedTagNameMap[K];\n createElement(tagName: string, _options?: ElementCreationOptions): HTMLElement;\n createElement(tagName: string, _options?: ElementCreationOptions): HTMLElement {\n return ElementFactory.createElement(tagName, this);\n }\n\n createElementNS(namespaceURI: \"http://www.w3.org/1999/xhtml\", qualifiedName: string): HTMLElement;\n createElementNS<K extends keyof SVGElementTagNameMap>(namespaceURI: \"http://www.w3.org/2000/svg\", qualifiedName: K): SVGElementTagNameMap[K];\n createElementNS(namespaceURI: \"http://www.w3.org/2000/svg\", qualifiedName: string): any;\n createElementNS<K extends keyof MathMLElementTagNameMap>(namespaceURI: \"http://www.w3.org/1998/Math/MathML\", qualifiedName: K): MathMLElementTagNameMap[K];\n createElementNS(namespaceURI: \"http://www.w3.org/1998/Math/MathML\", qualifiedName: string): any;\n createElementNS(namespaceURI: string | null, qualifiedName: string, options?: ElementCreationOptions): Element;\n createElementNS(_namespace: string | null, qualifiedName: string, _options?: string | ElementCreationOptions): Element;\n createElementNS(_namespaceURI: string | null, qualifiedName: string, _options?: ElementCreationOptions | string): Element {\n return ElementFactory.createElement(qualifiedName, this);\n }\n\n createEvent(_eventInterface: string): any {\n return {};\n }\n\n createNodeIterator(root: Node, whatToShow: number = NodeFilter.SHOW_ALL, filter: NodeFilter | null = null): NodeIterator {\n return new NodeIterator(root, whatToShow, filter);\n }\n\n createProcessingInstruction(target: string, data: string): any {\n return { target, data, nodeType: 7 };\n }\n\n createRange(): any {\n return {};\n }\n\n createTextNode(data: string): Text {\n const { TextBase } = require('./TextBase');\n return new TextBase(data, this);\n }\n\n createTreeWalker(_root: Node, _whatToShow?: number, _filter?: any): any {\n return {};\n }\n\n execCommand(_commandId: string, _showUI?: boolean, _value?: string): boolean {\n return false;\n }\n\n exitFullscreen(): Promise<void> {\n return Promise.resolve();\n }\n\n exitPictureInPicture(): Promise<void> {\n return Promise.resolve();\n }\n\n exitPointerLock(): void {}\n\n getElementById(elementId: string): HTMLElement | null {\n const elements = this.querySelectorAll(`#${elementId}`);\n return elements.length > 0 ? elements[0] as HTMLElement : null;\n }\n\n getElementsByClassName(classNames: string): HTMLCollectionOf<Element> {\n const elements = this.querySelectorAll(`.${classNames.split(' ').join('.')}`);\n return new HTMLCollectionOf(Array.from(elements));\n }\n\n getElementsByName(elementName: string): NodeListOf<HTMLElement> {\n const elements = this.querySelectorAll(`[name=\"${elementName}\"]`);\n return new NodeListOf(Array.from(elements) as HTMLElement[]);\n }\n\n getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>;\n getElementsByTagName<K extends keyof SVGElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<SVGElementTagNameMap[K]>;\n getElementsByTagName<K extends keyof MathMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<MathMLElementTagNameMap[K]>;\n getElementsByTagName<K extends keyof HTMLElementDeprecatedTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementDeprecatedTagNameMap[K]>;\n getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>;\n getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element> {\n const elements = this.querySelectorAll<Element>(qualifiedName);\n return new HTMLCollectionOf(Array.from(elements));\n }\n\n getElementsByTagNameNS(namespaceURI: \"http://www.w3.org/1999/xhtml\", localName: string): HTMLCollectionOf<HTMLElement>;\n getElementsByTagNameNS(namespaceURI: \"http://www.w3.org/2000/svg\", localName: string): HTMLCollectionOf<any>;\n getElementsByTagNameNS(namespaceURI: \"http://www.w3.org/1998/Math/MathML\", localName: string): HTMLCollectionOf<any>;\n getElementsByTagNameNS(_namespace: string | null, localName: string): HTMLCollectionOf<Element>;\n getElementsByTagNameNS(_namespace: string | null, localName: string): HTMLCollectionOf<Element> {\n return this.getElementsByTagName(localName);\n }\n\n getSelection(): any {\n return null;\n }\n\n hasFocus(): boolean {\n return false;\n }\n\n hasStorageAccess(): Promise<boolean> {\n return Promise.resolve(false);\n }\n\n importNode<T extends Node>(node: T, _options?: boolean | ImportNodeOptions): T {\n const cloned = (node as any).cloneNode(typeof _options === 'boolean' ? _options : _options?.deep);\n (cloned as any)._ownerDocument = this;\n return cloned;\n }\n\n open(_unused1?: string, _unused2?: string): Document;\n open(_url: string | URL, _name: string, _features: string): any;\n open(_arg1?: string | URL, _arg2?: string, _arg3?: string): Document | any {\n if (arguments.length <= 2) {\n return this;\n }\n return null;\n }\n\n queryCommandEnabled(_commandId: string): boolean {\n return false;\n }\n\n queryCommandIndeterm(_commandId: string): boolean {\n return false;\n }\n\n queryCommandState(_commandId: string): boolean {\n return false;\n }\n\n queryCommandSupported(_commandId: string): boolean {\n return false;\n }\n\n queryCommandValue(_commandId: string): string {\n return '';\n }\n\n releaseEvents(): void {}\n\n requestStorageAccess(): Promise<void> {\n return Promise.resolve();\n }\n\n startViewTransition(_callbackOptions?: ViewTransitionUpdateCallback | StartViewTransitionOptions): any {\n return {};\n }\n\n write(...text: string[]): void {\n console.log('Document.write:', text.join(''));\n }\n\n writeln(...text: string[]): void {\n this.write(...text, '\\n');\n }\n\n addEventListener(type: string, listener: any, options?: boolean | any): void {\n // Support DOMContentLoaded and readystatechange events\n if (type === 'DOMContentLoaded' || type === 'readystatechange') {\n this._eventListeners.push({\n type,\n listener: typeof listener === 'function' ? listener : listener.handleEvent,\n options\n });\n }\n }\n\n removeEventListener(type: string, listener: any, options?: boolean | any): void {\n if (type === 'DOMContentLoaded' || type === 'readystatechange') {\n const targetListener = typeof listener === 'function' ? listener : listener.handleEvent;\n this._eventListeners = this._eventListeners.filter(\n eventListener => !(eventListener.type === type && eventListener.listener === targetListener)\n );\n }\n }\n\n dispatchEvent(event: any): boolean {\n const eventListeners = this._eventListeners.filter(listener => listener.type === event.type);\n \n for (const eventListener of eventListeners) {\n try {\n eventListener.listener.call(this, event);\n \n // Handle 'once' option\n if (eventListener.options && typeof eventListener.options === 'object' && eventListener.options.once) {\n this.removeEventListener(event.type, eventListener.listener);\n }\n } catch (error) {\n console.error('Error in document event listener:', error);\n }\n }\n \n return true;\n }\n\n /**\n * Set window reference for load event dispatching\n */\n setWindow(window: any): void {\n this._window = window;\n }\n\n /**\n * Change document ready state and dispatch events\n */\n setReadyState(state: DocumentReadyState): void {\n if (this._readyState === state) return;\n \n this._readyState = state;\n \n // Dispatch readystatechange event\n this.dispatchEvent({\n type: 'readystatechange',\n target: this,\n readyState: state\n });\n \n // Dispatch DOMContentLoaded when interactive\n if (state === 'interactive') {\n this.dispatchEvent({\n type: 'DOMContentLoaded',\n target: this\n });\n }\n \n // Dispatch load event on window when complete\n if (state === 'complete' && this._window) {\n // Use setTimeout to ensure it's dispatched after current execution\n setTimeout(() => {\n if (this._window && this._window.dispatchEvent) {\n this._window.dispatchEvent({\n type: 'load',\n target: this._window\n });\n }\n }, 0);\n }\n }\n\n /**\n * Simulate document loading process\n */\n simulateLoading(): void {\n // Start with loading state\n this.setReadyState('loading');\n \n // Simulate DOM parsing completion\n setTimeout(() => {\n this.setReadyState('interactive');\n \n // Simulate resource loading completion\n setTimeout(() => {\n this.setReadyState('complete');\n }, 10);\n }, 5);\n }\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }