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
@@ -2,8 +2,8 @@ import { RippleObject, track } from 'ripple';
2
2
 
3
3
  describe('basic server > attribute rendering', () => {
4
4
  it('render static attributes', async () => {
5
- function Basic() {
6
- return <><div class="foo" id="bar" style="color: red;">{'Hello World'}</div></>;
5
+ function Basic() @{
6
+ <div class="foo" id="bar" style="color: red;">{'Hello World'}</div>
7
7
  }
8
8
 
9
9
  const { body } = await render(Basic);
@@ -18,16 +18,16 @@ describe('basic server > attribute rendering', () => {
18
18
  });
19
19
 
20
20
  it('render dynamic class attribute', async () => {
21
- function Basic() {
22
- return <>
23
- let &[active] = track(false);
21
+ function Basic() @{
22
+ let &[active] = track(false);
23
+ <>
24
24
  <div class={active ? 'active' : 'inactive'}>{'Dynamic Class'}</div>
25
25
  <style>
26
26
  .active {
27
27
  color: green;
28
28
  }
29
29
  </style>
30
- </>;
30
+ </>
31
31
  }
32
32
 
33
33
  const { body } = await render(Basic);
@@ -42,8 +42,8 @@ describe('basic server > attribute rendering', () => {
42
42
  });
43
43
 
44
44
  it('render class attribute with array, nested array, nested object', async () => {
45
- function Basic() {
46
- return <>
45
+ function Basic() @{
46
+ <>
47
47
  <div
48
48
  class={[
49
49
  'foo',
@@ -57,15 +57,13 @@ describe('basic server > attribute rendering', () => {
57
57
  { eee: true, fff: false },
58
58
  ],
59
59
  ]}
60
- >
61
- {'Class Array'}
62
- </div>
60
+ >{'Class Array'}</div>
63
61
  <style>
64
62
  .foo {
65
63
  color: red;
66
64
  }
67
65
  </style>
68
- </>;
66
+ </>
69
67
  }
70
68
 
71
69
  const { body } = await render(Basic);
@@ -89,8 +87,8 @@ describe('basic server > attribute rendering', () => {
89
87
  });
90
88
 
91
89
  it('applies scoped classes inside tsx blocks and fragment shorthand', async () => {
92
- function App() {
93
- return <>
90
+ function App() @{
91
+ <>
94
92
  <>
95
93
  <div class="card">
96
94
  <h2>{'tsx block'}</h2>
@@ -110,7 +108,7 @@ describe('basic server > attribute rendering', () => {
110
108
  color: red;
111
109
  }
112
110
  </style>
113
- </>;
111
+ </>
114
112
  }
115
113
 
116
114
  const { body } = await render(App);
@@ -136,16 +134,16 @@ describe('basic server > attribute rendering', () => {
136
134
  });
137
135
 
138
136
  it('render dynamic class object', async () => {
139
- function Basic() {
140
- return <>
141
- let &[active] = track(false);
137
+ function Basic() @{
138
+ let &[active] = track(false);
139
+ <>
142
140
  <div class={{ active: active, inactive: !active }}>{'Dynamic Class'}</div>
143
141
  <style>
144
142
  .active {
145
143
  color: green;
146
144
  }
147
145
  </style>
148
- </>;
146
+ </>
149
147
  }
150
148
 
151
149
  const { body } = await render(Basic);
@@ -163,9 +161,9 @@ describe('basic server > attribute rendering', () => {
163
161
  it(
164
162
  'applies scoped ripple class to multiple elements with dynamic class expressions',
165
163
  async () => {
166
- function Basic() {
167
- return <>
168
- let &[selected] = track(1);
164
+ function Basic() @{
165
+ let &[selected] = track(1);
166
+ <>
169
167
  <div class={selected === 0 ? 'selected' : ''}>{`div 1`}</div>
170
168
  <div class={selected === 0 ? 'selected' : ''}>{`div 2`}</div>
171
169
  <style>
@@ -177,7 +175,7 @@ describe('basic server > attribute rendering', () => {
177
175
  background: indigo;
178
176
  }
179
177
  </style>
180
- </>;
178
+ </>
181
179
  }
182
180
 
183
181
  const { body } = await render(Basic);
@@ -194,11 +192,9 @@ describe('basic server > attribute rendering', () => {
194
192
  );
195
193
 
196
194
  it('render dynamic id attribute', async () => {
197
- function Basic() {
198
- return <>
199
- let &[count] = track(0);
200
- <div id={`item-${count}`}>{'Dynamic ID'}</div>
201
- </>;
195
+ function Basic() @{
196
+ let &[count] = track(0);
197
+ <div id={`item-${count}`}>{'Dynamic ID'}</div>
202
198
  }
203
199
 
204
200
  const { body } = await render(Basic);
@@ -210,11 +206,9 @@ describe('basic server > attribute rendering', () => {
210
206
  });
211
207
 
212
208
  it('render dynamic style attribute', async () => {
213
- function Basic() {
214
- return <>
215
- let &[color] = track('red');
216
- <div style={`color: ${color}; font-weight: bold;`}>{'Dynamic Style'}</div>
217
- </>;
209
+ function Basic() @{
210
+ let &[color] = track('red');
211
+ <div style={`color: ${color}; font-weight: bold;`}>{'Dynamic Style'}</div>
218
212
  }
219
213
 
220
214
  const { body } = await render(Basic);
@@ -227,11 +221,9 @@ describe('basic server > attribute rendering', () => {
227
221
  });
228
222
 
229
223
  it('render style attribute as dynamic object', async () => {
230
- function Basic() {
231
- return <>
232
- let &[color] = track('red');
233
- <div style={{ color: color, fontWeight: 'bold' }}>{'Dynamic Style'}</div>
234
- </>;
224
+ function Basic() @{
225
+ let &[color] = track('red');
226
+ <div style={{ color: color, fontWeight: 'bold' }}>{'Dynamic Style'}</div>
235
227
  }
236
228
 
237
229
  const { body } = await render(Basic);
@@ -244,11 +236,9 @@ describe('basic server > attribute rendering', () => {
244
236
  });
245
237
 
246
238
  it('render tracked variable as style attribute', async () => {
247
- function Basic() {
248
- return <>
249
- let &[style] = track({ color: 'red', fontWeight: 'bold' });
250
- <div {style}>{'Dynamic Style'}</div>
251
- </>;
239
+ function Basic() @{
240
+ let &[style] = track({ color: 'red', fontWeight: 'bold' });
241
+ <div {style}>{'Dynamic Style'}</div>
252
242
  }
253
243
 
254
244
  const { body } = await render(Basic);
@@ -261,14 +251,12 @@ describe('basic server > attribute rendering', () => {
261
251
  });
262
252
 
263
253
  it('render tracked object as style attribute', async () => {
264
- function Basic() {
265
- return <>
266
- let style = new RippleObject({
267
- color: 'red',
268
- fontWeight: 'bold',
269
- });
270
- <div style={{ color: style.color, fontWeight: style.fontWeight }}>{'Dynamic Style'}</div>
271
- </>;
254
+ function Basic() @{
255
+ let style = new RippleObject({
256
+ color: 'red',
257
+ fontWeight: 'bold',
258
+ });
259
+ <div style={{ color: style.color, fontWeight: style.fontWeight }}>{'Dynamic Style'}</div>
272
260
  }
273
261
 
274
262
  const { body } = await render(Basic);
@@ -281,14 +269,12 @@ describe('basic server > attribute rendering', () => {
281
269
  });
282
270
 
283
271
  it('render spread attributes with style and class', async () => {
284
- function Basic() {
285
- return <>
286
- const attributes = {
287
- style: { color: 'red', fontWeight: 'bold' },
288
- class: ['foo', false && 'bar'],
289
- };
290
- <div {...attributes}>{'Attributes with style and class'}</div>
291
- </>;
272
+ function Basic() @{
273
+ const attributes = {
274
+ style: { color: 'red', fontWeight: 'bold' },
275
+ class: ['foo', false && 'bar'],
276
+ };
277
+ <div {...attributes}>{'Attributes with style and class'}</div>
292
278
  }
293
279
 
294
280
  const { body } = await render(Basic);
@@ -304,11 +290,9 @@ describe('basic server > attribute rendering', () => {
304
290
  });
305
291
 
306
292
  it('renders host innerHTML as content instead of an attribute', async () => {
307
- function Basic() {
308
- return <>
309
- const html = '<span>Direct HTML</span>';
310
- <code innerHTML={html} />
311
- </>;
293
+ function Basic() @{
294
+ const html = '<span>Direct HTML</span>';
295
+ <code innerHTML={html} />
312
296
  }
313
297
 
314
298
  const { body } = await render(Basic);
@@ -321,11 +305,9 @@ describe('basic server > attribute rendering', () => {
321
305
  });
322
306
 
323
307
  it('renders spread innerHTML as content instead of an attribute', async () => {
324
- function Basic() {
325
- return <>
326
- const attributes = { innerHTML: '<span>Spread HTML</span>' };
327
- <code {...attributes} />
328
- </>;
308
+ function Basic() @{
309
+ const attributes = { innerHTML: '<span>Spread HTML</span>' };
310
+ <code {...attributes} />
329
311
  }
330
312
 
331
313
  const { body } = await render(Basic);
@@ -338,11 +320,9 @@ describe('basic server > attribute rendering', () => {
338
320
  });
339
321
 
340
322
  it('uses the last innerHTML value when spreads and direct props are mixed', async () => {
341
- function Basic() {
342
- return <>
343
- const attributes = { innerHTML: '<span>Spread HTML</span>' };
344
- <code {...attributes} innerHTML="<em>Direct HTML</em>" />
345
- </>;
323
+ function Basic() @{
324
+ const attributes = { innerHTML: '<span>Spread HTML</span>' };
325
+ <code {...attributes} innerHTML="<em>Direct HTML</em>" />
346
326
  }
347
327
 
348
328
  const { body } = await render(Basic);
@@ -354,13 +334,11 @@ describe('basic server > attribute rendering', () => {
354
334
  });
355
335
 
356
336
  it('render spread props without duplication', async () => {
357
- function Basic() {
358
- return <>
359
- const checkBoxProp = { name: 'car' };
360
- <div>
361
- <input {...checkBoxProp} type="checkbox" id="vehicle1" value="Bike" />
362
- </div>
363
- </>;
337
+ function Basic() @{
338
+ const checkBoxProp = { name: 'car' };
339
+ <div>
340
+ <input {...checkBoxProp} type="checkbox" id="vehicle1" value="Bike" />
341
+ </div>
364
342
  }
365
343
 
366
344
  const { body } = await render(Basic);
@@ -384,12 +362,10 @@ describe('basic server > attribute rendering', () => {
384
362
  });
385
363
 
386
364
  it('render dynamic boolean attributes as false', async () => {
387
- function Basic() {
388
- return <>
389
- let &[disabled] = track(false);
390
- let &[checked] = track(false);
391
- <input type="checkbox" {disabled} {checked} />
392
- </>;
365
+ function Basic() @{
366
+ let &[disabled] = track(false);
367
+ let &[checked] = track(false);
368
+ <input type="checkbox" {disabled} {checked} />
393
369
  }
394
370
 
395
371
  const { body } = await render(Basic);
@@ -403,11 +379,9 @@ describe('basic server > attribute rendering', () => {
403
379
  });
404
380
 
405
381
  it('render dynamic boolean attributes as false via spread', async () => {
406
- function Basic() {
407
- return <>
408
- const spread = { disabled: false, checked: false };
409
- <input type="checkbox" {...spread} />
410
- </>;
382
+ function Basic() @{
383
+ const spread = { disabled: false, checked: false };
384
+ <input type="checkbox" {...spread} />
411
385
  }
412
386
 
413
387
  const { body } = await render(Basic);
@@ -421,12 +395,10 @@ describe('basic server > attribute rendering', () => {
421
395
  });
422
396
 
423
397
  it('render dynamic boolean attributes as true', async () => {
424
- function Basic() {
425
- return <>
426
- let &[disabled] = track(true);
427
- let &[checked] = track(true);
428
- <input type="checkbox" {disabled} {checked} />
429
- </>;
398
+ function Basic() @{
399
+ let &[disabled] = track(true);
400
+ let &[checked] = track(true);
401
+ <input type="checkbox" {disabled} {checked} />
430
402
  }
431
403
 
432
404
  const { body } = await render(Basic);
@@ -440,11 +412,9 @@ describe('basic server > attribute rendering', () => {
440
412
  });
441
413
 
442
414
  it('render dynamic boolean attributes as true via spread', async () => {
443
- function Basic() {
444
- return <>
445
- const spread = { disabled: true, checked: true };
446
- <input type="checkbox" {...spread} />
447
- </>;
415
+ function Basic() @{
416
+ const spread = { disabled: true, checked: true };
417
+ <input type="checkbox" {...spread} />
448
418
  }
449
419
 
450
420
  const { body } = await render(Basic);
@@ -458,11 +428,9 @@ describe('basic server > attribute rendering', () => {
458
428
  });
459
429
 
460
430
  it('renders formnovalidate as a boolean attribute', async () => {
461
- function Basic() {
462
- return <>
463
- let &[formnovalidate] = track(true);
464
- <button {formnovalidate}>{'Submit'}</button>
465
- </>;
431
+ function Basic() @{
432
+ let &[formnovalidate] = track(true);
433
+ <button {formnovalidate}>{'Submit'}</button>
466
434
  }
467
435
 
468
436
  const { body } = await render(Basic);
@@ -476,11 +444,9 @@ describe('basic server > attribute rendering', () => {
476
444
  });
477
445
 
478
446
  it('renders hidden as a boolean attribute when true', async () => {
479
- function Basic() {
480
- return <>
481
- let &[hidden] = track(true);
482
- <div {hidden}>{'Hidden content'}</div>
483
- </>;
447
+ function Basic() @{
448
+ let &[hidden] = track(true);
449
+ <div {hidden}>{'Hidden content'}</div>
484
450
  }
485
451
 
486
452
  const { body } = await render(Basic);
@@ -494,11 +460,9 @@ describe('basic server > attribute rendering', () => {
494
460
  });
495
461
 
496
462
  it('does not render hidden when false', async () => {
497
- function Basic() {
498
- return <>
499
- let &[hidden] = track(false);
500
- <div {hidden}>{'Visible content'}</div>
501
- </>;
463
+ function Basic() @{
464
+ let &[hidden] = track(false);
465
+ <div {hidden}>{'Visible content'}</div>
502
466
  }
503
467
 
504
468
  const { body } = await render(Basic);
@@ -511,14 +475,14 @@ describe('basic server > attribute rendering', () => {
511
475
  });
512
476
 
513
477
  it('render multiple dynamic attributes', async () => {
514
- function Basic() {
515
- return <>
516
- let &[theme] = track('light');
517
- let &[size] = track('medium');
518
- <div class={`theme-${theme} size-${size}`} data-theme={theme} data-size={size}>
519
- {'Multiple Dynamic Attributes'}
520
- </div>
521
- </>;
478
+ function Basic() @{
479
+ let &[theme] = track('light');
480
+ let &[size] = track('medium');
481
+ <div
482
+ class={`theme-${theme} size-${size}`}
483
+ data-theme={theme}
484
+ data-size={size}
485
+ >{'Multiple Dynamic Attributes'}</div>
522
486
  }
523
487
 
524
488
  const { body } = await render(Basic);
@@ -532,17 +496,13 @@ describe('basic server > attribute rendering', () => {
532
496
  });
533
497
 
534
498
  it('render conditional attributes', async () => {
535
- function Basic() {
536
- return <>
537
- let &[showTitle] = track(false);
538
- let &[showAria] = track(false);
539
- <div
540
- title={showTitle ? 'This is a title' : undefined}
541
- aria-label={showAria ? 'Accessible label' : undefined}
542
- >
543
- {'Conditional Attributes'}
544
- </div>
545
- </>;
499
+ function Basic() @{
500
+ let &[showTitle] = track(false);
501
+ let &[showAria] = track(false);
502
+ <div
503
+ title={showTitle ? 'This is a title' : undefined}
504
+ aria-label={showAria ? 'Accessible label' : undefined}
505
+ >{'Conditional Attributes'}</div>
546
506
  }
547
507
 
548
508
  const { body } = await render(Basic);
@@ -555,14 +515,12 @@ describe('basic server > attribute rendering', () => {
555
515
  });
556
516
 
557
517
  it('render spread attributes', async () => {
558
- function Basic() {
559
- return <>
560
- let &[attrs] = track<TestAttributes>({
561
- class: 'initial',
562
- id: 'test-1',
563
- });
564
- <div {...attrs}>{'Spread Attributes'}</div>
565
- </>;
518
+ function Basic() @{
519
+ let &[attrs] = track<TestAttributes>({
520
+ class: 'initial',
521
+ id: 'test-1',
522
+ });
523
+ <div {...attrs}>{'Spread Attributes'}</div>
566
524
  }
567
525
 
568
526
  const { body } = await render(Basic);
@@ -576,16 +534,15 @@ describe('basic server > attribute rendering', () => {
576
534
  });
577
535
 
578
536
  it('renders with reactive attributes with nested reactive attributes', async () => {
579
- function Basic() {
580
- return <>
581
- let &[value] = track('parent-class');
537
+ function Basic() @{
538
+ let &[value] = track('parent-class');
539
+ let &[nested] = track('nested-class');
540
+ <>
582
541
  <p class={value}>{'Colored parent value'}</p>
583
542
  <div>
584
- let &[nested] = track('nested-class');
585
-
586
543
  <p class={nested}>{'Colored nested value'}</p>
587
544
  </div>
588
- </>;
545
+ </>
589
546
  }
590
547
 
591
548
  const { body } = await render(Basic);
@@ -598,12 +555,10 @@ describe('basic server > attribute rendering', () => {
598
555
  });
599
556
 
600
557
  it('handles boolean attributes with no prop value provides', async () => {
601
- function Basic() {
602
- return <>
603
- <div class="container">
604
- <input type="checkbox" checked />
605
- </div>
606
- </>;
558
+ function Basic() @{
559
+ <div class="container">
560
+ <input type="checkbox" checked />
561
+ </div>
607
562
  }
608
563
 
609
564
  const { body } = await render(Basic);
@@ -611,15 +566,15 @@ describe('basic server > attribute rendering', () => {
611
566
  });
612
567
 
613
568
  it('handles boolean props correctly', async () => {
614
- function Basic() {
615
- return <>
569
+ function Basic() @{
570
+ <>
616
571
  <div data-disabled />
617
572
  <Child isDisabled />
618
- </>;
573
+ </>
619
574
  }
620
575
 
621
- function Child({ isDisabled }: { isDisabled: boolean }) {
622
- return <><input disabled={isDisabled} /></>;
576
+ function Child({ isDisabled }: { isDisabled: boolean }) @{
577
+ <input disabled={isDisabled} />
623
578
  }
624
579
 
625
580
  const { body } = await render(Basic);