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,129 +1,135 @@
1
1
  import { track } from 'ripple';
2
2
 
3
- export component SwitchStatic() {
4
- const status: string = 'success';
5
- switch (status) {
6
- case 'success':
7
- <div class="status-success">{'Success'}</div>
8
- break;
9
- case 'error':
10
- <div class="status-error">{'Error'}</div>
11
- break;
12
- default:
13
- <div class="status-unknown">{'Unknown'}</div>
14
- }
3
+ export function SwitchStatic() {
4
+ return <>
5
+ const status: string = 'success';
6
+ switch (status) {
7
+ case 'success':
8
+ <div class="status-success">{'Success'}</div>
9
+ break;
10
+ case 'error':
11
+ <div class="status-error">{'Error'}</div>
12
+ break;
13
+ default:
14
+ <div class="status-unknown">{'Unknown'}</div>
15
+ }
16
+ </>;
15
17
  }
16
18
 
17
- export component SwitchReactive() {
18
- let &[status] = track<'a' | 'b' | 'c'>('a');
19
- <button
20
- class="toggle"
21
- onClick={() => {
22
- if (status === 'a') status = 'b';
23
- else if (status === 'b') status = 'c';
24
- else status = 'a';
25
- }}
26
- >
27
- {'Toggle'}
28
- </button>
29
- switch (status) {
30
- case 'a':
31
- <div class="case-a">{'Case A'}</div>
32
- break;
33
- case 'b':
34
- <div class="case-b">{'Case B'}</div>
35
- break;
36
- default:
37
- <div class="case-c">{'Case C'}</div>
38
- }
19
+ export function SwitchReactive() {
20
+ return <>
21
+ let &[status] = track<'a' | 'b' | 'c'>('a');
22
+ <button
23
+ class="toggle"
24
+ onClick={() => {
25
+ if (status === 'a') status = 'b';
26
+ else if (status === 'b') status = 'c';
27
+ else status = 'a';
28
+ }}
29
+ >
30
+ {'Toggle'}
31
+ </button>
32
+ switch (status) {
33
+ case 'a':
34
+ <div class="case-a">{'Case A'}</div>
35
+ break;
36
+ case 'b':
37
+ <div class="case-b">{'Case B'}</div>
38
+ break;
39
+ default:
40
+ <div class="case-c">{'Case C'}</div>
41
+ }
42
+ </>;
39
43
  }
40
44
 
41
- export component SwitchFallthrough() {
42
- const val: number = 1;
43
- switch (val) {
44
- case 1:
45
- case 2:
46
- <div class="case-1-2">{'1 or 2'}</div>
47
- break;
48
- default:
49
- <div class="case-other">{'Other'}</div>
50
- }
45
+ export function SwitchFallthrough() {
46
+ return <>
47
+ const val: number = 1;
48
+ switch (val) {
49
+ case 1:
50
+ case 2:
51
+ <div class="case-1-2">{'1 or 2'}</div>
52
+ break;
53
+ default:
54
+ <div class="case-other">{'Other'}</div>
55
+ }
56
+ </>;
51
57
  }
52
58
 
53
- export component SwitchNumericLevels() {
54
- let &[level] = track<1 | 2 | 3>(1);
55
- <button
56
- class="level-toggle"
57
- onClick={() => {
58
- if (level === 1) level = 2;
59
- else if (level === 2) level = 3;
60
- else level = 1;
61
- }}
62
- >
63
- {'Toggle Level'}
64
- </button>
65
- switch (level) {
66
- case 1:
67
- <div class="level-1">{'Level 1'}</div>
68
- break;
69
- case 2:
70
- <div class="level-2">{'Level 2'}</div>
71
- break;
72
- case 3:
73
- <div class="level-3">{'Level 3'}</div>
74
- break;
75
- }
59
+ export function SwitchNumericLevels() {
60
+ return <>
61
+ let &[level] = track<1 | 2 | 3>(1);
62
+ <button
63
+ class="level-toggle"
64
+ onClick={() => {
65
+ if (level === 1) level = 2;
66
+ else if (level === 2) level = 3;
67
+ else level = 1;
68
+ }}
69
+ >
70
+ {'Toggle Level'}
71
+ </button>
72
+ switch (level) {
73
+ case 1:
74
+ <div class="level-1">{'Level 1'}</div>
75
+ break;
76
+ case 2:
77
+ <div class="level-2">{'Level 2'}</div>
78
+ break;
79
+ case 3:
80
+ <div class="level-3">{'Level 3'}</div>
81
+ break;
82
+ }
83
+ </>;
76
84
  }
77
85
 
78
- export component SwitchBlockScoped() {
79
- let &[level] = track<1 | 2 | 3>(1);
80
- <button
81
- class="block-toggle"
82
- onClick={() => {
83
- if (level === 1) level = 2;
84
- else if (level === 2) level = 3;
85
- else level = 1;
86
- }}
87
- >
88
- {'Toggle'}
89
- </button>
90
- switch (level) {
91
- case 1: {
92
- <div class="block-1">{'Block 1'}</div>
93
- break;
86
+ export function SwitchBlockScoped() {
87
+ return <>
88
+ let &[level] = track<1 | 2 | 3>(1);
89
+ <button
90
+ class="block-toggle"
91
+ onClick={() => {
92
+ if (level === 1) level = 2;
93
+ else if (level === 2) level = 3;
94
+ else level = 1;
95
+ }}
96
+ >
97
+ {'Toggle'}
98
+ </button>
99
+ switch (level) {
100
+ case 1:
101
+ <div class="block-1">{'Block 1'}</div>
102
+ break;
103
+ case 2:
104
+ <div class="block-2">{'Block 2'}</div>
105
+ break;
106
+ case 3:
107
+ <div class="block-3">{'Block 3'}</div>
108
+ break;
94
109
  }
95
- case 2: {
96
- <div class="block-2">{'Block 2'}</div>
97
- break;
98
- }
99
- case 3: {
100
- <div class="block-3">{'Block 3'}</div>
101
- break;
102
- }
103
- }
110
+ </>;
104
111
  }
105
112
 
106
- export component SwitchNoBreak() {
107
- let &[level] = track<1 | 2 | 3>(1);
108
- <button
109
- class="nobreak-toggle"
110
- onClick={() => {
111
- if (level === 1) level = 2;
112
- else if (level === 2) level = 3;
113
- else level = 1;
114
- }}
115
- >
116
- {'Toggle'}
117
- </button>
118
- switch (level) {
119
- case 1: {
120
- <div class="nobreak-1">{'NoBreak 1'}</div>
121
- }
122
- case 2: {
123
- <div class="nobreak-2">{'NoBreak 2'}</div>
124
- }
125
- case 3: {
126
- <div class="nobreak-3">{'NoBreak 3'}</div>
113
+ export function SwitchNoBreak() {
114
+ return <>
115
+ let &[level] = track<1 | 2 | 3>(1);
116
+ <button
117
+ class="nobreak-toggle"
118
+ onClick={() => {
119
+ if (level === 1) level = 2;
120
+ else if (level === 2) level = 3;
121
+ else level = 1;
122
+ }}
123
+ >
124
+ {'Toggle'}
125
+ </button>
126
+ switch (level) {
127
+ case 1:
128
+ <div class="nobreak-1">{'NoBreak 1'}</div>
129
+ case 2:
130
+ <div class="nobreak-2">{'NoBreak 2'}</div>
131
+ case 3:
132
+ <div class="nobreak-3">{'NoBreak 3'}</div>
127
133
  }
128
- }
134
+ </>;
129
135
  }
@@ -8,111 +8,127 @@ module server {
8
8
 
9
9
  import { formatValue } from server;
10
10
 
11
- export component AsyncWithServerCall() {
12
- let &[count] = track(0);
13
-
14
- <button
15
- class="increment"
16
- onClick={() => {
17
- count++;
18
- }}
19
- >
20
- {'increment'}
21
- </button>
22
- try {
23
- let &[data] = trackAsync(() => formatValue(count));
24
- <p class="result">{data}</p>
25
- } pending {
26
- <p class="loading">{'loading...'}</p>
27
- }
11
+ export function AsyncWithServerCall() {
12
+ return <>
13
+ let &[count] = track(0);
14
+ <button
15
+ class="increment"
16
+ onClick={() => {
17
+ count++;
18
+ }}
19
+ >
20
+ {'increment'}
21
+ </button>
22
+ try {
23
+ let &[data] = trackAsync(() => formatValue(count));
24
+ <p class="result">{data}</p>
25
+ } pending {
26
+ <p class="loading">{'loading...'}</p>
27
+ }
28
+ </>;
28
29
  }
29
30
 
30
- export component AsyncSimpleValue() {
31
- try {
32
- let &[data] = trackAsync(() => Promise.resolve('hydrated value'));
33
- <p class="result">{data}</p>
34
- } pending {
35
- <p class="loading">{'loading...'}</p>
36
- }
31
+ export function AsyncSimpleValue() {
32
+ return <>
33
+ try {
34
+ let &[data] = trackAsync(() => Promise.resolve('hydrated value'));
35
+ <p class="result">{data}</p>
36
+ } pending {
37
+ <p class="loading">{'loading...'}</p>
38
+ }
39
+ </>;
37
40
  }
38
41
 
39
- export component AsyncNumericValue() {
40
- try {
41
- let &[count] = trackAsync(() => Promise.resolve(42));
42
- <span class="count">{count}</span>
43
- } pending {
44
- <span class="pending">{'...'}</span>
45
- }
42
+ export function AsyncNumericValue() {
43
+ return <>
44
+ try {
45
+ let &[count] = trackAsync(() => Promise.resolve(42));
46
+ <span class="count">{count}</span>
47
+ } pending {
48
+ <span class="pending">{'...'}</span>
49
+ }
50
+ </>;
46
51
  }
47
52
 
48
- export component AsyncObjectValue() {
49
- try {
50
- let &[user] = trackAsync(() => Promise.resolve({ name: 'Alice', age: 30 }));
51
- <div class="user">
52
- <span class="name">{user.name}</span>
53
- <span class="age">{user.age}</span>
54
- </div>
55
- } pending {
56
- <div class="loading">{'loading user...'}</div>
57
- }
53
+ export function AsyncObjectValue() {
54
+ return <>
55
+ try {
56
+ let &[user] = trackAsync(() => Promise.resolve({ name: 'Alice', age: 30 }));
57
+ <div class="user">
58
+ <span class="name">{user.name}</span>
59
+ <span class="age">{user.age}</span>
60
+ </div>
61
+ } pending {
62
+ <div class="loading">{'loading user...'}</div>
63
+ }
64
+ </>;
58
65
  }
59
66
 
60
- export component AsyncMultipleValues() {
61
- try {
62
- let &[first] = trackAsync(() => Promise.resolve('alpha'));
63
- let &[second] = trackAsync(() => Promise.resolve('beta'));
64
- <div class="multi">
65
- <span class="first">{first}</span>
66
- <span class="second">{second}</span>
67
- </div>
68
- } pending {
69
- <div class="loading">{'loading...'}</div>
70
- }
67
+ export function AsyncMultipleValues() {
68
+ return <>
69
+ try {
70
+ let &[first] = trackAsync(() => Promise.resolve('alpha'));
71
+ let &[second] = trackAsync(() => Promise.resolve('beta'));
72
+ <div class="multi">
73
+ <span class="first">{first}</span>
74
+ <span class="second">{second}</span>
75
+ </div>
76
+ } pending {
77
+ <div class="loading">{'loading...'}</div>
78
+ }
79
+ </>;
71
80
  }
72
81
 
73
- export component AsyncWithCatch() {
74
- try {
75
- let &[data] = trackAsync(() => Promise.reject(new Error('fetch failed')));
76
- <p class="result">{data}</p>
77
- } pending {
78
- <p class="loading">{'loading...'}</p>
79
- } catch (e) {
80
- <p class="error">{(e as Error).message}</p>
81
- }
82
+ export function AsyncWithCatch() {
83
+ return <>
84
+ try {
85
+ let &[data] = trackAsync(() => Promise.reject(new Error('fetch failed')));
86
+ <p class="result">{data}</p>
87
+ } pending {
88
+ <p class="loading">{'loading...'}</p>
89
+ } catch (e) {
90
+ <p class="error">{(e as Error).message}</p>
91
+ }
92
+ </>;
82
93
  }
83
94
 
84
- export component ChildWithError() {
85
- try {
86
- let &[data] = trackAsync(() => Promise.reject(new Error('child error')));
87
- <p class="result">{data}</p>
88
- } pending {
89
- <p class="pending">{'loading...'}</p>
90
- }
95
+ export function ChildWithError() {
96
+ return <>
97
+ try {
98
+ let &[data] = trackAsync(() => Promise.reject(new Error('child error')));
99
+ <p class="result">{data}</p>
100
+ } pending {
101
+ <p class="pending">{'loading...'}</p>
102
+ }
103
+ </>;
91
104
  }
92
105
 
93
- export component ParentWithCatch() {
94
- try {
95
- <ChildWithError />
96
- } catch (e) {
97
- <p class="parent-error">{(e as Error).message}</p>
98
- }
106
+ export function ParentWithCatch() {
107
+ return <>
108
+ try {
109
+ <ChildWithError />
110
+ } catch (e) {
111
+ <p class="parent-error">{(e as Error).message}</p>
112
+ }
113
+ </>;
99
114
  }
100
115
 
101
- export component AsyncWithReactiveDependency() {
102
- let &[count] = track(0);
103
-
104
- <button
105
- class="increment"
106
- onClick={() => {
107
- count++;
108
- }}
109
- >
110
- {'increment'}
111
- </button>
112
- try {
113
- let &[data] = trackAsync(() => Promise.resolve(`count-${count}`));
114
- <p class="result">{data}</p>
115
- } pending {
116
- <p class="loading">{'loading...'}</p>
117
- }
116
+ export function AsyncWithReactiveDependency() {
117
+ return <>
118
+ let &[count] = track(0);
119
+ <button
120
+ class="increment"
121
+ onClick={() => {
122
+ count++;
123
+ }}
124
+ >
125
+ {'increment'}
126
+ </button>
127
+ try {
128
+ let &[data] = trackAsync(() => Promise.resolve(`count-${count}`));
129
+ <p class="result">{data}</p>
130
+ } pending {
131
+ <p class="loading">{'loading...'}</p>
132
+ }
133
+ </>;
118
134
  }
@@ -1,59 +1,74 @@
1
1
  import { trackAsync } from 'ripple';
2
2
 
3
- export component RootPending() {
4
- <p class="root-pending">{'root loading...'}</p>
3
+ export function RootPending() {
4
+ return <><p class="root-pending">{'root loading...'}</p></>;
5
5
  }
6
6
 
7
- export component RootCatch({ error, reset }: { error: Error; reset: () => void }) {
8
- <section class="root-catch">
9
- <p class="root-error">{error.message}</p>
10
- <button class="root-reset" onClick={reset}>{'retry'}</button>
11
- </section>
7
+ export function RootCatch({ error, reset }: { error: Error; reset: () => void }) {
8
+ return <>
9
+ <section class="root-catch">
10
+ <p class="root-error">{error.message}</p>
11
+ <button class="root-reset" onClick={reset}>{'retry'}</button>
12
+ </section>
13
+ </>;
12
14
  }
13
15
 
14
- export component RootThrows() {
15
- throw new Error('root exploded');
16
- <p>{'should not render'}</p>
16
+ export function RootThrows() {
17
+ return <>
18
+ throw new Error('root exploded');
19
+ <p>{'should not render'}</p>
20
+ </>;
17
21
  }
18
22
 
19
- export component RootAsyncDirect() {
20
- let &[value] = trackAsync(() => Promise.resolve('root async value'));
21
- <p class="root-async-value">{value}</p>
23
+ export function RootAsyncDirect() {
24
+ return <>
25
+ let &[value] = trackAsync(() => Promise.resolve('root async value'));
26
+ <p class="root-async-value">{value}</p>
27
+ </>;
22
28
  }
23
29
 
24
- export component RootAsyncRejects() {
25
- let &[value] = trackAsync(() => Promise.reject(new Error('root async failed')));
26
- <p class="root-async-value">{value}</p>
30
+ export function RootAsyncRejects() {
31
+ return <>
32
+ let &[value] = trackAsync(() => Promise.reject(new Error('root async failed')));
33
+ <p class="root-async-value">{value}</p>
34
+ </>;
27
35
  }
28
36
 
29
- export component AsyncListInTryPending() {
30
- try {
31
- <AsyncList />
32
- } pending {
33
- <p class="loading">{'loading...'}</p>
34
- }
37
+ export function AsyncListInTryPending() {
38
+ return <>
39
+ try {
40
+ <AsyncList />
41
+ } pending {
42
+ <p class="loading">{'loading...'}</p>
43
+ }
44
+ </>;
35
45
  }
36
46
 
37
- component AsyncList() {
38
- let &[items] = trackAsync(() => Promise.resolve(['alpha', 'beta', 'gamma']));
39
-
40
- <ul class="items">
41
- for (let item of items) {
42
- <li>{item}</li>
43
- }
44
- </ul>
47
+ function AsyncList() {
48
+ return <>
49
+ let &[items] = trackAsync(() => Promise.resolve(['alpha', 'beta', 'gamma']));
50
+ <ul class="items">
51
+ for (let item of items) {
52
+ <li>{item}</li>
53
+ }
54
+ </ul>
55
+ </>;
45
56
  }
46
57
 
47
- export component AsyncTryWithLeadingSibling() {
48
- <div class="before">{'before'}</div>
49
- try {
50
- <AsyncContent />
51
- } pending {
52
- <div class="loading">{'loading async content'}</div>
53
- }
58
+ export function AsyncTryWithLeadingSibling() {
59
+ return <>
60
+ <div class="before">{'before'}</div>
61
+ try {
62
+ <AsyncContent />
63
+ } pending {
64
+ <div class="loading">{'loading async content'}</div>
65
+ }
66
+ </>;
54
67
  }
55
68
 
56
- component AsyncContent() {
57
- let &[value] = trackAsync(() => Promise.resolve('ready'));
58
- <div class="resolved">{value}</div>
69
+ function AsyncContent() {
70
+ return <>
71
+ let &[value] = trackAsync(() => Promise.resolve('ready'));
72
+ <div class="resolved">{value}</div>
73
+ </>;
59
74
  }
@@ -172,7 +172,7 @@ describe('hydration > html tags', () => {
172
172
  expect(html).toContain('Footer');
173
173
  });
174
174
 
175
- it('hydrates article with {html} child then sibling (StylingPage pattern)', async () => {
175
+ it('hydrates article with innerHTML content then sibling (StylingPage pattern)', async () => {
176
176
  await hydrateComponent(
177
177
  ServerComponents.ArticleWithHtmlChildThenSibling,
178
178
  ClientComponents.ArticleWithHtmlChildThenSibling,
@@ -183,7 +183,7 @@ describe('hydration > html tags', () => {
183
183
  expect(html).toContain('Footer');
184
184
  });
185
185
 
186
- it('hydrates INLINE article with {html} child then sibling (exact DocsLayout)', async () => {
186
+ it('hydrates INLINE article with innerHTML content then sibling (exact DocsLayout)', async () => {
187
187
  await hydrateComponent(
188
188
  ServerComponents.InlineArticleWithHtmlChild,
189
189
  ClientComponents.InlineArticleWithHtmlChild,
@@ -234,7 +234,7 @@ describe('hydration > html tags', () => {
234
234
  expect(html).toContain('Footer');
235
235
  });
236
236
 
237
- it('hydrates template element with {html} content', async () => {
237
+ it('hydrates template element with innerHTML content', async () => {
238
238
  await hydrateComponent(
239
239
  ServerComponents.TemplateWithHtmlContent,
240
240
  ClientComponents.TemplateWithHtmlContent,
@@ -244,7 +244,7 @@ describe('hydration > html tags', () => {
244
244
  expect(html).toContain('Main content');
245
245
  });
246
246
 
247
- it('hydrates template element with {html} and siblings', async () => {
247
+ it('hydrates template element with innerHTML and siblings', async () => {
248
248
  await hydrateComponent(
249
249
  ServerComponents.TemplateWithHtmlAndSiblings,
250
250
  ClientComponents.TemplateWithHtmlAndSiblings,