ripple 0.3.67 → 0.3.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/package.json +3 -3
  3. package/src/jsx-runtime.d.ts +2 -2
  4. package/src/runtime/element.js +1 -1
  5. package/src/runtime/index-client.js +11 -11
  6. package/src/runtime/index-server.js +7 -4
  7. package/src/runtime/internal/client/bindings.js +1 -1
  8. package/src/runtime/internal/client/blocks.js +13 -4
  9. package/src/runtime/internal/client/component.js +55 -0
  10. package/src/runtime/internal/client/composite.js +4 -2
  11. package/src/runtime/internal/client/expression.js +65 -7
  12. package/src/runtime/internal/client/hmr.js +54 -43
  13. package/src/runtime/internal/client/index.js +5 -1
  14. package/src/runtime/internal/client/portal.js +70 -69
  15. package/src/runtime/internal/client/render.js +3 -0
  16. package/src/runtime/internal/server/index.js +92 -8
  17. package/tests/client/__snapshots__/html.test.tsrx.snap +3 -3
  18. package/tests/client/array/array.copy-within.test.tsrx +33 -31
  19. package/tests/client/array/array.derived.test.tsrx +186 -169
  20. package/tests/client/array/array.iteration.test.tsrx +40 -37
  21. package/tests/client/array/array.mutations.test.tsrx +113 -101
  22. package/tests/client/array/array.static.test.tsrx +119 -101
  23. package/tests/client/array/array.to-methods.test.tsrx +24 -21
  24. package/tests/client/async-suspend.test.tsrx +247 -246
  25. package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +0 -1
  26. package/tests/client/basic/basic.attributes.test.tsrx +428 -423
  27. package/tests/client/basic/basic.collections.test.tsrx +109 -102
  28. package/tests/client/basic/basic.components.test.tsrx +323 -205
  29. package/tests/client/basic/basic.errors.test.tsrx +91 -91
  30. package/tests/client/basic/basic.events.test.tsrx +114 -115
  31. package/tests/client/basic/basic.get-set.test.tsrx +97 -87
  32. package/tests/client/basic/basic.hmr.test.tsrx +19 -16
  33. package/tests/client/basic/basic.reactivity.test.tsrx +199 -191
  34. package/tests/client/basic/basic.rendering.test.tsrx +272 -182
  35. package/tests/client/basic/basic.styling.test.tsrx +23 -22
  36. package/tests/client/basic/basic.utilities.test.tsrx +10 -8
  37. package/tests/client/boundaries.test.tsrx +26 -26
  38. package/tests/client/compiler/__snapshots__/compiler.assignments.test.rsrx.snap +5 -5
  39. package/tests/client/compiler/__snapshots__/compiler.assignments.test.tsrx.snap +5 -5
  40. package/tests/client/compiler/compiler.assignments.test.tsrx +77 -81
  41. package/tests/client/compiler/compiler.attributes.test.tsrx +15 -15
  42. package/tests/client/compiler/compiler.basic.test.tsrx +322 -314
  43. package/tests/client/compiler/compiler.regex.test.tsrx +44 -47
  44. package/tests/client/compiler/compiler.tracked-access.test.tsrx +38 -38
  45. package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
  46. package/tests/client/compiler/compiler.typescript.test.tsrx +2 -2
  47. package/tests/client/composite/composite.dynamic-components.test.tsrx +47 -48
  48. package/tests/client/composite/composite.generics.test.tsrx +168 -192
  49. package/tests/client/composite/composite.props.test.tsrx +97 -81
  50. package/tests/client/composite/composite.reactivity.test.tsrx +177 -147
  51. package/tests/client/composite/composite.render.test.tsrx +122 -105
  52. package/tests/client/computed-properties.test.tsrx +28 -28
  53. package/tests/client/context.test.tsrx +21 -21
  54. package/tests/client/css/global-additional-cases.test.tsrx +58 -58
  55. package/tests/client/css/global-advanced-selectors.test.tsrx +16 -16
  56. package/tests/client/css/global-at-rules.test.tsrx +10 -10
  57. package/tests/client/css/global-basic.test.tsrx +14 -14
  58. package/tests/client/css/global-classes-ids.test.tsrx +14 -14
  59. package/tests/client/css/global-combinators.test.tsrx +10 -10
  60. package/tests/client/css/global-complex-nesting.test.tsrx +14 -14
  61. package/tests/client/css/global-edge-cases.test.tsrx +18 -18
  62. package/tests/client/css/global-keyframes.test.tsrx +12 -12
  63. package/tests/client/css/global-nested.test.tsrx +10 -10
  64. package/tests/client/css/global-pseudo.test.tsrx +12 -12
  65. package/tests/client/css/global-scoping.test.tsrx +20 -20
  66. package/tests/client/css/style-identifier.test.tsrx +143 -291
  67. package/tests/client/date.test.tsrx +146 -133
  68. package/tests/client/dynamic-elements.test.tsrx +398 -365
  69. package/tests/client/events.test.tsrx +292 -290
  70. package/tests/client/for.test.tsrx +156 -153
  71. package/tests/client/head.test.tsrx +105 -96
  72. package/tests/client/html.test.tsrx +122 -26
  73. package/tests/client/input-value.test.tsrx +1361 -1314
  74. package/tests/client/lazy-array.test.tsrx +16 -13
  75. package/tests/client/lazy-destructuring.test.tsrx +257 -213
  76. package/tests/client/map.test.tsrx +65 -60
  77. package/tests/client/media-query.test.tsrx +22 -20
  78. package/tests/client/object.test.tsrx +87 -81
  79. package/tests/client/portal.test.tsrx +57 -51
  80. package/tests/client/ref.test.tsrx +233 -202
  81. package/tests/client/return.test.tsrx +71 -2560
  82. package/tests/client/set.test.tsrx +54 -45
  83. package/tests/client/svg.test.tsrx +216 -186
  84. package/tests/client/switch.test.tsrx +194 -193
  85. package/tests/client/track-async-hydration.test.tsrx +18 -14
  86. package/tests/client/tracked-index-access.test.tsrx +28 -18
  87. package/tests/client/try.test.tsrx +675 -548
  88. package/tests/client/tsx.test.tsrx +373 -311
  89. package/tests/client/typescript-generics.test.tsrx +145 -145
  90. package/tests/client/url/url.derived.test.tsrx +33 -28
  91. package/tests/client/url/url.parsing.test.tsrx +61 -51
  92. package/tests/client/url/url.partial-removal.test.tsrx +56 -48
  93. package/tests/client/url/url.reactivity.test.tsrx +142 -125
  94. package/tests/client/url/url.serialization.test.tsrx +13 -11
  95. package/tests/client/url-search-params/url-search-params.derived.test.tsrx +34 -29
  96. package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +25 -21
  97. package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +50 -45
  98. package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +111 -99
  99. package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +49 -43
  100. package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +14 -12
  101. package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +16 -14
  102. package/tests/hydration/basic.test.js +3 -3
  103. package/tests/hydration/compiled/client/basic.js +586 -651
  104. package/tests/hydration/compiled/client/composite.js +79 -104
  105. package/tests/hydration/compiled/client/events.js +140 -148
  106. package/tests/hydration/compiled/client/for.js +1005 -1018
  107. package/tests/hydration/compiled/client/head.js +124 -134
  108. package/tests/hydration/compiled/client/hmr.js +41 -48
  109. package/tests/hydration/compiled/client/html-in-template.js +38 -41
  110. package/tests/hydration/compiled/client/html.js +970 -1314
  111. package/tests/hydration/compiled/client/if-children.js +234 -249
  112. package/tests/hydration/compiled/client/if.js +182 -189
  113. package/tests/hydration/compiled/client/mixed-control-flow.js +347 -303
  114. package/tests/hydration/compiled/client/nested-control-flow.js +1084 -832
  115. package/tests/hydration/compiled/client/portal.js +65 -85
  116. package/tests/hydration/compiled/client/reactivity.js +84 -90
  117. package/tests/hydration/compiled/client/return.js +38 -1939
  118. package/tests/hydration/compiled/client/switch.js +218 -224
  119. package/tests/hydration/compiled/client/track-async-serialization.js +250 -259
  120. package/tests/hydration/compiled/client/try.js +123 -132
  121. package/tests/hydration/compiled/server/basic.js +773 -831
  122. package/tests/hydration/compiled/server/composite.js +166 -191
  123. package/tests/hydration/compiled/server/events.js +170 -184
  124. package/tests/hydration/compiled/server/for.js +851 -909
  125. package/tests/hydration/compiled/server/head.js +206 -216
  126. package/tests/hydration/compiled/server/hmr.js +64 -72
  127. package/tests/hydration/compiled/server/html-in-template.js +42 -76
  128. package/tests/hydration/compiled/server/html.js +1362 -1667
  129. package/tests/hydration/compiled/server/if-children.js +419 -445
  130. package/tests/hydration/compiled/server/if.js +194 -208
  131. package/tests/hydration/compiled/server/mixed-control-flow.js +249 -257
  132. package/tests/hydration/compiled/server/nested-control-flow.js +491 -515
  133. package/tests/hydration/compiled/server/portal.js +152 -160
  134. package/tests/hydration/compiled/server/reactivity.js +94 -106
  135. package/tests/hydration/compiled/server/return.js +28 -2172
  136. package/tests/hydration/compiled/server/switch.js +274 -286
  137. package/tests/hydration/compiled/server/track-async-serialization.js +340 -358
  138. package/tests/hydration/compiled/server/try.js +167 -185
  139. package/tests/hydration/components/basic.tsrx +320 -272
  140. package/tests/hydration/components/composite.tsrx +44 -32
  141. package/tests/hydration/components/events.tsrx +101 -91
  142. package/tests/hydration/components/for.tsrx +510 -452
  143. package/tests/hydration/components/head.tsrx +87 -80
  144. package/tests/hydration/components/hmr.tsrx +22 -17
  145. package/tests/hydration/components/html-in-template.tsrx +22 -17
  146. package/tests/hydration/components/html.tsrx +525 -443
  147. package/tests/hydration/components/if-children.tsrx +158 -148
  148. package/tests/hydration/components/if.tsrx +109 -95
  149. package/tests/hydration/components/mixed-control-flow.tsrx +100 -96
  150. package/tests/hydration/components/nested-control-flow.tsrx +215 -203
  151. package/tests/hydration/components/portal.tsrx +41 -34
  152. package/tests/hydration/components/reactivity.tsrx +37 -27
  153. package/tests/hydration/components/return.tsrx +12 -556
  154. package/tests/hydration/components/switch.tsrx +120 -114
  155. package/tests/hydration/components/track-async-serialization.tsrx +107 -91
  156. package/tests/hydration/components/try.tsrx +55 -40
  157. package/tests/hydration/html.test.js +4 -4
  158. package/tests/hydration/return.test.js +13 -532
  159. package/tests/server/await.test.tsrx +3 -3
  160. package/tests/server/basic.attributes.test.tsrx +264 -195
  161. package/tests/server/basic.components.test.tsrx +296 -169
  162. package/tests/server/basic.test.tsrx +300 -198
  163. package/tests/server/compiler.test.tsrx +62 -60
  164. package/tests/server/composite.props.test.tsrx +77 -63
  165. package/tests/server/composite.test.tsrx +168 -192
  166. package/tests/server/context.test.tsrx +18 -12
  167. package/tests/server/dynamic-elements.test.tsrx +197 -180
  168. package/tests/server/for.test.tsrx +85 -78
  169. package/tests/server/head.test.tsrx +50 -43
  170. package/tests/server/html-nesting-validation.test.tsrx +8 -8
  171. package/tests/server/if.test.tsrx +57 -51
  172. package/tests/server/lazy-destructuring.test.tsrx +366 -294
  173. package/tests/server/return.test.tsrx +76 -1355
  174. package/tests/server/streaming-ssr.test.tsrx +4 -75
  175. package/tests/server/style-identifier.test.tsrx +169 -148
  176. package/tests/server/switch.test.tsrx +91 -85
  177. package/tests/server/track-async-serialization.test.tsrx +105 -85
  178. package/tests/server/try.test.tsrx +374 -280
  179. package/tests/utils/compiler-compat-config.test.js +2 -2
  180. package/tests/utils/runtime-imports.test.js +10 -0
  181. package/types/index.d.ts +8 -0
  182. package/tests/client/__snapshots__/html.test.rsrx.snap +0 -40
@@ -2,349 +2,397 @@
2
2
  import { track } from 'ripple';
3
3
  import type { Children } from 'ripple';
4
4
 
5
- export component StaticText() {
6
- <div>{'Hello World'}</div>
5
+ export function StaticText() {
6
+ return <><div>{'Hello World'}</div></>;
7
7
  }
8
8
 
9
- export component MultipleElements() {
10
- <h1>{'Title'}</h1>
11
- <p>{'Paragraph text'}</p>
12
- <span>{'Span text'}</span>
9
+ export function MultipleElements() {
10
+ return <>
11
+ <h1>{'Title'}</h1>
12
+ <p>{'Paragraph text'}</p>
13
+ <span>{'Span text'}</span>
14
+ </>;
13
15
  }
14
16
 
15
- export component NestedElements() {
16
- <div class="outer">
17
- <div class="inner">
18
- <span>{'Nested content'}</span>
17
+ export function NestedElements() {
18
+ return <>
19
+ <div class="outer">
20
+ <div class="inner">
21
+ <span>{'Nested content'}</span>
22
+ </div>
19
23
  </div>
20
- </div>
24
+ </>;
25
+ }
26
+
27
+ export function WithAttributes() {
28
+ return <>
29
+ <input type="text" placeholder="Enter text" disabled />
30
+ <a href="/link" target="_blank">{'Link'}</a>
31
+ </>;
21
32
  }
22
33
 
23
- export component WithAttributes() {
24
- <input type="text" placeholder="Enter text" disabled />
25
- <a href="/link" target="_blank">{'Link'}</a>
34
+ export function ChildComponent() {
35
+ return <><span class="child">{'Child content'}</span></>;
26
36
  }
27
37
 
28
- export component ChildComponent() {
29
- <span class="child">{'Child content'}</span>
38
+ export function ParentWithChild() {
39
+ return <>
40
+ <div class="parent">
41
+ <ChildComponent />
42
+ </div>
43
+ </>;
30
44
  }
31
45
 
32
- export component ParentWithChild() {
33
- <div class="parent">
34
- <ChildComponent />
35
- </div>
46
+ export function FirstSibling() {
47
+ return <><div class="first">{'First'}</div></>;
36
48
  }
37
49
 
38
- export component FirstSibling() {
39
- <div class="first">{'First'}</div>
50
+ export function SecondSibling() {
51
+ return <><div class="second">{'Second'}</div></>;
40
52
  }
41
53
 
42
- export component SecondSibling() {
43
- <div class="second">{'Second'}</div>
54
+ export function SiblingComponents() {
55
+ return <>
56
+ <FirstSibling />
57
+ <SecondSibling />
58
+ </>;
44
59
  }
45
60
 
46
- export component SiblingComponents() {
47
- <FirstSibling />
48
- <SecondSibling />
61
+ export function Greeting(props: { name: string }) {
62
+ return <>
63
+ <div>
64
+ {'Hello '}
65
+ {props.name}
66
+ </div>
67
+ </>;
49
68
  }
50
69
 
51
- export component Greeting(props: { name: string }) {
52
- <div>
53
- {'Hello '}
54
- {props.name}
55
- </div>
70
+ export function WithGreeting() {
71
+ return <><Greeting name="World" /></>;
56
72
  }
57
73
 
58
- export component WithGreeting() {
59
- <Greeting name="World" />
74
+ export function ExpressionContent() {
75
+ return <>
76
+ const value = 42;
77
+ const label = 'computed';
78
+ <div>{value}</div>
79
+ <span>{label.toUpperCase()}</span>
80
+ </>;
60
81
  }
61
82
 
62
- export component ExpressionContent() {
63
- const value = 42;
64
- const label = 'computed';
65
- <div>{value}</div>
66
- <span>{label.toUpperCase()}</span>
83
+ function NestedHelperItem({ item }: { item: number }) {
84
+ return <><div class="helper-item">{item}</div></>;
67
85
  }
68
86
 
69
- function makeNestedTsxTsrxFragment(label: string) {
70
- return <tsrx>
87
+ function NestedTsxTsrxFragment({ label }: { label: string }) {
88
+ return <>
71
89
  <span class="label">{label}</span>
72
- const test = <tsx>
73
- {[1, 2, 3, 4].map(
74
- (item) => <tsx>
75
- {<tsrx>
76
- <div class="helper-item">{item}</div>
77
- </tsrx>}
78
- </tsx>,
79
- )}
90
+ for (const item of [1, 2, 3, 4]) {
91
+ <NestedHelperItem {item} />
92
+ }
93
+ </>;
94
+ }
95
+
96
+ export function NestedTsxTsrxExpressionValues() {
97
+ return <>
98
+ for (const item of [1, 2, 3]) {
99
+ <div class="app-item">{item}</div>
100
+ }
101
+ <NestedTsxTsrxFragment label="from helper" />
102
+ </>;
103
+ }
104
+
105
+ export function MixedTsrxCollectionText() {
106
+ return <>
107
+ const content = <tsx>
108
+ {[
109
+ 'alpha ',
110
+ <strong class="middle">
111
+ {'beta'}
112
+ </strong>,
113
+ ' gamma ',
114
+ [
115
+ 'delta ',
116
+ <em class="tail">
117
+ {'epsilon'}
118
+ </em>,
119
+ ' zeta',
120
+ ],
121
+ ]}
122
+ </tsx>;
123
+ <div class="mixed-collection">{content}</div>
124
+ </>;
125
+ }
126
+
127
+ export function MixedTsrxCollectionSplitServerText() {
128
+ return <>
129
+ const content = <tsx>
130
+ {[
131
+ 'alpha ',
132
+ <strong class="middle">
133
+ {'beta'}
134
+ </strong>,
135
+ ' gamma ',
136
+ [
137
+ 'delta ',
138
+ <em class="tail">
139
+ {'epsilon'}
140
+ </em>,
141
+ ' zeta',
142
+ ],
143
+ ]}
144
+ </tsx>;
145
+ <div class="mixed-collection-split">{content}</div>
146
+ </>;
147
+ }
148
+
149
+ export function MixedTsrxCollectionSplitClientText() {
150
+ return <>
151
+ const content = <tsx>
152
+ {[
153
+ 'alpha ',
154
+ <strong class="middle">
155
+ {'beta'}
156
+ </strong>,
157
+ ' gamma ',
158
+ [
159
+ 'changed ',
160
+ <em class="tail">
161
+ {'epsilon'}
162
+ </em>,
163
+ ' zeta',
164
+ ],
165
+ ]}
80
166
  </tsx>;
81
- {test}
82
- </tsrx>;
83
- }
84
-
85
- export component NestedTsxTsrxExpressionValues() {
86
- {<tsx>
87
- {[1, 2, 3].map((item) => <div class="app-item">{item}</div>)}
88
- </tsx>}
89
- {makeNestedTsxTsrxFragment('from helper')}
90
- }
91
-
92
- export component MixedTsrxCollectionText() {
93
- const content = <tsx>
94
- {[
95
- 'alpha ',
96
- <strong class="middle">
97
- {'beta'}
98
- </strong>,
99
- ' gamma ',
100
- [
101
- 'delta ',
102
- <em class="tail">
103
- {'epsilon'}
104
- </em>,
105
- ' zeta',
106
- ],
107
- ]}
108
- </tsx>;
109
-
110
- <div class="mixed-collection">{content}</div>
111
- }
112
-
113
- export component MixedTsrxCollectionSplitServerText() {
114
- const content = <tsx>
115
- {[
116
- 'alpha ',
117
- <strong class="middle">
118
- {'beta'}
119
- </strong>,
120
- ' gamma ',
121
- [
122
- 'delta ',
123
- <em class="tail">
124
- {'epsilon'}
125
- </em>,
126
- ' zeta',
127
- ],
128
- ]}
129
- </tsx>;
130
-
131
- <div class="mixed-collection-split">{content}</div>
132
- }
133
-
134
- export component MixedTsrxCollectionSplitClientText() {
135
- const content = <tsx>
136
- {[
137
- 'alpha ',
138
- <strong class="middle">
139
- {'beta'}
140
- </strong>,
141
- ' gamma ',
142
- [
143
- 'changed ',
144
- <em class="tail">
145
- {'epsilon'}
146
- </em>,
147
- ' zeta',
148
- ],
149
- ]}
150
- </tsx>;
151
-
152
- <div class="mixed-collection-split">{content}</div>
153
- }
154
-
155
- export component MixedTsrxCollectionPrimitiveServerText() {
156
- const content = <tsx>
157
- {[
158
- 'count: ',
159
- 1,
160
- ' / ',
161
- true,
162
- <span class="primitive-tail">
163
- {' ok'}
164
- </span>,
165
- ]}
166
- </tsx>;
167
-
168
- <div class="mixed-collection-primitive">{content}</div>
169
- }
170
-
171
- export component MixedTsrxCollectionPrimitiveClientText() {
172
- const content = <tsx>
173
- {[
174
- 'count: ',
175
- 2,
176
- ' / ',
177
- false,
178
- <span class="primitive-tail">
179
- {' ok'}
180
- </span>,
181
- ]}
182
- </tsx>;
183
-
184
- <div class="mixed-collection-primitive">{content}</div>
167
+ <div class="mixed-collection-split">{content}</div>
168
+ </>;
169
+ }
170
+
171
+ export function MixedTsrxCollectionPrimitiveServerText() {
172
+ return <>
173
+ const content = <tsx>
174
+ {[
175
+ 'count: ',
176
+ 1,
177
+ ' / ',
178
+ true,
179
+ <span class="primitive-tail">
180
+ {' ok'}
181
+ </span>,
182
+ ]}
183
+ </tsx>;
184
+ <div class="mixed-collection-primitive">{content}</div>
185
+ </>;
186
+ }
187
+
188
+ export function MixedTsrxCollectionPrimitiveClientText() {
189
+ return <>
190
+ const content = <tsx>
191
+ {[
192
+ 'count: ',
193
+ 2,
194
+ ' / ',
195
+ false,
196
+ <span class="primitive-tail">
197
+ {' ok'}
198
+ </span>,
199
+ ]}
200
+ </tsx>;
201
+ <div class="mixed-collection-primitive">{content}</div>
202
+ </>;
185
203
  }
186
204
 
187
205
  function createPrimitiveItems() {
188
206
  return ['start:', ['one', 2], true, null, false, ':end'];
189
207
  }
190
208
 
191
- export component DynamicArrayFromCall() {
192
- const items = createPrimitiveItems();
193
-
194
- <div class="dynamic-array-call">{items}</div>
209
+ export function DynamicArrayFromCall() {
210
+ return <>
211
+ const items = createPrimitiveItems();
212
+ <div class="dynamic-array-call">{items}</div>
213
+ </>;
195
214
  }
196
215
 
197
- export component DynamicArrayFromTrack() {
198
- let &[items] = track(['start:', ['one', 2], true, null, false, ':end']);
199
-
200
- <div class="dynamic-array-track">{items}</div>
216
+ export function DynamicArrayFromTrack() {
217
+ return <>
218
+ let &[items] = track(['start:', ['one', 2], true, null, false, ':end']);
219
+ <div class="dynamic-array-track">{items}</div>
220
+ </>;
201
221
  }
202
222
 
203
- export component DynamicArrayFromConditional() {
204
- const condition = true;
205
- const items = condition ? ['start:', ['one', 2], true, null, false, ':end'] : ['fallback'];
206
-
207
- <div class="dynamic-array-conditional">{items}</div>
223
+ export function DynamicArrayFromConditional() {
224
+ return <>
225
+ const condition = true;
226
+ const items = condition ? ['start:', ['one', 2], true, null, false, ':end'] : ['fallback'];
227
+ <div class="dynamic-array-conditional">{items}</div>
228
+ </>;
208
229
  }
209
230
 
210
- export component DynamicArrayFromLogical() {
211
- const condition = true;
212
- const items = condition && ['start:', ['one', 2], true, null, false, ':end'];
213
-
214
- <div class="dynamic-array-logical">{items}</div>
215
- }
216
-
217
- export component NestedTsrxInsideTopLevelTsxExpression() {
218
- const content = <tsx>
219
- <section class="outer">
220
- {<tsrx>
221
- <div class="inner">{'from tsrx'}</div>
222
- </tsrx>}
223
- </section>
224
- </tsx>;
225
-
226
- {content}
231
+ export function DynamicArrayFromLogical() {
232
+ return <>
233
+ const condition = true;
234
+ const items = condition && ['start:', ['one', 2], true, null, false, ':end'];
235
+ <div class="dynamic-array-logical">{items}</div>
236
+ </>;
227
237
  }
228
238
 
229
- export component NestedTsrxElementsInsideTopLevelTsxValue() {
230
- const content = <tsx>
231
- <div class="wrapper">
232
- {<tsrx>
233
- <section class="native">
234
- <span class="nested-tsrx">{'inside nested tsrx'}</span>
235
- </section>
236
- </tsrx>}
237
- </div>
238
- </tsx>;
239
-
240
- {content}
239
+ export function NestedTsrxInsideTopLevelTsxExpression() {
240
+ return <>
241
+ const content = <tsx>
242
+ <section class="outer">
243
+ {<>
244
+ <div class="inner">
245
+ {'from tsrx'}
246
+ </div>
247
+ </>}
248
+ </section>
249
+ </tsx>;
250
+ {content}
251
+ </>;
252
+ }
253
+
254
+ export function NestedTsrxElementsInsideTopLevelTsxValue() {
255
+ return <>
256
+ const content = <tsx>
257
+ <div class="wrapper">
258
+ {<>
259
+ <section class="native">
260
+ <span class="nested-tsrx">
261
+ {'inside nested tsrx'}
262
+ </span>
263
+ </section>
264
+ </>}
265
+ </div>
266
+ </tsx>;
267
+ {content}
268
+ </>;
241
269
  }
242
270
 
243
- export component TsxDeclaredInsideNestedTsrxFromTopLevelTsx() {
244
- const content = <tsx>
245
- {<tsrx>
246
- const nested = <tsx>
247
- <span class="nested-tsx">
248
- {'inside nested tsx'}
249
- </span>
250
- </tsx>;
271
+ export function TsxDeclaredBeforeTopLevelTsx() {
272
+ return <>
273
+ const nested = <tsx>
274
+ <span class="nested-tsx">
275
+ {'inside nested tsx'}
276
+ </span>
277
+ </tsx>;
278
+ const content = <tsx>
251
279
  <div class="native">{nested}</div>
252
- </tsrx>}
253
- </tsx>;
254
-
255
- {content}
280
+ </tsx>;
281
+ {content}
282
+ </>;
256
283
  }
257
284
 
258
- component TextProp(&{ children }: { children: string }) {
259
- <div class="text-prop">{children}</div>
285
+ function TextProp(&{ children }: { children: string }) {
286
+ return <><div class="text-prop">{children}</div></>;
260
287
  }
261
288
 
262
- export component TextPropWithToggle() {
263
- let &[show] = track(false);
264
-
265
- <TextProp children={show ? 'hello' : ''} />
266
- <button class="show-text" onClick={() => (show = true)}>{'Show'}</button>
289
+ export function TextPropWithToggle() {
290
+ return <>
291
+ let &[show] = track(false);
292
+ <TextProp children={show ? 'hello' : ''} />
293
+ <button class="show-text" onClick={() => (show = true)}>{'Show'}</button>
294
+ </>;
267
295
  }
268
296
 
269
297
  // Test for static content in child component followed by sibling content
270
- component StaticHeader() {
271
- <h1 class="sr-only">{'heading'}</h1>
272
- <p class="subtitle">{'first paragraph'}</p>
273
- <p class="subtitle">{'second paragraph'}</p>
298
+ function StaticHeader() {
299
+ return <>
300
+ <h1 class="sr-only">{'heading'}</h1>
301
+ <p class="subtitle">{'first paragraph'}</p>
302
+ <p class="subtitle">{'second paragraph'}</p>
303
+ </>;
274
304
  }
275
305
 
276
- export component StaticChildWithSiblings() {
277
- const foo = 'bar';
278
- <StaticHeader />
279
- <span class="sibling1">{foo}</span>
280
- <span class="sibling2">{foo}</span>
306
+ export function StaticChildWithSiblings() {
307
+ return <>
308
+ const foo = 'bar';
309
+ <StaticHeader />
310
+ <span class="sibling1">{foo}</span>
311
+ <span class="sibling2">{foo}</span>
312
+ </>;
281
313
  }
282
314
 
283
315
  // Website-like components for testing complex hydration scenarios
284
316
 
285
- component Header() {
286
- <h1 class="sr-only">{'Ripple'}</h1>
287
- <img src="/images/logo.png" alt="Logo" class="logo" />
288
- <p class="subtitle">{'the elegant TypeScript UI framework'}</p>
289
- }
290
-
291
- component Actions({ playgroundVisible = false }: { playgroundVisible: boolean }) {
292
- <div class="social-links">
293
- <a href="https://github.com" class="github-link">{'GitHub'}</a>
294
- <a href="https://discord.com" class="discord-link">{'Discord'}</a>
295
- if (playgroundVisible) {
296
- <a href="/playground" class="playground-link">{'Playground'}</a>
297
- }
298
- </div>
317
+ function Header() {
318
+ return <>
319
+ <h1 class="sr-only">{'Ripple'}</h1>
320
+ <img src="/images/logo.png" alt="Logo" class="logo" />
321
+ <p class="subtitle">{'the elegant TypeScript UI framework'}</p>
322
+ </>;
323
+ }
324
+
325
+ function Actions({ playgroundVisible = false }: { playgroundVisible: boolean }) {
326
+ return <>
327
+ <div class="social-links">
328
+ <a href="https://github.com" class="github-link">{'GitHub'}</a>
329
+ <a href="https://discord.com" class="discord-link">{'Discord'}</a>
330
+ if (playgroundVisible) {
331
+ <a href="/playground" class="playground-link">{'Playground'}</a>
332
+ }
333
+ </div>
334
+ </>;
299
335
  }
300
336
 
301
- component Layout({ children }: { children: Children }) {
302
- <main>
303
- <div class="container">{children}</div>
304
- </main>
337
+ function Layout({ children }: { children: Children }) {
338
+ return <>
339
+ <main>
340
+ <div class="container">{children}</div>
341
+ </main>
342
+ </>;
305
343
  }
306
344
 
307
- component Content() {
308
- <div class="content">
309
- <p>{'Some content here'}</p>
310
- </div>
345
+ function Content() {
346
+ return <>
347
+ <div class="content">
348
+ <p>{'Some content here'}</p>
349
+ </div>
350
+ </>;
311
351
  }
312
352
 
313
- export component WebsiteIndex() {
314
- <Layout>
315
- <Header />
316
- <Actions playgroundVisible={true} />
317
- <Content />
318
- <Actions playgroundVisible={false} />
319
- </Layout>
353
+ export function WebsiteIndex() {
354
+ return <>
355
+ <Layout>
356
+ <Header />
357
+ <Actions playgroundVisible={true} />
358
+ <Content />
359
+ <Actions playgroundVisible={false} />
360
+ </Layout>
361
+ </>;
320
362
  }
321
363
 
322
364
  // Test case for component as last element with no following siblings.
323
365
  // This exercises hydrate_advance() in append() - at the end of content,
324
366
  // there's no next sibling and that should be handled gracefully.
325
- component LastChild() {
326
- <footer class="last-child">{'I am the last child'}</footer>
367
+ function LastChild() {
368
+ return <><footer class="last-child">{'I am the last child'}</footer></>;
327
369
  }
328
370
 
329
- export component ComponentAsLastSibling() {
330
- <div class="wrapper">
331
- <h1>{'Header'}</h1>
332
- <p>{'Some content'}</p>
333
- <LastChild />
334
- </div>
371
+ export function ComponentAsLastSibling() {
372
+ return <>
373
+ <div class="wrapper">
374
+ <h1>{'Header'}</h1>
375
+ <p>{'Some content'}</p>
376
+ <LastChild />
377
+ </div>
378
+ </>;
335
379
  }
336
380
 
337
381
  // Nested version - component is last child inside another component
338
- component InnerContent() {
339
- <div class="inner">
340
- <span>{'Inner text'}</span>
341
- <LastChild />
342
- </div>
343
- }
344
-
345
- export component NestedComponentAsLastSibling() {
346
- <section class="outer">
347
- <h2>{'Section title'}</h2>
348
- <InnerContent />
349
- </section>
382
+ function InnerContent() {
383
+ return <>
384
+ <div class="inner">
385
+ <span>{'Inner text'}</span>
386
+ <LastChild />
387
+ </div>
388
+ </>;
389
+ }
390
+
391
+ export function NestedComponentAsLastSibling() {
392
+ return <>
393
+ <section class="outer">
394
+ <h2>{'Section title'}</h2>
395
+ <InnerContent />
396
+ </section>
397
+ </>;
350
398
  }