From bfd9e8f001d0ea6a7b1f207f5bc9e0714cccee11 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 6 Nov 2025 18:36:07 -0500 Subject: [PATCH 1/3] chore: tweak resource implementation --- .../internal/client/reactivity/resource.js | 38 ++++++------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/resource.js b/packages/svelte/src/internal/client/reactivity/resource.js index 7f3780e68022..2cfa2a388f05 100644 --- a/packages/svelte/src/internal/client/reactivity/resource.js +++ b/packages/svelte/src/internal/client/reactivity/resource.js @@ -19,12 +19,12 @@ export function resource(fn) { /** * @template T - * @implements {Partial>>} + * @implements {Partial>} */ class Resource { #init = false; - /** @type {() => T} */ + /** @type {() => T | Promise} */ #fn; /** @type {Source} */ @@ -36,13 +36,13 @@ class Resource { /** @type {Source} */ #ready = state(false); - /** @type {Source | undefined>} */ + /** @type {Source} */ #raw = state(undefined); - /** @type {Source>} */ + /** @type {Source>} */ #promise; - /** @type {Derived | undefined>} */ + /** @type {Derived} */ #current = derived(() => { if (!get(this.#ready)) return undefined; return get(this.#raw); @@ -51,27 +51,10 @@ class Resource { /** {@type Source} */ #error = state(undefined); - /** @type {Derived>['then']>} */ - // @ts-expect-error - I feel this might actually be incorrect but I can't prove it yet. - // we are technically not returning a promise that resolves to the correct type... but it _is_ a promise that resolves at the correct time + /** @type {Derived['then']>} */ #then = derived(() => { const p = get(this.#promise); - - return async (resolve, reject) => { - const result = /** @type {Promise>} */ ( - (async () => { - await p; - await tick(); - return get(this.#current); - })() - ); - - if (resolve || reject) { - return result.then(resolve, reject); - } - - return result; - }; + return (resolve, reject) => p.then(resolve, reject); }); /** @@ -92,6 +75,7 @@ class Resource { this.#init = true; } + /** @type {ReturnType>} */ const { resolve, reject, promise } = deferred(); this.#latest.push(resolve); @@ -108,7 +92,7 @@ class Resource { set(this.#raw, value); set(this.#error, undefined); - resolve(undefined); + resolve(value); }) .catch((e) => { const idx = this.#latest.indexOf(resolve); @@ -173,13 +157,13 @@ class Resource { }; /** - * @param {Awaited} value + * @param {T} value */ set = (value) => { set(this.#ready, true); set(this.#loading, false); set(this.#error, undefined); set(this.#raw, value); - set(this.#promise, Promise.resolve()); + set(this.#promise, Promise.resolve(value)); }; } From 9702ee6c8da57745ad28f3e3dfe844c21ed187b0 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 6 Nov 2025 18:38:50 -0500 Subject: [PATCH 2/3] fn, fn --- packages/svelte/src/internal/client/reactivity/resource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/src/internal/client/reactivity/resource.js b/packages/svelte/src/internal/client/reactivity/resource.js index 2cfa2a388f05..813891d28d67 100644 --- a/packages/svelte/src/internal/client/reactivity/resource.js +++ b/packages/svelte/src/internal/client/reactivity/resource.js @@ -121,7 +121,7 @@ class Resource { get finally() { get(this.#then); return (/** @type {any} */ fn) => { - return get(this.#then)().finally(fn); + return get(this.#then)(fn, fn); }; } From da45e7a3255d2aefed7b453784e395ae736b0d80 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 6 Nov 2025 18:39:56 -0500 Subject: [PATCH 3/3] tweak --- .../svelte/src/internal/client/reactivity/resource.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/resource.js b/packages/svelte/src/internal/client/reactivity/resource.js index 813891d28d67..df35260349f4 100644 --- a/packages/svelte/src/internal/client/reactivity/resource.js +++ b/packages/svelte/src/internal/client/reactivity/resource.js @@ -42,12 +42,6 @@ class Resource { /** @type {Source>} */ #promise; - /** @type {Derived} */ - #current = derived(() => { - if (!get(this.#ready)) return undefined; - return get(this.#raw); - }); - /** {@type Source} */ #error = state(undefined); @@ -126,7 +120,7 @@ class Resource { } get current() { - return get(this.#current); + return get(this.#ready) ? get(this.#raw) : undefined; } get error() {