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.
Files changed (125) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +1029 -0
  3. package/browser/pseudo-dom.js +5219 -0
  4. package/browser/pseudo-dom.min.js +1 -0
  5. package/dist/classes/PseudoEventListener.d.ts +96 -0
  6. package/dist/classes/PseudoEventListener.js +148 -0
  7. package/dist/classes/PseudoEventListener.min.js +1 -0
  8. package/dist/classes/PseudoHTMLDocument.d.ts +35 -0
  9. package/dist/classes/PseudoHTMLDocument.js +77 -0
  10. package/dist/classes/PseudoHTMLDocument.min.js +1 -0
  11. package/dist/classes/PseudoNodeList.d.ts +34 -0
  12. package/dist/classes/PseudoNodeList.js +65 -0
  13. package/dist/classes/PseudoNodeList.min.js +1 -0
  14. package/dist/classes.d.ts +20 -0
  15. package/dist/classes.js +31 -0
  16. package/dist/classes.min.js +1 -0
  17. package/dist/factories/generateDocument.d.ts +11 -0
  18. package/dist/factories/generateDocument.js +65 -0
  19. package/dist/factories/generateDocument.min.js +1 -0
  20. package/dist/factories/generateNode.d.ts +40 -0
  21. package/dist/factories/generateNode.js +118 -0
  22. package/dist/factories/generateNode.min.js +1 -0
  23. package/dist/factories/generateNodeList.d.ts +9 -0
  24. package/dist/factories/generateNodeList.js +13 -0
  25. package/dist/factories/generateNodeList.min.js +1 -0
  26. package/dist/factories.d.ts +5 -0
  27. package/dist/factories.js +23 -0
  28. package/dist/factories.min.js +1 -0
  29. package/dist/functions/getParentNodes.d.ts +9 -0
  30. package/dist/functions/getParentNodes.js +15 -0
  31. package/dist/functions/getParentNodes.min.js +1 -0
  32. package/dist/functions/getParentNodesFromAttribute.d.ts +14 -0
  33. package/dist/functions/getParentNodesFromAttribute.js +9 -0
  34. package/dist/functions/getParentNodesFromAttribute.min.js +1 -0
  35. package/dist/functions.d.ts +5 -0
  36. package/dist/functions.js +23 -0
  37. package/dist/functions.min.js +1 -0
  38. package/dist/interfaces/PseudoAnimation.d.ts +3 -0
  39. package/dist/interfaces/PseudoAnimation.js +5 -0
  40. package/dist/interfaces/PseudoAnimation.min.js +1 -0
  41. package/dist/interfaces/PseudoAttr.d.ts +11 -0
  42. package/dist/interfaces/PseudoAttr.js +5 -0
  43. package/dist/interfaces/PseudoAttr.min.js +1 -0
  44. package/dist/interfaces/PseudoDOMTokenList.d.ts +16 -0
  45. package/dist/interfaces/PseudoDOMTokenList.js +5 -0
  46. package/dist/interfaces/PseudoDOMTokenList.min.js +1 -0
  47. package/dist/interfaces/PseudoDocument.d.ts +3 -0
  48. package/dist/interfaces/PseudoDocument.js +5 -0
  49. package/dist/interfaces/PseudoDocument.min.js +1 -0
  50. package/dist/interfaces/PseudoDocumentFragment.d.ts +3 -0
  51. package/dist/interfaces/PseudoDocumentFragment.js +5 -0
  52. package/dist/interfaces/PseudoDocumentFragment.min.js +1 -0
  53. package/dist/interfaces/PseudoElement.d.ts +678 -0
  54. package/dist/interfaces/PseudoElement.js +5 -0
  55. package/dist/interfaces/PseudoElement.min.js +1 -0
  56. package/dist/interfaces/PseudoEvent.d.ts +79 -0
  57. package/dist/interfaces/PseudoEvent.js +10 -0
  58. package/dist/interfaces/PseudoEvent.min.js +1 -0
  59. package/dist/interfaces/PseudoEventTarget.d.ts +46 -0
  60. package/dist/interfaces/PseudoEventTarget.js +5 -0
  61. package/dist/interfaces/PseudoEventTarget.min.js +1 -0
  62. package/dist/interfaces/PseudoHTMLCollection.d.ts +2 -0
  63. package/dist/interfaces/PseudoHTMLCollection.js +5 -0
  64. package/dist/interfaces/PseudoHTMLCollection.min.js +1 -0
  65. package/dist/interfaces/PseudoHTMLElement.d.ts +22 -0
  66. package/dist/interfaces/PseudoHTMLElement.js +5 -0
  67. package/dist/interfaces/PseudoHTMLElement.min.js +1 -0
  68. package/dist/interfaces/PseudoHTMLSlotElement.d.ts +3 -0
  69. package/dist/interfaces/PseudoHTMLSlotElement.js +5 -0
  70. package/dist/interfaces/PseudoHTMLSlotElement.min.js +1 -0
  71. package/dist/interfaces/PseudoNamedNodeMap.d.ts +11 -0
  72. package/dist/interfaces/PseudoNamedNodeMap.js +5 -0
  73. package/dist/interfaces/PseudoNamedNodeMap.min.js +1 -0
  74. package/dist/interfaces/PseudoNode.d.ts +179 -0
  75. package/dist/interfaces/PseudoNode.js +5 -0
  76. package/dist/interfaces/PseudoNode.min.js +1 -0
  77. package/dist/interfaces/PseudoShadowRoot.d.ts +3 -0
  78. package/dist/interfaces/PseudoShadowRoot.js +5 -0
  79. package/dist/interfaces/PseudoShadowRoot.min.js +1 -0
  80. package/dist/main.d.ts +29 -0
  81. package/dist/main.js +75 -0
  82. package/dist/main.min.js +1 -0
  83. package/dist/services/AnimationService.d.ts +4 -0
  84. package/dist/services/AnimationService.js +16 -0
  85. package/dist/services/AnimationService.min.js +1 -0
  86. package/dist/services/AttrService.d.ts +31 -0
  87. package/dist/services/AttrService.js +57 -0
  88. package/dist/services/AttrService.min.js +1 -0
  89. package/dist/services/DOMTokenListService.d.ts +33 -0
  90. package/dist/services/DOMTokenListService.js +117 -0
  91. package/dist/services/DOMTokenListService.min.js +1 -0
  92. package/dist/services/DocumentFragmentService.d.ts +4 -0
  93. package/dist/services/DocumentFragmentService.js +9 -0
  94. package/dist/services/DocumentFragmentService.min.js +1 -0
  95. package/dist/services/DocumentService.d.ts +4 -0
  96. package/dist/services/DocumentService.js +9 -0
  97. package/dist/services/DocumentService.min.js +1 -0
  98. package/dist/services/ElementService.d.ts +95 -0
  99. package/dist/services/ElementService.js +205 -0
  100. package/dist/services/ElementService.min.js +1 -0
  101. package/dist/services/EventService.d.ts +106 -0
  102. package/dist/services/EventService.js +216 -0
  103. package/dist/services/EventService.min.js +1 -0
  104. package/dist/services/EventTargetService.d.ts +52 -0
  105. package/dist/services/EventTargetService.js +163 -0
  106. package/dist/services/EventTargetService.min.js +1 -0
  107. package/dist/services/HTMLCollectionService.d.ts +3 -0
  108. package/dist/services/HTMLCollectionService.js +8 -0
  109. package/dist/services/HTMLCollectionService.min.js +1 -0
  110. package/dist/services/HTMLElementService.d.ts +37 -0
  111. package/dist/services/HTMLElementService.js +68 -0
  112. package/dist/services/HTMLElementService.min.js +1 -0
  113. package/dist/services/HTMLSlotElementService.d.ts +4 -0
  114. package/dist/services/HTMLSlotElementService.js +9 -0
  115. package/dist/services/HTMLSlotElementService.min.js +1 -0
  116. package/dist/services/NamedNodeMapService.d.ts +23 -0
  117. package/dist/services/NamedNodeMapService.js +77 -0
  118. package/dist/services/NamedNodeMapService.min.js +1 -0
  119. package/dist/services/NodeService.d.ts +111 -0
  120. package/dist/services/NodeService.js +230 -0
  121. package/dist/services/NodeService.min.js +1 -0
  122. package/dist/services/ShadowRootService.d.ts +4 -0
  123. package/dist/services/ShadowRootService.js +9 -0
  124. package/dist/services/ShadowRootService.min.js +1 -0
  125. 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,3 @@
1
+ import { PseudoHTMLCollection } from '../interfaces/PseudoHTMLCollection';
2
+ export declare class HTMLCollectionService implements PseudoHTMLCollection {
3
+ }
@@ -0,0 +1,8 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.HTMLCollectionService = void 0
7
+ class HTMLCollectionService {}
8
+ exports.HTMLCollectionService = HTMLCollectionService
@@ -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,4 @@
1
+ import { PseudoHTMLSlotElement } from '../interfaces/PseudoHTMLSlotElement';
2
+ import { HTMLElementService } from './HTMLElementService';
3
+ export declare class HTMLSlotElementService extends HTMLElementService implements Partial<PseudoHTMLSlotElement> {
4
+ }
@@ -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
+ }