ripple 0.3.72 → 0.3.74
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 +66 -0
- package/package.json +3 -3
- package/src/jsx-runtime.d.ts +2 -8
- package/src/runtime/index-client.js +3 -13
- package/src/runtime/internal/client/blocks.js +3 -25
- package/src/runtime/internal/client/for.js +80 -5
- package/src/runtime/internal/client/index.js +0 -2
- package/src/runtime/internal/client/types.d.ts +0 -10
- package/tests/client/__snapshots__/computed-properties.test.tsrx.snap +8 -0
- package/tests/client/__snapshots__/for.test.tsrx.snap +22 -0
- package/tests/client/__snapshots__/html.test.tsrx.snap +4 -0
- package/tests/client/array/array.copy-within.test.tsrx +19 -19
- package/tests/client/array/array.derived.test.tsrx +97 -109
- package/tests/client/array/array.iteration.test.tsrx +28 -28
- package/tests/client/array/array.mutations.test.tsrx +68 -68
- package/tests/client/array/array.static.test.tsrx +82 -92
- package/tests/client/array/array.to-methods.test.tsrx +15 -15
- package/tests/client/async-suspend.test.tsrx +180 -179
- package/tests/client/basic/__snapshots__/basic.attributes.test.tsrx.snap +2 -0
- package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +4 -0
- package/tests/client/basic/basic.attributes.test.tsrx +273 -317
- package/tests/client/basic/basic.collections.test.tsrx +55 -61
- package/tests/client/basic/basic.components.test.tsrx +196 -218
- package/tests/client/basic/basic.errors.test.tsrx +70 -76
- package/tests/client/basic/basic.events.test.tsrx +80 -85
- package/tests/client/basic/basic.get-set.test.tsrx +54 -64
- package/tests/client/basic/basic.hmr.test.tsrx +15 -19
- package/tests/client/basic/basic.reactivity.test.tsrx +121 -135
- package/tests/client/basic/basic.rendering.test.tsrx +273 -178
- package/tests/client/basic/basic.utilities.test.tsrx +8 -10
- package/tests/client/boundaries.test.tsrx +18 -18
- package/tests/client/compiler/compiler.assignments.test.tsrx +77 -76
- package/tests/client/compiler/compiler.attributes.test.tsrx +18 -14
- package/tests/client/compiler/compiler.basic.test.tsrx +357 -288
- package/tests/client/compiler/compiler.regex.test.tsrx +40 -44
- package/tests/client/compiler/compiler.tracked-access.test.tsrx +57 -38
- package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
- package/tests/client/compiler/compiler.typescript.test.tsrx +4 -3
- package/tests/client/composite/composite.dynamic-components.test.tsrx +41 -44
- package/tests/client/composite/composite.generics.test.tsrx +165 -167
- package/tests/client/composite/composite.props.test.tsrx +66 -74
- package/tests/client/composite/composite.reactivity.test.tsrx +132 -166
- package/tests/client/composite/composite.render.test.tsrx +92 -101
- package/tests/client/computed-properties.test.tsrx +14 -18
- package/tests/client/context.test.tsrx +14 -18
- package/tests/client/css/global-additional-cases.test.tsrx +491 -437
- package/tests/client/css/global-advanced-selectors.test.tsrx +169 -153
- package/tests/client/css/global-at-rules.test.tsrx +71 -66
- package/tests/client/css/global-basic.test.tsrx +105 -98
- package/tests/client/css/global-classes-ids.test.tsrx +128 -114
- package/tests/client/css/global-combinators.test.tsrx +83 -78
- package/tests/client/css/global-complex-nesting.test.tsrx +134 -120
- package/tests/client/css/global-edge-cases.test.tsrx +138 -120
- package/tests/client/css/global-keyframes.test.tsrx +108 -96
- package/tests/client/css/global-nested.test.tsrx +88 -78
- package/tests/client/css/global-pseudo.test.tsrx +104 -98
- package/tests/client/css/global-scoping.test.tsrx +145 -125
- package/tests/client/css/style-identifier.test.tsrx +62 -69
- package/tests/client/date.test.tsrx +83 -83
- package/tests/client/dynamic-elements.test.tsrx +227 -283
- package/tests/client/events.test.tsrx +252 -266
- package/tests/client/for.test.tsrx +120 -127
- package/tests/client/head.test.tsrx +40 -48
- package/tests/client/html.test.tsrx +37 -49
- package/tests/client/input-value.test.tsrx +1125 -1354
- package/tests/client/lazy-array.test.tsrx +10 -16
- package/tests/client/lazy-destructuring.test.tsrx +169 -221
- package/tests/client/map.test.tsrx +39 -41
- package/tests/client/media-query.test.tsrx +15 -19
- package/tests/client/object.test.tsrx +46 -56
- package/tests/client/portal.test.tsrx +31 -37
- package/tests/client/ref.test.tsrx +173 -193
- package/tests/client/return.test.tsrx +62 -37
- package/tests/client/set.test.tsrx +33 -33
- package/tests/client/svg.test.tsrx +195 -215
- package/tests/client/switch.test.tsrx +201 -191
- package/tests/client/track-async-hydration.test.tsrx +14 -18
- package/tests/client/tracked-index-access.test.tsrx +18 -28
- package/tests/client/try.test.tsrx +494 -619
- package/tests/client/tsx.test.tsrx +286 -292
- package/tests/client/typescript-generics.test.tsrx +121 -129
- package/tests/client/url/url.derived.test.tsrx +21 -25
- package/tests/client/url/url.parsing.test.tsrx +35 -35
- package/tests/client/url/url.partial-removal.test.tsrx +32 -32
- package/tests/client/url/url.reactivity.test.tsrx +68 -72
- package/tests/client/url/url.serialization.test.tsrx +8 -8
- package/tests/client/url-search-params/url-search-params.derived.test.tsrx +21 -27
- package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +16 -16
- package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +37 -37
- package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +56 -60
- package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +32 -34
- package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +9 -9
- package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +10 -10
- package/tests/hydration/compiled/client/basic.js +390 -319
- package/tests/hydration/compiled/client/composite.js +52 -44
- package/tests/hydration/compiled/client/for.js +734 -604
- package/tests/hydration/compiled/client/head.js +183 -103
- package/tests/hydration/compiled/client/html.js +93 -86
- package/tests/hydration/compiled/client/if-children.js +95 -71
- package/tests/hydration/compiled/client/if.js +113 -89
- package/tests/hydration/compiled/client/mixed-control-flow.js +225 -209
- package/tests/hydration/compiled/client/nested-control-flow.js +94 -98
- package/tests/hydration/compiled/client/reactivity.js +26 -24
- package/tests/hydration/compiled/client/return.js +8 -42
- package/tests/hydration/compiled/client/switch.js +208 -173
- package/tests/hydration/compiled/client/track-async-serialization.js +176 -128
- package/tests/hydration/compiled/client/try.js +29 -21
- package/tests/hydration/compiled/server/basic.js +210 -221
- package/tests/hydration/compiled/server/composite.js +13 -14
- package/tests/hydration/compiled/server/for.js +427 -444
- package/tests/hydration/compiled/server/head.js +199 -189
- package/tests/hydration/compiled/server/html.js +33 -41
- package/tests/hydration/compiled/server/if-children.js +114 -117
- package/tests/hydration/compiled/server/if.js +77 -83
- package/tests/hydration/compiled/server/mixed-control-flow.js +145 -150
- package/tests/hydration/compiled/server/nested-control-flow.js +10 -0
- package/tests/hydration/compiled/server/reactivity.js +24 -22
- package/tests/hydration/compiled/server/return.js +6 -18
- package/tests/hydration/compiled/server/switch.js +179 -176
- package/tests/hydration/compiled/server/track-async-serialization.js +88 -70
- package/tests/hydration/compiled/server/try.js +31 -35
- package/tests/hydration/components/basic.tsrx +216 -258
- package/tests/hydration/components/composite.tsrx +32 -42
- package/tests/hydration/components/events.tsrx +81 -101
- package/tests/hydration/components/for.tsrx +270 -336
- package/tests/hydration/components/head.tsrx +43 -39
- package/tests/hydration/components/hmr.tsrx +16 -22
- package/tests/hydration/components/html-in-template.tsrx +15 -21
- package/tests/hydration/components/html.tsrx +442 -526
- package/tests/hydration/components/if-children.tsrx +107 -125
- package/tests/hydration/components/if.tsrx +68 -90
- package/tests/hydration/components/mixed-control-flow.tsrx +65 -72
- package/tests/hydration/components/nested-control-flow.tsrx +202 -216
- package/tests/hydration/components/portal.tsrx +33 -41
- package/tests/hydration/components/reactivity.tsrx +26 -34
- package/tests/hydration/components/return.tsrx +4 -6
- package/tests/hydration/components/switch.tsrx +73 -78
- package/tests/hydration/components/track-async-serialization.tsrx +83 -93
- package/tests/hydration/components/try.tsrx +37 -51
- package/tests/hydration/switch.test.js +8 -8
- package/tests/server/await.test.tsrx +3 -3
- package/tests/server/basic.attributes.test.tsrx +117 -162
- package/tests/server/basic.components.test.tsrx +163 -193
- package/tests/server/basic.test.tsrx +298 -198
- package/tests/server/compiler.test.tsrx +142 -72
- package/tests/server/composite.props.test.tsrx +54 -58
- package/tests/server/composite.test.tsrx +165 -167
- package/tests/server/context.test.tsrx +13 -17
- package/tests/server/dynamic-elements.test.tsrx +103 -135
- package/tests/server/for.test.tsrx +115 -84
- package/tests/server/head.test.tsrx +31 -31
- package/tests/server/html-nesting-validation.test.tsrx +16 -8
- package/tests/server/if.test.tsrx +49 -59
- package/tests/server/lazy-destructuring.test.tsrx +288 -366
- package/tests/server/return.test.tsrx +58 -36
- package/tests/server/streaming-ssr.test.tsrx +4 -4
- package/tests/server/style-identifier.test.tsrx +58 -66
- package/tests/server/switch.test.tsrx +89 -97
- package/tests/server/track-async-serialization.test.tsrx +85 -103
- package/tests/server/try.test.tsrx +275 -360
- package/tests/utils/ref-types.test.js +72 -0
- package/tests/utils/vite-plugin-config.test.js +41 -74
- package/types/index.d.ts +1 -0
- package/src/runtime/internal/client/compat.js +0 -40
- package/tests/utils/compiler-compat-config.test.js +0 -38
|
@@ -1,200 +1,192 @@
|
|
|
1
1
|
describe('generic patterns', () => {
|
|
2
2
|
it('tests simple generic function', () => {
|
|
3
|
-
function App() {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
</
|
|
11
|
-
|
|
12
|
-
const d = someSource.map<number>((x) => x * 2).filter<number>((x) => !!x);
|
|
13
|
-
</>;
|
|
3
|
+
function App() @{
|
|
4
|
+
const e = new Map<string, Promise<number>>();
|
|
5
|
+
const a = new Array<number>();
|
|
6
|
+
const b = new Array<string>();
|
|
7
|
+
const someSource = new Array<number>(1, 2, 3);
|
|
8
|
+
const d = someSource.map<number>((x) => x * 2).filter<number>((x) => !!x);
|
|
9
|
+
<div class="still-works">
|
|
10
|
+
<span>{'Test'}</span>
|
|
11
|
+
</div>
|
|
14
12
|
}
|
|
15
13
|
|
|
16
14
|
render(App);
|
|
17
15
|
});
|
|
18
16
|
|
|
19
17
|
it('tests member expression)', () => {
|
|
20
|
-
function App() {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
this.items = [];
|
|
26
|
-
}
|
|
18
|
+
function App() @{
|
|
19
|
+
class List<T> {
|
|
20
|
+
items: T[];
|
|
21
|
+
constructor() {
|
|
22
|
+
this.items = [];
|
|
27
23
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
static List<T>() {
|
|
33
|
-
return new List<T>();
|
|
34
|
-
}
|
|
24
|
+
}
|
|
25
|
+
class Containers {
|
|
26
|
+
static List<T>() {
|
|
27
|
+
return new List<T>();
|
|
35
28
|
}
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
}
|
|
30
|
+
const c = Containers.List<string>();
|
|
31
|
+
<div class="still-works">
|
|
32
|
+
<span>{'Test'}</span>
|
|
33
|
+
</div>
|
|
38
34
|
}
|
|
39
35
|
|
|
40
36
|
render(App);
|
|
41
37
|
});
|
|
42
38
|
|
|
43
39
|
it('tests simple generic function with return type', () => {
|
|
44
|
-
function App() {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
</>;
|
|
40
|
+
function App() @{
|
|
41
|
+
function getBuilder() {
|
|
42
|
+
return {
|
|
43
|
+
build: function <T>() {
|
|
44
|
+
return 'test';
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
<></>
|
|
54
49
|
}
|
|
55
50
|
|
|
56
51
|
render(App);
|
|
57
52
|
});
|
|
58
53
|
|
|
59
54
|
it('tests simple generic function with return type and no arrow function', () => {
|
|
60
|
-
function App() {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const f = getBuilder().build<string>();
|
|
73
|
-
</>;
|
|
55
|
+
function App() @{
|
|
56
|
+
function getBuilder() {
|
|
57
|
+
return {
|
|
58
|
+
build<T>(): T {
|
|
59
|
+
return 'test' as unknown as T;
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const f = getBuilder().build<string>();
|
|
64
|
+
<div class="still-works">
|
|
65
|
+
<span>{'Test'}</span>
|
|
66
|
+
</div>
|
|
74
67
|
}
|
|
75
68
|
|
|
76
69
|
render(App);
|
|
77
70
|
});
|
|
78
71
|
|
|
79
72
|
it('tests simple generic arrow function with return type', () => {
|
|
80
|
-
function App() {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
</>;
|
|
73
|
+
function App() @{
|
|
74
|
+
function getBuilder() {
|
|
75
|
+
return <T,>() => ({
|
|
76
|
+
build<T>(): T {
|
|
77
|
+
return 'test' as unknown as T;
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
type ResultType = string;
|
|
82
|
+
const f = getBuilder()<ResultType>().build<string>();
|
|
83
|
+
<></>
|
|
92
84
|
}
|
|
93
85
|
|
|
94
86
|
render(App);
|
|
95
87
|
});
|
|
96
88
|
|
|
97
89
|
it('tests simple generic arrow function with explicit return type', () => {
|
|
98
|
-
function App() {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
90
|
+
function App() @{
|
|
91
|
+
function getBuilder() {
|
|
92
|
+
return <T,>() => ({
|
|
93
|
+
build<U>(): U {
|
|
94
|
+
return 'test' as U;
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
type ResultType = string;
|
|
99
|
+
const f = getBuilder()<ResultType>().build<string>();
|
|
100
|
+
<>
|
|
107
101
|
<div class="still-works">
|
|
108
102
|
<span>{'Test'}</span>
|
|
109
103
|
</div>
|
|
110
|
-
type ResultType = string;
|
|
111
|
-
const f = getBuilder()<ResultType>().build<string>();
|
|
112
104
|
<div>{f}</div>
|
|
113
|
-
|
|
105
|
+
</>
|
|
114
106
|
}
|
|
115
107
|
|
|
116
108
|
render(App);
|
|
117
109
|
});
|
|
118
110
|
|
|
119
111
|
it('tests complex generic arrow function with return type', () => {
|
|
120
|
-
function App() {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
112
|
+
function App() @{
|
|
113
|
+
function getBuilder() {
|
|
114
|
+
return <T,>() => ({
|
|
115
|
+
build<V, T, U>(): { build: () => V; data: T; key: U } {
|
|
116
|
+
return {
|
|
117
|
+
build(): V {
|
|
118
|
+
return 'test' as V;
|
|
119
|
+
},
|
|
120
|
+
data: undefined as T,
|
|
121
|
+
key: undefined as U,
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
type ResultType = string;
|
|
127
|
+
const f = getBuilder()<ResultType>().build<string, object, string>();
|
|
128
|
+
<>
|
|
135
129
|
<div class="still-works">
|
|
136
130
|
<span>{'Test'}</span>
|
|
137
131
|
</div>
|
|
138
|
-
type ResultType = string;
|
|
139
|
-
const f = getBuilder()<ResultType>().build<string, object, string>();
|
|
140
132
|
<div>{f}</div>
|
|
141
|
-
|
|
133
|
+
</>
|
|
142
134
|
}
|
|
143
135
|
|
|
144
136
|
render(App);
|
|
145
137
|
});
|
|
146
138
|
|
|
147
139
|
it('tests more complex generic arrow function with return type', () => {
|
|
148
|
-
function App() {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
140
|
+
function App() @{
|
|
141
|
+
function getBuilder() {
|
|
142
|
+
return <T,>() => ({
|
|
143
|
+
build<V, T, U>(): { build: () => V; data: T; key: U } {
|
|
144
|
+
return {
|
|
145
|
+
build(): V {
|
|
146
|
+
return 'test' as V;
|
|
147
|
+
},
|
|
148
|
+
data: undefined as T,
|
|
149
|
+
key: undefined as U,
|
|
150
|
+
};
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
type ResultType = string;
|
|
155
|
+
const f = getBuilder()<ResultType>().build<string, object, string>();
|
|
156
|
+
<>
|
|
163
157
|
<div class="still-works">
|
|
164
158
|
<span>{'Test'}</span>
|
|
165
159
|
</div>
|
|
166
|
-
type ResultType = string;
|
|
167
|
-
const f = getBuilder()<ResultType>().build<string, object, string>();
|
|
168
160
|
<div>{f}</div>
|
|
169
|
-
|
|
161
|
+
</>
|
|
170
162
|
}
|
|
171
163
|
|
|
172
164
|
render(App);
|
|
173
165
|
});
|
|
174
166
|
|
|
175
167
|
it('tests most complex generic arrow function with return type', () => {
|
|
176
|
-
function App() {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
168
|
+
function App() @{
|
|
169
|
+
function getBuilder() {
|
|
170
|
+
return <T,>() => ({
|
|
171
|
+
build<V, T, U>(): { build: () => V; data: T; key: U } {
|
|
172
|
+
return {
|
|
173
|
+
build(): V {
|
|
174
|
+
return 42 as V;
|
|
175
|
+
},
|
|
176
|
+
data: undefined as T,
|
|
177
|
+
key: undefined as U,
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
type ResultType = string;
|
|
183
|
+
const f = getBuilder()<ResultType>().build<number, object, string>();
|
|
184
|
+
<>
|
|
191
185
|
<div class="still-works">
|
|
192
186
|
<span>{'Test'}</span>
|
|
193
187
|
</div>
|
|
194
|
-
type ResultType = string;
|
|
195
|
-
const f = getBuilder()<ResultType>().build<number, object, string>();
|
|
196
188
|
<div>{f}</div>
|
|
197
|
-
|
|
189
|
+
</>
|
|
198
190
|
}
|
|
199
191
|
|
|
200
192
|
render(App);
|
|
@@ -2,16 +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
|
-
function URLTest() {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
function 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
10
|
<button onClick={() => (url.pathname = '/users/456')}>{'Change User'}</button>
|
|
11
11
|
<button onClick={() => url.searchParams.set('tab', 'settings')}>{'Change Tab'}</button>
|
|
12
12
|
<pre>{`User ID: ${userId}`}</pre>
|
|
13
13
|
<pre>{`Active Tab: ${activeTab}`}</pre>
|
|
14
|
-
|
|
14
|
+
</>
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
render(URLTest);
|
|
@@ -39,33 +39,29 @@ describe('RippleURL > derived', () => {
|
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
it('maintains reactivity across multiple components', () => {
|
|
42
|
-
function ParentTest() {
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
function ParentTest() @{
|
|
43
|
+
const url = RippleURL('https://example.com/path?count=0');
|
|
44
|
+
<>
|
|
45
45
|
<ChildA {url} />
|
|
46
46
|
<ChildB {url} />
|
|
47
|
-
|
|
47
|
+
</>
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
function ChildA({ url }: { url: RippleURL }) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
>
|
|
58
|
-
{'Increment Count'}
|
|
59
|
-
</button>
|
|
60
|
-
</>;
|
|
50
|
+
function ChildA({ url }: { url: RippleURL }) @{
|
|
51
|
+
<button
|
|
52
|
+
onClick={() => {
|
|
53
|
+
const current = parseInt(url.searchParams.get('count') || '0', 10);
|
|
54
|
+
url.searchParams.set('count', String(current + 1));
|
|
55
|
+
}}
|
|
56
|
+
>{'Increment Count'}</button>
|
|
61
57
|
}
|
|
62
58
|
|
|
63
|
-
function ChildB({ url }: { url: RippleURL }) {
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
function ChildB({ url }: { url: RippleURL }) @{
|
|
60
|
+
let &[count] = track(() => url.searchParams.get('count'));
|
|
61
|
+
<>
|
|
66
62
|
<pre>{url.href}</pre>
|
|
67
63
|
<pre>{count}</pre>
|
|
68
|
-
|
|
64
|
+
</>
|
|
69
65
|
}
|
|
70
66
|
|
|
71
67
|
render(ParentTest);
|
|
@@ -2,9 +2,9 @@ import { RippleURL, flushSync } from 'ripple';
|
|
|
2
2
|
|
|
3
3
|
describe('RippleURL > parsing', () => {
|
|
4
4
|
it('creates URL from string with reactivity', () => {
|
|
5
|
-
function URLTest() {
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
function URLTest() @{
|
|
6
|
+
const url = RippleURL('https://example.com:8080/path?foo=bar#section');
|
|
7
|
+
<>
|
|
8
8
|
<pre>{url.href}</pre>
|
|
9
9
|
<pre>{url.protocol}</pre>
|
|
10
10
|
<pre>{url.hostname}</pre>
|
|
@@ -12,7 +12,7 @@ describe('RippleURL > parsing', () => {
|
|
|
12
12
|
<pre>{url.pathname}</pre>
|
|
13
13
|
<pre>{url.search}</pre>
|
|
14
14
|
<pre>{url.hash}</pre>
|
|
15
|
-
|
|
15
|
+
</>
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
render(URLTest);
|
|
@@ -29,12 +29,12 @@ describe('RippleURL > parsing', () => {
|
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
it('creates URL from string with base URL', () => {
|
|
32
|
-
function URLTest() {
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
function URLTest() @{
|
|
33
|
+
const url = RippleURL('/path?query=value', 'https://example.com');
|
|
34
|
+
<>
|
|
35
35
|
<pre>{url.href}</pre>
|
|
36
36
|
<pre>{url.origin}</pre>
|
|
37
|
-
|
|
37
|
+
</>
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
render(URLTest);
|
|
@@ -46,13 +46,13 @@ describe('RippleURL > parsing', () => {
|
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
it('handles URL encoding correctly', () => {
|
|
49
|
-
function URLTest() {
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
function URLTest() @{
|
|
50
|
+
const url = RippleURL('https://example.com/path with spaces?key=value with spaces');
|
|
51
|
+
<>
|
|
52
52
|
<pre>{url.pathname}</pre>
|
|
53
53
|
<pre>{url.search}</pre>
|
|
54
54
|
<pre>{url.href}</pre>
|
|
55
|
-
|
|
55
|
+
</>
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
render(URLTest);
|
|
@@ -65,13 +65,13 @@ describe('RippleURL > parsing', () => {
|
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
it('handles URL with file protocol', () => {
|
|
68
|
-
function URLTest() {
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
function URLTest() @{
|
|
69
|
+
const url = RippleURL('file:///Users/username/documents/file.txt');
|
|
70
|
+
<>
|
|
71
71
|
<pre>{url.protocol}</pre>
|
|
72
72
|
<pre>{url.pathname}</pre>
|
|
73
73
|
<pre>{url.href}</pre>
|
|
74
|
-
|
|
74
|
+
</>
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
render(URLTest);
|
|
@@ -86,13 +86,13 @@ describe('RippleURL > parsing', () => {
|
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
it('handles URL with IPv4 address', () => {
|
|
89
|
-
function URLTest() {
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
function URLTest() @{
|
|
90
|
+
const url = RippleURL('https://192.168.1.1:8080/path');
|
|
91
|
+
<>
|
|
92
92
|
<button onClick={() => (url.hostname = '10.0.0.1')}>{'Change IP'}</button>
|
|
93
93
|
<pre>{url.href}</pre>
|
|
94
94
|
<pre>{url.hostname}</pre>
|
|
95
|
-
|
|
95
|
+
</>
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
render(URLTest);
|
|
@@ -112,14 +112,14 @@ describe('RippleURL > parsing', () => {
|
|
|
112
112
|
});
|
|
113
113
|
|
|
114
114
|
it('handles URL with localhost', () => {
|
|
115
|
-
function URLTest() {
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
function URLTest() @{
|
|
116
|
+
const url = RippleURL('http://localhost:3000/api/data');
|
|
117
|
+
<>
|
|
118
118
|
<button onClick={() => (url.port = '8080')}>{'Change Port'}</button>
|
|
119
119
|
<pre>{url.href}</pre>
|
|
120
120
|
<pre>{url.hostname}</pre>
|
|
121
121
|
<pre>{url.port}</pre>
|
|
122
|
-
|
|
122
|
+
</>
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
render(URLTest);
|
|
@@ -141,15 +141,15 @@ describe('RippleURL > parsing', () => {
|
|
|
141
141
|
});
|
|
142
142
|
|
|
143
143
|
it('handles URL with multiple path segments', () => {
|
|
144
|
-
function URLTest() {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
<button
|
|
148
|
-
{
|
|
149
|
-
</button>
|
|
144
|
+
function URLTest() @{
|
|
145
|
+
const url = RippleURL('https://example.com/api/v1/users/123/profile');
|
|
146
|
+
<>
|
|
147
|
+
<button
|
|
148
|
+
onClick={() => (url.pathname = '/api/v2/users/456/settings')}
|
|
149
|
+
>{'Change Path'}</button>
|
|
150
150
|
<pre>{url.pathname}</pre>
|
|
151
151
|
<pre>{url.href}</pre>
|
|
152
|
-
|
|
152
|
+
</>
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
render(URLTest);
|
|
@@ -173,12 +173,12 @@ describe('RippleURL > parsing', () => {
|
|
|
173
173
|
});
|
|
174
174
|
|
|
175
175
|
it('handles relative URL paths correctly', () => {
|
|
176
|
-
function URLTest() {
|
|
177
|
-
|
|
178
|
-
|
|
176
|
+
function URLTest() @{
|
|
177
|
+
const url = RippleURL('../sibling/path', 'https://example.com/parent/current');
|
|
178
|
+
<>
|
|
179
179
|
<pre>{url.href}</pre>
|
|
180
180
|
<pre>{url.pathname}</pre>
|
|
181
|
-
|
|
181
|
+
</>
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
render(URLTest);
|