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