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
@@ -18,17 +18,16 @@ describe('basic server > components & composition', () => {
18
18
  }
19
19
 
20
20
  it('renders with component composition and children', async () => {
21
- function Card(props: PropsWithChildren<{}>) {
22
- return <><div class="card">{props.children}</div></>;
21
+ function Card(props: PropsWithChildren<{}>) @{
22
+ <div class="card">{props.children}</div>
23
23
  }
24
24
 
25
- function Basic() {
26
- return <>
27
- function children() {
28
- return <><p>{'Card content here'}</p></>;
29
- }
30
- <Card {children} />
31
- </>;
25
+ function children() @{
26
+ <p>{'Card content here'}</p>
27
+ }
28
+
29
+ function Basic() @{
30
+ <Card {children} />
32
31
  }
33
32
 
34
33
  const { body } = await render(Basic);
@@ -42,21 +41,16 @@ describe('basic server > components & composition', () => {
42
41
  });
43
42
 
44
43
  it('does not render a falsy component call', async () => {
45
- function Card(props: PropsWithChildrenOptional<{ test: Component }>) {
46
- return <>
47
- <div class="card">
48
- {props.children}
49
- </div>
50
- </>;
44
+ function Card(props: PropsWithChildrenOptional<{ test: Component }>) @{
45
+ <div class="card">{props.children}</div>
51
46
  }
52
47
 
53
- function Basic() {
54
- return <>
55
- function test() {
56
- return <><p>{'Card content here'}</p></>;
57
- }
58
- <Card {test} />
59
- </>;
48
+ function test() {
49
+ return null;
50
+ }
51
+
52
+ function Basic() @{
53
+ <Card {test} />
60
54
  }
61
55
 
62
56
  const { body } = await render(Basic);
@@ -71,17 +65,16 @@ describe('basic server > components & composition', () => {
71
65
  });
72
66
 
73
67
  it('renders a component when children is set a component prop', async () => {
74
- function Card(props: PropsWithChildren<{}>) {
75
- return <><div class="card">{props.children}</div></>;
68
+ function Card(props: PropsWithChildren<{}>) @{
69
+ <div class="card">{props.children}</div>
70
+ }
71
+
72
+ function children() @{
73
+ <p>{'Card content here'}</p>
76
74
  }
77
75
 
78
- function Basic() {
79
- return <>
80
- function children() {
81
- return <><p>{'Card content here'}</p></>;
82
- }
83
- <Card {children} />
84
- </>;
76
+ function Basic() @{
77
+ <Card {children} />
85
78
  }
86
79
 
87
80
  const { body } = await render(Basic);
@@ -95,12 +88,14 @@ describe('basic server > components & composition', () => {
95
88
  });
96
89
 
97
90
  it('renders direct component function calls as values', async () => {
98
- function Test({ label }: { label: string }) {
99
- return <><span>{label}</span></>;
91
+ function Test({ label }: { label: string }) @{
92
+ <span>{label}</span>
100
93
  }
101
94
 
102
- function App() {
103
- return <>{Test({ label: 'direct call' })}</>;
95
+ function App() @{
96
+ <>
97
+ {Test({ label: 'direct call' })}
98
+ </>
104
99
  }
105
100
 
106
101
  const { body } = await render(App);
@@ -115,8 +110,8 @@ describe('basic server > components & composition', () => {
115
110
  return [item, 'B', null, undefined];
116
111
  }
117
112
 
118
- function App() {
119
- return <><Test /></>;
113
+ function App() @{
114
+ <Test />
120
115
  }
121
116
 
122
117
  const { body } = await render(App);
@@ -126,13 +121,13 @@ describe('basic server > components & composition', () => {
126
121
  });
127
122
 
128
123
  it('throws when a TSRXElement value is used as a component type', async () => {
129
- function Test() {
130
- return <><span>{'value'}</span></>;
124
+ function Test() @{
125
+ <span>{'value'}</span>
131
126
  }
132
127
 
133
- function App() {
128
+ function App() @{
134
129
  const El = Test({});
135
- return <><El /></>;
130
+ <El />
136
131
  }
137
132
 
138
133
  const result = await render_expected_invalid_component(App);
@@ -145,8 +140,8 @@ describe('basic server > components & composition', () => {
145
140
  return 'plain';
146
141
  }
147
142
 
148
- function App() {
149
- return <><Func /></>;
143
+ function App() @{
144
+ <Func />
150
145
  }
151
146
 
152
147
  const { body } = await render(App);
@@ -155,16 +150,12 @@ describe('basic server > components & composition', () => {
155
150
  });
156
151
 
157
152
  it('allows a compat-only function as a component type', async () => {
158
- function CompatOnly() {
159
- return <tsx>
160
- <div>
161
- {'compat'}
162
- </div>
163
- </tsx>;
153
+ function CompatOnly() @{
154
+ <div>{'compat'}</div>
164
155
  }
165
156
 
166
- function App() {
167
- return <><CompatOnly /></>;
157
+ function App() @{
158
+ <CompatOnly />
168
159
  }
169
160
 
170
161
  const { body } = await render(App);
@@ -177,8 +168,8 @@ describe('basic server > components & composition', () => {
177
168
  variant: string;
178
169
  label: string;
179
170
  onClick: EventListener;
180
- }>) {
181
- return <><button class={props.variant} onClick={props.onClick}>{props.label}</button></>;
171
+ }>) @{
172
+ <button class={props.variant} onClick={props.onClick}>{props.label}</button>
182
173
  }
183
174
 
184
175
  function Card(props: PropsWithExtras<{
@@ -186,27 +177,27 @@ describe('basic server > components & composition', () => {
186
177
  content: string;
187
178
  buttonText: string;
188
179
  onAction: EventListener;
189
- }>) {
190
- return <>
191
- <div class="card">
192
- <h3>{props.title}</h3>
193
- <p>{props.content}</p>
194
- <Button variant="primary" label={props.buttonText} onClick={props.onAction} />
195
- </div>
196
- </>;
180
+ }>) @{
181
+ <div class="card">
182
+ <h3>{props.title}</h3>
183
+ <p>{props.content}</p>
184
+ <Button variant="primary" label={props.buttonText} onClick={props.onAction} />
185
+ </div>
197
186
  }
198
187
 
199
- function Basic() {
200
- return <>
201
- let &[clicked] = track(false);
188
+ function Basic() @{
189
+ let &[clicked] = track(false);
190
+ <>
202
191
  <Card
203
192
  title="Test Card"
204
193
  content="This is a test card"
205
194
  buttonText="Click me"
206
195
  onAction={() => (clicked = true)}
207
196
  />
208
- <div class="status">{clicked ? 'Clicked' : 'Not clicked'}</div>
209
- </>;
197
+ <div class="status">
198
+ {clicked ? 'Clicked' : 'Not clicked'}
199
+ </div>
200
+ </>
210
201
  }
211
202
 
212
203
  const { body } = await render(Basic);
@@ -229,27 +220,25 @@ describe('basic server > components & composition', () => {
229
220
  function ChildComponent(props: PropsWithExtras<{
230
221
  text: Tracked<string>;
231
222
  count: Tracked<number>;
232
- }>) {
233
- return <>
223
+ }>) @{
224
+ <>
234
225
  <div class="child-content">{props.text.value}</div>
235
226
  <div class="child-count">{props.count.value}</div>
236
- </>;
227
+ </>
237
228
  }
238
229
 
239
- function Basic() {
240
- return <>
241
- let &[message, messageTracked] = track('Hello');
242
- let &[number, numberTracked] = track(1);
230
+ function Basic() @{
231
+ let &[message, messageTracked] = track('Hello');
232
+ let &[number, numberTracked] = track(1);
233
+ <>
243
234
  <ChildComponent text={messageTracked} count={numberTracked} />
244
235
  <button
245
236
  onClick={() => {
246
237
  message = message === 'Hello' ? 'Goodbye' : 'Hello';
247
238
  number++;
248
239
  }}
249
- >
250
- {'Update Props'}
251
- </button>
252
- </>;
240
+ >{'Update Props'}</button>
241
+ </>
253
242
  }
254
243
 
255
244
  const { body } = await render(Basic);
@@ -263,16 +252,16 @@ describe('basic server > components & composition', () => {
263
252
  });
264
253
 
265
254
  it('renders components as named and anonymous properties', async () => {
266
- function Span() {
267
- return <><span>{'Hello from Span'}</span></>;
255
+ function Span() @{
256
+ <span>{'Hello from Span'}</span>
268
257
  }
269
258
 
270
- function Button({ children }: PropsWithChildren<{}>) {
271
- return <><button>{children}</button></>;
259
+ function Button({ children }: PropsWithChildren<{}>) @{
260
+ <button>{children}</button>
272
261
  }
273
262
 
274
- function ArrowButton({ children }: PropsWithChildren<{}>) {
275
- return <><button class="arrow-button">{children}</button></>;
263
+ function ArrowButton({ children }: PropsWithChildren<{}>) @{
264
+ <button class="arrow-button">{children}</button>
276
265
  }
277
266
 
278
267
  const UI = {
@@ -281,18 +270,17 @@ describe('basic server > components & composition', () => {
281
270
  arrowButton: ArrowButton,
282
271
  };
283
272
 
284
- function App() {
285
- return <>
286
- function children() {
287
- return <><span>{'Click me!'}</span></>;
288
- }
289
- <div>
290
- <h1>{'Component as Property Test'}</h1>
291
- <UI.span />
292
- <UI.button {children} />
293
- <UI.arrowButton {children} />
294
- </div>
295
- </>;
273
+ function children() @{
274
+ <span>{'Click me!'}</span>
275
+ }
276
+
277
+ function App() @{
278
+ <div>
279
+ <h1>{'Component as Property Test'}</h1>
280
+ <UI.span />
281
+ <UI.button {children} />
282
+ <UI.arrowButton {children} />
283
+ </div>
296
284
  }
297
285
 
298
286
  const { body } = await render(App);
@@ -312,16 +300,18 @@ describe('basic server > components & composition', () => {
312
300
  });
313
301
 
314
302
  it('handles empty string children', async () => {
315
- function Button({ children }: PropsWithChildren<{}>) {
316
- return <>{children}</>;
303
+ function Button({ children }: PropsWithChildren<{}>) @{
304
+ <>
305
+ {children}
306
+ </>
317
307
  }
318
308
 
319
- function App() {
320
- return <>
321
- let content = '';
309
+ function App() @{
310
+ let content = '';
311
+ <>
322
312
  <Button>{''}</Button>
323
313
  <Button>{content}</Button>
324
- </>;
314
+ </>
325
315
  }
326
316
 
327
317
  const { body } = await render(App);
@@ -332,18 +322,16 @@ describe('basic server > components & composition', () => {
332
322
 
333
323
  it('handles component without any output', async () => {
334
324
  function Noop() {
335
- return <></>;
325
+ return null;
336
326
  }
337
327
 
338
- function Op() {
339
- return <><div>{'Some HTML content'}</div></>;
328
+ function Op() @{
329
+ <div>{'Some HTML content'}</div>
340
330
  }
341
331
 
342
- function App() {
343
- return <>
344
- let Content = track(() => Noop);
345
- <@Content />
346
- </>;
332
+ function App() @{
333
+ let Content = track(() => Noop);
334
+ <@Content />
347
335
  }
348
336
 
349
337
  const { body } = await render(App);
@@ -353,12 +341,12 @@ describe('basic server > components & composition', () => {
353
341
  });
354
342
 
355
343
  it('renders explicit children prop without spread', async () => {
356
- function Card(props: PropsWithChildren<{}>) {
357
- return <><div class="card">{props.children}</div></>;
344
+ function Card(props: PropsWithChildren<{}>) @{
345
+ <div class="card">{props.children}</div>
358
346
  }
359
347
 
360
- function App() {
361
- return <><Card children="fallback text" /></>;
348
+ function App() @{
349
+ <Card children="fallback text" />
362
350
  }
363
351
 
364
352
  const { body } = await render(App);
@@ -367,15 +355,13 @@ describe('basic server > components & composition', () => {
367
355
  });
368
356
 
369
357
  it('renders explicit children before spread', async () => {
370
- function Card(props: PropsWithChildren<{ id: string }>) {
371
- return <><div class="card">{props.children}</div></>;
358
+ function Card(props: PropsWithChildren<{ id: string }>) @{
359
+ <div class="card">{props.children}</div>
372
360
  }
373
361
 
374
- function App() {
375
- return <>
376
- const extra = { id: '1' };
377
- <Card children="fallback text" {...extra} />
378
- </>;
362
+ function App() @{
363
+ const extra = { id: '1' };
364
+ <Card children="fallback text" {...extra} />
379
365
  }
380
366
 
381
367
  const { body } = await render(App);
@@ -384,15 +370,13 @@ describe('basic server > components & composition', () => {
384
370
  });
385
371
 
386
372
  it('renders spread before explicit children', async () => {
387
- function Card(props: PropsWithChildren<{ id: string }>) {
388
- return <><div class="card">{props.children}</div></>;
373
+ function Card(props: PropsWithChildren<{ id: string }>) @{
374
+ <div class="card">{props.children}</div>
389
375
  }
390
376
 
391
- function App() {
392
- return <>
393
- const extra = { id: '1' };
394
- <Card {...extra} children="fallback text" />
395
- </>;
377
+ function App() @{
378
+ const extra = { id: '1' };
379
+ <Card {...extra} children="fallback text" />
396
380
  }
397
381
 
398
382
  const { body } = await render(App);
@@ -401,17 +385,15 @@ describe('basic server > components & composition', () => {
401
385
  });
402
386
 
403
387
  it('template children override explicit children before spread', async () => {
404
- function Card(props: PropsWithChildren<{ id: string }>) {
405
- return <><div class="card">{props.children}</div></>;
388
+ function Card(props: PropsWithChildren<{ id: string }>) @{
389
+ <div class="card">{props.children}</div>
406
390
  }
407
391
 
408
- function App() {
409
- return <>
410
- const extra = { id: '1' };
411
- <Card children="fallback text" {...extra}>
412
- <span>{'template content'}</span>
413
- </Card>
414
- </>;
392
+ function App() @{
393
+ const extra = { id: '1' };
394
+ <Card children="fallback text" {...extra}>
395
+ <span>{'template content'}</span>
396
+ </Card>
415
397
  }
416
398
 
417
399
  const { body } = await render(App);
@@ -421,17 +403,15 @@ describe('basic server > components & composition', () => {
421
403
  });
422
404
 
423
405
  it('template children override explicit children after spread', async () => {
424
- function Card(props: PropsWithChildren<{ id: string }>) {
425
- return <><div class="card">{props.children}</div></>;
406
+ function Card(props: PropsWithChildren<{ id: string }>) @{
407
+ <div class="card">{props.children}</div>
426
408
  }
427
409
 
428
- function App() {
429
- return <>
430
- const extra = { id: '1' };
431
- <Card {...extra} children="fallback text">
432
- <span>{'template content'}</span>
433
- </Card>
434
- </>;
410
+ function App() @{
411
+ const extra = { id: '1' };
412
+ <Card {...extra} children="fallback text">
413
+ <span>{'template content'}</span>
414
+ </Card>
435
415
  }
436
416
 
437
417
  const { body } = await render(App);
@@ -441,19 +421,13 @@ describe('basic server > components & composition', () => {
441
421
  });
442
422
 
443
423
  it('spread can override explicit children when no template children', async () => {
444
- function Card(props: PropsWithChildren<{ id: string }>) {
445
- return <><div class="card">{props.children}</div></>;
424
+ function Card(props: PropsWithChildren<{ id: string }>) @{
425
+ <div class="card">{props.children}</div>
446
426
  }
447
427
 
448
- function App() {
449
- return <>
450
- const extra = { id: '1', children: 'from spread' };
451
- <Card
452
- // @ts-ignore
453
- children="explicit"
454
- {...extra}
455
- />
456
- </>;
428
+ function App() @{
429
+ const extra = { id: '1', children: 'from spread' };
430
+ <Card children="explicit" {...extra} />
457
431
  }
458
432
 
459
433
  const { body } = await render(App);
@@ -462,15 +436,13 @@ describe('basic server > components & composition', () => {
462
436
  });
463
437
 
464
438
  it('explicit children overrides spread children when it comes after', async () => {
465
- function Card(props: PropsWithChildren<{ id: string }>) {
466
- return <><div class="card">{props.children}</div></>;
439
+ function Card(props: PropsWithChildren<{ id: string }>) @{
440
+ <div class="card">{props.children}</div>
467
441
  }
468
442
 
469
- function App() {
470
- return <>
471
- const extra = { id: '1', children: 'from spread' };
472
- <Card {...extra} children="explicit" />
473
- </>;
443
+ function App() @{
444
+ const extra = { id: '1', children: 'from spread' };
445
+ <Card {...extra} children="explicit" />
474
446
  }
475
447
 
476
448
  const { body } = await render(App);
@@ -479,20 +451,18 @@ describe('basic server > components & composition', () => {
479
451
  });
480
452
 
481
453
  it('renders components declared inside composite element children', async () => {
482
- function Wrapper(props: PropsWithChildren<{}>) {
483
- return <><div class="wrapper">{props.children}</div></>;
454
+ function Wrapper(props: PropsWithChildren<{}>) @{
455
+ <div class="wrapper">{props.children}</div>
484
456
  }
485
457
 
486
- function App() {
487
- return <>
488
- <Wrapper>
489
- function Inner() {
490
- return <><span class="inner">{'inner content'}</span></>;
491
- }
458
+ function Inner() @{
459
+ <div class="inner">{'inner content'}</div>
460
+ }
492
461
 
493
- <Inner />
494
- </Wrapper>
495
- </>;
462
+ function App() @{
463
+ <Wrapper>
464
+ <Inner />
465
+ </Wrapper>
496
466
  }
497
467
 
498
468
  const { body } = await render(App);
@@ -501,29 +471,25 @@ describe('basic server > components & composition', () => {
501
471
  });
502
472
 
503
473
  it('renders nested components declared inside composite children with prop passing', async () => {
504
- function Wrapper(props: PropsWithChildren<{}>) {
505
- return <><div class="wrapper">{props.children}</div></>;
506
- }
507
-
508
- function App() {
509
- return <>
510
- <Wrapper>
511
- function Z() {
512
- return <><div class="z">{'I am Z'}</div></>;
513
- }
514
-
515
- function Child(&{ Z }: { Z: Component }) {
516
- return <>
517
- <div class="child">
518
- {'Child Component: '}
519
- <Z />
520
- </div>
521
- </>;
522
- }
523
-
524
- <Child {Z} />
525
- </Wrapper>
526
- </>;
474
+ function Wrapper(props: PropsWithChildren<{}>) @{
475
+ <div class="wrapper">{props.children}</div>
476
+ }
477
+
478
+ function Z() @{
479
+ <span class="z">{'I am Z'}</span>
480
+ }
481
+
482
+ function Child(props: { Z: Component }) @{
483
+ <div class="child">
484
+ {'Child Component: '}
485
+ <props.Z />
486
+ </div>
487
+ }
488
+
489
+ function App() @{
490
+ <Wrapper>
491
+ <Child {Z} />
492
+ </Wrapper>
527
493
  }
528
494
 
529
495
  const { body } = await render(App);