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.
- package/CHANGELOG.md +57 -0
- package/package.json +3 -3
- package/src/jsx-runtime.d.ts +2 -2
- package/src/runtime/element.js +1 -1
- package/src/runtime/index-client.js +11 -11
- package/src/runtime/index-server.js +7 -4
- package/src/runtime/internal/client/bindings.js +1 -1
- package/src/runtime/internal/client/blocks.js +13 -4
- package/src/runtime/internal/client/component.js +55 -0
- package/src/runtime/internal/client/composite.js +4 -2
- package/src/runtime/internal/client/expression.js +65 -7
- package/src/runtime/internal/client/hmr.js +54 -43
- package/src/runtime/internal/client/index.js +5 -1
- package/src/runtime/internal/client/portal.js +70 -69
- package/src/runtime/internal/client/render.js +3 -0
- package/src/runtime/internal/server/index.js +92 -8
- package/tests/client/__snapshots__/html.test.tsrx.snap +3 -3
- package/tests/client/array/array.copy-within.test.tsrx +33 -31
- package/tests/client/array/array.derived.test.tsrx +186 -169
- package/tests/client/array/array.iteration.test.tsrx +40 -37
- package/tests/client/array/array.mutations.test.tsrx +113 -101
- package/tests/client/array/array.static.test.tsrx +119 -101
- package/tests/client/array/array.to-methods.test.tsrx +24 -21
- package/tests/client/async-suspend.test.tsrx +247 -246
- package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +0 -1
- package/tests/client/basic/basic.attributes.test.tsrx +428 -423
- package/tests/client/basic/basic.collections.test.tsrx +109 -102
- package/tests/client/basic/basic.components.test.tsrx +323 -205
- package/tests/client/basic/basic.errors.test.tsrx +91 -91
- package/tests/client/basic/basic.events.test.tsrx +114 -115
- package/tests/client/basic/basic.get-set.test.tsrx +97 -87
- package/tests/client/basic/basic.hmr.test.tsrx +19 -16
- package/tests/client/basic/basic.reactivity.test.tsrx +199 -191
- package/tests/client/basic/basic.rendering.test.tsrx +272 -182
- package/tests/client/basic/basic.styling.test.tsrx +23 -22
- package/tests/client/basic/basic.utilities.test.tsrx +10 -8
- package/tests/client/boundaries.test.tsrx +26 -26
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.rsrx.snap +5 -5
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.tsrx.snap +5 -5
- package/tests/client/compiler/compiler.assignments.test.tsrx +77 -81
- package/tests/client/compiler/compiler.attributes.test.tsrx +15 -15
- package/tests/client/compiler/compiler.basic.test.tsrx +322 -314
- package/tests/client/compiler/compiler.regex.test.tsrx +44 -47
- package/tests/client/compiler/compiler.tracked-access.test.tsrx +38 -38
- package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
- package/tests/client/compiler/compiler.typescript.test.tsrx +2 -2
- package/tests/client/composite/composite.dynamic-components.test.tsrx +47 -48
- package/tests/client/composite/composite.generics.test.tsrx +168 -192
- package/tests/client/composite/composite.props.test.tsrx +97 -81
- package/tests/client/composite/composite.reactivity.test.tsrx +177 -147
- package/tests/client/composite/composite.render.test.tsrx +122 -105
- package/tests/client/computed-properties.test.tsrx +28 -28
- package/tests/client/context.test.tsrx +21 -21
- package/tests/client/css/global-additional-cases.test.tsrx +58 -58
- package/tests/client/css/global-advanced-selectors.test.tsrx +16 -16
- package/tests/client/css/global-at-rules.test.tsrx +10 -10
- package/tests/client/css/global-basic.test.tsrx +14 -14
- package/tests/client/css/global-classes-ids.test.tsrx +14 -14
- package/tests/client/css/global-combinators.test.tsrx +10 -10
- package/tests/client/css/global-complex-nesting.test.tsrx +14 -14
- package/tests/client/css/global-edge-cases.test.tsrx +18 -18
- package/tests/client/css/global-keyframes.test.tsrx +12 -12
- package/tests/client/css/global-nested.test.tsrx +10 -10
- package/tests/client/css/global-pseudo.test.tsrx +12 -12
- package/tests/client/css/global-scoping.test.tsrx +20 -20
- package/tests/client/css/style-identifier.test.tsrx +143 -291
- package/tests/client/date.test.tsrx +146 -133
- package/tests/client/dynamic-elements.test.tsrx +398 -365
- package/tests/client/events.test.tsrx +292 -290
- package/tests/client/for.test.tsrx +156 -153
- package/tests/client/head.test.tsrx +105 -96
- package/tests/client/html.test.tsrx +122 -26
- package/tests/client/input-value.test.tsrx +1361 -1314
- package/tests/client/lazy-array.test.tsrx +16 -13
- package/tests/client/lazy-destructuring.test.tsrx +257 -213
- package/tests/client/map.test.tsrx +65 -60
- package/tests/client/media-query.test.tsrx +22 -20
- package/tests/client/object.test.tsrx +87 -81
- package/tests/client/portal.test.tsrx +57 -51
- package/tests/client/ref.test.tsrx +233 -202
- package/tests/client/return.test.tsrx +71 -2560
- package/tests/client/set.test.tsrx +54 -45
- package/tests/client/svg.test.tsrx +216 -186
- package/tests/client/switch.test.tsrx +194 -193
- package/tests/client/track-async-hydration.test.tsrx +18 -14
- package/tests/client/tracked-index-access.test.tsrx +28 -18
- package/tests/client/try.test.tsrx +675 -548
- package/tests/client/tsx.test.tsrx +373 -311
- package/tests/client/typescript-generics.test.tsrx +145 -145
- package/tests/client/url/url.derived.test.tsrx +33 -28
- package/tests/client/url/url.parsing.test.tsrx +61 -51
- package/tests/client/url/url.partial-removal.test.tsrx +56 -48
- package/tests/client/url/url.reactivity.test.tsrx +142 -125
- package/tests/client/url/url.serialization.test.tsrx +13 -11
- package/tests/client/url-search-params/url-search-params.derived.test.tsrx +34 -29
- package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +25 -21
- package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +50 -45
- package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +111 -99
- package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +49 -43
- package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +14 -12
- package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +16 -14
- package/tests/hydration/basic.test.js +3 -3
- package/tests/hydration/compiled/client/basic.js +586 -651
- package/tests/hydration/compiled/client/composite.js +79 -104
- package/tests/hydration/compiled/client/events.js +140 -148
- package/tests/hydration/compiled/client/for.js +1005 -1018
- package/tests/hydration/compiled/client/head.js +124 -134
- package/tests/hydration/compiled/client/hmr.js +41 -48
- package/tests/hydration/compiled/client/html-in-template.js +38 -41
- package/tests/hydration/compiled/client/html.js +970 -1314
- package/tests/hydration/compiled/client/if-children.js +234 -249
- package/tests/hydration/compiled/client/if.js +182 -189
- package/tests/hydration/compiled/client/mixed-control-flow.js +347 -303
- package/tests/hydration/compiled/client/nested-control-flow.js +1084 -832
- package/tests/hydration/compiled/client/portal.js +65 -85
- package/tests/hydration/compiled/client/reactivity.js +84 -90
- package/tests/hydration/compiled/client/return.js +38 -1939
- package/tests/hydration/compiled/client/switch.js +218 -224
- package/tests/hydration/compiled/client/track-async-serialization.js +250 -259
- package/tests/hydration/compiled/client/try.js +123 -132
- package/tests/hydration/compiled/server/basic.js +773 -831
- package/tests/hydration/compiled/server/composite.js +166 -191
- package/tests/hydration/compiled/server/events.js +170 -184
- package/tests/hydration/compiled/server/for.js +851 -909
- package/tests/hydration/compiled/server/head.js +206 -216
- package/tests/hydration/compiled/server/hmr.js +64 -72
- package/tests/hydration/compiled/server/html-in-template.js +42 -76
- package/tests/hydration/compiled/server/html.js +1362 -1667
- package/tests/hydration/compiled/server/if-children.js +419 -445
- package/tests/hydration/compiled/server/if.js +194 -208
- package/tests/hydration/compiled/server/mixed-control-flow.js +249 -257
- package/tests/hydration/compiled/server/nested-control-flow.js +491 -515
- package/tests/hydration/compiled/server/portal.js +152 -160
- package/tests/hydration/compiled/server/reactivity.js +94 -106
- package/tests/hydration/compiled/server/return.js +28 -2172
- package/tests/hydration/compiled/server/switch.js +274 -286
- package/tests/hydration/compiled/server/track-async-serialization.js +340 -358
- package/tests/hydration/compiled/server/try.js +167 -185
- package/tests/hydration/components/basic.tsrx +320 -272
- package/tests/hydration/components/composite.tsrx +44 -32
- package/tests/hydration/components/events.tsrx +101 -91
- package/tests/hydration/components/for.tsrx +510 -452
- package/tests/hydration/components/head.tsrx +87 -80
- package/tests/hydration/components/hmr.tsrx +22 -17
- package/tests/hydration/components/html-in-template.tsrx +22 -17
- package/tests/hydration/components/html.tsrx +525 -443
- package/tests/hydration/components/if-children.tsrx +158 -148
- package/tests/hydration/components/if.tsrx +109 -95
- package/tests/hydration/components/mixed-control-flow.tsrx +100 -96
- package/tests/hydration/components/nested-control-flow.tsrx +215 -203
- package/tests/hydration/components/portal.tsrx +41 -34
- package/tests/hydration/components/reactivity.tsrx +37 -27
- package/tests/hydration/components/return.tsrx +12 -556
- package/tests/hydration/components/switch.tsrx +120 -114
- package/tests/hydration/components/track-async-serialization.tsrx +107 -91
- package/tests/hydration/components/try.tsrx +55 -40
- package/tests/hydration/html.test.js +4 -4
- package/tests/hydration/return.test.js +13 -532
- package/tests/server/await.test.tsrx +3 -3
- package/tests/server/basic.attributes.test.tsrx +264 -195
- package/tests/server/basic.components.test.tsrx +296 -169
- package/tests/server/basic.test.tsrx +300 -198
- package/tests/server/compiler.test.tsrx +62 -60
- package/tests/server/composite.props.test.tsrx +77 -63
- package/tests/server/composite.test.tsrx +168 -192
- package/tests/server/context.test.tsrx +18 -12
- package/tests/server/dynamic-elements.test.tsrx +197 -180
- package/tests/server/for.test.tsrx +85 -78
- package/tests/server/head.test.tsrx +50 -43
- package/tests/server/html-nesting-validation.test.tsrx +8 -8
- package/tests/server/if.test.tsrx +57 -51
- package/tests/server/lazy-destructuring.test.tsrx +366 -294
- package/tests/server/return.test.tsrx +76 -1355
- package/tests/server/streaming-ssr.test.tsrx +4 -75
- package/tests/server/style-identifier.test.tsrx +169 -148
- package/tests/server/switch.test.tsrx +91 -85
- package/tests/server/track-async-serialization.test.tsrx +105 -85
- package/tests/server/try.test.tsrx +374 -280
- package/tests/utils/compiler-compat-config.test.js +2 -2
- package/tests/utils/runtime-imports.test.js +10 -0
- package/types/index.d.ts +8 -0
- 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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
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
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
function ParentTest() {
|
|
48
|
+
return <>
|
|
49
|
+
const params = RippleURLSearchParams('count=0');
|
|
50
|
+
<ChildA {params} />
|
|
51
|
+
<ChildB {params} />
|
|
52
|
+
</>;
|
|
51
53
|
}
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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);
|