cross-state 0.6.0 → 0.6.1
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/hash.cjs
CHANGED
|
@@ -365,6 +365,9 @@ const recordActions = {
|
|
|
365
365
|
};
|
|
366
366
|
const mapActions = {
|
|
367
367
|
set(key, value) {
|
|
368
|
+
if (value instanceof Function) {
|
|
369
|
+
value = value(this.get().get(key));
|
|
370
|
+
}
|
|
368
371
|
const newMap = new Map(this.get());
|
|
369
372
|
newMap.set(key, value);
|
|
370
373
|
this.update(newMap);
|
package/dist/cjs/hash.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.cjs","sources":["../../src/lib/queue.ts","../../src/lib/trackingProxy.ts","../../src/lib/calculationHelper.ts","../../src/lib/propAccess.ts","../../src/lib/makeSelector.ts","../../src/lib/bind.ts","../../src/lib/calcDuration.ts","../../src/lib/equals.ts","../../src/lib/forwardError.ts","../../src/lib/storeActions.ts","../../src/lib/throttle.ts","../../src/core/store.ts","../../src/core/derivedStore.ts","../../src/lib/hash.ts"],"sourcesContent":["import type { MaybePromise } from './maybePromise';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>): Promise<T>;\n clear: () => void;\n whenDone: Promise<void>;\n}\n\nexport function queue(): Queue {\n const q: { action: Action<any>; resolve: (value: any) => void; reject: (error: unknown) => void }[] = [];\n let promise: Promise<void> | undefined, resolve: (() => void) | undefined;\n let active = false;\n\n const run = async () => {\n if (!active) {\n active = true;\n\n let next;\n while ((next = q.shift())) {\n try {\n let result = next.action();\n if (result instanceof Promise) {\n result = await result;\n }\n next.resolve(result);\n } catch (e) {\n next.reject(e);\n }\n }\n\n active = false;\n resolve?.();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject });\n run();\n });\n },\n {\n clear() {\n q.length = 0;\n resolve?.();\n },\n\n get whenDone() {\n if (!promise) {\n promise = new Promise<void>((r) => {\n resolve = () => {\n promise = undefined;\n resolve = undefined;\n r();\n };\n });\n }\n\n return promise;\n },\n }\n );\n}\n","export type TrackingProxy<T> = [value: T, equals: (newValue: T) => boolean];\ntype Obj = Record<string | symbol, unknown>;\n\nconst ProxyKeys = ['get', 'getOwnPropertyDescriptor', 'getPrototypeOf', 'has', 'isExtensible', 'ownKeys'] as const;\n\nconst isPlainObject = (value: unknown) => typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype;\n\nexport function trackingProxy<T>(value: T): TrackingProxy<T> {\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [value, (other) => other === value];\n }\n\n const deps = new Array<TrackingProxy<any>[1]>();\n\n const proxy = new Proxy(\n value as T & Obj,\n Object.fromEntries(\n ProxyKeys.map((key) => [\n key,\n (value: T & Obj, ...args: any[]) => {\n const fn = Reflect[key] as any;\n const [proxiedValue, equals] = trackingProxy(fn(value, ...args));\n\n deps.push((otherValue) => {\n if (!isPlainObject(otherValue) && !Array.isArray(otherValue)) {\n return false;\n }\n\n return equals(fn(otherValue, ...args));\n });\n\n return proxiedValue;\n },\n ])\n )\n );\n\n return [proxy, (other) => !!other && deps.every((equals) => equals(other))];\n}\n","import type { Cancel, UpdateFrom, Use, UseFetch } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { MaybePromise } from './maybePromise';\nimport { queue } from './queue';\nimport { trackingProxy } from './trackingProxy';\n\nexport class CalculationHelper<T> {\n private current?: {\n cancel: Cancel;\n check: () => void;\n };\n\n constructor(\n private options: {\n calculate: (fns: {\n use: Use;\n useFetch: UseFetch;\n updateValue: (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) => void;\n updateError: (error: unknown) => void;\n }) => Cancel | void;\n addEffect: (effect: () => Cancel | void) => Cancel;\n getValue: () => T | undefined;\n setValue?: (value: T) => void;\n setError?: (error: unknown) => void;\n onInvalidate?: () => void;\n }\n ) {\n options.addEffect(() => {\n if (this.current) {\n this.current.check();\n } else {\n this.execute();\n }\n });\n }\n\n execute() {\n this.stop();\n\n const { calculate, addEffect, getValue, setValue, setError, onInvalidate } = this.options;\n const checks = new Array<() => boolean>();\n const deps = new Map<Store<any>, { on: () => void; off: () => void }>();\n const q = queue();\n let isActive = false;\n let isCancled = false;\n\n const cancelEffect = addEffect(() => {\n isActive = true;\n\n for (const dep of deps.values()) {\n dep.on();\n }\n\n return () => {\n isActive = false;\n\n for (const dep of deps.values()) {\n dep.off();\n }\n };\n });\n\n const cancel = () => {\n isCancled = true;\n cancelSubscription?.();\n cancelEffect();\n delete this.current;\n };\n\n const check = () => {\n if (!checks.every((check) => check())) {\n cancel();\n onInvalidate?.();\n }\n };\n\n const use: Use = (store, { disableProxy } = {}) => {\n if (isCancled) {\n return store.get();\n }\n\n let value = store.get();\n let equals = (newValue: any) => {\n return newValue === value;\n };\n\n if (!disableProxy) {\n [value, equals] = trackingProxy(value);\n }\n\n let sub: Cancel | undefined;\n\n const dep = {\n on() {\n this.off();\n\n sub = store.sub(check, { runNow: false });\n },\n off() {\n sub?.();\n sub = undefined;\n },\n };\n\n if (isActive) {\n dep.on();\n }\n\n checks.push(() => equals(store.get()));\n deps.set(store, dep);\n\n return value;\n };\n\n const useFetch: UseFetch = (store) => {\n if (isCancled) {\n return store.fetch();\n }\n\n const value = store.fetch();\n const ref = store.get().ref;\n\n let sub: Cancel | undefined;\n\n const dep = {\n on() {\n this.off();\n sub = store.sub(check, { runNow: false });\n },\n off() {\n sub?.();\n sub = undefined;\n },\n };\n\n if (isActive) {\n dep.on();\n }\n\n checks.push(() => {\n return store.get().ref === ref;\n });\n deps.set(store, dep);\n\n return value;\n };\n\n const updateValue = (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) =>\n q(async () => {\n if (isCancled) {\n return;\n }\n\n if (update instanceof Function) {\n try {\n update = update(getValue());\n } catch (error) {\n setError?.(error);\n return;\n }\n }\n\n if (update instanceof Promise) {\n try {\n update = await update;\n } catch (error) {\n if (!isCancled) {\n setError?.(error);\n }\n return;\n }\n }\n\n if (!isCancled) {\n setValue?.(update);\n }\n });\n\n const updateError = (error: unknown) =>\n q(() => {\n if (!isCancled) {\n setError?.(error);\n }\n });\n\n let cancelSubscription: Cancel | void;\n try {\n cancelSubscription = calculate({ use, useFetch, updateValue, updateError });\n } catch (error) {\n setError?.(error);\n }\n\n this.current = { cancel, check };\n }\n\n stop() {\n this.current?.cancel();\n }\n\n check() {\n this.current?.check();\n }\n}\n","import type { Update } from '../core/commonTypes';\n\ntype FilterKey<T> = T extends string | number ? T : never;\ntype FilterString<T> = T extends string ? T : never;\n\nexport type Obj = Record<string | number, unknown>;\nexport type Arr = readonly unknown[];\n\ntype GetKeys<T> = T extends Arr\n ? T extends readonly [] // special case empty tuple => no keys\n ? never\n : '0' extends keyof T // any tuple with at least one element\n ? keyof T & `${number}`\n : number // other array\n : keyof T; // not an array\n\nexport type Path<T> = 0 extends 1 & T\n ? string\n : T extends never\n ? never\n : T extends Obj | Arr\n ? FilterString<\n keyof {\n [K in FilterKey<GetKeys<T>> as `${K}` | (T[K] extends Obj | Arr | undefined | null ? `${K}.${Path<NonNullable<T[K]>>}` : never)]: 0;\n }\n >\n : never;\n\nexport type Value<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? T[K & keyof T] extends Obj | Arr\n ? Value<T[K & keyof T], Rest>\n : T[K & keyof T] extends Obj | Arr | undefined | null\n ? Value<NonNullable<T[K & keyof T]>, Rest> | undefined\n : never\n : T[P & keyof T];\n\nexport function get<T, P extends Path<T>>(obj: T, path: P): Value<T, P> {\n if (path === '') {\n return obj as any;\n }\n\n if (!(obj instanceof Object)) {\n throw new Error(`Could not get ${path} of ${obj}`);\n }\n\n const index = path.indexOf('.');\n\n if (index >= 0) {\n const key = path.slice(0, index);\n const rest = path.slice(index + 1);\n const subObj = (obj as Obj | Arr)[key as any];\n\n if (!subObj) {\n return undefined as any;\n }\n\n return get(subObj as Record<string, unknown>, rest) as any;\n }\n\n return (obj as Obj | Arr)[path as any] as any;\n}\n\nexport function set<T, P extends Path<T>>(obj: T, path: P, value: Update<Value<T, P>>, rootPath = path): T {\n if (path === '') {\n return value as any;\n }\n\n if (!(obj instanceof Object)) {\n throw new Error(`Could not set ${path} of ${obj}`);\n }\n\n const index = path.indexOf('.');\n let key, update;\n\n if (index >= 0) {\n key = path.slice(0, index);\n const rest = path.slice(index + 1);\n const subObj = (obj as Obj | Arr)[key as any];\n\n if (!subObj) {\n const prefix = rootPath.slice(0, -rest.length - 1);\n throw Error(`Cannot set ${rootPath} because ${prefix} is ${subObj}`);\n }\n\n update = set(subObj as Record<string, unknown>, rest, value, rootPath);\n } else {\n key = path;\n update = value instanceof Function ? value((obj as any)[key]) : value;\n }\n\n if (Array.isArray(obj)) {\n const copy = Array.from(obj);\n copy[key as any] = update;\n return copy as any;\n }\n\n return {\n ...obj,\n [key]: update,\n };\n}\n","import { get } from './propAccess';\n\nexport function makeSelector<T, S>(selector?: ((value: T) => S) | string): (value: T) => S {\n if (!selector) {\n return (x) => x as any;\n }\n\n if (selector instanceof Function) {\n return selector;\n }\n\n return (x) => get(x, selector as any) as any;\n}\n","const getAllProperties = (object: any) => {\n const properties = new Set<[any, string | symbol]>();\n\n do {\n for (const key of Reflect.ownKeys(object)) {\n properties.add([object, key]);\n }\n } while ((object = Reflect.getPrototypeOf(object)) && object !== Object.prototype);\n\n return properties;\n};\n\nexport function bind(self: any) {\n for (const [object, key] of getAllProperties(self.constructor.prototype)) {\n if (key === 'constructor') {\n continue;\n }\n\n const descriptor = Reflect.getOwnPropertyDescriptor(object, key);\n if (descriptor && typeof descriptor.value === 'function') {\n self[key] = self[key].bind(self);\n }\n }\n}\n","import type { Duration } from '../core/commonTypes';\n\nexport const calcDuration = (t: Duration) => {\n if (typeof t === 'number') return t;\n return (\n (t.milliseconds ?? 0) +\n (t.seconds ?? 0) * 1000 +\n (t.minutes ?? 0) * 60 * 1000 +\n (t.hours ?? 0) * 60 * 60 * 1000 +\n (t.days ?? 0) * 24 * 60 * 60 * 1000\n );\n};\n","export const defaultEquals = (a: any, b: any) => a === b;\n\nexport const simpleShallowEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => value === b[i]);\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const e1 = Object.entries(a);\n const e2 = Object.entries(b);\n return e1.length === e2.length && e1.every(([key, value]) => value === b[key]);\n }\n\n return false;\n};\n\nexport const simpleDeepEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => simpleDeepEquals(value, b[i]));\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const e1 = Object.entries(a);\n const e2 = Object.entries(b);\n return e1.length === e2.length && e1.every(([key, value]) => simpleDeepEquals(value, b[key]));\n }\n\n return false;\n};\n","export function forwardError(error: unknown) {\n setTimeout(() => {\n throw error;\n });\n}\n","import type { Update } from '@core/commonTypes';\nimport type { Store } from '../core/store';\n\ntype Fn = (...args: any) => any;\n\nconst arrMod = <P extends keyof Array<any>>(prop: P) =>\n function <V>(\n this: Store<Array<V>>,\n ...args: Array<V>[P] extends Fn ? Parameters<Array<V>[P]> : never\n ): Array<V>[P] extends Fn ? ReturnType<Array<V>[P]> : never {\n const newArr = this.get().slice();\n const result = (newArr[prop] as Fn)(...(args as any));\n this.update(newArr);\n return result;\n };\n\nexport const arrayActions = {\n splice: arrMod('splice'),\n push: arrMod('push'),\n pop: arrMod('pop'),\n shift: arrMod('shift'),\n unshift: arrMod('unshift'),\n reverse: arrMod('reverse'),\n sort: arrMod('sort'),\n};\n\nexport const recordActions = {\n set<K extends string | number | symbol, V>(this: Store<Record<K, V>>, key: K, value: Update<V>) {\n if (value instanceof Function) {\n value = value(this.get()[key]);\n }\n\n this.update({ ...this.get(), [key]: value });\n return this;\n },\n\n delete<K extends string | number | symbol, V>(this: Store<Record<K, V>>, key: K) {\n const copy = { ...(this.get() as Record<K, V>) };\n delete copy[key];\n this.update(copy);\n },\n\n clear<K extends string | number | symbol, V>(this: Store<Record<K, V>>) {\n this.update({} as Record<K, V>);\n },\n};\n\nexport const mapActions = {\n set<K, V>(this: Store<Map<K, V>>, key: K, value: V) {\n const newMap = new Map(this.get());\n newMap.set(key, value);\n this.update(newMap);\n return this;\n },\n\n delete<K, V>(this: Store<Map<K, V>>, key: K) {\n const newMap = new Map(this.get());\n const result = newMap.delete(key);\n this.update(newMap);\n return result;\n },\n\n clear<K, V>(this: Store<Map<K, V>>) {\n this.update(new Map());\n },\n};\n\nexport const setActions = {\n add<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.add(value);\n this.update(newSet);\n },\n\n delete<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.delete(value);\n this.update(newSet);\n },\n\n clear<T>(this: Store<Set<T>>) {\n this.update(new Set());\n },\n};\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): (...args: Args) => void {\n let t = 0;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n return (...args: Args) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n const dt = t + ms - Date.now();\n if (dt <= 0) {\n fn(...args);\n t = Date.now();\n return;\n }\n\n timeout = setTimeout(() => {\n fn(...args);\n t = Date.now();\n }, dt);\n };\n}\n","import { bind } from '@lib/bind';\nimport { calcDuration } from '@lib/calcDuration';\nimport { defaultEquals } from '@lib/equals';\nimport { forwardError } from '@lib/forwardError';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/propAccess';\nimport { arrayActions, mapActions, recordActions, setActions } from '@lib/storeActions';\nimport { throttle } from '@lib/throttle';\nimport type { Cancel, Duration, Effect, Listener, Selector, SubscribeOptions, Update, Use, UseOptions } from './commonTypes';\nimport { DerivedStore } from './derivedStore';\n\nexport type StoreActions = Record<string, (...args: any[]) => any>;\n\nexport type BoundStoreActions<T, Actions extends StoreActions> = Actions & ThisType<Store<T> & Actions>;\n\nexport interface StoreOptions {\n retain?: number;\n}\n\nexport interface StoreOptionsWithActions<T, Actions extends StoreActions> extends StoreOptions {\n methods?: Actions & ThisType<Store<T> & Actions & StandardActions<T>>;\n}\n\ntype StandardActions<T> = T extends Map<any, any>\n ? typeof mapActions\n : T extends Set<any>\n ? typeof setActions\n : T extends Array<any>\n ? typeof arrayActions\n : T extends Record<any, any>\n ? typeof recordActions\n : Record<string, never>;\n\ntype StoreWithActions<T, Actions extends StoreActions> = Store<T> &\n Omit<BoundStoreActions<T, Actions>, keyof Store<T>> &\n StandardActions<T>;\n\nconst noop = () => undefined;\n\nexport class Store<T> {\n protected value = this.initialValue;\n protected listeners = new Set<Listener>();\n protected effects = new Map<Effect, { handle?: Cancel; retain?: number; timeout?: ReturnType<typeof setTimeout> }>();\n protected notifyId = {};\n\n constructor(protected readonly initialValue: T, protected readonly options: StoreOptions = {}) {\n bind(this);\n }\n\n get(): T {\n return this.value;\n }\n\n update(update: Update<T>): void {\n if (update instanceof Function) {\n update = update(this.get());\n }\n\n this.value = update;\n this.notify();\n }\n\n sub(listener: Listener<T>, options?: SubscribeOptions): Cancel {\n const { runNow = true, throttle: throttleOption, equals = defaultEquals } = options ?? {};\n\n let compareToValue = this.get();\n let previousValue: T | undefined;\n let hasRun = false;\n\n let innerListener = (force?: boolean | void) => {\n const value = this.get();\n\n if (!force && equals(value, compareToValue)) {\n return;\n }\n\n compareToValue = value;\n const _previousValue = previousValue;\n previousValue = value;\n hasRun = true;\n\n try {\n listener(value, _previousValue);\n } catch (error) {\n forwardError(error);\n }\n };\n\n if (throttleOption) {\n innerListener = throttle(innerListener, calcDuration(throttleOption));\n }\n\n this.listeners.add(innerListener);\n this.onSubscribe();\n\n if (runNow && !hasRun) {\n innerListener(true);\n }\n\n return () => {\n this.listeners.delete(innerListener);\n this.onUnsubscribe();\n };\n }\n\n map<S>(selector: Selector<T, S>, options?: UseOptions): DerivedStore<S>;\n map<P extends Path<T>>(selector: P, options?: UseOptions): DerivedStore<Value<T, P>>;\n map(_selector: Selector<T, any> | string, options?: UseOptions): DerivedStore<any> {\n const selector = makeSelector(_selector);\n const derivedFrom = { store: this, selectors: [_selector] };\n\n return new DerivedStore(({ use }) => {\n return selector(use(this, options));\n }, derivedFrom);\n }\n\n /** Add an effect that will be executed when the store becomes active, which means when it has at least one subscriber.\n * @param effect\n * If there is already a subscriber, the effect will be executed immediately.\n * Otherweise it will be executed as soon as the first subscription is created.\n * Every time all subscriptions are removed and the first is created again, the effect will be executed again.\n * @param retain\n * If provided, delay tearing down effects when the last subscriber is removed. This is useful if a short gap in subscriber coverage is supposed to be ignored. E.g. when switching pages, the old page might unsubscribe, while the new page subscribes immediately after.\n * @returns\n * The effect can return a teardown callback, which will be executed when the last subscription is removed and potentially the ratain time has passed.\n */\n addEffect(effect: Effect, retain?: Duration) {\n this.effects.set(effect, {\n handle: this.listeners.size > 0 ? effect() ?? noop : undefined,\n retain: retain !== undefined ? calcDuration(retain) : undefined,\n });\n\n return () => {\n const { handle, timeout } = this.effects.get(effect) ?? {};\n handle?.();\n timeout !== undefined && clearTimeout(timeout);\n this.effects.delete(effect);\n };\n }\n\n /** Return whether the store is currently active, which means whether it has at least one subscriber. */\n get isActive() {\n return this.listeners.size > 0;\n }\n\n protected onSubscribe() {\n if (this.listeners.size > 1) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n timeout !== undefined && clearTimeout(timeout);\n\n this.effects.set(effect, {\n handle: handle ?? effect() ?? noop,\n retain,\n timeout: undefined,\n });\n }\n }\n\n protected onUnsubscribe() {\n if (this.listeners.size > 0) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n !retain && handle?.();\n timeout !== undefined && clearTimeout(timeout);\n\n this.effects.set(effect, {\n handle: retain ? handle : undefined,\n retain,\n timeout: retain && handle ? setTimeout(handle, retain) : undefined,\n });\n }\n }\n\n protected notify() {\n const n = (this.notifyId = {});\n for (const listener of [...this.listeners]) {\n listener();\n if (n !== this.notifyId) break;\n }\n }\n}\n\nconst defaultOptions: StoreOptions = {};\n\nfunction _store<T>(calculate: (this: { use: Use }, fns: { use: Use }) => T, options?: StoreOptions): DerivedStore<T>;\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction _store<T, Actions extends StoreActions = {}>(\n initialState: T,\n options?: StoreOptionsWithActions<T, Actions>\n): StoreWithActions<T, Actions>;\nfunction _store<T, Actions extends StoreActions>(\n initialState: T | ((this: { use: Use }, fns: { use: Use }) => T),\n options?: StoreOptionsWithActions<T, Actions>\n): StoreWithActions<T, Actions> | DerivedStore<T> {\n if (initialState instanceof Function) {\n return new DerivedStore(initialState);\n }\n\n let methods: StoreActions | undefined = options?.methods;\n\n if (initialState instanceof Map) {\n methods = { ...mapActions, ...methods };\n } else if (initialState instanceof Set) {\n methods = { ...setActions, ...methods };\n } else if (Array.isArray(initialState)) {\n methods = { ...arrayActions, ...methods };\n } else if (initialState instanceof Object) {\n methods = { ...recordActions, ...methods };\n }\n\n const store = new Store(initialState, options);\n\n const boundActions = Object.fromEntries(\n Object.entries(methods ?? ({} as BoundStoreActions<T, any>))\n .filter(([name]) => !(name in store))\n .map(([name, fn]) => [name, (fn as any).bind(store)])\n ) as BoundStoreActions<T, any>;\n\n return Object.assign(store, boundActions);\n}\n\nexport const store = Object.assign(_store, { defaultOptions });\n","import { CalculationHelper } from '@lib/calculationHelper';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/propAccess';\nimport { get, set } from '@lib/propAccess';\nimport type { Cancel, Selector, Update, Use } from './commonTypes';\nimport { Store } from './store';\n\nexport class DerivedStore<T> extends Store<T> {\n calculationHelper = new CalculationHelper({\n calculate: ({ use }) => {\n const value = this.calculate.apply({ use }, [{ use }]);\n this.valid = true;\n super.update(value);\n },\n\n addEffect: this.addEffect,\n getValue: () => this.value,\n onInvalidate: this.invalidate,\n });\n\n protected valid = false;\n protected check?: () => void;\n protected cancel?: Cancel;\n\n constructor(\n protected calculate: (this: { use: Use }, fns: { use: Use }) => T,\n protected derivedFrom?: { store: Store<any>; selectors: (Selector<any, any> | string)[] }\n ) {\n super(undefined as T);\n }\n\n get(): T {\n if (!this.valid) {\n this.calculationHelper.execute();\n }\n\n return super.get();\n }\n\n update(update: Update<T>): void {\n if (this.derivedFrom && this.derivedFrom.selectors.every((selector) => typeof selector === 'string')) {\n const path = this.derivedFrom.selectors.join('.');\n\n if (update instanceof Function) {\n const before = get<any, any>(this.derivedFrom.store, path) as T;\n update = update(before);\n }\n\n this.derivedFrom.store.update((before: any) => set<any, any>(before, path, update));\n } else {\n throw new Error('Can only updated computed stores that are derived from other stores using string selectors');\n }\n }\n\n map<S>(selector: Selector<T, S>): DerivedStore<S>;\n map<P extends Path<T>>(selector: P): DerivedStore<Value<T, P>>;\n map(_selector: string | Selector<T, any>): DerivedStore<any> {\n const selector = makeSelector(_selector);\n\n const derivedFrom = this.derivedFrom ?? { store: this, selectors: [] };\n const newDerivedFrom = { ...derivedFrom, selectors: derivedFrom.selectors.concat(_selector) };\n\n return new DerivedStore(({ use }) => {\n return selector(use(this));\n }, newDerivedFrom);\n }\n\n protected invalidate() {\n this.valid = false;\n\n if (this.isActive) {\n this.calculationHelper.execute();\n }\n }\n}\n\nfunction _derivedStore<T>(calculate: (this: { use: Use }, fns: { use: Use }) => T) {\n return new DerivedStore(calculate);\n}\n\nexport const derivedStore = Object.assign(_derivedStore, {});\n","export function hash(value: unknown): string {\n if (value instanceof Set) {\n return `s[${[...value].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Map) {\n return `m[${[...value.entries()].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Array) {\n return `[${value.map(hash).join(',')}]`;\n }\n\n if (value instanceof Object) {\n return `o[${Object.entries(value).map(hash).sort().join(',')}]`;\n }\n\n return JSON.stringify(value);\n}\n"],"names":["resolve","value","check","store"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hash.cjs","sources":["../../src/lib/queue.ts","../../src/lib/trackingProxy.ts","../../src/lib/calculationHelper.ts","../../src/lib/propAccess.ts","../../src/lib/makeSelector.ts","../../src/lib/bind.ts","../../src/lib/calcDuration.ts","../../src/lib/equals.ts","../../src/lib/forwardError.ts","../../src/lib/storeActions.ts","../../src/lib/throttle.ts","../../src/core/store.ts","../../src/core/derivedStore.ts","../../src/lib/hash.ts"],"sourcesContent":["import type { MaybePromise } from './maybePromise';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>): Promise<T>;\n clear: () => void;\n whenDone: Promise<void>;\n}\n\nexport function queue(): Queue {\n const q: { action: Action<any>; resolve: (value: any) => void; reject: (error: unknown) => void }[] = [];\n let promise: Promise<void> | undefined, resolve: (() => void) | undefined;\n let active = false;\n\n const run = async () => {\n if (!active) {\n active = true;\n\n let next;\n while ((next = q.shift())) {\n try {\n let result = next.action();\n if (result instanceof Promise) {\n result = await result;\n }\n next.resolve(result);\n } catch (e) {\n next.reject(e);\n }\n }\n\n active = false;\n resolve?.();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject });\n run();\n });\n },\n {\n clear() {\n q.length = 0;\n resolve?.();\n },\n\n get whenDone() {\n if (!promise) {\n promise = new Promise<void>((r) => {\n resolve = () => {\n promise = undefined;\n resolve = undefined;\n r();\n };\n });\n }\n\n return promise;\n },\n }\n );\n}\n","export type TrackingProxy<T> = [value: T, equals: (newValue: T) => boolean];\ntype Obj = Record<string | symbol, unknown>;\n\nconst ProxyKeys = ['get', 'getOwnPropertyDescriptor', 'getPrototypeOf', 'has', 'isExtensible', 'ownKeys'] as const;\n\nconst isPlainObject = (value: unknown) => typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype;\n\nexport function trackingProxy<T>(value: T): TrackingProxy<T> {\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [value, (other) => other === value];\n }\n\n const deps = new Array<TrackingProxy<any>[1]>();\n\n const proxy = new Proxy(\n value as T & Obj,\n Object.fromEntries(\n ProxyKeys.map((key) => [\n key,\n (value: T & Obj, ...args: any[]) => {\n const fn = Reflect[key] as any;\n const [proxiedValue, equals] = trackingProxy(fn(value, ...args));\n\n deps.push((otherValue) => {\n if (!isPlainObject(otherValue) && !Array.isArray(otherValue)) {\n return false;\n }\n\n return equals(fn(otherValue, ...args));\n });\n\n return proxiedValue;\n },\n ])\n )\n );\n\n return [proxy, (other) => !!other && deps.every((equals) => equals(other))];\n}\n","import type { Cancel, UpdateFrom, Use, UseFetch } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { MaybePromise } from './maybePromise';\nimport { queue } from './queue';\nimport { trackingProxy } from './trackingProxy';\n\nexport class CalculationHelper<T> {\n private current?: {\n cancel: Cancel;\n check: () => void;\n };\n\n constructor(\n private options: {\n calculate: (fns: {\n use: Use;\n useFetch: UseFetch;\n updateValue: (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) => void;\n updateError: (error: unknown) => void;\n }) => Cancel | void;\n addEffect: (effect: () => Cancel | void) => Cancel;\n getValue: () => T | undefined;\n setValue?: (value: T) => void;\n setError?: (error: unknown) => void;\n onInvalidate?: () => void;\n }\n ) {\n options.addEffect(() => {\n if (this.current) {\n this.current.check();\n } else {\n this.execute();\n }\n });\n }\n\n execute() {\n this.stop();\n\n const { calculate, addEffect, getValue, setValue, setError, onInvalidate } = this.options;\n const checks = new Array<() => boolean>();\n const deps = new Map<Store<any>, { on: () => void; off: () => void }>();\n const q = queue();\n let isActive = false;\n let isCancled = false;\n\n const cancelEffect = addEffect(() => {\n isActive = true;\n\n for (const dep of deps.values()) {\n dep.on();\n }\n\n return () => {\n isActive = false;\n\n for (const dep of deps.values()) {\n dep.off();\n }\n };\n });\n\n const cancel = () => {\n isCancled = true;\n cancelSubscription?.();\n cancelEffect();\n delete this.current;\n };\n\n const check = () => {\n if (!checks.every((check) => check())) {\n cancel();\n onInvalidate?.();\n }\n };\n\n const use: Use = (store, { disableProxy } = {}) => {\n if (isCancled) {\n return store.get();\n }\n\n let value = store.get();\n let equals = (newValue: any) => {\n return newValue === value;\n };\n\n if (!disableProxy) {\n [value, equals] = trackingProxy(value);\n }\n\n let sub: Cancel | undefined;\n\n const dep = {\n on() {\n this.off();\n\n sub = store.sub(check, { runNow: false });\n },\n off() {\n sub?.();\n sub = undefined;\n },\n };\n\n if (isActive) {\n dep.on();\n }\n\n checks.push(() => equals(store.get()));\n deps.set(store, dep);\n\n return value;\n };\n\n const useFetch: UseFetch = (store) => {\n if (isCancled) {\n return store.fetch();\n }\n\n const value = store.fetch();\n const ref = store.get().ref;\n\n let sub: Cancel | undefined;\n\n const dep = {\n on() {\n this.off();\n sub = store.sub(check, { runNow: false });\n },\n off() {\n sub?.();\n sub = undefined;\n },\n };\n\n if (isActive) {\n dep.on();\n }\n\n checks.push(() => {\n return store.get().ref === ref;\n });\n deps.set(store, dep);\n\n return value;\n };\n\n const updateValue = (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) =>\n q(async () => {\n if (isCancled) {\n return;\n }\n\n if (update instanceof Function) {\n try {\n update = update(getValue());\n } catch (error) {\n setError?.(error);\n return;\n }\n }\n\n if (update instanceof Promise) {\n try {\n update = await update;\n } catch (error) {\n if (!isCancled) {\n setError?.(error);\n }\n return;\n }\n }\n\n if (!isCancled) {\n setValue?.(update);\n }\n });\n\n const updateError = (error: unknown) =>\n q(() => {\n if (!isCancled) {\n setError?.(error);\n }\n });\n\n let cancelSubscription: Cancel | void;\n try {\n cancelSubscription = calculate({ use, useFetch, updateValue, updateError });\n } catch (error) {\n setError?.(error);\n }\n\n this.current = { cancel, check };\n }\n\n stop() {\n this.current?.cancel();\n }\n\n check() {\n this.current?.check();\n }\n}\n","import type { Update } from '../core/commonTypes';\n\ntype FilterKey<T> = T extends string | number ? T : never;\ntype FilterString<T> = T extends string ? T : never;\n\nexport type Obj = Record<string | number, unknown>;\nexport type Arr = readonly unknown[];\n\ntype GetKeys<T> = T extends Arr\n ? T extends readonly [] // special case empty tuple => no keys\n ? never\n : '0' extends keyof T // any tuple with at least one element\n ? keyof T & `${number}`\n : number // other array\n : keyof T; // not an array\n\nexport type Path<T> = 0 extends 1 & T\n ? string\n : T extends never\n ? never\n : T extends Obj | Arr\n ? FilterString<\n keyof {\n [K in FilterKey<GetKeys<T>> as `${K}` | (T[K] extends Obj | Arr | undefined | null ? `${K}.${Path<NonNullable<T[K]>>}` : never)]: 0;\n }\n >\n : never;\n\nexport type Value<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? T[K & keyof T] extends Obj | Arr\n ? Value<T[K & keyof T], Rest>\n : T[K & keyof T] extends Obj | Arr | undefined | null\n ? Value<NonNullable<T[K & keyof T]>, Rest> | undefined\n : never\n : T[P & keyof T];\n\nexport function get<T, P extends Path<T>>(obj: T, path: P): Value<T, P> {\n if (path === '') {\n return obj as any;\n }\n\n if (!(obj instanceof Object)) {\n throw new Error(`Could not get ${path} of ${obj}`);\n }\n\n const index = path.indexOf('.');\n\n if (index >= 0) {\n const key = path.slice(0, index);\n const rest = path.slice(index + 1);\n const subObj = (obj as Obj | Arr)[key as any];\n\n if (!subObj) {\n return undefined as any;\n }\n\n return get(subObj as Record<string, unknown>, rest) as any;\n }\n\n return (obj as Obj | Arr)[path as any] as any;\n}\n\nexport function set<T, P extends Path<T>>(obj: T, path: P, value: Update<Value<T, P>>, rootPath = path): T {\n if (path === '') {\n return value as any;\n }\n\n if (!(obj instanceof Object)) {\n throw new Error(`Could not set ${path} of ${obj}`);\n }\n\n const index = path.indexOf('.');\n let key, update;\n\n if (index >= 0) {\n key = path.slice(0, index);\n const rest = path.slice(index + 1);\n const subObj = (obj as Obj | Arr)[key as any];\n\n if (!subObj) {\n const prefix = rootPath.slice(0, -rest.length - 1);\n throw Error(`Cannot set ${rootPath} because ${prefix} is ${subObj}`);\n }\n\n update = set(subObj as Record<string, unknown>, rest, value, rootPath);\n } else {\n key = path;\n update = value instanceof Function ? value((obj as any)[key]) : value;\n }\n\n if (Array.isArray(obj)) {\n const copy = Array.from(obj);\n copy[key as any] = update;\n return copy as any;\n }\n\n return {\n ...obj,\n [key]: update,\n };\n}\n","import { get } from './propAccess';\n\nexport function makeSelector<T, S>(selector?: ((value: T) => S) | string): (value: T) => S {\n if (!selector) {\n return (x) => x as any;\n }\n\n if (selector instanceof Function) {\n return selector;\n }\n\n return (x) => get(x, selector as any) as any;\n}\n","const getAllProperties = (object: any) => {\n const properties = new Set<[any, string | symbol]>();\n\n do {\n for (const key of Reflect.ownKeys(object)) {\n properties.add([object, key]);\n }\n } while ((object = Reflect.getPrototypeOf(object)) && object !== Object.prototype);\n\n return properties;\n};\n\nexport function bind(self: any) {\n for (const [object, key] of getAllProperties(self.constructor.prototype)) {\n if (key === 'constructor') {\n continue;\n }\n\n const descriptor = Reflect.getOwnPropertyDescriptor(object, key);\n if (descriptor && typeof descriptor.value === 'function') {\n self[key] = self[key].bind(self);\n }\n }\n}\n","import type { Duration } from '../core/commonTypes';\n\nexport const calcDuration = (t: Duration) => {\n if (typeof t === 'number') return t;\n return (\n (t.milliseconds ?? 0) +\n (t.seconds ?? 0) * 1000 +\n (t.minutes ?? 0) * 60 * 1000 +\n (t.hours ?? 0) * 60 * 60 * 1000 +\n (t.days ?? 0) * 24 * 60 * 60 * 1000\n );\n};\n","export const defaultEquals = (a: any, b: any) => a === b;\n\nexport const simpleShallowEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => value === b[i]);\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const e1 = Object.entries(a);\n const e2 = Object.entries(b);\n return e1.length === e2.length && e1.every(([key, value]) => value === b[key]);\n }\n\n return false;\n};\n\nexport const simpleDeepEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => simpleDeepEquals(value, b[i]));\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const e1 = Object.entries(a);\n const e2 = Object.entries(b);\n return e1.length === e2.length && e1.every(([key, value]) => simpleDeepEquals(value, b[key]));\n }\n\n return false;\n};\n","export function forwardError(error: unknown) {\n setTimeout(() => {\n throw error;\n });\n}\n","import type { Update, UpdateFrom } from '@core/commonTypes';\nimport type { Store } from '../core/store';\n\ntype Fn = (...args: any) => any;\n\ntype OptionalPropertyOf<T> = Exclude<\n {\n [K in keyof T]: T extends Record<K, T[K]> ? never : K;\n }[keyof T],\n undefined\n>;\n\nconst arrMod = <P extends keyof Array<any>>(prop: P) =>\n function <V>(\n this: Store<Array<V>>,\n ...args: Array<V>[P] extends Fn ? Parameters<Array<V>[P]> : never\n ): Array<V>[P] extends Fn ? ReturnType<Array<V>[P]> : never {\n const newArr = this.get().slice();\n const result = (newArr[prop] as Fn)(...(args as any));\n this.update(newArr);\n return result;\n };\n\nexport const arrayActions = {\n splice: arrMod('splice'),\n push: arrMod('push'),\n pop: arrMod('pop'),\n shift: arrMod('shift'),\n unshift: arrMod('unshift'),\n reverse: arrMod('reverse'),\n sort: arrMod('sort'),\n};\n\nexport const recordActions = {\n set<T extends Record<any, any>, K extends keyof T>(this: Store<T>, key: K, value: Update<T[K]>) {\n if (value instanceof Function) {\n value = value(this.get()[key]);\n }\n\n this.update({ ...this.get(), [key]: value });\n return this;\n },\n\n delete<T extends Record<any, any>, K extends OptionalPropertyOf<T>>(this: Store<T>, key: K) {\n const copy = { ...this.get() };\n delete copy[key];\n this.update(copy);\n },\n\n clear<T extends Record<any, any>>(this: Store<Partial<T>>) {\n this.update({} as T);\n },\n};\n\nexport const mapActions = {\n set<K, V>(this: Store<Map<K, V>>, key: K, value: UpdateFrom<V, [V | undefined]>) {\n if (value instanceof Function) {\n value = value(this.get().get(key));\n }\n\n const newMap = new Map(this.get());\n newMap.set(key, value);\n this.update(newMap);\n return this;\n },\n\n delete<K, V>(this: Store<Map<K, V>>, key: K) {\n const newMap = new Map(this.get());\n const result = newMap.delete(key);\n this.update(newMap);\n return result;\n },\n\n clear<K, V>(this: Store<Map<K, V>>) {\n this.update(new Map());\n },\n};\n\nexport const setActions = {\n add<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.add(value);\n this.update(newSet);\n },\n\n delete<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.delete(value);\n this.update(newSet);\n },\n\n clear<T>(this: Store<Set<T>>) {\n this.update(new Set());\n },\n};\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): (...args: Args) => void {\n let t = 0;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n return (...args: Args) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n const dt = t + ms - Date.now();\n if (dt <= 0) {\n fn(...args);\n t = Date.now();\n return;\n }\n\n timeout = setTimeout(() => {\n fn(...args);\n t = Date.now();\n }, dt);\n };\n}\n","import { bind } from '@lib/bind';\nimport { calcDuration } from '@lib/calcDuration';\nimport { defaultEquals } from '@lib/equals';\nimport { forwardError } from '@lib/forwardError';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/propAccess';\nimport { arrayActions, mapActions, recordActions, setActions } from '@lib/storeActions';\nimport { throttle } from '@lib/throttle';\nimport type { Cancel, Duration, Effect, Listener, Selector, SubscribeOptions, Update, Use, UseOptions } from './commonTypes';\nimport { DerivedStore } from './derivedStore';\n\nexport type StoreActions = Record<string, (...args: any[]) => any>;\n\nexport type BoundStoreActions<T, Actions extends StoreActions> = Actions & ThisType<Store<T> & Actions>;\n\nexport interface StoreOptions {\n retain?: number;\n}\n\nexport interface StoreOptionsWithActions<T, Actions extends StoreActions> extends StoreOptions {\n methods?: Actions & ThisType<Store<T> & Actions & StandardActions<T>>;\n}\n\ntype StandardActions<T> = T extends Map<any, any>\n ? typeof mapActions\n : T extends Set<any>\n ? typeof setActions\n : T extends Array<any>\n ? typeof arrayActions\n : T extends Record<any, any>\n ? typeof recordActions\n : Record<string, never>;\n\ntype StoreWithActions<T, Actions extends StoreActions> = Store<T> &\n Omit<BoundStoreActions<T, Actions>, keyof Store<T>> &\n StandardActions<T>;\n\nconst noop = () => undefined;\n\nexport class Store<T> {\n protected value = this.initialValue;\n protected listeners = new Set<Listener>();\n protected effects = new Map<Effect, { handle?: Cancel; retain?: number; timeout?: ReturnType<typeof setTimeout> }>();\n protected notifyId = {};\n\n constructor(protected readonly initialValue: T, protected readonly options: StoreOptions = {}) {\n bind(this);\n }\n\n get(): T {\n return this.value;\n }\n\n update(update: Update<T>): void {\n if (update instanceof Function) {\n update = update(this.get());\n }\n\n this.value = update;\n this.notify();\n }\n\n sub(listener: Listener<T>, options?: SubscribeOptions): Cancel {\n const { runNow = true, throttle: throttleOption, equals = defaultEquals } = options ?? {};\n\n let compareToValue = this.get();\n let previousValue: T | undefined;\n let hasRun = false;\n\n let innerListener = (force?: boolean | void) => {\n const value = this.get();\n\n if (!force && equals(value, compareToValue)) {\n return;\n }\n\n compareToValue = value;\n const _previousValue = previousValue;\n previousValue = value;\n hasRun = true;\n\n try {\n listener(value, _previousValue);\n } catch (error) {\n forwardError(error);\n }\n };\n\n if (throttleOption) {\n innerListener = throttle(innerListener, calcDuration(throttleOption));\n }\n\n this.listeners.add(innerListener);\n this.onSubscribe();\n\n if (runNow && !hasRun) {\n innerListener(true);\n }\n\n return () => {\n this.listeners.delete(innerListener);\n this.onUnsubscribe();\n };\n }\n\n map<S>(selector: Selector<T, S>, options?: UseOptions): DerivedStore<S>;\n map<P extends Path<T>>(selector: P, options?: UseOptions): DerivedStore<Value<T, P>>;\n map(_selector: Selector<T, any> | string, options?: UseOptions): DerivedStore<any> {\n const selector = makeSelector(_selector);\n const derivedFrom = { store: this, selectors: [_selector] };\n\n return new DerivedStore(({ use }) => {\n return selector(use(this, options));\n }, derivedFrom);\n }\n\n /** Add an effect that will be executed when the store becomes active, which means when it has at least one subscriber.\n * @param effect\n * If there is already a subscriber, the effect will be executed immediately.\n * Otherweise it will be executed as soon as the first subscription is created.\n * Every time all subscriptions are removed and the first is created again, the effect will be executed again.\n * @param retain\n * If provided, delay tearing down effects when the last subscriber is removed. This is useful if a short gap in subscriber coverage is supposed to be ignored. E.g. when switching pages, the old page might unsubscribe, while the new page subscribes immediately after.\n * @returns\n * The effect can return a teardown callback, which will be executed when the last subscription is removed and potentially the ratain time has passed.\n */\n addEffect(effect: Effect, retain?: Duration) {\n this.effects.set(effect, {\n handle: this.listeners.size > 0 ? effect() ?? noop : undefined,\n retain: retain !== undefined ? calcDuration(retain) : undefined,\n });\n\n return () => {\n const { handle, timeout } = this.effects.get(effect) ?? {};\n handle?.();\n timeout !== undefined && clearTimeout(timeout);\n this.effects.delete(effect);\n };\n }\n\n /** Return whether the store is currently active, which means whether it has at least one subscriber. */\n get isActive() {\n return this.listeners.size > 0;\n }\n\n protected onSubscribe() {\n if (this.listeners.size > 1) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n timeout !== undefined && clearTimeout(timeout);\n\n this.effects.set(effect, {\n handle: handle ?? effect() ?? noop,\n retain,\n timeout: undefined,\n });\n }\n }\n\n protected onUnsubscribe() {\n if (this.listeners.size > 0) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n !retain && handle?.();\n timeout !== undefined && clearTimeout(timeout);\n\n this.effects.set(effect, {\n handle: retain ? handle : undefined,\n retain,\n timeout: retain && handle ? setTimeout(handle, retain) : undefined,\n });\n }\n }\n\n protected notify() {\n const n = (this.notifyId = {});\n for (const listener of [...this.listeners]) {\n listener();\n if (n !== this.notifyId) break;\n }\n }\n}\n\nconst defaultOptions: StoreOptions = {};\n\nfunction _store<T>(calculate: (this: { use: Use }, fns: { use: Use }) => T, options?: StoreOptions): DerivedStore<T>;\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction _store<T, Actions extends StoreActions = {}>(\n initialState: T,\n options?: StoreOptionsWithActions<T, Actions>\n): StoreWithActions<T, Actions>;\nfunction _store<T, Actions extends StoreActions>(\n initialState: T | ((this: { use: Use }, fns: { use: Use }) => T),\n options?: StoreOptionsWithActions<T, Actions>\n): StoreWithActions<T, Actions> | DerivedStore<T> {\n if (initialState instanceof Function) {\n return new DerivedStore(initialState);\n }\n\n let methods: StoreActions | undefined = options?.methods;\n\n if (initialState instanceof Map) {\n methods = { ...mapActions, ...methods };\n } else if (initialState instanceof Set) {\n methods = { ...setActions, ...methods };\n } else if (Array.isArray(initialState)) {\n methods = { ...arrayActions, ...methods };\n } else if (initialState instanceof Object) {\n methods = { ...recordActions, ...methods };\n }\n\n const store = new Store(initialState, options);\n\n const boundActions = Object.fromEntries(\n Object.entries(methods ?? ({} as BoundStoreActions<T, any>))\n .filter(([name]) => !(name in store))\n .map(([name, fn]) => [name, (fn as any).bind(store)])\n ) as BoundStoreActions<T, any>;\n\n return Object.assign(store, boundActions);\n}\n\nexport const store = Object.assign(_store, { defaultOptions });\n","import { CalculationHelper } from '@lib/calculationHelper';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/propAccess';\nimport { get, set } from '@lib/propAccess';\nimport type { Cancel, Selector, Update, Use } from './commonTypes';\nimport { Store } from './store';\n\nexport class DerivedStore<T> extends Store<T> {\n calculationHelper = new CalculationHelper({\n calculate: ({ use }) => {\n const value = this.calculate.apply({ use }, [{ use }]);\n this.valid = true;\n super.update(value);\n },\n\n addEffect: this.addEffect,\n getValue: () => this.value,\n onInvalidate: this.invalidate,\n });\n\n protected valid = false;\n protected check?: () => void;\n protected cancel?: Cancel;\n\n constructor(\n protected calculate: (this: { use: Use }, fns: { use: Use }) => T,\n protected derivedFrom?: { store: Store<any>; selectors: (Selector<any, any> | string)[] }\n ) {\n super(undefined as T);\n }\n\n get(): T {\n if (!this.valid) {\n this.calculationHelper.execute();\n }\n\n return super.get();\n }\n\n update(update: Update<T>): void {\n if (this.derivedFrom && this.derivedFrom.selectors.every((selector) => typeof selector === 'string')) {\n const path = this.derivedFrom.selectors.join('.');\n\n if (update instanceof Function) {\n const before = get<any, any>(this.derivedFrom.store, path) as T;\n update = update(before);\n }\n\n this.derivedFrom.store.update((before: any) => set<any, any>(before, path, update));\n } else {\n throw new Error('Can only updated computed stores that are derived from other stores using string selectors');\n }\n }\n\n map<S>(selector: Selector<T, S>): DerivedStore<S>;\n map<P extends Path<T>>(selector: P): DerivedStore<Value<T, P>>;\n map(_selector: string | Selector<T, any>): DerivedStore<any> {\n const selector = makeSelector(_selector);\n\n const derivedFrom = this.derivedFrom ?? { store: this, selectors: [] };\n const newDerivedFrom = { ...derivedFrom, selectors: derivedFrom.selectors.concat(_selector) };\n\n return new DerivedStore(({ use }) => {\n return selector(use(this));\n }, newDerivedFrom);\n }\n\n protected invalidate() {\n this.valid = false;\n\n if (this.isActive) {\n this.calculationHelper.execute();\n }\n }\n}\n\nfunction _derivedStore<T>(calculate: (this: { use: Use }, fns: { use: Use }) => T) {\n return new DerivedStore(calculate);\n}\n\nexport const derivedStore = Object.assign(_derivedStore, {});\n","export function hash(value: unknown): string {\n if (value instanceof Set) {\n return `s[${[...value].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Map) {\n return `m[${[...value.entries()].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Array) {\n return `[${value.map(hash).join(',')}]`;\n }\n\n if (value instanceof Object) {\n return `o[${Object.entries(value).map(hash).sort().join(',')}]`;\n }\n\n return JSON.stringify(value);\n}\n"],"names":["resolve","value","check","store"],"mappings":"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"}
|
package/dist/es/hash.mjs
CHANGED
|
@@ -364,6 +364,9 @@ const recordActions = {
|
|
|
364
364
|
};
|
|
365
365
|
const mapActions = {
|
|
366
366
|
set(key, value) {
|
|
367
|
+
if (value instanceof Function) {
|
|
368
|
+
value = value(this.get().get(key));
|
|
369
|
+
}
|
|
367
370
|
const newMap = new Map(this.get());
|
|
368
371
|
newMap.set(key, value);
|
|
369
372
|
this.update(newMap);
|
package/dist/es/hash.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.mjs","sources":["../../src/lib/queue.ts","../../src/lib/trackingProxy.ts","../../src/lib/calculationHelper.ts","../../src/lib/propAccess.ts","../../src/lib/makeSelector.ts","../../src/lib/bind.ts","../../src/lib/calcDuration.ts","../../src/lib/equals.ts","../../src/lib/forwardError.ts","../../src/lib/storeActions.ts","../../src/lib/throttle.ts","../../src/core/store.ts","../../src/core/derivedStore.ts","../../src/lib/hash.ts"],"sourcesContent":["import type { MaybePromise } from './maybePromise';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>): Promise<T>;\n clear: () => void;\n whenDone: Promise<void>;\n}\n\nexport function queue(): Queue {\n const q: { action: Action<any>; resolve: (value: any) => void; reject: (error: unknown) => void }[] = [];\n let promise: Promise<void> | undefined, resolve: (() => void) | undefined;\n let active = false;\n\n const run = async () => {\n if (!active) {\n active = true;\n\n let next;\n while ((next = q.shift())) {\n try {\n let result = next.action();\n if (result instanceof Promise) {\n result = await result;\n }\n next.resolve(result);\n } catch (e) {\n next.reject(e);\n }\n }\n\n active = false;\n resolve?.();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject });\n run();\n });\n },\n {\n clear() {\n q.length = 0;\n resolve?.();\n },\n\n get whenDone() {\n if (!promise) {\n promise = new Promise<void>((r) => {\n resolve = () => {\n promise = undefined;\n resolve = undefined;\n r();\n };\n });\n }\n\n return promise;\n },\n }\n );\n}\n","export type TrackingProxy<T> = [value: T, equals: (newValue: T) => boolean];\ntype Obj = Record<string | symbol, unknown>;\n\nconst ProxyKeys = ['get', 'getOwnPropertyDescriptor', 'getPrototypeOf', 'has', 'isExtensible', 'ownKeys'] as const;\n\nconst isPlainObject = (value: unknown) => typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype;\n\nexport function trackingProxy<T>(value: T): TrackingProxy<T> {\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [value, (other) => other === value];\n }\n\n const deps = new Array<TrackingProxy<any>[1]>();\n\n const proxy = new Proxy(\n value as T & Obj,\n Object.fromEntries(\n ProxyKeys.map((key) => [\n key,\n (value: T & Obj, ...args: any[]) => {\n const fn = Reflect[key] as any;\n const [proxiedValue, equals] = trackingProxy(fn(value, ...args));\n\n deps.push((otherValue) => {\n if (!isPlainObject(otherValue) && !Array.isArray(otherValue)) {\n return false;\n }\n\n return equals(fn(otherValue, ...args));\n });\n\n return proxiedValue;\n },\n ])\n )\n );\n\n return [proxy, (other) => !!other && deps.every((equals) => equals(other))];\n}\n","import type { Cancel, UpdateFrom, Use, UseFetch } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { MaybePromise } from './maybePromise';\nimport { queue } from './queue';\nimport { trackingProxy } from './trackingProxy';\n\nexport class CalculationHelper<T> {\n private current?: {\n cancel: Cancel;\n check: () => void;\n };\n\n constructor(\n private options: {\n calculate: (fns: {\n use: Use;\n useFetch: UseFetch;\n updateValue: (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) => void;\n updateError: (error: unknown) => void;\n }) => Cancel | void;\n addEffect: (effect: () => Cancel | void) => Cancel;\n getValue: () => T | undefined;\n setValue?: (value: T) => void;\n setError?: (error: unknown) => void;\n onInvalidate?: () => void;\n }\n ) {\n options.addEffect(() => {\n if (this.current) {\n this.current.check();\n } else {\n this.execute();\n }\n });\n }\n\n execute() {\n this.stop();\n\n const { calculate, addEffect, getValue, setValue, setError, onInvalidate } = this.options;\n const checks = new Array<() => boolean>();\n const deps = new Map<Store<any>, { on: () => void; off: () => void }>();\n const q = queue();\n let isActive = false;\n let isCancled = false;\n\n const cancelEffect = addEffect(() => {\n isActive = true;\n\n for (const dep of deps.values()) {\n dep.on();\n }\n\n return () => {\n isActive = false;\n\n for (const dep of deps.values()) {\n dep.off();\n }\n };\n });\n\n const cancel = () => {\n isCancled = true;\n cancelSubscription?.();\n cancelEffect();\n delete this.current;\n };\n\n const check = () => {\n if (!checks.every((check) => check())) {\n cancel();\n onInvalidate?.();\n }\n };\n\n const use: Use = (store, { disableProxy } = {}) => {\n if (isCancled) {\n return store.get();\n }\n\n let value = store.get();\n let equals = (newValue: any) => {\n return newValue === value;\n };\n\n if (!disableProxy) {\n [value, equals] = trackingProxy(value);\n }\n\n let sub: Cancel | undefined;\n\n const dep = {\n on() {\n this.off();\n\n sub = store.sub(check, { runNow: false });\n },\n off() {\n sub?.();\n sub = undefined;\n },\n };\n\n if (isActive) {\n dep.on();\n }\n\n checks.push(() => equals(store.get()));\n deps.set(store, dep);\n\n return value;\n };\n\n const useFetch: UseFetch = (store) => {\n if (isCancled) {\n return store.fetch();\n }\n\n const value = store.fetch();\n const ref = store.get().ref;\n\n let sub: Cancel | undefined;\n\n const dep = {\n on() {\n this.off();\n sub = store.sub(check, { runNow: false });\n },\n off() {\n sub?.();\n sub = undefined;\n },\n };\n\n if (isActive) {\n dep.on();\n }\n\n checks.push(() => {\n return store.get().ref === ref;\n });\n deps.set(store, dep);\n\n return value;\n };\n\n const updateValue = (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) =>\n q(async () => {\n if (isCancled) {\n return;\n }\n\n if (update instanceof Function) {\n try {\n update = update(getValue());\n } catch (error) {\n setError?.(error);\n return;\n }\n }\n\n if (update instanceof Promise) {\n try {\n update = await update;\n } catch (error) {\n if (!isCancled) {\n setError?.(error);\n }\n return;\n }\n }\n\n if (!isCancled) {\n setValue?.(update);\n }\n });\n\n const updateError = (error: unknown) =>\n q(() => {\n if (!isCancled) {\n setError?.(error);\n }\n });\n\n let cancelSubscription: Cancel | void;\n try {\n cancelSubscription = calculate({ use, useFetch, updateValue, updateError });\n } catch (error) {\n setError?.(error);\n }\n\n this.current = { cancel, check };\n }\n\n stop() {\n this.current?.cancel();\n }\n\n check() {\n this.current?.check();\n }\n}\n","import type { Update } from '../core/commonTypes';\n\ntype FilterKey<T> = T extends string | number ? T : never;\ntype FilterString<T> = T extends string ? T : never;\n\nexport type Obj = Record<string | number, unknown>;\nexport type Arr = readonly unknown[];\n\ntype GetKeys<T> = T extends Arr\n ? T extends readonly [] // special case empty tuple => no keys\n ? never\n : '0' extends keyof T // any tuple with at least one element\n ? keyof T & `${number}`\n : number // other array\n : keyof T; // not an array\n\nexport type Path<T> = 0 extends 1 & T\n ? string\n : T extends never\n ? never\n : T extends Obj | Arr\n ? FilterString<\n keyof {\n [K in FilterKey<GetKeys<T>> as `${K}` | (T[K] extends Obj | Arr | undefined | null ? `${K}.${Path<NonNullable<T[K]>>}` : never)]: 0;\n }\n >\n : never;\n\nexport type Value<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? T[K & keyof T] extends Obj | Arr\n ? Value<T[K & keyof T], Rest>\n : T[K & keyof T] extends Obj | Arr | undefined | null\n ? Value<NonNullable<T[K & keyof T]>, Rest> | undefined\n : never\n : T[P & keyof T];\n\nexport function get<T, P extends Path<T>>(obj: T, path: P): Value<T, P> {\n if (path === '') {\n return obj as any;\n }\n\n if (!(obj instanceof Object)) {\n throw new Error(`Could not get ${path} of ${obj}`);\n }\n\n const index = path.indexOf('.');\n\n if (index >= 0) {\n const key = path.slice(0, index);\n const rest = path.slice(index + 1);\n const subObj = (obj as Obj | Arr)[key as any];\n\n if (!subObj) {\n return undefined as any;\n }\n\n return get(subObj as Record<string, unknown>, rest) as any;\n }\n\n return (obj as Obj | Arr)[path as any] as any;\n}\n\nexport function set<T, P extends Path<T>>(obj: T, path: P, value: Update<Value<T, P>>, rootPath = path): T {\n if (path === '') {\n return value as any;\n }\n\n if (!(obj instanceof Object)) {\n throw new Error(`Could not set ${path} of ${obj}`);\n }\n\n const index = path.indexOf('.');\n let key, update;\n\n if (index >= 0) {\n key = path.slice(0, index);\n const rest = path.slice(index + 1);\n const subObj = (obj as Obj | Arr)[key as any];\n\n if (!subObj) {\n const prefix = rootPath.slice(0, -rest.length - 1);\n throw Error(`Cannot set ${rootPath} because ${prefix} is ${subObj}`);\n }\n\n update = set(subObj as Record<string, unknown>, rest, value, rootPath);\n } else {\n key = path;\n update = value instanceof Function ? value((obj as any)[key]) : value;\n }\n\n if (Array.isArray(obj)) {\n const copy = Array.from(obj);\n copy[key as any] = update;\n return copy as any;\n }\n\n return {\n ...obj,\n [key]: update,\n };\n}\n","import { get } from './propAccess';\n\nexport function makeSelector<T, S>(selector?: ((value: T) => S) | string): (value: T) => S {\n if (!selector) {\n return (x) => x as any;\n }\n\n if (selector instanceof Function) {\n return selector;\n }\n\n return (x) => get(x, selector as any) as any;\n}\n","const getAllProperties = (object: any) => {\n const properties = new Set<[any, string | symbol]>();\n\n do {\n for (const key of Reflect.ownKeys(object)) {\n properties.add([object, key]);\n }\n } while ((object = Reflect.getPrototypeOf(object)) && object !== Object.prototype);\n\n return properties;\n};\n\nexport function bind(self: any) {\n for (const [object, key] of getAllProperties(self.constructor.prototype)) {\n if (key === 'constructor') {\n continue;\n }\n\n const descriptor = Reflect.getOwnPropertyDescriptor(object, key);\n if (descriptor && typeof descriptor.value === 'function') {\n self[key] = self[key].bind(self);\n }\n }\n}\n","import type { Duration } from '../core/commonTypes';\n\nexport const calcDuration = (t: Duration) => {\n if (typeof t === 'number') return t;\n return (\n (t.milliseconds ?? 0) +\n (t.seconds ?? 0) * 1000 +\n (t.minutes ?? 0) * 60 * 1000 +\n (t.hours ?? 0) * 60 * 60 * 1000 +\n (t.days ?? 0) * 24 * 60 * 60 * 1000\n );\n};\n","export const defaultEquals = (a: any, b: any) => a === b;\n\nexport const simpleShallowEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => value === b[i]);\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const e1 = Object.entries(a);\n const e2 = Object.entries(b);\n return e1.length === e2.length && e1.every(([key, value]) => value === b[key]);\n }\n\n return false;\n};\n\nexport const simpleDeepEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => simpleDeepEquals(value, b[i]));\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const e1 = Object.entries(a);\n const e2 = Object.entries(b);\n return e1.length === e2.length && e1.every(([key, value]) => simpleDeepEquals(value, b[key]));\n }\n\n return false;\n};\n","export function forwardError(error: unknown) {\n setTimeout(() => {\n throw error;\n });\n}\n","import type { Update } from '@core/commonTypes';\nimport type { Store } from '../core/store';\n\ntype Fn = (...args: any) => any;\n\nconst arrMod = <P extends keyof Array<any>>(prop: P) =>\n function <V>(\n this: Store<Array<V>>,\n ...args: Array<V>[P] extends Fn ? Parameters<Array<V>[P]> : never\n ): Array<V>[P] extends Fn ? ReturnType<Array<V>[P]> : never {\n const newArr = this.get().slice();\n const result = (newArr[prop] as Fn)(...(args as any));\n this.update(newArr);\n return result;\n };\n\nexport const arrayActions = {\n splice: arrMod('splice'),\n push: arrMod('push'),\n pop: arrMod('pop'),\n shift: arrMod('shift'),\n unshift: arrMod('unshift'),\n reverse: arrMod('reverse'),\n sort: arrMod('sort'),\n};\n\nexport const recordActions = {\n set<K extends string | number | symbol, V>(this: Store<Record<K, V>>, key: K, value: Update<V>) {\n if (value instanceof Function) {\n value = value(this.get()[key]);\n }\n\n this.update({ ...this.get(), [key]: value });\n return this;\n },\n\n delete<K extends string | number | symbol, V>(this: Store<Record<K, V>>, key: K) {\n const copy = { ...(this.get() as Record<K, V>) };\n delete copy[key];\n this.update(copy);\n },\n\n clear<K extends string | number | symbol, V>(this: Store<Record<K, V>>) {\n this.update({} as Record<K, V>);\n },\n};\n\nexport const mapActions = {\n set<K, V>(this: Store<Map<K, V>>, key: K, value: V) {\n const newMap = new Map(this.get());\n newMap.set(key, value);\n this.update(newMap);\n return this;\n },\n\n delete<K, V>(this: Store<Map<K, V>>, key: K) {\n const newMap = new Map(this.get());\n const result = newMap.delete(key);\n this.update(newMap);\n return result;\n },\n\n clear<K, V>(this: Store<Map<K, V>>) {\n this.update(new Map());\n },\n};\n\nexport const setActions = {\n add<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.add(value);\n this.update(newSet);\n },\n\n delete<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.delete(value);\n this.update(newSet);\n },\n\n clear<T>(this: Store<Set<T>>) {\n this.update(new Set());\n },\n};\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): (...args: Args) => void {\n let t = 0;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n return (...args: Args) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n const dt = t + ms - Date.now();\n if (dt <= 0) {\n fn(...args);\n t = Date.now();\n return;\n }\n\n timeout = setTimeout(() => {\n fn(...args);\n t = Date.now();\n }, dt);\n };\n}\n","import { bind } from '@lib/bind';\nimport { calcDuration } from '@lib/calcDuration';\nimport { defaultEquals } from '@lib/equals';\nimport { forwardError } from '@lib/forwardError';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/propAccess';\nimport { arrayActions, mapActions, recordActions, setActions } from '@lib/storeActions';\nimport { throttle } from '@lib/throttle';\nimport type { Cancel, Duration, Effect, Listener, Selector, SubscribeOptions, Update, Use, UseOptions } from './commonTypes';\nimport { DerivedStore } from './derivedStore';\n\nexport type StoreActions = Record<string, (...args: any[]) => any>;\n\nexport type BoundStoreActions<T, Actions extends StoreActions> = Actions & ThisType<Store<T> & Actions>;\n\nexport interface StoreOptions {\n retain?: number;\n}\n\nexport interface StoreOptionsWithActions<T, Actions extends StoreActions> extends StoreOptions {\n methods?: Actions & ThisType<Store<T> & Actions & StandardActions<T>>;\n}\n\ntype StandardActions<T> = T extends Map<any, any>\n ? typeof mapActions\n : T extends Set<any>\n ? typeof setActions\n : T extends Array<any>\n ? typeof arrayActions\n : T extends Record<any, any>\n ? typeof recordActions\n : Record<string, never>;\n\ntype StoreWithActions<T, Actions extends StoreActions> = Store<T> &\n Omit<BoundStoreActions<T, Actions>, keyof Store<T>> &\n StandardActions<T>;\n\nconst noop = () => undefined;\n\nexport class Store<T> {\n protected value = this.initialValue;\n protected listeners = new Set<Listener>();\n protected effects = new Map<Effect, { handle?: Cancel; retain?: number; timeout?: ReturnType<typeof setTimeout> }>();\n protected notifyId = {};\n\n constructor(protected readonly initialValue: T, protected readonly options: StoreOptions = {}) {\n bind(this);\n }\n\n get(): T {\n return this.value;\n }\n\n update(update: Update<T>): void {\n if (update instanceof Function) {\n update = update(this.get());\n }\n\n this.value = update;\n this.notify();\n }\n\n sub(listener: Listener<T>, options?: SubscribeOptions): Cancel {\n const { runNow = true, throttle: throttleOption, equals = defaultEquals } = options ?? {};\n\n let compareToValue = this.get();\n let previousValue: T | undefined;\n let hasRun = false;\n\n let innerListener = (force?: boolean | void) => {\n const value = this.get();\n\n if (!force && equals(value, compareToValue)) {\n return;\n }\n\n compareToValue = value;\n const _previousValue = previousValue;\n previousValue = value;\n hasRun = true;\n\n try {\n listener(value, _previousValue);\n } catch (error) {\n forwardError(error);\n }\n };\n\n if (throttleOption) {\n innerListener = throttle(innerListener, calcDuration(throttleOption));\n }\n\n this.listeners.add(innerListener);\n this.onSubscribe();\n\n if (runNow && !hasRun) {\n innerListener(true);\n }\n\n return () => {\n this.listeners.delete(innerListener);\n this.onUnsubscribe();\n };\n }\n\n map<S>(selector: Selector<T, S>, options?: UseOptions): DerivedStore<S>;\n map<P extends Path<T>>(selector: P, options?: UseOptions): DerivedStore<Value<T, P>>;\n map(_selector: Selector<T, any> | string, options?: UseOptions): DerivedStore<any> {\n const selector = makeSelector(_selector);\n const derivedFrom = { store: this, selectors: [_selector] };\n\n return new DerivedStore(({ use }) => {\n return selector(use(this, options));\n }, derivedFrom);\n }\n\n /** Add an effect that will be executed when the store becomes active, which means when it has at least one subscriber.\n * @param effect\n * If there is already a subscriber, the effect will be executed immediately.\n * Otherweise it will be executed as soon as the first subscription is created.\n * Every time all subscriptions are removed and the first is created again, the effect will be executed again.\n * @param retain\n * If provided, delay tearing down effects when the last subscriber is removed. This is useful if a short gap in subscriber coverage is supposed to be ignored. E.g. when switching pages, the old page might unsubscribe, while the new page subscribes immediately after.\n * @returns\n * The effect can return a teardown callback, which will be executed when the last subscription is removed and potentially the ratain time has passed.\n */\n addEffect(effect: Effect, retain?: Duration) {\n this.effects.set(effect, {\n handle: this.listeners.size > 0 ? effect() ?? noop : undefined,\n retain: retain !== undefined ? calcDuration(retain) : undefined,\n });\n\n return () => {\n const { handle, timeout } = this.effects.get(effect) ?? {};\n handle?.();\n timeout !== undefined && clearTimeout(timeout);\n this.effects.delete(effect);\n };\n }\n\n /** Return whether the store is currently active, which means whether it has at least one subscriber. */\n get isActive() {\n return this.listeners.size > 0;\n }\n\n protected onSubscribe() {\n if (this.listeners.size > 1) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n timeout !== undefined && clearTimeout(timeout);\n\n this.effects.set(effect, {\n handle: handle ?? effect() ?? noop,\n retain,\n timeout: undefined,\n });\n }\n }\n\n protected onUnsubscribe() {\n if (this.listeners.size > 0) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n !retain && handle?.();\n timeout !== undefined && clearTimeout(timeout);\n\n this.effects.set(effect, {\n handle: retain ? handle : undefined,\n retain,\n timeout: retain && handle ? setTimeout(handle, retain) : undefined,\n });\n }\n }\n\n protected notify() {\n const n = (this.notifyId = {});\n for (const listener of [...this.listeners]) {\n listener();\n if (n !== this.notifyId) break;\n }\n }\n}\n\nconst defaultOptions: StoreOptions = {};\n\nfunction _store<T>(calculate: (this: { use: Use }, fns: { use: Use }) => T, options?: StoreOptions): DerivedStore<T>;\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction _store<T, Actions extends StoreActions = {}>(\n initialState: T,\n options?: StoreOptionsWithActions<T, Actions>\n): StoreWithActions<T, Actions>;\nfunction _store<T, Actions extends StoreActions>(\n initialState: T | ((this: { use: Use }, fns: { use: Use }) => T),\n options?: StoreOptionsWithActions<T, Actions>\n): StoreWithActions<T, Actions> | DerivedStore<T> {\n if (initialState instanceof Function) {\n return new DerivedStore(initialState);\n }\n\n let methods: StoreActions | undefined = options?.methods;\n\n if (initialState instanceof Map) {\n methods = { ...mapActions, ...methods };\n } else if (initialState instanceof Set) {\n methods = { ...setActions, ...methods };\n } else if (Array.isArray(initialState)) {\n methods = { ...arrayActions, ...methods };\n } else if (initialState instanceof Object) {\n methods = { ...recordActions, ...methods };\n }\n\n const store = new Store(initialState, options);\n\n const boundActions = Object.fromEntries(\n Object.entries(methods ?? ({} as BoundStoreActions<T, any>))\n .filter(([name]) => !(name in store))\n .map(([name, fn]) => [name, (fn as any).bind(store)])\n ) as BoundStoreActions<T, any>;\n\n return Object.assign(store, boundActions);\n}\n\nexport const store = Object.assign(_store, { defaultOptions });\n","import { CalculationHelper } from '@lib/calculationHelper';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/propAccess';\nimport { get, set } from '@lib/propAccess';\nimport type { Cancel, Selector, Update, Use } from './commonTypes';\nimport { Store } from './store';\n\nexport class DerivedStore<T> extends Store<T> {\n calculationHelper = new CalculationHelper({\n calculate: ({ use }) => {\n const value = this.calculate.apply({ use }, [{ use }]);\n this.valid = true;\n super.update(value);\n },\n\n addEffect: this.addEffect,\n getValue: () => this.value,\n onInvalidate: this.invalidate,\n });\n\n protected valid = false;\n protected check?: () => void;\n protected cancel?: Cancel;\n\n constructor(\n protected calculate: (this: { use: Use }, fns: { use: Use }) => T,\n protected derivedFrom?: { store: Store<any>; selectors: (Selector<any, any> | string)[] }\n ) {\n super(undefined as T);\n }\n\n get(): T {\n if (!this.valid) {\n this.calculationHelper.execute();\n }\n\n return super.get();\n }\n\n update(update: Update<T>): void {\n if (this.derivedFrom && this.derivedFrom.selectors.every((selector) => typeof selector === 'string')) {\n const path = this.derivedFrom.selectors.join('.');\n\n if (update instanceof Function) {\n const before = get<any, any>(this.derivedFrom.store, path) as T;\n update = update(before);\n }\n\n this.derivedFrom.store.update((before: any) => set<any, any>(before, path, update));\n } else {\n throw new Error('Can only updated computed stores that are derived from other stores using string selectors');\n }\n }\n\n map<S>(selector: Selector<T, S>): DerivedStore<S>;\n map<P extends Path<T>>(selector: P): DerivedStore<Value<T, P>>;\n map(_selector: string | Selector<T, any>): DerivedStore<any> {\n const selector = makeSelector(_selector);\n\n const derivedFrom = this.derivedFrom ?? { store: this, selectors: [] };\n const newDerivedFrom = { ...derivedFrom, selectors: derivedFrom.selectors.concat(_selector) };\n\n return new DerivedStore(({ use }) => {\n return selector(use(this));\n }, newDerivedFrom);\n }\n\n protected invalidate() {\n this.valid = false;\n\n if (this.isActive) {\n this.calculationHelper.execute();\n }\n }\n}\n\nfunction _derivedStore<T>(calculate: (this: { use: Use }, fns: { use: Use }) => T) {\n return new DerivedStore(calculate);\n}\n\nexport const derivedStore = Object.assign(_derivedStore, {});\n","export function hash(value: unknown): string {\n if (value instanceof Set) {\n return `s[${[...value].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Map) {\n return `m[${[...value.entries()].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Array) {\n return `[${value.map(hash).join(',')}]`;\n }\n\n if (value instanceof Object) {\n return `o[${Object.entries(value).map(hash).sort().join(',')}]`;\n }\n\n return JSON.stringify(value);\n}\n"],"names":["resolve","value","check","store"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hash.mjs","sources":["../../src/lib/queue.ts","../../src/lib/trackingProxy.ts","../../src/lib/calculationHelper.ts","../../src/lib/propAccess.ts","../../src/lib/makeSelector.ts","../../src/lib/bind.ts","../../src/lib/calcDuration.ts","../../src/lib/equals.ts","../../src/lib/forwardError.ts","../../src/lib/storeActions.ts","../../src/lib/throttle.ts","../../src/core/store.ts","../../src/core/derivedStore.ts","../../src/lib/hash.ts"],"sourcesContent":["import type { MaybePromise } from './maybePromise';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>): Promise<T>;\n clear: () => void;\n whenDone: Promise<void>;\n}\n\nexport function queue(): Queue {\n const q: { action: Action<any>; resolve: (value: any) => void; reject: (error: unknown) => void }[] = [];\n let promise: Promise<void> | undefined, resolve: (() => void) | undefined;\n let active = false;\n\n const run = async () => {\n if (!active) {\n active = true;\n\n let next;\n while ((next = q.shift())) {\n try {\n let result = next.action();\n if (result instanceof Promise) {\n result = await result;\n }\n next.resolve(result);\n } catch (e) {\n next.reject(e);\n }\n }\n\n active = false;\n resolve?.();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject });\n run();\n });\n },\n {\n clear() {\n q.length = 0;\n resolve?.();\n },\n\n get whenDone() {\n if (!promise) {\n promise = new Promise<void>((r) => {\n resolve = () => {\n promise = undefined;\n resolve = undefined;\n r();\n };\n });\n }\n\n return promise;\n },\n }\n );\n}\n","export type TrackingProxy<T> = [value: T, equals: (newValue: T) => boolean];\ntype Obj = Record<string | symbol, unknown>;\n\nconst ProxyKeys = ['get', 'getOwnPropertyDescriptor', 'getPrototypeOf', 'has', 'isExtensible', 'ownKeys'] as const;\n\nconst isPlainObject = (value: unknown) => typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype;\n\nexport function trackingProxy<T>(value: T): TrackingProxy<T> {\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [value, (other) => other === value];\n }\n\n const deps = new Array<TrackingProxy<any>[1]>();\n\n const proxy = new Proxy(\n value as T & Obj,\n Object.fromEntries(\n ProxyKeys.map((key) => [\n key,\n (value: T & Obj, ...args: any[]) => {\n const fn = Reflect[key] as any;\n const [proxiedValue, equals] = trackingProxy(fn(value, ...args));\n\n deps.push((otherValue) => {\n if (!isPlainObject(otherValue) && !Array.isArray(otherValue)) {\n return false;\n }\n\n return equals(fn(otherValue, ...args));\n });\n\n return proxiedValue;\n },\n ])\n )\n );\n\n return [proxy, (other) => !!other && deps.every((equals) => equals(other))];\n}\n","import type { Cancel, UpdateFrom, Use, UseFetch } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { MaybePromise } from './maybePromise';\nimport { queue } from './queue';\nimport { trackingProxy } from './trackingProxy';\n\nexport class CalculationHelper<T> {\n private current?: {\n cancel: Cancel;\n check: () => void;\n };\n\n constructor(\n private options: {\n calculate: (fns: {\n use: Use;\n useFetch: UseFetch;\n updateValue: (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) => void;\n updateError: (error: unknown) => void;\n }) => Cancel | void;\n addEffect: (effect: () => Cancel | void) => Cancel;\n getValue: () => T | undefined;\n setValue?: (value: T) => void;\n setError?: (error: unknown) => void;\n onInvalidate?: () => void;\n }\n ) {\n options.addEffect(() => {\n if (this.current) {\n this.current.check();\n } else {\n this.execute();\n }\n });\n }\n\n execute() {\n this.stop();\n\n const { calculate, addEffect, getValue, setValue, setError, onInvalidate } = this.options;\n const checks = new Array<() => boolean>();\n const deps = new Map<Store<any>, { on: () => void; off: () => void }>();\n const q = queue();\n let isActive = false;\n let isCancled = false;\n\n const cancelEffect = addEffect(() => {\n isActive = true;\n\n for (const dep of deps.values()) {\n dep.on();\n }\n\n return () => {\n isActive = false;\n\n for (const dep of deps.values()) {\n dep.off();\n }\n };\n });\n\n const cancel = () => {\n isCancled = true;\n cancelSubscription?.();\n cancelEffect();\n delete this.current;\n };\n\n const check = () => {\n if (!checks.every((check) => check())) {\n cancel();\n onInvalidate?.();\n }\n };\n\n const use: Use = (store, { disableProxy } = {}) => {\n if (isCancled) {\n return store.get();\n }\n\n let value = store.get();\n let equals = (newValue: any) => {\n return newValue === value;\n };\n\n if (!disableProxy) {\n [value, equals] = trackingProxy(value);\n }\n\n let sub: Cancel | undefined;\n\n const dep = {\n on() {\n this.off();\n\n sub = store.sub(check, { runNow: false });\n },\n off() {\n sub?.();\n sub = undefined;\n },\n };\n\n if (isActive) {\n dep.on();\n }\n\n checks.push(() => equals(store.get()));\n deps.set(store, dep);\n\n return value;\n };\n\n const useFetch: UseFetch = (store) => {\n if (isCancled) {\n return store.fetch();\n }\n\n const value = store.fetch();\n const ref = store.get().ref;\n\n let sub: Cancel | undefined;\n\n const dep = {\n on() {\n this.off();\n sub = store.sub(check, { runNow: false });\n },\n off() {\n sub?.();\n sub = undefined;\n },\n };\n\n if (isActive) {\n dep.on();\n }\n\n checks.push(() => {\n return store.get().ref === ref;\n });\n deps.set(store, dep);\n\n return value;\n };\n\n const updateValue = (update: UpdateFrom<MaybePromise<T>, [T | undefined]>) =>\n q(async () => {\n if (isCancled) {\n return;\n }\n\n if (update instanceof Function) {\n try {\n update = update(getValue());\n } catch (error) {\n setError?.(error);\n return;\n }\n }\n\n if (update instanceof Promise) {\n try {\n update = await update;\n } catch (error) {\n if (!isCancled) {\n setError?.(error);\n }\n return;\n }\n }\n\n if (!isCancled) {\n setValue?.(update);\n }\n });\n\n const updateError = (error: unknown) =>\n q(() => {\n if (!isCancled) {\n setError?.(error);\n }\n });\n\n let cancelSubscription: Cancel | void;\n try {\n cancelSubscription = calculate({ use, useFetch, updateValue, updateError });\n } catch (error) {\n setError?.(error);\n }\n\n this.current = { cancel, check };\n }\n\n stop() {\n this.current?.cancel();\n }\n\n check() {\n this.current?.check();\n }\n}\n","import type { Update } from '../core/commonTypes';\n\ntype FilterKey<T> = T extends string | number ? T : never;\ntype FilterString<T> = T extends string ? T : never;\n\nexport type Obj = Record<string | number, unknown>;\nexport type Arr = readonly unknown[];\n\ntype GetKeys<T> = T extends Arr\n ? T extends readonly [] // special case empty tuple => no keys\n ? never\n : '0' extends keyof T // any tuple with at least one element\n ? keyof T & `${number}`\n : number // other array\n : keyof T; // not an array\n\nexport type Path<T> = 0 extends 1 & T\n ? string\n : T extends never\n ? never\n : T extends Obj | Arr\n ? FilterString<\n keyof {\n [K in FilterKey<GetKeys<T>> as `${K}` | (T[K] extends Obj | Arr | undefined | null ? `${K}.${Path<NonNullable<T[K]>>}` : never)]: 0;\n }\n >\n : never;\n\nexport type Value<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? T[K & keyof T] extends Obj | Arr\n ? Value<T[K & keyof T], Rest>\n : T[K & keyof T] extends Obj | Arr | undefined | null\n ? Value<NonNullable<T[K & keyof T]>, Rest> | undefined\n : never\n : T[P & keyof T];\n\nexport function get<T, P extends Path<T>>(obj: T, path: P): Value<T, P> {\n if (path === '') {\n return obj as any;\n }\n\n if (!(obj instanceof Object)) {\n throw new Error(`Could not get ${path} of ${obj}`);\n }\n\n const index = path.indexOf('.');\n\n if (index >= 0) {\n const key = path.slice(0, index);\n const rest = path.slice(index + 1);\n const subObj = (obj as Obj | Arr)[key as any];\n\n if (!subObj) {\n return undefined as any;\n }\n\n return get(subObj as Record<string, unknown>, rest) as any;\n }\n\n return (obj as Obj | Arr)[path as any] as any;\n}\n\nexport function set<T, P extends Path<T>>(obj: T, path: P, value: Update<Value<T, P>>, rootPath = path): T {\n if (path === '') {\n return value as any;\n }\n\n if (!(obj instanceof Object)) {\n throw new Error(`Could not set ${path} of ${obj}`);\n }\n\n const index = path.indexOf('.');\n let key, update;\n\n if (index >= 0) {\n key = path.slice(0, index);\n const rest = path.slice(index + 1);\n const subObj = (obj as Obj | Arr)[key as any];\n\n if (!subObj) {\n const prefix = rootPath.slice(0, -rest.length - 1);\n throw Error(`Cannot set ${rootPath} because ${prefix} is ${subObj}`);\n }\n\n update = set(subObj as Record<string, unknown>, rest, value, rootPath);\n } else {\n key = path;\n update = value instanceof Function ? value((obj as any)[key]) : value;\n }\n\n if (Array.isArray(obj)) {\n const copy = Array.from(obj);\n copy[key as any] = update;\n return copy as any;\n }\n\n return {\n ...obj,\n [key]: update,\n };\n}\n","import { get } from './propAccess';\n\nexport function makeSelector<T, S>(selector?: ((value: T) => S) | string): (value: T) => S {\n if (!selector) {\n return (x) => x as any;\n }\n\n if (selector instanceof Function) {\n return selector;\n }\n\n return (x) => get(x, selector as any) as any;\n}\n","const getAllProperties = (object: any) => {\n const properties = new Set<[any, string | symbol]>();\n\n do {\n for (const key of Reflect.ownKeys(object)) {\n properties.add([object, key]);\n }\n } while ((object = Reflect.getPrototypeOf(object)) && object !== Object.prototype);\n\n return properties;\n};\n\nexport function bind(self: any) {\n for (const [object, key] of getAllProperties(self.constructor.prototype)) {\n if (key === 'constructor') {\n continue;\n }\n\n const descriptor = Reflect.getOwnPropertyDescriptor(object, key);\n if (descriptor && typeof descriptor.value === 'function') {\n self[key] = self[key].bind(self);\n }\n }\n}\n","import type { Duration } from '../core/commonTypes';\n\nexport const calcDuration = (t: Duration) => {\n if (typeof t === 'number') return t;\n return (\n (t.milliseconds ?? 0) +\n (t.seconds ?? 0) * 1000 +\n (t.minutes ?? 0) * 60 * 1000 +\n (t.hours ?? 0) * 60 * 60 * 1000 +\n (t.days ?? 0) * 24 * 60 * 60 * 1000\n );\n};\n","export const defaultEquals = (a: any, b: any) => a === b;\n\nexport const simpleShallowEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => value === b[i]);\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const e1 = Object.entries(a);\n const e2 = Object.entries(b);\n return e1.length === e2.length && e1.every(([key, value]) => value === b[key]);\n }\n\n return false;\n};\n\nexport const simpleDeepEquals = (a: any, b: any): boolean => {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((value, i) => simpleDeepEquals(value, b[i]));\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n if (a === null || b === null) {\n return false;\n }\n\n const e1 = Object.entries(a);\n const e2 = Object.entries(b);\n return e1.length === e2.length && e1.every(([key, value]) => simpleDeepEquals(value, b[key]));\n }\n\n return false;\n};\n","export function forwardError(error: unknown) {\n setTimeout(() => {\n throw error;\n });\n}\n","import type { Update, UpdateFrom } from '@core/commonTypes';\nimport type { Store } from '../core/store';\n\ntype Fn = (...args: any) => any;\n\ntype OptionalPropertyOf<T> = Exclude<\n {\n [K in keyof T]: T extends Record<K, T[K]> ? never : K;\n }[keyof T],\n undefined\n>;\n\nconst arrMod = <P extends keyof Array<any>>(prop: P) =>\n function <V>(\n this: Store<Array<V>>,\n ...args: Array<V>[P] extends Fn ? Parameters<Array<V>[P]> : never\n ): Array<V>[P] extends Fn ? ReturnType<Array<V>[P]> : never {\n const newArr = this.get().slice();\n const result = (newArr[prop] as Fn)(...(args as any));\n this.update(newArr);\n return result;\n };\n\nexport const arrayActions = {\n splice: arrMod('splice'),\n push: arrMod('push'),\n pop: arrMod('pop'),\n shift: arrMod('shift'),\n unshift: arrMod('unshift'),\n reverse: arrMod('reverse'),\n sort: arrMod('sort'),\n};\n\nexport const recordActions = {\n set<T extends Record<any, any>, K extends keyof T>(this: Store<T>, key: K, value: Update<T[K]>) {\n if (value instanceof Function) {\n value = value(this.get()[key]);\n }\n\n this.update({ ...this.get(), [key]: value });\n return this;\n },\n\n delete<T extends Record<any, any>, K extends OptionalPropertyOf<T>>(this: Store<T>, key: K) {\n const copy = { ...this.get() };\n delete copy[key];\n this.update(copy);\n },\n\n clear<T extends Record<any, any>>(this: Store<Partial<T>>) {\n this.update({} as T);\n },\n};\n\nexport const mapActions = {\n set<K, V>(this: Store<Map<K, V>>, key: K, value: UpdateFrom<V, [V | undefined]>) {\n if (value instanceof Function) {\n value = value(this.get().get(key));\n }\n\n const newMap = new Map(this.get());\n newMap.set(key, value);\n this.update(newMap);\n return this;\n },\n\n delete<K, V>(this: Store<Map<K, V>>, key: K) {\n const newMap = new Map(this.get());\n const result = newMap.delete(key);\n this.update(newMap);\n return result;\n },\n\n clear<K, V>(this: Store<Map<K, V>>) {\n this.update(new Map());\n },\n};\n\nexport const setActions = {\n add<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.add(value);\n this.update(newSet);\n },\n\n delete<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.delete(value);\n this.update(newSet);\n },\n\n clear<T>(this: Store<Set<T>>) {\n this.update(new Set());\n },\n};\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): (...args: Args) => void {\n let t = 0;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n return (...args: Args) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n const dt = t + ms - Date.now();\n if (dt <= 0) {\n fn(...args);\n t = Date.now();\n return;\n }\n\n timeout = setTimeout(() => {\n fn(...args);\n t = Date.now();\n }, dt);\n };\n}\n","import { bind } from '@lib/bind';\nimport { calcDuration } from '@lib/calcDuration';\nimport { defaultEquals } from '@lib/equals';\nimport { forwardError } from '@lib/forwardError';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/propAccess';\nimport { arrayActions, mapActions, recordActions, setActions } from '@lib/storeActions';\nimport { throttle } from '@lib/throttle';\nimport type { Cancel, Duration, Effect, Listener, Selector, SubscribeOptions, Update, Use, UseOptions } from './commonTypes';\nimport { DerivedStore } from './derivedStore';\n\nexport type StoreActions = Record<string, (...args: any[]) => any>;\n\nexport type BoundStoreActions<T, Actions extends StoreActions> = Actions & ThisType<Store<T> & Actions>;\n\nexport interface StoreOptions {\n retain?: number;\n}\n\nexport interface StoreOptionsWithActions<T, Actions extends StoreActions> extends StoreOptions {\n methods?: Actions & ThisType<Store<T> & Actions & StandardActions<T>>;\n}\n\ntype StandardActions<T> = T extends Map<any, any>\n ? typeof mapActions\n : T extends Set<any>\n ? typeof setActions\n : T extends Array<any>\n ? typeof arrayActions\n : T extends Record<any, any>\n ? typeof recordActions\n : Record<string, never>;\n\ntype StoreWithActions<T, Actions extends StoreActions> = Store<T> &\n Omit<BoundStoreActions<T, Actions>, keyof Store<T>> &\n StandardActions<T>;\n\nconst noop = () => undefined;\n\nexport class Store<T> {\n protected value = this.initialValue;\n protected listeners = new Set<Listener>();\n protected effects = new Map<Effect, { handle?: Cancel; retain?: number; timeout?: ReturnType<typeof setTimeout> }>();\n protected notifyId = {};\n\n constructor(protected readonly initialValue: T, protected readonly options: StoreOptions = {}) {\n bind(this);\n }\n\n get(): T {\n return this.value;\n }\n\n update(update: Update<T>): void {\n if (update instanceof Function) {\n update = update(this.get());\n }\n\n this.value = update;\n this.notify();\n }\n\n sub(listener: Listener<T>, options?: SubscribeOptions): Cancel {\n const { runNow = true, throttle: throttleOption, equals = defaultEquals } = options ?? {};\n\n let compareToValue = this.get();\n let previousValue: T | undefined;\n let hasRun = false;\n\n let innerListener = (force?: boolean | void) => {\n const value = this.get();\n\n if (!force && equals(value, compareToValue)) {\n return;\n }\n\n compareToValue = value;\n const _previousValue = previousValue;\n previousValue = value;\n hasRun = true;\n\n try {\n listener(value, _previousValue);\n } catch (error) {\n forwardError(error);\n }\n };\n\n if (throttleOption) {\n innerListener = throttle(innerListener, calcDuration(throttleOption));\n }\n\n this.listeners.add(innerListener);\n this.onSubscribe();\n\n if (runNow && !hasRun) {\n innerListener(true);\n }\n\n return () => {\n this.listeners.delete(innerListener);\n this.onUnsubscribe();\n };\n }\n\n map<S>(selector: Selector<T, S>, options?: UseOptions): DerivedStore<S>;\n map<P extends Path<T>>(selector: P, options?: UseOptions): DerivedStore<Value<T, P>>;\n map(_selector: Selector<T, any> | string, options?: UseOptions): DerivedStore<any> {\n const selector = makeSelector(_selector);\n const derivedFrom = { store: this, selectors: [_selector] };\n\n return new DerivedStore(({ use }) => {\n return selector(use(this, options));\n }, derivedFrom);\n }\n\n /** Add an effect that will be executed when the store becomes active, which means when it has at least one subscriber.\n * @param effect\n * If there is already a subscriber, the effect will be executed immediately.\n * Otherweise it will be executed as soon as the first subscription is created.\n * Every time all subscriptions are removed and the first is created again, the effect will be executed again.\n * @param retain\n * If provided, delay tearing down effects when the last subscriber is removed. This is useful if a short gap in subscriber coverage is supposed to be ignored. E.g. when switching pages, the old page might unsubscribe, while the new page subscribes immediately after.\n * @returns\n * The effect can return a teardown callback, which will be executed when the last subscription is removed and potentially the ratain time has passed.\n */\n addEffect(effect: Effect, retain?: Duration) {\n this.effects.set(effect, {\n handle: this.listeners.size > 0 ? effect() ?? noop : undefined,\n retain: retain !== undefined ? calcDuration(retain) : undefined,\n });\n\n return () => {\n const { handle, timeout } = this.effects.get(effect) ?? {};\n handle?.();\n timeout !== undefined && clearTimeout(timeout);\n this.effects.delete(effect);\n };\n }\n\n /** Return whether the store is currently active, which means whether it has at least one subscriber. */\n get isActive() {\n return this.listeners.size > 0;\n }\n\n protected onSubscribe() {\n if (this.listeners.size > 1) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n timeout !== undefined && clearTimeout(timeout);\n\n this.effects.set(effect, {\n handle: handle ?? effect() ?? noop,\n retain,\n timeout: undefined,\n });\n }\n }\n\n protected onUnsubscribe() {\n if (this.listeners.size > 0) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n !retain && handle?.();\n timeout !== undefined && clearTimeout(timeout);\n\n this.effects.set(effect, {\n handle: retain ? handle : undefined,\n retain,\n timeout: retain && handle ? setTimeout(handle, retain) : undefined,\n });\n }\n }\n\n protected notify() {\n const n = (this.notifyId = {});\n for (const listener of [...this.listeners]) {\n listener();\n if (n !== this.notifyId) break;\n }\n }\n}\n\nconst defaultOptions: StoreOptions = {};\n\nfunction _store<T>(calculate: (this: { use: Use }, fns: { use: Use }) => T, options?: StoreOptions): DerivedStore<T>;\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction _store<T, Actions extends StoreActions = {}>(\n initialState: T,\n options?: StoreOptionsWithActions<T, Actions>\n): StoreWithActions<T, Actions>;\nfunction _store<T, Actions extends StoreActions>(\n initialState: T | ((this: { use: Use }, fns: { use: Use }) => T),\n options?: StoreOptionsWithActions<T, Actions>\n): StoreWithActions<T, Actions> | DerivedStore<T> {\n if (initialState instanceof Function) {\n return new DerivedStore(initialState);\n }\n\n let methods: StoreActions | undefined = options?.methods;\n\n if (initialState instanceof Map) {\n methods = { ...mapActions, ...methods };\n } else if (initialState instanceof Set) {\n methods = { ...setActions, ...methods };\n } else if (Array.isArray(initialState)) {\n methods = { ...arrayActions, ...methods };\n } else if (initialState instanceof Object) {\n methods = { ...recordActions, ...methods };\n }\n\n const store = new Store(initialState, options);\n\n const boundActions = Object.fromEntries(\n Object.entries(methods ?? ({} as BoundStoreActions<T, any>))\n .filter(([name]) => !(name in store))\n .map(([name, fn]) => [name, (fn as any).bind(store)])\n ) as BoundStoreActions<T, any>;\n\n return Object.assign(store, boundActions);\n}\n\nexport const store = Object.assign(_store, { defaultOptions });\n","import { CalculationHelper } from '@lib/calculationHelper';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/propAccess';\nimport { get, set } from '@lib/propAccess';\nimport type { Cancel, Selector, Update, Use } from './commonTypes';\nimport { Store } from './store';\n\nexport class DerivedStore<T> extends Store<T> {\n calculationHelper = new CalculationHelper({\n calculate: ({ use }) => {\n const value = this.calculate.apply({ use }, [{ use }]);\n this.valid = true;\n super.update(value);\n },\n\n addEffect: this.addEffect,\n getValue: () => this.value,\n onInvalidate: this.invalidate,\n });\n\n protected valid = false;\n protected check?: () => void;\n protected cancel?: Cancel;\n\n constructor(\n protected calculate: (this: { use: Use }, fns: { use: Use }) => T,\n protected derivedFrom?: { store: Store<any>; selectors: (Selector<any, any> | string)[] }\n ) {\n super(undefined as T);\n }\n\n get(): T {\n if (!this.valid) {\n this.calculationHelper.execute();\n }\n\n return super.get();\n }\n\n update(update: Update<T>): void {\n if (this.derivedFrom && this.derivedFrom.selectors.every((selector) => typeof selector === 'string')) {\n const path = this.derivedFrom.selectors.join('.');\n\n if (update instanceof Function) {\n const before = get<any, any>(this.derivedFrom.store, path) as T;\n update = update(before);\n }\n\n this.derivedFrom.store.update((before: any) => set<any, any>(before, path, update));\n } else {\n throw new Error('Can only updated computed stores that are derived from other stores using string selectors');\n }\n }\n\n map<S>(selector: Selector<T, S>): DerivedStore<S>;\n map<P extends Path<T>>(selector: P): DerivedStore<Value<T, P>>;\n map(_selector: string | Selector<T, any>): DerivedStore<any> {\n const selector = makeSelector(_selector);\n\n const derivedFrom = this.derivedFrom ?? { store: this, selectors: [] };\n const newDerivedFrom = { ...derivedFrom, selectors: derivedFrom.selectors.concat(_selector) };\n\n return new DerivedStore(({ use }) => {\n return selector(use(this));\n }, newDerivedFrom);\n }\n\n protected invalidate() {\n this.valid = false;\n\n if (this.isActive) {\n this.calculationHelper.execute();\n }\n }\n}\n\nfunction _derivedStore<T>(calculate: (this: { use: Use }, fns: { use: Use }) => T) {\n return new DerivedStore(calculate);\n}\n\nexport const derivedStore = Object.assign(_derivedStore, {});\n","export function hash(value: unknown): string {\n if (value instanceof Set) {\n return `s[${[...value].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Map) {\n return `m[${[...value.entries()].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Array) {\n return `[${value.map(hash).join(',')}]`;\n }\n\n if (value instanceof Object) {\n return `o[${Object.entries(value).map(hash).sort().join(',')}]`;\n }\n\n return JSON.stringify(value);\n}\n"],"names":["resolve","value","check","store"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Update } from '../core/commonTypes';
|
|
1
|
+
import type { Update, UpdateFrom } from '../core/commonTypes';
|
|
2
2
|
import type { Store } from '../core/store';
|
|
3
3
|
export declare const arrayActions: {
|
|
4
4
|
splice: <V>(this: Store<V[]>, start: number, deleteCount: number, ...items: V[]) => V[];
|
|
@@ -10,12 +10,12 @@ export declare const arrayActions: {
|
|
|
10
10
|
sort: <V_6>(this: Store<V_6[]>, compareFn?: ((a: V_6, b: V_6) => number) | undefined) => V_6[];
|
|
11
11
|
};
|
|
12
12
|
export declare const recordActions: {
|
|
13
|
-
set<
|
|
14
|
-
delete<K_1 extends
|
|
15
|
-
clear<
|
|
13
|
+
set<T extends Record<any, any>, K extends keyof T>(this: Store<T>, key: K, value: Update<T[K]>): Store<T>;
|
|
14
|
+
delete<T_1 extends Record<any, any>, K_2 extends Exclude<{ [K_1 in keyof T_1]: T_1 extends Record<K_1, T_1[K_1]> ? never : K_1; }[keyof T_1], undefined>>(this: Store<T_1>, key: K_2): void;
|
|
15
|
+
clear<T_2 extends Record<any, any>>(this: Store<Partial<T_2>>): void;
|
|
16
16
|
};
|
|
17
17
|
export declare const mapActions: {
|
|
18
|
-
set<K, V>(this: Store<Map<K, V>>, key: K, value: V): Store<Map<K, V>>;
|
|
18
|
+
set<K, V>(this: Store<Map<K, V>>, key: K, value: UpdateFrom<V, [V | undefined]>): Store<Map<K, V>>;
|
|
19
19
|
delete<K_1, V_1>(this: Store<Map<K_1, V_1>>, key: K_1): boolean;
|
|
20
20
|
clear<K_2, V_2>(this: Store<Map<K_2, V_2>>): void;
|
|
21
21
|
};
|