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.
- package/README.md +626 -116
- package/browser/pseudo-dom.js +849 -407
- package/browser/pseudo-dom.min.js +1 -1
- package/dist/classes/PseudoEventListener.d.ts +25 -25
- package/dist/classes/PseudoEventListener.js +37 -34
- package/dist/classes/PseudoEventListener.min.js +1 -1
- package/dist/classes/PseudoHTMLDocument.d.ts +2 -2
- package/dist/classes/PseudoHTMLDocument.js +10 -21
- package/dist/classes/PseudoHTMLDocument.min.js +1 -1
- package/dist/classes/PseudoNodeList.js +14 -8
- package/dist/classes/PseudoNodeList.min.js +1 -1
- package/dist/factories/generateNode.d.ts +2 -10
- package/dist/factories/generateNode.js +9 -42
- package/dist/factories/generateNode.min.js +1 -1
- package/dist/functions/getParentNodes.d.ts +8 -6
- package/dist/functions/getParentNodes.js +16 -9
- package/dist/functions/getParentNodes.min.js +1 -1
- package/dist/functions/getParentNodesFromAttribute.d.ts +7 -7
- package/dist/functions/getParentNodesFromAttribute.js +21 -1
- package/dist/functions/getParentNodesFromAttribute.min.js +1 -1
- package/dist/functions.d.ts +1 -1
- package/dist/interfaces/PseudoEventTarget.d.ts +2 -2
- package/dist/services/DocumentFragmentService.d.ts +9 -0
- package/dist/services/DocumentFragmentService.js +16 -1
- package/dist/services/DocumentFragmentService.min.js +1 -1
- package/dist/services/DocumentService.d.ts +8 -0
- package/dist/services/DocumentService.js +15 -1
- package/dist/services/DocumentService.min.js +1 -1
- package/dist/services/ElementService.d.ts +6 -6
- package/dist/services/ElementService.js +28 -17
- package/dist/services/ElementService.min.js +1 -1
- package/dist/services/EventService.d.ts +16 -4
- package/dist/services/EventService.js +59 -31
- package/dist/services/EventService.min.js +1 -1
- package/dist/services/EventTargetService.d.ts +41 -9
- package/dist/services/EventTargetService.js +121 -52
- package/dist/services/EventTargetService.min.js +1 -1
- package/dist/services/NodeService.d.ts +31 -16
- package/dist/services/NodeService.js +90 -33
- package/dist/services/NodeService.min.js +1 -1
- 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 &&
|
|
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
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
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 {
|
|
145
|
+
* @returns {boolean}
|
|
143
146
|
*/
|
|
144
147
|
rejectEvent (event) {
|
|
145
|
-
return this.
|
|
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:
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
|
|
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";
|
|
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
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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](){
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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";
|
|
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
|
-
*
|
|
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
|
|
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)=>
|
|
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;
|
package/dist/functions.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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;
|