ctrl-fx 0.1.0 → 0.1.2

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 (152) hide show
  1. package/README.md +13 -0
  2. package/dist/chunk-BDTTV33M.js +4050 -0
  3. package/dist/chunk-EKBLRHWK.js +916 -0
  4. package/dist/chunk-OSIRHKDB.js +1812 -0
  5. package/dist/chunk-PKBMQBKP.js +7 -0
  6. package/dist/chunk-XICUXW4T.js +252 -0
  7. package/dist/db/index.d.ts +218 -16
  8. package/dist/db/index.js +53 -19
  9. package/dist/dom/index.d.ts +2 -248
  10. package/dist/dom/index.js +30 -266
  11. package/dist/effects.d.ts +2 -580
  12. package/dist/effects.js +111 -1556
  13. package/dist/index-DeEjNrg-.d.ts +1399 -0
  14. package/dist/index.d.ts +2 -41
  15. package/dist/index.js +18 -78
  16. package/dist/router.d.ts +11 -12
  17. package/dist/router.js +57 -68
  18. package/dist/testing.d.ts +67 -60
  19. package/dist/testing.js +46 -158
  20. package/dist/webcomponent.d.ts +7 -4
  21. package/dist/webcomponent.js +48 -40
  22. package/package.json +4 -3
  23. package/dist/clipboard.d.ts +0 -7
  24. package/dist/clipboard.d.ts.map +0 -1
  25. package/dist/clipboard.js +0 -3
  26. package/dist/db/effects.d.ts +0 -78
  27. package/dist/db/effects.d.ts.map +0 -1
  28. package/dist/db/effects.js +0 -98
  29. package/dist/db/errors.d.ts +0 -21
  30. package/dist/db/errors.d.ts.map +0 -1
  31. package/dist/db/errors.js +0 -13
  32. package/dist/db/index.d.ts.map +0 -1
  33. package/dist/db/keypath.d.ts +0 -40
  34. package/dist/db/keypath.d.ts.map +0 -1
  35. package/dist/db/keypath.js +0 -20
  36. package/dist/db/setup.d.ts +0 -83
  37. package/dist/db/setup.d.ts.map +0 -1
  38. package/dist/db/setup.js +0 -100
  39. package/dist/db/testdb.d.ts +0 -19
  40. package/dist/db/testdb.d.ts.map +0 -1
  41. package/dist/db/testdb.js +0 -34
  42. package/dist/dom/attrs.d.ts +0 -67
  43. package/dist/dom/attrs.d.ts.map +0 -1
  44. package/dist/dom/attrs.js +0 -154
  45. package/dist/dom/components.d.ts +0 -43
  46. package/dist/dom/components.d.ts.map +0 -1
  47. package/dist/dom/components.js +0 -86
  48. package/dist/dom/elems.d.ts +0 -121
  49. package/dist/dom/elems.d.ts.map +0 -1
  50. package/dist/dom/elems.js +0 -52
  51. package/dist/dom/events.d.ts +0 -232
  52. package/dist/dom/events.d.ts.map +0 -1
  53. package/dist/dom/events.js +0 -289
  54. package/dist/dom/index.d.ts.map +0 -1
  55. package/dist/dom/nodeid.d.ts +0 -9
  56. package/dist/dom/nodeid.d.ts.map +0 -1
  57. package/dist/dom/nodeid.js +0 -27
  58. package/dist/dom/svg.d.ts +0 -23
  59. package/dist/dom/svg.d.ts.map +0 -1
  60. package/dist/dom/svg.js +0 -1
  61. package/dist/dom/views.d.ts +0 -60
  62. package/dist/dom/views.d.ts.map +0 -1
  63. package/dist/dom/views.js +0 -154
  64. package/dist/effects.d.ts.map +0 -1
  65. package/dist/index.d.ts.map +0 -1
  66. package/dist/internal/clipboard.d.ts +0 -5
  67. package/dist/internal/clipboard.d.ts.map +0 -1
  68. package/dist/internal/clipboard.js +0 -33
  69. package/dist/internal/cmpmgr.d.ts +0 -46
  70. package/dist/internal/cmpmgr.d.ts.map +0 -1
  71. package/dist/internal/cmpmgr.js +0 -561
  72. package/dist/internal/dbmgr.d.ts +0 -11
  73. package/dist/internal/dbmgr.d.ts.map +0 -1
  74. package/dist/internal/dbmgr.js +0 -200
  75. package/dist/internal/dominterpreter.d.ts +0 -5
  76. package/dist/internal/dominterpreter.d.ts.map +0 -1
  77. package/dist/internal/dominterpreter.js +0 -337
  78. package/dist/internal/eventmgr.d.ts +0 -41
  79. package/dist/internal/eventmgr.d.ts.map +0 -1
  80. package/dist/internal/eventmgr.js +0 -696
  81. package/dist/internal/index.d.ts +0 -19
  82. package/dist/internal/index.d.ts.map +0 -1
  83. package/dist/internal/index.js +0 -38
  84. package/dist/internal/interpreter.d.ts +0 -10
  85. package/dist/internal/interpreter.d.ts.map +0 -1
  86. package/dist/internal/interpreter.js +0 -1
  87. package/dist/internal/locutils.d.ts +0 -4
  88. package/dist/internal/locutils.d.ts.map +0 -1
  89. package/dist/internal/locutils.js +0 -22
  90. package/dist/internal/net.d.ts +0 -4
  91. package/dist/internal/net.d.ts.map +0 -1
  92. package/dist/internal/net.js +0 -64
  93. package/dist/internal/realdom.d.ts +0 -249
  94. package/dist/internal/realdom.d.ts.map +0 -1
  95. package/dist/internal/realdom.js +0 -1
  96. package/dist/internal/styleregistry.d.ts +0 -6
  97. package/dist/internal/styleregistry.d.ts.map +0 -1
  98. package/dist/internal/styleregistry.js +0 -18
  99. package/dist/internal/taskreg.d.ts +0 -9
  100. package/dist/internal/taskreg.d.ts.map +0 -1
  101. package/dist/internal/taskreg.js +0 -28
  102. package/dist/internal/testing.d.ts +0 -12
  103. package/dist/internal/testing.d.ts.map +0 -1
  104. package/dist/internal/testing.js +0 -974
  105. package/dist/internal/testinginterpreter.d.ts +0 -10
  106. package/dist/internal/testinginterpreter.d.ts.map +0 -1
  107. package/dist/internal/testinginterpreter.js +0 -646
  108. package/dist/internal/vdom.d.ts +0 -93
  109. package/dist/internal/vdom.d.ts.map +0 -1
  110. package/dist/internal/vdom.js +0 -470
  111. package/dist/json/index.d.ts +0 -5
  112. package/dist/json/index.d.ts.map +0 -1
  113. package/dist/json/index.js +0 -2
  114. package/dist/json/validation.d.ts +0 -28
  115. package/dist/json/validation.d.ts.map +0 -1
  116. package/dist/json/validation.js +0 -8
  117. package/dist/net/fragment.d.ts +0 -10
  118. package/dist/net/fragment.d.ts.map +0 -1
  119. package/dist/net/fragment.js +0 -27
  120. package/dist/net/index.d.ts +0 -42
  121. package/dist/net/index.d.ts.map +0 -1
  122. package/dist/net/index.js +0 -60
  123. package/dist/net/location.d.ts +0 -21
  124. package/dist/net/location.d.ts.map +0 -1
  125. package/dist/net/location.js +0 -41
  126. package/dist/net/path.d.ts +0 -12
  127. package/dist/net/path.d.ts.map +0 -1
  128. package/dist/net/path.js +0 -29
  129. package/dist/net/queryparam.d.ts +0 -10
  130. package/dist/net/queryparam.d.ts.map +0 -1
  131. package/dist/net/queryparam.js +0 -34
  132. package/dist/router.d.ts.map +0 -1
  133. package/dist/scroll.d.ts +0 -7
  134. package/dist/scroll.d.ts.map +0 -1
  135. package/dist/scroll.js +0 -3
  136. package/dist/testing.d.ts.map +0 -1
  137. package/dist/utils/apply.d.ts +0 -9
  138. package/dist/utils/apply.d.ts.map +0 -1
  139. package/dist/utils/apply.js +0 -10
  140. package/dist/utils/index.d.ts +0 -22
  141. package/dist/utils/index.d.ts.map +0 -1
  142. package/dist/utils/index.js +0 -138
  143. package/dist/utils/lens.d.ts +0 -18
  144. package/dist/utils/lens.d.ts.map +0 -1
  145. package/dist/utils/lens.js +0 -27
  146. package/dist/utils/match.d.ts +0 -17
  147. package/dist/utils/match.d.ts.map +0 -1
  148. package/dist/utils/match.js +0 -28
  149. package/dist/utils/result.d.ts +0 -47
  150. package/dist/utils/result.d.ts.map +0 -1
  151. package/dist/utils/result.js +0 -97
  152. package/dist/webcomponent.d.ts.map +0 -1
@@ -1,696 +0,0 @@
1
- import { containerEventTypes, eventTypes, } from '../dom/events';
2
- import { internalLocationFromLocation } from '../net/location';
3
- import { exhaustivenessCheck } from '../utils';
4
- import { currentLocation } from './locutils';
5
- // The framework's internal name for text input events is 'textinput', but the
6
- // DOM fires 'input'. Map before registering listeners and before comparing.
7
- function toNativeEventType(type) {
8
- return type === 'textinput' ? 'input' : type;
9
- }
10
- function makeEventTypeKeyedRecord(eventTypes, defaultValue) {
11
- const record = {};
12
- for (const eventType of eventTypes) {
13
- record[eventType] = defaultValue();
14
- }
15
- return record;
16
- }
17
- export function makeListenerCounts(eventTypes) {
18
- return makeEventTypeKeyedRecord(eventTypes, () => ({
19
- regular: 0,
20
- capture: 0,
21
- }));
22
- }
23
- function updateListenerChangeMap(map, eventType, capture) {
24
- const existing = map.get(eventType);
25
- if (existing) {
26
- if (capture) {
27
- existing.capture = true;
28
- }
29
- else {
30
- existing.regular = true;
31
- }
32
- }
33
- else {
34
- map.set(eventType, {
35
- capture: capture,
36
- regular: !capture,
37
- });
38
- }
39
- }
40
- /** Given current counts of all listeners, adjust them for a specific node given
41
- * its old listeners and its new listeners. Return which listener counts have
42
- * dropped to zero and which listener counts have gone from zero to a positive
43
- * number. Also include a set of all the new event types.
44
- */
45
- export function adjustCountsAndGetListenerTypesToRemoveAndAdd(counts, oldListeners, newListeners) {
46
- // iterate through old and new listeners to calculate the change in listener
47
- // counts
48
- const countDiffs = {};
49
- oldListeners.forEach(listener => {
50
- const capture = listener.options && listener.options.capture ? true : false;
51
- const totals = countDiffs[listener._type];
52
- const currDiff = capture ? totals?.capture : totals?.regular;
53
- const newDiff = currDiff ? currDiff - 1 : -1;
54
- if (totals) {
55
- if (capture) {
56
- totals.capture = newDiff;
57
- }
58
- else {
59
- totals.regular = newDiff;
60
- }
61
- }
62
- else {
63
- countDiffs[listener._type] = {
64
- regular: capture ? 0 : newDiff,
65
- capture: capture ? newDiff : 0,
66
- };
67
- }
68
- });
69
- const allNewEvents = new Map();
70
- newListeners.forEach(listener => {
71
- const capture = listener.options && listener.options.capture ? true : false;
72
- const totals = countDiffs[listener._type];
73
- const currDiff = capture ? totals?.capture : totals?.regular;
74
- const newDiff = currDiff ? currDiff + 1 : 1;
75
- if (totals) {
76
- if (capture) {
77
- totals.capture = newDiff;
78
- }
79
- else {
80
- totals.regular = newDiff;
81
- }
82
- }
83
- else {
84
- countDiffs[listener._type] = {
85
- regular: capture ? 0 : newDiff,
86
- capture: capture ? newDiff : 0,
87
- };
88
- }
89
- updateListenerChangeMap(allNewEvents, listener._type, capture);
90
- });
91
- const toAdd = new Map();
92
- const toRemove = new Map();
93
- for (const [k, v] of Object.entries(countDiffs)) {
94
- const tpe = k;
95
- const diffTotals = v;
96
- const currCount = counts[tpe];
97
- currCount.capture = currCount.capture + diffTotals.capture;
98
- currCount.regular = currCount.regular + diffTotals.regular;
99
- // if currCount is now zero, and diff is negative, we no longer have any
100
- // listeners of that type
101
- if (currCount.capture === 0) {
102
- if (diffTotals.capture < 0) {
103
- updateListenerChangeMap(toRemove, tpe, true);
104
- }
105
- }
106
- else if (currCount.capture > 0) {
107
- if (diffTotals.capture === currCount.capture) {
108
- updateListenerChangeMap(toAdd, tpe, true);
109
- }
110
- }
111
- else {
112
- throw new Error('EventListener counts out of sync (this indicates a ctrl-fx framework bug)');
113
- }
114
- // repeat for regular listeners
115
- if (currCount.regular === 0) {
116
- if (diffTotals.regular < 0) {
117
- updateListenerChangeMap(toRemove, tpe, false);
118
- }
119
- }
120
- else if (currCount.regular > 0) {
121
- if (diffTotals.regular === currCount.regular) {
122
- updateListenerChangeMap(toAdd, tpe, false);
123
- }
124
- }
125
- else {
126
- throw new Error('EventListener counts out of sync (this indicates a ctrl-fx framework bug)');
127
- }
128
- }
129
- return { toRemove, toAdd, allNewEvents };
130
- }
131
- class EventManagerDelegate {
132
- constructor(window, runEffect) {
133
- Object.defineProperty(this, "window", {
134
- enumerable: true,
135
- configurable: true,
136
- writable: true,
137
- value: void 0
138
- });
139
- Object.defineProperty(this, "runEffect", {
140
- enumerable: true,
141
- configurable: true,
142
- writable: true,
143
- value: void 0
144
- });
145
- this.window = window;
146
- this.runEffect = runEffect;
147
- }
148
- runListeners(ev, listeners) {
149
- if (listeners.length) {
150
- const listener = listeners[0];
151
- if (toNativeEventType(listener.listener._type) === ev.type.toLowerCase() &&
152
- (ev.eventPhase !== 1 || listener.listener.options.capture)) {
153
- this.runListener(listener, ev, keepGoing => {
154
- if (keepGoing) {
155
- this.runListeners(ev, listeners.slice(1));
156
- }
157
- else {
158
- return;
159
- }
160
- });
161
- }
162
- else {
163
- this.runListeners(ev, listeners.slice(1));
164
- }
165
- }
166
- else {
167
- return;
168
- }
169
- }
170
- runListener(listenerAndNode, ev, onComplete) {
171
- let effect;
172
- const listener = listenerAndNode.listener;
173
- switch (listener._type) {
174
- case 'focus':
175
- case 'blur': {
176
- effect = listener.effect;
177
- break;
178
- }
179
- case 'change': {
180
- let value = '';
181
- let checked = false;
182
- if (ev.target && 'tagName' in ev.target) {
183
- switch (ev.target.tagName) {
184
- case 'INPUT': {
185
- value = ev.target.value;
186
- checked = ev.target.checked;
187
- break;
188
- }
189
- case 'SELECT':
190
- case 'TEXTAREA': {
191
- value = ev.target.value;
192
- break;
193
- }
194
- }
195
- }
196
- const changeData = { value, checked };
197
- effect = listener.effect(changeData);
198
- break;
199
- }
200
- case 'click':
201
- case 'dblclick':
202
- case 'mouseenter':
203
- case 'mouseleave':
204
- case 'submit': {
205
- effect = listener.effect;
206
- break;
207
- }
208
- case 'mousemove': {
209
- assertMouseMoveEvent(ev);
210
- const mouseMoveData = {
211
- clientX: ev.clientX,
212
- clientY: ev.clientY,
213
- pageX: ev.pageX,
214
- pageY: ev.pageY,
215
- movementX: ev.movementX,
216
- movementY: ev.movementY,
217
- };
218
- effect = listener.effect(mouseMoveData);
219
- break;
220
- }
221
- case 'wheel': {
222
- assertWheelEvent(ev);
223
- const wheelData = {
224
- deltaX: ev.deltaX,
225
- deltaY: ev.deltaY,
226
- deltaZ: ev.deltaZ,
227
- deltaMode: ev.deltaMode,
228
- };
229
- effect = listener.effect(wheelData);
230
- break;
231
- }
232
- case 'scroll':
233
- case 'scrollend': {
234
- const owningNode = listenerAndNode.owningNode;
235
- const scrollData = owningNode._type === 'InternalElementNode'
236
- ? {
237
- scrollTop: owningNode.realNode.scrollTop,
238
- scrollLeft: owningNode.realNode.scrollLeft,
239
- }
240
- : { scrollTop: 0, scrollLeft: 0 };
241
- effect = listener.effect(scrollData);
242
- break;
243
- }
244
- //console.log(ev.target && 'tagName' in ev.target && ev.target.tagName === 'INPUT')
245
- case 'textinput': {
246
- let textState;
247
- if (ev.target && 'tagName' in ev.target) {
248
- switch (ev.target.tagName) {
249
- case 'INPUT':
250
- case 'TEXTAREA': {
251
- textState = {
252
- value: ev.target.value,
253
- selectionStart: ev.target.selectionStart,
254
- selectionEnd: ev.target.selectionEnd,
255
- };
256
- break;
257
- }
258
- case 'DIV': {
259
- textState = {
260
- value: ev.target.innerText,
261
- selectionStart: 0,
262
- selectionEnd: 0,
263
- };
264
- break;
265
- }
266
- default: {
267
- textState = {
268
- value: '',
269
- selectionStart: 0,
270
- selectionEnd: 0,
271
- };
272
- }
273
- }
274
- }
275
- else {
276
- textState = {
277
- value: '',
278
- selectionStart: 0,
279
- selectionEnd: 0,
280
- };
281
- }
282
- effect = listener.effect(textState);
283
- break;
284
- }
285
- case 'touchmove':
286
- case 'touchstart':
287
- case 'touchend':
288
- case 'touchcancel': {
289
- assertTouchEvent(ev);
290
- const touchData = [];
291
- for (let i = 0; i < ev.touches.length; i++) {
292
- touchData.push({
293
- clientX: ev.touches[i].clientX,
294
- clientY: ev.touches[i].clientY,
295
- pageX: ev.touches[i].pageX,
296
- pageY: ev.touches[i].pageY,
297
- });
298
- }
299
- effect = listener.effect(touchData);
300
- break;
301
- }
302
- case 'keydown':
303
- case 'keyup': {
304
- assertKeyEvent(ev);
305
- const keyData = { key: ev.key, code: ev.code };
306
- effect = listener.effect(keyData);
307
- break;
308
- }
309
- case 'resize': {
310
- const dimensions = {
311
- width: this.window.innerWidth,
312
- height: this.window.innerHeight,
313
- };
314
- effect = listener.onChange(dimensions);
315
- break;
316
- }
317
- case 'popstate':
318
- case 'locationchange': {
319
- const loc = internalLocationFromLocation(currentLocation(this.window));
320
- effect = listener.onChange(loc);
321
- break;
322
- }
323
- case 'visibilitychange': {
324
- const state = this.window.document.visibilityState;
325
- effect = listener.onChange(state);
326
- break;
327
- }
328
- case 'online':
329
- case 'offline': {
330
- effect = listener.effect;
331
- break;
332
- }
333
- case 'custom': {
334
- effect = listener.effect(ev.detail);
335
- break;
336
- }
337
- default:
338
- exhaustivenessCheck(listener);
339
- }
340
- this.runEffect(effect, listenerAndNode.owningNode, result => {
341
- if (result !== undefined) {
342
- if (result.preventDefault) {
343
- ev.preventDefault();
344
- }
345
- if (result.stopPropagation) {
346
- ev.stopImmediatePropagation();
347
- onComplete(false);
348
- }
349
- else {
350
- onComplete(true);
351
- }
352
- }
353
- else {
354
- onComplete(true);
355
- }
356
- });
357
- }
358
- }
359
- function assertMouseMoveEvent(event) {
360
- if (!('clientX' in event)) {
361
- throw new Error('Event is not a mousemove event');
362
- }
363
- }
364
- function assertWheelEvent(event) {
365
- if (!('deltaX' in event)) {
366
- throw new Error('Event is not a wheel event');
367
- }
368
- }
369
- function assertTouchEvent(event) {
370
- if (!(event.type.toLowerCase().startsWith('touch') && 'touches' in event)) {
371
- throw new Error('Event is not a touch event');
372
- }
373
- }
374
- function assertKeyEvent(event) {
375
- if (!(event.type.toLowerCase().startsWith('key') &&
376
- 'key' in event &&
377
- 'code' in event)) {
378
- throw new Error('Event is not a key event');
379
- }
380
- }
381
- class ContainerEventManagerDelegate extends EventManagerDelegate {
382
- constructor(window, runEffect) {
383
- super(window, runEffect);
384
- Object.defineProperty(this, "nodeLookupByEvent", {
385
- enumerable: true,
386
- configurable: true,
387
- writable: true,
388
- value: makeEventTypeKeyedRecord(containerEventTypes, () => new Set())
389
- });
390
- Object.defineProperty(this, "eventListeners", {
391
- enumerable: true,
392
- configurable: true,
393
- writable: true,
394
- value: new Map()
395
- });
396
- Object.defineProperty(this, "windowEventListener", {
397
- enumerable: true,
398
- configurable: true,
399
- writable: true,
400
- value: (event) => {
401
- this.onEvent(event);
402
- }
403
- });
404
- Object.defineProperty(this, "windowCaptureEventListener", {
405
- enumerable: true,
406
- configurable: true,
407
- writable: true,
408
- value: (event) => {
409
- this.onEvent(event);
410
- }
411
- });
412
- Object.defineProperty(this, "documentEventListener", {
413
- enumerable: true,
414
- configurable: true,
415
- writable: true,
416
- value: (event) => {
417
- this.onEvent(event);
418
- }
419
- });
420
- Object.defineProperty(this, "documentCaptureEventListener", {
421
- enumerable: true,
422
- configurable: true,
423
- writable: true,
424
- value: (event) => {
425
- this.onEvent(event);
426
- }
427
- });
428
- Object.defineProperty(this, "counts", {
429
- enumerable: true,
430
- configurable: true,
431
- writable: true,
432
- value: void 0
433
- });
434
- this.counts = makeListenerCounts(containerEventTypes);
435
- }
436
- onEvent(event) {
437
- const eventType = event.type;
438
- const nodeSet = this.nodeLookupByEvent[eventType];
439
- if (!nodeSet) {
440
- return;
441
- }
442
- const listenersToRun = [];
443
- for (const node of nodeSet) {
444
- const listeners = this.eventListeners.get(node);
445
- if (listeners) {
446
- listeners.forEach(listener => {
447
- if (listener._type === eventType &&
448
- (event.eventPhase !== 1 || listener.options.capture)) {
449
- listenersToRun.push({ listener, owningNode: node });
450
- }
451
- });
452
- }
453
- }
454
- this.runListeners(event, listenersToRun);
455
- if (eventType === 'popstate') {
456
- this.window.dispatchEvent(new Event('locationchange'));
457
- }
458
- }
459
- setContainerListeners(node) {
460
- if (node.containerListeners.length === 0) {
461
- this.removeContainerListeners(node);
462
- return;
463
- }
464
- const existingListeners = this.eventListeners.get(node);
465
- const passive = node.containerListeners.reduce((acc, listener) => acc && (listener.options.passive ? true : false), true);
466
- const adjustments = adjustCountsAndGetListenerTypesToRemoveAndAdd(this.counts, existingListeners || [], node.containerListeners);
467
- containerEventTypes.forEach(ev => {
468
- if (adjustments.allNewEvents.has(ev)) {
469
- this.nodeLookupByEvent[ev].add(node);
470
- }
471
- else {
472
- this.nodeLookupByEvent[ev].delete(node);
473
- }
474
- });
475
- if (node.containerListeners.length > 0) {
476
- this.eventListeners.set(node, [...node.containerListeners]);
477
- }
478
- else {
479
- this.eventListeners.delete(node);
480
- }
481
- this.processAdjustments(adjustments, passive);
482
- }
483
- processAdjustments(adjustments, passive) {
484
- for (const [ev, changes] of adjustments.toAdd) {
485
- switch (ev) {
486
- case 'resize':
487
- case 'popstate':
488
- case 'locationchange':
489
- case 'online':
490
- case 'offline': {
491
- if (changes.capture) {
492
- this.window.addEventListener(ev, this.windowCaptureEventListener, {
493
- capture: true,
494
- passive,
495
- });
496
- }
497
- if (changes.regular) {
498
- this.window.addEventListener(ev, this.windowEventListener, {
499
- capture: false,
500
- passive,
501
- });
502
- }
503
- break;
504
- }
505
- case 'keydown':
506
- case 'keyup':
507
- case 'visibilitychange': {
508
- if (changes.capture) {
509
- this.window.document.addEventListener(ev, this.documentCaptureEventListener, { capture: true, passive });
510
- }
511
- if (changes.regular) {
512
- this.window.document.addEventListener(ev, this.documentEventListener, { capture: false, passive });
513
- }
514
- break;
515
- }
516
- default: {
517
- exhaustivenessCheck(ev);
518
- }
519
- }
520
- }
521
- }
522
- removeContainerListeners(node) {
523
- const existingListeners = this.eventListeners.get(node);
524
- if (!existingListeners) {
525
- return;
526
- }
527
- const adjustments = adjustCountsAndGetListenerTypesToRemoveAndAdd(this.counts, existingListeners, []);
528
- this.processAdjustments(adjustments, false);
529
- // there should be no "adds", so we don't really care about the value of
530
- // passive
531
- existingListeners.forEach(listener => {
532
- this.nodeLookupByEvent[listener._type].delete(node);
533
- });
534
- this.eventListeners.delete(node);
535
- }
536
- }
537
- class ElementEventManagerDelegate extends EventManagerDelegate {
538
- constructor(window, runEffect) {
539
- super(window, runEffect);
540
- Object.defineProperty(this, "listeners", {
541
- enumerable: true,
542
- configurable: true,
543
- writable: true,
544
- value: new Map()
545
- });
546
- Object.defineProperty(this, "customHandlers", {
547
- enumerable: true,
548
- configurable: true,
549
- writable: true,
550
- value: new Map()
551
- });
552
- }
553
- setElementListeners(node) {
554
- const standardListeners = node.eventListeners.filter((l) => l._type !== 'custom');
555
- const customListeners = node.eventListeners.filter((l) => l._type === 'custom');
556
- this.updateCustomListeners(node, customListeners);
557
- if (standardListeners.length === 0) {
558
- this.removeStandardListeners(node);
559
- return;
560
- }
561
- let listenerInfo = this.listeners.get(node);
562
- if (!listenerInfo) {
563
- // eslint-disable-next-line @typescript-eslint/no-this-alias
564
- const that = this;
565
- listenerInfo = {
566
- counts: makeListenerCounts(eventTypes),
567
- listeners: [],
568
- realListener(event) {
569
- const listeners = that.listeners.get(node)?.listeners;
570
- if (listeners) {
571
- that.runListeners(event, listeners.map(listener => ({
572
- listener,
573
- owningNode: node,
574
- })));
575
- }
576
- },
577
- };
578
- this.listeners.set(node, listenerInfo);
579
- }
580
- const passive = standardListeners.reduce((acc, listener) => acc && (listener.options.passive ? true : false), true);
581
- const adjustments = adjustCountsAndGetListenerTypesToRemoveAndAdd(listenerInfo.counts, listenerInfo.listeners, standardListeners);
582
- listenerInfo.listeners = [...standardListeners];
583
- for (const [tpe, info] of adjustments.toAdd) {
584
- const domType = toNativeEventType(tpe);
585
- if (info.regular) {
586
- node.realNode.addEventListener(domType, listenerInfo.realListener, {
587
- capture: false,
588
- passive,
589
- });
590
- }
591
- if (info.capture) {
592
- node.realNode.addEventListener(domType, listenerInfo.realListener, {
593
- capture: true,
594
- passive,
595
- });
596
- }
597
- }
598
- for (const [tpe, info] of adjustments.toRemove) {
599
- const domType = toNativeEventType(tpe);
600
- if (info.regular) {
601
- node.realNode.removeEventListener(domType, listenerInfo.realListener, false);
602
- }
603
- if (info.capture) {
604
- node.realNode.removeEventListener(domType, listenerInfo.realListener, true);
605
- }
606
- }
607
- }
608
- updateCustomListeners(node, customListeners) {
609
- const existingHandlers = this.customHandlers.get(node) ?? new Map();
610
- const byName = new Map();
611
- for (const l of customListeners) {
612
- const arr = byName.get(l.eventName) ?? [];
613
- arr.push(l);
614
- byName.set(l.eventName, arr);
615
- }
616
- for (const [name, { realListener }] of existingHandlers) {
617
- if (!byName.has(name)) {
618
- node.realNode.removeEventListener(name, realListener, false);
619
- existingHandlers.delete(name);
620
- }
621
- }
622
- for (const [name, listeners] of byName) {
623
- const existing = existingHandlers.get(name);
624
- if (existing) {
625
- existing.listeners = listeners;
626
- }
627
- else {
628
- // eslint-disable-next-line @typescript-eslint/no-this-alias
629
- const that = this;
630
- const info = { listeners, realListener: null };
631
- info.realListener = (ev) => {
632
- const detail = ev.detail;
633
- for (const l of info.listeners) {
634
- that.runEffect(l.effect(detail), node, result => {
635
- if (result?.stopPropagation)
636
- ev.stopImmediatePropagation();
637
- if (result?.preventDefault)
638
- ev.preventDefault();
639
- });
640
- }
641
- };
642
- existingHandlers.set(name, info);
643
- node.realNode.addEventListener(name, info.realListener, {
644
- capture: false,
645
- passive: false,
646
- });
647
- }
648
- }
649
- if (existingHandlers.size > 0) {
650
- this.customHandlers.set(node, existingHandlers);
651
- }
652
- else {
653
- this.customHandlers.delete(node);
654
- }
655
- }
656
- removeStandardListeners(node) {
657
- const listenerInfo = this.listeners.get(node);
658
- if (!listenerInfo) {
659
- return;
660
- }
661
- for (const [eventType, info] of Object.entries(listenerInfo.counts)) {
662
- const domType = toNativeEventType(eventType);
663
- if (info.regular) {
664
- node.realNode.removeEventListener(domType, listenerInfo.realListener, false);
665
- }
666
- if (info.capture) {
667
- node.realNode.removeEventListener(domType, listenerInfo.realListener, true);
668
- }
669
- }
670
- this.listeners.delete(node);
671
- }
672
- }
673
- export class EventManager {
674
- constructor(window, runEffect) {
675
- Object.defineProperty(this, "containerDelegate", {
676
- enumerable: true,
677
- configurable: true,
678
- writable: true,
679
- value: void 0
680
- });
681
- Object.defineProperty(this, "elementDelegate", {
682
- enumerable: true,
683
- configurable: true,
684
- writable: true,
685
- value: void 0
686
- });
687
- this.containerDelegate = new ContainerEventManagerDelegate(window, runEffect);
688
- this.elementDelegate = new ElementEventManagerDelegate(window, runEffect);
689
- }
690
- setContainerListeners(node) {
691
- this.containerDelegate.setContainerListeners(node);
692
- }
693
- setElementListeners(node) {
694
- this.elementDelegate.setElementListeners(node);
695
- }
696
- }