ripple 0.3.72 → 0.3.76

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 (172) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +4 -10
  4. package/src/runtime/dynamic-client.js +33 -0
  5. package/src/runtime/dynamic-server.js +80 -0
  6. package/src/runtime/index-client.js +5 -13
  7. package/src/runtime/index-server.js +2 -0
  8. package/src/runtime/internal/client/blocks.js +6 -27
  9. package/src/runtime/internal/client/composite.js +11 -6
  10. package/src/runtime/internal/client/for.js +80 -5
  11. package/src/runtime/internal/client/index.js +0 -2
  12. package/src/runtime/internal/client/render.js +5 -2
  13. package/src/runtime/internal/client/types.d.ts +0 -10
  14. package/src/runtime/internal/server/index.js +8 -1
  15. package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
  16. package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
  17. package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
  18. package/tests/client/array/array.copy-within.test.tsrx +19 -19
  19. package/tests/client/array/array.derived.test.tsrx +97 -109
  20. package/tests/client/array/array.iteration.test.tsrx +28 -28
  21. package/tests/client/array/array.mutations.test.tsrx +68 -68
  22. package/tests/client/array/array.static.test.tsrx +82 -92
  23. package/tests/client/array/array.to-methods.test.tsrx +15 -15
  24. package/tests/client/async-suspend.test.tsrx +180 -179
  25. package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
  26. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
  27. package/tests/client/basic/basic.attributes.test.tsrx +273 -317
  28. package/tests/client/basic/basic.collections.test.tsrx +55 -61
  29. package/tests/client/basic/basic.components.test.tsrx +198 -220
  30. package/tests/client/basic/basic.errors.test.tsrx +70 -76
  31. package/tests/client/basic/basic.events.test.tsrx +80 -85
  32. package/tests/client/basic/basic.get-set.test.tsrx +54 -64
  33. package/tests/client/basic/basic.hmr.test.tsrx +15 -19
  34. package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
  35. package/tests/client/basic/basic.rendering.test.tsrx +273 -178
  36. package/tests/client/basic/basic.styling.test.tsrx +16 -14
  37. package/tests/client/basic/basic.utilities.test.tsrx +8 -10
  38. package/tests/client/boundaries.test.tsrx +18 -18
  39. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
  40. package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
  41. package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
  42. package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
  43. package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
  44. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  45. package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
  46. package/tests/client/composite/composite.dynamic-components.test.tsrx +62 -47
  47. package/tests/client/composite/composite.generics.test.tsrx +165 -167
  48. package/tests/client/composite/composite.props.test.tsrx +66 -74
  49. package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
  50. package/tests/client/composite/composite.render.test.tsrx +92 -101
  51. package/tests/client/computed-properties.test.tsrx +14 -18
  52. package/tests/client/context.test.tsrx +14 -18
  53. package/tests/client/css/global-additional-cases.test.tsrx +493 -439
  54. package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
  55. package/tests/client/css/global-at-rules.test.tsrx +71 -66
  56. package/tests/client/css/global-basic.test.tsrx +105 -98
  57. package/tests/client/css/global-classes-ids.test.tsrx +128 -114
  58. package/tests/client/css/global-combinators.test.tsrx +83 -78
  59. package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
  60. package/tests/client/css/global-edge-cases.test.tsrx +138 -120
  61. package/tests/client/css/global-keyframes.test.tsrx +108 -96
  62. package/tests/client/css/global-nested.test.tsrx +88 -78
  63. package/tests/client/css/global-pseudo.test.tsrx +104 -98
  64. package/tests/client/css/global-scoping.test.tsrx +145 -125
  65. package/tests/client/css/style-identifier.test.tsrx +65 -72
  66. package/tests/client/date.test.tsrx +83 -83
  67. package/tests/client/dynamic-elements.test.tsrx +318 -299
  68. package/tests/client/events.test.tsrx +252 -266
  69. package/tests/client/for.test.tsrx +120 -127
  70. package/tests/client/head.test.tsrx +74 -48
  71. package/tests/client/html.test.tsrx +37 -49
  72. package/tests/client/input-value.test.tsrx +1125 -1354
  73. package/tests/client/lazy-array.test.tsrx +10 -16
  74. package/tests/client/lazy-destructuring.test.tsrx +169 -221
  75. package/tests/client/map.test.tsrx +39 -41
  76. package/tests/client/media-query.test.tsrx +15 -19
  77. package/tests/client/object.test.tsrx +46 -56
  78. package/tests/client/portal.test.tsrx +31 -37
  79. package/tests/client/ref.test.tsrx +173 -193
  80. package/tests/client/return.test.tsrx +62 -37
  81. package/tests/client/set.test.tsrx +33 -33
  82. package/tests/client/svg.test.tsrx +197 -216
  83. package/tests/client/switch.test.tsrx +201 -191
  84. package/tests/client/track-async-hydration.test.tsrx +14 -18
  85. package/tests/client/tracked-index-access.test.tsrx +18 -28
  86. package/tests/client/try.test.tsrx +494 -619
  87. package/tests/client/tsx.test.tsrx +286 -292
  88. package/tests/client/typescript-generics.test.tsrx +121 -129
  89. package/tests/client/url/url.derived.test.tsrx +21 -25
  90. package/tests/client/url/url.parsing.test.tsrx +35 -35
  91. package/tests/client/url/url.partial-removal.test.tsrx +32 -32
  92. package/tests/client/url/url.reactivity.test.tsrx +68 -72
  93. package/tests/client/url/url.serialization.test.tsrx +8 -8
  94. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
  95. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
  96. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
  97. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
  98. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
  99. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
  100. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
  101. package/tests/hydration/compiled/client/basic.js +390 -319
  102. package/tests/hydration/compiled/client/composite.js +52 -44
  103. package/tests/hydration/compiled/client/for.js +734 -604
  104. package/tests/hydration/compiled/client/head.js +183 -103
  105. package/tests/hydration/compiled/client/html.js +93 -86
  106. package/tests/hydration/compiled/client/if-children.js +95 -71
  107. package/tests/hydration/compiled/client/if.js +113 -89
  108. package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
  109. package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
  110. package/tests/hydration/compiled/client/reactivity.js +26 -24
  111. package/tests/hydration/compiled/client/return.js +8 -42
  112. package/tests/hydration/compiled/client/switch.js +208 -173
  113. package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
  114. package/tests/hydration/compiled/client/try.js +29 -21
  115. package/tests/hydration/compiled/server/basic.js +210 -221
  116. package/tests/hydration/compiled/server/composite.js +13 -14
  117. package/tests/hydration/compiled/server/for.js +427 -444
  118. package/tests/hydration/compiled/server/head.js +199 -189
  119. package/tests/hydration/compiled/server/html.js +33 -41
  120. package/tests/hydration/compiled/server/if-children.js +114 -117
  121. package/tests/hydration/compiled/server/if.js +77 -83
  122. package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
  123. package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
  124. package/tests/hydration/compiled/server/reactivity.js +24 -22
  125. package/tests/hydration/compiled/server/return.js +6 -18
  126. package/tests/hydration/compiled/server/switch.js +179 -176
  127. package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
  128. package/tests/hydration/compiled/server/try.js +31 -35
  129. package/tests/hydration/components/basic.tsrx +216 -258
  130. package/tests/hydration/components/composite.tsrx +32 -42
  131. package/tests/hydration/components/events.tsrx +81 -101
  132. package/tests/hydration/components/for.tsrx +270 -336
  133. package/tests/hydration/components/head.tsrx +43 -39
  134. package/tests/hydration/components/hmr.tsrx +16 -22
  135. package/tests/hydration/components/html-in-template.tsrx +15 -21
  136. package/tests/hydration/components/html.tsrx +442 -526
  137. package/tests/hydration/components/if-children.tsrx +107 -125
  138. package/tests/hydration/components/if.tsrx +68 -90
  139. package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
  140. package/tests/hydration/components/nested-control-flow.tsrx +202 -216
  141. package/tests/hydration/components/portal.tsrx +33 -41
  142. package/tests/hydration/components/reactivity.tsrx +26 -34
  143. package/tests/hydration/components/return.tsrx +4 -6
  144. package/tests/hydration/components/switch.tsrx +73 -78
  145. package/tests/hydration/components/track-async-serialization.tsrx +83 -93
  146. package/tests/hydration/components/try.tsrx +37 -51
  147. package/tests/hydration/switch.test.js +8 -8
  148. package/tests/server/await.test.tsrx +3 -3
  149. package/tests/server/basic.attributes.test.tsrx +117 -162
  150. package/tests/server/basic.components.test.tsrx +164 -194
  151. package/tests/server/basic.test.tsrx +299 -199
  152. package/tests/server/compiler.test.tsrx +142 -72
  153. package/tests/server/composite.props.test.tsrx +54 -58
  154. package/tests/server/composite.test.tsrx +165 -167
  155. package/tests/server/context.test.tsrx +13 -17
  156. package/tests/server/dynamic-elements.test.tsrx +147 -148
  157. package/tests/server/for.test.tsrx +115 -84
  158. package/tests/server/head.test.tsrx +54 -31
  159. package/tests/server/html-nesting-validation.test.tsrx +16 -8
  160. package/tests/server/if.test.tsrx +49 -59
  161. package/tests/server/lazy-destructuring.test.tsrx +288 -366
  162. package/tests/server/return.test.tsrx +58 -36
  163. package/tests/server/streaming-ssr.test.tsrx +4 -4
  164. package/tests/server/style-identifier.test.tsrx +61 -69
  165. package/tests/server/switch.test.tsrx +89 -97
  166. package/tests/server/track-async-serialization.test.tsrx +85 -103
  167. package/tests/server/try.test.tsrx +275 -360
  168. package/tests/utils/ref-types.test.js +72 -0
  169. package/tests/utils/vite-plugin-config.test.js +41 -74
  170. package/types/index.d.ts +29 -4
  171. package/src/runtime/internal/client/compat.js +0 -40
  172. package/tests/utils/compiler-compat-config.test.js +0 -38
@@ -1,4 +1,4 @@
1
- import { track } from 'ripple';
1
+ import { Dynamic, track } from 'ripple';
2
2
  import type {
3
3
  Tracked,
4
4
  PropsWithChildren,
@@ -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>
76
70
  }
77
71
 
78
- function Basic() {
79
- return <>
80
- function children() {
81
- return <><p>{'Card content here'}</p></>;
82
- }
83
- <Card {children} />
84
- </>;
72
+ function children() @{
73
+ <p>{'Card content here'}</p>
74
+ }
75
+
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,12 +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 <><div>{'compat'}</div></>;
153
+ function CompatOnly() @{
154
+ <div>{'compat'}</div>
160
155
  }
161
156
 
162
- function App() {
163
- return <><CompatOnly /></>;
157
+ function App() @{
158
+ <CompatOnly />
164
159
  }
165
160
 
166
161
  const { body } = await render(App);
@@ -173,8 +168,8 @@ describe('basic server > components & composition', () => {
173
168
  variant: string;
174
169
  label: string;
175
170
  onClick: EventListener;
176
- }>) {
177
- return <><button class={props.variant} onClick={props.onClick}>{props.label}</button></>;
171
+ }>) @{
172
+ <button class={props.variant} onClick={props.onClick}>{props.label}</button>
178
173
  }
179
174
 
180
175
  function Card(props: PropsWithExtras<{
@@ -182,27 +177,27 @@ describe('basic server > components & composition', () => {
182
177
  content: string;
183
178
  buttonText: string;
184
179
  onAction: EventListener;
185
- }>) {
186
- return <>
187
- <div class="card">
188
- <h3>{props.title}</h3>
189
- <p>{props.content}</p>
190
- <Button variant="primary" label={props.buttonText} onClick={props.onAction} />
191
- </div>
192
- </>;
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>
193
186
  }
194
187
 
195
- function Basic() {
196
- return <>
197
- let &[clicked] = track(false);
188
+ function Basic() @{
189
+ let &[clicked] = track(false);
190
+ <>
198
191
  <Card
199
192
  title="Test Card"
200
193
  content="This is a test card"
201
194
  buttonText="Click me"
202
195
  onAction={() => (clicked = true)}
203
196
  />
204
- <div class="status">{clicked ? 'Clicked' : 'Not clicked'}</div>
205
- </>;
197
+ <div class="status">
198
+ {clicked ? 'Clicked' : 'Not clicked'}
199
+ </div>
200
+ </>
206
201
  }
207
202
 
208
203
  const { body } = await render(Basic);
@@ -225,27 +220,25 @@ describe('basic server > components & composition', () => {
225
220
  function ChildComponent(props: PropsWithExtras<{
226
221
  text: Tracked<string>;
227
222
  count: Tracked<number>;
228
- }>) {
229
- return <>
223
+ }>) @{
224
+ <>
230
225
  <div class="child-content">{props.text.value}</div>
231
226
  <div class="child-count">{props.count.value}</div>
232
- </>;
227
+ </>
233
228
  }
234
229
 
235
- function Basic() {
236
- return <>
237
- let &[message, messageTracked] = track('Hello');
238
- let &[number, numberTracked] = track(1);
230
+ function Basic() @{
231
+ let &[message, messageTracked] = track('Hello');
232
+ let &[number, numberTracked] = track(1);
233
+ <>
239
234
  <ChildComponent text={messageTracked} count={numberTracked} />
240
235
  <button
241
236
  onClick={() => {
242
237
  message = message === 'Hello' ? 'Goodbye' : 'Hello';
243
238
  number++;
244
239
  }}
245
- >
246
- {'Update Props'}
247
- </button>
248
- </>;
240
+ >{'Update Props'}</button>
241
+ </>
249
242
  }
250
243
 
251
244
  const { body } = await render(Basic);
@@ -259,16 +252,16 @@ describe('basic server > components & composition', () => {
259
252
  });
260
253
 
261
254
  it('renders components as named and anonymous properties', async () => {
262
- function Span() {
263
- return <><span>{'Hello from Span'}</span></>;
255
+ function Span() @{
256
+ <span>{'Hello from Span'}</span>
264
257
  }
265
258
 
266
- function Button({ children }: PropsWithChildren<{}>) {
267
- return <><button>{children}</button></>;
259
+ function Button({ children }: PropsWithChildren<{}>) @{
260
+ <button>{children}</button>
268
261
  }
269
262
 
270
- function ArrowButton({ children }: PropsWithChildren<{}>) {
271
- return <><button class="arrow-button">{children}</button></>;
263
+ function ArrowButton({ children }: PropsWithChildren<{}>) @{
264
+ <button class="arrow-button">{children}</button>
272
265
  }
273
266
 
274
267
  const UI = {
@@ -277,18 +270,17 @@ describe('basic server > components & composition', () => {
277
270
  arrowButton: ArrowButton,
278
271
  };
279
272
 
280
- function App() {
281
- return <>
282
- function children() {
283
- return <><span>{'Click me!'}</span></>;
284
- }
285
- <div>
286
- <h1>{'Component as Property Test'}</h1>
287
- <UI.span />
288
- <UI.button {children} />
289
- <UI.arrowButton {children} />
290
- </div>
291
- </>;
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>
292
284
  }
293
285
 
294
286
  const { body } = await render(App);
@@ -308,16 +300,18 @@ describe('basic server > components & composition', () => {
308
300
  });
309
301
 
310
302
  it('handles empty string children', async () => {
311
- function Button({ children }: PropsWithChildren<{}>) {
312
- return <>{children}</>;
303
+ function Button({ children }: PropsWithChildren<{}>) @{
304
+ <>
305
+ {children}
306
+ </>
313
307
  }
314
308
 
315
- function App() {
316
- return <>
317
- let content = '';
309
+ function App() @{
310
+ let content = '';
311
+ <>
318
312
  <Button>{''}</Button>
319
313
  <Button>{content}</Button>
320
- </>;
314
+ </>
321
315
  }
322
316
 
323
317
  const { body } = await render(App);
@@ -328,18 +322,16 @@ describe('basic server > components & composition', () => {
328
322
 
329
323
  it('handles component without any output', async () => {
330
324
  function Noop() {
331
- return <></>;
325
+ return null;
332
326
  }
333
327
 
334
- function Op() {
335
- return <><div>{'Some HTML content'}</div></>;
328
+ function Op() @{
329
+ <div>{'Some HTML content'}</div>
336
330
  }
337
331
 
338
- function App() {
339
- return <>
340
- let Content = track(() => Noop);
341
- <@Content />
342
- </>;
332
+ function App() @{
333
+ let Content = track(() => Noop);
334
+ <Dynamic is={Content} />
343
335
  }
344
336
 
345
337
  const { body } = await render(App);
@@ -349,12 +341,12 @@ describe('basic server > components & composition', () => {
349
341
  });
350
342
 
351
343
  it('renders explicit children prop without spread', async () => {
352
- function Card(props: PropsWithChildren<{}>) {
353
- return <><div class="card">{props.children}</div></>;
344
+ function Card(props: PropsWithChildren<{}>) @{
345
+ <div class="card">{props.children}</div>
354
346
  }
355
347
 
356
- function App() {
357
- return <><Card children="fallback text" /></>;
348
+ function App() @{
349
+ <Card children="fallback text" />
358
350
  }
359
351
 
360
352
  const { body } = await render(App);
@@ -363,15 +355,13 @@ describe('basic server > components & composition', () => {
363
355
  });
364
356
 
365
357
  it('renders explicit children before spread', async () => {
366
- function Card(props: PropsWithChildren<{ id: string }>) {
367
- return <><div class="card">{props.children}</div></>;
358
+ function Card(props: PropsWithChildren<{ id: string }>) @{
359
+ <div class="card">{props.children}</div>
368
360
  }
369
361
 
370
- function App() {
371
- return <>
372
- const extra = { id: '1' };
373
- <Card children="fallback text" {...extra} />
374
- </>;
362
+ function App() @{
363
+ const extra = { id: '1' };
364
+ <Card children="fallback text" {...extra} />
375
365
  }
376
366
 
377
367
  const { body } = await render(App);
@@ -380,15 +370,13 @@ describe('basic server > components & composition', () => {
380
370
  });
381
371
 
382
372
  it('renders spread before explicit children', async () => {
383
- function Card(props: PropsWithChildren<{ id: string }>) {
384
- return <><div class="card">{props.children}</div></>;
373
+ function Card(props: PropsWithChildren<{ id: string }>) @{
374
+ <div class="card">{props.children}</div>
385
375
  }
386
376
 
387
- function App() {
388
- return <>
389
- const extra = { id: '1' };
390
- <Card {...extra} children="fallback text" />
391
- </>;
377
+ function App() @{
378
+ const extra = { id: '1' };
379
+ <Card {...extra} children="fallback text" />
392
380
  }
393
381
 
394
382
  const { body } = await render(App);
@@ -397,17 +385,15 @@ describe('basic server > components & composition', () => {
397
385
  });
398
386
 
399
387
  it('template children override explicit children before spread', async () => {
400
- function Card(props: PropsWithChildren<{ id: string }>) {
401
- return <><div class="card">{props.children}</div></>;
388
+ function Card(props: PropsWithChildren<{ id: string }>) @{
389
+ <div class="card">{props.children}</div>
402
390
  }
403
391
 
404
- function App() {
405
- return <>
406
- const extra = { id: '1' };
407
- <Card children="fallback text" {...extra}>
408
- <span>{'template content'}</span>
409
- </Card>
410
- </>;
392
+ function App() @{
393
+ const extra = { id: '1' };
394
+ <Card children="fallback text" {...extra}>
395
+ <span>{'template content'}</span>
396
+ </Card>
411
397
  }
412
398
 
413
399
  const { body } = await render(App);
@@ -417,17 +403,15 @@ describe('basic server > components & composition', () => {
417
403
  });
418
404
 
419
405
  it('template children override explicit children after spread', async () => {
420
- function Card(props: PropsWithChildren<{ id: string }>) {
421
- return <><div class="card">{props.children}</div></>;
406
+ function Card(props: PropsWithChildren<{ id: string }>) @{
407
+ <div class="card">{props.children}</div>
422
408
  }
423
409
 
424
- function App() {
425
- return <>
426
- const extra = { id: '1' };
427
- <Card {...extra} children="fallback text">
428
- <span>{'template content'}</span>
429
- </Card>
430
- </>;
410
+ function App() @{
411
+ const extra = { id: '1' };
412
+ <Card {...extra} children="fallback text">
413
+ <span>{'template content'}</span>
414
+ </Card>
431
415
  }
432
416
 
433
417
  const { body } = await render(App);
@@ -437,19 +421,13 @@ describe('basic server > components & composition', () => {
437
421
  });
438
422
 
439
423
  it('spread can override explicit children when no template children', async () => {
440
- function Card(props: PropsWithChildren<{ id: string }>) {
441
- return <><div class="card">{props.children}</div></>;
424
+ function Card(props: PropsWithChildren<{ id: string }>) @{
425
+ <div class="card">{props.children}</div>
442
426
  }
443
427
 
444
- function App() {
445
- return <>
446
- const extra = { id: '1', children: 'from spread' };
447
- <Card
448
- // @ts-ignore
449
- children="explicit"
450
- {...extra}
451
- />
452
- </>;
428
+ function App() @{
429
+ const extra = { id: '1', children: 'from spread' };
430
+ <Card children="explicit" {...extra} />
453
431
  }
454
432
 
455
433
  const { body } = await render(App);
@@ -458,15 +436,13 @@ describe('basic server > components & composition', () => {
458
436
  });
459
437
 
460
438
  it('explicit children overrides spread children when it comes after', async () => {
461
- function Card(props: PropsWithChildren<{ id: string }>) {
462
- return <><div class="card">{props.children}</div></>;
439
+ function Card(props: PropsWithChildren<{ id: string }>) @{
440
+ <div class="card">{props.children}</div>
463
441
  }
464
442
 
465
- function App() {
466
- return <>
467
- const extra = { id: '1', children: 'from spread' };
468
- <Card {...extra} children="explicit" />
469
- </>;
443
+ function App() @{
444
+ const extra = { id: '1', children: 'from spread' };
445
+ <Card {...extra} children="explicit" />
470
446
  }
471
447
 
472
448
  const { body } = await render(App);
@@ -475,20 +451,18 @@ describe('basic server > components & composition', () => {
475
451
  });
476
452
 
477
453
  it('renders components declared inside composite element children', async () => {
478
- function Wrapper(props: PropsWithChildren<{}>) {
479
- return <><div class="wrapper">{props.children}</div></>;
454
+ function Wrapper(props: PropsWithChildren<{}>) @{
455
+ <div class="wrapper">{props.children}</div>
480
456
  }
481
457
 
482
- function App() {
483
- return <>
484
- <Wrapper>
485
- function Inner() {
486
- return <><span class="inner">{'inner content'}</span></>;
487
- }
458
+ function Inner() @{
459
+ <div class="inner">{'inner content'}</div>
460
+ }
488
461
 
489
- <Inner />
490
- </Wrapper>
491
- </>;
462
+ function App() @{
463
+ <Wrapper>
464
+ <Inner />
465
+ </Wrapper>
492
466
  }
493
467
 
494
468
  const { body } = await render(App);
@@ -497,29 +471,25 @@ describe('basic server > components & composition', () => {
497
471
  });
498
472
 
499
473
  it('renders nested components declared inside composite children with prop passing', async () => {
500
- function Wrapper(props: PropsWithChildren<{}>) {
501
- return <><div class="wrapper">{props.children}</div></>;
502
- }
503
-
504
- function App() {
505
- return <>
506
- <Wrapper>
507
- function Z() {
508
- return <><div class="z">{'I am Z'}</div></>;
509
- }
510
-
511
- function Child(&{ Z }: { Z: Component }) {
512
- return <>
513
- <div class="child">
514
- {'Child Component: '}
515
- <Z />
516
- </div>
517
- </>;
518
- }
519
-
520
- <Child {Z} />
521
- </Wrapper>
522
- </>;
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>
523
493
  }
524
494
 
525
495
  const { body } = await render(App);