ripple 0.3.71 → 0.3.74

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 (165) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +2 -8
  4. package/src/runtime/index-client.js +3 -13
  5. package/src/runtime/internal/client/blocks.js +3 -25
  6. package/src/runtime/internal/client/for.js +80 -5
  7. package/src/runtime/internal/client/index.js +0 -2
  8. package/src/runtime/internal/client/types.d.ts +0 -10
  9. package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
  10. package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
  11. package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
  12. package/tests/client/array/array.copy-within.test.tsrx +19 -19
  13. package/tests/client/array/array.derived.test.tsrx +97 -109
  14. package/tests/client/array/array.iteration.test.tsrx +28 -28
  15. package/tests/client/array/array.mutations.test.tsrx +68 -68
  16. package/tests/client/array/array.static.test.tsrx +82 -92
  17. package/tests/client/array/array.to-methods.test.tsrx +15 -15
  18. package/tests/client/async-suspend.test.tsrx +180 -179
  19. package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
  20. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
  21. package/tests/client/basic/basic.attributes.test.tsrx +273 -317
  22. package/tests/client/basic/basic.collections.test.tsrx +59 -71
  23. package/tests/client/basic/basic.components.test.tsrx +196 -222
  24. package/tests/client/basic/basic.errors.test.tsrx +72 -78
  25. package/tests/client/basic/basic.events.test.tsrx +80 -85
  26. package/tests/client/basic/basic.get-set.test.tsrx +54 -64
  27. package/tests/client/basic/basic.hmr.test.tsrx +15 -19
  28. package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
  29. package/tests/client/basic/basic.rendering.test.tsrx +273 -178
  30. package/tests/client/basic/basic.utilities.test.tsrx +8 -10
  31. package/tests/client/boundaries.test.tsrx +18 -18
  32. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
  33. package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
  34. package/tests/client/compiler/compiler.basic.test.tsrx +364 -296
  35. package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
  36. package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
  37. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  38. package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
  39. package/tests/client/composite/composite.dynamic-components.test.tsrx +41 -44
  40. package/tests/client/composite/composite.generics.test.tsrx +165 -167
  41. package/tests/client/composite/composite.props.test.tsrx +66 -74
  42. package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
  43. package/tests/client/composite/composite.render.test.tsrx +92 -101
  44. package/tests/client/computed-properties.test.tsrx +14 -18
  45. package/tests/client/context.test.tsrx +14 -18
  46. package/tests/client/css/global-additional-cases.test.tsrx +491 -437
  47. package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
  48. package/tests/client/css/global-at-rules.test.tsrx +71 -66
  49. package/tests/client/css/global-basic.test.tsrx +105 -98
  50. package/tests/client/css/global-classes-ids.test.tsrx +128 -114
  51. package/tests/client/css/global-combinators.test.tsrx +83 -78
  52. package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
  53. package/tests/client/css/global-edge-cases.test.tsrx +138 -120
  54. package/tests/client/css/global-keyframes.test.tsrx +108 -96
  55. package/tests/client/css/global-nested.test.tsrx +88 -78
  56. package/tests/client/css/global-pseudo.test.tsrx +104 -98
  57. package/tests/client/css/global-scoping.test.tsrx +145 -125
  58. package/tests/client/css/style-identifier.test.tsrx +62 -69
  59. package/tests/client/date.test.tsrx +83 -83
  60. package/tests/client/dynamic-elements.test.tsrx +227 -283
  61. package/tests/client/events.test.tsrx +252 -266
  62. package/tests/client/for.test.tsrx +120 -127
  63. package/tests/client/head.test.tsrx +40 -48
  64. package/tests/client/html.test.tsrx +37 -49
  65. package/tests/client/input-value.test.tsrx +1125 -1354
  66. package/tests/client/lazy-array.test.tsrx +10 -16
  67. package/tests/client/lazy-destructuring.test.tsrx +169 -221
  68. package/tests/client/map.test.tsrx +39 -41
  69. package/tests/client/media-query.test.tsrx +15 -19
  70. package/tests/client/object.test.tsrx +46 -56
  71. package/tests/client/portal.test.tsrx +31 -37
  72. package/tests/client/ref.test.tsrx +173 -193
  73. package/tests/client/return.test.tsrx +62 -37
  74. package/tests/client/set.test.tsrx +33 -33
  75. package/tests/client/svg.test.tsrx +195 -215
  76. package/tests/client/switch.test.tsrx +201 -191
  77. package/tests/client/track-async-hydration.test.tsrx +14 -18
  78. package/tests/client/tracked-index-access.test.tsrx +18 -28
  79. package/tests/client/try.test.tsrx +494 -619
  80. package/tests/client/tsx.test.tsrx +290 -371
  81. package/tests/client/typescript-generics.test.tsrx +121 -129
  82. package/tests/client/url/url.derived.test.tsrx +21 -25
  83. package/tests/client/url/url.parsing.test.tsrx +35 -35
  84. package/tests/client/url/url.partial-removal.test.tsrx +32 -32
  85. package/tests/client/url/url.reactivity.test.tsrx +68 -72
  86. package/tests/client/url/url.serialization.test.tsrx +8 -8
  87. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
  88. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
  89. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
  90. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
  91. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
  92. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
  93. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
  94. package/tests/hydration/compiled/client/basic.js +396 -325
  95. package/tests/hydration/compiled/client/composite.js +52 -44
  96. package/tests/hydration/compiled/client/for.js +734 -604
  97. package/tests/hydration/compiled/client/head.js +183 -103
  98. package/tests/hydration/compiled/client/html.js +93 -86
  99. package/tests/hydration/compiled/client/if-children.js +95 -71
  100. package/tests/hydration/compiled/client/if.js +113 -89
  101. package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
  102. package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
  103. package/tests/hydration/compiled/client/reactivity.js +26 -24
  104. package/tests/hydration/compiled/client/return.js +8 -42
  105. package/tests/hydration/compiled/client/switch.js +208 -173
  106. package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
  107. package/tests/hydration/compiled/client/try.js +29 -21
  108. package/tests/hydration/compiled/server/basic.js +210 -221
  109. package/tests/hydration/compiled/server/composite.js +13 -14
  110. package/tests/hydration/compiled/server/for.js +427 -444
  111. package/tests/hydration/compiled/server/head.js +199 -189
  112. package/tests/hydration/compiled/server/html.js +33 -41
  113. package/tests/hydration/compiled/server/if-children.js +114 -117
  114. package/tests/hydration/compiled/server/if.js +77 -83
  115. package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
  116. package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
  117. package/tests/hydration/compiled/server/reactivity.js +24 -22
  118. package/tests/hydration/compiled/server/return.js +6 -18
  119. package/tests/hydration/compiled/server/switch.js +179 -176
  120. package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
  121. package/tests/hydration/compiled/server/try.js +31 -35
  122. package/tests/hydration/components/basic.tsrx +216 -286
  123. package/tests/hydration/components/composite.tsrx +32 -42
  124. package/tests/hydration/components/events.tsrx +81 -101
  125. package/tests/hydration/components/for.tsrx +270 -336
  126. package/tests/hydration/components/head.tsrx +43 -39
  127. package/tests/hydration/components/hmr.tsrx +16 -22
  128. package/tests/hydration/components/html-in-template.tsrx +15 -21
  129. package/tests/hydration/components/html.tsrx +442 -526
  130. package/tests/hydration/components/if-children.tsrx +107 -125
  131. package/tests/hydration/components/if.tsrx +68 -90
  132. package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
  133. package/tests/hydration/components/nested-control-flow.tsrx +202 -216
  134. package/tests/hydration/components/portal.tsrx +33 -41
  135. package/tests/hydration/components/reactivity.tsrx +26 -34
  136. package/tests/hydration/components/return.tsrx +4 -6
  137. package/tests/hydration/components/switch.tsrx +73 -78
  138. package/tests/hydration/components/track-async-serialization.tsrx +83 -93
  139. package/tests/hydration/components/try.tsrx +37 -51
  140. package/tests/hydration/switch.test.js +8 -8
  141. package/tests/server/await.test.tsrx +3 -3
  142. package/tests/server/basic.attributes.test.tsrx +120 -167
  143. package/tests/server/basic.components.test.tsrx +163 -197
  144. package/tests/server/basic.test.tsrx +298 -220
  145. package/tests/server/compiler.test.tsrx +142 -72
  146. package/tests/server/composite.props.test.tsrx +54 -58
  147. package/tests/server/composite.test.tsrx +165 -167
  148. package/tests/server/context.test.tsrx +13 -17
  149. package/tests/server/dynamic-elements.test.tsrx +103 -135
  150. package/tests/server/for.test.tsrx +115 -84
  151. package/tests/server/head.test.tsrx +31 -31
  152. package/tests/server/html-nesting-validation.test.tsrx +16 -8
  153. package/tests/server/if.test.tsrx +49 -59
  154. package/tests/server/lazy-destructuring.test.tsrx +288 -366
  155. package/tests/server/return.test.tsrx +58 -36
  156. package/tests/server/streaming-ssr.test.tsrx +4 -4
  157. package/tests/server/style-identifier.test.tsrx +58 -66
  158. package/tests/server/switch.test.tsrx +89 -97
  159. package/tests/server/track-async-serialization.test.tsrx +85 -103
  160. package/tests/server/try.test.tsrx +275 -360
  161. package/tests/utils/ref-types.test.js +72 -0
  162. package/tests/utils/vite-plugin-config.test.js +41 -74
  163. package/types/index.d.ts +1 -0
  164. package/src/runtime/internal/client/compat.js +0 -40
  165. package/tests/utils/compiler-compat-config.test.js +0 -38
@@ -5,32 +5,32 @@ describe('async suspense', () => {
5
5
  it('hides child content during re-suspension when tracked dependency changes', async () => {
6
6
  let resolve_fn: (() => void) | null = null;
7
7
 
8
- function Child({ countTracked }: { countTracked: Tracked<number> }) {
9
- return <>
10
- trackAsync(() => {
11
- countTracked.value;
12
- return new Promise<void>((resolve) => {
13
- resolve_fn = resolve;
14
- });
8
+ function Child({ countTracked }: { countTracked: Tracked<number> }) @{
9
+ trackAsync(() => {
10
+ countTracked.value;
11
+ return new Promise<void>((resolve) => {
12
+ resolve_fn = resolve;
15
13
  });
14
+ });
15
+ <>
16
16
  <div class="child-content">{'child content'}</div>
17
17
  <div class="count">
18
18
  {'count is: '}
19
19
  {countTracked.value}
20
20
  </div>
21
- </>;
21
+ </>
22
22
  }
23
23
 
24
- function App() {
25
- return <>
26
- let &[count, countTracked] = track(0);
27
- try {
24
+ function App() @{
25
+ let &[count, countTracked] = track(0);
26
+ <>
27
+ @try {
28
28
  <Child {countTracked} />
29
- } pending {
29
+ } @pending {
30
30
  <div class="pending">{'pending...'}</div>
31
31
  }
32
32
  <button onClick={() => count++}>{'Increment'}</button>
33
- </>;
33
+ </>
34
34
  }
35
35
 
36
36
  render(App);
@@ -69,31 +69,29 @@ describe('async suspense', () => {
69
69
  it('ignores settled promises after the surrounding boundary is destroyed', async () => {
70
70
  let resolve_value: ((value: string) => void) | null = null;
71
71
 
72
- function Child() {
73
- return <>
74
- let &[value] = trackAsync(
75
- () => new Promise<string>((resolve) => {
76
- resolve_value = resolve;
77
- }),
78
- );
79
- <div class="value">{value}</div>
80
- </>;
72
+ function Child() @{
73
+ let &[value] = trackAsync(
74
+ () => new Promise<string>((resolve) => {
75
+ resolve_value = resolve;
76
+ }),
77
+ );
78
+ <div class="value">{value}</div>
81
79
  }
82
80
 
83
- function App() {
84
- return <>
85
- let &[show] = track(true);
81
+ function App() @{
82
+ let &[show] = track(true);
83
+ <>
86
84
  <button onClick={() => (show = false)}>{'Hide'}</button>
87
- if (show) {
88
- try {
85
+ @if (show) {
86
+ @try {
89
87
  <Child />
90
- } pending {
88
+ } @pending {
91
89
  <div class="pending">{'loading...'}</div>
92
90
  }
93
- } else {
91
+ } @else {
94
92
  <div class="hidden">{'hidden'}</div>
95
93
  }
96
- </>;
94
+ </>
97
95
  }
98
96
 
99
97
  render(App);
@@ -139,25 +137,23 @@ describe('async suspense', () => {
139
137
  return { promise, abortController };
140
138
  }
141
139
 
142
- function App() {
143
- return <>
144
- let &[query] = track('a');
145
- try {
140
+ function App() @{
141
+ let &[query] = track('a');
142
+ <>
143
+ @try {
146
144
  let &[value] = trackAsync(() => createRequest(query));
147
145
  <div class="value">{value}</div>
148
- } pending {
146
+ } @pending {
149
147
  <div class="pending">{'loading...'}</div>
150
- } catch (error) {
148
+ } @catch (error) {
151
149
  <div class="error">{String(error)}</div>
152
150
  }
153
151
  <button
154
152
  onClick={() => {
155
153
  query = query === 'a' ? 'b' : 'c';
156
154
  }}
157
- >
158
- {'Next'}
159
- </button>
160
- </>;
155
+ >{'Next'}</button>
156
+ </>
161
157
  }
162
158
 
163
159
  render(App);
@@ -200,37 +196,37 @@ describe('async suspense', () => {
200
196
  async () => {
201
197
  let pending_render_count = 0;
202
198
 
203
- function FilteredList({ queryTracked }: { queryTracked: Tracked<string> }) {
204
- return <>
205
- let &[query] = queryTracked;
206
- let &[items] = trackAsync(
207
- () => Promise.resolve(
208
- !query ? ['apple', 'banana', 'cherry'] : ['avocado', 'blueberry', 'citrus'],
209
- ),
210
- );
211
- let &[filtered] = track(() => {
212
- return items.filter((item: string) => item.includes(query));
213
- });
199
+ function FilteredList({ queryTracked }: { queryTracked: Tracked<string> }) @{
200
+ let &[query] = queryTracked;
201
+ let &[items] = trackAsync(
202
+ () => Promise.resolve(
203
+ !query ? ['apple', 'banana', 'cherry'] : ['avocado', 'blueberry', 'citrus'],
204
+ ),
205
+ );
206
+ let &[filtered] = track(() => {
207
+ return items.filter((item: string) => item.includes(query));
208
+ });
209
+ <>
214
210
  <ul>
215
- for (let item of filtered) {
211
+ @for (let item of filtered) {
216
212
  <li>{item}</li>
217
213
  }
218
214
  </ul>
219
215
  <pre>{JSON.stringify(items)}</pre>
220
- </>;
216
+ </>
221
217
  }
222
218
 
223
- function App() {
224
- return <>
225
- let &[query, queryTracked] = track('');
226
- try {
219
+ function App() @{
220
+ let &[query, queryTracked] = track('');
221
+ <>
222
+ @try {
227
223
  <FilteredList {queryTracked} />
228
- } pending {
224
+ } @pending {
229
225
  pending_render_count += 1;
230
226
  <p class="pending">{'loading...'}</p>
231
227
  }
232
228
  <button onClick={() => (query = 'a')}>{'Search'}</button>
233
- </>;
229
+ </>
234
230
  }
235
231
 
236
232
  render(App);
@@ -274,10 +270,10 @@ describe('async suspense', () => {
274
270
  it('updates direct try-block trackAsync consumers and renders pending only once', async () => {
275
271
  let pending_render_count = 0;
276
272
 
277
- function App() {
278
- return <>
279
- let &[query] = track('');
280
- try {
273
+ function App() @{
274
+ let &[query] = track('');
275
+ <>
276
+ @try {
281
277
  let &[items] = trackAsync(
282
278
  () => Promise.resolve(
283
279
  !query ? ['apple', 'banana', 'cherry'] : ['avocado', 'blueberry', 'citrus'],
@@ -288,19 +284,20 @@ describe('async suspense', () => {
288
284
  return items.filter((item: string) => item.includes(query));
289
285
  });
290
286
 
291
- <ul>
292
- for (let item of filtered) {
293
- <li>{item}</li>
294
- }
295
- </ul>
296
-
297
- <pre>{JSON.stringify(items)}</pre>
298
- } pending {
287
+ <>
288
+ <ul>
289
+ @for (let item of filtered) {
290
+ <li>{item}</li>
291
+ }
292
+ </ul>
293
+ <pre>{JSON.stringify(items)}</pre>
294
+ </>
295
+ } @pending {
299
296
  pending_render_count += 1;
300
297
  <p class="pending">{'loading...'}</p>
301
298
  }
302
299
  <button onClick={() => (query = 'a')}>{'Search'}</button>
303
- </>;
300
+ </>
304
301
  }
305
302
 
306
303
  render(App);
@@ -339,46 +336,48 @@ describe('async suspense', () => {
339
336
  let double_effect_runs = 0;
340
337
  let quadruple_effect_runs = 0;
341
338
  let times_rendered = 0;
342
- function Child(&{ count }: { count: number }) {
343
- return <>
344
- const &[double]: [number] = trackAsync(() => {
345
- const result = count * 2;
339
+ function Child(&{ count }: { count: number }) @{
340
+ const &[double]: [number] = trackAsync(() => {
341
+ const result = count * 2;
346
342
 
347
- return new Promise<number>((resolve) => {
348
- resolve_double = () => resolve(result);
349
- });
343
+ return new Promise<number>((resolve) => {
344
+ resolve_double = () => resolve(result);
350
345
  });
351
- const &[quadruple]: [number] = trackAsync(() => {
352
- const result = double * 2;
346
+ });
347
+ const &[quadruple]: [number] = trackAsync(() => {
348
+ const result = double * 2;
353
349
 
354
- return new Promise<number>((resolve) => {
355
- resolve_quadruple = () => resolve(result);
356
- });
357
- });
358
- effect(() => {
359
- double;
360
- double_effect_runs += 1;
361
- });
362
- effect(() => {
363
- quadruple;
364
- quadruple_effect_runs += 1;
350
+ return new Promise<number>((resolve) => {
351
+ resolve_quadruple = () => resolve(result);
365
352
  });
366
- // this is to make the times_rendered render together with double
367
- <div class="double">{double + (++times_rendered - times_rendered)}</div>
353
+ });
354
+ effect(() => {
355
+ double;
356
+ double_effect_runs += 1;
357
+ });
358
+ effect(() => {
359
+ quadruple;
360
+ quadruple_effect_runs += 1;
361
+ });
362
+ // this is to make the times_rendered render together with double
363
+ <>
364
+ <div class="double">
365
+ {double + (++times_rendered - times_rendered)}
366
+ </div>
368
367
  <div class="quadruple">{quadruple}</div>
369
- </>;
368
+ </>
370
369
  }
371
370
 
372
- function App() {
373
- return <>
374
- let &[count] = track(2);
375
- try {
371
+ function App() @{
372
+ let &[count] = track(2);
373
+ <>
374
+ @try {
376
375
  <Child {count} />
377
- } pending {
376
+ } @pending {
378
377
  <div class="pending">{'Loading...'}</div>
379
378
  }
380
379
  <button onClick={() => count++}>{'Increment'}</button>
381
- </>;
380
+ </>
382
381
  }
383
382
 
384
383
  render(App);
@@ -432,46 +431,48 @@ describe('async suspense', () => {
432
431
  let double_effect_runs = 0;
433
432
  let quadruple_effect_runs = 0;
434
433
  let times_rendered = 0;
435
- function Child(&{ count }: { count: number }) {
436
- return <>
437
- const &[double]: [number] = trackAsync(() => {
438
- const result = count * 2;
434
+ function Child(&{ count }: { count: number }) @{
435
+ const &[double]: [number] = trackAsync(() => {
436
+ const result = count * 2;
439
437
 
440
- return new Promise<number>((resolve) => {
441
- resolve_double = () => resolve(result);
442
- });
438
+ return new Promise<number>((resolve) => {
439
+ resolve_double = () => resolve(result);
443
440
  });
444
- const &[quadruple]: [number] = trackAsync(() => {
445
- const result = double * 2;
441
+ });
442
+ const &[quadruple]: [number] = trackAsync(() => {
443
+ const result = double * 2;
446
444
 
447
- return new Promise<number>((resolve) => {
448
- resolve_quadruple = () => resolve(result);
449
- });
450
- });
451
- effect(() => {
452
- double;
453
- double_effect_runs += 1;
454
- });
455
- effect(() => {
456
- quadruple;
457
- quadruple_effect_runs += 1;
445
+ return new Promise<number>((resolve) => {
446
+ resolve_quadruple = () => resolve(result);
458
447
  });
459
- // this is to make the times_rendered render together with double
460
- <div class="double">{double + (++times_rendered - times_rendered)}</div>
448
+ });
449
+ effect(() => {
450
+ double;
451
+ double_effect_runs += 1;
452
+ });
453
+ effect(() => {
454
+ quadruple;
455
+ quadruple_effect_runs += 1;
456
+ });
457
+ // this is to make the times_rendered render together with double
458
+ <>
459
+ <div class="double">
460
+ {double + (++times_rendered - times_rendered)}
461
+ </div>
461
462
  <div class="quadruple">{quadruple}</div>
462
- </>;
463
+ </>
463
464
  }
464
465
 
465
- function App() {
466
- return <>
467
- let &[count] = track(2);
468
- try {
466
+ function App() @{
467
+ let &[count] = track(2);
468
+ <>
469
+ @try {
469
470
  <Child {count} />
470
- } pending {
471
+ } @pending {
471
472
  <div class="pending">{'Loading...'}</div>
472
473
  }
473
474
  <button onClick={() => count++}>{'Increment'}</button>
474
- </>;
475
+ </>
475
476
  }
476
477
 
477
478
  render(App);
@@ -523,38 +524,40 @@ describe('async suspense', () => {
523
524
 
524
525
  it('resolves chained async values without explicit flushSync', async () => {
525
526
  let times_rendered = 0;
526
- function Child(&{ count }: { count: number }) {
527
- return <>
528
- const &[double]: [number] = trackAsync(() => {
529
- const result = count * 2;
527
+ function Child(&{ count }: { count: number }) @{
528
+ const &[double]: [number] = trackAsync(() => {
529
+ const result = count * 2;
530
530
 
531
- return new Promise<number>((resolve) => {
532
- setTimeout(() => resolve(result), 0);
533
- });
531
+ return new Promise<number>((resolve) => {
532
+ setTimeout(() => resolve(result), 0);
534
533
  });
535
- const &[quadruple]: [number] = trackAsync(() => {
536
- const result = double * 2;
534
+ });
535
+ const &[quadruple]: [number] = trackAsync(() => {
536
+ const result = double * 2;
537
537
 
538
- return new Promise<number>((resolve) => {
539
- setTimeout(() => resolve(result), 0);
540
- });
538
+ return new Promise<number>((resolve) => {
539
+ setTimeout(() => resolve(result), 0);
541
540
  });
542
- // this is to make the times_rendered render together with double
543
- <div class="double">{double + (++times_rendered - times_rendered)}</div>
541
+ });
542
+ // this is to make the times_rendered render together with double
543
+ <>
544
+ <div class="double">
545
+ {double + (++times_rendered - times_rendered)}
546
+ </div>
544
547
  <div class="quadruple">{quadruple}</div>
545
- </>;
548
+ </>
546
549
  }
547
550
 
548
- function App() {
549
- return <>
550
- let &[count] = track(0);
551
+ function App() @{
552
+ let &[count] = track(0);
553
+ <>
551
554
  <button onClick={() => count++}>{count}</button>
552
- try {
555
+ @try {
553
556
  <Child {count} />
554
- } pending {
557
+ } @pending {
555
558
  <div class="pending">{'Loading...'}</div>
556
559
  }
557
- </>;
560
+ </>
558
561
  }
559
562
 
560
563
  render(App);
@@ -582,23 +585,21 @@ describe('async suspense', () => {
582
585
  async () => {
583
586
  let resolve_fn: ((value: string[]) => void) | null = null;
584
587
 
585
- function Child({ itemsTracked }: { itemsTracked: Tracked<string[]> }) {
586
- return <>
587
- try {
588
- <div class="child-content">
589
- {'child: '}
590
- {itemsTracked.value.join(', ')}
591
- </div>
592
- } pending {
593
- <div class="child-pending">{'child loading...'}</div>
594
- }
595
- </>;
588
+ function Child({ itemsTracked }: { itemsTracked: Tracked<string[]> }) @{
589
+ @try {
590
+ <div class="child-content">
591
+ {'child: '}
592
+ {itemsTracked.value.join(', ')}
593
+ </div>
594
+ } @pending {
595
+ <div class="child-pending">{'child loading...'}</div>
596
+ }
596
597
  }
597
598
 
598
- function App() {
599
- return <>
600
- let &[query] = track('initial');
601
- try {
599
+ function App() @{
600
+ let &[query] = track('initial');
601
+ <>
602
+ @try {
602
603
  let &[items, itemsTracked] = trackAsync(() => {
603
604
  const q = query;
604
605
  return new Promise<string[]>((resolve) => {
@@ -606,16 +607,18 @@ describe('async suspense', () => {
606
607
  });
607
608
  });
608
609
 
609
- <div class="parent-content">
610
- {'parent: '}
611
- {items.join(', ')}
612
- </div>
613
- <Child {itemsTracked} />
614
- } pending {
610
+ <>
611
+ <div class="parent-content">
612
+ {'parent: '}
613
+ {items.join(', ')}
614
+ </div>
615
+ <Child {itemsTracked} />
616
+ </>
617
+ } @pending {
615
618
  <div class="parent-pending">{'parent loading...'}</div>
616
619
  }
617
620
  <button onClick={() => (query = 'next')}>{'Change'}</button>
618
- </>;
621
+ </>
619
622
  }
620
623
 
621
624
  render(App);
@@ -659,11 +662,9 @@ describe('async suspense', () => {
659
662
  );
660
663
 
661
664
  it('uses the root pending boundary when trackAsync has no local try/pending boundary', () => {
662
- function App() {
663
- return <>
664
- let &[value] = trackAsync(() => Promise.resolve('test'));
665
- <div>{value}</div>
666
- </>;
665
+ function App() @{
666
+ let &[value] = trackAsync(() => Promise.resolve('test'));
667
+ <div>{value}</div>
667
668
  }
668
669
 
669
670
  expect(() => {
@@ -21,6 +21,7 @@ exports[`basic client > attribute rendering > handles boolean attributes with no
21
21
 
22
22
  exports[`basic client > attribute rendering > handles boolean props correctly 1`] = `
23
23
  <div>
24
+ <!---->
24
25
  <div
25
26
  data-disabled=""
26
27
  />
@@ -28,6 +29,7 @@ exports[`basic client > attribute rendering > handles boolean props correctly 1`
28
29
  disabled=""
29
30
  />
30
31
  <!---->
32
+ <!---->
31
33
 
32
34
  </div>
33
35
  `;
@@ -2,6 +2,7 @@
2
2
 
3
3
  exports[`basic client > rendering & text > basic operations 1`] = `
4
4
  <div>
5
+ <!---->
5
6
  <div>
6
7
  0
7
8
  </div>
@@ -14,6 +15,7 @@ exports[`basic client > rendering & text > basic operations 1`] = `
14
15
  <div>
15
16
  2
16
17
  </div>
18
+ <!---->
17
19
 
18
20
  </div>
19
21
  `;
@@ -29,12 +31,14 @@ exports[`basic client > rendering & text > renders semi-dynamic text 1`] = `
29
31
 
30
32
  exports[`basic client > rendering & text > renders simple JS expression logic correctly 1`] = `
31
33
  <div>
34
+ <!---->
32
35
  <div>
33
36
  {"0":"Test"}
34
37
  </div>
35
38
  <div>
36
39
  1
37
40
  </div>
41
+ <!---->
38
42
 
39
43
  </div>
40
44
  `;