sprae 5.3.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/test/events.js ADDED
@@ -0,0 +1,138 @@
1
+ // import { signal } from 'usignal/sync'
2
+ import test, {is, any, throws} from 'tst'
3
+ import {tick, time} from 'wait-please'
4
+ import sprae from '../src/index.js'
5
+ import h from 'hyperf'
6
+
7
+
8
+ test('events: this context', e => {
9
+ let el = h`<div @x="log.push(this)"></div>`
10
+ let state = sprae(el, {log: []})
11
+ el.dispatchEvent(new window.Event('x'));
12
+ is(state.log, [el])
13
+ })
14
+
15
+ test('events: multiple events', e => {
16
+ let el = h`<div @scroll@click@x="log.push(event.type)"></div>`
17
+ let state = sprae(el, {log:[]})
18
+
19
+ el.dispatchEvent(new window.Event('click'));
20
+ is(state.log, ['click'])
21
+ el.dispatchEvent(new window.Event('scroll'));
22
+ is(state.log, ['click','scroll'])
23
+ el.dispatchEvent(new window.Event('x'));
24
+ is(state.log, ['click','scroll','x'])
25
+ })
26
+
27
+ test('events: once', e => {
28
+ // NOTE: if callback updates it's still rebound
29
+ let el = h`<x @x.once="(x&&log.push(this))" ></x>`
30
+ let log = []
31
+ let state = sprae(el, {log, x:1})
32
+ el.dispatchEvent(new window.Event('x'));
33
+ is(log, [el])
34
+ el.dispatchEvent(new window.Event('x'));
35
+ is(log, [el])
36
+ state.x = 2
37
+ el.dispatchEvent(new window.Event('x'));
38
+ el.dispatchEvent(new window.Event('x'));
39
+ is(log, [el])
40
+ })
41
+
42
+ test('events: capture, stop, prevent', e => {
43
+ let el = h`<x @x.capture="log.push(1)"><y @x="log.push(2)"></y></x>`
44
+ let state = sprae(el, {log:[]})
45
+ el.firstChild.dispatchEvent(new window.Event('x', {bubbles:true}));
46
+ is(state.log, [1,2])
47
+
48
+ let el2 = h`<x @x="log.push(1)"><y @x.stop="log.push(2)"></y></x>`
49
+ let state2 = sprae(el2, {log:[]})
50
+ el2.firstChild.dispatchEvent(new window.Event('x', {bubbles:true}));
51
+ is(state2.log, [2])
52
+ })
53
+
54
+ test('events: window, self', e => {
55
+ let el = h`<x @x.self="log.push(1)"><y @x.window="log.push(2)"></y></x>`
56
+ let state = sprae(el, {log:[]})
57
+ el.firstChild.dispatchEvent(new window.Event('x', {bubbles:true}));
58
+ is(state.log, [])
59
+ el.dispatchEvent(new window.Event('x', {bubbles:true}));
60
+ is(state.log, [1])
61
+ window.dispatchEvent(new window.Event('x', {bubbles:true}));
62
+ is(state.log, [1,2])
63
+ })
64
+
65
+ test('events: keys', e => {
66
+ let el = h`<x @keydown.enter="log.push(1)"></x>`
67
+ let state = {log:[]}
68
+ sprae(el, state)
69
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: '' }));
70
+ is(state.log,[])
71
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'Enter' }));
72
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: '' }));
73
+ is(state.log,[1])
74
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'Enter' }));
75
+ is(state.log,[1,1])
76
+ })
77
+
78
+ test('events: key combinations', e => {
79
+ let el = h`<x @keydown.ctrl-enter="log.push(1)"></x>`
80
+ let state = {log:[]}
81
+ sprae(el, state)
82
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: '' }));
83
+ is(state.log,[])
84
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'Enter' }));
85
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: '' }));
86
+ is(state.log,[])
87
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'Enter', ctrlKey: true }));
88
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'Enter' }));
89
+ is(state.log,[1])
90
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'Enter' }));
91
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'Enter', ctrlKey: true }));
92
+ is(state.log,[1,1])
93
+ let el2 = h`<x @keydown.ctrl-alt-enter="log.push(1)"></x>`
94
+ })
95
+
96
+ test('events: keys with prevent', e => {
97
+ let el = h`<y @keydown="log.push(event.key)"><x :ref="x" @keydown.enter.stop></x></y>`
98
+ let state = sprae(el, {log:[]})
99
+ state.x.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'x', bubbles: true }));
100
+ console.log('enter')
101
+ state.x.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
102
+ is(state.log,['x'])
103
+ })
104
+
105
+ test('events: debounce', async e => {
106
+ let el = h`<x @keydown.debounce-1="log.push(event.key)"></x>`
107
+ let state = sprae(el, {log:[]})
108
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'x', bubbles: true }));
109
+ is(state.log, [])
110
+ await time(2)
111
+ is(state.log, ['x'])
112
+ })
113
+
114
+ test('events: debounce 0', async e => {
115
+ let el = h`<x @keydown.debounce-0="log.push(event.key)"></x>`
116
+ let state = sprae(el, {log:[]})
117
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'x', bubbles: true }));
118
+ is(state.log, [])
119
+ await time(2)
120
+ is(state.log, ['x'])
121
+ })
122
+
123
+ test('events: throttle', async e => {
124
+ let el = h`<x @keydown.throttle-10="log.push(event.key)"></x>`
125
+ let state = sprae(el, {log:[]})
126
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'x', bubbles: true }));
127
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'x', bubbles: true }));
128
+ is(state.log, ['x'])
129
+ await time(5)
130
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'x', bubbles: true }));
131
+ is(state.log, ['x'])
132
+ await time(10)
133
+ is(state.log, ['x', 'x'])
134
+ await time(10)
135
+ is(state.log, ['x', 'x'])
136
+ el.dispatchEvent(new window.KeyboardEvent('keydown', { key: 'x', bubbles: true }));
137
+ is(state.log, ['x', 'x', 'x'])
138
+ })
package/test/test.js CHANGED
@@ -1,2 +1,13 @@
1
1
  import './state.js'
2
- import './dom.js'
2
+ import './attrs.js'
3
+ import './events.js'
4
+
5
+ Object.defineProperty(DocumentFragment.prototype, 'outerHTML', {
6
+ get() {
7
+ let s = ''
8
+ this.childNodes.forEach(n => {
9
+ s += n.nodeType === 3 ? n.textContent : n.outerHTML != null ? n.outerHTML : ''
10
+ })
11
+ return s
12
+ }
13
+ })