ripple 0.3.72 → 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 +66 -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 +55 -61
  23. package/tests/client/basic/basic.components.test.tsrx +196 -218
  24. package/tests/client/basic/basic.errors.test.tsrx +70 -76
  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 +357 -288
  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 +286 -292
  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 +390 -319
  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 -258
  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 +117 -162
  143. package/tests/server/basic.components.test.tsrx +163 -193
  144. package/tests/server/basic.test.tsrx +298 -198
  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
@@ -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);