ripple 0.3.68 → 0.3.70

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 +126 -259
  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 -131
  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,12 +2,13 @@ import { RippleURL, flushSync } from 'ripple';
2
2
 
3
3
  describe('RippleURL > partials/removal', () => {
4
4
  it('handles URL with no port specified', () => {
5
- component URLTest() {
6
- const url = RippleURL('https://example.com/path');
7
-
8
- <pre>{url.port}</pre>
9
- <pre>{url.host}</pre>
10
- <button onClick={() => (url.port = '8080')}>{'Add Port'}</button>
5
+ function URLTest() {
6
+ return <>
7
+ const url = RippleURL('https://example.com/path');
8
+ <pre>{url.port}</pre>
9
+ <pre>{url.host}</pre>
10
+ <button onClick={() => (url.port = '8080')}>{'Add Port'}</button>
11
+ </>;
11
12
  }
12
13
 
13
14
  render(URLTest);
@@ -27,12 +28,13 @@ describe('RippleURL > partials/removal', () => {
27
28
  });
28
29
 
29
30
  it('handles URL with no search params', () => {
30
- component URLTest() {
31
- const url = RippleURL('https://example.com/path');
32
-
33
- <pre>{url.search}</pre>
34
- <pre>{url.searchParams.size}</pre>
35
- <button onClick={() => url.searchParams.append('foo', 'bar')}>{'Add Param'}</button>
31
+ function URLTest() {
32
+ return <>
33
+ const url = RippleURL('https://example.com/path');
34
+ <pre>{url.search}</pre>
35
+ <pre>{url.searchParams.size}</pre>
36
+ <button onClick={() => url.searchParams.append('foo', 'bar')}>{'Add Param'}</button>
37
+ </>;
36
38
  }
37
39
 
38
40
  render(URLTest);
@@ -52,11 +54,12 @@ describe('RippleURL > partials/removal', () => {
52
54
  });
53
55
 
54
56
  it('handles URL with no hash', () => {
55
- component URLTest() {
56
- const url = RippleURL('https://example.com/path');
57
-
58
- <pre>{url.hash}</pre>
59
- <button onClick={() => (url.hash = '#section')}>{'Add Hash'}</button>
57
+ function URLTest() {
58
+ return <>
59
+ const url = RippleURL('https://example.com/path');
60
+ <pre>{url.hash}</pre>
61
+ <button onClick={() => (url.hash = '#section')}>{'Add Hash'}</button>
62
+ </>;
60
63
  }
61
64
 
62
65
  render(URLTest);
@@ -74,12 +77,13 @@ describe('RippleURL > partials/removal', () => {
74
77
  });
75
78
 
76
79
  it('handles removing port by setting empty string', () => {
77
- component URLTest() {
78
- const url = RippleURL('https://example.com:8080/path');
79
-
80
- <button onClick={() => (url.port = '')}>{'Remove Port'}</button>
81
- <pre>{url.href}</pre>
82
- <pre>{url.port}</pre>
80
+ function URLTest() {
81
+ return <>
82
+ const url = RippleURL('https://example.com:8080/path');
83
+ <button onClick={() => (url.port = '')}>{'Remove Port'}</button>
84
+ <pre>{url.href}</pre>
85
+ <pre>{url.port}</pre>
86
+ </>;
83
87
  }
84
88
 
85
89
  render(URLTest);
@@ -99,12 +103,13 @@ describe('RippleURL > partials/removal', () => {
99
103
  });
100
104
 
101
105
  it('handles removing hash by setting empty string', () => {
102
- component URLTest() {
103
- const url = RippleURL('https://example.com/path#section');
104
-
105
- <button onClick={() => (url.hash = '')}>{'Remove Hash'}</button>
106
- <pre>{url.href}</pre>
107
- <pre>{url.hash}</pre>
106
+ function URLTest() {
107
+ return <>
108
+ const url = RippleURL('https://example.com/path#section');
109
+ <button onClick={() => (url.hash = '')}>{'Remove Hash'}</button>
110
+ <pre>{url.href}</pre>
111
+ <pre>{url.hash}</pre>
112
+ </>;
108
113
  }
109
114
 
110
115
  render(URLTest);
@@ -126,13 +131,14 @@ describe('RippleURL > partials/removal', () => {
126
131
  });
127
132
 
128
133
  it('handles removing search by setting empty string', () => {
129
- component URLTest() {
130
- const url = RippleURL('https://example.com/path?foo=bar');
131
-
132
- <button onClick={() => (url.search = '')}>{'Remove Search'}</button>
133
- <pre>{url.href}</pre>
134
- <pre>{url.search}</pre>
135
- <pre>{url.searchParams.size}</pre>
134
+ function URLTest() {
135
+ return <>
136
+ const url = RippleURL('https://example.com/path?foo=bar');
137
+ <button onClick={() => (url.search = '')}>{'Remove Search'}</button>
138
+ <pre>{url.href}</pre>
139
+ <pre>{url.search}</pre>
140
+ <pre>{url.searchParams.size}</pre>
141
+ </>;
136
142
  }
137
143
 
138
144
  render(URLTest);
@@ -156,12 +162,13 @@ describe('RippleURL > partials/removal', () => {
156
162
  });
157
163
 
158
164
  it('handles hash without leading # character', () => {
159
- component URLTest() {
160
- const url = RippleURL('https://example.com/path');
161
-
162
- <button onClick={() => (url.hash = 'section')}>{'Set Hash'}</button>
163
- <pre>{url.hash}</pre>
164
- <pre>{url.href}</pre>
165
+ function URLTest() {
166
+ return <>
167
+ const url = RippleURL('https://example.com/path');
168
+ <button onClick={() => (url.hash = 'section')}>{'Set Hash'}</button>
169
+ <pre>{url.hash}</pre>
170
+ <pre>{url.href}</pre>
171
+ </>;
165
172
  }
166
173
 
167
174
  render(URLTest);
@@ -182,12 +189,13 @@ describe('RippleURL > partials/removal', () => {
182
189
  });
183
190
 
184
191
  it('handles search without leading ? character', () => {
185
- component URLTest() {
186
- const url = RippleURL('https://example.com/path');
187
-
188
- <button onClick={() => (url.search = 'foo=bar')}>{'Set Search'}</button>
189
- <pre>{url.search}</pre>
190
- <pre>{url.href}</pre>
192
+ function URLTest() {
193
+ return <>
194
+ const url = RippleURL('https://example.com/path');
195
+ <button onClick={() => (url.search = 'foo=bar')}>{'Set Search'}</button>
196
+ <pre>{url.search}</pre>
197
+ <pre>{url.href}</pre>
198
+ </>;
191
199
  }
192
200
 
193
201
  render(URLTest);
@@ -2,13 +2,14 @@ import { RippleURL, flushSync } from 'ripple';
2
2
 
3
3
  describe('RippleURL > reactivity', () => {
4
4
  it('handles protocol changes with reactivity', () => {
5
- component URLTest() {
6
- const url = RippleURL('https://example.com/path');
7
-
8
- <button onClick={() => (url.protocol = 'http:')}>{'Change Protocol'}</button>
9
- <pre>{url.href}</pre>
10
- <pre>{url.protocol}</pre>
11
- <pre>{url.origin}</pre>
5
+ function URLTest() {
6
+ return <>
7
+ const url = RippleURL('https://example.com/path');
8
+ <button onClick={() => (url.protocol = 'http:')}>{'Change Protocol'}</button>
9
+ <pre>{url.href}</pre>
10
+ <pre>{url.protocol}</pre>
11
+ <pre>{url.origin}</pre>
12
+ </>;
12
13
  }
13
14
 
14
15
  render(URLTest);
@@ -30,13 +31,14 @@ describe('RippleURL > reactivity', () => {
30
31
  });
31
32
 
32
33
  it('handles hostname changes with reactivity', () => {
33
- component URLTest() {
34
- const url = RippleURL('https://example.com/path');
35
-
36
- <button onClick={() => (url.hostname = 'newdomain.com')}>{'Change Hostname'}</button>
37
- <pre>{url.href}</pre>
38
- <pre>{url.hostname}</pre>
39
- <pre>{url.host}</pre>
34
+ function URLTest() {
35
+ return <>
36
+ const url = RippleURL('https://example.com/path');
37
+ <button onClick={() => (url.hostname = 'newdomain.com')}>{'Change Hostname'}</button>
38
+ <pre>{url.href}</pre>
39
+ <pre>{url.hostname}</pre>
40
+ <pre>{url.host}</pre>
41
+ </>;
40
42
  }
41
43
 
42
44
  render(URLTest);
@@ -58,13 +60,14 @@ describe('RippleURL > reactivity', () => {
58
60
  });
59
61
 
60
62
  it('handles port changes with reactivity', () => {
61
- component URLTest() {
62
- const url = RippleURL('https://example.com:8080/path');
63
-
64
- <button onClick={() => (url.port = '9090')}>{'Change Port'}</button>
65
- <pre>{url.href}</pre>
66
- <pre>{url.port}</pre>
67
- <pre>{url.host}</pre>
63
+ function URLTest() {
64
+ return <>
65
+ const url = RippleURL('https://example.com:8080/path');
66
+ <button onClick={() => (url.port = '9090')}>{'Change Port'}</button>
67
+ <pre>{url.href}</pre>
68
+ <pre>{url.port}</pre>
69
+ <pre>{url.host}</pre>
70
+ </>;
68
71
  }
69
72
 
70
73
  render(URLTest);
@@ -86,14 +89,15 @@ describe('RippleURL > reactivity', () => {
86
89
  });
87
90
 
88
91
  it('handles host changes with reactivity', () => {
89
- component URLTest() {
90
- const url = RippleURL('https://example.com:8080/path');
91
-
92
- <button onClick={() => (url.host = 'newdomain.com:9090')}>{'Change Host'}</button>
93
- <pre>{url.href}</pre>
94
- <pre>{url.host}</pre>
95
- <pre>{url.hostname}</pre>
96
- <pre>{url.port}</pre>
92
+ function URLTest() {
93
+ return <>
94
+ const url = RippleURL('https://example.com:8080/path');
95
+ <button onClick={() => (url.host = 'newdomain.com:9090')}>{'Change Host'}</button>
96
+ <pre>{url.href}</pre>
97
+ <pre>{url.host}</pre>
98
+ <pre>{url.hostname}</pre>
99
+ <pre>{url.port}</pre>
100
+ </>;
97
101
  }
98
102
 
99
103
  render(URLTest);
@@ -119,12 +123,13 @@ describe('RippleURL > reactivity', () => {
119
123
  });
120
124
 
121
125
  it('handles pathname changes with reactivity', () => {
122
- component URLTest() {
123
- const url = RippleURL('https://example.com/old-path');
124
-
125
- <button onClick={() => (url.pathname = '/new-path')}>{'Change Pathname'}</button>
126
- <pre>{url.href}</pre>
127
- <pre>{url.pathname}</pre>
126
+ function URLTest() {
127
+ return <>
128
+ const url = RippleURL('https://example.com/old-path');
129
+ <button onClick={() => (url.pathname = '/new-path')}>{'Change Pathname'}</button>
130
+ <pre>{url.href}</pre>
131
+ <pre>{url.pathname}</pre>
132
+ </>;
128
133
  }
129
134
 
130
135
  render(URLTest);
@@ -144,12 +149,13 @@ describe('RippleURL > reactivity', () => {
144
149
  });
145
150
 
146
151
  it('handles search changes with reactivity', () => {
147
- component URLTest() {
148
- const url = RippleURL('https://example.com/path?foo=bar');
149
-
150
- <button onClick={() => (url.search = '?baz=qux')}>{'Change Search'}</button>
151
- <pre>{url.href}</pre>
152
- <pre>{url.search}</pre>
152
+ function URLTest() {
153
+ return <>
154
+ const url = RippleURL('https://example.com/path?foo=bar');
155
+ <button onClick={() => (url.search = '?baz=qux')}>{'Change Search'}</button>
156
+ <pre>{url.href}</pre>
157
+ <pre>{url.search}</pre>
158
+ </>;
153
159
  }
154
160
 
155
161
  render(URLTest);
@@ -173,12 +179,13 @@ describe('RippleURL > reactivity', () => {
173
179
  });
174
180
 
175
181
  it('handles hash changes with reactivity', () => {
176
- component URLTest() {
177
- const url = RippleURL('https://example.com/path#section1');
178
-
179
- <button onClick={() => (url.hash = '#section2')}>{'Change Hash'}</button>
180
- <pre>{url.href}</pre>
181
- <pre>{url.hash}</pre>
182
+ function URLTest() {
183
+ return <>
184
+ const url = RippleURL('https://example.com/path#section1');
185
+ <button onClick={() => (url.hash = '#section2')}>{'Change Hash'}</button>
186
+ <pre>{url.href}</pre>
187
+ <pre>{url.hash}</pre>
188
+ </>;
182
189
  }
183
190
 
184
191
  render(URLTest);
@@ -202,12 +209,13 @@ describe('RippleURL > reactivity', () => {
202
209
  });
203
210
 
204
211
  it('handles username changes with reactivity', () => {
205
- component URLTest() {
206
- const url = RippleURL('https://user:pass@example.com/path');
207
-
208
- <button onClick={() => (url.username = 'newuser')}>{'Change Username'}</button>
209
- <pre>{url.href}</pre>
210
- <pre>{url.username}</pre>
212
+ function URLTest() {
213
+ return <>
214
+ const url = RippleURL('https://user:pass@example.com/path');
215
+ <button onClick={() => (url.username = 'newuser')}>{'Change Username'}</button>
216
+ <pre>{url.href}</pre>
217
+ <pre>{url.username}</pre>
218
+ </>;
211
219
  }
212
220
 
213
221
  render(URLTest);
@@ -231,12 +239,13 @@ describe('RippleURL > reactivity', () => {
231
239
  });
232
240
 
233
241
  it('handles password changes with reactivity', () => {
234
- component URLTest() {
235
- const url = RippleURL('https://user:pass@example.com/path');
236
-
237
- <button onClick={() => (url.password = 'newpass')}>{'Change Password'}</button>
238
- <pre>{url.href}</pre>
239
- <pre>{url.password}</pre>
242
+ function URLTest() {
243
+ return <>
244
+ const url = RippleURL('https://user:pass@example.com/path');
245
+ <button onClick={() => (url.password = 'newpass')}>{'Change Password'}</button>
246
+ <pre>{url.href}</pre>
247
+ <pre>{url.password}</pre>
248
+ </>;
240
249
  }
241
250
 
242
251
  render(URLTest);
@@ -260,19 +269,22 @@ describe('RippleURL > reactivity', () => {
260
269
  });
261
270
 
262
271
  it('handles href changes with reactivity', () => {
263
- component URLTest() {
264
- const url = RippleURL('https://example.com/path?foo=bar#section');
265
-
266
- <button onClick={() => (url.href = 'https://newdomain.com:9090/newpath?baz=qux#newsection')}>
267
- {'Change Href'}
268
- </button>
269
- <pre>{url.href}</pre>
270
- <pre>{url.protocol}</pre>
271
- <pre>{url.hostname}</pre>
272
- <pre>{url.port}</pre>
273
- <pre>{url.pathname}</pre>
274
- <pre>{url.search}</pre>
275
- <pre>{url.hash}</pre>
272
+ function URLTest() {
273
+ return <>
274
+ const url = RippleURL('https://example.com/path?foo=bar#section');
275
+ <button
276
+ onClick={() => (url.href = 'https://newdomain.com:9090/newpath?baz=qux#newsection')}
277
+ >
278
+ {'Change Href'}
279
+ </button>
280
+ <pre>{url.href}</pre>
281
+ <pre>{url.protocol}</pre>
282
+ <pre>{url.hostname}</pre>
283
+ <pre>{url.port}</pre>
284
+ <pre>{url.pathname}</pre>
285
+ <pre>{url.search}</pre>
286
+ <pre>{url.hash}</pre>
287
+ </>;
276
288
  }
277
289
 
278
290
  render(URLTest);
@@ -306,13 +318,14 @@ describe('RippleURL > reactivity', () => {
306
318
  });
307
319
 
308
320
  it('handles origin property reactivity', () => {
309
- component URLTest() {
310
- const url = RippleURL('https://example.com:8080/path');
311
-
312
- <button onClick={() => (url.protocol = 'http:')}>{'Change Protocol'}</button>
313
- <button onClick={() => (url.hostname = 'newdomain.com')}>{'Change Hostname'}</button>
314
- <button onClick={() => (url.port = '9090')}>{'Change Port'}</button>
315
- <pre>{url.origin}</pre>
321
+ function URLTest() {
322
+ return <>
323
+ const url = RippleURL('https://example.com:8080/path');
324
+ <button onClick={() => (url.protocol = 'http:')}>{'Change Protocol'}</button>
325
+ <button onClick={() => (url.hostname = 'newdomain.com')}>{'Change Hostname'}</button>
326
+ <button onClick={() => (url.port = '9090')}>{'Change Port'}</button>
327
+ <pre>{url.origin}</pre>
328
+ </>;
316
329
  }
317
330
 
318
331
  render(URLTest);
@@ -338,15 +351,16 @@ describe('RippleURL > reactivity', () => {
338
351
  expect(container.querySelector('pre').textContent).toBe('http://newdomain.com:9090');
339
352
  });
340
353
  it('handles searchParams changes with reactivity', () => {
341
- component URLTest() {
342
- const url = RippleURL('https://example.com/path?foo=bar');
343
- const params = url.searchParams;
344
-
345
- <button onClick={() => params.set('foo', 'updated')}>{'Update Foo'}</button>
346
- <button onClick={() => params.append('baz', 'qux')}>{'Add Baz'}</button>
347
- <pre>{url.href}</pre>
348
- <pre>{url.search}</pre>
349
- <pre>{params.get('foo')}</pre>
354
+ function URLTest() {
355
+ return <>
356
+ const url = RippleURL('https://example.com/path?foo=bar');
357
+ const params = url.searchParams;
358
+ <button onClick={() => params.set('foo', 'updated')}>{'Update Foo'}</button>
359
+ <button onClick={() => params.append('baz', 'qux')}>{'Add Baz'}</button>
360
+ <pre>{url.href}</pre>
361
+ <pre>{url.search}</pre>
362
+ <pre>{params.get('foo')}</pre>
363
+ </>;
350
364
  }
351
365
 
352
366
  render(URLTest);
@@ -382,16 +396,17 @@ describe('RippleURL > reactivity', () => {
382
396
  });
383
397
 
384
398
  it('handles search property updates reflected in searchParams', () => {
385
- component URLTest() {
386
- const url = RippleURL('https://example.com/path?foo=bar');
387
- const params = url.searchParams;
388
-
389
- <button onClick={() => (url.search = '?baz=qux&test=value')}>{'Change Search'}</button>
390
- <pre>{url.search}</pre>
391
- <pre>{params.get('foo')}</pre>
392
- <pre>{params.get('baz')}</pre>
393
- <pre>{params.get('test')}</pre>
394
- <pre>{params.size}</pre>
399
+ function URLTest() {
400
+ return <>
401
+ const url = RippleURL('https://example.com/path?foo=bar');
402
+ const params = url.searchParams;
403
+ <button onClick={() => (url.search = '?baz=qux&test=value')}>{'Change Search'}</button>
404
+ <pre>{url.search}</pre>
405
+ <pre>{params.get('foo')}</pre>
406
+ <pre>{params.get('baz')}</pre>
407
+ <pre>{params.get('test')}</pre>
408
+ <pre>{params.size}</pre>
409
+ </>;
395
410
  }
396
411
 
397
412
  render(URLTest);
@@ -417,22 +432,23 @@ describe('RippleURL > reactivity', () => {
417
432
  });
418
433
 
419
434
  it('handles multiple URL property changes in sequence', () => {
420
- component URLTest() {
421
- const url = RippleURL('https://example.com/path');
422
-
423
- <button
424
- onClick={() => {
425
- url.protocol = 'http:';
426
- url.hostname = 'newdomain.com';
427
- url.port = '8080';
428
- url.pathname = '/api';
429
- url.search = '?key=value';
430
- url.hash = '#section';
431
- }}
432
- >
433
- {'Change All'}
434
- </button>
435
- <pre>{url.href}</pre>
435
+ function URLTest() {
436
+ return <>
437
+ const url = RippleURL('https://example.com/path');
438
+ <button
439
+ onClick={() => {
440
+ url.protocol = 'http:';
441
+ url.hostname = 'newdomain.com';
442
+ url.port = '8080';
443
+ url.pathname = '/api';
444
+ url.search = '?key=value';
445
+ url.hash = '#section';
446
+ }}
447
+ >
448
+ {'Change All'}
449
+ </button>
450
+ <pre>{url.href}</pre>
451
+ </>;
436
452
  }
437
453
 
438
454
  render(URLTest);
@@ -452,17 +468,18 @@ describe('RippleURL > reactivity', () => {
452
468
  });
453
469
 
454
470
  it('handles href change updates all properties and searchParams', () => {
455
- component URLTest() {
456
- const url = RippleURL('https://old.com/old?foo=bar#old');
457
- const params = url.searchParams;
458
-
459
- <button onClick={() => (url.href = 'https://new.com:9090/new?baz=qux#new')}>
460
- {'Change Href'}
461
- </button>
462
- <pre>{params.get('foo')}</pre>
463
- <pre>{params.get('baz')}</pre>
464
- <pre>{params.size}</pre>
465
- <pre>{url.pathname}</pre>
471
+ function URLTest() {
472
+ return <>
473
+ const url = RippleURL('https://old.com/old?foo=bar#old');
474
+ const params = url.searchParams;
475
+ <button onClick={() => (url.href = 'https://new.com:9090/new?baz=qux#new')}>
476
+ {'Change Href'}
477
+ </button>
478
+ <pre>{params.get('foo')}</pre>
479
+ <pre>{params.get('baz')}</pre>
480
+ <pre>{params.size}</pre>
481
+ <pre>{url.pathname}</pre>
482
+ </>;
466
483
  }
467
484
 
468
485
  render(URLTest);
@@ -2,11 +2,12 @@ import { RippleURL, flushSync } from 'ripple';
2
2
 
3
3
  describe('RippleURL > serialization', () => {
4
4
  it('handles toString method', () => {
5
- component URLTest() {
6
- const url = RippleURL('https://example.com/path?foo=bar#section');
7
-
8
- <button onClick={() => (url.pathname = '/newpath')}>{'Change Pathname'}</button>
9
- <pre>{url.toString()}</pre>
5
+ function URLTest() {
6
+ return <>
7
+ const url = RippleURL('https://example.com/path?foo=bar#section');
8
+ <button onClick={() => (url.pathname = '/newpath')}>{'Change Pathname'}</button>
9
+ <pre>{url.toString()}</pre>
10
+ </>;
10
11
  }
11
12
 
12
13
  render(URLTest);
@@ -28,12 +29,13 @@ describe('RippleURL > serialization', () => {
28
29
  });
29
30
 
30
31
  it('handles toJSON method', () => {
31
- component URLTest() {
32
- const url = RippleURL('https://example.com/path?foo=bar');
33
-
34
- <button onClick={() => (url.pathname = '/api')}>{'Change Pathname'}</button>
35
- <pre>{url.toJSON()}</pre>
36
- <pre>{JSON.stringify({ url: url.toJSON() })}</pre>
32
+ function URLTest() {
33
+ return <>
34
+ const url = RippleURL('https://example.com/path?foo=bar');
35
+ <button onClick={() => (url.pathname = '/api')}>{'Change Pathname'}</button>
36
+ <pre>{url.toJSON()}</pre>
37
+ <pre>{JSON.stringify({ url: url.toJSON() })}</pre>
38
+ </>;
37
39
  }
38
40
 
39
41
  render(URLTest);
@@ -2,17 +2,18 @@ import { RippleURL, RippleURLSearchParams, flushSync, track } from 'ripple';
2
2
 
3
3
  describe('RippleURLSearchParams > derived', () => {
4
4
  it('handles reactive computed properties based on search params', () => {
5
- component URLTest() {
6
- const params = RippleURLSearchParams('page=1&limit=10');
7
- let &[page] = track(() => parseInt(params.get('page') || '1', 10));
8
- let &[limit] = track(() => parseInt(params.get('limit') || '10', 10));
9
- let &[offset] = track(() => (page - 1) * limit);
10
-
11
- <button onClick={() => params.set('page', '2')}>{'next page'}</button>
12
- <button onClick={() => params.set('page', '1')}>{'first page'}</button>
13
- <pre>{`Page: ${page}`}</pre>
14
- <pre>{`Limit: ${limit}`}</pre>
15
- <pre>{`Offset: ${offset}`}</pre>
5
+ function URLTest() {
6
+ return <>
7
+ const params = RippleURLSearchParams('page=1&limit=10');
8
+ let &[page] = track(() => parseInt(params.get('page') || '1', 10));
9
+ let &[limit] = track(() => parseInt(params.get('limit') || '10', 10));
10
+ let &[offset] = track(() => (page - 1) * limit);
11
+ <button onClick={() => params.set('page', '2')}>{'next page'}</button>
12
+ <button onClick={() => params.set('page', '1')}>{'first page'}</button>
13
+ <pre>{`Page: ${page}`}</pre>
14
+ <pre>{`Limit: ${limit}`}</pre>
15
+ <pre>{`Offset: ${offset}`}</pre>
16
+ </>;
16
17
  }
17
18
 
18
19
  render(URLTest);
@@ -43,28 +44,32 @@ describe('RippleURLSearchParams > derived', () => {
43
44
  });
44
45
 
45
46
  it('maintains reactivity across multiple components', () => {
46
- component ParentTest() {
47
- const params = RippleURLSearchParams('count=0');
48
-
49
- <ChildA {params} />
50
- <ChildB {params} />
47
+ function ParentTest() {
48
+ return <>
49
+ const params = RippleURLSearchParams('count=0');
50
+ <ChildA {params} />
51
+ <ChildB {params} />
52
+ </>;
51
53
  }
52
54
 
53
- component ChildA({ params }: { params: RippleURLSearchParams }) {
54
- <button
55
- onClick={() => {
56
- const current = parseInt(params.get('count') || '0', 10);
57
- params.set('count', String(current + 1));
58
- }}
59
- >
60
- {'increment'}
61
- </button>
55
+ function ChildA({ params }: { params: RippleURLSearchParams }) {
56
+ return <>
57
+ <button
58
+ onClick={() => {
59
+ const current = parseInt(params.get('count') || '0', 10);
60
+ params.set('count', String(current + 1));
61
+ }}
62
+ >
63
+ {'increment'}
64
+ </button>
65
+ </>;
62
66
  }
63
67
 
64
- component ChildB({ params }: { params: RippleURLSearchParams }) {
65
- let &[count] = track(() => params.get('count'));
66
-
67
- <pre>{count}</pre>
68
+ function ChildB({ params }: { params: RippleURLSearchParams }) {
69
+ return <>
70
+ let &[count] = track(() => params.get('count'));
71
+ <pre>{count}</pre>
72
+ </>;
68
73
  }
69
74
 
70
75
  render(ParentTest);