diff --git a/src/config/enableSvelteStore.ts b/src/config/enableSvelteStore.ts new file mode 100644 index 00000000..0a509cec --- /dev/null +++ b/src/config/enableSvelteStore.ts @@ -0,0 +1,33 @@ +import { internal, NodeInfo } from '@legendapp/state'; +import { configureLegendState } from '@legendapp/state/config'; + +type Subscriber = (value: T) => void; +type Unsubscriber = () => void; +type Updater = (value: T) => T; + +export function enableSvelteStore() { + configureLegendState({ + observableFunctions: { + subscribe: (node: NodeInfo, run: Subscriber): Unsubscriber => { + const proxy = internal.getProxy(node); + run(proxy.get()); + return proxy.onChange(({ value }) => run(value)); + }, + update: (node: NodeInfo, updater: Updater) => { + internal.getProxy(node).set(updater); + }, + }, + }); +} + +// Types: + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import type { ImmutableObservableBase } from '@legendapp/state'; + +declare module '@legendapp/state' { + interface ImmutableObservableBase { + subscribe(this: void, run: Subscriber): Unsubscriber; + update(this: void, updater: Updater): void; + } +}