@remote-dom/polyfill 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/build/cjs/Attr.cjs +1 -1
  3. package/build/cjs/CustomElementRegistry.cjs +2 -2
  4. package/build/cjs/Document.cjs +4 -2
  5. package/build/cjs/DocumentFragment.cjs +2 -2
  6. package/build/cjs/Element.cjs +5 -2
  7. package/build/cjs/Event.cjs +19 -25
  8. package/build/cjs/EventTarget.cjs +9 -14
  9. package/build/cjs/Node.cjs +1 -1
  10. package/build/cjs/ParentNode.cjs +4 -2
  11. package/build/cjs/SVGElement.cjs +1 -1
  12. package/build/cjs/Text.cjs +1 -1
  13. package/build/cjs/Window.cjs +20 -20
  14. package/build/cjs/constants.cjs +4 -0
  15. package/build/esm/Attr.mjs +1 -1
  16. package/build/esm/CustomElementRegistry.mjs +2 -2
  17. package/build/esm/Document.mjs +5 -3
  18. package/build/esm/DocumentFragment.mjs +2 -2
  19. package/build/esm/Element.mjs +5 -2
  20. package/build/esm/Event.mjs +20 -26
  21. package/build/esm/EventTarget.mjs +10 -15
  22. package/build/esm/Node.mjs +1 -1
  23. package/build/esm/ParentNode.mjs +4 -2
  24. package/build/esm/SVGElement.mjs +1 -1
  25. package/build/esm/Text.mjs +1 -1
  26. package/build/esm/Window.mjs +20 -20
  27. package/build/esm/constants.mjs +3 -1
  28. package/build/esnext/Document.esnext +4 -2
  29. package/build/esnext/Element.esnext +3 -0
  30. package/build/esnext/Event.esnext +15 -21
  31. package/build/esnext/EventTarget.esnext +10 -15
  32. package/build/esnext/ParentNode.esnext +2 -0
  33. package/build/esnext/constants.esnext +3 -1
  34. package/build/tsconfig.tsbuildinfo +1 -1
  35. package/build/typescript/Document.d.ts.map +1 -1
  36. package/build/typescript/Element.d.ts +1 -0
  37. package/build/typescript/Element.d.ts.map +1 -1
  38. package/build/typescript/Event.d.ts +5 -5
  39. package/build/typescript/Event.d.ts.map +1 -1
  40. package/build/typescript/EventTarget.d.ts.map +1 -1
  41. package/build/typescript/ParentNode.d.ts.map +1 -1
  42. package/build/typescript/constants.d.ts +2 -0
  43. package/build/typescript/constants.d.ts.map +1 -1
  44. package/package.json +1 -1
  45. package/source/Document.ts +3 -1
  46. package/source/Element.ts +4 -0
  47. package/source/Event.ts +24 -26
  48. package/source/EventTarget.ts +14 -15
  49. package/source/ParentNode.ts +2 -0
  50. package/source/constants.ts +2 -0
@@ -1,4 +1,4 @@
1
- import { IS_TRUSTED, LISTENERS } from './constants.mjs';
1
+ import { PATH, STOP_IMMEDIATE_PROPAGATION, IS_TRUSTED, LISTENERS } from './constants.mjs';
2
2
 
3
3
  let EventPhase = /*#__PURE__*/function (EventPhase) {
4
4
  EventPhase[EventPhase["NONE"] = 0] = "NONE";
@@ -10,17 +10,17 @@ let EventPhase = /*#__PURE__*/function (EventPhase) {
10
10
  const CAPTURE_MARKER = '@';
11
11
  const now = typeof performance === 'undefined' ? Date.now : performance.now.bind(performance);
12
12
  class Event {
13
- static NONE = EventPhase.NONE;
14
- static CAPTURING_PHASE = EventPhase.CAPTURING_PHASE;
15
- static AT_TARGET = EventPhase.AT_TARGET;
16
- static BUBBLING_PHASE = EventPhase.BUBBLING_PHASE;
13
+ static NONE = (() => EventPhase.NONE)();
14
+ static CAPTURING_PHASE = (() => EventPhase.CAPTURING_PHASE)();
15
+ static AT_TARGET = (() => EventPhase.AT_TARGET)();
16
+ static BUBBLING_PHASE = (() => EventPhase.BUBBLING_PHASE)();
17
17
 
18
18
  // NONE = EventPhase.NONE;
19
19
  // CAPTURING_PHASE = EventPhase.CAPTURING_PHASE;
20
20
  // AT_TARGET = EventPhase.AT_TARGET;
21
21
  // BUBBLING_PHASE = EventPhase.BUBBLING_PHASE;
22
22
 
23
- timeStamp = now();
23
+ timeStamp = (() => now())();
24
24
  target = null;
25
25
  currentTarget = null;
26
26
  srcElement = null;
@@ -29,11 +29,11 @@ class Event {
29
29
  composed = false;
30
30
  defaultPrevented = false;
31
31
  cancelBubble = false;
32
- immediatePropagationStopped = false;
33
32
  eventPhase = 0;
34
- path = [];
35
33
  // private inPassiveListener = false;
36
34
 
35
+ [PATH] = [];
36
+ [STOP_IMMEDIATE_PROPAGATION] = false;
37
37
  constructor(type, options) {
38
38
  this.type = type;
39
39
  Object.defineProperty(this, IS_TRUSTED, {
@@ -46,17 +46,18 @@ class Event {
46
46
  if (options.composed) this.composed = options.composed;
47
47
  }
48
48
  }
49
- get composedPath() {
50
- return this.path;
51
- }
52
49
  get isTrusted() {
53
50
  return this[IS_TRUSTED];
54
51
  }
52
+ composedPath() {
53
+ return this[PATH];
54
+ }
55
55
  stopPropagation() {
56
56
  this.cancelBubble = true;
57
57
  }
58
58
  stopImmediatePropagation() {
59
- this.immediatePropagationStopped = true;
59
+ this[STOP_IMMEDIATE_PROPAGATION] = true;
60
+ this.cancelBubble = true;
60
61
  }
61
62
  preventDefault() {
62
63
  this.defaultPrevented = true;
@@ -75,31 +76,24 @@ class Event {
75
76
  this.cancelable = Boolean(cancelable);
76
77
  }
77
78
  }
78
- function fireEvent(event, target, phase) {
79
- const listeners = target[LISTENERS];
79
+ function fireEvent(event, currentTarget, phase) {
80
+ const listeners = currentTarget[LISTENERS];
80
81
  const list = listeners?.get(`${event.type}${phase === EventPhase.CAPTURING_PHASE ? CAPTURE_MARKER : ''}`);
81
- if (!list) return false;
82
- let defaultPrevented = false;
82
+ if (!list) return;
83
83
  for (const listener of list) {
84
- event.eventPhase = phase;
85
- event.currentTarget = target;
84
+ event.eventPhase = event.target === currentTarget ? EventPhase.AT_TARGET : phase;
85
+ event.currentTarget = currentTarget;
86
86
  try {
87
87
  if (typeof listener === 'object') {
88
88
  listener.handleEvent(event);
89
89
  } else {
90
- listener.call(target, event);
90
+ listener.call(currentTarget, event);
91
91
  }
92
92
  } catch (err) {
93
93
  setTimeout(thrower, 0, err);
94
94
  }
95
- if (event.defaultPrevented === true) {
96
- defaultPrevented = true;
97
- }
98
- if (event.immediatePropagationStopped) {
99
- break;
100
- }
95
+ if (event[STOP_IMMEDIATE_PROPAGATION]) break;
101
96
  }
102
- return defaultPrevented;
103
97
  }
104
98
  function thrower(error) {
105
99
  throw error;
@@ -1,4 +1,4 @@
1
- import { LISTENERS, OWNER_DOCUMENT, HOOKS } from './constants.mjs';
1
+ import { LISTENERS, OWNER_DOCUMENT, HOOKS, PATH } from './constants.mjs';
2
2
  import { fireEvent, CAPTURE_MARKER, EventPhase } from './Event.mjs';
3
3
 
4
4
  const ONCE_LISTENERS = Symbol('onceListeners');
@@ -67,22 +67,17 @@ class EventTarget {
67
67
  // }
68
68
  event.target = this;
69
69
  event.srcElement = this;
70
- event.path = path;
71
- let defaultPrevented = false;
72
- for (let i = path.length; --i;) {
73
- if (fireEvent(event, path[i], EventPhase.CAPTURING_PHASE)) {
74
- defaultPrevented = true;
75
- }
76
- }
77
- if (fireEvent(event, this, EventPhase.AT_TARGET)) {
78
- defaultPrevented = true;
70
+ event[PATH] = path;
71
+ for (let i = path.length; i--;) {
72
+ fireEvent(event, path[i], EventPhase.CAPTURING_PHASE);
73
+ if (event.cancelBubble) return event.defaultPrevented;
79
74
  }
80
- for (let i = 1; i < path.length; i++) {
81
- if (fireEvent(event, path[i], EventPhase.BUBBLING_PHASE)) {
82
- defaultPrevented = true;
83
- }
75
+ const bubblePath = event.bubbles ? path : path.slice(0, 1);
76
+ for (let i = 0; i < bubblePath.length; i++) {
77
+ fireEvent(event, bubblePath[i], EventPhase.BUBBLING_PHASE);
78
+ if (event.cancelBubble) return event.defaultPrevented;
84
79
  }
85
- return !defaultPrevented;
80
+ return event.defaultPrevented;
86
81
  }
87
82
  }
88
83
  function removeEventListener(type, listener, options) {
@@ -3,7 +3,7 @@ import { EventTarget } from './EventTarget.mjs';
3
3
  import { isCharacterData, isParentNode, cloneNode, isTextNode } from './shared.mjs';
4
4
 
5
5
  class Node extends EventTarget {
6
- nodeType = NodeType.NODE;
6
+ nodeType = (() => NodeType.NODE)();
7
7
  [NAME] = '';
8
8
  [PARENT] = null;
9
9
  [CHILD] = null;
@@ -4,8 +4,8 @@ import { NodeList } from './NodeList.mjs';
4
4
  import { querySelectorAll, querySelector } from './selectors.mjs';
5
5
 
6
6
  class ParentNode extends ChildNode {
7
- childNodes = new NodeList();
8
- children = new NodeList();
7
+ childNodes = (() => new NodeList())();
8
+ children = (() => new NodeList())();
9
9
  appendChild(child) {
10
10
  this.insertInto(child, null);
11
11
  }
@@ -45,6 +45,7 @@ class ParentNode extends ChildNode {
45
45
  const children = this.children;
46
46
  children.splice(children.indexOf(child), 1);
47
47
  }
48
+ child.disconnectedCallback?.();
48
49
  this[HOOKS].removeChild?.(this, child, childNodesIndex);
49
50
  }
50
51
  replaceChild(newChild, oldChild) {
@@ -120,6 +121,7 @@ class ParentNode extends ChildNode {
120
121
  childNodes.push(child);
121
122
  if (isElement) this.children.push(child);
122
123
  }
124
+ child.connectedCallback?.();
123
125
  this[HOOKS].insertChild?.(this, child, insertIndex);
124
126
  }
125
127
  }
@@ -2,7 +2,7 @@ import { NS, NamespaceURI } from './constants.mjs';
2
2
  import { Element } from './Element.mjs';
3
3
 
4
4
  class SVGElement extends Element {
5
- [NS] = NamespaceURI.SVG;
5
+ [NS] = (() => NamespaceURI.SVG)();
6
6
  get ownerSVGElement() {
7
7
  let root = null;
8
8
  let parent = this.parentNode;
@@ -2,7 +2,7 @@ import { NodeType, NAME } from './constants.mjs';
2
2
  import { CharacterData } from './CharacterData.mjs';
3
3
 
4
4
  class Text extends CharacterData {
5
- nodeType = NodeType.TEXT_NODE;
5
+ nodeType = (() => NodeType.TEXT_NODE)();
6
6
  [NAME] = '#text';
7
7
  }
8
8
 
@@ -23,26 +23,26 @@ class Window extends EventTarget {
23
23
  parent = this;
24
24
  self = this;
25
25
  top = this;
26
- document = new Document(this);
27
- customElements = new CustomElementRegistryImplementation();
28
- location = globalThis.location;
29
- navigator = globalThis.navigator;
30
- Event = Event;
31
- EventTarget = EventTarget;
32
- CustomEvent = CustomEvent;
33
- Node = Node;
34
- ParentNode = ParentNode;
35
- ChildNode = ChildNode;
36
- DocumentFragment = DocumentFragment;
37
- Document = Document;
38
- CharacterData = CharacterData;
39
- Comment = Comment;
40
- Text = Text;
41
- Element = Element;
42
- HTMLElement = HTMLElement;
43
- SVGElement = SVGElement;
44
- HTMLTemplateElement = HTMLTemplateElement;
45
- MutationObserver = MutationObserver;
26
+ document = (() => new Document(this))();
27
+ customElements = (() => new CustomElementRegistryImplementation())();
28
+ location = (() => globalThis.location)();
29
+ navigator = (() => globalThis.navigator)();
30
+ Event = (() => Event)();
31
+ EventTarget = (() => EventTarget)();
32
+ CustomEvent = (() => CustomEvent)();
33
+ Node = (() => Node)();
34
+ ParentNode = (() => ParentNode)();
35
+ ChildNode = (() => ChildNode)();
36
+ DocumentFragment = (() => DocumentFragment)();
37
+ Document = (() => Document)();
38
+ CharacterData = (() => CharacterData)();
39
+ Comment = (() => Comment)();
40
+ Text = (() => Text)();
41
+ Element = (() => Element)();
42
+ HTMLElement = (() => HTMLElement)();
43
+ SVGElement = (() => SVGElement)();
44
+ HTMLTemplateElement = (() => HTMLTemplateElement)();
45
+ MutationObserver = (() => MutationObserver)();
46
46
  static setGlobal(window) {
47
47
  const properties = Object.getOwnPropertyDescriptors(window);
48
48
  delete properties.self;
@@ -11,6 +11,8 @@ const PARENT = Symbol('parent');
11
11
  const DATA = Symbol('data');
12
12
  const LISTENERS = Symbol('listeners');
13
13
  const IS_TRUSTED = Symbol('isTrusted');
14
+ const PATH = Symbol('path');
15
+ const STOP_IMMEDIATE_PROPAGATION = Symbol('stop_immediate_propagation');
14
16
  const CONTENT = Symbol('content');
15
17
  const HOOKS = Symbol('hooks');
16
18
 
@@ -36,4 +38,4 @@ let NamespaceURI = /*#__PURE__*/function (NamespaceURI) {
36
38
  return NamespaceURI;
37
39
  }({});
38
40
 
39
- export { ATTRIBUTES, CHILD, CONTENT, DATA, HOOKS, IS_TRUSTED, LISTENERS, NAME, NEXT, NS, NamespaceURI, NodeType, OWNER_DOCUMENT, OWNER_ELEMENT, PARENT, PREV, VALUE };
41
+ export { ATTRIBUTES, CHILD, CONTENT, DATA, HOOKS, IS_TRUSTED, LISTENERS, NAME, NEXT, NS, NamespaceURI, NodeType, OWNER_DOCUMENT, OWNER_ELEMENT, PARENT, PATH, PREV, STOP_IMMEDIATE_PROPAGATION, VALUE };
@@ -1,4 +1,4 @@
1
- import { NodeType, NAME, OWNER_DOCUMENT, NamespaceURI, NS, HOOKS } from './constants.esnext';
1
+ import { NodeType, NAME, OWNER_DOCUMENT, HOOKS, NamespaceURI, NS } from './constants.esnext';
2
2
  import { Event } from './Event.esnext';
3
3
  import { ParentNode } from './ParentNode.esnext';
4
4
  import { Element } from './Element.esnext';
@@ -36,7 +36,9 @@ class Document extends ParentNode {
36
36
  return createElement(this, localName, namespaceURI);
37
37
  }
38
38
  createTextNode(data) {
39
- return createNode(new Text(data), this);
39
+ const text = createNode(new Text(data), this);
40
+ this[HOOKS].createText?.(text, String(data));
41
+ return text;
40
42
  }
41
43
  createComment(data) {
42
44
  return createNode(new Comment(data), this);
@@ -32,6 +32,9 @@ class Element extends ParentNode {
32
32
  }
33
33
  return attributes;
34
34
  }
35
+ getAttributeNames() {
36
+ return [...this.attributes].map((attr) => attr.name);
37
+ }
35
38
  get firstElementChild() {
36
39
  return this.children[0] ?? null;
37
40
  }
@@ -1,4 +1,4 @@
1
- import { IS_TRUSTED, LISTENERS } from './constants.esnext';
1
+ import { IS_TRUSTED, PATH, STOP_IMMEDIATE_PROPAGATION, LISTENERS } from './constants.esnext';
2
2
 
3
3
  var EventPhase = /* @__PURE__ */ ((EventPhase2) => {
4
4
  EventPhase2[EventPhase2["NONE"] = 0] = "NONE";
@@ -36,23 +36,24 @@ class Event {
36
36
  composed = false;
37
37
  defaultPrevented = false;
38
38
  cancelBubble = false;
39
- immediatePropagationStopped = false;
40
39
  eventPhase = 0;
41
- path = [];
42
40
  // private inPassiveListener = false;
43
41
  data;
42
+ [PATH] = [];
44
43
  [IS_TRUSTED];
45
- get composedPath() {
46
- return this.path;
47
- }
44
+ [STOP_IMMEDIATE_PROPAGATION] = false;
48
45
  get isTrusted() {
49
46
  return this[IS_TRUSTED];
50
47
  }
48
+ composedPath() {
49
+ return this[PATH];
50
+ }
51
51
  stopPropagation() {
52
52
  this.cancelBubble = true;
53
53
  }
54
54
  stopImmediatePropagation() {
55
- this.immediatePropagationStopped = true;
55
+ this[STOP_IMMEDIATE_PROPAGATION] = true;
56
+ this.cancelBubble = true;
56
57
  }
57
58
  preventDefault() {
58
59
  this.defaultPrevented = true;
@@ -70,33 +71,26 @@ class Event {
70
71
  this.cancelable = Boolean(cancelable);
71
72
  }
72
73
  }
73
- function fireEvent(event, target, phase) {
74
- const listeners = target[LISTENERS];
74
+ function fireEvent(event, currentTarget, phase) {
75
+ const listeners = currentTarget[LISTENERS];
75
76
  const list = listeners?.get(
76
77
  `${event.type}${phase === 1 /* CAPTURING_PHASE */ ? CAPTURE_MARKER : ""}`
77
78
  );
78
- if (!list) return false;
79
- let defaultPrevented = false;
79
+ if (!list) return;
80
80
  for (const listener of list) {
81
- event.eventPhase = phase;
82
- event.currentTarget = target;
81
+ event.eventPhase = event.target === currentTarget ? 2 /* AT_TARGET */ : phase;
82
+ event.currentTarget = currentTarget;
83
83
  try {
84
84
  if (typeof listener === "object") {
85
85
  listener.handleEvent(event);
86
86
  } else {
87
- listener.call(target, event);
87
+ listener.call(currentTarget, event);
88
88
  }
89
89
  } catch (err) {
90
90
  setTimeout(thrower, 0, err);
91
91
  }
92
- if (event.defaultPrevented === true) {
93
- defaultPrevented = true;
94
- }
95
- if (event.immediatePropagationStopped) {
96
- break;
97
- }
92
+ if (event[STOP_IMMEDIATE_PROPAGATION]) break;
98
93
  }
99
- return defaultPrevented;
100
94
  }
101
95
  function thrower(error) {
102
96
  throw error;
@@ -1,4 +1,4 @@
1
- import { LISTENERS, OWNER_DOCUMENT, HOOKS } from './constants.esnext';
1
+ import { LISTENERS, OWNER_DOCUMENT, HOOKS, PATH } from './constants.esnext';
2
2
  import { fireEvent, EventPhase, CAPTURE_MARKER } from './Event.esnext';
3
3
 
4
4
  const ONCE_LISTENERS = Symbol("onceListeners");
@@ -70,22 +70,17 @@ class EventTarget {
70
70
  }
71
71
  event.target = this;
72
72
  event.srcElement = this;
73
- event.path = path;
74
- let defaultPrevented = false;
75
- for (let i = path.length; --i; ) {
76
- if (fireEvent(event, path[i], EventPhase.CAPTURING_PHASE)) {
77
- defaultPrevented = true;
78
- }
79
- }
80
- if (fireEvent(event, this, EventPhase.AT_TARGET)) {
81
- defaultPrevented = true;
73
+ event[PATH] = path;
74
+ for (let i = path.length; i--; ) {
75
+ fireEvent(event, path[i], EventPhase.CAPTURING_PHASE);
76
+ if (event.cancelBubble) return event.defaultPrevented;
82
77
  }
83
- for (let i = 1; i < path.length; i++) {
84
- if (fireEvent(event, path[i], EventPhase.BUBBLING_PHASE)) {
85
- defaultPrevented = true;
86
- }
78
+ const bubblePath = event.bubbles ? path : path.slice(0, 1);
79
+ for (let i = 0; i < bubblePath.length; i++) {
80
+ fireEvent(event, bubblePath[i], EventPhase.BUBBLING_PHASE);
81
+ if (event.cancelBubble) return event.defaultPrevented;
87
82
  }
88
- return !defaultPrevented;
83
+ return event.defaultPrevented;
89
84
  }
90
85
  }
91
86
  function removeEventListener(type, listener, options) {
@@ -46,6 +46,7 @@ class ParentNode extends ChildNode {
46
46
  const children = this.children;
47
47
  children.splice(children.indexOf(child), 1);
48
48
  }
49
+ child.disconnectedCallback?.();
49
50
  this[HOOKS].removeChild?.(this, child, childNodesIndex);
50
51
  }
51
52
  replaceChild(newChild, oldChild) {
@@ -120,6 +121,7 @@ class ParentNode extends ChildNode {
120
121
  childNodes.push(child);
121
122
  if (isElement) this.children.push(child);
122
123
  }
124
+ child.connectedCallback?.();
123
125
  this[HOOKS].insertChild?.(this, child, insertIndex);
124
126
  }
125
127
  }
@@ -11,6 +11,8 @@ const PARENT = Symbol("parent");
11
11
  const DATA = Symbol("data");
12
12
  const LISTENERS = Symbol("listeners");
13
13
  const IS_TRUSTED = Symbol("isTrusted");
14
+ const PATH = Symbol("path");
15
+ const STOP_IMMEDIATE_PROPAGATION = Symbol("stop_immediate_propagation");
14
16
  const CONTENT = Symbol("content");
15
17
  const HOOKS = Symbol("hooks");
16
18
  var NodeType = /* @__PURE__ */ ((NodeType2) => {
@@ -34,4 +36,4 @@ var NamespaceURI = /* @__PURE__ */ ((NamespaceURI2) => {
34
36
  return NamespaceURI2;
35
37
  })(NamespaceURI || {});
36
38
 
37
- export { ATTRIBUTES, CHILD, CONTENT, DATA, HOOKS, IS_TRUSTED, LISTENERS, NAME, NEXT, NS, NamespaceURI, NodeType, OWNER_DOCUMENT, OWNER_ELEMENT, PARENT, PREV, VALUE };
39
+ export { ATTRIBUTES, CHILD, CONTENT, DATA, HOOKS, IS_TRUSTED, LISTENERS, NAME, NEXT, NS, NamespaceURI, NodeType, OWNER_DOCUMENT, OWNER_ELEMENT, PARENT, PATH, PREV, STOP_IMMEDIATE_PROPAGATION, VALUE };