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
|
@@ -5,32 +5,32 @@ describe('async suspense', () => {
|
|
|
5
5
|
it('hides child content during re-suspension when tracked dependency changes', async () => {
|
|
6
6
|
let resolve_fn: (() => void) | null = null;
|
|
7
7
|
|
|
8
|
-
function Child({ countTracked }: { countTracked: Tracked<number> }) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
resolve_fn = resolve;
|
|
14
|
-
});
|
|
8
|
+
function Child({ countTracked }: { countTracked: Tracked<number> }) @{
|
|
9
|
+
trackAsync(() => {
|
|
10
|
+
countTracked.value;
|
|
11
|
+
return new Promise<void>((resolve) => {
|
|
12
|
+
resolve_fn = resolve;
|
|
15
13
|
});
|
|
14
|
+
});
|
|
15
|
+
<>
|
|
16
16
|
<div class="child-content">{'child content'}</div>
|
|
17
17
|
<div class="count">
|
|
18
18
|
{'count is: '}
|
|
19
19
|
{countTracked.value}
|
|
20
20
|
</div>
|
|
21
|
-
|
|
21
|
+
</>
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
function App() {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
try {
|
|
24
|
+
function App() @{
|
|
25
|
+
let &[count, countTracked] = track(0);
|
|
26
|
+
<>
|
|
27
|
+
@try {
|
|
28
28
|
<Child {countTracked} />
|
|
29
|
-
} pending {
|
|
29
|
+
} @pending {
|
|
30
30
|
<div class="pending">{'pending...'}</div>
|
|
31
31
|
}
|
|
32
32
|
<button onClick={() => count++}>{'Increment'}</button>
|
|
33
|
-
|
|
33
|
+
</>
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
render(App);
|
|
@@ -69,31 +69,29 @@ describe('async suspense', () => {
|
|
|
69
69
|
it('ignores settled promises after the surrounding boundary is destroyed', async () => {
|
|
70
70
|
let resolve_value: ((value: string) => void) | null = null;
|
|
71
71
|
|
|
72
|
-
function Child() {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
<div class="value">{value}</div>
|
|
80
|
-
</>;
|
|
72
|
+
function Child() @{
|
|
73
|
+
let &[value] = trackAsync(
|
|
74
|
+
() => new Promise<string>((resolve) => {
|
|
75
|
+
resolve_value = resolve;
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
<div class="value">{value}</div>
|
|
81
79
|
}
|
|
82
80
|
|
|
83
|
-
function App() {
|
|
84
|
-
|
|
85
|
-
|
|
81
|
+
function App() @{
|
|
82
|
+
let &[show] = track(true);
|
|
83
|
+
<>
|
|
86
84
|
<button onClick={() => (show = false)}>{'Hide'}</button>
|
|
87
|
-
if (show) {
|
|
88
|
-
try {
|
|
85
|
+
@if (show) {
|
|
86
|
+
@try {
|
|
89
87
|
<Child />
|
|
90
|
-
} pending {
|
|
88
|
+
} @pending {
|
|
91
89
|
<div class="pending">{'loading...'}</div>
|
|
92
90
|
}
|
|
93
|
-
} else {
|
|
91
|
+
} @else {
|
|
94
92
|
<div class="hidden">{'hidden'}</div>
|
|
95
93
|
}
|
|
96
|
-
|
|
94
|
+
</>
|
|
97
95
|
}
|
|
98
96
|
|
|
99
97
|
render(App);
|
|
@@ -139,25 +137,23 @@ describe('async suspense', () => {
|
|
|
139
137
|
return { promise, abortController };
|
|
140
138
|
}
|
|
141
139
|
|
|
142
|
-
function App() {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
try {
|
|
140
|
+
function App() @{
|
|
141
|
+
let &[query] = track('a');
|
|
142
|
+
<>
|
|
143
|
+
@try {
|
|
146
144
|
let &[value] = trackAsync(() => createRequest(query));
|
|
147
145
|
<div class="value">{value}</div>
|
|
148
|
-
} pending {
|
|
146
|
+
} @pending {
|
|
149
147
|
<div class="pending">{'loading...'}</div>
|
|
150
|
-
} catch (error) {
|
|
148
|
+
} @catch (error) {
|
|
151
149
|
<div class="error">{String(error)}</div>
|
|
152
150
|
}
|
|
153
151
|
<button
|
|
154
152
|
onClick={() => {
|
|
155
153
|
query = query === 'a' ? 'b' : 'c';
|
|
156
154
|
}}
|
|
157
|
-
>
|
|
158
|
-
|
|
159
|
-
</button>
|
|
160
|
-
</>;
|
|
155
|
+
>{'Next'}</button>
|
|
156
|
+
</>
|
|
161
157
|
}
|
|
162
158
|
|
|
163
159
|
render(App);
|
|
@@ -200,37 +196,37 @@ describe('async suspense', () => {
|
|
|
200
196
|
async () => {
|
|
201
197
|
let pending_render_count = 0;
|
|
202
198
|
|
|
203
|
-
function FilteredList({ queryTracked }: { queryTracked: Tracked<string> }) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
199
|
+
function FilteredList({ queryTracked }: { queryTracked: Tracked<string> }) @{
|
|
200
|
+
let &[query] = queryTracked;
|
|
201
|
+
let &[items] = trackAsync(
|
|
202
|
+
() => Promise.resolve(
|
|
203
|
+
!query ? ['apple', 'banana', 'cherry'] : ['avocado', 'blueberry', 'citrus'],
|
|
204
|
+
),
|
|
205
|
+
);
|
|
206
|
+
let &[filtered] = track(() => {
|
|
207
|
+
return items.filter((item: string) => item.includes(query));
|
|
208
|
+
});
|
|
209
|
+
<>
|
|
214
210
|
<ul>
|
|
215
|
-
for (let item of filtered) {
|
|
211
|
+
@for (let item of filtered) {
|
|
216
212
|
<li>{item}</li>
|
|
217
213
|
}
|
|
218
214
|
</ul>
|
|
219
215
|
<pre>{JSON.stringify(items)}</pre>
|
|
220
|
-
|
|
216
|
+
</>
|
|
221
217
|
}
|
|
222
218
|
|
|
223
|
-
function App() {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
try {
|
|
219
|
+
function App() @{
|
|
220
|
+
let &[query, queryTracked] = track('');
|
|
221
|
+
<>
|
|
222
|
+
@try {
|
|
227
223
|
<FilteredList {queryTracked} />
|
|
228
|
-
} pending {
|
|
224
|
+
} @pending {
|
|
229
225
|
pending_render_count += 1;
|
|
230
226
|
<p class="pending">{'loading...'}</p>
|
|
231
227
|
}
|
|
232
228
|
<button onClick={() => (query = 'a')}>{'Search'}</button>
|
|
233
|
-
|
|
229
|
+
</>
|
|
234
230
|
}
|
|
235
231
|
|
|
236
232
|
render(App);
|
|
@@ -274,10 +270,10 @@ describe('async suspense', () => {
|
|
|
274
270
|
it('updates direct try-block trackAsync consumers and renders pending only once', async () => {
|
|
275
271
|
let pending_render_count = 0;
|
|
276
272
|
|
|
277
|
-
function App() {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
try {
|
|
273
|
+
function App() @{
|
|
274
|
+
let &[query] = track('');
|
|
275
|
+
<>
|
|
276
|
+
@try {
|
|
281
277
|
let &[items] = trackAsync(
|
|
282
278
|
() => Promise.resolve(
|
|
283
279
|
!query ? ['apple', 'banana', 'cherry'] : ['avocado', 'blueberry', 'citrus'],
|
|
@@ -288,19 +284,20 @@ describe('async suspense', () => {
|
|
|
288
284
|
return items.filter((item: string) => item.includes(query));
|
|
289
285
|
});
|
|
290
286
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
287
|
+
<>
|
|
288
|
+
<ul>
|
|
289
|
+
@for (let item of filtered) {
|
|
290
|
+
<li>{item}</li>
|
|
291
|
+
}
|
|
292
|
+
</ul>
|
|
293
|
+
<pre>{JSON.stringify(items)}</pre>
|
|
294
|
+
</>
|
|
295
|
+
} @pending {
|
|
299
296
|
pending_render_count += 1;
|
|
300
297
|
<p class="pending">{'loading...'}</p>
|
|
301
298
|
}
|
|
302
299
|
<button onClick={() => (query = 'a')}>{'Search'}</button>
|
|
303
|
-
|
|
300
|
+
</>
|
|
304
301
|
}
|
|
305
302
|
|
|
306
303
|
render(App);
|
|
@@ -339,46 +336,48 @@ describe('async suspense', () => {
|
|
|
339
336
|
let double_effect_runs = 0;
|
|
340
337
|
let quadruple_effect_runs = 0;
|
|
341
338
|
let times_rendered = 0;
|
|
342
|
-
function Child(&{ count }: { count: number }) {
|
|
343
|
-
|
|
344
|
-
const
|
|
345
|
-
const result = count * 2;
|
|
339
|
+
function Child(&{ count }: { count: number }) @{
|
|
340
|
+
const &[double]: [number] = trackAsync(() => {
|
|
341
|
+
const result = count * 2;
|
|
346
342
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
});
|
|
343
|
+
return new Promise<number>((resolve) => {
|
|
344
|
+
resolve_double = () => resolve(result);
|
|
350
345
|
});
|
|
351
|
-
|
|
352
|
-
|
|
346
|
+
});
|
|
347
|
+
const &[quadruple]: [number] = trackAsync(() => {
|
|
348
|
+
const result = double * 2;
|
|
353
349
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
});
|
|
357
|
-
});
|
|
358
|
-
effect(() => {
|
|
359
|
-
double;
|
|
360
|
-
double_effect_runs += 1;
|
|
361
|
-
});
|
|
362
|
-
effect(() => {
|
|
363
|
-
quadruple;
|
|
364
|
-
quadruple_effect_runs += 1;
|
|
350
|
+
return new Promise<number>((resolve) => {
|
|
351
|
+
resolve_quadruple = () => resolve(result);
|
|
365
352
|
});
|
|
366
|
-
|
|
367
|
-
|
|
353
|
+
});
|
|
354
|
+
effect(() => {
|
|
355
|
+
double;
|
|
356
|
+
double_effect_runs += 1;
|
|
357
|
+
});
|
|
358
|
+
effect(() => {
|
|
359
|
+
quadruple;
|
|
360
|
+
quadruple_effect_runs += 1;
|
|
361
|
+
});
|
|
362
|
+
// this is to make the times_rendered render together with double
|
|
363
|
+
<>
|
|
364
|
+
<div class="double">
|
|
365
|
+
{double + (++times_rendered - times_rendered)}
|
|
366
|
+
</div>
|
|
368
367
|
<div class="quadruple">{quadruple}</div>
|
|
369
|
-
|
|
368
|
+
</>
|
|
370
369
|
}
|
|
371
370
|
|
|
372
|
-
function App() {
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
try {
|
|
371
|
+
function App() @{
|
|
372
|
+
let &[count] = track(2);
|
|
373
|
+
<>
|
|
374
|
+
@try {
|
|
376
375
|
<Child {count} />
|
|
377
|
-
} pending {
|
|
376
|
+
} @pending {
|
|
378
377
|
<div class="pending">{'Loading...'}</div>
|
|
379
378
|
}
|
|
380
379
|
<button onClick={() => count++}>{'Increment'}</button>
|
|
381
|
-
|
|
380
|
+
</>
|
|
382
381
|
}
|
|
383
382
|
|
|
384
383
|
render(App);
|
|
@@ -432,46 +431,48 @@ describe('async suspense', () => {
|
|
|
432
431
|
let double_effect_runs = 0;
|
|
433
432
|
let quadruple_effect_runs = 0;
|
|
434
433
|
let times_rendered = 0;
|
|
435
|
-
function Child(&{ count }: { count: number }) {
|
|
436
|
-
|
|
437
|
-
const
|
|
438
|
-
const result = count * 2;
|
|
434
|
+
function Child(&{ count }: { count: number }) @{
|
|
435
|
+
const &[double]: [number] = trackAsync(() => {
|
|
436
|
+
const result = count * 2;
|
|
439
437
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
});
|
|
438
|
+
return new Promise<number>((resolve) => {
|
|
439
|
+
resolve_double = () => resolve(result);
|
|
443
440
|
});
|
|
444
|
-
|
|
445
|
-
|
|
441
|
+
});
|
|
442
|
+
const &[quadruple]: [number] = trackAsync(() => {
|
|
443
|
+
const result = double * 2;
|
|
446
444
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
});
|
|
450
|
-
});
|
|
451
|
-
effect(() => {
|
|
452
|
-
double;
|
|
453
|
-
double_effect_runs += 1;
|
|
454
|
-
});
|
|
455
|
-
effect(() => {
|
|
456
|
-
quadruple;
|
|
457
|
-
quadruple_effect_runs += 1;
|
|
445
|
+
return new Promise<number>((resolve) => {
|
|
446
|
+
resolve_quadruple = () => resolve(result);
|
|
458
447
|
});
|
|
459
|
-
|
|
460
|
-
|
|
448
|
+
});
|
|
449
|
+
effect(() => {
|
|
450
|
+
double;
|
|
451
|
+
double_effect_runs += 1;
|
|
452
|
+
});
|
|
453
|
+
effect(() => {
|
|
454
|
+
quadruple;
|
|
455
|
+
quadruple_effect_runs += 1;
|
|
456
|
+
});
|
|
457
|
+
// this is to make the times_rendered render together with double
|
|
458
|
+
<>
|
|
459
|
+
<div class="double">
|
|
460
|
+
{double + (++times_rendered - times_rendered)}
|
|
461
|
+
</div>
|
|
461
462
|
<div class="quadruple">{quadruple}</div>
|
|
462
|
-
|
|
463
|
+
</>
|
|
463
464
|
}
|
|
464
465
|
|
|
465
|
-
function App() {
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
try {
|
|
466
|
+
function App() @{
|
|
467
|
+
let &[count] = track(2);
|
|
468
|
+
<>
|
|
469
|
+
@try {
|
|
469
470
|
<Child {count} />
|
|
470
|
-
} pending {
|
|
471
|
+
} @pending {
|
|
471
472
|
<div class="pending">{'Loading...'}</div>
|
|
472
473
|
}
|
|
473
474
|
<button onClick={() => count++}>{'Increment'}</button>
|
|
474
|
-
|
|
475
|
+
</>
|
|
475
476
|
}
|
|
476
477
|
|
|
477
478
|
render(App);
|
|
@@ -523,38 +524,40 @@ describe('async suspense', () => {
|
|
|
523
524
|
|
|
524
525
|
it('resolves chained async values without explicit flushSync', async () => {
|
|
525
526
|
let times_rendered = 0;
|
|
526
|
-
function Child(&{ count }: { count: number }) {
|
|
527
|
-
|
|
528
|
-
const
|
|
529
|
-
const result = count * 2;
|
|
527
|
+
function Child(&{ count }: { count: number }) @{
|
|
528
|
+
const &[double]: [number] = trackAsync(() => {
|
|
529
|
+
const result = count * 2;
|
|
530
530
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
});
|
|
531
|
+
return new Promise<number>((resolve) => {
|
|
532
|
+
setTimeout(() => resolve(result), 0);
|
|
534
533
|
});
|
|
535
|
-
|
|
536
|
-
|
|
534
|
+
});
|
|
535
|
+
const &[quadruple]: [number] = trackAsync(() => {
|
|
536
|
+
const result = double * 2;
|
|
537
537
|
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
});
|
|
538
|
+
return new Promise<number>((resolve) => {
|
|
539
|
+
setTimeout(() => resolve(result), 0);
|
|
541
540
|
});
|
|
542
|
-
|
|
543
|
-
|
|
541
|
+
});
|
|
542
|
+
// this is to make the times_rendered render together with double
|
|
543
|
+
<>
|
|
544
|
+
<div class="double">
|
|
545
|
+
{double + (++times_rendered - times_rendered)}
|
|
546
|
+
</div>
|
|
544
547
|
<div class="quadruple">{quadruple}</div>
|
|
545
|
-
|
|
548
|
+
</>
|
|
546
549
|
}
|
|
547
550
|
|
|
548
|
-
function App() {
|
|
549
|
-
|
|
550
|
-
|
|
551
|
+
function App() @{
|
|
552
|
+
let &[count] = track(0);
|
|
553
|
+
<>
|
|
551
554
|
<button onClick={() => count++}>{count}</button>
|
|
552
|
-
try {
|
|
555
|
+
@try {
|
|
553
556
|
<Child {count} />
|
|
554
|
-
} pending {
|
|
557
|
+
} @pending {
|
|
555
558
|
<div class="pending">{'Loading...'}</div>
|
|
556
559
|
}
|
|
557
|
-
|
|
560
|
+
</>
|
|
558
561
|
}
|
|
559
562
|
|
|
560
563
|
render(App);
|
|
@@ -582,23 +585,21 @@ describe('async suspense', () => {
|
|
|
582
585
|
async () => {
|
|
583
586
|
let resolve_fn: ((value: string[]) => void) | null = null;
|
|
584
587
|
|
|
585
|
-
function Child({ itemsTracked }: { itemsTracked: Tracked<string[]> }) {
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
}
|
|
595
|
-
</>;
|
|
588
|
+
function Child({ itemsTracked }: { itemsTracked: Tracked<string[]> }) @{
|
|
589
|
+
@try {
|
|
590
|
+
<div class="child-content">
|
|
591
|
+
{'child: '}
|
|
592
|
+
{itemsTracked.value.join(', ')}
|
|
593
|
+
</div>
|
|
594
|
+
} @pending {
|
|
595
|
+
<div class="child-pending">{'child loading...'}</div>
|
|
596
|
+
}
|
|
596
597
|
}
|
|
597
598
|
|
|
598
|
-
function App() {
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
try {
|
|
599
|
+
function App() @{
|
|
600
|
+
let &[query] = track('initial');
|
|
601
|
+
<>
|
|
602
|
+
@try {
|
|
602
603
|
let &[items, itemsTracked] = trackAsync(() => {
|
|
603
604
|
const q = query;
|
|
604
605
|
return new Promise<string[]>((resolve) => {
|
|
@@ -606,16 +607,18 @@ describe('async suspense', () => {
|
|
|
606
607
|
});
|
|
607
608
|
});
|
|
608
609
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
610
|
+
<>
|
|
611
|
+
<div class="parent-content">
|
|
612
|
+
{'parent: '}
|
|
613
|
+
{items.join(', ')}
|
|
614
|
+
</div>
|
|
615
|
+
<Child {itemsTracked} />
|
|
616
|
+
</>
|
|
617
|
+
} @pending {
|
|
615
618
|
<div class="parent-pending">{'parent loading...'}</div>
|
|
616
619
|
}
|
|
617
620
|
<button onClick={() => (query = 'next')}>{'Change'}</button>
|
|
618
|
-
|
|
621
|
+
</>
|
|
619
622
|
}
|
|
620
623
|
|
|
621
624
|
render(App);
|
|
@@ -659,11 +662,9 @@ describe('async suspense', () => {
|
|
|
659
662
|
);
|
|
660
663
|
|
|
661
664
|
it('uses the root pending boundary when trackAsync has no local try/pending boundary', () => {
|
|
662
|
-
function App() {
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
<div>{value}</div>
|
|
666
|
-
</>;
|
|
665
|
+
function App() @{
|
|
666
|
+
let &[value] = trackAsync(() => Promise.resolve('test'));
|
|
667
|
+
<div>{value}</div>
|
|
667
668
|
}
|
|
668
669
|
|
|
669
670
|
expect(() => {
|
|
@@ -21,6 +21,7 @@ exports[`basic client > attribute rendering > handles boolean attributes with no
|
|
|
21
21
|
|
|
22
22
|
exports[`basic client > attribute rendering > handles boolean props correctly 1`] = `
|
|
23
23
|
<div>
|
|
24
|
+
<!---->
|
|
24
25
|
<div
|
|
25
26
|
data-disabled=""
|
|
26
27
|
/>
|
|
@@ -28,6 +29,7 @@ exports[`basic client > attribute rendering > handles boolean props correctly 1`
|
|
|
28
29
|
disabled=""
|
|
29
30
|
/>
|
|
30
31
|
<!---->
|
|
32
|
+
<!---->
|
|
31
33
|
|
|
32
34
|
</div>
|
|
33
35
|
`;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
exports[`basic client > rendering & text > basic operations 1`] = `
|
|
4
4
|
<div>
|
|
5
|
+
<!---->
|
|
5
6
|
<div>
|
|
6
7
|
0
|
|
7
8
|
</div>
|
|
@@ -14,6 +15,7 @@ exports[`basic client > rendering & text > basic operations 1`] = `
|
|
|
14
15
|
<div>
|
|
15
16
|
2
|
|
16
17
|
</div>
|
|
18
|
+
<!---->
|
|
17
19
|
|
|
18
20
|
</div>
|
|
19
21
|
`;
|
|
@@ -29,12 +31,14 @@ exports[`basic client > rendering & text > renders semi-dynamic text 1`] = `
|
|
|
29
31
|
|
|
30
32
|
exports[`basic client > rendering & text > renders simple JS expression logic correctly 1`] = `
|
|
31
33
|
<div>
|
|
34
|
+
<!---->
|
|
32
35
|
<div>
|
|
33
36
|
{"0":"Test"}
|
|
34
37
|
</div>
|
|
35
38
|
<div>
|
|
36
39
|
1
|
|
37
40
|
</div>
|
|
41
|
+
<!---->
|
|
38
42
|
|
|
39
43
|
</div>
|
|
40
44
|
`;
|