@tanstack/store 0.8.1 → 0.9.0
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/dist/cjs/alien.cjs +345 -0
- package/dist/cjs/alien.cjs.map +1 -0
- package/dist/cjs/alien.d.cts +57 -0
- package/dist/cjs/atom.cjs +222 -0
- package/dist/cjs/atom.cjs.map +1 -0
- package/dist/cjs/atom.d.cts +16 -0
- package/dist/cjs/batch.cjs +15 -0
- package/dist/cjs/batch.cjs.map +1 -0
- package/dist/cjs/batch.d.cts +1 -0
- package/dist/cjs/index.cjs +8 -12
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +3 -4
- package/dist/cjs/store.cjs +22 -29
- package/dist/cjs/store.cjs.map +1 -1
- package/dist/cjs/store.d.cts +11 -30
- package/dist/cjs/types.d.cts +47 -20
- package/dist/esm/alien.d.ts +57 -0
- package/dist/esm/alien.js +345 -0
- package/dist/esm/alien.js.map +1 -0
- package/dist/esm/atom.d.ts +16 -0
- package/dist/esm/atom.js +222 -0
- package/dist/esm/atom.js.map +1 -0
- package/dist/esm/batch.d.ts +1 -0
- package/dist/esm/batch.js +15 -0
- package/dist/esm/batch.js.map +1 -0
- package/dist/esm/index.d.ts +3 -4
- package/dist/esm/index.js +8 -12
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/store.d.ts +11 -30
- package/dist/esm/store.js +23 -30
- package/dist/esm/store.js.map +1 -1
- package/dist/esm/types.d.ts +47 -20
- package/package.json +6 -7
- package/src/alien.ts +654 -0
- package/src/atom.ts +298 -0
- package/src/batch.ts +12 -0
- package/src/index.ts +3 -4
- package/src/store.ts +33 -72
- package/src/types.ts +60 -24
- package/dist/cjs/derived.cjs +0 -117
- package/dist/cjs/derived.cjs.map +0 -1
- package/dist/cjs/derived.d.cts +0 -50
- package/dist/cjs/effect.cjs +0 -24
- package/dist/cjs/effect.cjs.map +0 -1
- package/dist/cjs/effect.d.cts +0 -18
- package/dist/cjs/scheduler.cjs +0 -109
- package/dist/cjs/scheduler.cjs.map +0 -1
- package/dist/cjs/scheduler.d.cts +0 -27
- package/dist/cjs/types.cjs +0 -7
- package/dist/cjs/types.cjs.map +0 -1
- package/dist/esm/derived.d.ts +0 -50
- package/dist/esm/derived.js +0 -117
- package/dist/esm/derived.js.map +0 -1
- package/dist/esm/effect.d.ts +0 -18
- package/dist/esm/effect.js +0 -24
- package/dist/esm/effect.js.map +0 -1
- package/dist/esm/scheduler.d.ts +0 -27
- package/dist/esm/scheduler.js +0 -109
- package/dist/esm/scheduler.js.map +0 -1
- package/dist/esm/types.js +0 -7
- package/dist/esm/types.js.map +0 -1
- package/src/derived.ts +0 -203
- package/src/effect.ts +0 -42
- package/src/scheduler.ts +0 -155
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atom.cjs","sources":["../../src/atom.ts"],"sourcesContent":["import { ReactiveFlags, createReactiveSystem, getBatchDepth } from './alien'\n\nimport type { ReactiveNode } from './alien'\nimport type {\n Atom,\n AtomOptions,\n Observer,\n ReadonlyAtom,\n Subscription,\n} from './types'\n\nexport function toObserver<T>(\n nextHandler?: Observer<T> | ((value: T) => void),\n errorHandler?: (error: any) => void,\n completionHandler?: () => void,\n): Observer<T> {\n const isObserver = typeof nextHandler === 'object'\n const self = isObserver ? nextHandler : undefined\n\n return {\n next: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n error: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n complete: (isObserver ? nextHandler.complete : completionHandler)?.bind(\n self,\n ),\n }\n}\n\ninterface InternalAtom<T> extends ReactiveNode {\n _snapshot: T\n _update: (getValue?: T | ((snapshot: T) => T)) => boolean\n get: () => T\n subscribe: (observerOrFn: Observer<T> | ((value: T) => void)) => Subscription\n}\n\nconst queuedEffects: Array<Effect | undefined> = []\nlet cycle = 0\nconst { link, unlink, propagate, checkDirty, shallowPropagate } =\n createReactiveSystem({\n update(atom: InternalAtom<any>): boolean {\n return atom._update()\n },\n // eslint-disable-next-line no-shadow\n notify(effect: Effect): void {\n queuedEffects[queuedEffectsLength++] = effect\n effect.flags &= ~ReactiveFlags.Watching\n },\n unwatched(atom: InternalAtom<any>): void {\n if (atom.depsTail !== undefined) {\n atom.depsTail = undefined\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n purgeDeps(atom)\n }\n },\n })\n\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet activeSub: ReactiveNode | undefined\n\nfunction purgeDeps(sub: ReactiveNode) {\n const depsTail = sub.depsTail\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps\n while (dep !== undefined) {\n dep = unlink(dep, sub)\n }\n}\n\nexport function flush(): void {\n if (getBatchDepth() > 0) {\n return\n }\n while (notifyIndex < queuedEffectsLength) {\n // eslint-disable-next-line no-shadow\n const effect = queuedEffects[notifyIndex]!\n queuedEffects[notifyIndex++] = undefined\n effect.notify()\n }\n notifyIndex = 0\n queuedEffectsLength = 0\n}\n\ntype AsyncAtomState<TData, TError = unknown> =\n | { status: 'pending' }\n | { status: 'done'; data: TData }\n | { status: 'error'; error: TError }\n\nexport function createAsyncAtom<T>(\n getValue: () => Promise<T>,\n options?: AtomOptions<AsyncAtomState<T>>,\n): ReadonlyAtom<AsyncAtomState<T>> {\n const ref: { current?: InternalAtom<AsyncAtomState<T>> } = {}\n const atom = createAtom<AsyncAtomState<T>>(() => {\n getValue().then(\n (data) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'done', data })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n (error) => {\n const internalAtom = ref.current!\n if (internalAtom._update({ status: 'error', error })) {\n const subs = internalAtom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n },\n )\n\n return { status: 'pending' }\n }, options)\n ref.current = atom as unknown as InternalAtom<AsyncAtomState<T>>\n\n return atom\n}\n\nexport function createAtom<T>(\n getValue: (prev?: NoInfer<T>) => T,\n options?: AtomOptions<T>,\n): ReadonlyAtom<T>\nexport function createAtom<T>(\n initialValue: T,\n options?: AtomOptions<T>,\n): Atom<T>\nexport function createAtom<T>(\n valueOrFn: T | ((prev?: T) => T),\n options?: AtomOptions<T>,\n): Atom<T> | ReadonlyAtom<T> {\n const isComputed = typeof valueOrFn === 'function'\n const getter = valueOrFn as (prev?: T) => T\n\n // Create plain object atom\n const atom: InternalAtom<T> = {\n _snapshot: isComputed ? undefined! : valueOrFn,\n\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: isComputed ? ReactiveFlags.None : ReactiveFlags.Mutable,\n\n get(): T {\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n },\n\n subscribe(observerOrFn: Observer<T> | ((value: T) => void)) {\n const obs = toObserver(observerOrFn)\n const observed = { current: false }\n const e = effect(() => {\n atom.get()\n if (!observed.current) {\n observed.current = true\n } else {\n obs.next?.(atom._snapshot)\n }\n })\n\n return {\n unsubscribe: () => {\n e.stop()\n },\n }\n },\n _update(getValue?: T | ((snapshot: T) => T)): boolean {\n const prevSub = activeSub\n const compare = options?.compare ?? Object.is\n activeSub = atom\n ++cycle\n atom.depsTail = undefined\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck\n }\n try {\n const oldValue = atom._snapshot\n const newValue =\n typeof getValue === 'function'\n ? (getValue as (snapshot: T) => T)(oldValue)\n : getValue === undefined && isComputed\n ? getter(oldValue)\n : getValue!\n if (oldValue === undefined || !compare(oldValue, newValue)) {\n atom._snapshot = newValue\n return true\n }\n return false\n } finally {\n activeSub = prevSub\n if (isComputed) {\n atom.flags &= ~ReactiveFlags.RecursedCheck\n }\n purgeDeps(atom)\n }\n },\n }\n\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty\n atom.get = function (): T {\n const flags = atom.flags\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(atom.deps!, atom))\n ) {\n if (atom._update()) {\n const subs = atom.subs\n if (subs !== undefined) {\n shallowPropagate(subs)\n }\n }\n } else if (flags & ReactiveFlags.Pending) {\n atom.flags = flags & ~ReactiveFlags.Pending\n }\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle)\n }\n return atom._snapshot\n }\n } else {\n ;(atom as unknown as Atom<T>).set = function (\n // eslint-disable-next-line no-shadow\n valueOrFn: T | ((prev: T) => T),\n ): void {\n if (atom._update(valueOrFn)) {\n const subs = atom.subs\n if (subs !== undefined) {\n propagate(subs)\n shallowPropagate(subs)\n flush()\n }\n }\n }\n }\n\n return atom as unknown as Atom<T> | ReadonlyAtom<T>\n}\n\ninterface Effect extends ReactiveNode {\n notify: () => void\n stop: () => void\n}\n\nfunction effect<T>(fn: () => T): Effect {\n const run = (): T => {\n const prevSub = activeSub\n activeSub = effectObj\n ++cycle\n effectObj.depsTail = undefined\n effectObj.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck\n try {\n return fn()\n } finally {\n activeSub = prevSub\n effectObj.flags &= ~ReactiveFlags.RecursedCheck\n purgeDeps(effectObj)\n }\n }\n const effectObj: Effect = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck,\n\n notify(): void {\n const flags = this.flags\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(this.deps!, this))\n ) {\n run()\n } else {\n this.flags = ReactiveFlags.Watching\n }\n },\n\n stop(): void {\n this.flags = ReactiveFlags.None\n this.depsTail = undefined\n purgeDeps(this)\n },\n }\n\n run()\n\n return effectObj\n}\n"],"names":["createReactiveSystem","effect","ReactiveFlags","getBatchDepth","valueOrFn"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Atom, AtomOptions, Observer, ReadonlyAtom } from './types.cjs';
|
|
2
|
+
export declare function toObserver<T>(nextHandler?: Observer<T> | ((value: T) => void), errorHandler?: (error: any) => void, completionHandler?: () => void): Observer<T>;
|
|
3
|
+
export declare function flush(): void;
|
|
4
|
+
type AsyncAtomState<TData, TError = unknown> = {
|
|
5
|
+
status: 'pending';
|
|
6
|
+
} | {
|
|
7
|
+
status: 'done';
|
|
8
|
+
data: TData;
|
|
9
|
+
} | {
|
|
10
|
+
status: 'error';
|
|
11
|
+
error: TError;
|
|
12
|
+
};
|
|
13
|
+
export declare function createAsyncAtom<T>(getValue: () => Promise<T>, options?: AtomOptions<AsyncAtomState<T>>): ReadonlyAtom<AsyncAtomState<T>>;
|
|
14
|
+
export declare function createAtom<T>(getValue: (prev?: NoInfer<T>) => T, options?: AtomOptions<T>): ReadonlyAtom<T>;
|
|
15
|
+
export declare function createAtom<T>(initialValue: T, options?: AtomOptions<T>): Atom<T>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const alien = require("./alien.cjs");
|
|
4
|
+
const atom = require("./atom.cjs");
|
|
5
|
+
function batch(fn) {
|
|
6
|
+
try {
|
|
7
|
+
alien.startBatch();
|
|
8
|
+
fn();
|
|
9
|
+
} finally {
|
|
10
|
+
alien.endBatch();
|
|
11
|
+
atom.flush();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.batch = batch;
|
|
15
|
+
//# sourceMappingURL=batch.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.cjs","sources":["../../src/batch.ts"],"sourcesContent":["import { endBatch, startBatch } from './alien'\nimport { flush } from './atom'\n\nexport function batch(fn: () => void) {\n try {\n startBatch()\n fn()\n } finally {\n endBatch()\n flush()\n }\n}\n"],"names":["startBatch","endBatch","flush"],"mappings":";;;;AAGO,SAAS,MAAM,IAAgB;AACpC,MAAI;AACFA,qBAAA;AACA,OAAA;AAAA,EACF,UAAA;AACEC,mBAAA;AACAC,eAAA;AAAA,EACF;AACF;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function batch(fn: () => void): void;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
4
|
-
const effect = require("./effect.cjs");
|
|
3
|
+
const atom = require("./atom.cjs");
|
|
5
4
|
const store = require("./store.cjs");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
exports.
|
|
9
|
-
exports.
|
|
5
|
+
const batch = require("./batch.cjs");
|
|
6
|
+
exports.createAsyncAtom = atom.createAsyncAtom;
|
|
7
|
+
exports.createAtom = atom.createAtom;
|
|
8
|
+
exports.flush = atom.flush;
|
|
9
|
+
exports.toObserver = atom.toObserver;
|
|
10
10
|
exports.Store = store.Store;
|
|
11
|
-
exports.
|
|
12
|
-
exports.
|
|
13
|
-
exports.__derivedToStore = scheduler.__derivedToStore;
|
|
14
|
-
exports.__flush = scheduler.__flush;
|
|
15
|
-
exports.__storeToDerived = scheduler.__storeToDerived;
|
|
16
|
-
exports.batch = scheduler.batch;
|
|
11
|
+
exports.createStore = store.createStore;
|
|
12
|
+
exports.batch = batch.batch;
|
|
17
13
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
package/dist/cjs/index.d.cts
CHANGED
package/dist/cjs/store.cjs
CHANGED
|
@@ -1,38 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
4
|
-
const types = require("./types.cjs");
|
|
3
|
+
const atom = require("./atom.cjs");
|
|
5
4
|
class Store {
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
this.listeners.add(listener);
|
|
11
|
-
const unsub = (_b = (_a = this.options) == null ? void 0 : _a.onSubscribe) == null ? void 0 : _b.call(_a, listener, this);
|
|
12
|
-
return () => {
|
|
13
|
-
this.listeners.delete(listener);
|
|
14
|
-
unsub == null ? void 0 : unsub();
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
this.prevState = initialState;
|
|
18
|
-
this.state = initialState;
|
|
19
|
-
this.options = options;
|
|
5
|
+
constructor(valueOrFn) {
|
|
6
|
+
this.atom = atom.createAtom(
|
|
7
|
+
valueOrFn
|
|
8
|
+
);
|
|
20
9
|
}
|
|
21
10
|
setState(updater) {
|
|
22
|
-
|
|
23
|
-
this.prevState = this.state;
|
|
24
|
-
if ((_a = this.options) == null ? void 0 : _a.updateFn) {
|
|
25
|
-
this.state = this.options.updateFn(this.prevState)(updater);
|
|
26
|
-
} else {
|
|
27
|
-
if (types.isUpdaterFunction(updater)) {
|
|
28
|
-
this.state = updater(this.prevState);
|
|
29
|
-
} else {
|
|
30
|
-
this.state = updater;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
(_c = (_b = this.options) == null ? void 0 : _b.onUpdate) == null ? void 0 : _c.call(_b);
|
|
34
|
-
scheduler.__flush(this);
|
|
11
|
+
this.atom.set(updater);
|
|
35
12
|
}
|
|
13
|
+
get state() {
|
|
14
|
+
return this.atom.get();
|
|
15
|
+
}
|
|
16
|
+
get() {
|
|
17
|
+
return this.state;
|
|
18
|
+
}
|
|
19
|
+
subscribe(observerOrFn) {
|
|
20
|
+
return this.atom.subscribe(atom.toObserver(observerOrFn));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function createStore(valueOrFn) {
|
|
24
|
+
if (typeof valueOrFn === "function") {
|
|
25
|
+
return new Store(valueOrFn);
|
|
26
|
+
}
|
|
27
|
+
return new Store(valueOrFn);
|
|
36
28
|
}
|
|
37
29
|
exports.Store = Store;
|
|
30
|
+
exports.createStore = createStore;
|
|
38
31
|
//# sourceMappingURL=store.cjs.map
|
package/dist/cjs/store.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.cjs","sources":["../../src/store.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"store.cjs","sources":["../../src/store.ts"],"sourcesContent":["import { createAtom, toObserver } from './atom'\nimport type { Atom, Observer, Subscription } from './types'\n\nexport class Store<T> {\n private atom: Atom<T>\n constructor(getValue: (prev?: NoInfer<T>) => T)\n constructor(initialValue: T)\n constructor(valueOrFn: T | ((prev?: T) => T)) {\n // createAtom has overloads that return ReadonlyAtom<T> for functions and Atom<T> for values\n // Store always needs Atom<T> for setState, so we assert the return type\n this.atom = createAtom(\n valueOrFn as T | ((prev?: NoInfer<T>) => T),\n ) as Atom<T>\n }\n public setState(updater: (prev: T) => T) {\n this.atom.set(updater)\n }\n public get state() {\n return this.atom.get()\n }\n public get() {\n return this.state\n }\n public subscribe(\n observerOrFn: Observer<T> | ((value: T) => void),\n ): Subscription {\n return this.atom.subscribe(toObserver(observerOrFn))\n }\n}\n\nexport function createStore<T>(getValue: (prev?: NoInfer<T>) => T): Store<T>\nexport function createStore<T>(initialValue: T): Store<T>\nexport function createStore<T>(valueOrFn: T | ((prev?: T) => T)): Store<T> {\n if (typeof valueOrFn === 'function') {\n return new Store(valueOrFn as (prev?: NoInfer<T>) => T)\n }\n return new Store(valueOrFn)\n}\n"],"names":["createAtom","toObserver"],"mappings":";;;AAGO,MAAM,MAAS;AAAA,EAIpB,YAAY,WAAkC;AAG5C,SAAK,OAAOA,KAAAA;AAAAA,MACV;AAAA,IAAA;AAAA,EAEJ;AAAA,EACO,SAAS,SAAyB;AACvC,SAAK,KAAK,IAAI,OAAO;AAAA,EACvB;AAAA,EACA,IAAW,QAAQ;AACjB,WAAO,KAAK,KAAK,IAAA;AAAA,EACnB;AAAA,EACO,MAAM;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EACO,UACL,cACc;AACd,WAAO,KAAK,KAAK,UAAUC,KAAAA,WAAW,YAAY,CAAC;AAAA,EACrD;AACF;AAIO,SAAS,YAAe,WAA4C;AACzE,MAAI,OAAO,cAAc,YAAY;AACnC,WAAO,IAAI,MAAM,SAAqC;AAAA,EACxD;AACA,SAAO,IAAI,MAAM,SAAS;AAC5B;;;"}
|
package/dist/cjs/store.d.cts
CHANGED
|
@@ -1,31 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
* @return a function to unsubscribe the listener
|
|
11
|
-
*/
|
|
12
|
-
onSubscribe?: (listener: Listener<TState>, store: Store<TState, TUpdater>) => () => void;
|
|
13
|
-
/**
|
|
14
|
-
* Called after the state has been updated, used to derive other state.
|
|
15
|
-
*/
|
|
16
|
-
onUpdate?: () => void;
|
|
17
|
-
}
|
|
18
|
-
export declare class Store<TState, TUpdater extends AnyUpdater = (cb: TState) => TState> {
|
|
19
|
-
listeners: Set<Listener<TState>>;
|
|
20
|
-
state: TState;
|
|
21
|
-
prevState: TState;
|
|
22
|
-
options?: StoreOptions<TState, TUpdater>;
|
|
23
|
-
constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>);
|
|
24
|
-
subscribe: (listener: Listener<TState>) => () => void;
|
|
25
|
-
/**
|
|
26
|
-
* Update the store state safely with improved type checking
|
|
27
|
-
*/
|
|
28
|
-
setState(updater: (prevState: TState) => TState): void;
|
|
29
|
-
setState(updater: TState): void;
|
|
30
|
-
setState(updater: TUpdater): void;
|
|
1
|
+
import { Observer, Subscription } from './types.cjs';
|
|
2
|
+
export declare class Store<T> {
|
|
3
|
+
private atom;
|
|
4
|
+
constructor(getValue: (prev?: NoInfer<T>) => T);
|
|
5
|
+
constructor(initialValue: T);
|
|
6
|
+
setState(updater: (prev: T) => T): void;
|
|
7
|
+
get state(): T;
|
|
8
|
+
get(): T;
|
|
9
|
+
subscribe(observerOrFn: Observer<T> | ((value: T) => void)): Subscription;
|
|
31
10
|
}
|
|
11
|
+
export declare function createStore<T>(getValue: (prev?: NoInfer<T>) => T): Store<T>;
|
|
12
|
+
export declare function createStore<T>(initialValue: T): Store<T>;
|
package/dist/cjs/types.d.cts
CHANGED
|
@@ -1,23 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { ReactiveNode } from './alien.cjs';
|
|
2
|
+
export type Selection<TSelected> = Readable<TSelected>;
|
|
3
|
+
export interface InteropSubscribable<T> {
|
|
4
|
+
subscribe: (observer: Observer<T>) => Subscription;
|
|
5
|
+
}
|
|
6
|
+
export type Observer<T> = {
|
|
7
|
+
next?: (value: T) => void;
|
|
8
|
+
error?: (err: unknown) => void;
|
|
9
|
+
complete?: () => void;
|
|
10
|
+
};
|
|
11
|
+
export interface Subscription {
|
|
12
|
+
unsubscribe: () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface Subscribable<T> extends InteropSubscribable<T> {
|
|
15
|
+
subscribe: ((observer: Observer<T>) => Subscription) & ((next: (value: T) => void, error?: (error: any) => void, complete?: () => void) => Subscription);
|
|
16
|
+
}
|
|
17
|
+
export interface Readable<T> extends Subscribable<T> {
|
|
18
|
+
get: () => T;
|
|
19
|
+
}
|
|
20
|
+
export interface BaseAtom<T> extends Subscribable<T>, Readable<T> {
|
|
21
|
+
}
|
|
22
|
+
export interface InternalBaseAtom<T> extends Subscribable<T>, Readable<T> {
|
|
23
|
+
/** @internal */
|
|
24
|
+
_snapshot: T;
|
|
25
|
+
/** @internal */
|
|
26
|
+
_update: (getValue?: T | ((snapshot: T) => T)) => boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface Atom<T> extends BaseAtom<T> {
|
|
29
|
+
/** Sets the value of the atom using a function. */
|
|
30
|
+
set: ((fn: (prevVal: T) => T) => void) & ((value: T) => void);
|
|
31
|
+
}
|
|
32
|
+
export interface AtomOptions<T> {
|
|
33
|
+
compare?: (prev: T, next: T) => boolean;
|
|
34
|
+
}
|
|
35
|
+
export type AnyAtom = BaseAtom<any>;
|
|
36
|
+
export interface InternalReadonlyAtom<T> extends InternalBaseAtom<T>, ReactiveNode {
|
|
15
37
|
}
|
|
16
38
|
/**
|
|
17
|
-
*
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
*
|
|
39
|
+
* An atom that is read-only and cannot be set.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
*
|
|
43
|
+
* ```ts
|
|
44
|
+
* const atom = createAtom(() => 42);
|
|
45
|
+
* // @ts-expect-error - Cannot set a readonly atom
|
|
46
|
+
* atom.set(43);
|
|
47
|
+
* ```
|
|
22
48
|
*/
|
|
23
|
-
export
|
|
49
|
+
export interface ReadonlyAtom<T> extends BaseAtom<T> {
|
|
50
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface ReactiveNode {
|
|
2
|
+
deps?: Link;
|
|
3
|
+
depsTail?: Link;
|
|
4
|
+
subs?: Link;
|
|
5
|
+
subsTail?: Link;
|
|
6
|
+
flags: ReactiveFlags;
|
|
7
|
+
}
|
|
8
|
+
export interface Link {
|
|
9
|
+
version: number;
|
|
10
|
+
dep: ReactiveNode;
|
|
11
|
+
sub: ReactiveNode;
|
|
12
|
+
prevSub: Link | undefined;
|
|
13
|
+
nextSub: Link | undefined;
|
|
14
|
+
prevDep: Link | undefined;
|
|
15
|
+
nextDep: Link | undefined;
|
|
16
|
+
}
|
|
17
|
+
export declare const enum ReactiveFlags {
|
|
18
|
+
None = 0,
|
|
19
|
+
Mutable = 1,
|
|
20
|
+
Watching = 2,
|
|
21
|
+
RecursedCheck = 4,
|
|
22
|
+
Recursed = 8,
|
|
23
|
+
Dirty = 16,
|
|
24
|
+
Pending = 32
|
|
25
|
+
}
|
|
26
|
+
export declare function createReactiveSystem({ update, notify, unwatched, }: {
|
|
27
|
+
update(sub: ReactiveNode): boolean;
|
|
28
|
+
notify(sub: ReactiveNode): void;
|
|
29
|
+
unwatched(sub: ReactiveNode): void;
|
|
30
|
+
}): {
|
|
31
|
+
link: (dep: ReactiveNode, sub: ReactiveNode, version: number) => void;
|
|
32
|
+
unlink: (link: Link, sub?: ReactiveNode) => Link | undefined;
|
|
33
|
+
propagate: (link: Link) => void;
|
|
34
|
+
checkDirty: (link: Link, sub: ReactiveNode) => boolean;
|
|
35
|
+
shallowPropagate: (link: Link) => void;
|
|
36
|
+
};
|
|
37
|
+
export declare function getActiveSub(): ReactiveNode | undefined;
|
|
38
|
+
export declare function setActiveSub(sub?: ReactiveNode): ReactiveNode | undefined;
|
|
39
|
+
export declare function getBatchDepth(): number;
|
|
40
|
+
export declare function startBatch(): void;
|
|
41
|
+
export declare function endBatch(): void;
|
|
42
|
+
export declare function isSignal(fn: () => void): boolean;
|
|
43
|
+
export declare function isComputed(fn: () => void): boolean;
|
|
44
|
+
export declare function isEffect(fn: () => void): boolean;
|
|
45
|
+
export declare function isEffectScope(fn: () => void): boolean;
|
|
46
|
+
export declare function signal<T>(): {
|
|
47
|
+
(): T | undefined;
|
|
48
|
+
(value: T | undefined): void;
|
|
49
|
+
};
|
|
50
|
+
export declare function signal<T>(initialValue: T): {
|
|
51
|
+
(): T;
|
|
52
|
+
(value: T): void;
|
|
53
|
+
};
|
|
54
|
+
export declare function computed<T>(getter: (previousValue?: T) => T): () => T;
|
|
55
|
+
export declare function effect(fn: () => void): () => void;
|
|
56
|
+
export declare function effectScope(fn: () => void): () => void;
|
|
57
|
+
export declare function trigger(fn: () => void): void;
|