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
@@ -1,565 +1,21 @@
1
- import { track } from 'ripple';
2
-
3
- // Return statement components for hydration testing
4
-
5
- // Basic return - skips content after direct return
6
- export component DirectReturn() {
7
- <div class="before">{'before'}</div>
8
- return;
9
- <div class="after">{'after'}</div>
10
- }
11
-
12
- // Conditional return - condition is true, skips rest
13
- export component ConditionalReturnTrue() {
14
- let condition = true;
15
-
16
- if (condition) {
17
- <div class="guard">{'guard hit'}</div>
18
- return;
19
- }
20
- <div class="rest">{'rest'}</div>
21
- }
22
-
23
- // Conditional return - condition is false, shows rest
24
- export component ConditionalReturnFalse() {
25
- let condition = false;
26
-
27
- if (condition) {
28
- <div class="guard">{'guard hit'}</div>
29
- return;
30
- }
31
- <div class="rest">{'rest'}</div>
32
- }
33
-
34
- // Content before and after return guard
35
- export component ContentBeforeAfterReturn() {
36
- let shouldReturn = true;
37
-
38
- <div class="before">{'before'}</div>
39
- if (shouldReturn) {
40
- <div class="guard">{'guard'}</div>
41
- return;
42
- }
43
- <div class="after">{'after'}</div>
44
- }
45
-
46
- // Multiple elements after guard when condition is false
47
- export component MultipleElementsAfterGuard() {
48
- let shouldReturn = false;
49
-
50
- if (shouldReturn) {
51
- <div class="guard">{'guard'}</div>
52
- return;
53
- }
54
- <div class="first">{'first'}</div>
55
- <div class="second">{'second'}</div>
56
- }
57
-
58
- // Multiple sequential returns - first hits
59
- export component MultipleReturnsFirstHits() {
60
- let a = true;
61
- let b = true;
62
-
63
- if (a) {
64
- <div class="first">{'first guard'}</div>
65
- return;
66
- }
67
- if (b) {
68
- <div class="second">{'second guard'}</div>
69
- return;
70
- }
71
- <div class="rest">{'rest'}</div>
72
- }
73
-
74
- // Multiple sequential returns - second hits
75
- export component MultipleReturnsSecondHits() {
76
- let a = false;
77
- let b = true;
78
-
79
- if (a) {
80
- <div class="first">{'first guard'}</div>
81
- return;
82
- }
83
- if (b) {
84
- <div class="second">{'second guard'}</div>
85
- return;
86
- }
87
- <div class="rest">{'rest'}</div>
88
- }
89
-
90
- // Multiple sequential returns - none hit
91
- export component MultipleReturnsNoneHit() {
92
- let a = false;
93
- let b = false;
94
-
95
- if (a) {
96
- <div class="first">{'first guard'}</div>
97
- return;
98
- }
99
- if (b) {
100
- <div class="second">{'second guard'}</div>
101
- return;
102
- }
103
- <div class="rest">{'rest'}</div>
104
- }
105
-
106
- // Nested returns - both conditions true
107
- export component NestedReturnsAllTrue() {
108
- let a = true;
109
- let b = true;
110
-
111
- if (a) {
112
- <div class="a">{'a is true'}</div>
113
- if (b) {
114
- <div class="b">{'b is true'}</div>
115
- return;
116
- }
117
- }
118
- <div class="rest">{'rest'}</div>
119
- }
120
-
121
- // Nested returns - inner condition false
122
- export component NestedReturnsInnerFalse() {
123
- let a = true;
124
- let b = false;
125
-
126
- if (a) {
127
- <div class="a">{'a is true'}</div>
128
- if (b) {
129
- <div class="b">{'b is true'}</div>
130
- return;
131
- }
132
- }
133
- <div class="rest">{'rest'}</div>
134
- }
135
-
136
- // Nested returns - outer condition false
137
- export component NestedReturnsOuterFalse() {
138
- let a = false;
139
- let b = true;
140
-
141
- if (a) {
142
- <div class="a">{'a is true'}</div>
143
- if (b) {
144
- <div class="b">{'b is true'}</div>
145
- return;
146
- }
147
- }
148
- <div class="rest">{'rest'}</div>
149
- }
150
-
151
- // Deeply nested returns (3 levels) - all true
152
- export component DeeplyNestedReturnsAllTrue() {
153
- let a = true;
154
- let b = true;
155
- let c = true;
156
-
157
- if (a) {
158
- <div class="a">{'a'}</div>
159
- if (b) {
160
- <div class="b">{'b'}</div>
161
- if (c) {
162
- <div class="c">{'c'}</div>
163
- return;
164
- }
165
- }
166
- }
167
- <div class="rest">{'rest'}</div>
168
- }
169
-
170
- // Deeply nested returns (3 levels) - innermost false
171
- export component DeeplyNestedReturnsInnermostFalse() {
172
- let a = true;
173
- let b = true;
174
- let c = false;
175
-
176
- if (a) {
177
- <div class="a">{'a'}</div>
178
- if (b) {
179
- <div class="b">{'b'}</div>
180
- if (c) {
181
- <div class="c">{'c'}</div>
182
- return;
183
- }
184
- }
185
- }
186
- <div class="rest">{'rest'}</div>
187
- }
188
-
189
- // Return with else-if chain - first condition
190
- export component ElseIfChainFirst() {
191
- let value = 1;
192
-
193
- if (value === 1) {
194
- <div class="one">{'one'}</div>
195
- return;
196
- } else if (value === 2) {
197
- <div class="two">{'two'}</div>
198
- return;
199
- } else {
200
- <div class="other">{'other'}</div>
201
- return;
202
- }
203
- <div class="never">{'never reached'}</div>
204
- }
205
-
206
- // Return with else-if chain - second condition
207
- export component ElseIfChainSecond() {
208
- let value = 2;
209
-
210
- if (value === 1) {
211
- <div class="one">{'one'}</div>
212
- return;
213
- } else if (value === 2) {
214
- <div class="two">{'two'}</div>
215
- return;
216
- } else {
217
- <div class="other">{'other'}</div>
218
- return;
219
- }
220
- <div class="never">{'never reached'}</div>
221
- }
222
-
223
- // Return with else-if chain - else condition
224
- export component ElseIfChainElse() {
225
- let value = 3;
226
-
227
- if (value === 1) {
228
- <div class="one">{'one'}</div>
229
- return;
230
- } else if (value === 2) {
231
- <div class="two">{'two'}</div>
232
- return;
233
- } else {
234
- <div class="other">{'other'}</div>
235
- return;
236
- }
237
- <div class="never">{'never reached'}</div>
238
- }
239
-
240
- // Return with else branch that does not return
241
- export component ReturnWithElseNoReturn() {
242
- let condition = false;
243
-
244
- if (condition) {
245
- <div class="true">{'condition true'}</div>
246
- return;
247
- } else {
248
- <div class="false">{'condition false'}</div>
1
+ export function GuardReturnRenders() {
2
+ const ready = true;
3
+ if (!ready) {
4
+ return null;
249
5
  }
250
- <div class="after">{'after if-else'}</div>
251
- }
252
-
253
- // Return with else branch that also returns
254
- export component ReturnWithElseBothReturn() {
255
- let condition = false;
256
6
 
257
- if (condition) {
258
- <div class="true">{'condition true'}</div>
259
- return;
260
- } else {
261
- <div class="false">{'condition false'}</div>
262
- return;
263
- }
264
- <div class="never">{'never reached'}</div>
7
+ return <><div class="ready">{'ready'}</div></>;
265
8
  }
266
9
 
267
- // Reactive return - starts true, can toggle to false
268
- export component ReactiveReturnTrueToFalse() {
269
- let &[condition] = track(true);
270
-
271
- <button
272
- class="toggle"
273
- onClick={() => {
274
- condition = !condition;
275
- }}
276
- >
277
- {'Toggle'}
278
- </button>
279
- if (condition) {
280
- <div class="guard">{'guard hit'}</div>
281
- return;
10
+ export function GuardReturnNull() {
11
+ const ready = false;
12
+ if (!ready) {
13
+ return null;
282
14
  }
283
- <div class="rest">{'rest'}</div>
284
- }
285
-
286
- // Reactive return - starts false, can toggle to true
287
- export component ReactiveReturnFalseToTrue() {
288
- let &[condition] = track(false);
289
-
290
- <button
291
- class="toggle"
292
- onClick={() => {
293
- condition = !condition;
294
- }}
295
- >
296
- {'Toggle'}
297
- </button>
298
- if (condition) {
299
- <div class="guard">{'guard hit'}</div>
300
- return;
301
- }
302
- <div class="rest">{'rest'}</div>
303
- }
304
-
305
- // Reactive nested return - only inner condition (b) is tracked
306
- export component ReactiveNestedReturn() {
307
- let a = true;
308
- let &[b] = track(true);
309
-
310
- <button
311
- class="toggle"
312
- onClick={() => {
313
- b = !b;
314
- }}
315
- >
316
- {'Toggle'}
317
- </button>
318
- if (a) {
319
- <div class="a">{'a'}</div>
320
- if (b) {
321
- <div class="b">{'b'}</div>
322
- return;
323
- }
324
- }
325
- <div class="rest">{'rest'}</div>
326
- }
327
-
328
- // Return inside nested element scope
329
- export component ReturnInNestedElement() {
330
- let show = true;
331
15
 
332
- <div class="outer">
333
- <span class="label">{'outer'}</span>
334
- if (show) {
335
- <p class="inner">{'inner'}</p>
336
- return;
337
- }
338
- </div>
339
- <div class="after">{'after'}</div>
16
+ return <><div class="ready">{'ready'}</div></>;
340
17
  }
341
18
 
342
- // Return with multiple elements before and after
343
- export component ReturnWithMultipleElements() {
344
- let shouldReturn = true;
345
-
346
- <h1 class="title">{'title'}</h1>
347
- <p class="desc">{'description'}</p>
348
- if (shouldReturn) {
349
- <div class="guard">{'guard'}</div>
350
- <span class="guard-span">{'guard span'}</span>
351
- return;
352
- }
353
- <footer class="footer">{'footer'}</footer>
354
- <nav class="nav">{'nav'}</nav>
355
- }
356
-
357
- // Return at the beginning of component
358
- export component ReturnAtBeginning() {
359
- if (true) {
360
- <div class="early">{'early exit'}</div>
361
- return;
362
- }
363
- <div class="never1">{'never reached 1'}</div>
364
- <div class="never2">{'never reached 2'}</div>
365
- }
366
-
367
- // Return at the end of component (after all content)
368
- export component ReturnAtEnd() {
369
- <div class="first">{'first'}</div>
370
- <div class="second">{'second'}</div>
371
- if (true) {
372
- <div class="third">{'third'}</div>
373
- return;
374
- }
375
- }
376
-
377
- // Multiple sibling returns at same level
378
- export component MultipleSiblingReturns() {
379
- let mode = 'b';
380
-
381
- if (mode === 'a') {
382
- <div class="mode-a">{'mode A'}</div>
383
- return;
384
- }
385
-
386
- if (mode === 'b') {
387
- <div class="mode-b">{'mode B'}</div>
388
- return;
389
- }
390
-
391
- if (mode === 'c') {
392
- <div class="mode-c">{'mode C'}</div>
393
- return;
394
- }
395
-
396
- <div class="default">{'default mode'}</div>
397
- }
398
-
399
- // Reactive sibling returns - cycles first -> second -> fallback
400
- export component ReactiveSiblingReturns() {
401
- let &[mode] = track('first');
402
-
403
- <button
404
- class="toggle"
405
- onClick={() => {
406
- if (mode === 'first') {
407
- mode = 'second';
408
- } else if (mode === 'second') {
409
- mode = 'none';
410
- } else {
411
- mode = 'first';
412
- }
413
- }}
414
- >
415
- {'Toggle'}
416
- </button>
417
-
418
- if (mode === 'first') {
419
- <div class="first">{'first guard'}</div>
420
- return;
421
- }
422
-
423
- if (mode === 'second') {
424
- <div class="second">{'second guard'}</div>
425
- return;
426
- }
427
-
428
- <div class="rest">{'rest'}</div>
429
- }
430
-
431
- // Reactive nested returns with tracked outer and inner conditions
432
- export component ReactiveOuterInnerReturns() {
433
- let &[a] = track(true);
434
- let &[b] = track(true);
435
-
436
- <button
437
- class="toggle-a"
438
- onClick={() => {
439
- a = !a;
440
- }}
441
- >
442
- {'Toggle A'}
443
- </button>
444
-
445
- <button
446
- class="toggle-b"
447
- onClick={() => {
448
- b = !b;
449
- }}
450
- >
451
- {'Toggle B'}
452
- </button>
453
-
454
- if (a) {
455
- <div class="a">{'a'}</div>
456
- if (b) {
457
- <div class="b">{'b'}</div>
458
- return;
459
- }
460
- }
461
-
462
- <div class="rest">{a ? 'a-on rest' : 'a-off rest'}</div>
463
- }
464
-
465
- // Reactive else-if return chain that transitions between return and non-return states
466
- export component ReactiveElseIfReturns() {
467
- let &[status] = track(0);
468
-
469
- <button
470
- class="toggle"
471
- onClick={() => {
472
- status = (status + 1) % 3;
473
- }}
474
- >
475
- {'Toggle'}
476
- </button>
477
-
478
- if (status === 0) {
479
- <div class="zero">{'zero'}</div>
480
- return;
481
- } else if (status === 1) {
482
- <div class="one">{'one'}</div>
483
- return;
484
- }
485
-
486
- <div class="rest">{'rest'}</div>
487
- <div class="tail">{'tail'}</div>
488
- }
489
-
490
- // Deeply nested independent return guards with multiple root-level siblings
491
- export component ReactiveDeepNestedIndependentReturns() {
492
- let &[c1] = track(false);
493
- let &[c2] = track(false);
494
- let &[c3] = track(false);
495
- let &[c4] = track(false);
496
-
497
- <button
498
- class="toggle-c1"
499
- onClick={() => {
500
- c1 = !c1;
501
- }}
502
- >
503
- {'Toggle C1'}
504
- </button>
505
- <button
506
- class="toggle-c2"
507
- onClick={() => {
508
- c2 = !c2;
509
- }}
510
- >
511
- {'Toggle C2'}
512
- </button>
513
- <button
514
- class="toggle-c3"
515
- onClick={() => {
516
- c3 = !c3;
517
- }}
518
- >
519
- {'Toggle C3'}
520
- </button>
521
- <button
522
- class="toggle-c4"
523
- onClick={() => {
524
- c4 = !c4;
525
- }}
526
- >
527
- {'Toggle C4'}
528
- </button>
529
-
530
- <div class="top">{'top'}</div>
531
-
532
- if (c1) {
533
- <div class="hit-1">{'hit-1'}</div>
534
- return;
535
- }
536
-
537
- <div class="middle">{'middle'}</div>
538
- <section class="nest-1">
539
- <div class="nest-1-a">{'nest-1-a'}</div>
540
- if (c2) {
541
- <div class="hit-2">{'hit-2'}</div>
542
- return;
543
- }
544
-
545
- <div class="nest-1-b">{'nest-1-b'}</div>
546
- <section class="nest-2">
547
- <div class="nest-2-a">{'nest-2-a'}</div>
548
- if (c3) {
549
- <div class="hit-3">{'hit-3'}</div>
550
- return;
551
- }
552
-
553
- <div class="nest-2-b">{'nest-2-b'}</div>
554
- if (c4) {
555
- <div class="hit-4">{'hit-4'}</div>
556
- return;
557
- }
558
- </section>
559
- </section>
560
-
561
- <div class="root-1">{'root-1'}</div>
562
- <div class="root-2">{'root-2'}</div>
563
- <div class="root-3">{'root-3'}</div>
564
- <div class="root-4">{'root-4'}</div>
19
+ export function StringReturn() {
20
+ return 'hello';
565
21
  }