pseudo-dom 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +626 -116
  2. package/browser/pseudo-dom.js +849 -407
  3. package/browser/pseudo-dom.min.js +1 -1
  4. package/dist/classes/PseudoEventListener.d.ts +25 -25
  5. package/dist/classes/PseudoEventListener.js +37 -34
  6. package/dist/classes/PseudoEventListener.min.js +1 -1
  7. package/dist/classes/PseudoHTMLDocument.d.ts +2 -2
  8. package/dist/classes/PseudoHTMLDocument.js +10 -21
  9. package/dist/classes/PseudoHTMLDocument.min.js +1 -1
  10. package/dist/classes/PseudoNodeList.js +14 -8
  11. package/dist/classes/PseudoNodeList.min.js +1 -1
  12. package/dist/factories/generateNode.d.ts +2 -10
  13. package/dist/factories/generateNode.js +9 -42
  14. package/dist/factories/generateNode.min.js +1 -1
  15. package/dist/functions/getParentNodes.d.ts +8 -6
  16. package/dist/functions/getParentNodes.js +16 -9
  17. package/dist/functions/getParentNodes.min.js +1 -1
  18. package/dist/functions/getParentNodesFromAttribute.d.ts +7 -7
  19. package/dist/functions/getParentNodesFromAttribute.js +21 -1
  20. package/dist/functions/getParentNodesFromAttribute.min.js +1 -1
  21. package/dist/functions.d.ts +1 -1
  22. package/dist/interfaces/PseudoEventTarget.d.ts +2 -2
  23. package/dist/services/DocumentFragmentService.d.ts +9 -0
  24. package/dist/services/DocumentFragmentService.js +16 -1
  25. package/dist/services/DocumentFragmentService.min.js +1 -1
  26. package/dist/services/DocumentService.d.ts +8 -0
  27. package/dist/services/DocumentService.js +15 -1
  28. package/dist/services/DocumentService.min.js +1 -1
  29. package/dist/services/ElementService.d.ts +6 -6
  30. package/dist/services/ElementService.js +28 -17
  31. package/dist/services/ElementService.min.js +1 -1
  32. package/dist/services/EventService.d.ts +16 -4
  33. package/dist/services/EventService.js +59 -31
  34. package/dist/services/EventService.min.js +1 -1
  35. package/dist/services/EventTargetService.d.ts +41 -9
  36. package/dist/services/EventTargetService.js +121 -52
  37. package/dist/services/EventTargetService.min.js +1 -1
  38. package/dist/services/NodeService.d.ts +31 -16
  39. package/dist/services/NodeService.js +90 -33
  40. package/dist/services/NodeService.min.js +1 -1
  41. package/package.json +2 -2
@@ -18,6 +18,13 @@ const EventService_1 = require('../services/EventService')
18
18
  * @property {boolean} isDefault
19
19
  */
20
20
  class PseudoEventListener {
21
+ /**
22
+ * @param {string} eventType The type of event this listens for
23
+ * @param {Object} [options] The capture, once and passive options
24
+ * @param {Function} handleEvent The function which is called with the event, already bound to what it should run as
25
+ * @param {Function} [originalCallback=handleEvent] The function (or object) which was given when registering, used to find this listener again
26
+ * @constructor
27
+ */
21
28
  constructor (eventType, {
22
29
  capture = false,
23
30
  once = false,
@@ -30,6 +37,7 @@ class PseudoEventListener {
30
37
  }
31
38
  this.eventType = ''
32
39
  this.defaultListener = false
40
+ this.isRemoved = false
33
41
  this.eventOptions = {
34
42
  capture,
35
43
  once,
@@ -47,6 +55,11 @@ class PseudoEventListener {
47
55
  return this.originalCallback
48
56
  }
49
57
 
58
+ /** Whether this listener listens in the capture phase (and at the target) rather than in the bubble phase. */
59
+ get capture () {
60
+ return this.eventOptions.capture
61
+ }
62
+
50
63
  get isDefault () {
51
64
  return this.defaultListener
52
65
  }
@@ -55,6 +68,20 @@ class PseudoEventListener {
55
68
  return this.eventOptions.once
56
69
  }
57
70
 
71
+ /** Whether the listener promises not to prevent the default (preventDefault does nothing while it runs). */
72
+ get passive () {
73
+ return this.eventOptions.passive
74
+ }
75
+
76
+ /** Whether this listener has been removed, a removed listener does not run even if the event already started. */
77
+ get removed () {
78
+ return this.isRemoved
79
+ }
80
+
81
+ set removed (removed) {
82
+ this.isRemoved = removed
83
+ }
84
+
58
85
  /**
59
86
  * @method
60
87
  * @name PseudoEventListener#handleEvent
@@ -66,6 +93,7 @@ class PseudoEventListener {
66
93
  }
67
94
 
68
95
  /**
96
+ * A capture listener runs while the event travels down to the target.
69
97
  * @method
70
98
  * @name PseudoEventListener#doCapturePhase
71
99
  * @param {PseudoEvent} event
@@ -76,6 +104,7 @@ class PseudoEventListener {
76
104
  }
77
105
 
78
106
  /**
107
+ * Every listener of the target itself runs, capture listeners first.
79
108
  * @method
80
109
  * @name PseudoEventListener#doTargetPhase
81
110
  * @param {PseudoEvent} event
@@ -86,13 +115,14 @@ class PseudoEventListener {
86
115
  }
87
116
 
88
117
  /**
118
+ * A listener which is not a capture listener runs while the event travels back up (when it bubbles).
89
119
  * @method
90
120
  * @name PseudoEventListener#doBubblePhase
91
121
  * @param {PseudoEvent} event
92
- * @returns {boolean|*}
122
+ * @returns {boolean}
93
123
  */
94
124
  doBubblePhase (event) {
95
- return event.eventPhase === EventService_1.EventService.BUBBLING_PHASE && (event.bubbles || !this.eventOptions.capture)
125
+ return event.eventPhase === EventService_1.EventService.BUBBLING_PHASE && !this.eventOptions.capture
96
126
  }
97
127
 
98
128
  /**
@@ -106,43 +136,16 @@ class PseudoEventListener {
106
136
  }
107
137
 
108
138
  /**
109
- * @method
110
- * @name PseudoEventListener#skipDefault
111
- * @param {PseudoEvent} event
112
- * @returns {boolean|*}
113
- */
114
- skipDefault (event) {
115
- return this.isDefault && event.defaultPrevented
116
- }
117
-
118
- /**
119
- * @method
120
- * @name PseudoEventListener#stopPropagation
121
- * @param {PseudoEvent} event
122
- * @returns {boolean}
123
- */
124
- stopPropagation (event) {
125
- return !this.doTargetPhase(event) && event.inner.propagationStopped
126
- }
127
-
128
- /**
129
- * @method
130
- * @name PseudoEventListener#nonPassiveHalt
131
- * @param {PseudoEvent} event
132
- * @returns {boolean|*}
133
- */
134
- nonPassiveHalt (event) {
135
- return !this.eventOptions.passive && (this.skipDefault(event) || event.inner.immediatePropagationStopped || this.stopPropagation(event))
136
- }
137
-
138
- /**
139
+ * Whether this listener should not run for the event as it is now (it was removed, or it is for another phase).
140
+ * Stopping propagation is handled by the dispatching, since it stops other targets and not the listeners of the
141
+ * current one.
139
142
  * @method
140
143
  * @name PseudoEventListener#rejectEvent
141
144
  * @param {PseudoEvent} event
142
- * @returns {*|boolean}
145
+ * @returns {boolean}
143
146
  */
144
147
  rejectEvent (event) {
145
- return this.nonPassiveHalt(event) || this.skipPhase(event)
148
+ return this.isRemoved || this.skipPhase(event)
146
149
  }
147
150
  }
148
151
  exports.default = PseudoEventListener
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const EventService_1=require("../services/EventService");class PseudoEventListener{constructor(e,{capture:t=!1,once:s=!1,passive:n=!1}={},i,r=i){this.eventOptions={capture:!1,once:!1,passive:!1},this.eventType="",this.defaultListener=!1,this.eventOptions={capture:t,once:s,passive:n},this.eventType=e,this.handler=i,this.originalCallback=r}get callback(){return this.originalCallback}get isDefault(){return this.defaultListener}get once(){return this.eventOptions.once}handleEvent(e){return this.handler(e)}doCapturePhase(e){return e.eventPhase===EventService_1.EventService.CAPTURING_PHASE&&this.eventOptions.capture}doTargetPhase(e){return e.eventPhase===EventService_1.EventService.AT_TARGET}doBubblePhase(e){return e.eventPhase===EventService_1.EventService.BUBBLING_PHASE&&(e.bubbles||!this.eventOptions.capture)}skipPhase(e){return!this.doCapturePhase(e)&&!this.doTargetPhase(e)&&!this.doBubblePhase(e)}skipDefault(e){return this.isDefault&&e.defaultPrevented}stopPropagation(e){return!this.doTargetPhase(e)&&e.inner.propagationStopped}nonPassiveHalt(e){return!this.eventOptions.passive&&(this.skipDefault(e)||e.inner.immediatePropagationStopped||this.stopPropagation(e))}rejectEvent(e){return this.nonPassiveHalt(e)||this.skipPhase(e)}}exports.default=PseudoEventListener;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const EventService_1=require("../services/EventService");class PseudoEventListener{constructor(e,{capture:t=!1,once:s=!1,passive:r=!1}={},i,n=i){this.eventOptions={capture:!1,once:!1,passive:!1},this.eventType="",this.defaultListener=!1,this.isRemoved=!1,this.eventOptions={capture:t,once:s,passive:r},this.eventType=e,this.handler=i,this.originalCallback=n}get callback(){return this.originalCallback}get capture(){return this.eventOptions.capture}get isDefault(){return this.defaultListener}get once(){return this.eventOptions.once}get passive(){return this.eventOptions.passive}get removed(){return this.isRemoved}set removed(e){this.isRemoved=e}handleEvent(e){return this.handler(e)}doCapturePhase(e){return e.eventPhase===EventService_1.EventService.CAPTURING_PHASE&&this.eventOptions.capture}doTargetPhase(e){return e.eventPhase===EventService_1.EventService.AT_TARGET}doBubblePhase(e){return e.eventPhase===EventService_1.EventService.BUBBLING_PHASE&&!this.eventOptions.capture}skipPhase(e){return!this.doCapturePhase(e)&&!this.doTargetPhase(e)&&!this.doBubblePhase(e)}rejectEvent(e){return this.isRemoved||this.skipPhase(e)}}exports.default=PseudoEventListener;
@@ -15,7 +15,7 @@ import { HTMLElementService as PseudoHTMLElement } from '../services/HTMLElement
15
15
  * @augments PseudoHTMLElement
16
16
  * @property {PseudoHTMLElement} head - A reference to the Head child element
17
17
  * @property {PseudoHTMLElement} body - A reference to the Body child element
18
- * @property {function} createElement - Generate a new PseudoHTMLElement with parent of document
18
+ * @property {function} createElement - Generate a new PseudoHTMLElement (which is not in the document until it is appended)
19
19
  */
20
20
  declare class PseudoHTMLDocument extends PseudoHTMLElement {
21
21
  private head;
@@ -26,7 +26,7 @@ declare class PseudoHTMLDocument extends PseudoHTMLElement {
26
26
  */
27
27
  constructor();
28
28
  /**
29
- * Create and return a PseudoHTMLElement
29
+ * Create and return a PseudoHTMLElement, which is not added to the document until it is appended somewhere
30
30
  * @param {string} tagName - Tag Name is a string representing the type of Dom element this represents
31
31
  * @returns {PseudoHTMLElement}
32
32
  */
@@ -1,12 +1,5 @@
1
1
  'use strict'
2
2
 
3
- const __importDefault = void 0 && (void 0).__importDefault || function (mod) {
4
- return mod && mod.__esModule
5
- ? mod
6
- : {
7
- default: mod
8
- }
9
- }
10
3
  Object.defineProperty(exports, '__esModule', {
11
4
  value: true
12
5
  })
@@ -20,8 +13,6 @@ Object.defineProperty(exports, '__esModule', {
20
13
  * @type {PseudoHTMLElement}
21
14
  */
22
15
  const HTMLElementService_1 = require('../services/HTMLElementService')
23
- const generateNodeList_1 = __importDefault(require('../factories/generateNodeList'))
24
- const TreeLinker_1 = require('collect-your-stuff/dist/collections/linked-tree-list/TreeLinker')
25
16
  /**
26
17
  * Simulate the behaviour of the HTMLDocument Class when there is no DOM available.
27
18
  * @author Joshua Heagle <joshuaheagle@gmail.com>
@@ -29,7 +20,7 @@ const TreeLinker_1 = require('collect-your-stuff/dist/collections/linked-tree-li
29
20
  * @augments PseudoHTMLElement
30
21
  * @property {PseudoHTMLElement} head - A reference to the Head child element
31
22
  * @property {PseudoHTMLElement} body - A reference to the Body child element
32
- * @property {function} createElement - Generate a new PseudoHTMLElement with parent of document
23
+ * @property {function} createElement - Generate a new PseudoHTMLElement (which is not in the document until it is appended)
33
24
  */
34
25
  class PseudoHTMLDocument extends HTMLElementService_1.HTMLElementService {
35
26
  /**
@@ -39,39 +30,37 @@ class PseudoHTMLDocument extends HTMLElementService_1.HTMLElementService {
39
30
  constructor () {
40
31
  super()
41
32
  const html = new HTMLElementService_1.HTMLElementService({
42
- tagName: 'html',
43
- parent: this
33
+ tagName: 'html'
44
34
  })
35
+ this.appendChild(html)
45
36
  /**
46
37
  * Create document head element
47
38
  * @type {PseudoHTMLElement}
48
39
  */
49
40
  this.head = new HTMLElementService_1.HTMLElementService({
50
- tagName: 'head',
51
- parent: html
41
+ tagName: 'head'
52
42
  })
43
+ html.appendChild(this.head)
53
44
  /**
54
45
  * Create document body element
55
46
  * @type {PseudoHTMLElement}
56
47
  */
57
48
  this.body = new HTMLElementService_1.HTMLElementService({
58
- tagName: 'body',
59
- parent: html
49
+ tagName: 'body'
60
50
  })
61
- html.children = (0, generateNodeList_1.default)(TreeLinker_1.TreeLinker.fromArray([this.head, this.body]).head)
51
+ html.appendChild(this.body)
62
52
  }
63
53
 
64
54
  /**
65
- * Create and return a PseudoHTMLElement
55
+ * Create and return a PseudoHTMLElement, which is not added to the document until it is appended somewhere
66
56
  * @param {string} tagName - Tag Name is a string representing the type of Dom element this represents
67
57
  * @returns {PseudoHTMLElement}
68
58
  */
69
59
  createElement (tagName = 'div') {
70
- const returnElement = new HTMLElementService_1.HTMLElementService({
60
+ // Like the DOM, the new element is not added anywhere: it has no parent until it is appended
61
+ return new HTMLElementService_1.HTMLElementService({
71
62
  tagName
72
63
  })
73
- returnElement.parent = this
74
- return returnElement
75
64
  }
76
65
  }
77
66
  exports.default = PseudoHTMLDocument
@@ -1 +1 @@
1
- "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const HTMLElementService_1=require("../services/HTMLElementService"),generateNodeList_1=__importDefault(require("../factories/generateNodeList")),TreeLinker_1=require("collect-your-stuff/dist/collections/linked-tree-list/TreeLinker");class PseudoHTMLDocument extends HTMLElementService_1.HTMLElementService{constructor(){super();const e=new HTMLElementService_1.HTMLElementService({tagName:"html",parent:this});this.head=new HTMLElementService_1.HTMLElementService({tagName:"head",parent:e}),this.body=new HTMLElementService_1.HTMLElementService({tagName:"body",parent:e}),e.children=(0,generateNodeList_1.default)(TreeLinker_1.TreeLinker.fromArray([this.head,this.body]).head)}createElement(e="div"){const t=new HTMLElementService_1.HTMLElementService({tagName:e});return t.parent=this,t}}exports.default=PseudoHTMLDocument;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const HTMLElementService_1=require("../services/HTMLElementService");class PseudoHTMLDocument extends HTMLElementService_1.HTMLElementService{constructor(){super();const e=new HTMLElementService_1.HTMLElementService({tagName:"html"});this.appendChild(e),this.head=new HTMLElementService_1.HTMLElementService({tagName:"head"}),e.appendChild(this.head),this.body=new HTMLElementService_1.HTMLElementService({tagName:"body"}),e.appendChild(this.body)}createElement(e="div"){return new HTMLElementService_1.HTMLElementService({tagName:e})}}exports.default=PseudoHTMLDocument;
@@ -24,16 +24,22 @@ class PseudoNodeList extends LinkedTreeList_1.LinkedTreeList {
24
24
  * @returns {Iterator}
25
25
  */
26
26
  [Symbol.iterator] () {
27
- const linkers = super[Symbol.iterator]()
27
+ // Walk the nodes of this list only (the linkers of a child list have no children of their own)
28
+ let current = this.first
28
29
  return {
29
30
  next: () => {
30
- const result = linkers.next()
31
- return result.done
32
- ? result
33
- : {
34
- done: false,
35
- value: result.value.data
36
- }
31
+ if (current === null) {
32
+ return {
33
+ done: true,
34
+ value: undefined
35
+ }
36
+ }
37
+ const result = {
38
+ done: false,
39
+ value: current.data
40
+ }
41
+ current = current.next
42
+ return result
37
43
  }
38
44
  }
39
45
  }
@@ -1 +1 @@
1
- "use strict";require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.map.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.PseudoNodeList=void 0;const LinkedTreeList_1=require("collect-your-stuff/dist/collections/linked-tree-list/LinkedTreeList");class PseudoNodeList extends LinkedTreeList_1.LinkedTreeList{[Symbol.iterator](){const e=super[Symbol.iterator]();return{next:()=>{const r=e.next();return r.done?r:{done:!1,value:r.value.data}}}}entries(){return Array.from(this).map((e,r)=>[r,e])[Symbol.iterator]()}keys(){return Array.from(this).map((e,r)=>r)[Symbol.iterator]()}values(){return Array.from(this)[Symbol.iterator]()}}exports.PseudoNodeList=PseudoNodeList;
1
+ "use strict";require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.map.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.PseudoNodeList=void 0;const LinkedTreeList_1=require("collect-your-stuff/dist/collections/linked-tree-list/LinkedTreeList");class PseudoNodeList extends LinkedTreeList_1.LinkedTreeList{[Symbol.iterator](){let e=this.first;return{next:()=>{if(null===e)return{done:!0,value:void 0};const r={done:!1,value:e.data};return e=e.next,r}}}entries(){return Array.from(this).map((e,r)=>[r,e])[Symbol.iterator]()}keys(){return Array.from(this).map((e,r)=>r)[Symbol.iterator]()}values(){return Array.from(this)[Symbol.iterator]()}}exports.PseudoNodeList=PseudoNodeList;
@@ -3,30 +3,22 @@ import { NodeService } from '../services/NodeService';
3
3
  import { PseudoNode } from '../interfaces/PseudoNode';
4
4
  import { PseudoElement } from '../interfaces/PseudoElement';
5
5
  /**
6
- * A node which is stored in a TreeLinker and answers questions about its position in the tree by asking that linker.
6
+ * A node which is stored in a TreeLinker (for example by a list built from an array of values). It finds its siblings
7
+ * from that linker, and its parent from the linker's parent when it has not been given one by appendChild.
7
8
  * @author Joshua Heagle <joshuaheagle@gmail.com>
8
9
  * @class
9
10
  * @augments NodeService
10
11
  */
11
12
  export declare class LinkedNode extends NodeService {
12
- private readonly linker;
13
13
  /**
14
14
  * @param {TreeLinker} linker The linker holding this node
15
15
  * @param {string|null} value The value of the node
16
16
  * @constructor
17
17
  */
18
18
  constructor(linker: TreeLinker, value?: string | null);
19
- get childNodes(): any;
20
- get firstChild(): PseudoNode | null;
21
19
  get isConnected(): boolean;
22
- get lastChild(): PseudoNode | null;
23
- get nextSibling(): PseudoNode | null;
24
- get ownerDocument(): any;
25
20
  get parentNode(): PseudoNode | null;
26
21
  get parentElement(): PseudoElement | null;
27
- get previousSibling(): PseudoNode | null;
28
- appendChild(childNode: PseudoNode): PseudoNode;
29
- getRootNode(): PseudoNode;
30
22
  }
31
23
  export declare class NodeFactory extends TreeLinker {
32
24
  }
@@ -9,7 +9,8 @@ exports.NodeFactory = exports.LinkedNode = void 0
9
9
  const TreeLinker_1 = require('collect-your-stuff/dist/collections/linked-tree-list/TreeLinker')
10
10
  const NodeService_1 = require('../services/NodeService')
11
11
  /**
12
- * A node which is stored in a TreeLinker and answers questions about its position in the tree by asking that linker.
12
+ * A node which is stored in a TreeLinker (for example by a list built from an array of values). It finds its siblings
13
+ * from that linker, and its parent from the linker's parent when it has not been given one by appendChild.
13
14
  * @author Joshua Heagle <joshuaheagle@gmail.com>
14
15
  * @class
15
16
  * @augments NodeService
@@ -22,60 +23,26 @@ class LinkedNode extends NodeService_1.NodeService {
22
23
  */
23
24
  constructor (linker, value = '') {
24
25
  super()
25
- this.linker = linker
26
+ this.listLinker = linker
26
27
  this.nodeValue = value
27
28
  }
28
29
 
29
- get childNodes () {
30
- return this.linker.children
31
- }
32
-
33
- get firstChild () {
34
- const children = this.linker.children
35
- return children && children.first ? children.first.data : null
36
- }
37
-
38
30
  get isConnected () {
39
- return !!this.linker.parent
40
- }
41
-
42
- get lastChild () {
43
- const children = this.linker.children
44
- return children && children.last ? children.last.data : null
45
- }
46
-
47
- get nextSibling () {
48
- return this.linker.next ? this.linker.next.data : null
49
- }
50
-
51
- get ownerDocument () {
52
- const root = this.linker.parent ? this.linker.rootParent : null
53
- return root ? root.data : null
31
+ return !!this.parentNode
54
32
  }
55
33
 
56
34
  get parentNode () {
57
- return this.linker.parent ? this.linker.parent.data : null
35
+ if (this.parent) {
36
+ return this.parent
37
+ }
38
+ const parentLinker = this.listLinker ? this.listLinker.parent : null
39
+ return parentLinker ? parentLinker.data : null
58
40
  }
59
41
 
60
42
  get parentElement () {
61
43
  const parent = this.parentNode
62
44
  return parent && parent.nodeType === NodeService_1.NodeService.ELEMENT_NODE ? parent : null
63
45
  }
64
-
65
- get previousSibling () {
66
- return this.linker.prev ? this.linker.prev.data : null
67
- }
68
-
69
- appendChild (childNode) {
70
- this.linker.next = childNode
71
- childNode.prev = this.linker
72
- return childNode
73
- }
74
-
75
- getRootNode () {
76
- const root = this.linker.rootParent
77
- return root ? root.data : this
78
- }
79
46
  }
80
47
  exports.LinkedNode = LinkedNode
81
48
  class NodeFactory extends TreeLinker_1.TreeLinker {}
@@ -1 +1 @@
1
- "use strict";require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.NodeFactory=exports.LinkedNode=void 0;const TreeLinker_1=require("collect-your-stuff/dist/collections/linked-tree-list/TreeLinker"),NodeService_1=require("../services/NodeService");class LinkedNode extends NodeService_1.NodeService{constructor(e,t=""){super(),this.linker=e,this.nodeValue=t}get childNodes(){return this.linker.children}get firstChild(){const e=this.linker.children;return e&&e.first?e.first.data:null}get isConnected(){return!!this.linker.parent}get lastChild(){const e=this.linker.children;return e&&e.last?e.last.data:null}get nextSibling(){return this.linker.next?this.linker.next.data:null}get ownerDocument(){const e=this.linker.parent?this.linker.rootParent:null;return e?e.data:null}get parentNode(){return this.linker.parent?this.linker.parent.data:null}get parentElement(){const e=this.parentNode;return e&&e.nodeType===NodeService_1.NodeService.ELEMENT_NODE?e:null}get previousSibling(){return this.linker.prev?this.linker.prev.data:null}appendChild(e){return this.linker.next=e,e.prev=this.linker,e}getRootNode(){const e=this.linker.rootParent;return e?e.data:this}}exports.LinkedNode=LinkedNode;class NodeFactory extends TreeLinker_1.TreeLinker{}exports.NodeFactory=NodeFactory;const generateNode=()=>(NodeFactory.fromArray=(e=[],t=NodeFactory)=>e.reduce((e,r)=>{"object"!=typeof r&&(r={data:r});const n=new t(Object.assign({},r,{prev:e.tail}));return n.data=new LinkedNode(n,r.data),null===e.head?{head:n,tail:n}:(e.tail.next=n,n.prev=e.tail,{head:e.head,tail:n})},{head:null,tail:null}),NodeFactory);exports.default=generateNode;
1
+ "use strict";require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.NodeFactory=exports.LinkedNode=void 0;const TreeLinker_1=require("collect-your-stuff/dist/collections/linked-tree-list/TreeLinker"),NodeService_1=require("../services/NodeService");class LinkedNode extends NodeService_1.NodeService{constructor(e,t=""){super(),this.listLinker=e,this.nodeValue=t}get isConnected(){return!!this.parentNode}get parentNode(){if(this.parent)return this.parent;const e=this.listLinker?this.listLinker.parent:null;return e?e.data:null}get parentElement(){const e=this.parentNode;return e&&e.nodeType===NodeService_1.NodeService.ELEMENT_NODE?e:null}}exports.LinkedNode=LinkedNode;class NodeFactory extends TreeLinker_1.TreeLinker{}exports.NodeFactory=NodeFactory;const generateNode=()=>(NodeFactory.fromArray=(e=[],t=NodeFactory)=>e.reduce((e,r)=>{"object"!=typeof r&&(r={data:r});const o=new t(Object.assign({},r,{prev:e.tail}));return o.data=new LinkedNode(o,r.data),null===e.head?{head:o,tail:o}:(e.tail.next=o,o.prev=e.tail,{head:e.head,tail:o})},{head:null,tail:null}),NodeFactory);exports.default=generateNode;
@@ -1,9 +1,11 @@
1
- /**
2
- * A helper selector function for retrieving all parent PseudoNode for the given child node.
3
- * @param {PseudoNode} node
4
- * @returns {Array.<PseudoNode>}
5
- */
6
1
  import { PseudoNode } from '../interfaces/PseudoNode';
7
2
  import { PseudoEventTarget } from '../interfaces/PseudoEventTarget';
8
- declare const getParentNodes: (node: PseudoEventTarget) => Array<PseudoNode>;
3
+ /**
4
+ * Get all of the ancestors of a node, starting with the root of the tree and ending with the node's own parent (the
5
+ * order in which an event travels down through them). A node which has no parent has no ancestors.
6
+ * @function getParentNodes
7
+ * @param {PseudoEventTarget|PseudoNode|*} node The node to find the ancestors of
8
+ * @returns {Array<PseudoNode>}
9
+ */
10
+ declare const getParentNodes: (node: PseudoEventTarget | PseudoNode | any) => Array<PseudoNode>;
9
11
  export default getParentNodes;
@@ -1,15 +1,22 @@
1
1
  'use strict'
2
2
 
3
- const __importDefault = void 0 && (void 0).__importDefault || function (mod) {
4
- return mod && mod.__esModule
5
- ? mod
6
- : {
7
- default: mod
8
- }
9
- }
10
3
  Object.defineProperty(exports, '__esModule', {
11
4
  value: true
12
5
  })
13
- const getParentNodesFromAttribute_1 = __importDefault(require('./getParentNodesFromAttribute'))
14
- const getParentNodes = node => (0, getParentNodesFromAttribute_1.default)('', false, node)
6
+ /**
7
+ * Get all of the ancestors of a node, starting with the root of the tree and ending with the node's own parent (the
8
+ * order in which an event travels down through them). A node which has no parent has no ancestors.
9
+ * @function getParentNodes
10
+ * @param {PseudoEventTarget|PseudoNode|*} node The node to find the ancestors of
11
+ * @returns {Array<PseudoNode>}
12
+ */
13
+ const getParentNodes = node => {
14
+ const parents = []
15
+ let current = node && node.parentNode ? node.parentNode : null
16
+ while (current) {
17
+ parents.unshift(current)
18
+ current = current.parentNode
19
+ }
20
+ return parents
21
+ }
15
22
  exports.default = getParentNodes
@@ -1 +1 @@
1
- "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const getParentNodesFromAttribute_1=__importDefault(require("./getParentNodesFromAttribute")),getParentNodes=e=>(0,getParentNodesFromAttribute_1.default)("",!1,e);exports.default=getParentNodes;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const getParentNodes=e=>{const t=[];let r=e&&e.parentNode?e.parentNode:null;for(;r;)t.unshift(r),r=r.parentNode;return t};exports.default=getParentNodes;
@@ -1,14 +1,14 @@
1
+ import { PseudoNode } from '../interfaces/PseudoNode';
2
+ import { PseudoEventTarget } from '../interfaces/PseudoEventTarget';
1
3
  /**
2
4
  * A selector function for retrieving existing parent PseudoNode from the given child item.
3
5
  * This function will check all the parents starting from node, and scan the attributes
4
- * property for matches. The return array contains all matching parent ancestors.
5
- * WARNING: This is a recursive function.
6
- * @param {string} attr
7
- * @param {number|string} value
8
- * @param {PseudoNode} node
6
+ * property for matches. The return array contains all matching parent ancestors, starting with the root of the tree.
7
+ * @function getParentNodesFromAttribute
8
+ * @param {string} attr The property to compare on each ancestor (a missing property counts as false)
9
+ * @param {boolean|number|string} value The value the property must have
10
+ * @param {PseudoEventTarget|PseudoNode|*} node The node to find the matching ancestors of
9
11
  * @returns {Array.<PseudoNode>}
10
12
  */
11
- import { PseudoNode } from '../interfaces/PseudoNode';
12
- import { PseudoEventTarget } from '../interfaces/PseudoEventTarget';
13
13
  declare const getParentNodesFromAttribute: (attr: string, value: boolean | number | string, node: PseudoEventTarget | PseudoNode | any) => Array<PseudoNode>;
14
14
  export default getParentNodesFromAttribute;
@@ -1,9 +1,29 @@
1
1
  'use strict'
2
2
 
3
+ require('core-js/modules/esnext.iterator.constructor.js')
4
+ require('core-js/modules/esnext.iterator.filter.js')
5
+ const __importDefault = void 0 && (void 0).__importDefault || function (mod) {
6
+ return mod && mod.__esModule
7
+ ? mod
8
+ : {
9
+ default: mod
10
+ }
11
+ }
3
12
  Object.defineProperty(exports, '__esModule', {
4
13
  value: true
5
14
  })
15
+ const getParentNodes_1 = __importDefault(require('./getParentNodes'))
16
+ /**
17
+ * A selector function for retrieving existing parent PseudoNode from the given child item.
18
+ * This function will check all the parents starting from node, and scan the attributes
19
+ * property for matches. The return array contains all matching parent ancestors, starting with the root of the tree.
20
+ * @function getParentNodesFromAttribute
21
+ * @param {string} attr The property to compare on each ancestor (a missing property counts as false)
22
+ * @param {boolean|number|string} value The value the property must have
23
+ * @param {PseudoEventTarget|PseudoNode|*} node The node to find the matching ancestors of
24
+ * @returns {Array.<PseudoNode>}
25
+ */
6
26
  const getParentNodesFromAttribute = (attr, value, node) => {
7
- return Object.keys(node.parentNode).length ? (node.parentNode[attr] || false) === value ? getParentNodesFromAttribute(attr, value, node.parentNode).concat([node.parentNode]) : getParentNodesFromAttribute(attr, value, node.parentNode) : []
27
+ return (0, getParentNodes_1.default)(node).filter(parent => (parent[attr] || false) === value)
8
28
  }
9
29
  exports.default = getParentNodesFromAttribute
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const getParentNodesFromAttribute=(e,t,r)=>Object.keys(r.parentNode).length?(r.parentNode[e]||!1)===t?getParentNodesFromAttribute(e,t,r.parentNode).concat([r.parentNode]):getParentNodesFromAttribute(e,t,r.parentNode):[];exports.default=getParentNodesFromAttribute;
1
+ "use strict";require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js");var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const getParentNodes_1=__importDefault(require("./getParentNodes")),getParentNodesFromAttribute=(e,t,r)=>(0,getParentNodes_1.default)(r).filter(r=>(r[e]||!1)===t);exports.default=getParentNodesFromAttribute;
@@ -1,5 +1,5 @@
1
1
  declare const _default: {
2
- getParentNodes: (node: import("./interfaces/PseudoEventTarget").PseudoEventTarget) => Array<import("./interfaces/PseudoNode").PseudoNode>;
2
+ getParentNodes: (node: import("./interfaces/PseudoEventTarget").PseudoEventTarget | import("./interfaces/PseudoNode").PseudoNode | any) => Array<import("./interfaces/PseudoNode").PseudoNode>;
3
3
  getParentNodesFromAttribute: (attr: string, value: boolean | number | string, node: import("./interfaces/PseudoEventTarget").PseudoEventTarget | import("./interfaces/PseudoNode").PseudoNode | any) => Array<import("./interfaces/PseudoNode").PseudoNode>;
4
4
  };
5
5
  export default _default;
@@ -35,12 +35,12 @@ export interface PseudoEventTarget {
35
35
  * @param {string} type
36
36
  * @param {function} callback
37
37
  */
38
- removeEventListener(type: string, callback: Function): void;
38
+ removeEventListener(type: string, callback: Function, options?: listenerOptions | boolean): void;
39
39
  /**
40
40
  * Dispatches an event to this EventTarget.
41
41
  * @param {Event|PseudoEvent} event
42
42
  * @param {EventTarget|PseudoEventTarget} target
43
43
  * @returns {boolean}
44
44
  */
45
- dispatchEvent(event: PseudoEvent, target: PseudoEventTarget): boolean;
45
+ dispatchEvent(event: PseudoEvent): boolean;
46
46
  }
@@ -1,4 +1,13 @@
1
1
  import { NodeService } from './NodeService';
2
2
  import { PseudoDocumentFragment } from '../interfaces/PseudoDocumentFragment';
3
+ /**
4
+ * Simulate the behaviour of the DocumentFragment Class when there is no DOM available: a container for nodes which is
5
+ * not part of a tree, when it is inserted its children are moved into the tree instead.
6
+ * @author Joshua Heagle <joshuaheagle@gmail.com>
7
+ * @class
8
+ * @augments NodeService
9
+ */
3
10
  export declare class DocumentFragmentService extends NodeService implements PseudoDocumentFragment {
11
+ get nodeName(): string;
12
+ get nodeType(): number;
4
13
  }
@@ -5,5 +5,20 @@ Object.defineProperty(exports, '__esModule', {
5
5
  })
6
6
  exports.DocumentFragmentService = void 0
7
7
  const NodeService_1 = require('./NodeService')
8
- class DocumentFragmentService extends NodeService_1.NodeService {}
8
+ /**
9
+ * Simulate the behaviour of the DocumentFragment Class when there is no DOM available: a container for nodes which is
10
+ * not part of a tree, when it is inserted its children are moved into the tree instead.
11
+ * @author Joshua Heagle <joshuaheagle@gmail.com>
12
+ * @class
13
+ * @augments NodeService
14
+ */
15
+ class DocumentFragmentService extends NodeService_1.NodeService {
16
+ get nodeName () {
17
+ return '#document-fragment'
18
+ }
19
+
20
+ get nodeType () {
21
+ return NodeService_1.NodeService.DOCUMENT_FRAGMENT_NODE
22
+ }
23
+ }
9
24
  exports.DocumentFragmentService = DocumentFragmentService
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DocumentFragmentService=void 0;const NodeService_1=require("./NodeService");class DocumentFragmentService extends NodeService_1.NodeService{}exports.DocumentFragmentService=DocumentFragmentService;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DocumentFragmentService=void 0;const NodeService_1=require("./NodeService");class DocumentFragmentService extends NodeService_1.NodeService{get nodeName(){return"#document-fragment"}get nodeType(){return NodeService_1.NodeService.DOCUMENT_FRAGMENT_NODE}}exports.DocumentFragmentService=DocumentFragmentService;
@@ -1,4 +1,12 @@
1
1
  import { NodeService } from './NodeService';
2
2
  import { PseudoDocument } from '../interfaces/PseudoDocument';
3
+ /**
4
+ * Simulate the behaviour of the Document Class when there is no DOM available.
5
+ * @author Joshua Heagle <joshuaheagle@gmail.com>
6
+ * @class
7
+ * @augments NodeService
8
+ */
3
9
  export declare class DocumentService extends NodeService implements PseudoDocument {
10
+ get nodeName(): string;
11
+ get nodeType(): number;
4
12
  }
@@ -5,5 +5,19 @@ Object.defineProperty(exports, '__esModule', {
5
5
  })
6
6
  exports.DocumentService = void 0
7
7
  const NodeService_1 = require('./NodeService')
8
- class DocumentService extends NodeService_1.NodeService {}
8
+ /**
9
+ * Simulate the behaviour of the Document Class when there is no DOM available.
10
+ * @author Joshua Heagle <joshuaheagle@gmail.com>
11
+ * @class
12
+ * @augments NodeService
13
+ */
14
+ class DocumentService extends NodeService_1.NodeService {
15
+ get nodeName () {
16
+ return '#document'
17
+ }
18
+
19
+ get nodeType () {
20
+ return NodeService_1.NodeService.DOCUMENT_NODE
21
+ }
22
+ }
9
23
  exports.DocumentService = DocumentService
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DocumentService=void 0;const NodeService_1=require("./NodeService");class DocumentService extends NodeService_1.NodeService{}exports.DocumentService=DocumentService;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DocumentService=void 0;const NodeService_1=require("./NodeService");class DocumentService extends NodeService_1.NodeService{get nodeName(){return"#document"}get nodeType(){return NodeService_1.NodeService.DOCUMENT_NODE}}exports.DocumentService=DocumentService;