ripple 0.3.7 → 0.3.8

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 (100) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.json +2 -2
  3. package/src/compiler/phases/1-parse/index.js +37 -194
  4. package/src/compiler/phases/2-analyze/index.js +63 -18
  5. package/src/compiler/phases/3-transform/client/index.js +19 -3
  6. package/src/compiler/phases/3-transform/server/index.js +16 -24
  7. package/src/compiler/types/parse.d.ts +0 -8
  8. package/src/runtime/internal/client/composite.js +2 -2
  9. package/tests/client/array/array.copy-within.test.ripple +12 -12
  10. package/tests/client/array/array.derived.test.ripple +46 -46
  11. package/tests/client/array/array.iteration.test.ripple +10 -10
  12. package/tests/client/array/array.mutations.test.ripple +20 -20
  13. package/tests/client/array/array.to-methods.test.ripple +6 -6
  14. package/tests/client/async-suspend.test.ripple +5 -5
  15. package/tests/client/basic/basic.attributes.test.ripple +81 -81
  16. package/tests/client/basic/basic.collections.test.ripple +9 -9
  17. package/tests/client/basic/basic.components.test.ripple +28 -28
  18. package/tests/client/basic/basic.errors.test.ripple +18 -18
  19. package/tests/client/basic/basic.events.test.ripple +37 -37
  20. package/tests/client/basic/basic.get-set.test.ripple +6 -6
  21. package/tests/client/basic/basic.reactivity.test.ripple +68 -68
  22. package/tests/client/basic/basic.rendering.test.ripple +19 -19
  23. package/tests/client/basic/basic.utilities.test.ripple +3 -3
  24. package/tests/client/boundaries.test.ripple +12 -12
  25. package/tests/client/compiler/__snapshots__/compiler.assignments.test.ripple.snap +5 -5
  26. package/tests/client/compiler/compiler.assignments.test.ripple +19 -19
  27. package/tests/client/compiler/compiler.basic.test.ripple +16 -16
  28. package/tests/client/compiler/compiler.tracked-access.test.ripple +2 -2
  29. package/tests/client/composite/composite.dynamic-components.test.ripple +9 -9
  30. package/tests/client/composite/composite.props.test.ripple +11 -11
  31. package/tests/client/composite/composite.reactivity.test.ripple +43 -43
  32. package/tests/client/composite/composite.render.test.ripple +3 -3
  33. package/tests/client/computed-properties.test.ripple +4 -4
  34. package/tests/client/date.test.ripple +42 -42
  35. package/tests/client/dynamic-elements.test.ripple +42 -42
  36. package/tests/client/events.test.ripple +70 -70
  37. package/tests/client/for.test.ripple +25 -25
  38. package/tests/client/head.test.ripple +19 -19
  39. package/tests/client/html.test.ripple +3 -3
  40. package/tests/client/input-value.test.ripple +84 -84
  41. package/tests/client/lazy-destructuring.test.ripple +71 -16
  42. package/tests/client/map.test.ripple +16 -16
  43. package/tests/client/media-query.test.ripple +7 -7
  44. package/tests/client/portal.test.ripple +11 -11
  45. package/tests/client/ref.test.ripple +4 -4
  46. package/tests/client/return.test.ripple +52 -52
  47. package/tests/client/set.test.ripple +6 -6
  48. package/tests/client/svg.test.ripple +5 -5
  49. package/tests/client/switch.test.ripple +44 -44
  50. package/tests/client/try.test.ripple +5 -5
  51. package/tests/client/url/url.derived.test.ripple +6 -6
  52. package/tests/client/url-search-params/url-search-params.derived.test.ripple +8 -8
  53. package/tests/client/url-search-params/url-search-params.iteration.test.ripple +10 -10
  54. package/tests/client/url-search-params/url-search-params.mutation.test.ripple +10 -10
  55. package/tests/client/url-search-params/url-search-params.retrieval.test.ripple +18 -18
  56. package/tests/client/url-search-params/url-search-params.serialization.test.ripple +2 -2
  57. package/tests/hydration/compiled/client/events.js +25 -25
  58. package/tests/hydration/compiled/client/for.js +70 -66
  59. package/tests/hydration/compiled/client/head.js +25 -25
  60. package/tests/hydration/compiled/client/hmr.js +2 -2
  61. package/tests/hydration/compiled/client/html.js +3 -3
  62. package/tests/hydration/compiled/client/if-children.js +24 -24
  63. package/tests/hydration/compiled/client/if.js +18 -18
  64. package/tests/hydration/compiled/client/mixed-control-flow.js +9 -9
  65. package/tests/hydration/compiled/client/portal.js +3 -3
  66. package/tests/hydration/compiled/client/reactivity.js +16 -16
  67. package/tests/hydration/compiled/client/return.js +40 -40
  68. package/tests/hydration/compiled/client/switch.js +12 -12
  69. package/tests/hydration/compiled/server/events.js +19 -19
  70. package/tests/hydration/compiled/server/for.js +41 -41
  71. package/tests/hydration/compiled/server/head.js +26 -26
  72. package/tests/hydration/compiled/server/hmr.js +2 -2
  73. package/tests/hydration/compiled/server/html.js +2 -2
  74. package/tests/hydration/compiled/server/if-children.js +16 -16
  75. package/tests/hydration/compiled/server/if.js +11 -11
  76. package/tests/hydration/compiled/server/mixed-control-flow.js +6 -6
  77. package/tests/hydration/compiled/server/portal.js +2 -2
  78. package/tests/hydration/compiled/server/reactivity.js +16 -16
  79. package/tests/hydration/compiled/server/return.js +25 -25
  80. package/tests/hydration/compiled/server/switch.js +8 -8
  81. package/tests/hydration/components/events.ripple +25 -25
  82. package/tests/hydration/components/for.ripple +66 -66
  83. package/tests/hydration/components/head.ripple +16 -16
  84. package/tests/hydration/components/hmr.ripple +2 -2
  85. package/tests/hydration/components/html.ripple +3 -3
  86. package/tests/hydration/components/if-children.ripple +24 -24
  87. package/tests/hydration/components/if.ripple +18 -18
  88. package/tests/hydration/components/mixed-control-flow.ripple +9 -9
  89. package/tests/hydration/components/portal.ripple +3 -3
  90. package/tests/hydration/components/reactivity.ripple +16 -16
  91. package/tests/hydration/components/return.ripple +40 -40
  92. package/tests/hydration/components/switch.ripple +20 -20
  93. package/tests/server/await.test.ripple +3 -3
  94. package/tests/server/basic.attributes.test.ripple +34 -34
  95. package/tests/server/basic.components.test.ripple +10 -10
  96. package/tests/server/basic.test.ripple +38 -40
  97. package/tests/server/composite.props.test.ripple +9 -9
  98. package/tests/server/dynamic-elements.test.ripple +13 -12
  99. package/tests/server/head.test.ripple +11 -11
  100. package/tests/server/lazy-destructuring.test.ripple +27 -4
@@ -21,7 +21,7 @@ describe('dynamic DOM elements', () => {
21
21
  component App() {
22
22
  let obj = { tag: track('div') };
23
23
 
24
- <obj.@tag>{'Hello World'}</obj.@tag>
24
+ <obj.tag.value>{'Hello World'}</obj.tag.value>
25
25
  }
26
26
  render(App);
27
27
 
@@ -33,8 +33,9 @@ describe('dynamic DOM elements', () => {
33
33
  it('renders static dynamic element from a tracked object with a tracked property', () => {
34
34
  component App() {
35
35
  let obj = track({ tag: track('div') });
36
+ let tag = obj.value.tag;
36
37
 
37
- <@obj.@tag>{'Hello World'}</@obj.@tag>
38
+ <@tag>{'Hello World'}</@tag>
38
39
  }
39
40
  render(App);
40
41
 
@@ -48,8 +49,9 @@ describe('dynamic DOM elements', () => {
48
49
  () => {
49
50
  component App() {
50
51
  let obj = track({ tag: track('div') });
52
+ let tag = obj.value['tag'];
51
53
 
52
- <@obj.@['tag']>{'Hello World'}</@obj.@['tag']>
54
+ <@tag>{'Hello World'}</@tag>
53
55
  }
54
56
  render(App);
55
57
 
@@ -61,11 +63,11 @@ describe('dynamic DOM elements', () => {
61
63
 
62
64
  it('renders reactive dynamic element', () => {
63
65
  component App() {
64
- let tag = track('div');
66
+ let &[tag] = track('div');
65
67
 
66
68
  <button
67
69
  onClick={() => {
68
- @tag = 'span';
70
+ tag = 'span';
69
71
  }}
70
72
  >
71
73
  {'Change Tag'}
@@ -107,9 +109,9 @@ describe('dynamic DOM elements', () => {
107
109
  it('handles dynamic element with attributes', () => {
108
110
  component App() {
109
111
  let tag = track('div');
110
- let className = track('test-class');
112
+ let &[className] = track('test-class');
111
113
 
112
- <@tag class={@className} id="test" data-testid="dynamic-element">{'Content'}</@tag>
114
+ <@tag class={className} id="test" data-testid="dynamic-element">{'Content'}</@tag>
113
115
  }
114
116
  render(App);
115
117
 
@@ -143,11 +145,9 @@ describe('dynamic DOM elements', () => {
143
145
  it('handles dynamic element with class object', () => {
144
146
  component App() {
145
147
  let tag = track('div');
146
- let active = track(true);
148
+ let &[active] = track(true);
147
149
 
148
- <@tag class={{ active: @active, 'dynamic-element': true }}>
149
- {'Element with class object'}
150
- </@tag>
150
+ <@tag class={{ active: active, 'dynamic-element': true }}>{'Element with class object'}</@tag>
151
151
  }
152
152
  render(App);
153
153
 
@@ -258,22 +258,22 @@ describe('dynamic DOM elements', () => {
258
258
  it('has reactive attributes on dynamic elements', () => {
259
259
  component App() {
260
260
  let tag = track('div');
261
- let count = track(0);
261
+ let &[count] = track(0);
262
262
 
263
263
  <button
264
264
  onClick={() => {
265
- @count++;
265
+ count++;
266
266
  }}
267
267
  >
268
268
  {'Increment'}
269
269
  </button>
270
270
  <@tag
271
- id={@count % 2 ? 'even' : 'odd'}
272
- class={@count % 2 ? 'even-class' : 'odd-class'}
273
- data-count={@count}
271
+ id={count % 2 ? 'even' : 'odd'}
272
+ class={count % 2 ? 'even-class' : 'odd-class'}
273
+ data-count={count}
274
274
  >
275
275
  {'Count: '}
276
- {@count}
276
+ {count}
277
277
  </@tag>
278
278
  }
279
279
 
@@ -337,17 +337,17 @@ describe('dynamic DOM elements', () => {
337
337
  it('applies scoped CSS to dynamic elements with reactive classes', () => {
338
338
  component App() {
339
339
  let tag = track('button');
340
- let count = track(0);
340
+ let &[count] = track(0);
341
341
 
342
342
  <@tag
343
- class={@count % 2 ? 'even' : 'odd'}
344
- id={@count % 2 ? 'even' : 'odd'}
343
+ class={count % 2 ? 'even' : 'odd'}
344
+ id={count % 2 ? 'even' : 'odd'}
345
345
  onClick={() => {
346
- @count++;
346
+ count++;
347
347
  }}
348
348
  >
349
349
  {'Count: '}
350
- {@count}
350
+ {count}
351
351
  </@tag>
352
352
 
353
353
  <style>
@@ -412,7 +412,7 @@ describe('dynamic DOM elements', () => {
412
412
  }>) {
413
413
  const tag = track('button');
414
414
  const [rest] = trackSplit(props, []);
415
- <@tag {...@rest}>{@rest.class}</@tag>
415
+ <@tag {...rest.value}>{rest.value.class}</@tag>
416
416
 
417
417
  <style>
418
418
  .even {
@@ -425,12 +425,12 @@ describe('dynamic DOM elements', () => {
425
425
  }
426
426
 
427
427
  component App() {
428
- const count = track(0);
428
+ let &[count] = track(0);
429
429
  <DynamicButton
430
- class={@count % 2 ? 'even' : 'odd'}
431
- id={@count % 2 ? 'even' : 'odd'}
430
+ class={count % 2 ? 'even' : 'odd'}
431
+ id={count % 2 ? 'even' : 'odd'}
432
432
  onClick={() => {
433
- @count++;
433
+ count++;
434
434
  }}
435
435
  />
436
436
  }
@@ -603,12 +603,12 @@ describe('dynamic DOM elements', () => {
603
603
  }
604
604
 
605
605
  component App() {
606
- let active = track(false);
606
+ let &[active] = track(false);
607
607
 
608
608
  <Button
609
- data-active={String(@active)}
609
+ data-active={String(active)}
610
610
  onClick={() => {
611
- @active = !@active;
611
+ active = !active;
612
612
  }}
613
613
  {ref (el: HTMLElement) => {
614
614
  capturedElement = el;
@@ -646,25 +646,25 @@ describe('dynamic DOM elements', () => {
646
646
  }
647
647
 
648
648
  component App() {
649
- let active = track(false);
649
+ let &[active] = track(false);
650
650
 
651
- let buttonProps = track(
651
+ let &[buttonProps] = track(
652
652
  () => ({
653
- 'data-active': @active,
653
+ 'data-active': active,
654
654
  }),
655
655
  );
656
656
 
657
657
  <Button
658
- {...@buttonProps}
658
+ {...buttonProps}
659
659
  onClick={() => {
660
- @active = !@active;
660
+ active = !active;
661
661
  }}
662
662
  {ref (el: HTMLElement) => {
663
663
  capturedElement = el;
664
664
  }}
665
665
  >
666
666
  {'content: '}
667
- {@active}
667
+ {active}
668
668
  </Button>
669
669
  }
670
670
 
@@ -693,12 +693,12 @@ describe('dynamic DOM elements', () => {
693
693
  }
694
694
 
695
695
  component App() {
696
- let active = track(false);
696
+ let &[active] = track(false);
697
697
 
698
698
  <Button
699
- data-active={String(@active)}
699
+ data-active={String(active)}
700
700
  onClick={() => {
701
- @active = !@active;
701
+ active = !active;
702
702
  }}
703
703
  {ref (el: HTMLElement) => {
704
704
  capturedElement = el;
@@ -730,13 +730,13 @@ describe('dynamic DOM elements', () => {
730
730
 
731
731
  it('should remove and add back a text node in a conditional statement with a tracked', () => {
732
732
  component App() {
733
- let b = track(true);
733
+ let &[b] = track(true);
734
734
  <div>
735
- if (@b) {
735
+ if (b) {
736
736
  {'Inside if'}
737
737
  }
738
738
  </div>
739
- <button onClick={() => (@b = !@b)}>{'Toggle b'}</button>
739
+ <button onClick={() => (b = !b)}>{'Toggle b'}</button>
740
740
  }
741
741
 
742
742
  render(App);
@@ -4,19 +4,19 @@ import { effect, flushSync, on, track } from 'ripple';
4
4
  describe('on() event handler', () => {
5
5
  it('should attach multiple handlers via onClick attribute (delegated)', () => {
6
6
  component Basic() {
7
- let count1 = track(0);
8
- let count2 = track(0);
7
+ let &[count1] = track(0);
8
+ let &[count2] = track(0);
9
9
 
10
10
  <button
11
11
  onClick={() => {
12
- @count1++;
13
- @count2++;
12
+ count1++;
13
+ count2++;
14
14
  }}
15
15
  >
16
16
  {'Click me'}
17
17
  </button>
18
- <div class="count1">{@count1}</div>
19
- <div class="count2">{@count2}</div>
18
+ <div class="count1">{count1}</div>
19
+ <div class="count2">{count2}</div>
20
20
  }
21
21
 
22
22
  render(Basic);
@@ -36,16 +36,16 @@ describe('on() event handler', () => {
36
36
 
37
37
  it('should attach and remove a single event handler', () => {
38
38
  component Basic() {
39
- let count = track(0);
39
+ let &[count] = track(0);
40
40
 
41
41
  const setupListener = (node: HTMLButtonElement) => {
42
42
  const remove = on(node, 'click', () => {
43
- @count++;
43
+ count++;
44
44
  });
45
45
  return remove;
46
46
  };
47
47
  <button {ref setupListener}>{'Click me'}</button>
48
- <div class="count">{@count}</div>
48
+ <div class="count">{count}</div>
49
49
  }
50
50
 
51
51
  render(Basic);
@@ -67,15 +67,15 @@ describe('on() event handler', () => {
67
67
 
68
68
  it('should handle multiple different event types on same element', () => {
69
69
  component Basic() {
70
- let clickCount = track(0);
71
- let mousedownCount = track(0);
70
+ let &[clickCount] = track(0);
71
+ let &[mousedownCount] = track(0);
72
72
 
73
73
  const setupListeners = (node: HTMLButtonElement) => {
74
74
  const remove1 = on(node, 'click', () => {
75
- @clickCount++;
75
+ clickCount++;
76
76
  });
77
77
  const remove2 = on(node, 'mousedown', () => {
78
- @mousedownCount++;
78
+ mousedownCount++;
79
79
  });
80
80
  return () => {
81
81
  remove1();
@@ -83,8 +83,8 @@ describe('on() event handler', () => {
83
83
  };
84
84
  };
85
85
  <button {ref setupListeners}>{'Test'}</button>
86
- <div class="click-count">{@clickCount}</div>
87
- <div class="mousedown-count">{@mousedownCount}</div>
86
+ <div class="click-count">{clickCount}</div>
87
+ <div class="mousedown-count">{mousedownCount}</div>
88
88
  }
89
89
 
90
90
  render(Basic);
@@ -116,17 +116,17 @@ describe('on() event handler', () => {
116
116
 
117
117
  it('should handle multiple handlers for same event type on same element', () => {
118
118
  component Basic() {
119
- let callOrder = track<number[]>([]);
119
+ let &[callOrder] = track<number[]>([]);
120
120
 
121
121
  const setupListeners = (node: HTMLButtonElement) => {
122
122
  const remove1 = on(node, 'click', () => {
123
- @callOrder = [...@callOrder, 1];
123
+ callOrder = [...callOrder, 1];
124
124
  });
125
125
  const remove2 = on(node, 'click', () => {
126
- @callOrder = [...@callOrder, 2];
126
+ callOrder = [...callOrder, 2];
127
127
  });
128
128
  const remove3 = on(node, 'click', () => {
129
- @callOrder = [...@callOrder, 3];
129
+ callOrder = [...callOrder, 3];
130
130
  });
131
131
  return () => {
132
132
  remove1();
@@ -135,7 +135,7 @@ describe('on() event handler', () => {
135
135
  };
136
136
  };
137
137
  <button {ref setupListeners}>{'Click me'}</button>
138
- <div class="order">{@callOrder.join(',')}</div>
138
+ <div class="order">{callOrder.join(',')}</div>
139
139
  }
140
140
 
141
141
  render(Basic);
@@ -158,20 +158,20 @@ describe('on() event handler', () => {
158
158
 
159
159
  it('should remove specific handler without affecting others', () => {
160
160
  component Basic() {
161
- let handler1Called = track(0);
162
- let handler2Called = track(0);
163
- let handler3Called = track(0);
161
+ let &[handler1Called] = track(0);
162
+ let &[handler2Called] = track(0);
163
+ let &[handler3Called] = track(0);
164
164
  let removeHandler2: OnEventListenerRemover | undefined;
165
165
 
166
166
  const setupListeners = (node: HTMLButtonElement) => {
167
167
  const remove1 = on(node, 'click', () => {
168
- @handler1Called++;
168
+ handler1Called++;
169
169
  });
170
170
  removeHandler2 = on(node, 'click', () => {
171
- @handler2Called++;
171
+ handler2Called++;
172
172
  });
173
173
  const remove3 = on(node, 'click', () => {
174
- @handler3Called++;
174
+ handler3Called++;
175
175
  });
176
176
  return () => {
177
177
  remove1();
@@ -190,9 +190,9 @@ describe('on() event handler', () => {
190
190
  >
191
191
  {'Remove handler 2'}
192
192
  </button>
193
- <div class="h1">{@handler1Called}</div>
194
- <div class="h2">{@handler2Called}</div>
195
- <div class="h3">{@handler3Called}</div>
193
+ <div class="h1">{handler1Called}</div>
194
+ <div class="h2">{handler2Called}</div>
195
+ <div class="h3">{handler3Called}</div>
196
196
  </div>
197
197
  }
198
198
 
@@ -235,18 +235,18 @@ describe('on() event handler', () => {
235
235
  'should handle change event with multiple handlers (like bindChecked and bindIndeterminate)',
236
236
  () => {
237
237
  component Basic() {
238
- let checked = track(false);
239
- let indeterminate = track(true);
238
+ let &[checked] = track(false);
239
+ let &[indeterminate] = track(true);
240
240
 
241
241
  const setupListeners = (node: HTMLInputElement) => {
242
- node.indeterminate = @indeterminate;
243
- node.checked = @checked;
242
+ node.indeterminate = indeterminate;
243
+ node.checked = checked;
244
244
 
245
245
  const remove1 = on(node, 'change', () => {
246
- @checked = node.checked;
246
+ checked = node.checked;
247
247
  });
248
248
  const remove2 = on(node, 'change', () => {
249
- @indeterminate = node.indeterminate;
249
+ indeterminate = node.indeterminate;
250
250
  });
251
251
  return () => {
252
252
  remove1();
@@ -255,8 +255,8 @@ describe('on() event handler', () => {
255
255
  };
256
256
  <div>
257
257
  <input type="checkbox" {ref setupListeners} />
258
- <div class="checked">{@checked ? 'true' : 'false'}</div>
259
- <div class="indeterminate">{@indeterminate ? 'true' : 'false'}</div>
258
+ <div class="checked">{checked ? 'true' : 'false'}</div>
259
+ <div class="indeterminate">{indeterminate ? 'true' : 'false'}</div>
260
260
  </div>
261
261
  }
262
262
 
@@ -283,17 +283,17 @@ describe('on() event handler', () => {
283
283
 
284
284
  it('should support non-delegated events', () => {
285
285
  component Basic() {
286
- let focusCount = track(0);
286
+ let &[focusCount] = track(0);
287
287
 
288
288
  const setupListener = (node: HTMLInputElement) => {
289
289
  const remove = on(node, 'focus', () => {
290
- @focusCount++;
290
+ focusCount++;
291
291
  });
292
292
  return remove;
293
293
  };
294
294
 
295
295
  <input {ref setupListener} />
296
- <div class="focus-count">{@focusCount}</div>
296
+ <div class="focus-count">{focusCount}</div>
297
297
  }
298
298
 
299
299
  render(Basic);
@@ -315,20 +315,20 @@ describe('on() event handler', () => {
315
315
 
316
316
  it('should handle removal of all handlers for same event type', () => {
317
317
  component Basic() {
318
- let count = track(0);
318
+ let &[count] = track(0);
319
319
  let remove1: OnEventListenerRemover | undefined;
320
320
  let remove2: OnEventListenerRemover | undefined;
321
321
  let remove3: OnEventListenerRemover | undefined;
322
322
 
323
323
  const setupListeners = (node: HTMLButtonElement) => {
324
324
  remove1 = on(node, 'click', () => {
325
- @count++;
325
+ count++;
326
326
  });
327
327
  remove2 = on(node, 'click', () => {
328
- @count += 10;
328
+ count += 10;
329
329
  });
330
330
  remove3 = on(node, 'click', () => {
331
- @count += 100;
331
+ count += 100;
332
332
  });
333
333
  return () => {
334
334
  remove1?.();
@@ -349,7 +349,7 @@ describe('on() event handler', () => {
349
349
  >
350
350
  {'Remove all'}
351
351
  </button>
352
- <div class="count">{@count}</div>
352
+ <div class="count">{count}</div>
353
353
  </div>
354
354
  }
355
355
 
@@ -379,10 +379,10 @@ describe('on() event handler', () => {
379
379
 
380
380
  it('should not add duplicate handlers when same handler is attached multiple times', () => {
381
381
  component Basic() {
382
- let count = track(0);
382
+ let &[count] = track(0);
383
383
 
384
384
  const sharedHandler = () => {
385
- @count++;
385
+ count++;
386
386
  };
387
387
 
388
388
  const setupListeners = (node: HTMLButtonElement) => {
@@ -399,7 +399,7 @@ describe('on() event handler', () => {
399
399
  };
400
400
 
401
401
  <button {ref setupListeners}>{'Click me'}</button>
402
- <div class="count">{@count}</div>
402
+ <div class="count">{count}</div>
403
403
  }
404
404
 
405
405
  render(Basic);
@@ -422,10 +422,10 @@ describe('on() event handler', () => {
422
422
 
423
423
  it('should allow duplicate handlers when delegated is false (no deduplication)', () => {
424
424
  component Basic() {
425
- let count = track(0);
425
+ let &[count] = track(0);
426
426
 
427
427
  const sharedHandler = () => {
428
- @count++;
428
+ count++;
429
429
  };
430
430
 
431
431
  const setupListeners = (node: HTMLButtonElement) => {
@@ -442,7 +442,7 @@ describe('on() event handler', () => {
442
442
  };
443
443
 
444
444
  <button {ref setupListeners}>{'Click me'}</button>
445
- <div class="count">{@count}</div>
445
+ <div class="count">{count}</div>
446
446
  }
447
447
 
448
448
  render(Basic);
@@ -466,14 +466,14 @@ describe('on() event handler', () => {
466
466
 
467
467
  it('should fire capture event on parent before bubbling event on child', () => {
468
468
  component Basic() {
469
- let callOrder = track<string[]>([]);
469
+ let &[callOrder] = track<string[]>([]);
470
470
 
471
471
  const parentCaptureHandler = () => {
472
- @callOrder = [...@callOrder, 'parent-capture'];
472
+ callOrder = [...callOrder, 'parent-capture'];
473
473
  };
474
474
 
475
475
  const childBubbleHandler = () => {
476
- @callOrder = [...@callOrder, 'child-bubble'];
476
+ callOrder = [...callOrder, 'child-bubble'];
477
477
  };
478
478
 
479
479
  const setupParent = (node: HTMLDivElement) => {
@@ -487,7 +487,7 @@ describe('on() event handler', () => {
487
487
  <div {ref setupParent} class="parent">
488
488
  <button {ref setupChild} class="child">{'Click me'}</button>
489
489
  </div>
490
- <div class="order">{@callOrder.join(',')}</div>
490
+ <div class="order">{callOrder.join(',')}</div>
491
491
  }
492
492
 
493
493
  render(Basic);
@@ -511,16 +511,16 @@ describe('on() event handler', () => {
511
511
 
512
512
  it('should fire handler only once when once option is true', () => {
513
513
  component Basic() {
514
- let count = track(0);
515
- let permanentCount = track(0);
514
+ let &[count] = track(0);
515
+ let &[permanentCount] = track(0);
516
516
 
517
517
  const setupListeners = (node: HTMLButtonElement) => {
518
518
  const onceHandler = on(node, 'click', () => {
519
- @count++;
519
+ count++;
520
520
  }, { once: true });
521
521
 
522
522
  const permanentHandler = on(node, 'click', () => {
523
- @permanentCount++;
523
+ permanentCount++;
524
524
  });
525
525
 
526
526
  return () => {
@@ -530,8 +530,8 @@ describe('on() event handler', () => {
530
530
  };
531
531
 
532
532
  <button {ref setupListeners}>{'Click me'}</button>
533
- <div class="once-count">{@count}</div>
534
- <div class="permanent-count">{@permanentCount}</div>
533
+ <div class="once-count">{count}</div>
534
+ <div class="permanent-count">{permanentCount}</div>
535
535
  }
536
536
 
537
537
  render(Basic);
@@ -565,18 +565,18 @@ describe('on() event handler', () => {
565
565
 
566
566
  it('should handle click events on window', () => {
567
567
  component Basic() {
568
- let windowClickCount = track(0);
568
+ let &[windowClickCount] = track(0);
569
569
 
570
570
  effect(() => {
571
571
  const removeWindowListener = on(window, 'click', () => {
572
- @windowClickCount++;
572
+ windowClickCount++;
573
573
  });
574
574
  return removeWindowListener;
575
575
  });
576
576
 
577
577
  <div>
578
578
  <button class="test-btn">{'Click me'}</button>
579
- <div class="window-count">{@windowClickCount}</div>
579
+ <div class="window-count">{windowClickCount}</div>
580
580
  </div>
581
581
  }
582
582
 
@@ -601,18 +601,18 @@ describe('on() event handler', () => {
601
601
 
602
602
  it('should handle click events on document', () => {
603
603
  component Basic() {
604
- let documentClickCount = track(0);
604
+ let &[documentClickCount] = track(0);
605
605
 
606
606
  effect(() => {
607
607
  const removeDocumentListener = on(document, 'click', () => {
608
- @documentClickCount++;
608
+ documentClickCount++;
609
609
  });
610
610
  return removeDocumentListener;
611
611
  });
612
612
 
613
613
  <div>
614
614
  <button class="test-btn">{'Click me'}</button>
615
- <div class="document-count">{@documentClickCount}</div>
615
+ <div class="document-count">{documentClickCount}</div>
616
616
  </div>
617
617
  }
618
618
 
@@ -637,18 +637,18 @@ describe('on() event handler', () => {
637
637
 
638
638
  it('should handle click events on body', () => {
639
639
  component Basic() {
640
- let bodyClickCount = track(0);
640
+ let &[bodyClickCount] = track(0);
641
641
 
642
642
  effect(() => {
643
643
  const removeBodyListener = on(document.body, 'click', () => {
644
- @bodyClickCount++;
644
+ bodyClickCount++;
645
645
  });
646
646
  return removeBodyListener;
647
647
  });
648
648
 
649
649
  <div>
650
650
  <button class="test-btn">{'Click me'}</button>
651
- <div class="body-count">{@bodyClickCount}</div>
651
+ <div class="body-count">{bodyClickCount}</div>
652
652
  </div>
653
653
  }
654
654