ripple 0.3.7 → 0.3.9

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 (119) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/package.json +2 -2
  3. package/src/compiler/phases/1-parse/index.js +48 -349
  4. package/src/compiler/phases/2-analyze/index.js +343 -52
  5. package/src/compiler/phases/3-transform/client/index.js +28 -160
  6. package/src/compiler/phases/3-transform/segments.js +0 -7
  7. package/src/compiler/phases/3-transform/server/index.js +31 -154
  8. package/src/compiler/types/acorn.d.ts +1 -1
  9. package/src/compiler/types/estree.d.ts +1 -1
  10. package/src/compiler/types/import.d.ts +0 -2
  11. package/src/compiler/types/index.d.ts +5 -17
  12. package/src/compiler/types/parse.d.ts +1 -17
  13. package/src/compiler/utils.js +53 -20
  14. package/src/runtime/index-client.js +2 -13
  15. package/src/runtime/index-server.js +2 -2
  16. package/src/runtime/internal/client/bindings.js +3 -1
  17. package/src/runtime/internal/client/composite.js +3 -2
  18. package/src/runtime/internal/client/events.js +1 -1
  19. package/src/runtime/internal/client/head.js +3 -4
  20. package/src/runtime/internal/client/index.js +0 -1
  21. package/src/runtime/internal/client/runtime.js +0 -52
  22. package/src/runtime/internal/server/index.js +31 -55
  23. package/tests/client/array/array.copy-within.test.ripple +12 -12
  24. package/tests/client/array/array.derived.test.ripple +46 -46
  25. package/tests/client/array/array.iteration.test.ripple +10 -10
  26. package/tests/client/array/array.mutations.test.ripple +20 -20
  27. package/tests/client/array/array.to-methods.test.ripple +6 -6
  28. package/tests/client/async-suspend.test.ripple +5 -5
  29. package/tests/client/basic/basic.attributes.test.ripple +81 -81
  30. package/tests/client/basic/basic.collections.test.ripple +9 -9
  31. package/tests/client/basic/basic.components.test.ripple +28 -28
  32. package/tests/client/basic/basic.errors.test.ripple +46 -18
  33. package/tests/client/basic/basic.events.test.ripple +37 -37
  34. package/tests/client/basic/basic.get-set.test.ripple +6 -6
  35. package/tests/client/basic/basic.reactivity.test.ripple +58 -203
  36. package/tests/client/basic/basic.rendering.test.ripple +19 -19
  37. package/tests/client/basic/basic.utilities.test.ripple +3 -3
  38. package/tests/client/boundaries.test.ripple +12 -12
  39. package/tests/client/compiler/__snapshots__/compiler.assignments.test.ripple.snap +5 -5
  40. package/tests/client/compiler/compiler.assignments.test.ripple +19 -19
  41. package/tests/client/compiler/compiler.basic.test.ripple +46 -27
  42. package/tests/client/compiler/compiler.tracked-access.test.ripple +2 -2
  43. package/tests/client/composite/composite.dynamic-components.test.ripple +9 -9
  44. package/tests/client/composite/composite.props.test.ripple +14 -16
  45. package/tests/client/composite/composite.reactivity.test.ripple +69 -70
  46. package/tests/client/composite/composite.render.test.ripple +3 -3
  47. package/tests/client/computed-properties.test.ripple +4 -4
  48. package/tests/client/date.test.ripple +42 -42
  49. package/tests/client/dynamic-elements.test.ripple +44 -45
  50. package/tests/client/events.test.ripple +70 -70
  51. package/tests/client/for.test.ripple +25 -25
  52. package/tests/client/head.test.ripple +19 -19
  53. package/tests/client/html.test.ripple +3 -3
  54. package/tests/client/input-value.test.ripple +84 -84
  55. package/tests/client/lazy-destructuring.test.ripple +138 -26
  56. package/tests/client/map.test.ripple +16 -16
  57. package/tests/client/media-query.test.ripple +7 -7
  58. package/tests/client/portal.test.ripple +11 -11
  59. package/tests/client/ref.test.ripple +4 -4
  60. package/tests/client/return.test.ripple +52 -52
  61. package/tests/client/set.test.ripple +6 -6
  62. package/tests/client/svg.test.ripple +5 -5
  63. package/tests/client/switch.test.ripple +44 -44
  64. package/tests/client/try.test.ripple +5 -5
  65. package/tests/client/url/url.derived.test.ripple +6 -6
  66. package/tests/client/url-search-params/url-search-params.derived.test.ripple +8 -8
  67. package/tests/client/url-search-params/url-search-params.iteration.test.ripple +10 -10
  68. package/tests/client/url-search-params/url-search-params.mutation.test.ripple +10 -10
  69. package/tests/client/url-search-params/url-search-params.retrieval.test.ripple +18 -18
  70. package/tests/client/url-search-params/url-search-params.serialization.test.ripple +2 -2
  71. package/tests/hydration/compiled/client/events.js +25 -25
  72. package/tests/hydration/compiled/client/for.js +70 -66
  73. package/tests/hydration/compiled/client/head.js +25 -25
  74. package/tests/hydration/compiled/client/hmr.js +2 -2
  75. package/tests/hydration/compiled/client/html.js +3 -3
  76. package/tests/hydration/compiled/client/if-children.js +24 -24
  77. package/tests/hydration/compiled/client/if.js +18 -18
  78. package/tests/hydration/compiled/client/mixed-control-flow.js +9 -9
  79. package/tests/hydration/compiled/client/portal.js +3 -3
  80. package/tests/hydration/compiled/client/reactivity.js +16 -16
  81. package/tests/hydration/compiled/client/return.js +40 -40
  82. package/tests/hydration/compiled/client/switch.js +12 -12
  83. package/tests/hydration/compiled/server/events.js +19 -19
  84. package/tests/hydration/compiled/server/for.js +41 -41
  85. package/tests/hydration/compiled/server/head.js +26 -26
  86. package/tests/hydration/compiled/server/hmr.js +2 -2
  87. package/tests/hydration/compiled/server/html.js +2 -2
  88. package/tests/hydration/compiled/server/if-children.js +16 -16
  89. package/tests/hydration/compiled/server/if.js +11 -11
  90. package/tests/hydration/compiled/server/mixed-control-flow.js +6 -6
  91. package/tests/hydration/compiled/server/portal.js +2 -2
  92. package/tests/hydration/compiled/server/reactivity.js +16 -16
  93. package/tests/hydration/compiled/server/return.js +25 -25
  94. package/tests/hydration/compiled/server/switch.js +8 -8
  95. package/tests/hydration/components/events.ripple +25 -25
  96. package/tests/hydration/components/for.ripple +66 -66
  97. package/tests/hydration/components/head.ripple +16 -16
  98. package/tests/hydration/components/hmr.ripple +2 -2
  99. package/tests/hydration/components/html.ripple +3 -3
  100. package/tests/hydration/components/if-children.ripple +24 -24
  101. package/tests/hydration/components/if.ripple +18 -18
  102. package/tests/hydration/components/mixed-control-flow.ripple +9 -9
  103. package/tests/hydration/components/portal.ripple +3 -3
  104. package/tests/hydration/components/reactivity.ripple +16 -16
  105. package/tests/hydration/components/return.ripple +40 -40
  106. package/tests/hydration/components/switch.ripple +20 -20
  107. package/tests/server/await.test.ripple +3 -3
  108. package/tests/server/basic.attributes.test.ripple +34 -34
  109. package/tests/server/basic.components.test.ripple +10 -10
  110. package/tests/server/basic.test.ripple +38 -40
  111. package/tests/server/compiler.test.ripple +22 -0
  112. package/tests/server/composite.props.test.ripple +12 -14
  113. package/tests/server/dynamic-elements.test.ripple +15 -15
  114. package/tests/server/head.test.ripple +11 -11
  115. package/tests/server/lazy-destructuring.test.ripple +92 -13
  116. package/tsconfig.typecheck.json +4 -0
  117. package/types/index.d.ts +0 -19
  118. package/tests/client/__snapshots__/tracked-expression.test.ripple.snap +0 -34
  119. package/tests/client/tracked-expression.test.ripple +0 -26
@@ -4,10 +4,10 @@ describe('RippleDate', () => {
4
4
  it('handles getTime() with reactive updates', () => {
5
5
  component DateTest() {
6
6
  let date = RippleDate(2025, 0, 1);
7
- let time = track(() => date.getTime());
7
+ let &[time] = track(() => date.getTime());
8
8
 
9
9
  <button onClick={() => date.setFullYear(2026)}>{'Change Year'}</button>
10
- <pre>{@time}</pre>
10
+ <pre>{time}</pre>
11
11
  }
12
12
 
13
13
  render(DateTest);
@@ -26,10 +26,10 @@ describe('RippleDate', () => {
26
26
  it('handles getFullYear() with reactive updates', () => {
27
27
  component DateTest() {
28
28
  let date = RippleDate(2025, 5, 15);
29
- let year = track(() => date.getFullYear());
29
+ let &[year] = track(() => date.getFullYear());
30
30
 
31
31
  <button onClick={() => date.setFullYear(2030)}>{'Change Year'}</button>
32
- <pre>{@year}</pre>
32
+ <pre>{year}</pre>
33
33
  }
34
34
 
35
35
  render(DateTest);
@@ -47,10 +47,10 @@ describe('RippleDate', () => {
47
47
  it('handles getMonth() with reactive updates', () => {
48
48
  component DateTest() {
49
49
  let date = RippleDate(2025, 0, 15);
50
- let month = track(() => date.getMonth());
50
+ let &[month] = track(() => date.getMonth());
51
51
 
52
52
  <button onClick={() => date.setMonth(11)}>{'Change to December'}</button>
53
- <pre>{@month}</pre>
53
+ <pre>{month}</pre>
54
54
  }
55
55
 
56
56
  render(DateTest);
@@ -68,10 +68,10 @@ describe('RippleDate', () => {
68
68
  it('handles getDate() with reactive updates', () => {
69
69
  component DateTest() {
70
70
  let date = RippleDate(2025, 0, 1);
71
- let day = track(() => date.getDate());
71
+ let &[day] = track(() => date.getDate());
72
72
 
73
73
  <button onClick={() => date.setDate(15)}>{'Change Day'}</button>
74
- <pre>{@day}</pre>
74
+ <pre>{day}</pre>
75
75
  }
76
76
 
77
77
  render(DateTest);
@@ -89,10 +89,10 @@ describe('RippleDate', () => {
89
89
  it('handles getDay() with reactive updates', () => {
90
90
  component DateTest() {
91
91
  let date = RippleDate(2025, 0, 1);
92
- let dayOfWeek = track(() => date.getDay());
92
+ let &[dayOfWeek] = track(() => date.getDay());
93
93
 
94
94
  <button onClick={() => date.setDate(2)}>{'Next Day'}</button>
95
- <pre>{@dayOfWeek}</pre>
95
+ <pre>{dayOfWeek}</pre>
96
96
  }
97
97
 
98
98
  render(DateTest);
@@ -110,10 +110,10 @@ describe('RippleDate', () => {
110
110
  it('handles getHours() with reactive updates', () => {
111
111
  component DateTest() {
112
112
  let date = RippleDate(2025, 0, 1, 10, 30, 0);
113
- let hours = track(() => date.getHours());
113
+ let &[hours] = track(() => date.getHours());
114
114
 
115
115
  <button onClick={() => date.setHours(15)}>{'Change to 3 PM'}</button>
116
- <pre>{@hours}</pre>
116
+ <pre>{hours}</pre>
117
117
  }
118
118
 
119
119
  render(DateTest);
@@ -131,10 +131,10 @@ describe('RippleDate', () => {
131
131
  it('handles getMinutes() with reactive updates', () => {
132
132
  component DateTest() {
133
133
  let date = RippleDate(2025, 0, 1, 10, 15, 0);
134
- let minutes = track(() => date.getMinutes());
134
+ let &[minutes] = track(() => date.getMinutes());
135
135
 
136
136
  <button onClick={() => date.setMinutes(45)}>{'Change Minutes'}</button>
137
- <pre>{@minutes}</pre>
137
+ <pre>{minutes}</pre>
138
138
  }
139
139
 
140
140
  render(DateTest);
@@ -152,10 +152,10 @@ describe('RippleDate', () => {
152
152
  it('handles getSeconds() with reactive updates', () => {
153
153
  component DateTest() {
154
154
  let date = RippleDate(2025, 0, 1, 10, 15, 30);
155
- let seconds = track(() => date.getSeconds());
155
+ let &[seconds] = track(() => date.getSeconds());
156
156
 
157
157
  <button onClick={() => date.setSeconds(45)}>{'Change Seconds'}</button>
158
- <pre>{@seconds}</pre>
158
+ <pre>{seconds}</pre>
159
159
  }
160
160
 
161
161
  render(DateTest);
@@ -173,10 +173,10 @@ describe('RippleDate', () => {
173
173
  it('handles toISOString() with reactive updates', () => {
174
174
  component DateTest() {
175
175
  let date = RippleDate(2025, 0, 1, 12, 0, 0);
176
- let isoString = track(() => date.toISOString());
176
+ let &[isoString] = track(() => date.toISOString());
177
177
 
178
178
  <button onClick={() => date.setFullYear(2026)}>{'Change Year'}</button>
179
- <pre>{@isoString}</pre>
179
+ <pre>{isoString}</pre>
180
180
  }
181
181
 
182
182
  render(DateTest);
@@ -199,10 +199,10 @@ describe('RippleDate', () => {
199
199
  it('handles toDateString() with reactive updates', () => {
200
200
  component DateTest() {
201
201
  let date = RippleDate(2025, 0, 1);
202
- let dateString = track(() => date.toDateString());
202
+ let &[dateString] = track(() => date.toDateString());
203
203
 
204
204
  <button onClick={() => date.setMonth(11)}>{'Change to December'}</button>
205
- <pre>{@dateString}</pre>
205
+ <pre>{dateString}</pre>
206
206
  }
207
207
 
208
208
  render(DateTest);
@@ -223,10 +223,10 @@ describe('RippleDate', () => {
223
223
  it('handles valueOf() with reactive updates', () => {
224
224
  component DateTest() {
225
225
  let date = RippleDate(2025, 0, 1);
226
- let valueOf = track(() => date.valueOf());
226
+ let &[valueOf] = track(() => date.valueOf());
227
227
 
228
228
  <button onClick={() => date.setDate(2)}>{'Next Day'}</button>
229
- <pre>{@valueOf}</pre>
229
+ <pre>{valueOf}</pre>
230
230
  }
231
231
 
232
232
  render(DateTest);
@@ -245,29 +245,29 @@ describe('RippleDate', () => {
245
245
  it('handles multiple get methods reacting to same setTime change', () => {
246
246
  component DateTest() {
247
247
  let date = RippleDate(2025, 0, 1, 10, 30, 15);
248
- let year = track(() => date.getFullYear());
249
- let month = track(() => date.getMonth());
250
- let day = track(() => date.getDate());
251
- let hours = track(() => date.getHours());
248
+ let &[year] = track(() => date.getFullYear());
249
+ let &[month] = track(() => date.getMonth());
250
+ let &[day] = track(() => date.getDate());
251
+ let &[hours] = track(() => date.getHours());
252
252
 
253
253
  <button onClick={() => date.setTime(new Date(2026, 5, 15, 14, 45, 30).getTime())}>
254
254
  {'Change All'}
255
255
  </button>
256
256
  <div>
257
257
  {'Year: '}
258
- {@year}
258
+ {year}
259
259
  </div>
260
260
  <div>
261
261
  {'Month: '}
262
- {@month}
262
+ {month}
263
263
  </div>
264
264
  <div>
265
265
  {'Day: '}
266
- {@day}
266
+ {day}
267
267
  </div>
268
268
  <div>
269
269
  {'Hours: '}
270
- {@hours}
270
+ {hours}
271
271
  </div>
272
272
  }
273
273
 
@@ -297,26 +297,26 @@ describe('RippleDate', () => {
297
297
  let dateFromNumbers = RippleDate(2025, 0, 1);
298
298
  let dateFromTimestamp = RippleDate(1735689600000);
299
299
 
300
- let nowYear = track(() => dateNow.getFullYear());
301
- let stringYear = track(() => dateFromString.getFullYear());
302
- let numbersYear = track(() => dateFromNumbers.getFullYear());
303
- let timestampYear = track(() => dateFromTimestamp.getFullYear());
300
+ let &[nowYear] = track(() => dateNow.getFullYear());
301
+ let &[stringYear] = track(() => dateFromString.getFullYear());
302
+ let &[numbersYear] = track(() => dateFromNumbers.getFullYear());
303
+ let &[timestampYear] = track(() => dateFromTimestamp.getFullYear());
304
304
 
305
305
  <div>
306
306
  {'Now: '}
307
- {@nowYear}
307
+ {nowYear}
308
308
  </div>
309
309
  <div>
310
310
  {'String: '}
311
- {@stringYear}
311
+ {stringYear}
312
312
  </div>
313
313
  <div>
314
314
  {'Numbers: '}
315
- {@numbersYear}
315
+ {numbersYear}
316
316
  </div>
317
317
  <div>
318
318
  {'Timestamp: '}
319
- {@timestampYear}
319
+ {timestampYear}
320
320
  </div>
321
321
  }
322
322
 
@@ -342,17 +342,17 @@ describe('RippleDate', () => {
342
342
  it('handles get methods with arguments non-memoized', () => {
343
343
  component DateTest() {
344
344
  let date = RippleDate();
345
- let localeDateString = track(() => date.toLocaleDateString('en-US'));
346
- let localeTimeString = track(() => date.toLocaleTimeString('en-US'));
345
+ let &[localeDateString] = track(() => date.toLocaleDateString('en-US'));
346
+ let &[localeTimeString] = track(() => date.toLocaleTimeString('en-US'));
347
347
 
348
348
  <button onClick={() => date.setFullYear(date.getFullYear() + 1)}>{'Next Year'}</button>
349
349
  <div>
350
350
  {'Date: '}
351
- {@localeDateString}
351
+ {localeDateString}
352
352
  </div>
353
353
  <div>
354
354
  {'Time: '}
355
- {@localeTimeString}
355
+ {localeTimeString}
356
356
  </div>
357
357
  }
358
358
 
@@ -1,5 +1,5 @@
1
1
  import type { PropsWithExtras } from 'ripple';
2
- import { createRefKey, flushSync, track, trackSplit } from 'ripple';
2
+ import { createRefKey, flushSync, track } from 'ripple';
3
3
 
4
4
  describe('dynamic DOM elements', () => {
5
5
  it('renders static dynamic element', () => {
@@ -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>
@@ -405,14 +405,13 @@ describe('dynamic DOM elements', () => {
405
405
  });
406
406
 
407
407
  it('handles spread attributes with class and CSS scoping ', () => {
408
- component DynamicButton(props: PropsWithExtras<{
408
+ component DynamicButton(&{ ...rest }: PropsWithExtras<{
409
409
  class: string;
410
410
  id: string;
411
411
  onClick: EventListener;
412
412
  }>) {
413
413
  const tag = track('button');
414
- const [rest] = trackSplit(props, []);
415
- <@tag {...@rest}>{@rest.class}</@tag>
414
+ <@tag {...rest}>{rest.class}</@tag>
416
415
 
417
416
  <style>
418
417
  .even {
@@ -425,12 +424,12 @@ describe('dynamic DOM elements', () => {
425
424
  }
426
425
 
427
426
  component App() {
428
- const count = track(0);
427
+ let &[count] = track(0);
429
428
  <DynamicButton
430
- class={@count % 2 ? 'even' : 'odd'}
431
- id={@count % 2 ? 'even' : 'odd'}
429
+ class={count % 2 ? 'even' : 'odd'}
430
+ id={count % 2 ? 'even' : 'odd'}
432
431
  onClick={() => {
433
- @count++;
432
+ count++;
434
433
  }}
435
434
  />
436
435
  }
@@ -603,12 +602,12 @@ describe('dynamic DOM elements', () => {
603
602
  }
604
603
 
605
604
  component App() {
606
- let active = track(false);
605
+ let &[active] = track(false);
607
606
 
608
607
  <Button
609
- data-active={String(@active)}
608
+ data-active={String(active)}
610
609
  onClick={() => {
611
- @active = !@active;
610
+ active = !active;
612
611
  }}
613
612
  {ref (el: HTMLElement) => {
614
613
  capturedElement = el;
@@ -646,25 +645,25 @@ describe('dynamic DOM elements', () => {
646
645
  }
647
646
 
648
647
  component App() {
649
- let active = track(false);
648
+ let &[active] = track(false);
650
649
 
651
- let buttonProps = track(
650
+ let &[buttonProps] = track(
652
651
  () => ({
653
- 'data-active': @active,
652
+ 'data-active': active,
654
653
  }),
655
654
  );
656
655
 
657
656
  <Button
658
- {...@buttonProps}
657
+ {...buttonProps}
659
658
  onClick={() => {
660
- @active = !@active;
659
+ active = !active;
661
660
  }}
662
661
  {ref (el: HTMLElement) => {
663
662
  capturedElement = el;
664
663
  }}
665
664
  >
666
665
  {'content: '}
667
- {@active}
666
+ {active}
668
667
  </Button>
669
668
  }
670
669
 
@@ -693,12 +692,12 @@ describe('dynamic DOM elements', () => {
693
692
  }
694
693
 
695
694
  component App() {
696
- let active = track(false);
695
+ let &[active] = track(false);
697
696
 
698
697
  <Button
699
- data-active={String(@active)}
698
+ data-active={String(active)}
700
699
  onClick={() => {
701
- @active = !@active;
700
+ active = !active;
702
701
  }}
703
702
  {ref (el: HTMLElement) => {
704
703
  capturedElement = el;
@@ -730,13 +729,13 @@ describe('dynamic DOM elements', () => {
730
729
 
731
730
  it('should remove and add back a text node in a conditional statement with a tracked', () => {
732
731
  component App() {
733
- let b = track(true);
732
+ let &[b] = track(true);
734
733
  <div>
735
- if (@b) {
734
+ if (b) {
736
735
  {'Inside if'}
737
736
  }
738
737
  </div>
739
- <button onClick={() => (@b = !@b)}>{'Toggle b'}</button>
738
+ <button onClick={() => (b = !b)}>{'Toggle b'}</button>
740
739
  }
741
740
 
742
741
  render(App);