@fluixi/reactive 1.0.0-alpha.100
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/LICENSE +21 -0
- package/README.md +280 -0
- package/dist/cdn/reactive.cjs +2803 -0
- package/dist/cdn/reactive.d.ts +11 -0
- package/dist/cdn/reactive.d.ts.map +1 -0
- package/dist/cdn/reactive.global.js +2 -0
- package/dist/cdn/reactive.js +10 -0
- package/dist/cdn/reactive.mjs +2787 -0
- package/dist/cdn/signal.cjs +299 -0
- package/dist/cdn/signal.d.ts +19 -0
- package/dist/cdn/signal.d.ts.map +1 -0
- package/dist/cdn/signal.global.js +2 -0
- package/dist/cdn/signal.js +18 -0
- package/dist/cdn/signal.mjs +276 -0
- package/dist/index.cjs +2803 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +2787 -0
- package/dist/lib/index.cjs +2804 -0
- package/dist/lib/index.d.ts +8 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.mjs +2789 -0
- package/dist/lib/observable/index.cjs +386 -0
- package/dist/lib/observable/index.d.ts +4 -0
- package/dist/lib/observable/index.d.ts.map +1 -0
- package/dist/lib/observable/index.js +3 -0
- package/dist/lib/observable/index.mjs +364 -0
- package/dist/lib/observable/observable.cjs +384 -0
- package/dist/lib/observable/observable.d.ts +246 -0
- package/dist/lib/observable/observable.d.ts.map +1 -0
- package/dist/lib/observable/observable.js +268 -0
- package/dist/lib/observable/observable.mjs +361 -0
- package/dist/lib/observable/subscription.cjs +180 -0
- package/dist/lib/observable/subscription.d.ts +58 -0
- package/dist/lib/observable/subscription.d.ts.map +1 -0
- package/dist/lib/observable/subscription.js +177 -0
- package/dist/lib/observable/subscription.mjs +157 -0
- package/dist/lib/observable/types.cjs +18 -0
- package/dist/lib/observable/types.d.ts +44 -0
- package/dist/lib/observable/types.d.ts.map +1 -0
- package/dist/lib/observable/types.js +1 -0
- package/dist/lib/observable/types.mjs +0 -0
- package/dist/lib/predicates.cjs +44 -0
- package/dist/lib/predicates.d.ts +37 -0
- package/dist/lib/predicates.d.ts.map +1 -0
- package/dist/lib/predicates.js +62 -0
- package/dist/lib/predicates.mjs +23 -0
- package/dist/lib/signal/api.cjs +592 -0
- package/dist/lib/signal/api.d.ts +227 -0
- package/dist/lib/signal/api.d.ts.map +1 -0
- package/dist/lib/signal/api.js +228 -0
- package/dist/lib/signal/api.mjs +569 -0
- package/dist/lib/signal/cached-resource.cjs +726 -0
- package/dist/lib/signal/cached-resource.d.ts +86 -0
- package/dist/lib/signal/cached-resource.d.ts.map +1 -0
- package/dist/lib/signal/cached-resource.js +250 -0
- package/dist/lib/signal/cached-resource.mjs +704 -0
- package/dist/lib/signal/graph/children.cjs +326 -0
- package/dist/lib/signal/graph/children.d.ts +2 -0
- package/dist/lib/signal/graph/children.d.ts.map +1 -0
- package/dist/lib/signal/graph/children.js +30 -0
- package/dist/lib/signal/graph/children.mjs +303 -0
- package/dist/lib/signal/graph/compat.cjs +590 -0
- package/dist/lib/signal/graph/compat.d.ts +66 -0
- package/dist/lib/signal/graph/compat.d.ts.map +1 -0
- package/dist/lib/signal/graph/compat.js +197 -0
- package/dist/lib/signal/graph/compat.mjs +568 -0
- package/dist/lib/signal/graph/core.cjs +295 -0
- package/dist/lib/signal/graph/core.d.ts +99 -0
- package/dist/lib/signal/graph/core.d.ts.map +1 -0
- package/dist/lib/signal/graph/core.js +268 -0
- package/dist/lib/signal/graph/core.mjs +273 -0
- package/dist/lib/signal/graph/debounced.cjs +680 -0
- package/dist/lib/signal/graph/debounced.d.ts +67 -0
- package/dist/lib/signal/graph/debounced.d.ts.map +1 -0
- package/dist/lib/signal/graph/debounced.js +92 -0
- package/dist/lib/signal/graph/debounced.mjs +657 -0
- package/dist/lib/signal/graph/derived.cjs +508 -0
- package/dist/lib/signal/graph/derived.d.ts +14 -0
- package/dist/lib/signal/graph/derived.d.ts.map +1 -0
- package/dist/lib/signal/graph/derived.js +65 -0
- package/dist/lib/signal/graph/derived.mjs +485 -0
- package/dist/lib/signal/graph/detect.cjs +66 -0
- package/dist/lib/signal/graph/detect.d.ts +17 -0
- package/dist/lib/signal/graph/detect.d.ts.map +1 -0
- package/dist/lib/signal/graph/detect.js +39 -0
- package/dist/lib/signal/graph/detect.mjs +45 -0
- package/dist/lib/signal/graph/error-boundary.cjs +313 -0
- package/dist/lib/signal/graph/error-boundary.d.ts +16 -0
- package/dist/lib/signal/graph/error-boundary.d.ts.map +1 -0
- package/dist/lib/signal/graph/error-boundary.js +34 -0
- package/dist/lib/signal/graph/error-boundary.mjs +290 -0
- package/dist/lib/signal/graph/index.cjs +305 -0
- package/dist/lib/signal/graph/index.d.ts +22 -0
- package/dist/lib/signal/graph/index.d.ts.map +1 -0
- package/dist/lib/signal/graph/index.js +21 -0
- package/dist/lib/signal/graph/index.mjs +283 -0
- package/dist/lib/signal/graph/observe.cjs +198 -0
- package/dist/lib/signal/graph/observe.d.ts +185 -0
- package/dist/lib/signal/graph/observe.d.ts.map +1 -0
- package/dist/lib/signal/graph/observe.js +198 -0
- package/dist/lib/signal/graph/observe.mjs +175 -0
- package/dist/lib/signal/graph/resource.cjs +632 -0
- package/dist/lib/signal/graph/resource.d.ts +39 -0
- package/dist/lib/signal/graph/resource.d.ts.map +1 -0
- package/dist/lib/signal/graph/resource.js +165 -0
- package/dist/lib/signal/graph/resource.mjs +609 -0
- package/dist/lib/signal/graph/runtime.cjs +522 -0
- package/dist/lib/signal/graph/runtime.d.ts +80 -0
- package/dist/lib/signal/graph/runtime.d.ts.map +1 -0
- package/dist/lib/signal/graph/runtime.js +358 -0
- package/dist/lib/signal/graph/runtime.mjs +499 -0
- package/dist/lib/signal/graph/signal-next.cjs +1249 -0
- package/dist/lib/signal/graph/signal-next.d.ts +38 -0
- package/dist/lib/signal/graph/signal-next.d.ts.map +1 -0
- package/dist/lib/signal/graph/signal-next.js +44 -0
- package/dist/lib/signal/graph/signal-next.mjs +1227 -0
- package/dist/lib/signal/graph/ssr-hooks.cjs +89 -0
- package/dist/lib/signal/graph/ssr-hooks.d.ts +51 -0
- package/dist/lib/signal/graph/ssr-hooks.d.ts.map +1 -0
- package/dist/lib/signal/graph/ssr-hooks.js +80 -0
- package/dist/lib/signal/graph/ssr-hooks.mjs +68 -0
- package/dist/lib/signal/graph/state.cjs +72 -0
- package/dist/lib/signal/graph/state.d.ts +76 -0
- package/dist/lib/signal/graph/state.d.ts.map +1 -0
- package/dist/lib/signal/graph/state.js +99 -0
- package/dist/lib/signal/graph/state.mjs +49 -0
- package/dist/lib/signal/graph/suspense.cjs +313 -0
- package/dist/lib/signal/graph/suspense.d.ts +13 -0
- package/dist/lib/signal/graph/suspense.d.ts.map +1 -0
- package/dist/lib/signal/graph/suspense.js +36 -0
- package/dist/lib/signal/graph/suspense.mjs +290 -0
- package/dist/lib/signal/index-legacy.cjs +2582 -0
- package/dist/lib/signal/index-legacy.d.ts +12 -0
- package/dist/lib/signal/index-legacy.d.ts.map +1 -0
- package/dist/lib/signal/index-legacy.js +11 -0
- package/dist/lib/signal/index-legacy.mjs +2560 -0
- package/dist/lib/signal/index.cjs +1350 -0
- package/dist/lib/signal/index.d.ts +19 -0
- package/dist/lib/signal/index.d.ts.map +1 -0
- package/dist/lib/signal/index.js +19 -0
- package/dist/lib/signal/index.mjs +1328 -0
- package/dist/lib/signal/list.cjs +561 -0
- package/dist/lib/signal/list.d.ts +39 -0
- package/dist/lib/signal/list.d.ts.map +1 -0
- package/dist/lib/signal/list.js +172 -0
- package/dist/lib/signal/list.mjs +538 -0
- package/dist/lib/signal/resource-api.cjs +638 -0
- package/dist/lib/signal/resource-api.d.ts +19 -0
- package/dist/lib/signal/resource-api.d.ts.map +1 -0
- package/dist/lib/signal/resource-api.js +27 -0
- package/dist/lib/signal/resource-api.mjs +615 -0
- package/dist/lib/signal/signal.cjs +2035 -0
- package/dist/lib/signal/signal.d.ts +303 -0
- package/dist/lib/signal/signal.d.ts.map +1 -0
- package/dist/lib/signal/signal.js +1233 -0
- package/dist/lib/signal/signal.mjs +2012 -0
- package/dist/lib/signal/types.cjs +38 -0
- package/dist/lib/signal/types.d.ts +133 -0
- package/dist/lib/signal/types.d.ts.map +1 -0
- package/dist/lib/signal/types.js +38 -0
- package/dist/lib/signal/types.mjs +17 -0
- package/dist/lib/signal/utilities.cjs +1024 -0
- package/dist/lib/signal/utilities.d.ts +247 -0
- package/dist/lib/signal/utilities.d.ts.map +1 -0
- package/dist/lib/signal/utilities.js +346 -0
- package/dist/lib/signal/utilities.mjs +1002 -0
- package/dist/lib/store/api.cjs +662 -0
- package/dist/lib/store/api.d.ts +40 -0
- package/dist/lib/store/api.d.ts.map +1 -0
- package/dist/lib/store/api.js +63 -0
- package/dist/lib/store/api.mjs +646 -0
- package/dist/lib/store/index.cjs +741 -0
- package/dist/lib/store/index.d.ts +16 -0
- package/dist/lib/store/index.d.ts.map +1 -0
- package/dist/lib/store/index.js +13 -0
- package/dist/lib/store/index.mjs +726 -0
- package/dist/lib/store/setter.types.cjs +18 -0
- package/dist/lib/store/setter.types.d.ts +131 -0
- package/dist/lib/store/setter.types.d.ts.map +1 -0
- package/dist/lib/store/setter.types.js +65 -0
- package/dist/lib/store/setter.types.mjs +0 -0
- package/dist/lib/store/store.cjs +708 -0
- package/dist/lib/store/store.d.ts +142 -0
- package/dist/lib/store/store.d.ts.map +1 -0
- package/dist/lib/store/store.js +812 -0
- package/dist/lib/store/store.mjs +694 -0
- package/dist/lib/store/types.cjs +18 -0
- package/dist/lib/store/types.d.ts +57 -0
- package/dist/lib/store/types.d.ts.map +1 -0
- package/dist/lib/store/types.js +1 -0
- package/dist/lib/store/types.mjs +0 -0
- package/dist/lib/store/utils.cjs +43 -0
- package/dist/lib/store/utils.d.ts +13 -0
- package/dist/lib/store/utils.d.ts.map +1 -0
- package/dist/lib/store/utils.js +29 -0
- package/dist/lib/store/utils.mjs +22 -0
- package/dist/lib/subject.cjs +450 -0
- package/dist/lib/subject.d.ts +14 -0
- package/dist/lib/subject.d.ts.map +1 -0
- package/dist/lib/subject.js +81 -0
- package/dist/lib/subject.mjs +427 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/version.generated.cjs +27 -0
- package/dist/version.generated.d.ts +3 -0
- package/dist/version.generated.d.ts.map +1 -0
- package/dist/version.generated.js +3 -0
- package/dist/version.generated.mjs +7 -0
- package/package.json +115 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createResource, on the TC39 core by way of the compat layer. This is
|
|
3
|
+
* Additive, the legacy `createResource` in ../signal.ts stays intact; this is the
|
|
4
|
+
* parallel implementation that runs on the new graph.
|
|
5
|
+
*
|
|
6
|
+
* Resources are the one part of the surface that touches framework-coupled bits, so
|
|
7
|
+
* they're ported by hand. The SSR transport hooks (`nextResourceId`/`getServerData`/
|
|
8
|
+
* `trackResourcePromise`/`reportResourceData`) are standalone module functions, so we
|
|
9
|
+
* Reuse them from ../signal.ts, same `__FX_DATA__` seeding + async-SSR drain as legacy.
|
|
10
|
+
*
|
|
11
|
+
* Suspense boundary integration (throwing the pending promise to a boundary that
|
|
12
|
+
* increments/decrements) lands with the Suspense port; the throwing getter is here so
|
|
13
|
+
* a boundary built on the new effect can catch it.
|
|
14
|
+
*/
|
|
15
|
+
import { createSignal, createEffect, batch, untrack, onCleanup, } from './compat.js';
|
|
16
|
+
// Standalone SSR hooks: graph-agnostic injectables.
|
|
17
|
+
import { nextResourceId, getServerData, trackResourcePromise, reportResourceData, } from './ssr-hooks.js';
|
|
18
|
+
function isPromise(v) {
|
|
19
|
+
return !!v && typeof v.then === 'function';
|
|
20
|
+
}
|
|
21
|
+
const UNSET = Symbol();
|
|
22
|
+
export function createResource(source, fetcherFn, options = {}) {
|
|
23
|
+
let s;
|
|
24
|
+
let fetcher;
|
|
25
|
+
if (typeof fetcherFn === 'function') {
|
|
26
|
+
s = typeof source === 'function' ? source : () => source;
|
|
27
|
+
fetcher = fetcherFn;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
s = () => true;
|
|
31
|
+
fetcher = source;
|
|
32
|
+
if (fetcherFn && typeof fetcherFn === 'object')
|
|
33
|
+
options = fetcherFn;
|
|
34
|
+
}
|
|
35
|
+
// SSR data transport: stable id; on the client seed from server-serialized value.
|
|
36
|
+
// `transport: false` opts out, and takes the id with it. The id is a position in
|
|
37
|
+
// a per-render sequence that the client re-derives by counting resources in the
|
|
38
|
+
// same order, so a resource that exists on one side and not the other shifts
|
|
39
|
+
// every id after it. `lazy()` is exactly that: on the server the first request
|
|
40
|
+
// for a route creates a resource for the module import and later requests find
|
|
41
|
+
// it cached and create none, so the page's own resource was r1 for the first
|
|
42
|
+
// visitor after a restart and r0 for everyone else, while the client, which
|
|
43
|
+
// preloads routes before hydrating, always said r0. Its value is a component
|
|
44
|
+
// function and was never transportable anyway.
|
|
45
|
+
const ssrId = options.transport === false ? undefined : nextResourceId();
|
|
46
|
+
const seed = ssrId !== undefined ? getServerData(ssrId) : undefined;
|
|
47
|
+
let skipFirstFetch = seed !== undefined;
|
|
48
|
+
const [value, setValue] = createSignal(seed !== undefined ? seed.value : options.initialValue, { equals: false });
|
|
49
|
+
const [error, setError] = createSignal(undefined, { equals: false });
|
|
50
|
+
const [state, setState] = createSignal(seed !== undefined || options.initialValue !== undefined ? 'ready' : 'unresolved', { equals: false });
|
|
51
|
+
const [promise, setPromise] = createSignal(undefined, { equals: false });
|
|
52
|
+
const [track, trigger] = createSignal(undefined, { equals: false });
|
|
53
|
+
let prevKey = UNSET;
|
|
54
|
+
let manualRefetch = false;
|
|
55
|
+
createEffect(() => {
|
|
56
|
+
const val = s();
|
|
57
|
+
track();
|
|
58
|
+
if (val === false || val === null || val === undefined) {
|
|
59
|
+
prevKey = UNSET;
|
|
60
|
+
batch(() => {
|
|
61
|
+
setState('unresolved');
|
|
62
|
+
setPromise(undefined);
|
|
63
|
+
setError(undefined);
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const isManual = manualRefetch;
|
|
68
|
+
manualRefetch = false;
|
|
69
|
+
if (prevKey !== UNSET && val === prevKey && !isManual)
|
|
70
|
+
return;
|
|
71
|
+
prevKey = val;
|
|
72
|
+
if (skipFirstFetch) {
|
|
73
|
+
skipFirstFetch = false;
|
|
74
|
+
return; // seeded: source tracked, but no first fetch (no flash on hydration)
|
|
75
|
+
}
|
|
76
|
+
let cancelled = false;
|
|
77
|
+
onCleanup(() => (cancelled = true));
|
|
78
|
+
const currentState = untrack(state);
|
|
79
|
+
const currentValue = untrack(value);
|
|
80
|
+
const isRefreshing = currentState === 'ready' || currentState === 'refreshing';
|
|
81
|
+
batch(() => {
|
|
82
|
+
setState(isRefreshing ? 'refreshing' : 'pending');
|
|
83
|
+
setError(undefined);
|
|
84
|
+
});
|
|
85
|
+
try {
|
|
86
|
+
const res = fetcher(val, { value: currentValue, refetching: isRefreshing });
|
|
87
|
+
if (isPromise(res)) {
|
|
88
|
+
setPromise(res);
|
|
89
|
+
trackResourcePromise(res); // server async SSR: collect & await
|
|
90
|
+
res.then((v) => {
|
|
91
|
+
if (cancelled)
|
|
92
|
+
return;
|
|
93
|
+
if (ssrId !== undefined)
|
|
94
|
+
reportResourceData(ssrId, v); // serialize for hydration
|
|
95
|
+
batch(() => {
|
|
96
|
+
setValue(() => v);
|
|
97
|
+
setState('ready');
|
|
98
|
+
setPromise(undefined);
|
|
99
|
+
});
|
|
100
|
+
}, (e) => {
|
|
101
|
+
if (cancelled)
|
|
102
|
+
return;
|
|
103
|
+
batch(() => {
|
|
104
|
+
setError(e);
|
|
105
|
+
setState('errored');
|
|
106
|
+
setPromise(undefined);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
batch(() => {
|
|
112
|
+
setValue(() => res);
|
|
113
|
+
setState('ready');
|
|
114
|
+
setPromise(undefined);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
if (cancelled)
|
|
120
|
+
return;
|
|
121
|
+
batch(() => {
|
|
122
|
+
setError(e);
|
|
123
|
+
setState('errored');
|
|
124
|
+
setPromise(undefined);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
const loading = () => {
|
|
129
|
+
const st = state();
|
|
130
|
+
return st === 'pending' || st === 'refreshing';
|
|
131
|
+
};
|
|
132
|
+
const resource = (() => {
|
|
133
|
+
const e = error();
|
|
134
|
+
if (e)
|
|
135
|
+
throw e;
|
|
136
|
+
if (loading()) {
|
|
137
|
+
const p = promise();
|
|
138
|
+
if (p)
|
|
139
|
+
throw p; // suspends, a boundary on the new effect catches this
|
|
140
|
+
}
|
|
141
|
+
return value();
|
|
142
|
+
});
|
|
143
|
+
Object.defineProperties(resource, {
|
|
144
|
+
state: { get: state },
|
|
145
|
+
loading: { get: loading },
|
|
146
|
+
error: { get: error },
|
|
147
|
+
latest: { get: value },
|
|
148
|
+
});
|
|
149
|
+
// Stamp the detection markers the legacy createResource sets (signal.ts) so the
|
|
150
|
+
// DOM runtime/control-flow recognise a resource accessor: $RESOURCE for
|
|
151
|
+
// isResource() (e.g. Show's `.loading` gate) and $SIGNAL for isSignal() so
|
|
152
|
+
// insert() reads it reactively instead of caching/freezing it.
|
|
153
|
+
Object.defineProperty(resource, Symbol.for('resource'), { value: true, enumerable: true });
|
|
154
|
+
Object.defineProperty(resource, Symbol.for('signal'), { value: true, enumerable: true });
|
|
155
|
+
return [
|
|
156
|
+
resource,
|
|
157
|
+
{
|
|
158
|
+
mutate: setValue,
|
|
159
|
+
refetch: () => {
|
|
160
|
+
manualRefetch = true;
|
|
161
|
+
trigger(undefined);
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
}
|