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
@@ -3,13 +3,13 @@ import { track } from 'ripple';
3
3
 
4
4
  describe('lazy destructuring', () => {
5
5
  it('supports tracked value getter and setter', async () => {
6
- component Test() {
7
- let count = track(1);
8
- let derived = track(() => count.value * 2);
9
-
10
- count.value = 3;
11
-
12
- <pre>{`${count.value}-${derived.value}`}</pre>
6
+ function Test() {
7
+ return <>
8
+ let count = track(1);
9
+ let derived = track(() => count.value * 2);
10
+ count.value = 3;
11
+ <pre>{`${count.value}-${derived.value}`}</pre>
12
+ </>;
13
13
  }
14
14
 
15
15
  const { body } = await render(Test);
@@ -17,12 +17,12 @@ describe('lazy destructuring', () => {
17
17
  });
18
18
 
19
19
  it('lazily accesses object properties', async () => {
20
- component Inner(&{ a, b }: { a: number; b: string }) {
21
- <pre>{`${a}-${b}`}</pre>
20
+ function Inner(&{ a, b }: { a: number; b: string }) {
21
+ return <><pre>{`${a}-${b}`}</pre></>;
22
22
  }
23
23
 
24
- component Test() {
25
- <Inner a={1} b="hello" />
24
+ function Test() {
25
+ return <><Inner a={1} b="hello" /></>;
26
26
  }
27
27
 
28
28
  const { body } = await render(Test);
@@ -30,10 +30,12 @@ describe('lazy destructuring', () => {
30
30
  });
31
31
 
32
32
  it('supports default values in lazy object destructuring', async () => {
33
- component Test() {
34
- const obj: { a: number; b?: number } = { a: 5 };
35
- const &{ a, b = 99 } = obj;
36
- <pre>{`${a}-${b}`}</pre>
33
+ function Test() {
34
+ return <>
35
+ const obj: { a: number; b?: number } = { a: 5 };
36
+ const &{ a, b = 99 } = obj;
37
+ <pre>{`${a}-${b}`}</pre>
38
+ </>;
37
39
  }
38
40
 
39
41
  const { body } = await render(Test);
@@ -41,13 +43,15 @@ describe('lazy destructuring', () => {
41
43
  });
42
44
 
43
45
  it('supports nested lazy destructuring in non-lazy component params', async () => {
44
- component Inner({ something: &[first, second] }: { something: Tracked<number> }) {
45
- first = second.value + 1;
46
- <pre>{`${first}-${second.value}`}</pre>
46
+ function Inner({ something: &[first, second] }: { something: Tracked<number> }) {
47
+ return <>
48
+ first = second.value + 1;
49
+ <pre>{`${first}-${second.value}`}</pre>
50
+ </>;
47
51
  }
48
52
 
49
- component Test() {
50
- <Inner something={track(1)} />
53
+ function Test() {
54
+ return <><Inner something={track(1)} /></>;
51
55
  }
52
56
 
53
57
  const { body } = await render(Test);
@@ -55,12 +59,14 @@ describe('lazy destructuring', () => {
55
59
  });
56
60
 
57
61
  it('supports let lazy destructuring with assignment writeback', async () => {
58
- component Test() {
59
- const obj = { a: 1, b: 2 };
60
- let &{ a, b } = obj;
61
- a = 10;
62
- b = 20;
63
- <pre>{`${obj.a}-${obj.b}`}</pre>
62
+ function Test() {
63
+ return <>
64
+ const obj = { a: 1, b: 2 };
65
+ let &{ a, b } = obj;
66
+ a = 10;
67
+ b = 20;
68
+ <pre>{`${obj.a}-${obj.b}`}</pre>
69
+ </>;
64
70
  }
65
71
 
66
72
  const { body } = await render(Test);
@@ -68,12 +74,14 @@ describe('lazy destructuring', () => {
68
74
  });
69
75
 
70
76
  it('supports compound assignment operators on lazy bindings', async () => {
71
- component Test() {
72
- const obj = { a: 5, b: 10 };
73
- let &{ a, b } = obj;
74
- a += 3;
75
- b *= 2;
76
- <pre>{`${obj.a}-${obj.b}`}</pre>
77
+ function Test() {
78
+ return <>
79
+ const obj = { a: 5, b: 10 };
80
+ let &{ a, b } = obj;
81
+ a += 3;
82
+ b *= 2;
83
+ <pre>{`${obj.a}-${obj.b}`}</pre>
84
+ </>;
77
85
  }
78
86
 
79
87
  const { body } = await render(Test);
@@ -81,13 +89,15 @@ describe('lazy destructuring', () => {
81
89
  });
82
90
 
83
91
  it('supports update expressions on lazy bindings', async () => {
84
- component Test() {
85
- const obj = { count: 0 };
86
- let &{ count } = obj;
87
- count++;
88
- count++;
89
- count--;
90
- <pre>{obj.count}</pre>
92
+ function Test() {
93
+ return <>
94
+ const obj = { count: 0 };
95
+ let &{ count } = obj;
96
+ count++;
97
+ count++;
98
+ count--;
99
+ <pre>{obj.count}</pre>
100
+ </>;
91
101
  }
92
102
 
93
103
  const { body } = await render(Test);
@@ -95,12 +105,14 @@ describe('lazy destructuring', () => {
95
105
  });
96
106
 
97
107
  it('supports update expressions on lazy bindings with default values', async () => {
98
- component Test() {
99
- const obj: { count?: number } = {};
100
- let &{ count = 0 } = obj;
101
- count++;
102
- count++;
103
- <pre>{obj.count}</pre>
108
+ function Test() {
109
+ return <>
110
+ const obj: { count?: number } = {};
111
+ let &{ count = 0 } = obj;
112
+ count++;
113
+ count++;
114
+ <pre>{obj.count}</pre>
115
+ </>;
104
116
  }
105
117
 
106
118
  const { body } = await render(Test);
@@ -108,13 +120,15 @@ describe('lazy destructuring', () => {
108
120
  });
109
121
 
110
122
  it('supports function params with lazy destructuring and default values', async () => {
111
- component Test() {
112
- function calc(&{ x, y = 100 }: { x: number; y?: number }) {
113
- return x + y;
114
- }
115
- const a = calc({ x: 5, y: 10 });
116
- const b = calc({ x: 5 });
117
- <pre>{`${a}-${b}`}</pre>
123
+ function Test() {
124
+ return <>
125
+ function calc(&{ x, y = 100 }: { x: number; y?: number }) {
126
+ return x + y;
127
+ }
128
+ const a = calc({ x: 5, y: 10 });
129
+ const b = calc({ x: 5 });
130
+ <pre>{`${a}-${b}`}</pre>
131
+ </>;
118
132
  }
119
133
 
120
134
  const { body } = await render(Test);
@@ -122,15 +136,15 @@ describe('lazy destructuring', () => {
122
136
  });
123
137
 
124
138
  it('supports nested lazy destructuring in non-lazy function params', async () => {
125
- component Test() {
126
- const something = track(1);
127
-
128
- function getInfo({ something: &[first, second] }: { something: Tracked<number> }) {
129
- first = second.value + 1;
130
- return `${first}-${second.value}`;
131
- }
132
-
133
- <pre>{getInfo({ something })}</pre>
139
+ function Test() {
140
+ return <>
141
+ const something = track(1);
142
+ function getInfo({ something: &[first, second] }: { something: Tracked<number> }) {
143
+ first = second.value + 1;
144
+ return `${first}-${second.value}`;
145
+ }
146
+ <pre>{getInfo({ something })}</pre>
147
+ </>;
134
148
  }
135
149
 
136
150
  const { body } = await render(Test);
@@ -140,18 +154,20 @@ describe('lazy destructuring', () => {
140
154
  it(
141
155
  'preserves lazy getter/setter behavior for RestElement nested destructuring in non-lazy component params',
142
156
  async () => {
143
- component Inner({
157
+ function Inner({
144
158
  values: [head, ...&{ 0: first_rest, length: rest_length }],
145
159
  }: {
146
160
  values: number[];
147
161
  }) {
148
- const before = `${first_rest}-${rest_length}`;
149
- rest_length = 0;
150
- <pre>{`${head}-${before}-${first_rest}-${rest_length}`}</pre>
162
+ return <>
163
+ const before = `${first_rest}-${rest_length}`;
164
+ rest_length = 0;
165
+ <pre>{`${head}-${before}-${first_rest}-${rest_length}`}</pre>
166
+ </>;
151
167
  }
152
168
 
153
- component Test() {
154
- <Inner values={[10, 20, 30]} />
169
+ function Test() {
170
+ return <><Inner values={[10, 20, 30]} /></>;
155
171
  }
156
172
 
157
173
  const { body } = await render(Test);
@@ -162,18 +178,19 @@ describe('lazy destructuring', () => {
162
178
  it(
163
179
  'preserves lazy getter/setter behavior for RestElement nested destructuring in non-lazy function params',
164
180
  async () => {
165
- component Test() {
166
- function getInfo({
167
- values: [head, ...&{ 0: first_rest, length: rest_length }],
168
- }: {
169
- values: number[];
170
- }) {
171
- const before = `${first_rest}-${rest_length}`;
172
- rest_length = 0;
173
- return `${head}-${before}-${first_rest}-${rest_length}`;
174
- }
175
-
176
- <pre>{getInfo({ values: [5, 6, 7] })}</pre>
181
+ function Test() {
182
+ return <>
183
+ function getInfo({
184
+ values: [head, ...&{ 0: first_rest, length: rest_length }],
185
+ }: {
186
+ values: number[];
187
+ }) {
188
+ const before = `${first_rest}-${rest_length}`;
189
+ rest_length = 0;
190
+ return `${head}-${before}-${first_rest}-${rest_length}`;
191
+ }
192
+ <pre>{getInfo({ values: [5, 6, 7] })}</pre>
193
+ </>;
177
194
  }
178
195
 
179
196
  const { body } = await render(Test);
@@ -182,10 +199,12 @@ describe('lazy destructuring', () => {
182
199
  );
183
200
 
184
201
  it('supports member access on lazy destructured objects', async () => {
185
- component Test() {
186
- const obj = { user: { name: 'Alice', age: 30 } };
187
- const &{ user } = obj;
188
- <pre>{`${user.name}-${user.age}`}</pre>
202
+ function Test() {
203
+ return <>
204
+ const obj = { user: { name: 'Alice', age: 30 } };
205
+ const &{ user } = obj;
206
+ <pre>{`${user.name}-${user.age}`}</pre>
207
+ </>;
189
208
  }
190
209
 
191
210
  const { body } = await render(Test);
@@ -193,12 +212,12 @@ describe('lazy destructuring', () => {
193
212
  });
194
213
 
195
214
  it('preserves numeric member access on lazy array value bindings', async () => {
196
- component Child({ pair: &[first] }: { pair: [{ 0: string }] }) {
197
- <pre>{first[0]}</pre>
215
+ function Child({ pair: &[first] }: { pair: [{ 0: string }] }) {
216
+ return <><pre>{first[0]}</pre></>;
198
217
  }
199
218
 
200
- component Test() {
201
- <Child pair={[{ 0: 'x' }]} />
219
+ function Test() {
220
+ return <><Child pair={[{ 0: 'x' }]} /></>;
202
221
  }
203
222
 
204
223
  const { body } = await render(Test);
@@ -206,10 +225,12 @@ describe('lazy destructuring', () => {
206
225
  });
207
226
 
208
227
  it('supports rest in lazy array destructuring for tracked tuples (iterable)', async () => {
209
- component Test() {
210
- let tracked_value = track(0);
211
- let &[value, ...rest] = tracked_value;
212
- <pre>{`${value}-${rest.length}-${rest[0] === tracked_value}`}</pre>
228
+ function Test() {
229
+ return <>
230
+ let tracked_value = track(0);
231
+ let &[value, ...rest] = tracked_value;
232
+ <pre>{`${value}-${rest.length}-${rest[0] === tracked_value}`}</pre>
233
+ </>;
213
234
  }
214
235
 
215
236
  const { body } = await render(Test);
@@ -217,10 +238,12 @@ describe('lazy destructuring', () => {
217
238
  });
218
239
 
219
240
  it('supports rest in lazy array destructuring for length-only array-like values', async () => {
220
- component Test() {
221
- const array_like = { 0: 'x', 1: 'y', 2: 'z', length: 3 };
222
- const &[first, ...rest] = array_like;
223
- <pre>{`${first}-${rest.join('')}`}</pre>
241
+ function Test() {
242
+ return <>
243
+ const array_like = { 0: 'x', 1: 'y', 2: 'z', length: 3 };
244
+ const &[first, ...rest] = array_like;
245
+ <pre>{`${first}-${rest.join('')}`}</pre>
246
+ </>;
224
247
  }
225
248
 
226
249
  const { body } = await render(Test);
@@ -228,16 +251,18 @@ describe('lazy destructuring', () => {
228
251
  });
229
252
 
230
253
  it('supports rest in lazy array destructuring for iterable values', async () => {
231
- component Test() {
232
- const source = {
233
- *[Symbol.iterator]() {
234
- yield 'x';
235
- yield 'y';
236
- yield 'z';
237
- },
238
- };
239
- const &[first, ...rest] = source;
240
- <pre>{`${first}-${rest.join('')}`}</pre>
254
+ function Test() {
255
+ return <>
256
+ const source = {
257
+ *[Symbol.iterator]() {
258
+ yield 'x';
259
+ yield 'y';
260
+ yield 'z';
261
+ },
262
+ };
263
+ const &[first, ...rest] = source;
264
+ <pre>{`${first}-${rest.join('')}`}</pre>
265
+ </>;
241
266
  }
242
267
 
243
268
  const { body } = await render(Test);
@@ -245,10 +270,12 @@ describe('lazy destructuring', () => {
245
270
  });
246
271
 
247
272
  it('supports standalone lazy array destructuring with track()', async () => {
248
- component Test() {
249
- let count;
250
- &[count] = track(0);
251
- <div>{count}</div>
273
+ function Test() {
274
+ return <>
275
+ let count;
276
+ &[count] = track(0);
277
+ <div>{count}</div>
278
+ </>;
252
279
  }
253
280
 
254
281
  const { body } = await render(Test);
@@ -256,15 +283,16 @@ describe('lazy destructuring', () => {
256
283
  });
257
284
 
258
285
  it('supports direct value access on tracked values during SSR', async () => {
259
- component Test() {
260
- let tracked = track(0);
261
- ++tracked.value;
262
- tracked.value++;
263
- tracked.value = tracked.value + 1;
264
- let value = tracked.value;
265
- let ref = tracked;
266
-
267
- <pre>{`${value}-${ref === tracked}`}</pre>
286
+ function Test() {
287
+ return <>
288
+ let tracked = track(0);
289
+ ++tracked.value;
290
+ tracked.value++;
291
+ tracked.value = tracked.value + 1;
292
+ let value = tracked.value;
293
+ let ref = tracked;
294
+ <pre>{`${value}-${ref === tracked}`}</pre>
295
+ </>;
268
296
  }
269
297
 
270
298
  const { body } = await render(Test);
@@ -272,15 +300,19 @@ describe('lazy destructuring', () => {
272
300
  });
273
301
 
274
302
  it('supports lazy destructured tracked ref value access during SSR', async () => {
275
- component Child({ pair: &[value, tracked_ref] }: { pair: Tracked<number> }) {
276
- ++tracked_ref.value;
277
- tracked_ref.value++;
278
- <pre>{`${value}-${tracked_ref.value}`}</pre>
303
+ function Child({ pair: &[value, tracked_ref] }: { pair: Tracked<number> }) {
304
+ return <>
305
+ ++tracked_ref.value;
306
+ tracked_ref.value++;
307
+ <pre>{`${value}-${tracked_ref.value}`}</pre>
308
+ </>;
279
309
  }
280
310
 
281
- component Test() {
282
- let tracked = track(0);
283
- <Child pair={tracked} />
311
+ function Test() {
312
+ return <>
313
+ let tracked = track(0);
314
+ <Child pair={tracked} />
315
+ </>;
284
316
  }
285
317
 
286
318
  const { body } = await render(Test);
@@ -288,11 +320,13 @@ describe('lazy destructuring', () => {
288
320
  });
289
321
 
290
322
  it('supports standalone lazy object destructuring', async () => {
291
- component Test() {
292
- let a;
293
- let b;
294
- &{ a, b } = { a: 10, b: 20 };
295
- <pre>{`${a}-${b}`}</pre>
323
+ function Test() {
324
+ return <>
325
+ let a;
326
+ let b;
327
+ &{ a, b } = { a: 10, b: 20 };
328
+ <pre>{`${a}-${b}`}</pre>
329
+ </>;
296
330
  }
297
331
 
298
332
  const { body } = await render(Test);
@@ -303,19 +337,23 @@ describe('lazy destructuring', () => {
303
337
  it('preserves nested lazy object access inside lazy object as component params', async () => {
304
338
  let inner_value = 7;
305
339
 
306
- component Inner(&{ outer: &{ inner } }: { outer: { inner: number } }) {
307
- const before = inner;
308
- inner_value = 8;
309
- <pre>{`${before}-${inner}`}</pre>
340
+ function Inner(&{ outer: &{ inner } }: { outer: { inner: number } }) {
341
+ return <>
342
+ const before = inner;
343
+ inner_value = 8;
344
+ <pre>{`${before}-${inner}`}</pre>
345
+ </>;
310
346
  }
311
347
 
312
- component Test() {
313
- const outer = {
314
- get inner() {
315
- return inner_value;
316
- },
317
- };
318
- <Inner {outer} />
348
+ function Test() {
349
+ return <>
350
+ const outer = {
351
+ get inner() {
352
+ return inner_value;
353
+ },
354
+ };
355
+ <Inner {outer} />
356
+ </>;
319
357
  }
320
358
 
321
359
  const { body } = await render(Test);
@@ -326,18 +364,22 @@ describe('lazy destructuring', () => {
326
364
  let first_value = 3;
327
365
  let second_value = 4;
328
366
 
329
- component Inner({ pair: &[first, second] }: { pair: [number, number] }) {
330
- const before = `${first}-${second}`;
331
- first_value = 5;
332
- second_value = 6;
333
- <pre>{`${before}-${first}-${second}`}</pre>
367
+ function Inner({ pair: &[first, second] }: { pair: [number, number] }) {
368
+ return <>
369
+ const before = `${first}-${second}`;
370
+ first_value = 5;
371
+ second_value = 6;
372
+ <pre>{`${before}-${first}-${second}`}</pre>
373
+ </>;
334
374
  }
335
375
 
336
- component Test() {
337
- const pair = [0, 0] as [number, number];
338
- Object.defineProperty(pair, 0, { get: () => first_value });
339
- Object.defineProperty(pair, 1, { get: () => second_value });
340
- <Inner {pair} />
376
+ function Test() {
377
+ return <>
378
+ const pair = [0, 0] as [number, number];
379
+ Object.defineProperty(pair, 0, { get: () => first_value });
380
+ Object.defineProperty(pair, 1, { get: () => second_value });
381
+ <Inner {pair} />
382
+ </>;
341
383
  }
342
384
 
343
385
  const { body } = await render(Test);
@@ -345,19 +387,21 @@ describe('lazy destructuring', () => {
345
387
  });
346
388
 
347
389
  it('preserves nested lazy object access inside lazy array as function params', async () => {
348
- component Test() {
349
- let name_value = 'Alice';
350
- function getName(&[&{ name }]: [{ name: string }]) {
351
- const before = name;
352
- name_value = 'Bob';
353
- return `${before}-${name}`;
354
- }
355
- const user = {
356
- get name() {
357
- return name_value;
358
- },
359
- };
360
- <pre>{getName([user])}</pre>
390
+ function Test() {
391
+ return <>
392
+ let name_value = 'Alice';
393
+ function getName(&[&{ name }]: [{ name: string }]) {
394
+ const before = name;
395
+ name_value = 'Bob';
396
+ return `${before}-${name}`;
397
+ }
398
+ const user = {
399
+ get name() {
400
+ return name_value;
401
+ },
402
+ };
403
+ <pre>{getName([user])}</pre>
404
+ </>;
361
405
  }
362
406
 
363
407
  const { body } = await render(Test);
@@ -365,19 +409,21 @@ describe('lazy destructuring', () => {
365
409
  });
366
410
 
367
411
  it('preserves nested lazy array access inside lazy array as function params', async () => {
368
- component Test() {
369
- let first_value = 5;
370
- let second_value = 6;
371
- function getValues(&[&[a, b]]: [[number, number]]) {
372
- const before = `${a}-${b}`;
373
- first_value = 7;
374
- second_value = 8;
375
- return `${before}-${a}-${b}`;
376
- }
377
- const pair = [0, 0] as [number, number];
378
- Object.defineProperty(pair, 0, { get: () => first_value });
379
- Object.defineProperty(pair, 1, { get: () => second_value });
380
- <pre>{getValues([pair])}</pre>
412
+ function Test() {
413
+ return <>
414
+ let first_value = 5;
415
+ let second_value = 6;
416
+ function getValues(&[&[a, b]]: [[number, number]]) {
417
+ const before = `${a}-${b}`;
418
+ first_value = 7;
419
+ second_value = 8;
420
+ return `${before}-${a}-${b}`;
421
+ }
422
+ const pair = [0, 0] as [number, number];
423
+ Object.defineProperty(pair, 0, { get: () => first_value });
424
+ Object.defineProperty(pair, 1, { get: () => second_value });
425
+ <pre>{getValues([pair])}</pre>
426
+ </>;
381
427
  }
382
428
 
383
429
  const { body } = await render(Test);
@@ -387,21 +433,25 @@ describe('lazy destructuring', () => {
387
433
  it('preserves three-level lazy object access as component params', async () => {
388
434
  let c_value = 42;
389
435
 
390
- component Inner(&{ a: &{ b: &{ c } } }: { a: { b: { c: number } } }) {
391
- const before = c;
392
- c_value = 43;
393
- <pre>{`${before}-${c}`}</pre>
436
+ function Inner(&{ a: &{ b: &{ c } } }: { a: { b: { c: number } } }) {
437
+ return <>
438
+ const before = c;
439
+ c_value = 43;
440
+ <pre>{`${before}-${c}`}</pre>
441
+ </>;
394
442
  }
395
443
 
396
- component Test() {
397
- const a = {
398
- b: {
399
- get c() {
400
- return c_value;
444
+ function Test() {
445
+ return <>
446
+ const a = {
447
+ b: {
448
+ get c() {
449
+ return c_value;
450
+ },
401
451
  },
402
- },
403
- };
404
- <Inner {a} />
452
+ };
453
+ <Inner {a} />
454
+ </>;
405
455
  }
406
456
 
407
457
  const { body } = await render(Test);
@@ -409,19 +459,21 @@ describe('lazy destructuring', () => {
409
459
  });
410
460
 
411
461
  it('preserves nested lazy object access inside lazy object as function params', async () => {
412
- component Test() {
413
- let inner_value = 11;
414
- function getValue(&{ outer: &{ inner } }: { outer: { inner: number } }) {
415
- const before = inner;
416
- inner_value = 12;
417
- return `${before}-${inner}`;
418
- }
419
- const outer = {
420
- get inner() {
421
- return inner_value;
422
- },
423
- };
424
- <pre>{getValue({ outer })}</pre>
462
+ function Test() {
463
+ return <>
464
+ let inner_value = 11;
465
+ function getValue(&{ outer: &{ inner } }: { outer: { inner: number } }) {
466
+ const before = inner;
467
+ inner_value = 12;
468
+ return `${before}-${inner}`;
469
+ }
470
+ const outer = {
471
+ get inner() {
472
+ return inner_value;
473
+ },
474
+ };
475
+ <pre>{getValue({ outer })}</pre>
476
+ </>;
425
477
  }
426
478
 
427
479
  const { body } = await render(Test);
@@ -431,14 +483,16 @@ describe('lazy destructuring', () => {
431
483
  it(
432
484
  'supports nested lazy array inside lazy object as function params with writeback',
433
485
  async () => {
434
- component Test() {
435
- const obj = { pair: [1, 2] as [number, number] };
436
- function bump(&{ pair: &[first, second] }: { pair: [number, number] }) {
437
- first = first + 10;
438
- second = second + 20;
439
- }
440
- bump(obj);
441
- <pre>{`${obj.pair[0]}-${obj.pair[1]}`}</pre>
486
+ function Test() {
487
+ return <>
488
+ const obj = { pair: [1, 2] as [number, number] };
489
+ function bump(&{ pair: &[first, second] }: { pair: [number, number] }) {
490
+ first = first + 10;
491
+ second = second + 20;
492
+ }
493
+ bump(obj);
494
+ <pre>{`${obj.pair[0]}-${obj.pair[1]}`}</pre>
495
+ </>;
442
496
  }
443
497
 
444
498
  const { body } = await render(Test);
@@ -447,21 +501,23 @@ describe('lazy destructuring', () => {
447
501
  );
448
502
 
449
503
  it('preserves three-level lazy object access as function params', async () => {
450
- component Test() {
451
- let c_value = 99;
452
- function getValue(&{ a: &{ b: &{ c } } }: { a: { b: { c: number } } }) {
453
- const before = c;
454
- c_value = 100;
455
- return `${before}-${c}`;
456
- }
457
- const a = {
458
- b: {
459
- get c() {
460
- return c_value;
504
+ function Test() {
505
+ return <>
506
+ let c_value = 99;
507
+ function getValue(&{ a: &{ b: &{ c } } }: { a: { b: { c: number } } }) {
508
+ const before = c;
509
+ c_value = 100;
510
+ return `${before}-${c}`;
511
+ }
512
+ const a = {
513
+ b: {
514
+ get c() {
515
+ return c_value;
516
+ },
461
517
  },
462
- },
463
- };
464
- <pre>{getValue({ a })}</pre>
518
+ };
519
+ <pre>{getValue({ a })}</pre>
520
+ </>;
465
521
  }
466
522
 
467
523
  const { body } = await render(Test);
@@ -469,19 +525,21 @@ describe('lazy destructuring', () => {
469
525
  });
470
526
 
471
527
  it('preserves nested lazy object access inside lazy object in const declaration', async () => {
472
- component Test() {
473
- let inner_value = 5;
474
- const data = {
475
- outer: {
476
- get inner() {
477
- return inner_value;
528
+ function Test() {
529
+ return <>
530
+ let inner_value = 5;
531
+ const data = {
532
+ outer: {
533
+ get inner() {
534
+ return inner_value;
535
+ },
478
536
  },
479
- },
480
- };
481
- const &{ outer: &{ inner } } = data;
482
- const before = inner;
483
- inner_value = 6;
484
- <pre>{`${before}-${inner}`}</pre>
537
+ };
538
+ const &{ outer: &{ inner } } = data;
539
+ const before = inner;
540
+ inner_value = 6;
541
+ <pre>{`${before}-${inner}`}</pre>
542
+ </>;
485
543
  }
486
544
 
487
545
  const { body } = await render(Test);
@@ -489,11 +547,13 @@ describe('lazy destructuring', () => {
489
547
  });
490
548
 
491
549
  it('supports nested lazy object inside lazy object in let with writeback', async () => {
492
- component Test() {
493
- const data = { outer: { inner: 5 } };
494
- let &{ outer: &{ inner } } = data;
495
- inner = 50;
496
- <pre>{data.outer.inner}</pre>
550
+ function Test() {
551
+ return <>
552
+ const data = { outer: { inner: 5 } };
553
+ let &{ outer: &{ inner } } = data;
554
+ inner = 50;
555
+ <pre>{data.outer.inner}</pre>
556
+ </>;
497
557
  }
498
558
 
499
559
  const { body } = await render(Test);
@@ -501,12 +561,14 @@ describe('lazy destructuring', () => {
501
561
  });
502
562
 
503
563
  it('supports nested lazy array inside lazy object in let with writeback', async () => {
504
- component Test() {
505
- const data = { pair: [1, 2] as [number, number] };
506
- let &{ pair: &[first, second] } = data;
507
- first = 100;
508
- second = 200;
509
- <pre>{`${data.pair[0]}-${data.pair[1]}`}</pre>
564
+ function Test() {
565
+ return <>
566
+ const data = { pair: [1, 2] as [number, number] };
567
+ let &{ pair: &[first, second] } = data;
568
+ first = 100;
569
+ second = 200;
570
+ <pre>{`${data.pair[0]}-${data.pair[1]}`}</pre>
571
+ </>;
510
572
  }
511
573
 
512
574
  const { body } = await render(Test);
@@ -514,11 +576,13 @@ describe('lazy destructuring', () => {
514
576
  });
515
577
 
516
578
  it('supports three-level lazy object nesting in let with writeback', async () => {
517
- component Test() {
518
- const data = { a: { b: { c: 1 } } };
519
- let &{ a: &{ b: &{ c } } } = data;
520
- c = 999;
521
- <pre>{data.a.b.c}</pre>
579
+ function Test() {
580
+ return <>
581
+ const data = { a: { b: { c: 1 } } };
582
+ let &{ a: &{ b: &{ c } } } = data;
583
+ c = 999;
584
+ <pre>{data.a.b.c}</pre>
585
+ </>;
522
586
  }
523
587
 
524
588
  const { body } = await render(Test);
@@ -526,12 +590,14 @@ describe('lazy destructuring', () => {
526
590
  });
527
591
 
528
592
  it('supports compound assignment on deeply nested lazy bindings', async () => {
529
- component Test() {
530
- const data = { a: { b: { c: 5 } } };
531
- let &{ a: &{ b: &{ c } } } = data;
532
- c += 10;
533
- c *= 2;
534
- <pre>{data.a.b.c}</pre>
593
+ function Test() {
594
+ return <>
595
+ const data = { a: { b: { c: 5 } } };
596
+ let &{ a: &{ b: &{ c } } } = data;
597
+ c += 10;
598
+ c *= 2;
599
+ <pre>{data.a.b.c}</pre>
600
+ </>;
535
601
  }
536
602
 
537
603
  const { body } = await render(Test);
@@ -539,19 +605,21 @@ describe('lazy destructuring', () => {
539
605
  });
540
606
 
541
607
  it('preserves default values inside nested lazy destructuring', async () => {
542
- component Test() {
543
- let inner_value: number | undefined;
544
- const data: { outer: { inner?: number } } = {
545
- outer: {
546
- get inner() {
547
- return inner_value;
608
+ function Test() {
609
+ return <>
610
+ let inner_value: number | undefined;
611
+ const data: { outer: { inner?: number } } = {
612
+ outer: {
613
+ get inner() {
614
+ return inner_value;
615
+ },
548
616
  },
549
- },
550
- };
551
- const &{ outer: &{ inner = 42 } } = data;
552
- const before = inner;
553
- inner_value = 43;
554
- <pre>{`${before}-${inner}`}</pre>
617
+ };
618
+ const &{ outer: &{ inner = 42 } } = data;
619
+ const before = inner;
620
+ inner_value = 43;
621
+ <pre>{`${before}-${inner}`}</pre>
622
+ </>;
555
623
  }
556
624
 
557
625
  const { body } = await render(Test);
@@ -559,26 +627,28 @@ describe('lazy destructuring', () => {
559
627
  });
560
628
 
561
629
  it('preserves multiple sibling nested lazy destructures', async () => {
562
- component Test() {
563
- let x_value = 1;
564
- let y_value = 2;
565
- const data = {
566
- a: {
567
- get x() {
568
- return x_value;
630
+ function Test() {
631
+ return <>
632
+ let x_value = 1;
633
+ let y_value = 2;
634
+ const data = {
635
+ a: {
636
+ get x() {
637
+ return x_value;
638
+ },
569
639
  },
570
- },
571
- b: {
572
- get y() {
573
- return y_value;
640
+ b: {
641
+ get y() {
642
+ return y_value;
643
+ },
574
644
  },
575
- },
576
- };
577
- const &{ a: &{ x }, b: &{ y } } = data;
578
- const before = `${x}-${y}`;
579
- x_value = 3;
580
- y_value = 4;
581
- <pre>{`${before}-${x}-${y}`}</pre>
645
+ };
646
+ const &{ a: &{ x }, b: &{ y } } = data;
647
+ const before = `${x}-${y}`;
648
+ x_value = 3;
649
+ y_value = 4;
650
+ <pre>{`${before}-${x}-${y}`}</pre>
651
+ </>;
582
652
  }
583
653
 
584
654
  const { body } = await render(Test);
@@ -586,12 +656,14 @@ describe('lazy destructuring', () => {
586
656
  });
587
657
 
588
658
  it('supports multiple sibling nested lazy destructures with writeback', async () => {
589
- component Test() {
590
- const data = { a: { x: 1 }, b: { y: 2 } };
591
- let &{ a: &{ x }, b: &{ y } } = data;
592
- x = 11;
593
- y = 22;
594
- <pre>{`${data.a.x}-${data.b.y}`}</pre>
659
+ function Test() {
660
+ return <>
661
+ const data = { a: { x: 1 }, b: { y: 2 } };
662
+ let &{ a: &{ x }, b: &{ y } } = data;
663
+ x = 11;
664
+ y = 22;
665
+ <pre>{`${data.a.x}-${data.b.y}`}</pre>
666
+ </>;
595
667
  }
596
668
 
597
669
  const { body } = await render(Test);