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
@@ -1,200 +1,200 @@
1
1
  describe('generic patterns', () => {
2
2
  it('tests simple generic function', () => {
3
- component App() {
4
- const e = new Map<string, Promise<number>>();
5
- const a = new Array<number>();
6
-
7
- const b = new Array<string>();
8
-
9
- <div class="still-works">
10
- <span>{'Test'}</span>
11
- </div>
12
-
13
- const someSource = new Array<number>(1, 2, 3);
14
- const d = someSource.map<number>((x) => x * 2).filter<number>((x) => !!x);
3
+ function App() {
4
+ return <>
5
+ const e = new Map<string, Promise<number>>();
6
+ const a = new Array<number>();
7
+ const b = new Array<string>();
8
+ <div class="still-works">
9
+ <span>{'Test'}</span>
10
+ </div>
11
+ const someSource = new Array<number>(1, 2, 3);
12
+ const d = someSource.map<number>((x) => x * 2).filter<number>((x) => !!x);
13
+ </>;
15
14
  }
16
15
 
17
16
  render(App);
18
17
  });
19
18
 
20
19
  it('tests member expression)', () => {
21
- component App() {
22
- class List<T> {
23
- items: T[];
24
- constructor() {
25
- this.items = [];
20
+ function App() {
21
+ return <>
22
+ class List<T> {
23
+ items: T[];
24
+ constructor() {
25
+ this.items = [];
26
+ }
26
27
  }
27
- }
28
-
29
- <div class="still-works">
30
- <span>{'Test'}</span>
31
- </div>
32
-
33
- class Containers {
34
- static List<T>() {
35
- return new List<T>();
28
+ <div class="still-works">
29
+ <span>{'Test'}</span>
30
+ </div>
31
+ class Containers {
32
+ static List<T>() {
33
+ return new List<T>();
34
+ }
36
35
  }
37
- }
38
-
39
- const c = Containers.List<string>();
36
+ const c = Containers.List<string>();
37
+ </>;
40
38
  }
41
39
 
42
40
  render(App);
43
41
  });
44
42
 
45
43
  it('tests simple generic function with return type', () => {
46
- component App() {
47
- function getBuilder() {
48
- return {
49
- build: function <T>() {
50
- return 'test';
51
- },
52
- };
53
- }
44
+ function App() {
45
+ return <>
46
+ function getBuilder() {
47
+ return {
48
+ build: function <T>() {
49
+ return 'test';
50
+ },
51
+ };
52
+ }
53
+ </>;
54
54
  }
55
55
 
56
56
  render(App);
57
57
  });
58
58
 
59
59
  it('tests simple generic function with return type and no arrow function', () => {
60
- component App() {
61
- function getBuilder() {
62
- return {
63
- build<T>(): T {
64
- return 'test' as unknown as T;
65
- },
66
- };
67
- }
68
-
69
- <div class="still-works">
70
- <span>{'Test'}</span>
71
- </div>
72
-
73
- const f = getBuilder().build<string>();
60
+ function App() {
61
+ return <>
62
+ function getBuilder() {
63
+ return {
64
+ build<T>(): T {
65
+ return 'test' as unknown as T;
66
+ },
67
+ };
68
+ }
69
+ <div class="still-works">
70
+ <span>{'Test'}</span>
71
+ </div>
72
+ const f = getBuilder().build<string>();
73
+ </>;
74
74
  }
75
75
 
76
76
  render(App);
77
77
  });
78
78
 
79
79
  it('tests simple generic arrow function with return type', () => {
80
- component App() {
81
- function getBuilder() {
82
- return <T,>() => ({
83
- build<T>(): T {
84
- return 'test' as unknown as T;
85
- },
86
- });
87
- }
88
-
89
- type ResultType = string;
90
-
91
- const f = getBuilder()<ResultType>().build<string>();
80
+ function App() {
81
+ return <>
82
+ function getBuilder() {
83
+ return <T,>() => ({
84
+ build<T>(): T {
85
+ return 'test' as unknown as T;
86
+ },
87
+ });
88
+ }
89
+ type ResultType = string;
90
+ const f = getBuilder()<ResultType>().build<string>();
91
+ </>;
92
92
  }
93
93
 
94
94
  render(App);
95
95
  });
96
96
 
97
97
  it('tests simple generic arrow function with explicit return type', () => {
98
- component App() {
99
- function getBuilder() {
100
- return <T,>() => ({
101
- build<U>(): U {
102
- return 'test' as U;
103
- },
104
- });
105
- }
106
-
107
- <div class="still-works">
108
- <span>{'Test'}</span>
109
- </div>
110
-
111
- type ResultType = string;
112
- const f = getBuilder()<ResultType>().build<string>();
113
- <div>{f}</div>
98
+ function App() {
99
+ return <>
100
+ function getBuilder() {
101
+ return <T,>() => ({
102
+ build<U>(): U {
103
+ return 'test' as U;
104
+ },
105
+ });
106
+ }
107
+ <div class="still-works">
108
+ <span>{'Test'}</span>
109
+ </div>
110
+ type ResultType = string;
111
+ const f = getBuilder()<ResultType>().build<string>();
112
+ <div>{f}</div>
113
+ </>;
114
114
  }
115
115
 
116
116
  render(App);
117
117
  });
118
118
 
119
119
  it('tests complex generic arrow function with return type', () => {
120
- component App() {
121
- function getBuilder() {
122
- return <T,>() => ({
123
- build<V, T, U>(): { build: () => V; data: T; key: U } {
124
- return {
125
- build(): V {
126
- return 'test' as V;
127
- },
128
- data: undefined as T,
129
- key: undefined as U,
130
- };
131
- },
132
- });
133
- }
134
-
135
- <div class="still-works">
136
- <span>{'Test'}</span>
137
- </div>
138
-
139
- type ResultType = string;
140
- const f = getBuilder()<ResultType>().build<string, object, string>();
141
- <div>{f}</div>
120
+ function App() {
121
+ return <>
122
+ function getBuilder() {
123
+ return <T,>() => ({
124
+ build<V, T, U>(): { build: () => V; data: T; key: U } {
125
+ return {
126
+ build(): V {
127
+ return 'test' as V;
128
+ },
129
+ data: undefined as T,
130
+ key: undefined as U,
131
+ };
132
+ },
133
+ });
134
+ }
135
+ <div class="still-works">
136
+ <span>{'Test'}</span>
137
+ </div>
138
+ type ResultType = string;
139
+ const f = getBuilder()<ResultType>().build<string, object, string>();
140
+ <div>{f}</div>
141
+ </>;
142
142
  }
143
143
 
144
144
  render(App);
145
145
  });
146
146
 
147
147
  it('tests more complex generic arrow function with return type', () => {
148
- component App() {
149
- function getBuilder() {
150
- return <T,>() => ({
151
- build<V, T, U>(): { build: () => V; data: T; key: U } {
152
- return {
153
- build(): V {
154
- return 'test' as V;
155
- },
156
- data: undefined as T,
157
- key: undefined as U,
158
- };
159
- },
160
- });
161
- }
162
-
163
- <div class="still-works">
164
- <span>{'Test'}</span>
165
- </div>
166
-
167
- type ResultType = string;
168
- const f = getBuilder()<ResultType>().build<string, object, string>();
169
- <div>{f}</div>
148
+ function App() {
149
+ return <>
150
+ function getBuilder() {
151
+ return <T,>() => ({
152
+ build<V, T, U>(): { build: () => V; data: T; key: U } {
153
+ return {
154
+ build(): V {
155
+ return 'test' as V;
156
+ },
157
+ data: undefined as T,
158
+ key: undefined as U,
159
+ };
160
+ },
161
+ });
162
+ }
163
+ <div class="still-works">
164
+ <span>{'Test'}</span>
165
+ </div>
166
+ type ResultType = string;
167
+ const f = getBuilder()<ResultType>().build<string, object, string>();
168
+ <div>{f}</div>
169
+ </>;
170
170
  }
171
171
 
172
172
  render(App);
173
173
  });
174
174
 
175
175
  it('tests most complex generic arrow function with return type', () => {
176
- component App() {
177
- function getBuilder() {
178
- return <T,>() => ({
179
- build<V, T, U>(): { build: () => V; data: T; key: U } {
180
- return {
181
- build(): V {
182
- return 42 as V;
183
- },
184
- data: undefined as T,
185
- key: undefined as U,
186
- };
187
- },
188
- });
189
- }
190
-
191
- <div class="still-works">
192
- <span>{'Test'}</span>
193
- </div>
194
-
195
- type ResultType = string;
196
- const f = getBuilder()<ResultType>().build<number, object, string>();
197
- <div>{f}</div>
176
+ function App() {
177
+ return <>
178
+ function getBuilder() {
179
+ return <T,>() => ({
180
+ build<V, T, U>(): { build: () => V; data: T; key: U } {
181
+ return {
182
+ build(): V {
183
+ return 42 as V;
184
+ },
185
+ data: undefined as T,
186
+ key: undefined as U,
187
+ };
188
+ },
189
+ });
190
+ }
191
+ <div class="still-works">
192
+ <span>{'Test'}</span>
193
+ </div>
194
+ type ResultType = string;
195
+ const f = getBuilder()<ResultType>().build<number, object, string>();
196
+ <div>{f}</div>
197
+ </>;
198
198
  }
199
199
 
200
200
  render(App);
@@ -2,15 +2,16 @@ import { RippleURL, flushSync, track } from 'ripple';
2
2
 
3
3
  describe('RippleURL > derived', () => {
4
4
  it('handles reactive computed properties based on URL', () => {
5
- component URLTest() {
6
- const url = RippleURL('https://example.com/users/123?tab=profile');
7
- let &[userId] = track(() => url.pathname.split('/').pop());
8
- let &[activeTab] = track(() => url.searchParams.get('tab'));
9
-
10
- <button onClick={() => (url.pathname = '/users/456')}>{'Change User'}</button>
11
- <button onClick={() => url.searchParams.set('tab', 'settings')}>{'Change Tab'}</button>
12
- <pre>{`User ID: ${userId}`}</pre>
13
- <pre>{`Active Tab: ${activeTab}`}</pre>
5
+ function URLTest() {
6
+ return <>
7
+ const url = RippleURL('https://example.com/users/123?tab=profile');
8
+ let &[userId] = track(() => url.pathname.split('/').pop());
9
+ let &[activeTab] = track(() => url.searchParams.get('tab'));
10
+ <button onClick={() => (url.pathname = '/users/456')}>{'Change User'}</button>
11
+ <button onClick={() => url.searchParams.set('tab', 'settings')}>{'Change Tab'}</button>
12
+ <pre>{`User ID: ${userId}`}</pre>
13
+ <pre>{`Active Tab: ${activeTab}`}</pre>
14
+ </>;
14
15
  }
15
16
 
16
17
  render(URLTest);
@@ -38,29 +39,33 @@ describe('RippleURL > derived', () => {
38
39
  });
39
40
 
40
41
  it('maintains reactivity across multiple components', () => {
41
- component ParentTest() {
42
- const url = RippleURL('https://example.com/path?count=0');
43
-
44
- <ChildA {url} />
45
- <ChildB {url} />
42
+ function ParentTest() {
43
+ return <>
44
+ const url = RippleURL('https://example.com/path?count=0');
45
+ <ChildA {url} />
46
+ <ChildB {url} />
47
+ </>;
46
48
  }
47
49
 
48
- component ChildA({ url }: { url: RippleURL }) {
49
- <button
50
- onClick={() => {
51
- const current = parseInt(url.searchParams.get('count') || '0', 10);
52
- url.searchParams.set('count', String(current + 1));
53
- }}
54
- >
55
- {'Increment Count'}
56
- </button>
50
+ function ChildA({ url }: { url: RippleURL }) {
51
+ return <>
52
+ <button
53
+ onClick={() => {
54
+ const current = parseInt(url.searchParams.get('count') || '0', 10);
55
+ url.searchParams.set('count', String(current + 1));
56
+ }}
57
+ >
58
+ {'Increment Count'}
59
+ </button>
60
+ </>;
57
61
  }
58
62
 
59
- component ChildB({ url }: { url: RippleURL }) {
60
- let &[count] = track(() => url.searchParams.get('count'));
61
-
62
- <pre>{url.href}</pre>
63
- <pre>{count}</pre>
63
+ function ChildB({ url }: { url: RippleURL }) {
64
+ return <>
65
+ let &[count] = track(() => url.searchParams.get('count'));
66
+ <pre>{url.href}</pre>
67
+ <pre>{count}</pre>
68
+ </>;
64
69
  }
65
70
 
66
71
  render(ParentTest);
@@ -2,16 +2,17 @@ import { RippleURL, flushSync } from 'ripple';
2
2
 
3
3
  describe('RippleURL > parsing', () => {
4
4
  it('creates URL from string with reactivity', () => {
5
- component URLTest() {
6
- const url = RippleURL('https://example.com:8080/path?foo=bar#section');
7
-
8
- <pre>{url.href}</pre>
9
- <pre>{url.protocol}</pre>
10
- <pre>{url.hostname}</pre>
11
- <pre>{url.port}</pre>
12
- <pre>{url.pathname}</pre>
13
- <pre>{url.search}</pre>
14
- <pre>{url.hash}</pre>
5
+ function URLTest() {
6
+ return <>
7
+ const url = RippleURL('https://example.com:8080/path?foo=bar#section');
8
+ <pre>{url.href}</pre>
9
+ <pre>{url.protocol}</pre>
10
+ <pre>{url.hostname}</pre>
11
+ <pre>{url.port}</pre>
12
+ <pre>{url.pathname}</pre>
13
+ <pre>{url.search}</pre>
14
+ <pre>{url.hash}</pre>
15
+ </>;
15
16
  }
16
17
 
17
18
  render(URLTest);
@@ -28,11 +29,12 @@ describe('RippleURL > parsing', () => {
28
29
  });
29
30
 
30
31
  it('creates URL from string with base URL', () => {
31
- component URLTest() {
32
- const url = RippleURL('/path?query=value', 'https://example.com');
33
-
34
- <pre>{url.href}</pre>
35
- <pre>{url.origin}</pre>
32
+ function URLTest() {
33
+ return <>
34
+ const url = RippleURL('/path?query=value', 'https://example.com');
35
+ <pre>{url.href}</pre>
36
+ <pre>{url.origin}</pre>
37
+ </>;
36
38
  }
37
39
 
38
40
  render(URLTest);
@@ -44,12 +46,13 @@ describe('RippleURL > parsing', () => {
44
46
  });
45
47
 
46
48
  it('handles URL encoding correctly', () => {
47
- component URLTest() {
48
- const url = RippleURL('https://example.com/path with spaces?key=value with spaces');
49
-
50
- <pre>{url.pathname}</pre>
51
- <pre>{url.search}</pre>
52
- <pre>{url.href}</pre>
49
+ function URLTest() {
50
+ return <>
51
+ const url = RippleURL('https://example.com/path with spaces?key=value with spaces');
52
+ <pre>{url.pathname}</pre>
53
+ <pre>{url.search}</pre>
54
+ <pre>{url.href}</pre>
55
+ </>;
53
56
  }
54
57
 
55
58
  render(URLTest);
@@ -62,12 +65,13 @@ describe('RippleURL > parsing', () => {
62
65
  });
63
66
 
64
67
  it('handles URL with file protocol', () => {
65
- component URLTest() {
66
- const url = RippleURL('file:///Users/username/documents/file.txt');
67
-
68
- <pre>{url.protocol}</pre>
69
- <pre>{url.pathname}</pre>
70
- <pre>{url.href}</pre>
68
+ function URLTest() {
69
+ return <>
70
+ const url = RippleURL('file:///Users/username/documents/file.txt');
71
+ <pre>{url.protocol}</pre>
72
+ <pre>{url.pathname}</pre>
73
+ <pre>{url.href}</pre>
74
+ </>;
71
75
  }
72
76
 
73
77
  render(URLTest);
@@ -82,12 +86,13 @@ describe('RippleURL > parsing', () => {
82
86
  });
83
87
 
84
88
  it('handles URL with IPv4 address', () => {
85
- component URLTest() {
86
- const url = RippleURL('https://192.168.1.1:8080/path');
87
-
88
- <button onClick={() => (url.hostname = '10.0.0.1')}>{'Change IP'}</button>
89
- <pre>{url.href}</pre>
90
- <pre>{url.hostname}</pre>
89
+ function URLTest() {
90
+ return <>
91
+ const url = RippleURL('https://192.168.1.1:8080/path');
92
+ <button onClick={() => (url.hostname = '10.0.0.1')}>{'Change IP'}</button>
93
+ <pre>{url.href}</pre>
94
+ <pre>{url.hostname}</pre>
95
+ </>;
91
96
  }
92
97
 
93
98
  render(URLTest);
@@ -107,13 +112,14 @@ describe('RippleURL > parsing', () => {
107
112
  });
108
113
 
109
114
  it('handles URL with localhost', () => {
110
- component URLTest() {
111
- const url = RippleURL('http://localhost:3000/api/data');
112
-
113
- <button onClick={() => (url.port = '8080')}>{'Change Port'}</button>
114
- <pre>{url.href}</pre>
115
- <pre>{url.hostname}</pre>
116
- <pre>{url.port}</pre>
115
+ function URLTest() {
116
+ return <>
117
+ const url = RippleURL('http://localhost:3000/api/data');
118
+ <button onClick={() => (url.port = '8080')}>{'Change Port'}</button>
119
+ <pre>{url.href}</pre>
120
+ <pre>{url.hostname}</pre>
121
+ <pre>{url.port}</pre>
122
+ </>;
117
123
  }
118
124
 
119
125
  render(URLTest);
@@ -135,12 +141,15 @@ describe('RippleURL > parsing', () => {
135
141
  });
136
142
 
137
143
  it('handles URL with multiple path segments', () => {
138
- component URLTest() {
139
- const url = RippleURL('https://example.com/api/v1/users/123/profile');
140
-
141
- <button onClick={() => (url.pathname = '/api/v2/users/456/settings')}>{'Change Path'}</button>
142
- <pre>{url.pathname}</pre>
143
- <pre>{url.href}</pre>
144
+ function URLTest() {
145
+ return <>
146
+ const url = RippleURL('https://example.com/api/v1/users/123/profile');
147
+ <button onClick={() => (url.pathname = '/api/v2/users/456/settings')}>
148
+ {'Change Path'}
149
+ </button>
150
+ <pre>{url.pathname}</pre>
151
+ <pre>{url.href}</pre>
152
+ </>;
144
153
  }
145
154
 
146
155
  render(URLTest);
@@ -164,11 +173,12 @@ describe('RippleURL > parsing', () => {
164
173
  });
165
174
 
166
175
  it('handles relative URL paths correctly', () => {
167
- component URLTest() {
168
- const url = RippleURL('../sibling/path', 'https://example.com/parent/current');
169
-
170
- <pre>{url.href}</pre>
171
- <pre>{url.pathname}</pre>
176
+ function URLTest() {
177
+ return <>
178
+ const url = RippleURL('../sibling/path', 'https://example.com/parent/current');
179
+ <pre>{url.href}</pre>
180
+ <pre>{url.pathname}</pre>
181
+ </>;
172
182
  }
173
183
 
174
184
  render(URLTest);