pseudo-dom 0.1.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/LICENSE +674 -0
- package/README.md +1029 -0
- package/browser/pseudo-dom.js +5219 -0
- package/browser/pseudo-dom.min.js +1 -0
- package/dist/classes/PseudoEventListener.d.ts +96 -0
- package/dist/classes/PseudoEventListener.js +148 -0
- package/dist/classes/PseudoEventListener.min.js +1 -0
- package/dist/classes/PseudoHTMLDocument.d.ts +35 -0
- package/dist/classes/PseudoHTMLDocument.js +77 -0
- package/dist/classes/PseudoHTMLDocument.min.js +1 -0
- package/dist/classes/PseudoNodeList.d.ts +34 -0
- package/dist/classes/PseudoNodeList.js +65 -0
- package/dist/classes/PseudoNodeList.min.js +1 -0
- package/dist/classes.d.ts +20 -0
- package/dist/classes.js +31 -0
- package/dist/classes.min.js +1 -0
- package/dist/factories/generateDocument.d.ts +11 -0
- package/dist/factories/generateDocument.js +65 -0
- package/dist/factories/generateDocument.min.js +1 -0
- package/dist/factories/generateNode.d.ts +40 -0
- package/dist/factories/generateNode.js +118 -0
- package/dist/factories/generateNode.min.js +1 -0
- package/dist/factories/generateNodeList.d.ts +9 -0
- package/dist/factories/generateNodeList.js +13 -0
- package/dist/factories/generateNodeList.min.js +1 -0
- package/dist/factories.d.ts +5 -0
- package/dist/factories.js +23 -0
- package/dist/factories.min.js +1 -0
- package/dist/functions/getParentNodes.d.ts +9 -0
- package/dist/functions/getParentNodes.js +15 -0
- package/dist/functions/getParentNodes.min.js +1 -0
- package/dist/functions/getParentNodesFromAttribute.d.ts +14 -0
- package/dist/functions/getParentNodesFromAttribute.js +9 -0
- package/dist/functions/getParentNodesFromAttribute.min.js +1 -0
- package/dist/functions.d.ts +5 -0
- package/dist/functions.js +23 -0
- package/dist/functions.min.js +1 -0
- package/dist/interfaces/PseudoAnimation.d.ts +3 -0
- package/dist/interfaces/PseudoAnimation.js +5 -0
- package/dist/interfaces/PseudoAnimation.min.js +1 -0
- package/dist/interfaces/PseudoAttr.d.ts +11 -0
- package/dist/interfaces/PseudoAttr.js +5 -0
- package/dist/interfaces/PseudoAttr.min.js +1 -0
- package/dist/interfaces/PseudoDOMTokenList.d.ts +16 -0
- package/dist/interfaces/PseudoDOMTokenList.js +5 -0
- package/dist/interfaces/PseudoDOMTokenList.min.js +1 -0
- package/dist/interfaces/PseudoDocument.d.ts +3 -0
- package/dist/interfaces/PseudoDocument.js +5 -0
- package/dist/interfaces/PseudoDocument.min.js +1 -0
- package/dist/interfaces/PseudoDocumentFragment.d.ts +3 -0
- package/dist/interfaces/PseudoDocumentFragment.js +5 -0
- package/dist/interfaces/PseudoDocumentFragment.min.js +1 -0
- package/dist/interfaces/PseudoElement.d.ts +678 -0
- package/dist/interfaces/PseudoElement.js +5 -0
- package/dist/interfaces/PseudoElement.min.js +1 -0
- package/dist/interfaces/PseudoEvent.d.ts +79 -0
- package/dist/interfaces/PseudoEvent.js +10 -0
- package/dist/interfaces/PseudoEvent.min.js +1 -0
- package/dist/interfaces/PseudoEventTarget.d.ts +46 -0
- package/dist/interfaces/PseudoEventTarget.js +5 -0
- package/dist/interfaces/PseudoEventTarget.min.js +1 -0
- package/dist/interfaces/PseudoHTMLCollection.d.ts +2 -0
- package/dist/interfaces/PseudoHTMLCollection.js +5 -0
- package/dist/interfaces/PseudoHTMLCollection.min.js +1 -0
- package/dist/interfaces/PseudoHTMLElement.d.ts +22 -0
- package/dist/interfaces/PseudoHTMLElement.js +5 -0
- package/dist/interfaces/PseudoHTMLElement.min.js +1 -0
- package/dist/interfaces/PseudoHTMLSlotElement.d.ts +3 -0
- package/dist/interfaces/PseudoHTMLSlotElement.js +5 -0
- package/dist/interfaces/PseudoHTMLSlotElement.min.js +1 -0
- package/dist/interfaces/PseudoNamedNodeMap.d.ts +11 -0
- package/dist/interfaces/PseudoNamedNodeMap.js +5 -0
- package/dist/interfaces/PseudoNamedNodeMap.min.js +1 -0
- package/dist/interfaces/PseudoNode.d.ts +179 -0
- package/dist/interfaces/PseudoNode.js +5 -0
- package/dist/interfaces/PseudoNode.min.js +1 -0
- package/dist/interfaces/PseudoShadowRoot.d.ts +3 -0
- package/dist/interfaces/PseudoShadowRoot.js +5 -0
- package/dist/interfaces/PseudoShadowRoot.min.js +1 -0
- package/dist/main.d.ts +29 -0
- package/dist/main.js +75 -0
- package/dist/main.min.js +1 -0
- package/dist/services/AnimationService.d.ts +4 -0
- package/dist/services/AnimationService.js +16 -0
- package/dist/services/AnimationService.min.js +1 -0
- package/dist/services/AttrService.d.ts +31 -0
- package/dist/services/AttrService.js +57 -0
- package/dist/services/AttrService.min.js +1 -0
- package/dist/services/DOMTokenListService.d.ts +33 -0
- package/dist/services/DOMTokenListService.js +117 -0
- package/dist/services/DOMTokenListService.min.js +1 -0
- package/dist/services/DocumentFragmentService.d.ts +4 -0
- package/dist/services/DocumentFragmentService.js +9 -0
- package/dist/services/DocumentFragmentService.min.js +1 -0
- package/dist/services/DocumentService.d.ts +4 -0
- package/dist/services/DocumentService.js +9 -0
- package/dist/services/DocumentService.min.js +1 -0
- package/dist/services/ElementService.d.ts +95 -0
- package/dist/services/ElementService.js +205 -0
- package/dist/services/ElementService.min.js +1 -0
- package/dist/services/EventService.d.ts +106 -0
- package/dist/services/EventService.js +216 -0
- package/dist/services/EventService.min.js +1 -0
- package/dist/services/EventTargetService.d.ts +52 -0
- package/dist/services/EventTargetService.js +163 -0
- package/dist/services/EventTargetService.min.js +1 -0
- package/dist/services/HTMLCollectionService.d.ts +3 -0
- package/dist/services/HTMLCollectionService.js +8 -0
- package/dist/services/HTMLCollectionService.min.js +1 -0
- package/dist/services/HTMLElementService.d.ts +37 -0
- package/dist/services/HTMLElementService.js +68 -0
- package/dist/services/HTMLElementService.min.js +1 -0
- package/dist/services/HTMLSlotElementService.d.ts +4 -0
- package/dist/services/HTMLSlotElementService.js +9 -0
- package/dist/services/HTMLSlotElementService.min.js +1 -0
- package/dist/services/NamedNodeMapService.d.ts +23 -0
- package/dist/services/NamedNodeMapService.js +77 -0
- package/dist/services/NamedNodeMapService.min.js +1 -0
- package/dist/services/NodeService.d.ts +111 -0
- package/dist/services/NodeService.js +230 -0
- package/dist/services/NodeService.min.js +1 -0
- package/dist/services/ShadowRootService.d.ts +4 -0
- package/dist/services/ShadowRootService.js +9 -0
- package/dist/services/ShadowRootService.min.js +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Substitute for the DOM Event Class.
|
|
5
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
const __importDefault = void 0 && (void 0).__importDefault || function (mod) {
|
|
9
|
+
return mod && mod.__esModule
|
|
10
|
+
? mod
|
|
11
|
+
: {
|
|
12
|
+
default: mod
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(exports, '__esModule', {
|
|
16
|
+
value: true
|
|
17
|
+
})
|
|
18
|
+
exports.EventService = void 0
|
|
19
|
+
const getParentNodes_1 = __importDefault(require('../functions/getParentNodes'))
|
|
20
|
+
/**
|
|
21
|
+
* Simulate the behaviour of the Event Class when there is no DOM available.
|
|
22
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
23
|
+
* @class
|
|
24
|
+
* @property {number} NONE
|
|
25
|
+
* @property {number} CAPTURING_PHASE
|
|
26
|
+
* @property {number} AT_TARGET
|
|
27
|
+
* @property {number} BUBBLING_PHASE
|
|
28
|
+
* @property {boolean} bubbles - A Boolean indicating whether the event bubbles up through the Dom or not.
|
|
29
|
+
* @property {boolean} cancelable - A Boolean indicating whether the event is cancelable.
|
|
30
|
+
* @property {boolean} composed - A Boolean value indicating whether the event can bubble across the boundary
|
|
31
|
+
* between the shadow Dom and the regular Dom.
|
|
32
|
+
* @property {function|PseudoEventTarget} currentTarget - A reference to the currently registered target for the event. This
|
|
33
|
+
* is the object to which the event is currently slated to be sent; it's possible this has been changed along the way
|
|
34
|
+
* through re-targeting.
|
|
35
|
+
* @property {boolean} defaultPrevented - Indicates whether event.preventDefault() has been called on the event.
|
|
36
|
+
* @property {boolean} immediatePropagationStopped - Flag that no further propagation should occur, including on current
|
|
37
|
+
* target.
|
|
38
|
+
* @property {boolean} propagationStopped - Flag that no further propagation should occur.
|
|
39
|
+
* @property {int} eventPhase - Indicates which phase of the event flow is being processed. Uses EventService constants.
|
|
40
|
+
* @property {EventTarget|PseudoEventTarget} target - A reference to the target to which the event was originally
|
|
41
|
+
* dispatched.
|
|
42
|
+
* @property {int} timeStamp - The time at which the event was created (in milliseconds). By specification, this
|
|
43
|
+
* value is time since epoch, but in reality browsers' definitions vary; in addition, work is underway to change this
|
|
44
|
+
* to be a DomHighResTimeStamp instead.
|
|
45
|
+
* @property {string} type - The name of the event (case-insensitive).
|
|
46
|
+
* @property {boolean} isTrusted - Indicates whether the event was initiated by the browser (after a user
|
|
47
|
+
* click for instance) or by a script (using an event creation method, like event.initEvent)
|
|
48
|
+
*/
|
|
49
|
+
class EventService {
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
* @param {string} typeArg
|
|
53
|
+
* @param {Object} [eventOptions={}]
|
|
54
|
+
* @param {boolean} [eventOptions.bubbles=true]
|
|
55
|
+
* @param {boolean} [eventOptions.cancelable=true]
|
|
56
|
+
* @param {boolean} [eventOptions.composed=true]
|
|
57
|
+
* @constructor
|
|
58
|
+
*/
|
|
59
|
+
constructor (typeArg = '', {
|
|
60
|
+
bubbles = true,
|
|
61
|
+
cancelable = true,
|
|
62
|
+
composed = true
|
|
63
|
+
} = {}) {
|
|
64
|
+
this.properties = {
|
|
65
|
+
bubbles: true,
|
|
66
|
+
cancelable: true,
|
|
67
|
+
composed: true,
|
|
68
|
+
currentTarget: null,
|
|
69
|
+
defaultPrevented: false,
|
|
70
|
+
immediatePropagationStopped: false,
|
|
71
|
+
propagationStopped: false,
|
|
72
|
+
eventPhase: 0,
|
|
73
|
+
target: null,
|
|
74
|
+
timeStamp: Math.floor(Date.now() / 1000),
|
|
75
|
+
type: '',
|
|
76
|
+
isTrusted: true
|
|
77
|
+
}
|
|
78
|
+
this.setReadOnlyProperties({
|
|
79
|
+
type: typeArg,
|
|
80
|
+
bubbles,
|
|
81
|
+
cancelable,
|
|
82
|
+
composed
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
get bubbles () {
|
|
87
|
+
return this.properties.bubbles
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
get cancelable () {
|
|
91
|
+
return this.properties.cancelable
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
get composed () {
|
|
95
|
+
return this.properties.composed
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
get currentTarget () {
|
|
99
|
+
return this.properties.currentTarget
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
get defaultPrevented () {
|
|
103
|
+
return this.properties.defaultPrevented
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
get eventPhase () {
|
|
107
|
+
return this.properties.eventPhase
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
get isTrusted () {
|
|
111
|
+
return this.properties.isTrusted
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
get target () {
|
|
115
|
+
return this.properties.target
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
get timeStamp () {
|
|
119
|
+
return this.properties.timeStamp
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
get type () {
|
|
123
|
+
return this.properties.type
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Scope several accessors inside the inner object. These are only intended for usage by other DOM classes.
|
|
128
|
+
* @returns {EventInner}
|
|
129
|
+
*/
|
|
130
|
+
get inner () {
|
|
131
|
+
const self = this
|
|
132
|
+
return {
|
|
133
|
+
set currentTarget (target) {
|
|
134
|
+
self.properties.currentTarget = target
|
|
135
|
+
},
|
|
136
|
+
set eventPhase (phase) {
|
|
137
|
+
self.properties.eventPhase = phase
|
|
138
|
+
},
|
|
139
|
+
set target (target) {
|
|
140
|
+
self.properties.target = target
|
|
141
|
+
},
|
|
142
|
+
get immediatePropagationStopped () {
|
|
143
|
+
return self.properties.immediatePropagationStopped
|
|
144
|
+
},
|
|
145
|
+
get propagationStopped () {
|
|
146
|
+
return self.properties.propagationStopped
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Return an array of targets that will have the event executed open them. The order is based on the eventPhase
|
|
153
|
+
* @method
|
|
154
|
+
* @returns {Array.<PseudoEventTarget>}
|
|
155
|
+
*/
|
|
156
|
+
composedPath () {
|
|
157
|
+
switch (this.eventPhase) {
|
|
158
|
+
case EventService.CAPTURING_PHASE:
|
|
159
|
+
return (0, getParentNodes_1.default)(this.target)
|
|
160
|
+
case EventService.BUBBLING_PHASE:
|
|
161
|
+
return (0, getParentNodes_1.default)(this.target).slice().reverse()
|
|
162
|
+
case EventService.AT_TARGET:
|
|
163
|
+
return [this.target]
|
|
164
|
+
default:
|
|
165
|
+
return []
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Cancels the event (if it is cancelable).
|
|
171
|
+
* @method
|
|
172
|
+
* @returns {null}
|
|
173
|
+
*/
|
|
174
|
+
preventDefault () {
|
|
175
|
+
this.setReadOnlyProperties({
|
|
176
|
+
defaultPrevented: true
|
|
177
|
+
})
|
|
178
|
+
return null
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* For this particular event, no other listener will be called.
|
|
183
|
+
* Neither those attached on the same element, nor those attached on elements which will be traversed later (in
|
|
184
|
+
* capture phase, for instance)
|
|
185
|
+
* @method
|
|
186
|
+
* @returns {null}
|
|
187
|
+
*/
|
|
188
|
+
stopImmediatePropagation () {
|
|
189
|
+
this.setReadOnlyProperties({
|
|
190
|
+
immediatePropagationStopped: true
|
|
191
|
+
})
|
|
192
|
+
return null
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Stops the propagation of events further along in the Dom.
|
|
197
|
+
* @method
|
|
198
|
+
* @returns {null}
|
|
199
|
+
*/
|
|
200
|
+
stopPropagation () {
|
|
201
|
+
this.setReadOnlyProperties({
|
|
202
|
+
propagationStopped: true
|
|
203
|
+
})
|
|
204
|
+
return null
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
setReadOnlyProperties (updateProps = {}) {
|
|
208
|
+
this.properties = Object.assign({}, this.properties, updateProps)
|
|
209
|
+
return this
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.EventService = EventService
|
|
213
|
+
EventService.NONE = 0
|
|
214
|
+
EventService.CAPTURING_PHASE = 1
|
|
215
|
+
EventService.AT_TARGET = 2
|
|
216
|
+
EventService.BUBBLING_PHASE = 3
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.EventService=void 0;const getParentNodes_1=__importDefault(require("../functions/getParentNodes"));class EventService{constructor(e="",{bubbles:t=!0,cancelable:r=!0,composed:s=!0}={}){this.properties={bubbles:!0,cancelable:!0,composed:!0,currentTarget:null,defaultPrevented:!1,immediatePropagationStopped:!1,propagationStopped:!1,eventPhase:0,target:null,timeStamp:Math.floor(Date.now()/1e3),type:"",isTrusted:!0},this.setReadOnlyProperties({type:e,bubbles:t,cancelable:r,composed:s})}get bubbles(){return this.properties.bubbles}get cancelable(){return this.properties.cancelable}get composed(){return this.properties.composed}get currentTarget(){return this.properties.currentTarget}get defaultPrevented(){return this.properties.defaultPrevented}get eventPhase(){return this.properties.eventPhase}get isTrusted(){return this.properties.isTrusted}get target(){return this.properties.target}get timeStamp(){return this.properties.timeStamp}get type(){return this.properties.type}get inner(){const e=this;return{set currentTarget(t){e.properties.currentTarget=t},set eventPhase(t){e.properties.eventPhase=t},set target(t){e.properties.target=t},get immediatePropagationStopped(){return e.properties.immediatePropagationStopped},get propagationStopped(){return e.properties.propagationStopped}}}composedPath(){switch(this.eventPhase){case EventService.CAPTURING_PHASE:return(0,getParentNodes_1.default)(this.target);case EventService.BUBBLING_PHASE:return(0,getParentNodes_1.default)(this.target).slice().reverse();case EventService.AT_TARGET:return[this.target];default:return[]}}preventDefault(){return this.setReadOnlyProperties({defaultPrevented:!0}),null}stopImmediatePropagation(){return this.setReadOnlyProperties({immediatePropagationStopped:!0}),null}stopPropagation(){return this.setReadOnlyProperties({propagationStopped:!0}),null}setReadOnlyProperties(e={}){return this.properties=Object.assign({},this.properties,e),this}}exports.EventService=EventService,EventService.NONE=0,EventService.CAPTURING_PHASE=1,EventService.AT_TARGET=2,EventService.BUBBLING_PHASE=3;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Substitute for the DOM EventTarget Class.
|
|
3
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import { EventService } from './EventService';
|
|
7
|
+
import { listenerOptions, PseudoEventTarget } from '../interfaces/PseudoEventTarget';
|
|
8
|
+
/**
|
|
9
|
+
* Simulate the behaviour of the EventTarget Class when there is no DOM available.
|
|
10
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
11
|
+
* @class
|
|
12
|
+
* @property {Object.<string, Array.<PseudoEventListener>>} listeners
|
|
13
|
+
* @property {function} addEventListener
|
|
14
|
+
* @property {function} removeEventListener
|
|
15
|
+
* @property {function} dispatchEvent
|
|
16
|
+
*/
|
|
17
|
+
declare class EventTargetService implements PseudoEventTarget {
|
|
18
|
+
private readonly listeners;
|
|
19
|
+
private readonly defaultEvent;
|
|
20
|
+
/**
|
|
21
|
+
* @constructor
|
|
22
|
+
*/
|
|
23
|
+
constructor();
|
|
24
|
+
/**
|
|
25
|
+
* The listeners registered for a type of event, creating the (empty) list of them when there are none yet.
|
|
26
|
+
* @param {string} type
|
|
27
|
+
* @returns {LinkedList}
|
|
28
|
+
*/
|
|
29
|
+
private listenersFor;
|
|
30
|
+
/**
|
|
31
|
+
* Run each of the listeners registered on this target for the type of the event.
|
|
32
|
+
* Listeners which do not apply to the event's phase are skipped, running stops once immediate propagation is stopped,
|
|
33
|
+
* and listeners added or removed while running do not change which ones run for this event.
|
|
34
|
+
* @param {EventService} event
|
|
35
|
+
* @returns {*} true when there was nothing registered, otherwise the last value returned from a handler (null when none ran)
|
|
36
|
+
*/
|
|
37
|
+
private runEvents;
|
|
38
|
+
/**
|
|
39
|
+
* Register the function to run when nothing else has prevented the default for this type of event.
|
|
40
|
+
* @param {string} type
|
|
41
|
+
* @param {Function} callback
|
|
42
|
+
*/
|
|
43
|
+
protected setDefaultEvent(type: string, callback: Function): void;
|
|
44
|
+
private runDefaultEvent;
|
|
45
|
+
private startEvents;
|
|
46
|
+
addEventListener(type: string, callback: Function | {
|
|
47
|
+
handleEvent: Function;
|
|
48
|
+
} | any, useCapture?: listenerOptions | boolean): void;
|
|
49
|
+
removeEventListener(type: string, callback: Function): void;
|
|
50
|
+
dispatchEvent(event: EventService, target?: EventTargetService): boolean;
|
|
51
|
+
}
|
|
52
|
+
export default EventTargetService;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
require('core-js/modules/esnext.iterator.constructor.js')
|
|
4
|
+
require('core-js/modules/esnext.iterator.filter.js')
|
|
5
|
+
require('core-js/modules/esnext.iterator.find.js')
|
|
6
|
+
require('core-js/modules/esnext.iterator.for-each.js')
|
|
7
|
+
const __importDefault = void 0 && (void 0).__importDefault || function (mod) {
|
|
8
|
+
return mod && mod.__esModule
|
|
9
|
+
? mod
|
|
10
|
+
: {
|
|
11
|
+
default: mod
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(exports, '__esModule', {
|
|
15
|
+
value: true
|
|
16
|
+
})
|
|
17
|
+
/**
|
|
18
|
+
* @file Substitute for the DOM EventTarget Class.
|
|
19
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
20
|
+
* @version 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
const EventService_1 = require('./EventService')
|
|
23
|
+
const PseudoEventListener_1 = __importDefault(require('../classes/PseudoEventListener'))
|
|
24
|
+
const LinkedList_1 = require('collect-your-stuff/dist/collections/linked-list/LinkedList')
|
|
25
|
+
/**
|
|
26
|
+
* Simulate the behaviour of the EventTarget Class when there is no DOM available.
|
|
27
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
28
|
+
* @class
|
|
29
|
+
* @property {Object.<string, Array.<PseudoEventListener>>} listeners
|
|
30
|
+
* @property {function} addEventListener
|
|
31
|
+
* @property {function} removeEventListener
|
|
32
|
+
* @property {function} dispatchEvent
|
|
33
|
+
*/
|
|
34
|
+
class EventTargetService {
|
|
35
|
+
/**
|
|
36
|
+
* @constructor
|
|
37
|
+
*/
|
|
38
|
+
constructor () {
|
|
39
|
+
this.listeners = {}
|
|
40
|
+
this.defaultEvent = {}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The listeners registered for a type of event, creating the (empty) list of them when there are none yet.
|
|
45
|
+
* @param {string} type
|
|
46
|
+
* @returns {LinkedList}
|
|
47
|
+
*/
|
|
48
|
+
listenersFor (type) {
|
|
49
|
+
if (!(type in this.listeners)) {
|
|
50
|
+
this.listeners[type] = new LinkedList_1.LinkedList()
|
|
51
|
+
}
|
|
52
|
+
return this.listeners[type]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Run each of the listeners registered on this target for the type of the event.
|
|
57
|
+
* Listeners which do not apply to the event's phase are skipped, running stops once immediate propagation is stopped,
|
|
58
|
+
* and listeners added or removed while running do not change which ones run for this event.
|
|
59
|
+
* @param {EventService} event
|
|
60
|
+
* @returns {*} true when there was nothing registered, otherwise the last value returned from a handler (null when none ran)
|
|
61
|
+
*/
|
|
62
|
+
runEvents (event) {
|
|
63
|
+
if (!(event.type in this.listeners)) {
|
|
64
|
+
return true
|
|
65
|
+
}
|
|
66
|
+
const listeners = this.listeners[event.type]
|
|
67
|
+
let eventReturn = null
|
|
68
|
+
// Work from a copy of the linkers so that removing a listener (for example a once listener) does not disturb the walk
|
|
69
|
+
for (const linker of Array.from(listeners)) {
|
|
70
|
+
const listener = linker.data
|
|
71
|
+
if (event.inner.immediatePropagationStopped) {
|
|
72
|
+
break
|
|
73
|
+
}
|
|
74
|
+
if (listener.rejectEvent(event)) {
|
|
75
|
+
continue
|
|
76
|
+
}
|
|
77
|
+
eventReturn = listener.handleEvent(event)
|
|
78
|
+
if (listener.once) {
|
|
79
|
+
listeners.remove(linker)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return eventReturn
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Register the function to run when nothing else has prevented the default for this type of event.
|
|
87
|
+
* @param {string} type
|
|
88
|
+
* @param {Function} callback
|
|
89
|
+
*/
|
|
90
|
+
setDefaultEvent (type, callback) {
|
|
91
|
+
this.listenersFor(type)
|
|
92
|
+
this.defaultEvent[type] = callback
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
runDefaultEvent (event) {
|
|
96
|
+
if (event.defaultPrevented) {
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
this.defaultEvent[event.type](event)
|
|
100
|
+
return true
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
startEvents (eventType) {
|
|
104
|
+
const event = new EventService_1.EventService(eventType)
|
|
105
|
+
event.inner.target = this;
|
|
106
|
+
[EventService_1.EventService.CAPTURING_PHASE, EventService_1.EventService.AT_TARGET, EventService_1.EventService.BUBBLING_PHASE].forEach(phase => {
|
|
107
|
+
let continueEvents = null
|
|
108
|
+
if (phase === EventService_1.EventService.AT_TARGET || !event.inner.propagationStopped) {
|
|
109
|
+
event.inner.eventPhase = phase
|
|
110
|
+
event.composedPath().forEach(target => {
|
|
111
|
+
event.inner.currentTarget = target
|
|
112
|
+
continueEvents = event.currentTarget.runEvents(event)
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
if (event.eventPhase === EventService_1.EventService.AT_TARGET && typeof continueEvents !== 'boolean' && this.defaultEvent[eventType]) {
|
|
116
|
+
this.runDefaultEvent(event)
|
|
117
|
+
}
|
|
118
|
+
})
|
|
119
|
+
return true
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
addEventListener (type, callback, useCapture = false) {
|
|
123
|
+
let options = {
|
|
124
|
+
capture: false,
|
|
125
|
+
once: false,
|
|
126
|
+
passive: false
|
|
127
|
+
}
|
|
128
|
+
if (typeof useCapture === 'object') {
|
|
129
|
+
// Originally useCapture was a single boolean flag, later optional other flags can be used
|
|
130
|
+
// Here we take all the given flags from the object and assign them as the options
|
|
131
|
+
options = Object.assign(options, useCapture)
|
|
132
|
+
} else {
|
|
133
|
+
options.capture = useCapture
|
|
134
|
+
}
|
|
135
|
+
const listener = new PseudoEventListener_1.default(type, options, (callback.handleEvent || callback).bind(this), callback)
|
|
136
|
+
const listeners = this.listenersFor(type)
|
|
137
|
+
// Listeners run in the order they were added, except that listeners which are not defaults always come before the defaults
|
|
138
|
+
const firstDefault = Array.from(listeners).find(linker => linker.data.isDefault)
|
|
139
|
+
if (firstDefault && !listener.isDefault) {
|
|
140
|
+
listeners.insertBefore(firstDefault, listener)
|
|
141
|
+
} else {
|
|
142
|
+
listeners.append(listener)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
removeEventListener (type, callback) {
|
|
147
|
+
if (!(type in this.listeners)) {
|
|
148
|
+
return
|
|
149
|
+
}
|
|
150
|
+
const listeners = this.listeners[type]
|
|
151
|
+
Array.from(listeners).filter(linker => !linker.data.isDefault && linker.data.callback === callback).forEach(linker => listeners.remove(linker))
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
dispatchEvent (event, target = this) {
|
|
155
|
+
event.inner.target = target
|
|
156
|
+
if (!(event.type in this.listeners)) {
|
|
157
|
+
return true
|
|
158
|
+
}
|
|
159
|
+
this.runEvents(event)
|
|
160
|
+
return !event.defaultPrevented
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.default = EventTargetService
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.for-each.js");var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const EventService_1=require("./EventService"),PseudoEventListener_1=__importDefault(require("../classes/PseudoEventListener")),LinkedList_1=require("collect-your-stuff/dist/collections/linked-list/LinkedList");class EventTargetService{constructor(){this.listeners={},this.defaultEvent={}}listenersFor(e){return e in this.listeners||(this.listeners[e]=new LinkedList_1.LinkedList),this.listeners[e]}runEvents(e){if(!(e.type in this.listeners))return!0;const t=this.listeners[e.type];let r=null;for(const n of Array.from(t)){const s=n.data;if(e.inner.immediatePropagationStopped)break;s.rejectEvent(e)||(r=s.handleEvent(e),s.once&&t.remove(n))}return r}setDefaultEvent(e,t){this.listenersFor(e),this.defaultEvent[e]=t}runDefaultEvent(e){return!e.defaultPrevented&&(this.defaultEvent[e.type](e),!0)}startEvents(e){const t=new EventService_1.EventService(e);return t.inner.target=this,[EventService_1.EventService.CAPTURING_PHASE,EventService_1.EventService.AT_TARGET,EventService_1.EventService.BUBBLING_PHASE].forEach(r=>{let n=null;r!==EventService_1.EventService.AT_TARGET&&t.inner.propagationStopped||(t.inner.eventPhase=r,t.composedPath().forEach(e=>{t.inner.currentTarget=e,n=t.currentTarget.runEvents(t)})),t.eventPhase===EventService_1.EventService.AT_TARGET&&"boolean"!=typeof n&&this.defaultEvent[e]&&this.runDefaultEvent(t)}),!0}addEventListener(e,t,r=!1){let n={capture:!1,once:!1,passive:!1};"object"==typeof r?n=Object.assign(n,r):n.capture=r;const s=new PseudoEventListener_1.default(e,n,(t.handleEvent||t).bind(this),t),i=this.listenersFor(e),o=Array.from(i).find(e=>e.data.isDefault);o&&!s.isDefault?i.insertBefore(o,s):i.append(s)}removeEventListener(e,t){if(!(e in this.listeners))return;const r=this.listeners[e];Array.from(r).filter(e=>!e.data.isDefault&&e.data.callback===t).forEach(e=>r.remove(e))}dispatchEvent(e,t=this){return e.inner.target=t,!(e.type in this.listeners)||(this.runEvents(e),!e.defaultPrevented)}}exports.default=EventTargetService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.HTMLCollectionService=void 0;class HTMLCollectionService{}exports.HTMLCollectionService=HTMLCollectionService;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Substitute for the DOM HTMLElement Class.
|
|
3
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import { PseudoHTMLElement } from '../interfaces/PseudoHTMLElement';
|
|
7
|
+
import { PseudoNode } from '../interfaces/PseudoNode';
|
|
8
|
+
import { ElementService } from './ElementService';
|
|
9
|
+
/**
|
|
10
|
+
* Simulate the behaviour of the HTMLElement Class when there is no DOM available.
|
|
11
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
12
|
+
* @class
|
|
13
|
+
* @augments PseudoElement
|
|
14
|
+
* @property {boolean} hidden - State of whether element is visible
|
|
15
|
+
* @property {number} offsetHeight - The height of the element as offset by the parent element
|
|
16
|
+
* @property {number} offsetLeft - The position of the left side of the element based on the parent element
|
|
17
|
+
* @property {PseudoHTMLElement} offsetParent - A reference to the closest positioned parent element
|
|
18
|
+
* @property {number} offsetTop - The position of the top side of the element based on the parent element
|
|
19
|
+
* @property {number} offsetWidth - The width of the element as offset by the parent element
|
|
20
|
+
* @property {Object} style - A container to define all applied inline-styles
|
|
21
|
+
* @property {string} title - The title attribute which affects the text visible on hover
|
|
22
|
+
*/
|
|
23
|
+
export declare class HTMLElementService extends ElementService implements Partial<PseudoHTMLElement> {
|
|
24
|
+
/**
|
|
25
|
+
* Simulate the HTMLElement object when the Dom is not available
|
|
26
|
+
* @param {Object} [elementOptions={}]
|
|
27
|
+
* @param {string} [elementOptions.tagName='']
|
|
28
|
+
* @param {PseudoNode|Object} [elementOptions.parent={}]
|
|
29
|
+
* @param {Array} [elementOptions.children=[]]
|
|
30
|
+
* @constructor
|
|
31
|
+
*/
|
|
32
|
+
constructor({ tagName, parent, children }?: {
|
|
33
|
+
tagName?: string;
|
|
34
|
+
parent?: PseudoNode | null;
|
|
35
|
+
children?: Array<any>;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', {
|
|
4
|
+
value: true
|
|
5
|
+
})
|
|
6
|
+
exports.HTMLElementService = void 0
|
|
7
|
+
const ElementService_1 = require('./ElementService')
|
|
8
|
+
/**
|
|
9
|
+
* Simulate the behaviour of the HTMLElement Class when there is no DOM available.
|
|
10
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
11
|
+
* @class
|
|
12
|
+
* @augments PseudoElement
|
|
13
|
+
* @property {boolean} hidden - State of whether element is visible
|
|
14
|
+
* @property {number} offsetHeight - The height of the element as offset by the parent element
|
|
15
|
+
* @property {number} offsetLeft - The position of the left side of the element based on the parent element
|
|
16
|
+
* @property {PseudoHTMLElement} offsetParent - A reference to the closest positioned parent element
|
|
17
|
+
* @property {number} offsetTop - The position of the top side of the element based on the parent element
|
|
18
|
+
* @property {number} offsetWidth - The width of the element as offset by the parent element
|
|
19
|
+
* @property {Object} style - A container to define all applied inline-styles
|
|
20
|
+
* @property {string} title - The title attribute which affects the text visible on hover
|
|
21
|
+
*/
|
|
22
|
+
class HTMLElementService extends ElementService_1.ElementService {
|
|
23
|
+
/**
|
|
24
|
+
* Simulate the HTMLElement object when the Dom is not available
|
|
25
|
+
* @param {Object} [elementOptions={}]
|
|
26
|
+
* @param {string} [elementOptions.tagName='']
|
|
27
|
+
* @param {PseudoNode|Object} [elementOptions.parent={}]
|
|
28
|
+
* @param {Array} [elementOptions.children=[]]
|
|
29
|
+
* @constructor
|
|
30
|
+
*/
|
|
31
|
+
constructor ({
|
|
32
|
+
tagName = '',
|
|
33
|
+
parent = null,
|
|
34
|
+
children = []
|
|
35
|
+
} = {}) {
|
|
36
|
+
super({
|
|
37
|
+
tagName,
|
|
38
|
+
attributes: [{
|
|
39
|
+
name: 'hidden',
|
|
40
|
+
value: false
|
|
41
|
+
}, {
|
|
42
|
+
name: 'offsetHeight',
|
|
43
|
+
value: 0
|
|
44
|
+
}, {
|
|
45
|
+
name: 'offsetLeft',
|
|
46
|
+
value: 0
|
|
47
|
+
}, {
|
|
48
|
+
name: 'offsetParent',
|
|
49
|
+
value: null
|
|
50
|
+
}, {
|
|
51
|
+
name: 'offsetTop',
|
|
52
|
+
value: 0
|
|
53
|
+
}, {
|
|
54
|
+
name: 'offsetWidth',
|
|
55
|
+
value: 0
|
|
56
|
+
}, {
|
|
57
|
+
name: 'style',
|
|
58
|
+
value: {}
|
|
59
|
+
}, {
|
|
60
|
+
name: 'title',
|
|
61
|
+
value: ''
|
|
62
|
+
}],
|
|
63
|
+
parent,
|
|
64
|
+
children
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.HTMLElementService = HTMLElementService
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.HTMLElementService=void 0;const ElementService_1=require("./ElementService");class HTMLElementService extends ElementService_1.ElementService{constructor({tagName:e="",parent:t=null,children:n=[]}={}){super({tagName:e,attributes:[{name:"hidden",value:!1},{name:"offsetHeight",value:0},{name:"offsetLeft",value:0},{name:"offsetParent",value:null},{name:"offsetTop",value:0},{name:"offsetWidth",value:0},{name:"style",value:{}},{name:"title",value:""}],parent:t,children:n})}}exports.HTMLElementService=HTMLElementService;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', {
|
|
4
|
+
value: true
|
|
5
|
+
})
|
|
6
|
+
exports.HTMLSlotElementService = void 0
|
|
7
|
+
const HTMLElementService_1 = require('./HTMLElementService')
|
|
8
|
+
class HTMLSlotElementService extends HTMLElementService_1.HTMLElementService {}
|
|
9
|
+
exports.HTMLSlotElementService = HTMLSlotElementService
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.HTMLSlotElementService=void 0;const HTMLElementService_1=require("./HTMLElementService");class HTMLSlotElementService extends HTMLElementService_1.HTMLElementService{}exports.HTMLSlotElementService=HTMLSlotElementService;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PseudoNamedNodeMap } from '../interfaces/PseudoNamedNodeMap';
|
|
2
|
+
import { PseudoAttr } from '../interfaces/PseudoAttr';
|
|
3
|
+
/**
|
|
4
|
+
* Simulate the behaviour of the NamedNodeMap Class when there is no DOM available.
|
|
5
|
+
* @author Joshua Heagle <joshuaheagle@gmail.com>
|
|
6
|
+
* @class
|
|
7
|
+
*/
|
|
8
|
+
export declare class NamedNodeMapService implements PseudoNamedNodeMap {
|
|
9
|
+
private attributes;
|
|
10
|
+
/**
|
|
11
|
+
* @param {Array<PseudoAttr>} [attributes=[]] The attributes to start with
|
|
12
|
+
* @constructor
|
|
13
|
+
*/
|
|
14
|
+
constructor(attributes?: Array<PseudoAttr>);
|
|
15
|
+
get length(): number;
|
|
16
|
+
getNamedItem(name: string): PseudoAttr | null;
|
|
17
|
+
setNamedItem(attr: PseudoAttr): PseudoAttr | null;
|
|
18
|
+
removeNamedItem(attrName: string): PseudoAttr;
|
|
19
|
+
item(index: number): PseudoAttr | null;
|
|
20
|
+
getNamedItemNS(namespace: string, localName: string): PseudoAttr | null;
|
|
21
|
+
setNamedItemNS(attr: PseudoAttr): PseudoAttr | null;
|
|
22
|
+
removeNamedItemNS(namespace: string, localName: string): PseudoAttr;
|
|
23
|
+
}
|