@fluixi/reactive 1.0.0-alpha.82 → 1.0.0-alpha.84
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/README.md +4 -0
- package/dist/cdn/reactive.cjs +2673 -1
- package/dist/cdn/reactive.global.js +2 -1
- package/dist/cdn/reactive.mjs +2657 -1
- package/dist/cdn/signal.cjs +299 -1
- package/dist/cdn/signal.d.ts +1 -1
- package/dist/cdn/signal.global.js +2 -1
- package/dist/cdn/signal.js +1 -1
- package/dist/cdn/signal.mjs +276 -1
- package/dist/index.cjs +2673 -1
- package/dist/index.mjs +2657 -1
- package/dist/lib/index.cjs +2674 -1
- package/dist/lib/index.js +1 -1
- package/dist/lib/index.mjs +2659 -1
- package/dist/lib/observable/index.cjs +386 -1
- package/dist/lib/observable/index.mjs +364 -1
- package/dist/lib/observable/observable.cjs +384 -1
- package/dist/lib/observable/observable.d.ts +0 -137
- package/dist/lib/observable/observable.d.ts.map +1 -1
- package/dist/lib/observable/observable.js +0 -71
- package/dist/lib/observable/observable.mjs +361 -1
- package/dist/lib/observable/subscription.cjs +180 -1
- package/dist/lib/observable/subscription.d.ts +0 -12
- package/dist/lib/observable/subscription.d.ts.map +1 -1
- package/dist/lib/observable/subscription.js +0 -12
- package/dist/lib/observable/subscription.mjs +157 -1
- package/dist/lib/observable/types.cjs +18 -1
- package/dist/lib/observable/types.d.ts.map +1 -1
- package/dist/lib/predicates.cjs +44 -1
- package/dist/lib/predicates.d.ts +2 -2
- package/dist/lib/predicates.js +2 -2
- package/dist/lib/predicates.mjs +23 -1
- package/dist/lib/signal/api.cjs +571 -1
- package/dist/lib/signal/api.d.ts +211 -1
- package/dist/lib/signal/api.d.ts.map +1 -1
- package/dist/lib/signal/api.js +207 -12
- package/dist/lib/signal/api.mjs +548 -1
- package/dist/lib/signal/cached-resource.cjs +672 -1
- package/dist/lib/signal/cached-resource.d.ts +28 -16
- package/dist/lib/signal/cached-resource.d.ts.map +1 -1
- package/dist/lib/signal/cached-resource.js +35 -29
- package/dist/lib/signal/cached-resource.mjs +650 -1
- package/dist/lib/signal/graph/children.cjs +325 -1
- package/dist/lib/signal/graph/children.js +1 -1
- package/dist/lib/signal/graph/children.mjs +302 -1
- package/dist/lib/signal/graph/compat.cjs +578 -1
- package/dist/lib/signal/graph/compat.d.ts +13 -13
- package/dist/lib/signal/graph/compat.d.ts.map +1 -1
- package/dist/lib/signal/graph/compat.js +51 -32
- package/dist/lib/signal/graph/compat.mjs +556 -1
- package/dist/lib/signal/graph/core.cjs +295 -1
- package/dist/lib/signal/graph/core.d.ts +28 -24
- package/dist/lib/signal/graph/core.d.ts.map +1 -1
- package/dist/lib/signal/graph/core.js +45 -31
- package/dist/lib/signal/graph/core.mjs +273 -1
- package/dist/lib/signal/graph/debounced.cjs +668 -1
- package/dist/lib/signal/graph/debounced.d.ts +5 -5
- package/dist/lib/signal/graph/debounced.d.ts.map +1 -1
- package/dist/lib/signal/graph/debounced.js +5 -5
- package/dist/lib/signal/graph/debounced.mjs +645 -1
- package/dist/lib/signal/graph/derived.cjs +496 -1
- package/dist/lib/signal/graph/derived.d.ts +1 -1
- package/dist/lib/signal/graph/derived.js +1 -1
- package/dist/lib/signal/graph/derived.mjs +473 -1
- package/dist/lib/signal/graph/detect.cjs +66 -1
- package/dist/lib/signal/graph/detect.mjs +45 -1
- package/dist/lib/signal/graph/error-boundary.cjs +301 -1
- package/dist/lib/signal/graph/error-boundary.js +3 -3
- package/dist/lib/signal/graph/error-boundary.mjs +278 -1
- package/dist/lib/signal/graph/index.cjs +305 -1
- package/dist/lib/signal/graph/index.d.ts +7 -6
- package/dist/lib/signal/graph/index.d.ts.map +1 -1
- package/dist/lib/signal/graph/index.js +7 -6
- package/dist/lib/signal/graph/index.mjs +283 -1
- package/dist/lib/signal/graph/observe.cjs +163 -0
- package/dist/lib/signal/graph/observe.d.ts +141 -0
- package/dist/lib/signal/graph/observe.d.ts.map +1 -0
- package/dist/lib/signal/graph/observe.js +149 -0
- package/dist/lib/signal/graph/observe.mjs +140 -0
- package/dist/lib/signal/graph/resource.cjs +620 -1
- package/dist/lib/signal/graph/resource.d.ts +1 -1
- package/dist/lib/signal/graph/resource.js +7 -8
- package/dist/lib/signal/graph/resource.mjs +597 -1
- package/dist/lib/signal/graph/runtime.cjs +501 -1
- package/dist/lib/signal/graph/runtime.d.ts +9 -9
- package/dist/lib/signal/graph/runtime.d.ts.map +1 -1
- package/dist/lib/signal/graph/runtime.js +56 -37
- package/dist/lib/signal/graph/runtime.mjs +478 -1
- package/dist/lib/signal/graph/signal-next.cjs +1208 -1
- package/dist/lib/signal/graph/signal-next.d.ts +5 -5
- package/dist/lib/signal/graph/signal-next.d.ts.map +1 -1
- package/dist/lib/signal/graph/signal-next.js +14 -12
- package/dist/lib/signal/graph/signal-next.mjs +1186 -1
- package/dist/lib/signal/graph/ssr-hooks.cjs +60 -1
- package/dist/lib/signal/graph/ssr-hooks.d.ts +6 -7
- package/dist/lib/signal/graph/ssr-hooks.d.ts.map +1 -1
- package/dist/lib/signal/graph/ssr-hooks.js +6 -7
- package/dist/lib/signal/graph/ssr-hooks.mjs +39 -1
- package/dist/lib/signal/graph/state.cjs +72 -1
- package/dist/lib/signal/graph/state.d.ts +43 -10
- package/dist/lib/signal/graph/state.d.ts.map +1 -1
- package/dist/lib/signal/graph/state.js +83 -21
- package/dist/lib/signal/graph/state.mjs +49 -1
- package/dist/lib/signal/graph/suspense.cjs +301 -1
- package/dist/lib/signal/graph/suspense.js +4 -4
- package/dist/lib/signal/graph/suspense.mjs +278 -1
- package/dist/lib/signal/index-legacy.cjs +2540 -1
- package/dist/lib/signal/index-legacy.d.ts +1 -1
- package/dist/lib/signal/index-legacy.js +1 -1
- package/dist/lib/signal/index-legacy.mjs +2518 -1
- package/dist/lib/signal/index.cjs +1275 -1
- package/dist/lib/signal/index.d.ts +5 -2
- package/dist/lib/signal/index.d.ts.map +1 -1
- package/dist/lib/signal/index.js +8 -3
- package/dist/lib/signal/index.mjs +1253 -1
- package/dist/lib/signal/list.cjs +549 -1
- package/dist/lib/signal/list.d.ts +5 -5
- package/dist/lib/signal/list.js +10 -10
- package/dist/lib/signal/list.mjs +526 -1
- package/dist/lib/signal/resource-api.cjs +626 -1
- package/dist/lib/signal/resource-api.d.ts +5 -5
- package/dist/lib/signal/resource-api.js +5 -5
- package/dist/lib/signal/resource-api.mjs +603 -1
- package/dist/lib/signal/signal.cjs +2023 -1
- package/dist/lib/signal/signal.d.ts +4 -4
- package/dist/lib/signal/signal.d.ts.map +1 -1
- package/dist/lib/signal/signal.js +22 -23
- package/dist/lib/signal/signal.mjs +2000 -1
- package/dist/lib/signal/types.cjs +38 -1
- package/dist/lib/signal/types.d.ts.map +1 -1
- package/dist/lib/signal/types.js +2 -2
- package/dist/lib/signal/types.mjs +17 -1
- package/dist/lib/signal/utilities.cjs +1012 -1
- package/dist/lib/signal/utilities.d.ts +0 -108
- package/dist/lib/signal/utilities.d.ts.map +1 -1
- package/dist/lib/signal/utilities.js +0 -158
- package/dist/lib/signal/utilities.mjs +990 -1
- package/dist/lib/store/api.cjs +612 -1
- package/dist/lib/store/api.d.ts +33 -0
- package/dist/lib/store/api.d.ts.map +1 -1
- package/dist/lib/store/api.js +41 -8
- package/dist/lib/store/api.mjs +596 -1
- package/dist/lib/store/index.cjs +691 -1
- package/dist/lib/store/index.js +1 -1
- package/dist/lib/store/index.mjs +676 -1
- package/dist/lib/store/setter.types.cjs +18 -1
- package/dist/lib/store/setter.types.d.ts +43 -3
- package/dist/lib/store/setter.types.d.ts.map +1 -1
- package/dist/lib/store/store.cjs +658 -1
- package/dist/lib/store/store.d.ts +72 -0
- package/dist/lib/store/store.d.ts.map +1 -1
- package/dist/lib/store/store.js +294 -11
- package/dist/lib/store/store.mjs +644 -1
- package/dist/lib/store/types.cjs +18 -1
- package/dist/lib/store/types.d.ts +1 -1
- package/dist/lib/store/types.d.ts.map +1 -1
- package/dist/lib/store/utils.cjs +43 -1
- package/dist/lib/store/utils.d.ts +1 -1
- package/dist/lib/store/utils.js +1 -1
- package/dist/lib/store/utils.mjs +22 -1
- package/dist/lib/subject.cjs +450 -1
- package/dist/lib/subject.js +3 -91
- package/dist/lib/subject.mjs +427 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/version.generated.cjs +27 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +2 -2
- package/dist/version.generated.mjs +7 -1
- package/package.json +5 -4
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* createCachedResource
|
|
2
|
+
* createCachedResource: a reactive resource with TTL-based caching.
|
|
3
3
|
*
|
|
4
4
|
* Fetches once and returns the cached result for subsequent reads within the
|
|
5
5
|
* TTL window. After the TTL expires the next read triggers a re-fetch.
|
|
6
6
|
*
|
|
7
|
+
* It runs on the live graph, as of this change. It used to build on `./signal.js`,
|
|
8
|
+
* which tracks its current consumer in a module-level `Listener` while everything on
|
|
9
|
+
* the default entry tracks through `G.consumer`. The two never saw each other, so
|
|
10
|
+
* `createEffect(() => data())` subscribed to nothing and a binding kept whatever it
|
|
11
|
+
* first rendered, which on an initial load is the loading state. `cross-graph.spec.ts`
|
|
12
|
+
* holds the general shape of that hazard; this file is no longer an instance of it.
|
|
13
|
+
*
|
|
14
|
+
* Suspense needs no bookkeeping here. The accessor throws the pending promise and the
|
|
15
|
+
* runtime's suspend handler finds the nearest boundary from the effect that was
|
|
16
|
+
* reading, which is what `graph/resource.ts` relies on too. The manual increment and
|
|
17
|
+
* decrement against a lazily-resolved context went with the port.
|
|
18
|
+
*
|
|
7
19
|
* Two forms (mirrors createResource):
|
|
8
20
|
*
|
|
9
21
|
* // 1. no reactive source
|
|
@@ -20,27 +32,27 @@
|
|
|
20
32
|
* );
|
|
21
33
|
*
|
|
22
34
|
* Options:
|
|
23
|
-
* ttl
|
|
24
|
-
* name
|
|
25
|
-
* staleWhileRevalidate
|
|
35
|
+
* ttl: cache lifetime in ms. Default: Infinity (manual invalidate only)
|
|
36
|
+
* name: cache namespace. If omitted, each call-site gets its own isolated cache.
|
|
37
|
+
* staleWhileRevalidate, when true (default), show stale data while background-fetching.
|
|
26
38
|
* When false, show a loading state during revalidation.
|
|
27
39
|
*
|
|
28
40
|
* Resource shape (same as createResource):
|
|
29
|
-
* data()
|
|
30
|
-
* data.loading
|
|
31
|
-
* data.latest
|
|
32
|
-
* data.error
|
|
33
|
-
* data.stale
|
|
41
|
+
* data(): current value (throws pending promise during initial load for Suspense)
|
|
42
|
+
* data.loading: true during initial load
|
|
43
|
+
* data.latest: value without throwing
|
|
44
|
+
* data.error: last error
|
|
45
|
+
* data.stale: true when showing stale data during background revalidation
|
|
34
46
|
*
|
|
35
47
|
* Actions:
|
|
36
|
-
* refetch()
|
|
37
|
-
* invalidate()
|
|
48
|
+
* refetch(): force re-fetch regardless of TTL, keeps showing current value while loading
|
|
49
|
+
* invalidate(): delete cache entry and re-fetch (shows loading on next read)
|
|
38
50
|
*/
|
|
39
|
-
import {
|
|
51
|
+
import type { Setter, Resource } from './signal.js';
|
|
40
52
|
export interface CachedResourceOptions {
|
|
41
53
|
/**
|
|
42
54
|
* Cache lifetime in milliseconds.
|
|
43
|
-
* Default: `Infinity
|
|
55
|
+
* Default: `Infinity`, data lives until `invalidate()` is called.
|
|
44
56
|
*/
|
|
45
57
|
ttl?: number;
|
|
46
58
|
/**
|
|
@@ -52,7 +64,7 @@ export interface CachedResourceOptions {
|
|
|
52
64
|
/**
|
|
53
65
|
* When `true` (default), stale data is returned immediately while a
|
|
54
66
|
* background re-fetch runs. The resource stays in `state='ready'` and
|
|
55
|
-
* `stale=true` during revalidation
|
|
67
|
+
* `stale=true` during revalidation, no loading skeleton.
|
|
56
68
|
*
|
|
57
69
|
* When `false`, a foreground re-fetch is triggered that sets
|
|
58
70
|
* `state='refreshing'` (data is still visible but `loading=true`).
|
|
@@ -74,11 +86,11 @@ export type CachedResourceReturn<T> = [
|
|
|
74
86
|
}
|
|
75
87
|
];
|
|
76
88
|
/**
|
|
77
|
-
* No-source overload
|
|
89
|
+
* No-source overload: fetch is not keyed by any reactive value.
|
|
78
90
|
*/
|
|
79
91
|
export declare function createCachedResource<T>(fetcher: () => Promise<T> | T, options?: CachedResourceOptions): CachedResourceReturn<T>;
|
|
80
92
|
/**
|
|
81
|
-
* With-source overload
|
|
93
|
+
* With-source overload: fetch re-runs whenever the source accessor returns a
|
|
82
94
|
* new value (falsy source suspends the fetch, same as `createResource`).
|
|
83
95
|
*/
|
|
84
96
|
export declare function createCachedResource<T, S>(source: () => S | false | null | undefined, fetcher: (key: S) => Promise<T> | T, options?: CachedResourceOptions): CachedResourceReturn<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cached-resource.d.ts","sourceRoot":"","sources":["../../../src/lib/signal/cached-resource.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cached-resource.d.ts","sourceRoot":"","sources":["../../../src/lib/signal/cached-resource.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAYH,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AAgBnE,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG;IAC5C,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IACpC,cAAc,CAAC,CAAC,CAAC;IACjB;QACE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAC9B,kEAAkE;QAClE,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,4EAA4E;QAC5E,UAAU,EAAE,MAAM,IAAI,CAAC;KACxB;CACF,CAAC;AAUF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAE3B;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,CAAC,EACvC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,EAC1C,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACnC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAwO3B;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAK/D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C"}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* createCachedResource
|
|
2
|
+
* createCachedResource: a reactive resource with TTL-based caching.
|
|
3
3
|
*
|
|
4
4
|
* Fetches once and returns the cached result for subsequent reads within the
|
|
5
5
|
* TTL window. After the TTL expires the next read triggers a re-fetch.
|
|
6
6
|
*
|
|
7
|
+
* It runs on the live graph, as of this change. It used to build on `./signal.js`,
|
|
8
|
+
* which tracks its current consumer in a module-level `Listener` while everything on
|
|
9
|
+
* the default entry tracks through `G.consumer`. The two never saw each other, so
|
|
10
|
+
* `createEffect(() => data())` subscribed to nothing and a binding kept whatever it
|
|
11
|
+
* first rendered, which on an initial load is the loading state. `cross-graph.spec.ts`
|
|
12
|
+
* holds the general shape of that hazard; this file is no longer an instance of it.
|
|
13
|
+
*
|
|
14
|
+
* Suspense needs no bookkeeping here. The accessor throws the pending promise and the
|
|
15
|
+
* runtime's suspend handler finds the nearest boundary from the effect that was
|
|
16
|
+
* reading, which is what `graph/resource.ts` relies on too. The manual increment and
|
|
17
|
+
* decrement against a lazily-resolved context went with the port.
|
|
18
|
+
*
|
|
7
19
|
* Two forms (mirrors createResource):
|
|
8
20
|
*
|
|
9
21
|
* // 1. no reactive source
|
|
@@ -20,27 +32,31 @@
|
|
|
20
32
|
* );
|
|
21
33
|
*
|
|
22
34
|
* Options:
|
|
23
|
-
* ttl
|
|
24
|
-
* name
|
|
25
|
-
* staleWhileRevalidate
|
|
35
|
+
* ttl: cache lifetime in ms. Default: Infinity (manual invalidate only)
|
|
36
|
+
* name: cache namespace. If omitted, each call-site gets its own isolated cache.
|
|
37
|
+
* staleWhileRevalidate, when true (default), show stale data while background-fetching.
|
|
26
38
|
* When false, show a loading state during revalidation.
|
|
27
39
|
*
|
|
28
40
|
* Resource shape (same as createResource):
|
|
29
|
-
* data()
|
|
30
|
-
* data.loading
|
|
31
|
-
* data.latest
|
|
32
|
-
* data.error
|
|
33
|
-
* data.stale
|
|
41
|
+
* data(): current value (throws pending promise during initial load for Suspense)
|
|
42
|
+
* data.loading: true during initial load
|
|
43
|
+
* data.latest: value without throwing
|
|
44
|
+
* data.error: last error
|
|
45
|
+
* data.stale: true when showing stale data during background revalidation
|
|
34
46
|
*
|
|
35
47
|
* Actions:
|
|
36
|
-
* refetch()
|
|
37
|
-
* invalidate()
|
|
48
|
+
* refetch(): force re-fetch regardless of TTL, keeps showing current value while loading
|
|
49
|
+
* invalidate(): delete cache entry and re-fetch (shows loading on next read)
|
|
38
50
|
*/
|
|
39
|
-
import { createSignal, createEffect, onCleanup, batch, untrack,
|
|
51
|
+
import { createSignal, createEffect, onCleanup, batch, untrack, } from './graph/compat.js';
|
|
52
|
+
// Graph-agnostic SSR hooks, the same ones graph/resource.ts uses.
|
|
53
|
+
import { trackResourcePromise } from './graph/ssr-hooks.js';
|
|
40
54
|
const ttlCache = new Map();
|
|
41
55
|
const inflight = new Map();
|
|
42
56
|
let _autoId = 0;
|
|
43
|
-
// ──
|
|
57
|
+
// ── Brand symbols ─────────────────────────────────────────────────────────────
|
|
58
|
+
// Registry symbols, so every copy of every graph agrees on them without importing
|
|
59
|
+
// anything. graph/resource.ts stamps a resource with the same two.
|
|
44
60
|
const $SIGNAL = Symbol.for('signal');
|
|
45
61
|
const $RESOURCE = Symbol.for('resource');
|
|
46
62
|
export function createCachedResource(sourceOrFetcher, fetcherOrOptions, opts = {}) {
|
|
@@ -54,7 +70,7 @@ export function createCachedResource(sourceOrFetcher, fetcherOrOptions, opts = {
|
|
|
54
70
|
options = opts;
|
|
55
71
|
}
|
|
56
72
|
else {
|
|
57
|
-
// No source
|
|
73
|
+
// No source: treat the first arg as fetcher, source = () => true
|
|
58
74
|
sourceFn = () => true;
|
|
59
75
|
fetchFn = sourceOrFetcher;
|
|
60
76
|
options = fetcherOrOptions ?? opts;
|
|
@@ -97,12 +113,9 @@ export function createCachedResource(sourceOrFetcher, fetcherOrOptions, opts = {
|
|
|
97
113
|
if (!background) {
|
|
98
114
|
trackResourcePromise(promise); // server async SSR: collect & await
|
|
99
115
|
setPendingP(promise);
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
suspCtx.increment();
|
|
104
|
-
promise.finally(() => suspCtx.decrement());
|
|
105
|
-
}
|
|
116
|
+
// No boundary bookkeeping here. The accessor throws the pending promise, and
|
|
117
|
+
// the runtime's suspend handler finds the nearest boundary from the effect that
|
|
118
|
+
// was reading. graph/resource.ts leaves it to the same path.
|
|
106
119
|
}
|
|
107
120
|
promise.then((v) => { if (!isCancelled())
|
|
108
121
|
settle(v, background); }, (e) => { if (!isCancelled() && !background)
|
|
@@ -124,15 +137,8 @@ export function createCachedResource(sourceOrFetcher, fetcherOrOptions, opts = {
|
|
|
124
137
|
setPendingP(undefined);
|
|
125
138
|
});
|
|
126
139
|
}
|
|
127
|
-
// ── Suspense context (lazy, avoid module-init order issues) ───────────────
|
|
128
|
-
let _SuspenseContext;
|
|
129
140
|
// ── Main effect ───────────────────────────────────────────────────────────
|
|
130
141
|
createEffect(() => {
|
|
131
|
-
// Lazily grab the suspense context the first time the effect runs,
|
|
132
|
-
// so it's looked up in the correct component Owner scope.
|
|
133
|
-
if (_SuspenseContext === undefined) {
|
|
134
|
-
_SuspenseContext = getSuspenseContext();
|
|
135
|
-
}
|
|
136
142
|
const key = sourceFn();
|
|
137
143
|
tick(); // track manual triggers
|
|
138
144
|
// Suspend fetch when source is falsy (mirrors createResource)
|
|
@@ -160,7 +166,7 @@ export function createCachedResource(sourceOrFetcher, fetcherOrOptions, opts = {
|
|
|
160
166
|
const cached = ttlCache.get(ck);
|
|
161
167
|
// ── Cache HIT (fresh) ─────────────────────────────────────────────────
|
|
162
168
|
if (cached && isFresh(cached) && !doRefetch && !doInvalidate) {
|
|
163
|
-
// Serve synchronously
|
|
169
|
+
// Serve synchronously, no loading state, no fetch.
|
|
164
170
|
const cur = untrack(resourceState);
|
|
165
171
|
if (cur !== 'ready' || untrack(value) !== cached.value) {
|
|
166
172
|
batch(() => {
|
|
@@ -197,7 +203,7 @@ export function createCachedResource(sourceOrFetcher, fetcherOrOptions, opts = {
|
|
|
197
203
|
doFetch(key, ck, false /* foreground */, () => cancelled);
|
|
198
204
|
});
|
|
199
205
|
// ── Resource accessor ─────────────────────────────────────────────────────
|
|
200
|
-
// During 'pending': throw the pending promise
|
|
206
|
+
// During 'pending': throw the pending promise -> Suspense shows skeleton.
|
|
201
207
|
// During 'refreshing': return stale value (no Suspense regression).
|
|
202
208
|
// During 'ready'/'errored': return value or throw error.
|
|
203
209
|
const resource = (() => {
|