vaderjs 1.4.1-ui7iuy47 → 1.4.2-jpbvml56

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 (39) hide show
  1. package/.editorconfig +11 -0
  2. package/.vscode/c_cpp_properties.json +21 -0
  3. package/.vscode/settings.json +12 -0
  4. package/README.md +44 -197
  5. package/binaries/Kalix/index.js +677 -0
  6. package/binaries/compiler/main.js +502 -0
  7. package/binaries/vader.js +74 -0
  8. package/binaries/watcher/hmr.js +41 -0
  9. package/client/index.d.ts +226 -0
  10. package/client/runtime/index.js +1 -0
  11. package/client/runtime/router.js +1 -0
  12. package/config/index.ts +87 -0
  13. package/index.ts +344 -0
  14. package/package.json +13 -25
  15. package/plugins/cloudflare/functions/index.js +102 -0
  16. package/plugins/cloudflare/toCopy/@server/Kalix/index.js +673 -0
  17. package/plugins/cloudflare/toCopy/@server/cloudflare_ssr/index.js +85 -0
  18. package/plugins/cloudflare/toCopy/node_modules/vaderjs/server/index.js +99 -0
  19. package/plugins/cloudflare/toCopy/src/client.js +1 -0
  20. package/plugins/cloudflare/toCopy/src/router.js +1 -0
  21. package/plugins/ssg/index.js +197 -0
  22. package/plugins/tailwind/index.ts +102 -0
  23. package/plugins/vercel/functions/index.ts +8 -0
  24. package/router/index.ts +208 -0
  25. package/server/index.js +143 -0
  26. package/vader_dev.js +177 -0
  27. package/@integrations/ssg.js +0 -189
  28. package/LICENSE +0 -21
  29. package/binaries/IPC/index.js +0 -277
  30. package/binaries/main.js +0 -1464
  31. package/binaries/readme.md +0 -4
  32. package/binaries/watcher.js +0 -74
  33. package/binaries/win32/check.ps1 +0 -7
  34. package/client/index.js +0 -426
  35. package/config/index.js +0 -36
  36. package/logo.png +0 -0
  37. package/runtime/router.js +0 -1
  38. package/runtime/vader.js +0 -1
  39. package/vader.js +0 -230
@@ -0,0 +1,677 @@
1
+ /**
2
+ * @module DOMParser
3
+ * @description The DOMParser interface provides the ability to parse HTML source code from a string into a DOM Document.
4
+ */
5
+ export class DOMParser {
6
+ /**
7
+ * @decription - parse html to a document
8
+ * @param {string} html
9
+ * @returns {Document}
10
+ */
11
+ parseFromString(html) {
12
+ let doc = new Document();
13
+ let t = new Bun.Transpiler({
14
+ loader: "tsx", // "js | "jsx" | "ts" | "tsx",
15
+ target: "browser",
16
+ define: {
17
+ "jsxDEV": "Element",
18
+ "jsx": "Element"
19
+ }
20
+ });
21
+
22
+ let el = t.transformSync(`
23
+
24
+ const html = ${html}
25
+ function Doc() {
26
+ return (
27
+ <html>
28
+ <body>${html}</body>
29
+ </html>
30
+ )
31
+ }
32
+ return Doc()
33
+ ` )
34
+ el = el.replaceAll(`jsxDEV`, `Element`)
35
+ let evaluated = eval(`(function(){${el}})()`)
36
+ evaluated.children.forEach((child) => {
37
+ child.outerHTML = child.toString()
38
+ })
39
+ doc.tree = evaluated.children
40
+ doc.body = evaluated.children[0]
41
+ doc.body.outerHTML = evaluated.children[0].toString()
42
+ doc.body.firstChild = evaluated.children[0].children[0]
43
+ doc.documentElement = evaluated
44
+ doc.documentElement.outerHTML = evaluated.children[0].toString()
45
+ this.tree = evaluated.children
46
+ return doc
47
+ }
48
+ /**
49
+ * @description - Returns a string containing the HTML serialization of the element's descendants.
50
+ * @returns {string}
51
+ */
52
+ toString() {
53
+ return this.tree.toString();
54
+ }
55
+
56
+ }
57
+ export class HTMLTextNode {
58
+ constructor(text) {
59
+ this.nodeValue = text;
60
+ this.nodeType = 3;
61
+ this.tagName = "TEXT_ELEMENT";
62
+ this.props = { nodeValue: text };
63
+ }
64
+
65
+ toString() {
66
+ return this.nodeValue;
67
+ }
68
+
69
+ insertBefore(node) {
70
+ this.nodeValue = `${node.nodeValue}${this.nodeValue}`;
71
+ return this;
72
+ }
73
+ }
74
+ export class HTMLElement {
75
+ constructor(tagName, props, children) {
76
+ this.tagName = tagName;
77
+ this.props = props;
78
+ this.children = children;
79
+ this.outerHTML = this.toString("outerHTML");
80
+ this.innerHTML = this.toString("innerHTML");
81
+ this.textContent = this.toString("innerText");
82
+ /**
83
+ * @type {HTMLElement | HTMLTextNode}
84
+ */
85
+ this.firstChild = this.children[0];
86
+ this.style = props?.style || {};
87
+
88
+ this.attributes = props;
89
+ this.events = [];
90
+ /**
91
+ * @type {string | null}
92
+ */
93
+ this.id = props?.id || null;
94
+ this.nodeType = 1;
95
+ this.accessKey = null;
96
+ }
97
+
98
+ /**
99
+ * @description - Returns a string containing the HTML serialization of the element's descendants.
100
+ * @param {string} type - outerHTML, innerHTML, innerText
101
+ * @returns {string}
102
+ */
103
+ toString(type = "outerHTML") {
104
+ switch (type) {
105
+ case "outerHTML":
106
+ if (this.tagName === "TEXT_ELEMENT") {
107
+ return this.props.nodeValue;
108
+ }
109
+ let props = "";
110
+ for (let key in this.props) {
111
+ if (key !== 'style' && key !== 'ref' && !key.startsWith('on')) {
112
+ props += `${key}="${this.props[key]}" `
113
+ }
114
+ }
115
+ let children = this.children
116
+ .map((child) => {
117
+ return child.toString();
118
+ }).join("");
119
+ if (this.attributes?.style) {
120
+ for (let key in this.attributes.style) {
121
+ this.style[key] = this.attributes.style[key]
122
+ }
123
+ }
124
+
125
+
126
+ if (this.attributes && Object.keys(this.attributes).length > 0) {
127
+ props += ` ${Object.keys(this.attributes).map((key) =>{
128
+ if(key !== 'style' && !props.includes(key) && key !== 'ref' && !key.startsWith('on')){
129
+ return `${key}="${this.attributes[key]}"`
130
+ }
131
+ }).join(' ')}`
132
+ }
133
+ if (this.style && Object.keys(this.style).length > 0) {
134
+ props += ` style="${handleStyles(this.style, this)}"`
135
+ }
136
+ if (this.props?.id) {
137
+ this.id = this.props.id
138
+ }
139
+ return `<${this.tagName} ${props}>${children}</${this.tagName}>`;
140
+ case "innerHTML":
141
+ return this.children.map((child) => {
142
+ child.toString("outerHTML");
143
+ child.toString("innerHTML");
144
+ child.toString("innerText");
145
+ return child.toString("outerHTML");
146
+ }).join("");
147
+ case "innerText":
148
+ let string = ''
149
+ this.children
150
+ .map((child) => {
151
+ if(child instanceof HTMLTextNode){
152
+ string += child.nodeValue
153
+ }
154
+ })
155
+ .join("");
156
+ return string;
157
+
158
+
159
+ default:
160
+ break;
161
+ }
162
+ }
163
+ /**
164
+ * @description - Appends a node as the last child of a node.
165
+ * @param {HTMLElement|HTMLTextNode} child
166
+ * @returns
167
+ */
168
+ appendChild(child) {
169
+ this.outerHTML = this.toString("outerHTML");
170
+ this.innerHTML = this.toString("innerHTML");
171
+ this.textContent = this.toString("innerText");
172
+ if (!this.children.includes(child)) {
173
+ this.children.push(child);
174
+ this.outerHTML = this.toString("outerHTML");
175
+ this.innerHTML = this.toString("innerHTML");
176
+ }
177
+ return this;
178
+ }
179
+ /**
180
+ * @description - set the content of the element
181
+ * @param {string} content
182
+ * @returns {HTMLElement}
183
+ */
184
+ setContent(content) {
185
+ let textNode = new HTMLTextNode(content)
186
+ this.children = [textNode];
187
+ this.outerHTML = this.toString("outerHTML");
188
+ this.innerHTML = this.toString("innerHTML");
189
+ return this;
190
+ }
191
+
192
+ /**
193
+ * @description - Appends a set of Node objects or DOMString objects after the last child of the ParentNode.
194
+ * @param {...any} children
195
+ * @returns {HTMLElement}
196
+ */
197
+ append(...children) {
198
+ this.outerHTML = this.toString("outerHTML");
199
+ this.innerHTML = this.toString("innerHTML");
200
+ this.textContent = this.toString("innerText");
201
+ this.children = [...this.children, ...children];
202
+ return this;
203
+ }
204
+ /**
205
+ * @description - Inserts a set of Node objects or DOMString objects after the last child of the ParentNode.
206
+ * @param {HTMLElement | HTMLTextNode} node1
207
+ * @param {HTMLElement | HTMLTextNode} node2
208
+ * @returns {HTMLElement}
209
+ */
210
+ insertBefore(node1, node2) {
211
+ this.outerHTML = this.toString("outerHTML");
212
+ this.innerHTML = this.toString("innerHTML");
213
+ this.textContent = this.toString("innerText");
214
+ this.children = this.children.map((child) => {
215
+ if (child === node2) {
216
+ return node1;
217
+ }
218
+ return child;
219
+ });
220
+ return this;
221
+ }
222
+ /**
223
+ * @description - Inserts a set of Node objects or DOMString objects after the last child of the ParentNode.
224
+ * @param {HTMLElement|HTMLTextNode} child
225
+ * @returns {HTMLElement}
226
+ */
227
+ prepend(child) {
228
+ this.outerHTML = this.toString("outerHTML");
229
+ this.innerHTML = this.toString("innerHTML");
230
+ this.textContent = this.toString("innerText");
231
+ this.children = [child, ...this.children];
232
+ return this;
233
+ }
234
+
235
+ /**
236
+ *
237
+ */
238
+ remove() {
239
+ this.outerHTML = "";
240
+ this.innerHTML = "";
241
+ this.textContent = "";
242
+ this.children = [];
243
+ return this;
244
+ }
245
+ /**
246
+ * @description - Removes a child node from the DOM
247
+ * @param {Object} child
248
+ * @returns {HTMLElement}
249
+ */
250
+ removeChild(child) {
251
+ this.children = this.children.filter((c) => c !== child);
252
+ this.innerHTML = this.toString("innerHTML");
253
+ this.outerHTML = this.toString("outerHTML");
254
+ this.textContent = this.toString("innerText");
255
+ return this;
256
+ }
257
+
258
+ /**
259
+ * @description - Search for a specific attribute and returns the value of the attribute.
260
+ * @param {string} name
261
+ * @returns {string | null}
262
+ */
263
+ getAttribute(name) {
264
+ switch (true){
265
+ case Object.keys(this.props).includes(name):
266
+ return this.props[name]
267
+ case Object.keys(this.attributes).includes(name):
268
+ return this.attributes[name]
269
+ }
270
+ return null;
271
+ }
272
+ /**
273
+ * @description - Sets the value of an attribute on the specified element. If the attribute already exists, the value is updated; otherwise a new attribute is added with the specified name and value.
274
+ * @param {string} name
275
+ * @param {string} value
276
+ * @returns {HTMLElement}
277
+ */
278
+
279
+ setAttribute(name, value) {
280
+ this.props[name] = value;
281
+ this.attributes[name] = value;
282
+ this.outerHTML = this.toString("outerHTML");
283
+ this.innerHTML = this.toString("innerHTML");
284
+ this.textContent = this.toString("innerText");
285
+ return this;
286
+ }
287
+
288
+ /**
289
+ * @method classList
290
+ * @description - add, remove, toggle, or check the presence of a class in the class attribute of an element
291
+ * @returns {(add: (className: string) => HTMLElement | HTMLTextNode | null, remove: (className: string) => HTMLElement | HTMLTextNode | null, toggle: (className: string) => HTMLElement | HTMLTextNode | null, contains: (className: string) => boolean) => HTMLElement | HTMLTextNode | null}
292
+ */
293
+ classList = {
294
+ add: (className) => {
295
+ this.props.className = `${this.props.className} ${className}`;
296
+ return this;
297
+ },
298
+ remove: (className) => {
299
+ this.props.className = this.props.className.replace(className, "");
300
+ return this;
301
+ },
302
+ toggle: (className) => {
303
+ if (this.props.className.includes(className)) {
304
+ this.props.className = this.props.className.replace(className, "");
305
+ } else {
306
+ this.props.className = `${this.props.className} ${className}`;
307
+ }
308
+ return this;
309
+ },
310
+ contains: (className) => {
311
+ return this.attributes["class" || "className"].includes(className);
312
+ },
313
+ };
314
+
315
+ /**
316
+ *
317
+ * @param {string} selector
318
+ * @returns {HTMLElement}
319
+ */
320
+ querySelector(selector) {
321
+ switch (true) {
322
+ case selector.startsWith("."):
323
+ this.innerHTML = this.toString("innerHTML");
324
+ this.outerHTML = this.toString("outerHTML");
325
+ this.textContent = this.toString("innerText");
326
+ return this.children.find((child) => {
327
+ child.outerHTML = child.toString();
328
+ return child.props.className.includes(selector.substring(1));
329
+ });
330
+ case selector.startsWith("#"):
331
+ this.innerHTML = this.toString("innerHTML");
332
+ this.outerHTML = this.toString("outerHTML");
333
+ this.textContent = this.toString("innerText");
334
+ return this.children.find((child) => {
335
+ child.outerHTML = child.toString();
336
+ return child.props.id === selector.substring(1);
337
+ });
338
+ default:
339
+ this.innerHTML = this.toString("innerHTML");
340
+ this.outerHTML = this.toString("outerHTML");
341
+ this.textContent = this.toString("innerText");
342
+ let child = this.children.find((child) => {
343
+ child.outerHTML = child.toString();
344
+ return child.tagName === selector;
345
+ }
346
+ );
347
+ if (!child) {
348
+ // check if children of children have the selector
349
+ this.innerHTML = this.toString("innerHTML");
350
+ this.outerHTML = this.toString("outerHTML");
351
+ this.textContent = this.toString("innerText");
352
+ this.children.forEach((c) => {
353
+ if (c.children) {
354
+ child = c.children.find((child) => {
355
+ child.outerHTML = child.toString("outerHTML");
356
+ child.innerHTML = child.toString("innerHTML");
357
+ return child.tagName === selector;
358
+ }
359
+ );
360
+ }
361
+ })
362
+ }
363
+
364
+ return child;
365
+ }
366
+ }
367
+ /**
368
+ * @description - Returns a list of elements with the given tag name. The subtree underneath the specified element is searched, excluding the element itself.
369
+ * @param {string} selector
370
+ * @returns {Array<HTMLElement | HTMLTextNode>}
371
+ */
372
+ querySelectorAll(selector) {
373
+ switch (true) {
374
+ case selector.startsWith("."):
375
+ return this.children.filter((child) => {
376
+ return child.props.className.includes(selector.substring(1));
377
+ });
378
+ case selector === '*':
379
+ return this.children;
380
+ case selector.startsWith("#"):
381
+ return this.children.filter((child) => {
382
+ return child.props.id === selector.substring(1);
383
+ });
384
+ default:
385
+ return this.children.filter((child) => {
386
+ return child.tagName === selector;
387
+ });
388
+ }
389
+ }
390
+ parseHTML(html) {
391
+ const parser = new DOMParser();
392
+ const parsed = parser.parseFromString(html);
393
+ return parsed;
394
+ }
395
+ }
396
+ /**
397
+ * @module Document
398
+ * @description - The Document interface represents any web page loaded in the browser and serves as an entry point into the web page's content, which is the DOM tree.
399
+ */
400
+ export class Document {
401
+ constructor() {
402
+ this.tree = [];
403
+ /**
404
+ * @description - Returns the <body> or <frameset> node of the current document.
405
+ * @type {HTMLElement}
406
+ */
407
+ this.body = new HTMLElement("body", {}, []);
408
+ /**
409
+ * @description - Document.documentElement returns the Element that is the root element of the document
410
+ * @type {HTMLElement}
411
+ * @returns {{outerHTML: string, innerHTML: string}}
412
+ */
413
+ this.documentElement = new HTMLElement("html", {}, [this.body]);
414
+
415
+
416
+ /**
417
+ * @description - Document.head returns the <head> element of the current document.
418
+ * @type {HTMLElement}
419
+ */
420
+ this.head = new HTMLElement("head", {}, []);
421
+
422
+ /**
423
+ * @description - Returns the first child of a node, or the first child that is an element, and null if there are no child elements.
424
+ * **/
425
+ this.firstElementChild = null;
426
+ }
427
+
428
+ /**
429
+ * @description - Creates a new Text node. This method can be used to escape HTML characters.
430
+ * @param {sring} text
431
+ * @returns {HTMLTextNode}
432
+ */
433
+ createTextNode(text) {
434
+ return new HTMLTextNode(text);
435
+ }
436
+ /**
437
+ * @description - Creates a new element with the provided tag name or node object.
438
+ * @param {Object | string} nodeData
439
+ * @returns {HTMLElement}
440
+ */
441
+ createElement(nodeData) {
442
+ if(!nodeData){
443
+ return new HTMLElement("div", {}, [])
444
+ }
445
+ if (typeof nodeData === 'string') {
446
+ return new HTMLElement(nodeData, {}, [])
447
+ }
448
+ let { tagName, props, children } = nodeData;
449
+ let node = new HTMLElement(tagName, props, children);
450
+ children = children.filter((child) => child !== null || child !== undefined)
451
+ node.children = children.map((child) => {
452
+ if (child.tagName === "TEXT_ELEMENT") {
453
+ return new HTMLTextNode(child);
454
+ }
455
+ if (child instanceof HTMLElement) {
456
+ return child;
457
+ }
458
+ return this.createElement(child);
459
+ });
460
+ return node;
461
+ }
462
+
463
+
464
+
465
+ /**
466
+ * @description - Returns the first element that is a descendant of the element on which it is invoked that matches the specified group of selectors.
467
+ * @param {string} selector
468
+ * @returns {HTMLElement | HTMLTextNode | null}
469
+ */
470
+ querySelector(selector) {
471
+ switch (true) {
472
+ case selector.startsWith("."):
473
+ return this.tree.find((child) => {
474
+ child.outerHTML = child.toString();
475
+ return child.props.className.includes(selector.substring(1));
476
+ });
477
+ case selector.startsWith("#"):
478
+ return this.tree.find((child) => {
479
+ return child.props.id === selector.substring(1);
480
+ });
481
+ default:
482
+ let child = this.tree.find((child) => {
483
+ child.outerHTML = child.toString();
484
+ return child.tagName === selector;
485
+ })
486
+ if (!child) {
487
+ // check if children of children have the selector
488
+ this.tree.forEach((c) => {
489
+ if (c.children) {
490
+ child = c.children.find((child) => {
491
+ child.outerHTML = child.toString();
492
+ return child.tagName === selector;
493
+ }
494
+ );
495
+ }
496
+ })
497
+ }
498
+ return child;
499
+ }
500
+ }
501
+
502
+ /**
503
+ * @description - Returns a list of elements with the given tag name. The subtree underneath the specified element is searched, excluding the element itself.
504
+ * @param {string} selector
505
+ * @returns {Array<HTMLElement | HTMLTextNode>}
506
+ */
507
+ querySelectorAll(selector) {
508
+ switch (true) {
509
+ case selector.startsWith("."):
510
+ return this.tree.filter((child) => {
511
+ return child.props.className.includes(selector.substring(1));
512
+ });
513
+ case selector.startsWith("#"):
514
+ return this.tree.filter((child) => {
515
+ return child.props.id === selector.substring(1);
516
+ });
517
+ default:
518
+ return this.tree.filter((child) => {
519
+ return child.tagName === selector;
520
+ });
521
+ }
522
+ }
523
+
524
+
525
+ /**
526
+ * @description - Returns a string containing the HTML serialization of the element's descendants.
527
+ * @returns {string}
528
+ */
529
+
530
+ toString() {
531
+ this.tree.push(this.documentElement)
532
+ this.tree.push(this.head)
533
+ this.tree.push(this.body)
534
+ return this.tree.map((child) => {
535
+ return child.toString();
536
+ }).join("");
537
+
538
+ }
539
+
540
+ }
541
+
542
+ function handleStyles(styles, nodeEl) {
543
+ let style = "";
544
+ for (let key in styles) {
545
+ let lower = key.replace(/([A-Z])/g, (g) => `-${g[0].toLowerCase()}`);
546
+ if (typeof styles[key] === "object") {
547
+ style += handleStyles(styles[key], nodeEl);
548
+ }
549
+ style += `${lower}:${styles[key]};`;
550
+ }
551
+ return style;
552
+ }
553
+
554
+ /**
555
+ * @method Element
556
+ * @description - Create a virtual jsx DOM element
557
+ * @param {string} tag
558
+ * @param {Object} props
559
+ * @param {...any} children
560
+ * @returns
561
+ */
562
+ export function Element(tag, props = {}, ...children) {
563
+ if(typeof tag === 'function'){
564
+ let childObj = children.map((child) => {
565
+ if (child.tagName === "TEXT_ELEMENT") {
566
+ return new HTMLTextNode(child);
567
+ }
568
+ if (child instanceof HTMLElement) {
569
+ return child;
570
+ }
571
+ return new HTMLElement(child.tagName, child.props, child.children);
572
+ })
573
+ childObj = childObj[0]
574
+ let el = tag({...props, children: childObj})
575
+ return el
576
+ }
577
+ if(props === null){
578
+ props = {}
579
+ }
580
+ let node = {
581
+ tagName: tag,
582
+ props: props || {},
583
+ children: children,
584
+ _key: null,
585
+ innerHTML: "",
586
+ outerHTML: "",
587
+ textContent: "",
588
+ events: [],
589
+ parentNode: null,
590
+ appendChild: (child) => {
591
+ children.push(child);
592
+ return node;
593
+ },
594
+ querySelector: (selector) => {
595
+ switch (true) {
596
+ case selector.startsWith("."):
597
+ return children.find((child) => {
598
+ child.outerHTML = child.toString();
599
+ return child.props.className.includes(selector.substring(1));
600
+ });
601
+ case selector.startsWith("#"):
602
+ return children.find((child) => {
603
+ return child.props.id === selector.substring(1);
604
+ });
605
+ default:
606
+ let child = children.find((child) => {
607
+ return child.tagName === selector;
608
+ })
609
+ if (!child) {
610
+ // check if children of children have the selector
611
+ children.forEach((c) => {
612
+ if (c.children) {
613
+ child = c.children.find((child) => {
614
+ child.outerHTML = child.toString();
615
+ return child.tagName === selector;
616
+ }
617
+ );
618
+ }
619
+ })
620
+ }
621
+ return child;
622
+ }
623
+ },
624
+ };
625
+
626
+ if (props?.children) {
627
+ switch (true) {
628
+ case typeof props.children === 'string':
629
+ children = [props.children]
630
+ break;
631
+ case Array.isArray(props.children):
632
+ children = props.children
633
+ break;
634
+ default:
635
+ children = [props.children]
636
+ }
637
+
638
+ node.children = children
639
+ delete props.children
640
+ }
641
+ if(props?.className){
642
+ props['class'] = props.className
643
+ delete props.className
644
+ }
645
+ for (var i = 0; i < children.length; i++) {
646
+ if(typeof children[i] === 'undefined'){
647
+ delete children[i]
648
+ continue;
649
+ }
650
+ if (typeof children[i] === "string" || typeof children[i] === "number") {
651
+ children[i] = {
652
+ tagName: "TEXT_ELEMENT",
653
+ props: { nodeValue: children[i] },
654
+ _key: null,
655
+ parentNode: { tagName: tag, props: props, children: children, _key: null},
656
+ children: [],
657
+ };
658
+ children[i] = new HTMLTextNode(children[i].props.nodeValue);
659
+ } else {
660
+ if (children[i]) {
661
+ children[i].parentNode = { tagName: tag, props: props, children: children };
662
+ }
663
+
664
+ children[i] = new HTMLElement(children[i].tagName, children[i].props, children[i].children)
665
+ }
666
+ }
667
+
668
+ return new HTMLElement(tag, props, children);
669
+ }
670
+
671
+ export default {
672
+ Document,
673
+ Element,
674
+ DOMParser,
675
+ HTMLTextNode,
676
+ HTMLElement
677
+ };