ripple 0.3.128 → 0.4.0
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 +267 -0
- package/package.json +10 -4
- package/src/runtime/element.js +23 -6
- package/src/runtime/index-client.js +81 -41
- package/src/runtime/index-server.js +1 -0
- package/src/runtime/internal/client/blocks.js +173 -91
- package/src/runtime/internal/client/component.js +4 -30
- package/src/runtime/internal/client/composite.js +12 -13
- package/src/runtime/internal/client/constants.js +9 -0
- package/src/runtime/internal/client/context.js +12 -19
- package/src/runtime/internal/client/css.js +7 -9
- package/src/runtime/internal/client/events.js +178 -90
- package/src/runtime/internal/client/expression.js +45 -25
- package/src/runtime/internal/client/for.js +409 -129
- package/src/runtime/internal/client/head.js +10 -5
- package/src/runtime/internal/client/html.js +1 -0
- package/src/runtime/internal/client/hydration.js +152 -10
- package/src/runtime/internal/client/if.js +239 -50
- package/src/runtime/internal/client/index.js +4 -12
- package/src/runtime/internal/client/operations.js +40 -61
- package/src/runtime/internal/client/portal.js +163 -85
- package/src/runtime/internal/client/render.js +39 -39
- package/src/runtime/internal/client/rpc.js +3 -3
- package/src/runtime/internal/client/runtime.js +592 -433
- package/src/runtime/internal/client/selector.js +5 -2
- package/src/runtime/internal/client/template.js +133 -158
- package/src/runtime/internal/client/transport.js +38 -0
- package/src/runtime/internal/client/try.js +465 -426
- package/src/runtime/internal/client/types.d.ts +56 -23
- package/src/runtime/internal/client/utils.js +1 -3
- package/src/runtime/internal/server/dynamic.js +20 -21
- package/src/runtime/internal/server/index.js +325 -275
- package/src/runtime/internal/server/rpc.js +3 -2
- package/src/runtime/internal/server/transport.js +16 -0
- package/src/runtime/transport.js +21 -0
- package/tests/client/__snapshots__/for.test.tsrx.snap +0 -5
- package/tests/client/array/array.copy-within.test.tsrx +12 -12
- package/tests/client/array/array.derived.test.tsrx +46 -46
- package/tests/client/array/array.iteration.test.tsrx +10 -10
- package/tests/client/array/array.mutations.test.tsrx +20 -20
- package/tests/client/array/array.static.test.tsrx +11 -11
- package/tests/client/array/array.to-methods.test.tsrx +6 -6
- package/tests/client/async-suspend.test.tsrx +74 -75
- package/tests/client/basic/basic.attributes.test.tsrx +86 -83
- package/tests/client/basic/basic.collections.test.tsrx +12 -12
- package/tests/client/basic/basic.components.test.tsrx +99 -25
- package/tests/client/basic/basic.errors.test.tsrx +18 -18
- package/tests/client/basic/basic.events.test.tsrx +42 -42
- package/tests/client/basic/basic.get-set.test.tsrx +8 -8
- package/tests/client/basic/basic.reactivity.test.tsrx +73 -38
- package/tests/client/basic/basic.rendering.test.tsrx +25 -25
- package/tests/client/basic/basic.utilities.test.tsrx +3 -3
- package/tests/client/boundaries.test.tsrx +8 -8
- package/tests/client/boxed-locals.test.tsrx +452 -0
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.tsrx.snap +6 -6
- package/tests/client/compiler/compiler.assignments.test.tsrx +9 -73
- package/tests/client/compiler/compiler.attributes.test.tsrx +23 -23
- package/tests/client/compiler/compiler.basic.test.tsrx +15 -60
- package/tests/client/compiler/compiler.tracked-access.test.tsrx +18 -43
- package/tests/client/compiler/compiler.try-in-function.test.tsrx +2 -2
- package/tests/client/composite/__snapshots__/composite.render.test.tsrx.snap +0 -1
- package/tests/client/composite/composite.dynamic-components.test.tsrx +77 -6
- package/tests/client/composite/composite.props.test.tsrx +149 -12
- package/tests/client/composite/composite.reactivity.test.tsrx +51 -52
- package/tests/client/composite/composite.render.test.tsrx +26 -9
- package/tests/client/css/scoped-styles.test.tsrx +8 -8
- package/tests/client/date.test.tsrx +42 -42
- package/tests/client/derived-release.test.tsrx +370 -0
- package/tests/client/dynamic-elements.test.tsrx +45 -45
- package/tests/client/events.test.tsrx +97 -71
- package/tests/client/for-selector.test.tsrx +14 -14
- package/tests/client/for-single-root-items.test.tsrx +118 -3
- package/tests/client/for.test.tsrx +332 -31
- package/tests/client/head.test.tsrx +19 -19
- package/tests/client/html.test.tsrx +11 -9
- package/tests/client/if-block.test.tsrx +80 -0
- package/tests/client/map.test.tsrx +16 -16
- package/tests/client/media-query.test.tsrx +7 -7
- package/tests/client/portal.test.tsrx +224 -26
- package/tests/client/primitive-text.test.tsrx +50 -0
- package/tests/client/prop-kind-switch.test.tsrx +141 -0
- package/tests/client/ref.test.tsrx +17 -17
- package/tests/client/return.test.tsrx +26 -3
- package/tests/client/root-boundary.test.tsrx +42 -0
- package/tests/client/scoped-flush.test.tsrx +8 -8
- package/tests/client/set.test.tsrx +6 -6
- package/tests/client/svg.test.tsrx +11 -11
- package/tests/client/switch.test.tsrx +44 -44
- package/tests/client/track-async-hydration.test.tsrx +4 -4
- package/tests/client/try.test.tsrx +151 -83
- package/tests/client/tsx.test.tsrx +43 -40
- package/tests/client/url/url.derived.test.tsrx +6 -6
- package/tests/client/url-search-params/url-search-params.derived.test.tsrx +8 -8
- package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +10 -10
- package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +10 -10
- package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +18 -18
- package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +2 -2
- package/tests/hydration/basic.test.js +74 -1
- package/tests/hydration/build-components.js +22 -1
- package/tests/hydration/compiled/client/basic.js +1142 -713
- package/tests/hydration/compiled/client/composite.js +151 -100
- package/tests/hydration/compiled/client/events.js +184 -171
- package/tests/hydration/compiled/client/for.js +1472 -1132
- package/tests/hydration/compiled/client/fragment-cursor.js +2341 -0
- package/tests/hydration/compiled/client/head.js +254 -201
- package/tests/hydration/compiled/client/hmr.js +54 -41
- package/tests/hydration/compiled/client/html-in-template.js +54 -39
- package/tests/hydration/compiled/client/html.js +1633 -1263
- package/tests/hydration/compiled/client/if-children.js +420 -270
- package/tests/hydration/compiled/client/if-fragment-controlflow.js +363 -317
- package/tests/hydration/compiled/client/if.js +229 -219
- package/tests/hydration/compiled/client/mixed-control-flow.js +420 -404
- package/tests/hydration/compiled/client/nested-control-flow.js +1326 -1277
- package/tests/hydration/compiled/client/portal.js +87 -95
- package/tests/hydration/compiled/client/reactivity.js +135 -101
- package/tests/hydration/compiled/client/return.js +28 -19
- package/tests/hydration/compiled/client/streaming.js +390 -306
- package/tests/hydration/compiled/client/switch.js +258 -266
- package/tests/hydration/compiled/client/track-async-serialization.js +448 -280
- package/tests/hydration/compiled/client/try.js +173 -129
- package/tests/hydration/compiled/client/typed-text.js +71 -0
- package/tests/hydration/compiled/fixtures/money.js +10 -0
- package/tests/hydration/compiled/server/basic.js +123 -6
- package/tests/hydration/compiled/server/composite.js +16 -30
- package/tests/hydration/compiled/server/events.js +66 -18
- package/tests/hydration/compiled/server/for.js +117 -41
- package/tests/hydration/compiled/server/fragment-cursor.js +1687 -0
- package/tests/hydration/compiled/server/head.js +20 -20
- package/tests/hydration/compiled/server/hmr.js +2 -2
- package/tests/hydration/compiled/server/html.js +70 -238
- package/tests/hydration/compiled/server/if-children.js +107 -15
- package/tests/hydration/compiled/server/if.js +11 -15
- package/tests/hydration/compiled/server/mixed-control-flow.js +8 -8
- package/tests/hydration/compiled/server/portal.js +14 -22
- package/tests/hydration/compiled/server/reactivity.js +14 -14
- package/tests/hydration/compiled/server/streaming.js +19 -19
- package/tests/hydration/compiled/server/switch.js +8 -8
- package/tests/hydration/compiled/server/track-async-serialization.js +150 -23
- package/tests/hydration/compiled/server/try.js +8 -8
- package/tests/hydration/compiled/server/typed-text.js +17 -0
- package/tests/hydration/components/basic.tsrx +44 -8
- package/tests/hydration/components/composite.tsrx +2 -2
- package/tests/hydration/components/events.tsrx +25 -25
- package/tests/hydration/components/for.tsrx +115 -67
- package/tests/hydration/components/fragment-cursor.tsrx +650 -0
- package/tests/hydration/components/head.tsrx +16 -16
- package/tests/hydration/components/hmr.tsrx +2 -2
- package/tests/hydration/components/html.tsrx +7 -7
- package/tests/hydration/components/if-children.tsrx +72 -25
- package/tests/hydration/components/if.tsrx +18 -18
- package/tests/hydration/components/mixed-control-flow.tsrx +11 -11
- package/tests/hydration/components/portal.tsrx +3 -3
- package/tests/hydration/components/reactivity.tsrx +16 -16
- package/tests/hydration/components/streaming.tsrx +20 -20
- package/tests/hydration/components/switch.tsrx +20 -20
- package/tests/hydration/components/text-types.ts +4 -0
- package/tests/hydration/components/track-async-serialization.tsrx +80 -26
- package/tests/hydration/components/try.tsrx +8 -8
- package/tests/hydration/components/typed-text.tsrx +22 -0
- package/tests/hydration/fixtures/money.js +10 -0
- package/tests/hydration/for.test.js +36 -0
- package/tests/hydration/fragment-cursor.test.js +111 -0
- package/tests/hydration/if-children.test.js +24 -0
- package/tests/hydration/streaming.test.js +19 -0
- package/tests/hydration/track-async-serialization.test.js +87 -2
- package/tests/hydration/tsconfig.text-types.json +10 -0
- package/tests/hydration/typed-text.test.js +34 -0
- package/tests/server/await.test.tsrx +3 -3
- package/tests/server/basic.attributes.test.tsrx +42 -42
- package/tests/server/basic.components.test.tsrx +64 -8
- package/tests/server/basic.test.tsrx +34 -32
- package/tests/server/compiler.test.tsrx +1 -70
- package/tests/server/composite.props.test.tsrx +6 -6
- package/tests/server/dynamic-elements.test.tsrx +31 -8
- package/tests/server/for.test.tsrx +94 -0
- package/tests/server/head.test.tsrx +11 -11
- package/tests/server/scoped-styles.test.tsrx +2 -2
- package/tests/server/streaming-ssr.test.tsrx +48 -43
- package/tests/server/track-async-serialization.test.tsrx +204 -21
- package/tests/server/try.test.tsrx +48 -48
- package/tests/types/transport.ts +40 -0
- package/tests/utils/vite-plugin-config.test.js +23 -0
- package/types/index.d.ts +48 -7
- package/types/server.d.ts +3 -0
- package/types/transport.d.ts +15 -0
- package/src/runtime/internal/client/switch.js +0 -113
- package/src/utils/errors.js +0 -13
- package/tests/client/lazy-array.test.tsrx +0 -31
- package/tests/client/lazy-destructuring.test.tsrx +0 -438
- package/tests/client/tracked-index-access.test.tsrx +0 -113
- package/tests/server/lazy-destructuring.test.tsrx +0 -595
- package/tests/server/tracked-index-access.test.tsrx +0 -76
|
@@ -1,595 +0,0 @@
|
|
|
1
|
-
import type { Tracked } from 'ripple';
|
|
2
|
-
import { track } from 'ripple';
|
|
3
|
-
|
|
4
|
-
describe('lazy destructuring', () => {
|
|
5
|
-
it('supports tracked value getter and setter', async () => {
|
|
6
|
-
function Test() @{
|
|
7
|
-
let count = track(1);
|
|
8
|
-
let derived = track(() => count.value * 2);
|
|
9
|
-
count.value = 3;
|
|
10
|
-
<pre>{`${count.value}-${derived.value}`}</pre>
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const { body } = await render(Test);
|
|
14
|
-
expect(body).toBeHtml('<pre>3-6</pre>');
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('lazily accesses object properties', async () => {
|
|
18
|
-
function Inner(&{ a, b }: { a: number; b: string }) @{
|
|
19
|
-
<pre>{`${a}-${b}`}</pre>
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function Test() @{
|
|
23
|
-
<Inner a={1} b="hello" />
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const { body } = await render(Test);
|
|
27
|
-
expect(body).toBeHtml('<pre>1-hello</pre>');
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('supports default values in lazy object destructuring', async () => {
|
|
31
|
-
function Test() @{
|
|
32
|
-
const obj: { a: number; b?: number } = { a: 5 };
|
|
33
|
-
const &{ a, b = 99 } = obj;
|
|
34
|
-
<pre>{`${a}-${b}`}</pre>
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const { body } = await render(Test);
|
|
38
|
-
expect(body).toBeHtml('<pre>5-99</pre>');
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('supports nested lazy destructuring in non-lazy component params', async () => {
|
|
42
|
-
function Inner({ something: &[first, second] }: { something: Tracked<number> }) @{
|
|
43
|
-
first = second.value + 1;
|
|
44
|
-
<pre>{`${first}-${second.value}`}</pre>
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function Test() @{
|
|
48
|
-
<Inner something={track(1)} />
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const { body } = await render(Test);
|
|
52
|
-
expect(body).toBeHtml('<pre>2-2</pre>');
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('supports let lazy destructuring with assignment writeback', async () => {
|
|
56
|
-
function Test() @{
|
|
57
|
-
const obj = { a: 1, b: 2 };
|
|
58
|
-
let &{ a, b } = obj;
|
|
59
|
-
a = 10;
|
|
60
|
-
b = 20;
|
|
61
|
-
<pre>{`${obj.a}-${obj.b}`}</pre>
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const { body } = await render(Test);
|
|
65
|
-
expect(body).toBeHtml('<pre>10-20</pre>');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('supports compound assignment operators on lazy bindings', async () => {
|
|
69
|
-
function Test() @{
|
|
70
|
-
const obj = { a: 5, b: 10 };
|
|
71
|
-
let &{ a, b } = obj;
|
|
72
|
-
a += 3;
|
|
73
|
-
b *= 2;
|
|
74
|
-
<pre>{`${obj.a}-${obj.b}`}</pre>
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const { body } = await render(Test);
|
|
78
|
-
expect(body).toBeHtml('<pre>8-20</pre>');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('supports update expressions on lazy bindings', async () => {
|
|
82
|
-
function Test() @{
|
|
83
|
-
const obj = { count: 0 };
|
|
84
|
-
let &{ count } = obj;
|
|
85
|
-
count++;
|
|
86
|
-
count++;
|
|
87
|
-
count--;
|
|
88
|
-
<pre>{obj.count}</pre>
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const { body } = await render(Test);
|
|
92
|
-
expect(body).toBeHtml('<pre>1</pre>');
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('supports update expressions on lazy bindings with default values', async () => {
|
|
96
|
-
function Test() @{
|
|
97
|
-
const obj: { count?: number } = {};
|
|
98
|
-
let &{ count = 0 } = obj;
|
|
99
|
-
count++;
|
|
100
|
-
count++;
|
|
101
|
-
<pre>{obj.count}</pre>
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const { body } = await render(Test);
|
|
105
|
-
expect(body).toBeHtml('<pre>2</pre>');
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('supports function params with lazy destructuring and default values', async () => {
|
|
109
|
-
function Test() @{
|
|
110
|
-
function calc(&{ x, y = 100 }: { x: number; y?: number }) {
|
|
111
|
-
return x + y;
|
|
112
|
-
}
|
|
113
|
-
const a = calc({ x: 5, y: 10 });
|
|
114
|
-
const b = calc({ x: 5 });
|
|
115
|
-
<pre>{`${a}-${b}`}</pre>
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const { body } = await render(Test);
|
|
119
|
-
expect(body).toBeHtml('<pre>15-105</pre>');
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('supports nested lazy destructuring in non-lazy function params', async () => {
|
|
123
|
-
function Test() @{
|
|
124
|
-
const something = track(1);
|
|
125
|
-
function getInfo({ something: &[first, second] }: { something: Tracked<number> }) {
|
|
126
|
-
first = second.value + 1;
|
|
127
|
-
return `${first}-${second.value}`;
|
|
128
|
-
}
|
|
129
|
-
<pre>{getInfo({ something })}</pre>
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const { body } = await render(Test);
|
|
133
|
-
expect(body).toBeHtml('<pre>2-2</pre>');
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it(
|
|
137
|
-
'preserves lazy getter/setter behavior for RestElement nested destructuring in non-lazy component params',
|
|
138
|
-
async () => {
|
|
139
|
-
function Inner({
|
|
140
|
-
values: [head, ...&{ 0: first_rest, length: rest_length }],
|
|
141
|
-
}: {
|
|
142
|
-
values: number[];
|
|
143
|
-
}) @{
|
|
144
|
-
const before = `${first_rest}-${rest_length}`;
|
|
145
|
-
rest_length = 0;
|
|
146
|
-
<pre>{`${head}-${before}-${first_rest}-${rest_length}`}</pre>
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function Test() @{
|
|
150
|
-
<Inner values={[10, 20, 30]} />
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const { body } = await render(Test);
|
|
154
|
-
expect(body).toBeHtml('<pre>10-20-2-undefined-0</pre>');
|
|
155
|
-
},
|
|
156
|
-
);
|
|
157
|
-
|
|
158
|
-
it(
|
|
159
|
-
'preserves lazy getter/setter behavior for RestElement nested destructuring in non-lazy function params',
|
|
160
|
-
async () => {
|
|
161
|
-
function Test() @{
|
|
162
|
-
function getInfo({
|
|
163
|
-
values: [head, ...&{ 0: first_rest, length: rest_length }],
|
|
164
|
-
}: {
|
|
165
|
-
values: number[];
|
|
166
|
-
}) {
|
|
167
|
-
const before = `${first_rest}-${rest_length}`;
|
|
168
|
-
rest_length = 0;
|
|
169
|
-
return `${head}-${before}-${first_rest}-${rest_length}`;
|
|
170
|
-
}
|
|
171
|
-
<pre>{getInfo({ values: [5, 6, 7] })}</pre>
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const { body } = await render(Test);
|
|
175
|
-
expect(body).toBeHtml('<pre>5-6-2-undefined-0</pre>');
|
|
176
|
-
},
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
it('supports member access on lazy destructured objects', async () => {
|
|
180
|
-
function Test() @{
|
|
181
|
-
const obj = { user: { name: 'Alice', age: 30 } };
|
|
182
|
-
const &{ user } = obj;
|
|
183
|
-
<pre>{`${user.name}-${user.age}`}</pre>
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const { body } = await render(Test);
|
|
187
|
-
expect(body).toBeHtml('<pre>Alice-30</pre>');
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it('preserves numeric member access on lazy array value bindings', async () => {
|
|
191
|
-
function Child({ pair: &[first] }: { pair: [{ 0: string }] }) @{
|
|
192
|
-
<pre>{first[0]}</pre>
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function Test() @{
|
|
196
|
-
<Child pair={[{ 0: 'x' }]} />
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const { body } = await render(Test);
|
|
200
|
-
expect(body).toBeHtml('<pre>x</pre>');
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
it('supports rest in lazy array destructuring for tracked tuples (iterable)', async () => {
|
|
204
|
-
function Test() @{
|
|
205
|
-
let tracked_value = track(0);
|
|
206
|
-
let &[value, ...rest] = tracked_value;
|
|
207
|
-
<pre>{`${value}-${rest.length}-${rest[0] === tracked_value}`}</pre>
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
const { body } = await render(Test);
|
|
211
|
-
expect(body).toBeHtml('<pre>0-1-true</pre>');
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it('supports rest in lazy array destructuring for length-only array-like values', async () => {
|
|
215
|
-
function Test() @{
|
|
216
|
-
const array_like = { 0: 'x', 1: 'y', 2: 'z', length: 3 };
|
|
217
|
-
const &[first, ...rest] = array_like;
|
|
218
|
-
<pre>{`${first}-${rest.join('')}`}</pre>
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
const { body } = await render(Test);
|
|
222
|
-
expect(body).toBeHtml('<pre>x-yz</pre>');
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
it('supports rest in lazy array destructuring for iterable values', async () => {
|
|
226
|
-
function Test() @{
|
|
227
|
-
const source = {
|
|
228
|
-
*[Symbol.iterator]() {
|
|
229
|
-
yield 'x';
|
|
230
|
-
yield 'y';
|
|
231
|
-
yield 'z';
|
|
232
|
-
},
|
|
233
|
-
};
|
|
234
|
-
const &[first, ...rest] = source;
|
|
235
|
-
<pre>{`${first}-${rest.join('')}`}</pre>
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
const { body } = await render(Test);
|
|
239
|
-
expect(body).toBeHtml('<pre>x-yz</pre>');
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
it('supports standalone lazy array destructuring with track()', async () => {
|
|
243
|
-
function Test() @{
|
|
244
|
-
let count;
|
|
245
|
-
&[count] = track(0);
|
|
246
|
-
<div>{count}</div>
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const { body } = await render(Test);
|
|
250
|
-
expect(body).toBeHtml('<div>0</div>');
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
it('supports direct value access on tracked values during SSR', async () => {
|
|
254
|
-
function Test() @{
|
|
255
|
-
let tracked = track(0);
|
|
256
|
-
++tracked.value;
|
|
257
|
-
tracked.value++;
|
|
258
|
-
tracked.value = tracked.value + 1;
|
|
259
|
-
let value = tracked.value;
|
|
260
|
-
let ref = tracked;
|
|
261
|
-
<pre>{`${value}-${ref === tracked}`}</pre>
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
const { body } = await render(Test);
|
|
265
|
-
expect(body).toBeHtml('<pre>3-true</pre>');
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it('supports lazy destructured tracked ref value access during SSR', async () => {
|
|
269
|
-
function Child({ pair: &[value, tracked_ref] }: { pair: Tracked<number> }) @{
|
|
270
|
-
++tracked_ref.value;
|
|
271
|
-
tracked_ref.value++;
|
|
272
|
-
<pre>{`${value}-${tracked_ref.value}`}</pre>
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
function Test() @{
|
|
276
|
-
let tracked = track(0);
|
|
277
|
-
<Child pair={tracked} />
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const { body } = await render(Test);
|
|
281
|
-
expect(body).toBeHtml('<pre>2-2</pre>');
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
it('supports standalone lazy object destructuring', async () => {
|
|
285
|
-
function Test() @{
|
|
286
|
-
let a;
|
|
287
|
-
let b;
|
|
288
|
-
&{ a, b } = { a: 10, b: 20 };
|
|
289
|
-
<pre>{`${a}-${b}`}</pre>
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
const { body } = await render(Test);
|
|
293
|
-
expect(body).toBeHtml('<pre>10-20</pre>');
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
describe('nested lazy destructuring', () => {
|
|
297
|
-
it('preserves nested lazy object access inside lazy object as component params', async () => {
|
|
298
|
-
let inner_value = 7;
|
|
299
|
-
|
|
300
|
-
function Inner(&{ outer: &{ inner } }: { outer: { inner: number } }) @{
|
|
301
|
-
const before = inner;
|
|
302
|
-
inner_value = 8;
|
|
303
|
-
<pre>{`${before}-${inner}`}</pre>
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function Test() @{
|
|
307
|
-
const outer = {
|
|
308
|
-
get inner() {
|
|
309
|
-
return inner_value;
|
|
310
|
-
},
|
|
311
|
-
};
|
|
312
|
-
<Inner {outer} />
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
const { body } = await render(Test);
|
|
316
|
-
expect(body).toBeHtml('<pre>7-8</pre>');
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
it('preserves nested lazy array access inside regular object as component params', async () => {
|
|
320
|
-
let first_value = 3;
|
|
321
|
-
let second_value = 4;
|
|
322
|
-
|
|
323
|
-
function Inner({ pair: &[first, second] }: { pair: [number, number] }) @{
|
|
324
|
-
const before = `${first}-${second}`;
|
|
325
|
-
first_value = 5;
|
|
326
|
-
second_value = 6;
|
|
327
|
-
<pre>{`${before}-${first}-${second}`}</pre>
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
function Test() @{
|
|
331
|
-
const pair = [0, 0] as [number, number];
|
|
332
|
-
Object.defineProperty(pair, 0, { get: () => first_value });
|
|
333
|
-
Object.defineProperty(pair, 1, { get: () => second_value });
|
|
334
|
-
<Inner {pair} />
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
const { body } = await render(Test);
|
|
338
|
-
expect(body).toBeHtml('<pre>3-4-5-6</pre>');
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
it('preserves nested lazy object access inside lazy array as function params', async () => {
|
|
342
|
-
function Test() @{
|
|
343
|
-
let name_value = 'Alice';
|
|
344
|
-
function getName(&[&{ name }]: [{ name: string }]) {
|
|
345
|
-
const before = name;
|
|
346
|
-
name_value = 'Bob';
|
|
347
|
-
return `${before}-${name}`;
|
|
348
|
-
}
|
|
349
|
-
const user = {
|
|
350
|
-
get name() {
|
|
351
|
-
return name_value;
|
|
352
|
-
},
|
|
353
|
-
};
|
|
354
|
-
<pre>{getName([user])}</pre>
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
const { body } = await render(Test);
|
|
358
|
-
expect(body).toBeHtml('<pre>Alice-Bob</pre>');
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
it('preserves nested lazy array access inside lazy array as function params', async () => {
|
|
362
|
-
function Test() @{
|
|
363
|
-
let first_value = 5;
|
|
364
|
-
let second_value = 6;
|
|
365
|
-
function getValues(&[&[a, b]]: [[number, number]]) {
|
|
366
|
-
const before = `${a}-${b}`;
|
|
367
|
-
first_value = 7;
|
|
368
|
-
second_value = 8;
|
|
369
|
-
return `${before}-${a}-${b}`;
|
|
370
|
-
}
|
|
371
|
-
const pair = [0, 0] as [number, number];
|
|
372
|
-
Object.defineProperty(pair, 0, { get: () => first_value });
|
|
373
|
-
Object.defineProperty(pair, 1, { get: () => second_value });
|
|
374
|
-
<pre>{getValues([pair])}</pre>
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
const { body } = await render(Test);
|
|
378
|
-
expect(body).toBeHtml('<pre>5-6-7-8</pre>');
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
it('preserves three-level lazy object access as component params', async () => {
|
|
382
|
-
let c_value = 42;
|
|
383
|
-
|
|
384
|
-
function Inner(&{ a: &{ b: &{ c } } }: { a: { b: { c: number } } }) @{
|
|
385
|
-
const before = c;
|
|
386
|
-
c_value = 43;
|
|
387
|
-
<pre>{`${before}-${c}`}</pre>
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
function Test() @{
|
|
391
|
-
const a = {
|
|
392
|
-
b: {
|
|
393
|
-
get c() {
|
|
394
|
-
return c_value;
|
|
395
|
-
},
|
|
396
|
-
},
|
|
397
|
-
};
|
|
398
|
-
<Inner {a} />
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
const { body } = await render(Test);
|
|
402
|
-
expect(body).toBeHtml('<pre>42-43</pre>');
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
it('preserves nested lazy object access inside lazy object as function params', async () => {
|
|
406
|
-
function Test() @{
|
|
407
|
-
let inner_value = 11;
|
|
408
|
-
function getValue(&{ outer: &{ inner } }: { outer: { inner: number } }) {
|
|
409
|
-
const before = inner;
|
|
410
|
-
inner_value = 12;
|
|
411
|
-
return `${before}-${inner}`;
|
|
412
|
-
}
|
|
413
|
-
const outer = {
|
|
414
|
-
get inner() {
|
|
415
|
-
return inner_value;
|
|
416
|
-
},
|
|
417
|
-
};
|
|
418
|
-
<pre>{getValue({ outer })}</pre>
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
const { body } = await render(Test);
|
|
422
|
-
expect(body).toBeHtml('<pre>11-12</pre>');
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
it(
|
|
426
|
-
'supports nested lazy array inside lazy object as function params with writeback',
|
|
427
|
-
async () => {
|
|
428
|
-
function Test() @{
|
|
429
|
-
const obj = { pair: [1, 2] as [number, number] };
|
|
430
|
-
function bump(&{ pair: &[first, second] }: { pair: [number, number] }) {
|
|
431
|
-
first = first + 10;
|
|
432
|
-
second = second + 20;
|
|
433
|
-
}
|
|
434
|
-
bump(obj);
|
|
435
|
-
<pre>{`${obj.pair[0]}-${obj.pair[1]}`}</pre>
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
const { body } = await render(Test);
|
|
439
|
-
expect(body).toBeHtml('<pre>11-22</pre>');
|
|
440
|
-
},
|
|
441
|
-
);
|
|
442
|
-
|
|
443
|
-
it('preserves three-level lazy object access as function params', async () => {
|
|
444
|
-
function Test() @{
|
|
445
|
-
let c_value = 99;
|
|
446
|
-
function getValue(&{ a: &{ b: &{ c } } }: { a: { b: { c: number } } }) {
|
|
447
|
-
const before = c;
|
|
448
|
-
c_value = 100;
|
|
449
|
-
return `${before}-${c}`;
|
|
450
|
-
}
|
|
451
|
-
const a = {
|
|
452
|
-
b: {
|
|
453
|
-
get c() {
|
|
454
|
-
return c_value;
|
|
455
|
-
},
|
|
456
|
-
},
|
|
457
|
-
};
|
|
458
|
-
<pre>{getValue({ a })}</pre>
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
const { body } = await render(Test);
|
|
462
|
-
expect(body).toBeHtml('<pre>99-100</pre>');
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
it('preserves nested lazy object access inside lazy object in const declaration', async () => {
|
|
466
|
-
function Test() @{
|
|
467
|
-
let inner_value = 5;
|
|
468
|
-
const data = {
|
|
469
|
-
outer: {
|
|
470
|
-
get inner() {
|
|
471
|
-
return inner_value;
|
|
472
|
-
},
|
|
473
|
-
},
|
|
474
|
-
};
|
|
475
|
-
const &{ outer: &{ inner } } = data;
|
|
476
|
-
const before = inner;
|
|
477
|
-
inner_value = 6;
|
|
478
|
-
<pre>{`${before}-${inner}`}</pre>
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
const { body } = await render(Test);
|
|
482
|
-
expect(body).toBeHtml('<pre>5-6</pre>');
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
it('supports nested lazy object inside lazy object in let with writeback', async () => {
|
|
486
|
-
function Test() @{
|
|
487
|
-
const data = { outer: { inner: 5 } };
|
|
488
|
-
let &{ outer: &{ inner } } = data;
|
|
489
|
-
inner = 50;
|
|
490
|
-
<pre>{data.outer.inner}</pre>
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
const { body } = await render(Test);
|
|
494
|
-
expect(body).toBeHtml('<pre>50</pre>');
|
|
495
|
-
});
|
|
496
|
-
|
|
497
|
-
it('supports nested lazy array inside lazy object in let with writeback', async () => {
|
|
498
|
-
function Test() @{
|
|
499
|
-
const data = { pair: [1, 2] as [number, number] };
|
|
500
|
-
let &{ pair: &[first, second] } = data;
|
|
501
|
-
first = 100;
|
|
502
|
-
second = 200;
|
|
503
|
-
<pre>{`${data.pair[0]}-${data.pair[1]}`}</pre>
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
const { body } = await render(Test);
|
|
507
|
-
expect(body).toBeHtml('<pre>100-200</pre>');
|
|
508
|
-
});
|
|
509
|
-
|
|
510
|
-
it('supports three-level lazy object nesting in let with writeback', async () => {
|
|
511
|
-
function Test() @{
|
|
512
|
-
const data = { a: { b: { c: 1 } } };
|
|
513
|
-
let &{ a: &{ b: &{ c } } } = data;
|
|
514
|
-
c = 999;
|
|
515
|
-
<pre>{data.a.b.c}</pre>
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
const { body } = await render(Test);
|
|
519
|
-
expect(body).toBeHtml('<pre>999</pre>');
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
it('supports compound assignment on deeply nested lazy bindings', async () => {
|
|
523
|
-
function Test() @{
|
|
524
|
-
const data = { a: { b: { c: 5 } } };
|
|
525
|
-
let &{ a: &{ b: &{ c } } } = data;
|
|
526
|
-
c += 10;
|
|
527
|
-
c *= 2;
|
|
528
|
-
<pre>{data.a.b.c}</pre>
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
const { body } = await render(Test);
|
|
532
|
-
expect(body).toBeHtml('<pre>30</pre>');
|
|
533
|
-
});
|
|
534
|
-
|
|
535
|
-
it('preserves default values inside nested lazy destructuring', async () => {
|
|
536
|
-
function Test() @{
|
|
537
|
-
let inner_value: number | undefined;
|
|
538
|
-
const data: { outer: { inner?: number } } = {
|
|
539
|
-
outer: {
|
|
540
|
-
get inner() {
|
|
541
|
-
return inner_value;
|
|
542
|
-
},
|
|
543
|
-
},
|
|
544
|
-
};
|
|
545
|
-
const &{ outer: &{ inner = 42 } } = data;
|
|
546
|
-
const before = inner;
|
|
547
|
-
inner_value = 43;
|
|
548
|
-
<pre>{`${before}-${inner}`}</pre>
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
const { body } = await render(Test);
|
|
552
|
-
expect(body).toBeHtml('<pre>42-43</pre>');
|
|
553
|
-
});
|
|
554
|
-
|
|
555
|
-
it('preserves multiple sibling nested lazy destructures', async () => {
|
|
556
|
-
function Test() @{
|
|
557
|
-
let x_value = 1;
|
|
558
|
-
let y_value = 2;
|
|
559
|
-
const data = {
|
|
560
|
-
a: {
|
|
561
|
-
get x() {
|
|
562
|
-
return x_value;
|
|
563
|
-
},
|
|
564
|
-
},
|
|
565
|
-
b: {
|
|
566
|
-
get y() {
|
|
567
|
-
return y_value;
|
|
568
|
-
},
|
|
569
|
-
},
|
|
570
|
-
};
|
|
571
|
-
const &{ a: &{ x }, b: &{ y } } = data;
|
|
572
|
-
const before = `${x}-${y}`;
|
|
573
|
-
x_value = 3;
|
|
574
|
-
y_value = 4;
|
|
575
|
-
<pre>{`${before}-${x}-${y}`}</pre>
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
const { body } = await render(Test);
|
|
579
|
-
expect(body).toBeHtml('<pre>1-2-3-4</pre>');
|
|
580
|
-
});
|
|
581
|
-
|
|
582
|
-
it('supports multiple sibling nested lazy destructures with writeback', async () => {
|
|
583
|
-
function Test() @{
|
|
584
|
-
const data = { a: { x: 1 }, b: { y: 2 } };
|
|
585
|
-
let &{ a: &{ x }, b: &{ y } } = data;
|
|
586
|
-
x = 11;
|
|
587
|
-
y = 22;
|
|
588
|
-
<pre>{`${data.a.x}-${data.b.y}`}</pre>
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
const { body } = await render(Test);
|
|
592
|
-
expect(body).toBeHtml('<pre>11-22</pre>');
|
|
593
|
-
});
|
|
594
|
-
});
|
|
595
|
-
});
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { track } from 'ripple';
|
|
3
|
-
import {
|
|
4
|
-
lazy_array_get,
|
|
5
|
-
lazy_array_set,
|
|
6
|
-
lazy_array_update,
|
|
7
|
-
} from '../../src/runtime/internal/server/index.js';
|
|
8
|
-
|
|
9
|
-
const value_message = /Use \.value or &\[\] lazy destructuring/;
|
|
10
|
-
const reference_message = /Use the tracked value directly instead/;
|
|
11
|
-
const value_index = Number(0);
|
|
12
|
-
const reference_index = Number(1);
|
|
13
|
-
|
|
14
|
-
describe('server tracked numeric access', () => {
|
|
15
|
-
it('throws when tracked values are accessed through numeric properties', () => {
|
|
16
|
-
const values = [track(0)];
|
|
17
|
-
const value = values[0];
|
|
18
|
-
|
|
19
|
-
expect(() => value[value_index]).toThrow(value_message);
|
|
20
|
-
expect(() => {
|
|
21
|
-
value[value_index] = 1;
|
|
22
|
-
}).toThrow(value_message);
|
|
23
|
-
expect(() => value[reference_index]).toThrow(reference_message);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('throws when derived values are accessed through numeric properties', () => {
|
|
27
|
-
const values = [track(() => 1)];
|
|
28
|
-
const value = values[0];
|
|
29
|
-
|
|
30
|
-
expect(() => value[value_index]).toThrow(value_message);
|
|
31
|
-
expect(() => {
|
|
32
|
-
value[value_index] = 2;
|
|
33
|
-
}).toThrow(value_message);
|
|
34
|
-
expect(() => value[reference_index]).toThrow(reference_message);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('sets tracked lazy index 0 and rejects tracked lazy index 1', () => {
|
|
38
|
-
const value = track(0);
|
|
39
|
-
|
|
40
|
-
lazy_array_set(value, 2, 0);
|
|
41
|
-
expect(value.value).toBe(2);
|
|
42
|
-
expect(() => {
|
|
43
|
-
lazy_array_set(value, track(1), 1);
|
|
44
|
-
}).toThrow(reference_message);
|
|
45
|
-
expect(() => {
|
|
46
|
-
lazy_array_update(value, 1);
|
|
47
|
-
}).toThrow(reference_message);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('returns undefined for tracked lazy indexes past the tuple length', () => {
|
|
51
|
-
const value = track(0);
|
|
52
|
-
const derived = track(() => value.value + 1);
|
|
53
|
-
|
|
54
|
-
expect(lazy_array_get(value, 0)).toBe(0);
|
|
55
|
-
expect(lazy_array_get(value, 1)).toBe(value);
|
|
56
|
-
expect(lazy_array_get(value, 2)).toBeUndefined();
|
|
57
|
-
expect(lazy_array_get(derived, 0)).toBe(1);
|
|
58
|
-
expect(lazy_array_get(derived, 1)).toBe(derived);
|
|
59
|
-
expect(lazy_array_get(derived, 2)).toBeUndefined();
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('ignores tracked lazy writes past the tuple length', () => {
|
|
63
|
-
const value = track(0);
|
|
64
|
-
const derived = track(() => value.value + 1);
|
|
65
|
-
|
|
66
|
-
lazy_array_set(value, 10, 2);
|
|
67
|
-
lazy_array_update(value, 2);
|
|
68
|
-
lazy_array_set(derived, 20, 2);
|
|
69
|
-
lazy_array_update(derived, 2);
|
|
70
|
-
|
|
71
|
-
expect(lazy_array_get(value, 2)).toBeUndefined();
|
|
72
|
-
expect(lazy_array_get(derived, 2)).toBeUndefined();
|
|
73
|
-
expect(Object.hasOwn(value, 2)).toBe(false);
|
|
74
|
-
expect(Object.hasOwn(derived, 2)).toBe(false);
|
|
75
|
-
});
|
|
76
|
-
});
|