pseudo-dom 0.2.0 → 0.4.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 (62) hide show
  1. package/README.md +903 -43
  2. package/browser/pseudo-dom.js +1489 -376
  3. package/browser/pseudo-dom.min.js +1 -1
  4. package/dist/classes/PseudoEventListener.d.ts +25 -25
  5. package/dist/classes/PseudoEventListener.js +37 -34
  6. package/dist/classes/PseudoEventListener.min.js +1 -1
  7. package/dist/factories/createEvent.d.ts +28 -0
  8. package/dist/factories/createEvent.js +56 -0
  9. package/dist/factories/createEvent.min.js +1 -0
  10. package/dist/factories/eventDefaults.d.ts +31 -0
  11. package/dist/factories/eventDefaults.js +105 -0
  12. package/dist/factories/eventDefaults.min.js +1 -0
  13. package/dist/factories.d.ts +6 -0
  14. package/dist/factories.js +5 -1
  15. package/dist/factories.min.js +1 -1
  16. package/dist/functions/activeElement.d.ts +14 -0
  17. package/dist/functions/activeElement.js +33 -0
  18. package/dist/functions/activeElement.min.js +1 -0
  19. package/dist/functions/modifierState.d.ts +29 -0
  20. package/dist/functions/modifierState.js +41 -0
  21. package/dist/functions/modifierState.min.js +1 -0
  22. package/dist/interfaces/PseudoEventTarget.d.ts +2 -2
  23. package/dist/main.d.ts +32 -1
  24. package/dist/main.js +66 -1
  25. package/dist/main.min.js +1 -1
  26. package/dist/services/CustomEventService.d.ts +37 -0
  27. package/dist/services/CustomEventService.js +35 -0
  28. package/dist/services/CustomEventService.min.js +1 -0
  29. package/dist/services/ElementService.d.ts +1 -0
  30. package/dist/services/ElementService.js +17 -10
  31. package/dist/services/ElementService.min.js +1 -1
  32. package/dist/services/EventService.d.ts +18 -4
  33. package/dist/services/EventService.js +65 -31
  34. package/dist/services/EventService.min.js +1 -1
  35. package/dist/services/EventTargetService.d.ts +41 -9
  36. package/dist/services/EventTargetService.js +121 -52
  37. package/dist/services/EventTargetService.min.js +1 -1
  38. package/dist/services/FocusEventService.d.ts +32 -0
  39. package/dist/services/FocusEventService.js +35 -0
  40. package/dist/services/FocusEventService.min.js +1 -0
  41. package/dist/services/HTMLElementService.d.ts +20 -0
  42. package/dist/services/HTMLElementService.js +95 -0
  43. package/dist/services/HTMLElementService.min.js +1 -1
  44. package/dist/services/InputEventService.d.ts +41 -0
  45. package/dist/services/InputEventService.js +47 -0
  46. package/dist/services/InputEventService.min.js +1 -0
  47. package/dist/services/KeyboardEventService.d.ts +70 -0
  48. package/dist/services/KeyboardEventService.js +86 -0
  49. package/dist/services/KeyboardEventService.min.js +1 -0
  50. package/dist/services/MouseEventService.d.ts +80 -0
  51. package/dist/services/MouseEventService.js +108 -0
  52. package/dist/services/MouseEventService.min.js +1 -0
  53. package/dist/services/PointerEventService.d.ts +51 -0
  54. package/dist/services/PointerEventService.js +67 -0
  55. package/dist/services/PointerEventService.min.js +1 -0
  56. package/dist/services/UIEventService.d.ts +43 -0
  57. package/dist/services/UIEventService.js +42 -0
  58. package/dist/services/UIEventService.min.js +1 -0
  59. package/dist/simulate.d.ts +32 -0
  60. package/dist/simulate.js +115 -0
  61. package/dist/simulate.min.js +1 -0
  62. package/package.json +1 -1
@@ -18,6 +18,13 @@ const EventService_1 = require('../services/EventService')
18
18
  * @property {boolean} isDefault
19
19
  */
20
20
  class PseudoEventListener {
21
+ /**
22
+ * @param {string} eventType The type of event this listens for
23
+ * @param {Object} [options] The capture, once and passive options
24
+ * @param {Function} handleEvent The function which is called with the event, already bound to what it should run as
25
+ * @param {Function} [originalCallback=handleEvent] The function (or object) which was given when registering, used to find this listener again
26
+ * @constructor
27
+ */
21
28
  constructor (eventType, {
22
29
  capture = false,
23
30
  once = false,
@@ -30,6 +37,7 @@ class PseudoEventListener {
30
37
  }
31
38
  this.eventType = ''
32
39
  this.defaultListener = false
40
+ this.isRemoved = false
33
41
  this.eventOptions = {
34
42
  capture,
35
43
  once,
@@ -47,6 +55,11 @@ class PseudoEventListener {
47
55
  return this.originalCallback
48
56
  }
49
57
 
58
+ /** Whether this listener listens in the capture phase (and at the target) rather than in the bubble phase. */
59
+ get capture () {
60
+ return this.eventOptions.capture
61
+ }
62
+
50
63
  get isDefault () {
51
64
  return this.defaultListener
52
65
  }
@@ -55,6 +68,20 @@ class PseudoEventListener {
55
68
  return this.eventOptions.once
56
69
  }
57
70
 
71
+ /** Whether the listener promises not to prevent the default (preventDefault does nothing while it runs). */
72
+ get passive () {
73
+ return this.eventOptions.passive
74
+ }
75
+
76
+ /** Whether this listener has been removed, a removed listener does not run even if the event already started. */
77
+ get removed () {
78
+ return this.isRemoved
79
+ }
80
+
81
+ set removed (removed) {
82
+ this.isRemoved = removed
83
+ }
84
+
58
85
  /**
59
86
  * @method
60
87
  * @name PseudoEventListener#handleEvent
@@ -66,6 +93,7 @@ class PseudoEventListener {
66
93
  }
67
94
 
68
95
  /**
96
+ * A capture listener runs while the event travels down to the target.
69
97
  * @method
70
98
  * @name PseudoEventListener#doCapturePhase
71
99
  * @param {PseudoEvent} event
@@ -76,6 +104,7 @@ class PseudoEventListener {
76
104
  }
77
105
 
78
106
  /**
107
+ * Every listener of the target itself runs, capture listeners first.
79
108
  * @method
80
109
  * @name PseudoEventListener#doTargetPhase
81
110
  * @param {PseudoEvent} event
@@ -86,13 +115,14 @@ class PseudoEventListener {
86
115
  }
87
116
 
88
117
  /**
118
+ * A listener which is not a capture listener runs while the event travels back up (when it bubbles).
89
119
  * @method
90
120
  * @name PseudoEventListener#doBubblePhase
91
121
  * @param {PseudoEvent} event
92
- * @returns {boolean|*}
122
+ * @returns {boolean}
93
123
  */
94
124
  doBubblePhase (event) {
95
- return event.eventPhase === EventService_1.EventService.BUBBLING_PHASE && (event.bubbles || !this.eventOptions.capture)
125
+ return event.eventPhase === EventService_1.EventService.BUBBLING_PHASE && !this.eventOptions.capture
96
126
  }
97
127
 
98
128
  /**
@@ -106,43 +136,16 @@ class PseudoEventListener {
106
136
  }
107
137
 
108
138
  /**
109
- * @method
110
- * @name PseudoEventListener#skipDefault
111
- * @param {PseudoEvent} event
112
- * @returns {boolean|*}
113
- */
114
- skipDefault (event) {
115
- return this.isDefault && event.defaultPrevented
116
- }
117
-
118
- /**
119
- * @method
120
- * @name PseudoEventListener#stopPropagation
121
- * @param {PseudoEvent} event
122
- * @returns {boolean}
123
- */
124
- stopPropagation (event) {
125
- return !this.doTargetPhase(event) && event.inner.propagationStopped
126
- }
127
-
128
- /**
129
- * @method
130
- * @name PseudoEventListener#nonPassiveHalt
131
- * @param {PseudoEvent} event
132
- * @returns {boolean|*}
133
- */
134
- nonPassiveHalt (event) {
135
- return !this.eventOptions.passive && (this.skipDefault(event) || event.inner.immediatePropagationStopped || this.stopPropagation(event))
136
- }
137
-
138
- /**
139
+ * Whether this listener should not run for the event as it is now (it was removed, or it is for another phase).
140
+ * Stopping propagation is handled by the dispatching, since it stops other targets and not the listeners of the
141
+ * current one.
139
142
  * @method
140
143
  * @name PseudoEventListener#rejectEvent
141
144
  * @param {PseudoEvent} event
142
- * @returns {*|boolean}
145
+ * @returns {boolean}
143
146
  */
144
147
  rejectEvent (event) {
145
- return this.nonPassiveHalt(event) || this.skipPhase(event)
148
+ return this.isRemoved || this.skipPhase(event)
146
149
  }
147
150
  }
148
151
  exports.default = PseudoEventListener
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const EventService_1=require("../services/EventService");class PseudoEventListener{constructor(e,{capture:t=!1,once:s=!1,passive:n=!1}={},i,r=i){this.eventOptions={capture:!1,once:!1,passive:!1},this.eventType="",this.defaultListener=!1,this.eventOptions={capture:t,once:s,passive:n},this.eventType=e,this.handler=i,this.originalCallback=r}get callback(){return this.originalCallback}get isDefault(){return this.defaultListener}get once(){return this.eventOptions.once}handleEvent(e){return this.handler(e)}doCapturePhase(e){return e.eventPhase===EventService_1.EventService.CAPTURING_PHASE&&this.eventOptions.capture}doTargetPhase(e){return e.eventPhase===EventService_1.EventService.AT_TARGET}doBubblePhase(e){return e.eventPhase===EventService_1.EventService.BUBBLING_PHASE&&(e.bubbles||!this.eventOptions.capture)}skipPhase(e){return!this.doCapturePhase(e)&&!this.doTargetPhase(e)&&!this.doBubblePhase(e)}skipDefault(e){return this.isDefault&&e.defaultPrevented}stopPropagation(e){return!this.doTargetPhase(e)&&e.inner.propagationStopped}nonPassiveHalt(e){return!this.eventOptions.passive&&(this.skipDefault(e)||e.inner.immediatePropagationStopped||this.stopPropagation(e))}rejectEvent(e){return this.nonPassiveHalt(e)||this.skipPhase(e)}}exports.default=PseudoEventListener;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const EventService_1=require("../services/EventService");class PseudoEventListener{constructor(e,{capture:t=!1,once:s=!1,passive:r=!1}={},i,n=i){this.eventOptions={capture:!1,once:!1,passive:!1},this.eventType="",this.defaultListener=!1,this.isRemoved=!1,this.eventOptions={capture:t,once:s,passive:r},this.eventType=e,this.handler=i,this.originalCallback=n}get callback(){return this.originalCallback}get capture(){return this.eventOptions.capture}get isDefault(){return this.defaultListener}get once(){return this.eventOptions.once}get passive(){return this.eventOptions.passive}get removed(){return this.isRemoved}set removed(e){this.isRemoved=e}handleEvent(e){return this.handler(e)}doCapturePhase(e){return e.eventPhase===EventService_1.EventService.CAPTURING_PHASE&&this.eventOptions.capture}doTargetPhase(e){return e.eventPhase===EventService_1.EventService.AT_TARGET}doBubblePhase(e){return e.eventPhase===EventService_1.EventService.BUBBLING_PHASE&&!this.eventOptions.capture}skipPhase(e){return!this.doCapturePhase(e)&&!this.doTargetPhase(e)&&!this.doBubblePhase(e)}rejectEvent(e){return this.isRemoved||this.skipPhase(e)}}exports.default=PseudoEventListener;
@@ -0,0 +1,28 @@
1
+ import { EventService } from '../services/EventService';
2
+ /**
3
+ * How the event is being created.
4
+ * @typedef {Object} CreateEventOptions
5
+ * @property {boolean} [browser=false] The browser is creating the event (for a user action, or for something like
6
+ * element.click()), so the standard options for the type of event apply where the init does not give its own
7
+ * @property {boolean} [trusted=false] The event comes from a real user action rather than from a script (isTrusted)
8
+ */
9
+ export type CreateEventOptions = {
10
+ browser?: boolean;
11
+ trusted?: boolean;
12
+ };
13
+ /**
14
+ * Create an event of the kind which suits its type (a click is a MouseEvent, a keydown a KeyboardEvent, ...).
15
+ * By default this is like using the constructor of the event in a script: nothing bubbles or can be cancelled unless
16
+ * the init says so, and the event is not trusted. With browser: true the event is created the way the browser creates
17
+ * it, using the standard options for its type (see eventDefaults), and trusted: true makes it look like it came from a
18
+ * real user action (isTrusted).
19
+ * @function createEvent
20
+ * @param {string} type The type of the event, such as click
21
+ * @param {Object} [init={}] The options for the event (bubbles, cancelable, composed and those of its kind of event)
22
+ * @param {CreateEventOptions} [options={}] Whether the browser is creating the event, and whether it is trusted
23
+ * @returns {EventService}
24
+ */
25
+ export declare const createEvent: (type: string, init?: {
26
+ [option: string]: any;
27
+ }, { browser, trusted }?: CreateEventOptions) => EventService;
28
+ export default createEvent;
@@ -0,0 +1,56 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.createEvent = void 0
7
+ const EventService_1 = require('../services/EventService')
8
+ const UIEventService_1 = require('../services/UIEventService')
9
+ const MouseEventService_1 = require('../services/MouseEventService')
10
+ const PointerEventService_1 = require('../services/PointerEventService')
11
+ const KeyboardEventService_1 = require('../services/KeyboardEventService')
12
+ const FocusEventService_1 = require('../services/FocusEventService')
13
+ const InputEventService_1 = require('../services/InputEventService')
14
+ const CustomEventService_1 = require('../services/CustomEventService')
15
+ const eventDefaults_1 = require('./eventDefaults')
16
+ const eventClasses = {
17
+ Event: EventService_1.EventService,
18
+ UIEvent: UIEventService_1.UIEventService,
19
+ MouseEvent: MouseEventService_1.MouseEventService,
20
+ PointerEvent: PointerEventService_1.PointerEventService,
21
+ KeyboardEvent: KeyboardEventService_1.KeyboardEventService,
22
+ FocusEvent: FocusEventService_1.FocusEventService,
23
+ InputEvent: InputEventService_1.InputEventService,
24
+ CustomEvent: CustomEventService_1.CustomEventService
25
+ }
26
+ /**
27
+ * Create an event of the kind which suits its type (a click is a MouseEvent, a keydown a KeyboardEvent, ...).
28
+ * By default this is like using the constructor of the event in a script: nothing bubbles or can be cancelled unless
29
+ * the init says so, and the event is not trusted. With browser: true the event is created the way the browser creates
30
+ * it, using the standard options for its type (see eventDefaults), and trusted: true makes it look like it came from a
31
+ * real user action (isTrusted).
32
+ * @function createEvent
33
+ * @param {string} type The type of the event, such as click
34
+ * @param {Object} [init={}] The options for the event (bubbles, cancelable, composed and those of its kind of event)
35
+ * @param {CreateEventOptions} [options={}] Whether the browser is creating the event, and whether it is trusted
36
+ * @returns {EventService}
37
+ */
38
+ const createEvent = (type, init = {}, {
39
+ browser = false,
40
+ trusted = false
41
+ } = {}) => {
42
+ const definition = eventDefaults_1.eventDefaults[type]
43
+ const options = browser && definition
44
+ ? Object.assign({
45
+ bubbles: definition.bubbles,
46
+ cancelable: definition.cancelable,
47
+ composed: definition.composed
48
+ }, init)
49
+ : init
50
+ const EventClass = eventClasses[definition ? definition.interface : 'Event']
51
+ const event = new EventClass(type, options)
52
+ event.inner.trusted = trusted
53
+ return event
54
+ }
55
+ exports.createEvent = createEvent
56
+ exports.default = exports.createEvent
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createEvent=void 0;const EventService_1=require("../services/EventService"),UIEventService_1=require("../services/UIEventService"),MouseEventService_1=require("../services/MouseEventService"),PointerEventService_1=require("../services/PointerEventService"),KeyboardEventService_1=require("../services/KeyboardEventService"),FocusEventService_1=require("../services/FocusEventService"),InputEventService_1=require("../services/InputEventService"),CustomEventService_1=require("../services/CustomEventService"),eventDefaults_1=require("./eventDefaults"),eventClasses={Event:EventService_1.EventService,UIEvent:UIEventService_1.UIEventService,MouseEvent:MouseEventService_1.MouseEventService,PointerEvent:PointerEventService_1.PointerEventService,KeyboardEvent:KeyboardEventService_1.KeyboardEventService,FocusEvent:FocusEventService_1.FocusEventService,InputEvent:InputEventService_1.InputEventService,CustomEvent:CustomEventService_1.CustomEventService},createEvent=(e,t={},{browser:v=!1,trusted:r=!1}={})=>{const n=eventDefaults_1.eventDefaults[e],c=v&&n?Object.assign({bubbles:n.bubbles,cancelable:n.cancelable,composed:n.composed},t):t,i=new(0,eventClasses[n?n.interface:"Event"])(e,c);return i.inner.trusted=r,i};exports.createEvent=createEvent,exports.default=exports.createEvent;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @file The standard event types of the browser, and how the browser creates them.
3
+ * @author Joshua Heagle <joshuaheagle@gmail.com>
4
+ * @version 1.0.0
5
+ */
6
+ /**
7
+ * How the browser creates an event of a standard type: whether it bubbles, whether it can be cancelled, whether it
8
+ * crosses the boundary of a shadow tree, and which kind of event object it is.
9
+ * @typedef {Object} EventDefinition
10
+ * @property {boolean} bubbles - After the target, the event goes back up through the ancestors (the capture phase, going down, always happens)
11
+ * @property {boolean} cancelable - preventDefault() can stop the default action
12
+ * @property {boolean} composed - The event crosses the boundary of a shadow tree
13
+ * @property {string} interface - The kind of event object: Event, UIEvent, MouseEvent, PointerEvent, KeyboardEvent, FocusEvent, InputEvent or CustomEvent
14
+ */
15
+ export type EventDefinition = {
16
+ bubbles: boolean;
17
+ cancelable: boolean;
18
+ composed: boolean;
19
+ interface: 'Event' | 'UIEvent' | 'MouseEvent' | 'PointerEvent' | 'KeyboardEvent' | 'FocusEvent' | 'InputEvent' | 'CustomEvent';
20
+ };
21
+ /**
22
+ * The events which the browser itself creates (for a user action, or for something like element.click()) have these
23
+ * options. A script which creates an event with the constructor gets none of them (everything is false) unless it asks
24
+ * for them, which is why createEvent only uses this table when it is told the browser is creating the event.
25
+ * The values follow the UI Events, HTML, Pointer Events, Clipboard, Drag and Drop, Touch and CSS specifications.
26
+ * @type {Object.<string, EventDefinition>}
27
+ */
28
+ export declare const eventDefaults: {
29
+ [type: string]: EventDefinition;
30
+ };
31
+ export default eventDefaults;
@@ -0,0 +1,105 @@
1
+ 'use strict'
2
+
3
+ /**
4
+ * @file The standard event types of the browser, and how the browser creates them.
5
+ * @author Joshua Heagle <joshuaheagle@gmail.com>
6
+ * @version 1.0.0
7
+ */
8
+ Object.defineProperty(exports, '__esModule', {
9
+ value: true
10
+ })
11
+ exports.eventDefaults = void 0
12
+ const define = (bubbles, cancelable, composed, eventInterface = 'Event') => ({
13
+ bubbles,
14
+ cancelable,
15
+ composed,
16
+ interface: eventInterface
17
+ })
18
+ /**
19
+ * The events which the browser itself creates (for a user action, or for something like element.click()) have these
20
+ * options. A script which creates an event with the constructor gets none of them (everything is false) unless it asks
21
+ * for them, which is why createEvent only uses this table when it is told the browser is creating the event.
22
+ * The values follow the UI Events, HTML, Pointer Events, Clipboard, Drag and Drop, Touch and CSS specifications.
23
+ * @type {Object.<string, EventDefinition>}
24
+ */
25
+ exports.eventDefaults = {
26
+ // Mouse (UI Events)
27
+ click: define(true, true, true, 'MouseEvent'),
28
+ auxclick: define(true, true, true, 'MouseEvent'),
29
+ dblclick: define(true, true, true, 'MouseEvent'),
30
+ contextmenu: define(true, true, true, 'MouseEvent'),
31
+ mousedown: define(true, true, true, 'MouseEvent'),
32
+ mouseup: define(true, true, true, 'MouseEvent'),
33
+ mousemove: define(true, true, true, 'MouseEvent'),
34
+ mouseover: define(true, true, true, 'MouseEvent'),
35
+ mouseout: define(true, true, true, 'MouseEvent'),
36
+ mouseenter: define(false, false, true, 'MouseEvent'),
37
+ mouseleave: define(false, false, true, 'MouseEvent'),
38
+ wheel: define(true, true, true, 'MouseEvent'),
39
+ // Pointer (Pointer Events)
40
+ pointerdown: define(true, true, true, 'PointerEvent'),
41
+ pointerup: define(true, true, true, 'PointerEvent'),
42
+ pointermove: define(true, true, true, 'PointerEvent'),
43
+ pointerover: define(true, true, true, 'PointerEvent'),
44
+ pointerout: define(true, true, true, 'PointerEvent'),
45
+ pointerenter: define(false, false, true, 'PointerEvent'),
46
+ pointerleave: define(false, false, true, 'PointerEvent'),
47
+ pointercancel: define(true, false, true, 'PointerEvent'),
48
+ gotpointercapture: define(true, false, true, 'PointerEvent'),
49
+ lostpointercapture: define(true, false, true, 'PointerEvent'),
50
+ // Keyboard (UI Events)
51
+ keydown: define(true, true, true, 'KeyboardEvent'),
52
+ keypress: define(true, true, true, 'KeyboardEvent'),
53
+ keyup: define(true, true, true, 'KeyboardEvent'),
54
+ // Focus (UI Events): focus and blur do not bubble, focusin and focusout do
55
+ focus: define(false, false, true, 'FocusEvent'),
56
+ blur: define(false, false, true, 'FocusEvent'),
57
+ focusin: define(true, false, true, 'FocusEvent'),
58
+ focusout: define(true, false, true, 'FocusEvent'),
59
+ // Forms (HTML, Input Events)
60
+ beforeinput: define(true, true, true, 'InputEvent'),
61
+ input: define(true, false, true, 'InputEvent'),
62
+ change: define(true, false, false),
63
+ select: define(true, false, false),
64
+ submit: define(true, true, false),
65
+ reset: define(true, true, false),
66
+ invalid: define(false, true, false),
67
+ toggle: define(false, false, false),
68
+ // Loading and the page (HTML)
69
+ load: define(false, false, false),
70
+ error: define(false, false, false),
71
+ abort: define(false, false, false),
72
+ scroll: define(false, false, false),
73
+ scrollend: define(false, false, false),
74
+ resize: define(false, false, false),
75
+ DOMContentLoaded: define(true, false, false),
76
+ readystatechange: define(false, false, false),
77
+ visibilitychange: define(true, false, false),
78
+ // Clipboard
79
+ copy: define(true, true, true),
80
+ cut: define(true, true, true),
81
+ paste: define(true, true, true),
82
+ // Drag and drop
83
+ drag: define(true, true, true, 'MouseEvent'),
84
+ dragstart: define(true, true, true, 'MouseEvent'),
85
+ dragend: define(true, false, true, 'MouseEvent'),
86
+ dragenter: define(true, true, true, 'MouseEvent'),
87
+ dragover: define(true, true, true, 'MouseEvent'),
88
+ dragleave: define(true, false, true, 'MouseEvent'),
89
+ drop: define(true, true, true, 'MouseEvent'),
90
+ // Touch
91
+ touchstart: define(true, true, true, 'UIEvent'),
92
+ touchmove: define(true, true, true, 'UIEvent'),
93
+ touchend: define(true, true, true, 'UIEvent'),
94
+ touchcancel: define(true, false, true, 'UIEvent'),
95
+ // Animations and transitions (CSS)
96
+ animationstart: define(true, false, false),
97
+ animationiteration: define(true, false, false),
98
+ animationend: define(true, false, false),
99
+ animationcancel: define(true, false, false),
100
+ transitionrun: define(true, false, false),
101
+ transitionstart: define(true, false, false),
102
+ transitionend: define(true, false, false),
103
+ transitioncancel: define(true, false, false)
104
+ }
105
+ exports.default = exports.eventDefaults
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.eventDefaults=void 0;const define=(e,n,t,i="Event")=>({bubbles:e,cancelable:n,composed:t,interface:i});exports.eventDefaults={click:define(!0,!0,!0,"MouseEvent"),auxclick:define(!0,!0,!0,"MouseEvent"),dblclick:define(!0,!0,!0,"MouseEvent"),contextmenu:define(!0,!0,!0,"MouseEvent"),mousedown:define(!0,!0,!0,"MouseEvent"),mouseup:define(!0,!0,!0,"MouseEvent"),mousemove:define(!0,!0,!0,"MouseEvent"),mouseover:define(!0,!0,!0,"MouseEvent"),mouseout:define(!0,!0,!0,"MouseEvent"),mouseenter:define(!1,!1,!0,"MouseEvent"),mouseleave:define(!1,!1,!0,"MouseEvent"),wheel:define(!0,!0,!0,"MouseEvent"),pointerdown:define(!0,!0,!0,"PointerEvent"),pointerup:define(!0,!0,!0,"PointerEvent"),pointermove:define(!0,!0,!0,"PointerEvent"),pointerover:define(!0,!0,!0,"PointerEvent"),pointerout:define(!0,!0,!0,"PointerEvent"),pointerenter:define(!1,!1,!0,"PointerEvent"),pointerleave:define(!1,!1,!0,"PointerEvent"),pointercancel:define(!0,!1,!0,"PointerEvent"),gotpointercapture:define(!0,!1,!0,"PointerEvent"),lostpointercapture:define(!0,!1,!0,"PointerEvent"),keydown:define(!0,!0,!0,"KeyboardEvent"),keypress:define(!0,!0,!0,"KeyboardEvent"),keyup:define(!0,!0,!0,"KeyboardEvent"),focus:define(!1,!1,!0,"FocusEvent"),blur:define(!1,!1,!0,"FocusEvent"),focusin:define(!0,!1,!0,"FocusEvent"),focusout:define(!0,!1,!0,"FocusEvent"),beforeinput:define(!0,!0,!0,"InputEvent"),input:define(!0,!1,!0,"InputEvent"),change:define(!0,!1,!1),select:define(!0,!1,!1),submit:define(!0,!0,!1),reset:define(!0,!0,!1),invalid:define(!1,!0,!1),toggle:define(!1,!1,!1),load:define(!1,!1,!1),error:define(!1,!1,!1),abort:define(!1,!1,!1),scroll:define(!1,!1,!1),scrollend:define(!1,!1,!1),resize:define(!1,!1,!1),DOMContentLoaded:define(!0,!1,!1),readystatechange:define(!1,!1,!1),visibilitychange:define(!0,!1,!1),copy:define(!0,!0,!0),cut:define(!0,!0,!0),paste:define(!0,!0,!0),drag:define(!0,!0,!0,"MouseEvent"),dragstart:define(!0,!0,!0,"MouseEvent"),dragend:define(!0,!1,!0,"MouseEvent"),dragenter:define(!0,!0,!0,"MouseEvent"),dragover:define(!0,!0,!0,"MouseEvent"),dragleave:define(!0,!1,!0,"MouseEvent"),drop:define(!0,!0,!0,"MouseEvent"),touchstart:define(!0,!0,!0,"UIEvent"),touchmove:define(!0,!0,!0,"UIEvent"),touchend:define(!0,!0,!0,"UIEvent"),touchcancel:define(!0,!1,!0,"UIEvent"),animationstart:define(!0,!1,!1),animationiteration:define(!0,!1,!1),animationend:define(!0,!1,!1),animationcancel:define(!0,!1,!1),transitionrun:define(!0,!1,!1),transitionstart:define(!0,!1,!1),transitionend:define(!0,!1,!1),transitioncancel:define(!0,!1,!1)},exports.default=exports.eventDefaults;
@@ -1,5 +1,11 @@
1
1
  declare const _default: {
2
2
  generateNode: () => typeof import("./factories/generateNode").NodeFactory;
3
3
  nodeListFactory: (innerList?: import("collect-your-stuff/dist/collections/linked-tree-list/TreeLinker").TreeLinker | null) => import("./classes/PseudoNodeList").PseudoNodeList;
4
+ createEvent: (type: string, init?: {
5
+ [option: string]: any;
6
+ }, { browser, trusted }?: import("./factories/createEvent").CreateEventOptions) => import("./main").PseudoEvent;
7
+ eventDefaults: {
8
+ [type: string]: import("./factories/eventDefaults").EventDefinition;
9
+ };
4
10
  };
5
11
  export default _default;
package/dist/factories.js CHANGED
@@ -17,7 +17,11 @@ Object.defineProperty(exports, '__esModule', {
17
17
  */
18
18
  const generateNode_1 = __importDefault(require('./factories/generateNode'))
19
19
  const generateNodeList_1 = __importDefault(require('./factories/generateNodeList'))
20
+ const createEvent_1 = __importDefault(require('./factories/createEvent'))
21
+ const eventDefaults_1 = __importDefault(require('./factories/eventDefaults'))
20
22
  exports.default = {
21
23
  generateNode: generateNode_1.default,
22
- nodeListFactory: generateNodeList_1.default
24
+ nodeListFactory: generateNodeList_1.default,
25
+ createEvent: createEvent_1.default,
26
+ eventDefaults: eventDefaults_1.default
23
27
  }
@@ -1 +1 @@
1
- "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const generateNode_1=__importDefault(require("./factories/generateNode")),generateNodeList_1=__importDefault(require("./factories/generateNodeList"));exports.default={generateNode:generateNode_1.default,nodeListFactory:generateNodeList_1.default};
1
+ "use strict";var __importDefault=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const generateNode_1=__importDefault(require("./factories/generateNode")),generateNodeList_1=__importDefault(require("./factories/generateNodeList")),createEvent_1=__importDefault(require("./factories/createEvent")),eventDefaults_1=__importDefault(require("./factories/eventDefaults"));exports.default={generateNode:generateNode_1.default,nodeListFactory:generateNodeList_1.default,createEvent:createEvent_1.default,eventDefaults:eventDefaults_1.default};
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Find the element which has the focus in a tree.
3
+ * @function getActiveElement
4
+ * @param {Object} root The root node of the tree
5
+ * @returns {Object|null}
6
+ */
7
+ export declare const getActiveElement: (root: object) => any | null;
8
+ /**
9
+ * Remember the element which has the focus in a tree.
10
+ * @function setActiveElement
11
+ * @param {Object} root The root node of the tree
12
+ * @param {Object|null} element The element which now has the focus, or null when nothing has it
13
+ */
14
+ export declare const setActiveElement: (root: object, element: any | null) => void;
@@ -0,0 +1,33 @@
1
+ 'use strict'
2
+
3
+ require('core-js/modules/esnext.weak-map.delete-all.js')
4
+ Object.defineProperty(exports, '__esModule', {
5
+ value: true
6
+ })
7
+ exports.setActiveElement = exports.getActiveElement = void 0
8
+ /**
9
+ * The element which has the focus, kept for each tree (the root node of the tree it is in), like document.activeElement.
10
+ */
11
+ const focused = new WeakMap()
12
+ /**
13
+ * Find the element which has the focus in a tree.
14
+ * @function getActiveElement
15
+ * @param {Object} root The root node of the tree
16
+ * @returns {Object|null}
17
+ */
18
+ const getActiveElement = root => focused.get(root) || null
19
+ exports.getActiveElement = getActiveElement
20
+ /**
21
+ * Remember the element which has the focus in a tree.
22
+ * @function setActiveElement
23
+ * @param {Object} root The root node of the tree
24
+ * @param {Object|null} element The element which now has the focus, or null when nothing has it
25
+ */
26
+ const setActiveElement = (root, element) => {
27
+ if (element === null) {
28
+ focused.delete(root)
29
+ } else {
30
+ focused.set(root, element)
31
+ }
32
+ }
33
+ exports.setActiveElement = setActiveElement
@@ -0,0 +1 @@
1
+ "use strict";require("core-js/modules/esnext.weak-map.delete-all.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.setActiveElement=exports.getActiveElement=void 0;const focused=new WeakMap,getActiveElement=e=>focused.get(e)||null;exports.getActiveElement=getActiveElement;const setActiveElement=(e,t)=>{null===t?focused.delete(e):focused.set(e,t)};exports.setActiveElement=setActiveElement;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The modifier keys which were held down when a mouse or keyboard event happened.
3
+ * @typedef {Object} ModifierKeys
4
+ * @property {boolean} ctrlKey
5
+ * @property {boolean} shiftKey
6
+ * @property {boolean} altKey
7
+ * @property {boolean} metaKey
8
+ */
9
+ export type ModifierKeys = {
10
+ ctrlKey: boolean;
11
+ shiftKey: boolean;
12
+ altKey: boolean;
13
+ metaKey: boolean;
14
+ };
15
+ /**
16
+ * Pick the modifier keys out of the init object of an event.
17
+ * @function modifierKeys
18
+ * @param {Object} [init={}] The init of an event
19
+ * @returns {ModifierKeys}
20
+ */
21
+ export declare const modifierKeys: (init?: any) => ModifierKeys;
22
+ /**
23
+ * Answer getModifierState for a set of held modifier keys.
24
+ * @function modifierState
25
+ * @param {ModifierKeys} keys The modifier keys which were held down
26
+ * @param {string} key The name of the modifier (Control, Shift, Alt or Meta)
27
+ * @returns {boolean}
28
+ */
29
+ export declare const modifierState: (keys: ModifierKeys, key: string) => boolean;
@@ -0,0 +1,41 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.modifierState = exports.modifierKeys = void 0
7
+ /**
8
+ * Pick the modifier keys out of the init object of an event.
9
+ * @function modifierKeys
10
+ * @param {Object} [init={}] The init of an event
11
+ * @returns {ModifierKeys}
12
+ */
13
+ const modifierKeys = (init = {}) => ({
14
+ ctrlKey: !!init.ctrlKey,
15
+ shiftKey: !!init.shiftKey,
16
+ altKey: !!init.altKey,
17
+ metaKey: !!init.metaKey
18
+ })
19
+ exports.modifierKeys = modifierKeys
20
+ /**
21
+ * Answer getModifierState for a set of held modifier keys.
22
+ * @function modifierState
23
+ * @param {ModifierKeys} keys The modifier keys which were held down
24
+ * @param {string} key The name of the modifier (Control, Shift, Alt or Meta)
25
+ * @returns {boolean}
26
+ */
27
+ const modifierState = (keys, key) => {
28
+ switch (key) {
29
+ case 'Control':
30
+ return keys.ctrlKey
31
+ case 'Shift':
32
+ return keys.shiftKey
33
+ case 'Alt':
34
+ return keys.altKey
35
+ case 'Meta':
36
+ return keys.metaKey
37
+ default:
38
+ return false
39
+ }
40
+ }
41
+ exports.modifierState = modifierState
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.modifierState=exports.modifierKeys=void 0;const modifierKeys=(e={})=>({ctrlKey:!!e.ctrlKey,shiftKey:!!e.shiftKey,altKey:!!e.altKey,metaKey:!!e.metaKey});exports.modifierKeys=modifierKeys;const modifierState=(e,t)=>{switch(t){case"Control":return e.ctrlKey;case"Shift":return e.shiftKey;case"Alt":return e.altKey;case"Meta":return e.metaKey;default:return!1}};exports.modifierState=modifierState;
@@ -35,12 +35,12 @@ export interface PseudoEventTarget {
35
35
  * @param {string} type
36
36
  * @param {function} callback
37
37
  */
38
- removeEventListener(type: string, callback: Function): void;
38
+ removeEventListener(type: string, callback: Function, options?: listenerOptions | boolean): void;
39
39
  /**
40
40
  * Dispatches an event to this EventTarget.
41
41
  * @param {Event|PseudoEvent} event
42
42
  * @param {EventTarget|PseudoEventTarget} target
43
43
  * @returns {boolean}
44
44
  */
45
- dispatchEvent(event: PseudoEvent, target: PseudoEventTarget): boolean;
45
+ dispatchEvent(event: PseudoEvent): boolean;
46
46
  }
package/dist/main.d.ts CHANGED
@@ -10,6 +10,16 @@ import { ElementService as PseudoElement } from './services/ElementService';
10
10
  import { HTMLElementService as PseudoHTMLElement } from './services/HTMLElementService';
11
11
  import PseudoHTMLDocument from './classes/PseudoHTMLDocument';
12
12
  import generateDocument from './factories/generateDocument';
13
+ import createEvent from './factories/createEvent';
14
+ import eventDefaults from './factories/eventDefaults';
15
+ import { UIEventService as PseudoUIEvent } from './services/UIEventService';
16
+ import { MouseEventService as PseudoMouseEvent } from './services/MouseEventService';
17
+ import { PointerEventService as PseudoPointerEvent } from './services/PointerEventService';
18
+ import { KeyboardEventService as PseudoKeyboardEvent } from './services/KeyboardEventService';
19
+ import { FocusEventService as PseudoFocusEvent } from './services/FocusEventService';
20
+ import { InputEventService as PseudoInputEvent } from './services/InputEventService';
21
+ import { CustomEventService as PseudoCustomEvent } from './services/CustomEventService';
22
+ import simulate from './simulate';
13
23
  /**
14
24
  * All methods exported from this module are encapsulated within pseudoDom.
15
25
  * @author Joshua Heagle <joshuaheagle@gmail.com>
@@ -18,12 +28,33 @@ import generateDocument from './factories/generateDocument';
18
28
  */
19
29
  declare const pseudoDom: {
20
30
  generateDocument: (root: Window | any, context?: object) => Window | PseudoEventTarget;
31
+ createEvent: (type: string, init?: {
32
+ [option: string]: any;
33
+ }, { browser, trusted }?: import("./factories/createEvent").CreateEventOptions) => PseudoEvent;
34
+ eventDefaults: {
35
+ [type: string]: import("./factories/eventDefaults").EventDefinition;
36
+ };
37
+ simulate: {
38
+ click: (element: any, init?: {
39
+ [option: string]: any;
40
+ }) => boolean;
41
+ keyPress: (element: any, key: string, init?: {
42
+ [option: string]: any;
43
+ }) => boolean;
44
+ };
21
45
  PseudoEvent: typeof PseudoEvent;
46
+ PseudoUIEvent: typeof PseudoUIEvent;
47
+ PseudoMouseEvent: typeof PseudoMouseEvent;
48
+ PseudoPointerEvent: typeof PseudoPointerEvent;
49
+ PseudoKeyboardEvent: typeof PseudoKeyboardEvent;
50
+ PseudoFocusEvent: typeof PseudoFocusEvent;
51
+ PseudoInputEvent: typeof PseudoInputEvent;
52
+ PseudoCustomEvent: typeof PseudoCustomEvent;
22
53
  PseudoEventTarget: typeof PseudoEventTarget;
23
54
  PseudoNode: typeof PseudoNode;
24
55
  PseudoElement: typeof PseudoElement;
25
56
  PseudoHTMLElement: typeof PseudoHTMLElement;
26
57
  PseudoHTMLDocument: typeof PseudoHTMLDocument;
27
58
  };
28
- export { generateDocument, PseudoEvent, PseudoEventTarget, PseudoNode, PseudoElement, PseudoHTMLElement, PseudoHTMLDocument };
59
+ export { generateDocument, createEvent, eventDefaults, simulate, PseudoEvent, PseudoUIEvent, PseudoMouseEvent, PseudoPointerEvent, PseudoKeyboardEvent, PseudoFocusEvent, PseudoInputEvent, PseudoCustomEvent, PseudoEventTarget, PseudoNode, PseudoElement, PseudoHTMLElement, PseudoHTMLDocument };
29
60
  export default pseudoDom;