ripple 0.3.68 → 0.3.70

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