cross-state 0.37.7 → 0.37.8
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/index.cjs +2 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/store.cjs +9 -7
- package/dist/cjs/store.cjs.map +1 -1
- package/dist/es/index.mjs +3 -3
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/store.mjs +9 -7
- package/dist/es/store.mjs.map +1 -1
- package/package.json +2 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -18,7 +18,7 @@ const isAncestor = (ancestor, path) => {
|
|
|
18
18
|
return ancestor.length <= path.length && ancestor.every((v, i) => v === "*" || path[i] === "*" || v === path[i]);
|
|
19
19
|
};
|
|
20
20
|
function maybeAsync(value, action) {
|
|
21
|
-
if (value
|
|
21
|
+
if (store.isPromise(value)) {
|
|
22
22
|
return value.then(action);
|
|
23
23
|
}
|
|
24
24
|
return action(value);
|
|
@@ -110,7 +110,7 @@ class Persist {
|
|
|
110
110
|
}
|
|
111
111
|
async watchStorage() {
|
|
112
112
|
let keys = this.storage.keys();
|
|
113
|
-
if (keys
|
|
113
|
+
if (store.isPromise(keys)) {
|
|
114
114
|
keys = await keys;
|
|
115
115
|
}
|
|
116
116
|
if (this.stopped) {
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/lib/updateHelpers.ts","../../src/persist/persistPathHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistStorage.ts","../../src/persist/persist.ts"],"sourcesContent":["export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n","import { isObject } from '@lib/helpers';\nimport type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (\n value: any,\n path: KeyType[],\n): [value: unknown, subValues: { path: KeyType[]; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*')\n return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: KeyType[]; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!isObject(newValue[key])) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import type { MaybePromise } from './maybePromise';\n\nexport function maybeAsync<T, R>(\n value: MaybePromise<T>,\n action: (value: T) => MaybePromise<R>,\n): MaybePromise<R> {\n if (value instanceof Promise) {\n return value.then(action);\n }\n return action(value);\n}\n\nexport function maybeAsyncArray<T>(values: (() => MaybePromise<T>)[]): MaybePromise<T[]> {\n const run = (remainingValues: (() => MaybePromise<T>)[], results: T[]): MaybePromise<T[]> => {\n const [first, ...rest] = remainingValues;\n if (!first) {\n return results;\n }\n\n return maybeAsync(first(), (result) => run(rest, results.concat(result)));\n };\n\n return run(values, []);\n}\n","import { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport type PersistStorage = PersistStorageBase &\n (PersistStorageWithKeys | PersistStorageWithLength);\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithKeys {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n keys(): string[] | Promise<string[]> {\n if ('keys' in storage) {\n return storage.keys();\n }\n\n return maybeAsync(\n storage.length instanceof Function ? storage.length() : storage.length,\n (length) => {\n const keyPromises = maybeAsyncArray(\n Array.from({ length }, (_, index) => () => storage.key(index)),\n );\n\n return maybeAsync(keyPromises, (keys) =>\n keys.filter((key): key is string => typeof key === 'string'),\n );\n },\n );\n },\n };\n}\n","import { isAncestor } from './persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithKeys,\n} from './persistStorage';\nimport { type Cancel, type Store } from '@core';\nimport { diff } from '@lib/diff';\nimport { shallowEqual } from '@lib/equals';\nimport { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport { castArrayPath, get, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n throttleMs?: number;\n };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttleMs?: number;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithKeys;\n\n readonly paths: {\n path: KeyType[];\n throttleMs?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress?: [any, any];\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttleMs?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return { path: castArrayPath(p) };\n }\n\n const _p = p as { path: KeyType[]; throttleMs?: number };\n\n return {\n path: castArrayPath(_p.path),\n throttleMs: _p.throttleMs,\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({ path: ['*'] });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n let committed = this.store.get();\n\n const cancel = this.store.subscribe(\n (value) => {\n const [patches] = diff(committed, value);\n committed = value;\n\n for (const patch of patches) {\n if (\n this.updateInProgress &&\n shallowEqual(this.updateInProgress[0], patch.path) &&\n this.updateInProgress[1] === (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));\n\n if (!ancestor) {\n continue;\n }\n\n const pathToSave = patch.path.slice(0, ancestor.path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n }\n },\n { runNow: false },\n );\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n let keys = this.storage.keys();\n if (keys instanceof Promise) {\n keys = await keys;\n }\n\n if (this.stopped) {\n return;\n }\n\n for (const key of keys) {\n const path = this.parseKey(key);\n if (!path) {\n continue;\n }\n\n this.queue(() => this.load(path));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load(event.data));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey(path: KeyType[]) {\n return `${this.prefix}${JSON.stringify(path)}`;\n }\n\n private parseKey(key: string) {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n return JSON.parse(key.slice(this.prefix.length)) as KeyType[];\n }\n\n private load(path: KeyType[]) {\n const matchingPath = this.paths.find(\n (p) => p.path.length === path.length && isAncestor(p.path, path),\n );\n if (!matchingPath) {\n return;\n }\n\n const key = this.buildKey(path);\n\n return maybeAsync(this.storage.getItem(key), (value) => {\n if (this.stopped || !value) {\n return;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, path) || isAncestor(path, ref));\n if (inSaveQueue) {\n return;\n }\n\n const parsedValue = value === 'undefined' ? undefined : JSON.parse(value);\n\n this.updateInProgress = [path, parsedValue];\n this.store.set((state) => set(state, path as any, parsedValue));\n this.updateInProgress = undefined;\n });\n }\n\n private save(path: KeyType[]) {\n const key = this.buildKey(path);\n const value = get(this.store.get(), path as any);\n const serializedValue = value === undefined ? 'undefined' : JSON.stringify(value);\n\n return maybeAsync(this.storage.setItem(key, serializedValue), () => {\n this.channel.postMessage(path);\n\n return maybeAsync(this.storage.keys(), (keys) => {\n const toRemove = keys.filter((k) => {\n const parsedKey = this.parseKey(k);\n return (\n parsedKey && parsedKey.length > path.length && isAncestor(path, parsedKey)\n // !this.queue.getRefs().find((ref) => isAncestor(ref, parsedKey))\n );\n });\n\n return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));\n });\n });\n }\n\n async stop() {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"names":["store","queue","castArrayPath","diff","shallowEqual","set","get"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/lib/updateHelpers.ts","../../src/persist/persistPathHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistStorage.ts","../../src/persist/persist.ts"],"sourcesContent":["export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n","import { isObject } from '@lib/helpers';\nimport type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (\n value: any,\n path: KeyType[],\n): [value: unknown, subValues: { path: KeyType[]; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*')\n return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: KeyType[]; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!isObject(newValue[key])) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import isPromise from '@lib/isPromise';\nimport type { MaybePromise } from './maybePromise';\n\nexport function maybeAsync<T, R>(\n value: MaybePromise<T>,\n action: (value: T) => MaybePromise<R>,\n): MaybePromise<R> {\n if (isPromise(value)) {\n return value.then(action);\n }\n return action(value);\n}\n\nexport function maybeAsyncArray<T>(values: (() => MaybePromise<T>)[]): MaybePromise<T[]> {\n const run = (remainingValues: (() => MaybePromise<T>)[], results: T[]): MaybePromise<T[]> => {\n const [first, ...rest] = remainingValues;\n if (!first) {\n return results;\n }\n\n return maybeAsync(first(), (result) => run(rest, results.concat(result)));\n };\n\n return run(values, []);\n}\n","import { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport type PersistStorage = PersistStorageBase &\n (PersistStorageWithKeys | PersistStorageWithLength);\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithKeys {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n keys(): string[] | Promise<string[]> {\n if ('keys' in storage) {\n return storage.keys();\n }\n\n return maybeAsync(\n storage.length instanceof Function ? storage.length() : storage.length,\n (length) => {\n const keyPromises = maybeAsyncArray(\n Array.from({ length }, (_, index) => () => storage.key(index)),\n );\n\n return maybeAsync(keyPromises, (keys) =>\n keys.filter((key): key is string => typeof key === 'string'),\n );\n },\n );\n },\n };\n}\n","import { isAncestor } from './persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithKeys,\n} from './persistStorage';\nimport { type Cancel, type Store } from '@core';\nimport { diff } from '@lib/diff';\nimport { shallowEqual } from '@lib/equals';\nimport isPromise from '@lib/isPromise';\nimport { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport { castArrayPath, get, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n throttleMs?: number;\n };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttleMs?: number;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithKeys;\n\n readonly paths: {\n path: KeyType[];\n throttleMs?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress?: [any, any];\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttleMs?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return { path: castArrayPath(p) };\n }\n\n const _p = p as { path: KeyType[]; throttleMs?: number };\n\n return {\n path: castArrayPath(_p.path),\n throttleMs: _p.throttleMs,\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({ path: ['*'] });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n let committed = this.store.get();\n\n const cancel = this.store.subscribe(\n (value) => {\n const [patches] = diff(committed, value);\n committed = value;\n\n for (const patch of patches) {\n if (\n this.updateInProgress &&\n shallowEqual(this.updateInProgress[0], patch.path) &&\n this.updateInProgress[1] === (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));\n\n if (!ancestor) {\n continue;\n }\n\n const pathToSave = patch.path.slice(0, ancestor.path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n }\n },\n { runNow: false },\n );\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n let keys = this.storage.keys();\n if (isPromise(keys)) {\n keys = await keys;\n }\n\n if (this.stopped) {\n return;\n }\n\n for (const key of keys) {\n const path = this.parseKey(key);\n if (!path) {\n continue;\n }\n\n this.queue(() => this.load(path));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load(event.data));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey(path: KeyType[]) {\n return `${this.prefix}${JSON.stringify(path)}`;\n }\n\n private parseKey(key: string) {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n return JSON.parse(key.slice(this.prefix.length)) as KeyType[];\n }\n\n private load(path: KeyType[]) {\n const matchingPath = this.paths.find(\n (p) => p.path.length === path.length && isAncestor(p.path, path),\n );\n if (!matchingPath) {\n return;\n }\n\n const key = this.buildKey(path);\n\n return maybeAsync(this.storage.getItem(key), (value) => {\n if (this.stopped || !value) {\n return;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, path) || isAncestor(path, ref));\n if (inSaveQueue) {\n return;\n }\n\n const parsedValue = value === 'undefined' ? undefined : JSON.parse(value);\n\n this.updateInProgress = [path, parsedValue];\n this.store.set((state) => set(state, path as any, parsedValue));\n this.updateInProgress = undefined;\n });\n }\n\n private save(path: KeyType[]) {\n const key = this.buildKey(path);\n const value = get(this.store.get(), path as any);\n const serializedValue = value === undefined ? 'undefined' : JSON.stringify(value);\n\n return maybeAsync(this.storage.setItem(key, serializedValue), () => {\n this.channel.postMessage(path);\n\n return maybeAsync(this.storage.keys(), (keys) => {\n const toRemove = keys.filter((k) => {\n const parsedKey = this.parseKey(k);\n return (\n parsedKey && parsedKey.length > path.length && isAncestor(path, parsedKey)\n // !this.queue.getRefs().find((ref) => isAncestor(ref, parsedKey))\n );\n });\n\n return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));\n });\n });\n }\n\n async stop() {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"names":["isPromise","store","queue","castArrayPath","diff","shallowEqual","set","get"],"mappings":"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"}
|
package/dist/cjs/store.cjs
CHANGED
|
@@ -60,6 +60,9 @@ class Deferred extends Promise {
|
|
|
60
60
|
return Promise;
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
+
function isPromise(value) {
|
|
64
|
+
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
65
|
+
}
|
|
63
66
|
function queue() {
|
|
64
67
|
const q = [];
|
|
65
68
|
const completionListeners = /* @__PURE__ */ new Set();
|
|
@@ -77,7 +80,7 @@ function queue() {
|
|
|
77
80
|
while (next = q.shift()) {
|
|
78
81
|
try {
|
|
79
82
|
let result = next.action();
|
|
80
|
-
if (result
|
|
83
|
+
if (isPromise(result)) {
|
|
81
84
|
result = await result;
|
|
82
85
|
}
|
|
83
86
|
next.resolve(result);
|
|
@@ -117,9 +120,6 @@ function queue() {
|
|
|
117
120
|
}
|
|
118
121
|
);
|
|
119
122
|
}
|
|
120
|
-
function isPromise(value) {
|
|
121
|
-
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
122
|
-
}
|
|
123
123
|
class PromiseWithState extends Promise {
|
|
124
124
|
constructor(value, state = { status: "pending" }) {
|
|
125
125
|
super((resolve) => resolve(value));
|
|
@@ -216,7 +216,7 @@ function calculatedValue(store, notify) {
|
|
|
216
216
|
if (update instanceof Function) {
|
|
217
217
|
update = update(await value);
|
|
218
218
|
}
|
|
219
|
-
if (update
|
|
219
|
+
if (isPromise(update)) {
|
|
220
220
|
update = await update;
|
|
221
221
|
}
|
|
222
222
|
if (!(connection == null ? void 0 : connection.active)) {
|
|
@@ -228,7 +228,8 @@ function calculatedValue(store, notify) {
|
|
|
228
228
|
},
|
|
229
229
|
updateError(error) {
|
|
230
230
|
(connection == null ? void 0 : connection.active) && q(() => {
|
|
231
|
-
|
|
231
|
+
value = PromiseWithState.reject(error);
|
|
232
|
+
notify();
|
|
232
233
|
});
|
|
233
234
|
},
|
|
234
235
|
updateIsConnected(isConnected) {
|
|
@@ -260,7 +261,7 @@ function calculatedValue(store, notify) {
|
|
|
260
261
|
return whenConnected;
|
|
261
262
|
}
|
|
262
263
|
value = store.getter instanceof Function ? store.getter({ signal: ac.signal, use, connect }) : store.getter;
|
|
263
|
-
if (value
|
|
264
|
+
if (isPromise(value)) {
|
|
264
265
|
value.finally(() => whenExecuted.resolve()).catch(() => void 0);
|
|
265
266
|
} else {
|
|
266
267
|
whenExecuted.resolve();
|
|
@@ -769,6 +770,7 @@ exports.calcDuration = calcDuration;
|
|
|
769
770
|
exports.calculatedValue = calculatedValue;
|
|
770
771
|
exports.createStore = createStore;
|
|
771
772
|
exports.debounce = debounce;
|
|
773
|
+
exports.isPromise = isPromise;
|
|
772
774
|
exports.makeSelector = makeSelector;
|
|
773
775
|
exports.mapMethods = mapMethods;
|
|
774
776
|
exports.queue = queue;
|
package/dist/cjs/store.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.cjs","sources":["../../src/lib/autobind.ts","../../src/lib/calcDuration.ts","../../src/lib/deferred.ts","../../src/lib/queue.ts","../../src/lib/isPromise.ts","../../src/lib/promiseWithState.ts","../../src/lib/calculatedValue.ts","../../src/lib/makeSelector.ts","../../src/lib/callable.ts","../../src/lib/debounce.ts","../../src/lib/disposable.ts","../../src/lib/forwardError.ts","../../src/lib/promiseWithCancel.ts","../../src/lib/standardMethods.ts","../../src/lib/throttle.ts","../../src/core/store.ts"],"sourcesContent":["export const autobind = <\n TClass extends abstract new (...args: any) => any = abstract new (...args: any) => any,\n>(\n _class: TClass,\n _context?: ClassDecoratorContext<TClass>,\n) => {\n if (Reflect.getOwnPropertyDescriptor(_class.prototype, '__autobind_done__')) {\n return _class;\n }\n Reflect.defineProperty(_class.prototype, '__autobind_done__', { value: true });\n\n for (const key of Reflect.ownKeys(_class.prototype)) {\n if (key === 'constructor') {\n continue;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(_class.prototype, key);\n\n // Only methods need binding\n if (typeof descriptor?.value === 'function') {\n let method = descriptor.value as (...args: any[]) => any;\n let isBinding = false;\n\n Object.defineProperty(_class.prototype, key, {\n configurable: true,\n get() {\n if (\n isBinding ||\n this === _class.prototype ||\n Object.prototype.hasOwnProperty.call(this, key) ||\n typeof method !== 'function'\n ) {\n return method;\n }\n\n const boundMethod = (...args: any[]) => Reflect.apply(method, this, args);\n isBinding = true;\n\n Object.defineProperty(this, key, {\n configurable: true,\n get() {\n return boundMethod;\n },\n set(v) {\n method = v;\n // delete this[key];\n },\n });\n\n isBinding = false;\n return boundMethod;\n },\n set(v) {\n method = v;\n },\n });\n }\n }\n\n return _class;\n};\n","import type { Duration } from '../core/commonTypes';\n\nexport function 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 class Deferred<T = void> extends Promise<T> {\n static get [Symbol.species]() {\n return Promise;\n }\n\n resolve: (value: T | PromiseLike<T>) => void = () => undefined;\n reject: (reason?: any) => void = () => undefined;\n\n constructor() {\n const that = {};\n\n super((resolve, reject) => {\n Object.assign(that, { resolve, reject });\n });\n\n Object.assign(this, that);\n }\n}\n","import type { MaybePromise } from './maybePromise';\nimport type { Listener } from '@core';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>, ref?: any): Promise<T>;\n clear: () => void;\n whenDone: () => Promise<void>;\n size: number;\n getRefs: () => any[];\n}\n\nexport function queue(): Queue {\n const q: {\n action: Action<any>;\n resolve: (value: any) => void;\n reject: (error: unknown) => void;\n ref?: any;\n }[] = [];\n const completionListeners = new Set<Listener<void>>();\n let active = false;\n\n const notify = () => {\n for (const listener of completionListeners) {\n listener();\n }\n\n completionListeners.clear();\n };\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\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n active = false;\n notify();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>, ref?: any) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject, ref });\n run();\n });\n },\n {\n clear() {\n q.length = 0;\n },\n\n whenDone() {\n if (!active) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n completionListeners.add(resolve);\n });\n },\n\n get size() {\n return q.length;\n },\n\n getRefs() {\n return q.map((item) => item.ref).filter((x) => x !== undefined);\n },\n },\n );\n}\n","export default function isPromise(value: unknown): value is Promise<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n","import isPromise from '@lib/isPromise';\nimport { type ErrorState, type PendingState, type ValueState } from './cacheState';\nimport { type MaybePromise } from './maybePromise';\n\nexport class PromiseWithState<T> extends Promise<T> {\n static get [Symbol.species]() {\n return Promise;\n }\n\n static override resolve(): PromiseWithState<void>;\n\n static override resolve<T>(value: MaybePromise<T>): PromiseWithState<T>;\n\n static override resolve<T>(value?: MaybePromise<T>) {\n return new PromiseWithState<T>(value as MaybePromise<T>);\n }\n\n static override reject<T = never>(error: unknown) {\n return new PromiseWithState<T>(Promise.reject(error), { status: 'error', error });\n }\n\n constructor(\n value: MaybePromise<T>,\n public state: ValueState<T> | ErrorState | PendingState = { status: 'pending' },\n ) {\n super((resolve) => resolve(value));\n\n if (isPromise(value)) {\n value\n .then((value) => {\n this.state = { status: 'value', value: value };\n })\n .catch((error) => {\n this.state = { status: 'error', error };\n });\n } else {\n this.state = { status: 'value', value: value };\n }\n }\n}\n","import type { AsyncConnectionActions, Cancel, Connection } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { Deferred } from '@lib/deferred';\nimport { queue } from '@lib/queue';\nimport { deepEqual } from './equals';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Cache } from '@core';\n\nexport interface CalculatedValue<T> {\n value: T;\n check: () => void;\n stop(): void;\n invalidateDependencies(recursive?: boolean): void;\n}\n\nexport function calculatedValue<T>(store: Store<T>, notify: () => void): CalculatedValue<T> {\n let active = false;\n const deps = new Array<{ store: Store<any>; value: any; on: () => void; off: () => void }>();\n let value: T | undefined;\n const whenConnected = new Deferred();\n const whenExecuted = new Deferred();\n const ac = new AbortController();\n let connection: { active: boolean; cancel?: Cancel } | undefined;\n const q = queue();\n q(() => whenExecuted);\n\n const cancelEffect = store.addEffect(() => {\n if (connection) {\n store.invalidate();\n return;\n }\n\n active = true;\n\n for (const dep of deps) {\n dep.on();\n }\n\n return () => {\n active = false;\n\n for (const dep of deps) {\n dep.off();\n }\n\n if (connection) {\n connection.active = false;\n connection.cancel?.();\n q.clear();\n\n if ('state' in store) {\n (store as unknown as Cache<any>).state.set((state) => ({\n ...state,\n isConnected: false,\n isStale: true,\n }));\n }\n }\n };\n });\n\n function use<S>(dep: Store<S>) {\n const value = dep.get();\n let cancel: Cancel | undefined;\n\n const on = () => {\n cancel ||= dep.subscribe(() => store.invalidate(), { runNow: false });\n };\n\n const off = () => {\n cancel?.();\n cancel = undefined;\n };\n\n deps.push({ store: dep, value, on, off });\n\n if (active) {\n on();\n }\n\n return value;\n }\n\n async function connect(createConnection: Connection<T>) {\n if (!active) {\n connection = { active: false };\n return;\n }\n\n const actions: AsyncConnectionActions<any> = {\n set(_value) {\n connection?.active &&\n q(() => {\n value = _value;\n notify();\n });\n },\n updateValue(update) {\n connection?.active &&\n q(async () => {\n if (update instanceof Function) {\n update = update(await value);\n }\n\n if (update instanceof Promise) {\n update = await update;\n }\n\n if (!connection?.active) {\n return;\n }\n\n value = PromiseWithState.resolve(update) as T;\n notify();\n });\n },\n updateError(error) {\n connection?.active &&\n q(() => {\n (store as unknown as Store<Promise<any>>).set(Promise.reject(error));\n });\n },\n updateIsConnected(isConnected) {\n if (!connection?.active) {\n return;\n }\n\n if (isConnected) {\n whenConnected.resolve();\n }\n\n q(() => {\n if ('state' in store) {\n (store as unknown as Cache<any>).state.set('isConnected', isConnected);\n }\n });\n },\n close() {\n connection?.active && store.invalidate();\n },\n };\n\n connection = { active: true };\n let _cancel: Cancel | undefined = createConnection(actions as any);\n\n connection.cancel = () => {\n _cancel?.();\n _cancel = undefined;\n };\n\n if (!connection.active) {\n connection.cancel();\n }\n\n return whenConnected;\n }\n\n value =\n store.getter instanceof Function\n ? store.getter({ signal: ac.signal, use, connect })\n : store.getter;\n\n if (value instanceof Promise) {\n value.finally(() => whenExecuted.resolve()).catch(() => undefined);\n } else {\n whenExecuted.resolve();\n }\n\n function check() {\n if (active) {\n return;\n }\n\n for (const dep of deps) {\n if (!deepEqual(dep.store.get(), dep.value)) {\n store.invalidate();\n return;\n }\n }\n }\n\n function stop() {\n cancelEffect();\n whenExecuted.resolve();\n whenConnected.resolve();\n ac.abort();\n\n if (connection) {\n connection.active = false;\n connection.cancel?.();\n q.clear();\n }\n }\n\n function invalidateDependencies(recursive?: boolean) {\n for (const dep of deps) {\n dep.store.invalidate(recursive);\n }\n }\n\n return {\n get value() {\n return value!;\n },\n check,\n stop,\n invalidateDependencies,\n };\n}\n\nexport function staticValue<T>(value: T): CalculatedValue<T> {\n return {\n value,\n check: () => undefined,\n stop: () => undefined,\n invalidateDependencies: () => undefined,\n };\n}\n","import type { Path } from './path';\nimport { get } from './propAccess';\n\nexport function makeSelector<T, S>(selector?: ((value: T) => S) | Path<any>): (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","export class Callable<Args extends any[], T> extends Function {\n constructor(protected _call: (...args: Args) => T) {\n super('...args', 'return this._call(...args)');\n\n // eslint-disable-next-line no-constructor-return\n return this.bind(this);\n }\n}\n","import { calcDuration } from './calcDuration';\nimport type { Duration } from '@core';\n\nexport type DebounceOptions =\n | Duration\n | {\n wait: Duration;\n maxWait?: Duration;\n };\n\nexport function debounce<Args extends any[]>(\n action: (...args: Args) => void,\n options: Duration | DebounceOptions,\n) {\n const wait =\n typeof options === 'object' && 'wait' in options\n ? calcDuration(options.wait)\n : calcDuration(options);\n\n const maxWait =\n typeof options === 'object' && 'maxWait' in options && options.maxWait !== undefined\n ? calcDuration(options.maxWait)\n : undefined;\n\n let run: (() => void) | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let timeoutStarted: number | undefined;\n\n function flush() {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run?.();\n }\n\n function cancel() {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run = undefined;\n timeout = undefined;\n timeoutStarted = undefined;\n }\n\n function isScheduled() {\n return timeout !== undefined;\n }\n\n function debounce(...args: Args) {\n const now = Date.now();\n timeoutStarted ??= now;\n\n const deadline = Math.min(\n //\n now + wait,\n timeoutStarted + (maxWait ?? Number.POSITIVE_INFINITY),\n );\n\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run = () => {\n run = undefined;\n timeout = undefined;\n timeoutStarted = undefined;\n\n action(...args);\n };\n\n timeout = setTimeout(run, deadline - now);\n }\n\n return Object.assign(debounce, { flush, cancel, isScheduled });\n}\n","import type { Cancel } from '@core';\nimport type { DisposableCancel } from '@core/commonTypes';\n\nexport default function disposable(dispose: Cancel): DisposableCancel {\n return Object.assign(\n dispose,\n Symbol.dispose ? { [Symbol.dispose]: dispose } : {},\n ) as DisposableCancel;\n}\n","export function forwardError(error: unknown) {\n setTimeout(() => {\n throw error;\n });\n}\n","import { autobind } from '@lib/autobind';\n\nexport class PromiseCancelError extends Error {\n constructor() {\n super('cancelled');\n }\n}\n\nexport class PromiseWithCancel<T> extends Promise<T> {\n private abortController;\n\n constructor(\n executor: (\n resolve: (value: T) => void,\n reject: (error: unknown) => void,\n signal: AbortSignal,\n ) => void,\n ) {\n autobind(PromiseWithCancel);\n const abortController = new AbortController();\n\n super((resolve, reject) => {\n executor(resolve, reject, abortController.signal);\n\n abortController.signal.addEventListener('abort', (e) => {\n reject(abortController.signal.reason);\n });\n });\n\n this.abortController = abortController;\n }\n\n cancel(reason: any = new PromiseCancelError()) {\n this.abortController.abort(reason);\n }\n}\n","import type { Store } from '../core/store';\nimport type { OptionalPropertyOf } from './typeHelpers';\n\ntype Function_ = (...args: any) => any;\n\nfunction createArrayAction<P extends keyof Array<any>>(prop: P) {\n return function arrayAction<T extends Array<any>>(\n this: Store<T>,\n ...args: T[P] extends Function_ ? Parameters<T[P]> : never\n ): T[P] extends Function_ ? ReturnType<T[P]> : never {\n const newArray = this.get().slice() as T;\n const result = (newArray[prop] as Function_)(...(args as any));\n this.set(newArray);\n return result;\n };\n}\nexport const arrayMethods = {\n splice: /* @__PURE__ */ createArrayAction('splice'),\n push: /* @__PURE__ */ createArrayAction('push'),\n pop: /* @__PURE__ */ createArrayAction('pop'),\n shift: /* @__PURE__ */ createArrayAction('shift'),\n unshift: /* @__PURE__ */ createArrayAction('unshift'),\n reverse: /* @__PURE__ */ createArrayAction('reverse'),\n sort: /* @__PURE__ */ createArrayAction('sort'),\n};\n\nexport const recordMethods = {\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.set(copy);\n },\n\n clear<T extends Record<any, any>>(this: Store<Partial<T>>) {\n this.set({} as T);\n },\n};\n\nexport const mapMethods = {\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.set(newMap);\n return result;\n },\n\n clear<K, V>(this: Store<Map<K, V>>) {\n this.set(new Map());\n },\n};\n\nexport const setMethods = {\n add<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.add(value);\n this.set(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.set(newSet);\n },\n\n clear<T>(this: Store<Set<T>>) {\n this.set(new Set());\n },\n};\n","import { calcDuration } from './calcDuration';\nimport type { Duration } from '@core';\n\nexport function throttle<Args extends any[]>(\n action: (...args: Args) => void,\n duration: Duration,\n): (...args: Args) => void {\n const ms = calcDuration(duration);\n\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 action(...args);\n t = Date.now();\n return;\n }\n\n timeout = setTimeout(() => {\n action(...args);\n t = Date.now();\n }, dt);\n };\n}\n","import { autobind } from '@lib/autobind';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue, staticValue, type CalculatedValue } from '@lib/calculatedValue';\nimport { Callable } from '@lib/callable';\nimport { debounce } from '@lib/debounce';\nimport disposable from '@lib/disposable';\nimport { deepEqual } from '@lib/equals';\nimport { forwardError } from '@lib/forwardError';\nimport { isObject } from '@lib/helpers';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/path';\nimport { PromiseWithCancel } from '@lib/promiseWithCancel';\nimport { get, set } from '@lib/propAccess';\nimport { arrayMethods, mapMethods, recordMethods, setMethods } from '@lib/standardMethods';\nimport { throttle } from '@lib/throttle';\nimport type {\n CalculationActions,\n Cancel,\n DisposableCancel,\n Duration,\n Effect,\n Listener,\n Selector,\n SubscribeOptions,\n Update,\n} from './commonTypes';\n\nexport type StoreMethods = Record<string, (...args: any[]) => any>;\n\nexport type BoundStoreMethods<T, Methods extends StoreMethods> = Methods &\n ThisType<Store<T> & Methods>;\n\nexport interface StoreOptions {\n retain?: Duration;\n equals?: SubscribeOptions['equals'];\n}\n\nexport interface StoreOptionsWithMethods<T, Methods extends StoreMethods> extends StoreOptions {\n methods?: Methods & ThisType<Store<T> & Methods & StandardMethods<T>>;\n}\n\nexport type Calculate<T> = (helpers: CalculationActions<T>) => T;\n\ntype StandardMethods<T> =\n T extends Map<any, any>\n ? typeof mapMethods\n : T extends Set<any>\n ? typeof setMethods\n : T extends Array<any>\n ? typeof arrayMethods\n : T extends Record<any, any>\n ? typeof recordMethods\n : Record<string, never>;\n\ntype StoreWithMethods<T, Methods extends StoreMethods> = Store<T> &\n Omit<BoundStoreMethods<T, Methods>, keyof Store<T>> &\n StandardMethods<T>;\n\nexport interface OnceOptions {\n signal?: AbortSignal;\n timeout?: Duration;\n}\n\nfunction noop() {\n return undefined;\n}\n\nexport class Store<T> extends Callable<any, any> {\n protected calculatedValue?: CalculatedValue<T>;\n protected defaultValue?: CalculatedValue<T>;\n\n protected listeners = new Map<Listener, boolean>();\n\n protected effects = new Map<\n Effect,\n { handle?: Cancel; retain?: number; timeout?: ReturnType<typeof setTimeout> }\n >();\n\n protected notifyId = {};\n\n constructor(\n public readonly getter: T | Calculate<T>,\n public readonly options: StoreOptions = {},\n public readonly derivedFrom?: {\n store: Store<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n updater: (state: any) => void;\n },\n protected readonly _call: (...args: any[]) => any = () => undefined,\n ) {\n super(_call);\n autobind(Store);\n\n if (typeof getter !== 'function') {\n this.calculatedValue = this.defaultValue = staticValue(getter);\n }\n }\n\n get(): T {\n this.calculatedValue?.check();\n\n if (!this.calculatedValue) {\n this.calculatedValue = calculatedValue(this, this.notify);\n }\n\n return this.calculatedValue.value;\n }\n\n set(update: Update<T>): void;\n\n set<const P extends Path<T>>(path: P, update: Update<Value<T, P>>): void;\n\n set(...args: any[]): void {\n const path: any = args.length > 1 ? args[0] : [];\n let update: Update<any> = args.length > 1 ? args[1] : args[0];\n\n if (update instanceof Function) {\n const before = this.get();\n const valueBefore = get(before, path);\n const valueAfter = update(valueBefore);\n update = set(before, path, valueAfter);\n } else if (path.length > 0) {\n update = set(this.get(), path, update);\n }\n\n if (this.derivedFrom) {\n this.derivedFrom.updater(update);\n return;\n }\n\n this.calculatedValue?.stop();\n this.calculatedValue = staticValue(update);\n this.notify();\n }\n\n invalidate(recursive?: boolean) {\n if (recursive) {\n this.calculatedValue?.invalidateDependencies(recursive);\n }\n\n this.calculatedValue?.stop();\n this.calculatedValue = this.defaultValue;\n this.notify();\n }\n\n subscribe(listener: Listener<T>, options?: SubscribeOptions): DisposableCancel {\n const {\n passive,\n runNow = true,\n throttle: throttleOption,\n debounce: debounceOption,\n equals = deepEqual,\n } = options ?? {};\n\n let isSetup = false;\n let previousValue: { value: T } | undefined;\n\n let innerListener = () => {\n if (!isSetup) {\n return;\n }\n\n const value = passive ? this.calculatedValue : { value: this.get() };\n\n if (!value) {\n return;\n }\n\n if (previousValue && equals(value.value, previousValue.value)) {\n return;\n }\n\n const _previousValue = previousValue?.value;\n previousValue = this.calculatedValue && { value: this.calculatedValue?.value };\n\n try {\n listener(value.value, _previousValue);\n } catch (error) {\n forwardError(error);\n }\n };\n\n if (throttleOption) {\n innerListener = throttle(innerListener, throttleOption);\n } else if (debounceOption) {\n innerListener = debounce(innerListener, debounceOption);\n }\n\n this.listeners.set(innerListener, !passive);\n if (!passive) {\n this.onSubscribe();\n }\n\n isSetup = true;\n\n if (runNow) {\n innerListener();\n } else {\n previousValue = passive\n ? this.calculatedValue && { value: this.calculatedValue.value }\n : { value: this.get() };\n }\n\n return disposable(() => {\n this.listeners.delete(innerListener);\n if (!passive) {\n this.onUnsubscribe();\n }\n });\n }\n\n once<S extends T>(\n condition: (value: T) => value is S,\n options?: OnceOptions,\n ): PromiseWithCancel<S>;\n\n once(condition: (value: T) => boolean, options?: OnceOptions): PromiseWithCancel<T>;\n\n once(options?: OnceOptions): PromiseWithCancel<T>;\n\n once(\n ...args: [condition: (value: any) => boolean, options?: OnceOptions] | [options?: OnceOptions]\n ): PromiseWithCancel<any> {\n const condition = args[0] instanceof Function ? args[0] : Boolean;\n const options = args[0] instanceof Function ? args[1] : args[0];\n\n return new PromiseWithCancel<T>((resolve, reject, signal) => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const cancel = this.subscribe(\n (value) => {\n if (stopped || !condition(value)) {\n return;\n }\n\n resolve(value);\n stopped = true;\n timer && clearTimeout(timer);\n setTimeout(() => cancel());\n },\n {\n runNow: !!condition,\n },\n );\n\n if (stopped) {\n return;\n }\n\n signal.addEventListener('abort', cancel);\n\n options?.signal?.addEventListener('abort', () => {\n cancel();\n reject(options.signal?.reason ?? new Error('cancelled'));\n });\n\n if (options?.timeout !== undefined) {\n timer = setTimeout(() => {\n cancel();\n reject(new Error('timeout'));\n }, calcDuration(options.timeout));\n }\n });\n }\n\n map<S>(selector: Selector<T, S>, updater?: (value: S) => Update<T>): Store<S>;\n\n map<P extends Path<T>>(selector: P): Store<Value<T, P>>;\n\n map(_selector: Selector<T, any> | Path<any>, ...args: any[]): Store<any> {\n const updater: ((value: any) => Update<T>) | undefined =\n _selector instanceof Function\n ? args[0]\n : (value) => (state) => set(state, _selector as Path<T>, value);\n\n const selector = makeSelector(_selector);\n\n const derivedFrom = {\n store: this.derivedFrom ? this.derivedFrom.store : this,\n selectors: this.derivedFrom ? [...this.derivedFrom.selectors, _selector] : [_selector],\n\n updater: (value: any) => {\n if (!updater) {\n throw new TypeError(\n 'Can only update computed stores that either are derived from other stores using string selectors or have an updater function.',\n );\n }\n\n let update = updater(value);\n\n if (update instanceof Function) {\n update = update(this.get());\n }\n\n if (this.derivedFrom) {\n this.derivedFrom.updater(update);\n } else {\n this.set(update);\n }\n },\n };\n\n return new Store(\n ({ use }) => {\n return selector(use(this));\n },\n this.options,\n derivedFrom,\n );\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 = this.options.retain) {\n this.effects.set(effect, {\n handle: this.isActive() ? 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\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\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 isActive() {\n return [...this.listeners.values()].some(Boolean);\n }\n\n protected onSubscribe() {\n if ([...this.listeners.values()].filter(Boolean).length > 1) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\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.values()].some(Boolean)) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n if (!retain) {\n handle?.();\n\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n this.effects.set(effect, {\n handle: undefined,\n retain,\n timeout: undefined,\n });\n\n continue;\n }\n\n const newTimeout =\n timeout ??\n (handle\n ? setTimeout(() => {\n handle();\n this.effects.set(effect, {\n handle: undefined,\n retain,\n timeout: undefined,\n });\n }, retain)\n : undefined);\n\n this.effects.set(effect, {\n handle,\n retain,\n timeout: newTimeout,\n });\n }\n }\n\n protected notify() {\n const n = {};\n this.notifyId = n;\n\n const snapshot = [...this.listeners.keys()];\n for (const listener of snapshot) {\n listener();\n if (n !== this.notifyId) break;\n }\n }\n}\n\nfunction create<T>(calculate: Calculate<T>, options?: StoreOptions): Store<T>;\nfunction create<T, Methods extends StoreMethods = {}>(\n initialState: T,\n options?: StoreOptionsWithMethods<T, Methods>,\n): StoreWithMethods<T, Methods>;\nfunction create<T, Methods extends StoreMethods>(\n initialState: T | Calculate<T>,\n options?: StoreOptionsWithMethods<T, Methods>,\n): StoreWithMethods<T, Methods> | Store<T> {\n options = { ...createStore.defaultOptions, ...options };\n\n const store = new Store(initialState, options);\n\n if (initialState instanceof Function) {\n return store;\n }\n\n let methods: StoreMethods | undefined = options?.methods;\n\n if (initialState instanceof Map) {\n methods = { ...mapMethods, ...methods };\n } else if (initialState instanceof Set) {\n methods = { ...setMethods, ...methods };\n } else if (Array.isArray(initialState)) {\n methods = { ...arrayMethods, ...methods };\n } else if (isObject(initialState)) {\n methods = { ...recordMethods, ...methods };\n }\n\n const boundMethods = Object.fromEntries(\n Object.entries(methods ?? ({} as BoundStoreMethods<T, any>))\n .filter(([name]) => !(name in store))\n .map(([name, action]) => [name, (action as any).bind(store)]),\n ) as BoundStoreMethods<T, any>;\n\n return Object.assign(store, boundMethods);\n}\n\nexport const createStore = /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n equals: deepEqual,\n } as StoreOptions,\n});\n"],"names":["value","deepEqual","get","debounce","set","_a","isObject"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.cjs","sources":["../../src/lib/autobind.ts","../../src/lib/calcDuration.ts","../../src/lib/deferred.ts","../../src/lib/isPromise.ts","../../src/lib/queue.ts","../../src/lib/promiseWithState.ts","../../src/lib/calculatedValue.ts","../../src/lib/makeSelector.ts","../../src/lib/callable.ts","../../src/lib/debounce.ts","../../src/lib/disposable.ts","../../src/lib/forwardError.ts","../../src/lib/promiseWithCancel.ts","../../src/lib/standardMethods.ts","../../src/lib/throttle.ts","../../src/core/store.ts"],"sourcesContent":["export const autobind = <\n TClass extends abstract new (...args: any) => any = abstract new (...args: any) => any,\n>(\n _class: TClass,\n _context?: ClassDecoratorContext<TClass>,\n) => {\n if (Reflect.getOwnPropertyDescriptor(_class.prototype, '__autobind_done__')) {\n return _class;\n }\n Reflect.defineProperty(_class.prototype, '__autobind_done__', { value: true });\n\n for (const key of Reflect.ownKeys(_class.prototype)) {\n if (key === 'constructor') {\n continue;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(_class.prototype, key);\n\n // Only methods need binding\n if (typeof descriptor?.value === 'function') {\n let method = descriptor.value as (...args: any[]) => any;\n let isBinding = false;\n\n Object.defineProperty(_class.prototype, key, {\n configurable: true,\n get() {\n if (\n isBinding ||\n this === _class.prototype ||\n Object.prototype.hasOwnProperty.call(this, key) ||\n typeof method !== 'function'\n ) {\n return method;\n }\n\n const boundMethod = (...args: any[]) => Reflect.apply(method, this, args);\n isBinding = true;\n\n Object.defineProperty(this, key, {\n configurable: true,\n get() {\n return boundMethod;\n },\n set(v) {\n method = v;\n // delete this[key];\n },\n });\n\n isBinding = false;\n return boundMethod;\n },\n set(v) {\n method = v;\n },\n });\n }\n }\n\n return _class;\n};\n","import type { Duration } from '../core/commonTypes';\n\nexport function 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 class Deferred<T = void> extends Promise<T> {\n static get [Symbol.species]() {\n return Promise;\n }\n\n resolve: (value: T | PromiseLike<T>) => void = () => undefined;\n reject: (reason?: any) => void = () => undefined;\n\n constructor() {\n const that = {};\n\n super((resolve, reject) => {\n Object.assign(that, { resolve, reject });\n });\n\n Object.assign(this, that);\n }\n}\n","export default function isPromise(value: unknown): value is Promise<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n","import isPromise from '@lib/isPromise';\nimport type { MaybePromise } from './maybePromise';\nimport type { Listener } from '@core';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>, ref?: any): Promise<T>;\n clear: () => void;\n whenDone: () => Promise<void>;\n size: number;\n getRefs: () => any[];\n}\n\nexport function queue(): Queue {\n const q: {\n action: Action<any>;\n resolve: (value: any) => void;\n reject: (error: unknown) => void;\n ref?: any;\n }[] = [];\n const completionListeners = new Set<Listener<void>>();\n let active = false;\n\n const notify = () => {\n for (const listener of completionListeners) {\n listener();\n }\n\n completionListeners.clear();\n };\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 (isPromise(result)) {\n result = await result;\n }\n\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n active = false;\n notify();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>, ref?: any) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject, ref });\n run();\n });\n },\n {\n clear() {\n q.length = 0;\n },\n\n whenDone() {\n if (!active) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n completionListeners.add(resolve);\n });\n },\n\n get size() {\n return q.length;\n },\n\n getRefs() {\n return q.map((item) => item.ref).filter((x) => x !== undefined);\n },\n },\n );\n}\n","import isPromise from '@lib/isPromise';\nimport { type ErrorState, type PendingState, type ValueState } from './cacheState';\nimport { type MaybePromise } from './maybePromise';\n\nexport class PromiseWithState<T> extends Promise<T> {\n static get [Symbol.species]() {\n return Promise;\n }\n\n static override resolve(): PromiseWithState<void>;\n\n static override resolve<T>(value: MaybePromise<T>): PromiseWithState<T>;\n\n static override resolve<T>(value?: MaybePromise<T>) {\n return new PromiseWithState<T>(value as MaybePromise<T>);\n }\n\n static override reject<T = never>(error: unknown) {\n return new PromiseWithState<T>(Promise.reject(error), { status: 'error', error });\n }\n\n constructor(\n value: MaybePromise<T>,\n public state: ValueState<T> | ErrorState | PendingState = { status: 'pending' },\n ) {\n super((resolve) => resolve(value));\n\n if (isPromise(value)) {\n value\n .then((value) => {\n this.state = { status: 'value', value: value };\n })\n .catch((error) => {\n this.state = { status: 'error', error };\n });\n } else {\n this.state = { status: 'value', value: value };\n }\n }\n}\n","import type { AsyncConnectionActions, Cancel, Connection } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { Deferred } from '@lib/deferred';\nimport { queue } from '@lib/queue';\nimport { deepEqual } from './equals';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Cache } from '@core';\nimport isPromise from '@lib/isPromise';\n\nexport interface CalculatedValue<T> {\n value: T;\n check: () => void;\n stop(): void;\n invalidateDependencies(recursive?: boolean): void;\n}\n\nexport function calculatedValue<T>(store: Store<T>, notify: () => void): CalculatedValue<T> {\n let active = false;\n const deps = new Array<{ store: Store<any>; value: any; on: () => void; off: () => void }>();\n let value: T | undefined;\n const whenConnected = new Deferred();\n const whenExecuted = new Deferred();\n const ac = new AbortController();\n let connection: { active: boolean; cancel?: Cancel } | undefined;\n const q = queue();\n q(() => whenExecuted);\n\n const cancelEffect = store.addEffect(() => {\n if (connection) {\n store.invalidate();\n return;\n }\n\n active = true;\n\n for (const dep of deps) {\n dep.on();\n }\n\n return () => {\n active = false;\n\n for (const dep of deps) {\n dep.off();\n }\n\n if (connection) {\n connection.active = false;\n connection.cancel?.();\n q.clear();\n\n if ('state' in store) {\n (store as unknown as Cache<any>).state.set((state) => ({\n ...state,\n isConnected: false,\n isStale: true,\n }));\n }\n }\n };\n });\n\n function use<S>(dep: Store<S>) {\n const value = dep.get();\n let cancel: Cancel | undefined;\n\n const on = () => {\n cancel ||= dep.subscribe(() => store.invalidate(), { runNow: false });\n };\n\n const off = () => {\n cancel?.();\n cancel = undefined;\n };\n\n deps.push({ store: dep, value, on, off });\n\n if (active) {\n on();\n }\n\n return value;\n }\n\n async function connect(createConnection: Connection<T>) {\n if (!active) {\n connection = { active: false };\n return;\n }\n\n const actions: AsyncConnectionActions<any> = {\n set(_value) {\n connection?.active &&\n q(() => {\n value = _value;\n notify();\n });\n },\n updateValue(update) {\n connection?.active &&\n q(async () => {\n if (update instanceof Function) {\n update = update(await value);\n }\n\n if (isPromise(update)) {\n update = await update;\n }\n\n if (!connection?.active) {\n return;\n }\n\n value = PromiseWithState.resolve(update) as T;\n notify();\n });\n },\n updateError(error) {\n connection?.active &&\n q(() => {\n value = PromiseWithState.reject(error) as T;\n notify();\n });\n },\n updateIsConnected(isConnected) {\n if (!connection?.active) {\n return;\n }\n\n if (isConnected) {\n whenConnected.resolve();\n }\n\n q(() => {\n if ('state' in store) {\n (store as unknown as Cache<any>).state.set('isConnected', isConnected);\n }\n });\n },\n close() {\n connection?.active && store.invalidate();\n },\n };\n\n connection = { active: true };\n let _cancel: Cancel | undefined = createConnection(actions as any);\n\n connection.cancel = () => {\n _cancel?.();\n _cancel = undefined;\n };\n\n if (!connection.active) {\n connection.cancel();\n }\n\n return whenConnected;\n }\n\n value =\n store.getter instanceof Function\n ? store.getter({ signal: ac.signal, use, connect })\n : store.getter;\n\n if (isPromise(value)) {\n value.finally(() => whenExecuted.resolve()).catch(() => undefined);\n } else {\n whenExecuted.resolve();\n }\n\n function check() {\n if (active) {\n return;\n }\n\n for (const dep of deps) {\n if (!deepEqual(dep.store.get(), dep.value)) {\n store.invalidate();\n return;\n }\n }\n }\n\n function stop() {\n cancelEffect();\n whenExecuted.resolve();\n whenConnected.resolve();\n ac.abort();\n\n if (connection) {\n connection.active = false;\n connection.cancel?.();\n q.clear();\n }\n }\n\n function invalidateDependencies(recursive?: boolean) {\n for (const dep of deps) {\n dep.store.invalidate(recursive);\n }\n }\n\n return {\n get value() {\n return value!;\n },\n check,\n stop,\n invalidateDependencies,\n };\n}\n\nexport function staticValue<T>(value: T): CalculatedValue<T> {\n return {\n value,\n check: () => undefined,\n stop: () => undefined,\n invalidateDependencies: () => undefined,\n };\n}\n","import type { Path } from './path';\nimport { get } from './propAccess';\n\nexport function makeSelector<T, S>(selector?: ((value: T) => S) | Path<any>): (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","export class Callable<Args extends any[], T> extends Function {\n constructor(protected _call: (...args: Args) => T) {\n super('...args', 'return this._call(...args)');\n\n // eslint-disable-next-line no-constructor-return\n return this.bind(this);\n }\n}\n","import { calcDuration } from './calcDuration';\nimport type { Duration } from '@core';\n\nexport type DebounceOptions =\n | Duration\n | {\n wait: Duration;\n maxWait?: Duration;\n };\n\nexport function debounce<Args extends any[]>(\n action: (...args: Args) => void,\n options: Duration | DebounceOptions,\n) {\n const wait =\n typeof options === 'object' && 'wait' in options\n ? calcDuration(options.wait)\n : calcDuration(options);\n\n const maxWait =\n typeof options === 'object' && 'maxWait' in options && options.maxWait !== undefined\n ? calcDuration(options.maxWait)\n : undefined;\n\n let run: (() => void) | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let timeoutStarted: number | undefined;\n\n function flush() {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run?.();\n }\n\n function cancel() {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run = undefined;\n timeout = undefined;\n timeoutStarted = undefined;\n }\n\n function isScheduled() {\n return timeout !== undefined;\n }\n\n function debounce(...args: Args) {\n const now = Date.now();\n timeoutStarted ??= now;\n\n const deadline = Math.min(\n //\n now + wait,\n timeoutStarted + (maxWait ?? Number.POSITIVE_INFINITY),\n );\n\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run = () => {\n run = undefined;\n timeout = undefined;\n timeoutStarted = undefined;\n\n action(...args);\n };\n\n timeout = setTimeout(run, deadline - now);\n }\n\n return Object.assign(debounce, { flush, cancel, isScheduled });\n}\n","import type { Cancel } from '@core';\nimport type { DisposableCancel } from '@core/commonTypes';\n\nexport default function disposable(dispose: Cancel): DisposableCancel {\n return Object.assign(\n dispose,\n Symbol.dispose ? { [Symbol.dispose]: dispose } : {},\n ) as DisposableCancel;\n}\n","export function forwardError(error: unknown) {\n setTimeout(() => {\n throw error;\n });\n}\n","import { autobind } from '@lib/autobind';\n\nexport class PromiseCancelError extends Error {\n constructor() {\n super('cancelled');\n }\n}\n\nexport class PromiseWithCancel<T> extends Promise<T> {\n private abortController;\n\n constructor(\n executor: (\n resolve: (value: T) => void,\n reject: (error: unknown) => void,\n signal: AbortSignal,\n ) => void,\n ) {\n autobind(PromiseWithCancel);\n const abortController = new AbortController();\n\n super((resolve, reject) => {\n executor(resolve, reject, abortController.signal);\n\n abortController.signal.addEventListener('abort', (e) => {\n reject(abortController.signal.reason);\n });\n });\n\n this.abortController = abortController;\n }\n\n cancel(reason: any = new PromiseCancelError()) {\n this.abortController.abort(reason);\n }\n}\n","import type { Store } from '../core/store';\nimport type { OptionalPropertyOf } from './typeHelpers';\n\ntype Function_ = (...args: any) => any;\n\nfunction createArrayAction<P extends keyof Array<any>>(prop: P) {\n return function arrayAction<T extends Array<any>>(\n this: Store<T>,\n ...args: T[P] extends Function_ ? Parameters<T[P]> : never\n ): T[P] extends Function_ ? ReturnType<T[P]> : never {\n const newArray = this.get().slice() as T;\n const result = (newArray[prop] as Function_)(...(args as any));\n this.set(newArray);\n return result;\n };\n}\nexport const arrayMethods = {\n splice: /* @__PURE__ */ createArrayAction('splice'),\n push: /* @__PURE__ */ createArrayAction('push'),\n pop: /* @__PURE__ */ createArrayAction('pop'),\n shift: /* @__PURE__ */ createArrayAction('shift'),\n unshift: /* @__PURE__ */ createArrayAction('unshift'),\n reverse: /* @__PURE__ */ createArrayAction('reverse'),\n sort: /* @__PURE__ */ createArrayAction('sort'),\n};\n\nexport const recordMethods = {\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.set(copy);\n },\n\n clear<T extends Record<any, any>>(this: Store<Partial<T>>) {\n this.set({} as T);\n },\n};\n\nexport const mapMethods = {\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.set(newMap);\n return result;\n },\n\n clear<K, V>(this: Store<Map<K, V>>) {\n this.set(new Map());\n },\n};\n\nexport const setMethods = {\n add<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.add(value);\n this.set(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.set(newSet);\n },\n\n clear<T>(this: Store<Set<T>>) {\n this.set(new Set());\n },\n};\n","import { calcDuration } from './calcDuration';\nimport type { Duration } from '@core';\n\nexport function throttle<Args extends any[]>(\n action: (...args: Args) => void,\n duration: Duration,\n): (...args: Args) => void {\n const ms = calcDuration(duration);\n\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 action(...args);\n t = Date.now();\n return;\n }\n\n timeout = setTimeout(() => {\n action(...args);\n t = Date.now();\n }, dt);\n };\n}\n","import { autobind } from '@lib/autobind';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue, staticValue, type CalculatedValue } from '@lib/calculatedValue';\nimport { Callable } from '@lib/callable';\nimport { debounce } from '@lib/debounce';\nimport disposable from '@lib/disposable';\nimport { deepEqual } from '@lib/equals';\nimport { forwardError } from '@lib/forwardError';\nimport { isObject } from '@lib/helpers';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/path';\nimport { PromiseWithCancel } from '@lib/promiseWithCancel';\nimport { get, set } from '@lib/propAccess';\nimport { arrayMethods, mapMethods, recordMethods, setMethods } from '@lib/standardMethods';\nimport { throttle } from '@lib/throttle';\nimport type {\n CalculationActions,\n Cancel,\n DisposableCancel,\n Duration,\n Effect,\n Listener,\n Selector,\n SubscribeOptions,\n Update,\n} from './commonTypes';\n\nexport type StoreMethods = Record<string, (...args: any[]) => any>;\n\nexport type BoundStoreMethods<T, Methods extends StoreMethods> = Methods &\n ThisType<Store<T> & Methods>;\n\nexport interface StoreOptions {\n retain?: Duration;\n equals?: SubscribeOptions['equals'];\n}\n\nexport interface StoreOptionsWithMethods<T, Methods extends StoreMethods> extends StoreOptions {\n methods?: Methods & ThisType<Store<T> & Methods & StandardMethods<T>>;\n}\n\nexport type Calculate<T> = (helpers: CalculationActions<T>) => T;\n\ntype StandardMethods<T> =\n T extends Map<any, any>\n ? typeof mapMethods\n : T extends Set<any>\n ? typeof setMethods\n : T extends Array<any>\n ? typeof arrayMethods\n : T extends Record<any, any>\n ? typeof recordMethods\n : Record<string, never>;\n\ntype StoreWithMethods<T, Methods extends StoreMethods> = Store<T> &\n Omit<BoundStoreMethods<T, Methods>, keyof Store<T>> &\n StandardMethods<T>;\n\nexport interface OnceOptions {\n signal?: AbortSignal;\n timeout?: Duration;\n}\n\nfunction noop() {\n return undefined;\n}\n\nexport class Store<T> extends Callable<any, any> {\n protected calculatedValue?: CalculatedValue<T>;\n protected defaultValue?: CalculatedValue<T>;\n\n protected listeners = new Map<Listener, boolean>();\n\n protected effects = new Map<\n Effect,\n { handle?: Cancel; retain?: number; timeout?: ReturnType<typeof setTimeout> }\n >();\n\n protected notifyId = {};\n\n constructor(\n public readonly getter: T | Calculate<T>,\n public readonly options: StoreOptions = {},\n public readonly derivedFrom?: {\n store: Store<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n updater: (state: any) => void;\n },\n protected readonly _call: (...args: any[]) => any = () => undefined,\n ) {\n super(_call);\n autobind(Store);\n\n if (typeof getter !== 'function') {\n this.calculatedValue = this.defaultValue = staticValue(getter);\n }\n }\n\n get(): T {\n this.calculatedValue?.check();\n\n if (!this.calculatedValue) {\n this.calculatedValue = calculatedValue(this, this.notify);\n }\n\n return this.calculatedValue.value;\n }\n\n set(update: Update<T>): void;\n\n set<const P extends Path<T>>(path: P, update: Update<Value<T, P>>): void;\n\n set(...args: any[]): void {\n const path: any = args.length > 1 ? args[0] : [];\n let update: Update<any> = args.length > 1 ? args[1] : args[0];\n\n if (update instanceof Function) {\n const before = this.get();\n const valueBefore = get(before, path);\n const valueAfter = update(valueBefore);\n update = set(before, path, valueAfter);\n } else if (path.length > 0) {\n update = set(this.get(), path, update);\n }\n\n if (this.derivedFrom) {\n this.derivedFrom.updater(update);\n return;\n }\n\n this.calculatedValue?.stop();\n this.calculatedValue = staticValue(update);\n this.notify();\n }\n\n invalidate(recursive?: boolean) {\n if (recursive) {\n this.calculatedValue?.invalidateDependencies(recursive);\n }\n\n this.calculatedValue?.stop();\n this.calculatedValue = this.defaultValue;\n this.notify();\n }\n\n subscribe(listener: Listener<T>, options?: SubscribeOptions): DisposableCancel {\n const {\n passive,\n runNow = true,\n throttle: throttleOption,\n debounce: debounceOption,\n equals = deepEqual,\n } = options ?? {};\n\n let isSetup = false;\n let previousValue: { value: T } | undefined;\n\n let innerListener = () => {\n if (!isSetup) {\n return;\n }\n\n const value = passive ? this.calculatedValue : { value: this.get() };\n\n if (!value) {\n return;\n }\n\n if (previousValue && equals(value.value, previousValue.value)) {\n return;\n }\n\n const _previousValue = previousValue?.value;\n previousValue = this.calculatedValue && { value: this.calculatedValue?.value };\n\n try {\n listener(value.value, _previousValue);\n } catch (error) {\n forwardError(error);\n }\n };\n\n if (throttleOption) {\n innerListener = throttle(innerListener, throttleOption);\n } else if (debounceOption) {\n innerListener = debounce(innerListener, debounceOption);\n }\n\n this.listeners.set(innerListener, !passive);\n if (!passive) {\n this.onSubscribe();\n }\n\n isSetup = true;\n\n if (runNow) {\n innerListener();\n } else {\n previousValue = passive\n ? this.calculatedValue && { value: this.calculatedValue.value }\n : { value: this.get() };\n }\n\n return disposable(() => {\n this.listeners.delete(innerListener);\n if (!passive) {\n this.onUnsubscribe();\n }\n });\n }\n\n once<S extends T>(\n condition: (value: T) => value is S,\n options?: OnceOptions,\n ): PromiseWithCancel<S>;\n\n once(condition: (value: T) => boolean, options?: OnceOptions): PromiseWithCancel<T>;\n\n once(options?: OnceOptions): PromiseWithCancel<T>;\n\n once(\n ...args: [condition: (value: any) => boolean, options?: OnceOptions] | [options?: OnceOptions]\n ): PromiseWithCancel<any> {\n const condition = args[0] instanceof Function ? args[0] : Boolean;\n const options = args[0] instanceof Function ? args[1] : args[0];\n\n return new PromiseWithCancel<T>((resolve, reject, signal) => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const cancel = this.subscribe(\n (value) => {\n if (stopped || !condition(value)) {\n return;\n }\n\n resolve(value);\n stopped = true;\n timer && clearTimeout(timer);\n setTimeout(() => cancel());\n },\n {\n runNow: !!condition,\n },\n );\n\n if (stopped) {\n return;\n }\n\n signal.addEventListener('abort', cancel);\n\n options?.signal?.addEventListener('abort', () => {\n cancel();\n reject(options.signal?.reason ?? new Error('cancelled'));\n });\n\n if (options?.timeout !== undefined) {\n timer = setTimeout(() => {\n cancel();\n reject(new Error('timeout'));\n }, calcDuration(options.timeout));\n }\n });\n }\n\n map<S>(selector: Selector<T, S>, updater?: (value: S) => Update<T>): Store<S>;\n\n map<P extends Path<T>>(selector: P): Store<Value<T, P>>;\n\n map(_selector: Selector<T, any> | Path<any>, ...args: any[]): Store<any> {\n const updater: ((value: any) => Update<T>) | undefined =\n _selector instanceof Function\n ? args[0]\n : (value) => (state) => set(state, _selector as Path<T>, value);\n\n const selector = makeSelector(_selector);\n\n const derivedFrom = {\n store: this.derivedFrom ? this.derivedFrom.store : this,\n selectors: this.derivedFrom ? [...this.derivedFrom.selectors, _selector] : [_selector],\n\n updater: (value: any) => {\n if (!updater) {\n throw new TypeError(\n 'Can only update computed stores that either are derived from other stores using string selectors or have an updater function.',\n );\n }\n\n let update = updater(value);\n\n if (update instanceof Function) {\n update = update(this.get());\n }\n\n if (this.derivedFrom) {\n this.derivedFrom.updater(update);\n } else {\n this.set(update);\n }\n },\n };\n\n return new Store(\n ({ use }) => {\n return selector(use(this));\n },\n this.options,\n derivedFrom,\n );\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 = this.options.retain) {\n this.effects.set(effect, {\n handle: this.isActive() ? 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\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\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 isActive() {\n return [...this.listeners.values()].some(Boolean);\n }\n\n protected onSubscribe() {\n if ([...this.listeners.values()].filter(Boolean).length > 1) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\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.values()].some(Boolean)) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n if (!retain) {\n handle?.();\n\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n this.effects.set(effect, {\n handle: undefined,\n retain,\n timeout: undefined,\n });\n\n continue;\n }\n\n const newTimeout =\n timeout ??\n (handle\n ? setTimeout(() => {\n handle();\n this.effects.set(effect, {\n handle: undefined,\n retain,\n timeout: undefined,\n });\n }, retain)\n : undefined);\n\n this.effects.set(effect, {\n handle,\n retain,\n timeout: newTimeout,\n });\n }\n }\n\n protected notify() {\n const n = {};\n this.notifyId = n;\n\n const snapshot = [...this.listeners.keys()];\n for (const listener of snapshot) {\n listener();\n if (n !== this.notifyId) break;\n }\n }\n}\n\nfunction create<T>(calculate: Calculate<T>, options?: StoreOptions): Store<T>;\nfunction create<T, Methods extends StoreMethods = {}>(\n initialState: T,\n options?: StoreOptionsWithMethods<T, Methods>,\n): StoreWithMethods<T, Methods>;\nfunction create<T, Methods extends StoreMethods>(\n initialState: T | Calculate<T>,\n options?: StoreOptionsWithMethods<T, Methods>,\n): StoreWithMethods<T, Methods> | Store<T> {\n options = { ...createStore.defaultOptions, ...options };\n\n const store = new Store(initialState, options);\n\n if (initialState instanceof Function) {\n return store;\n }\n\n let methods: StoreMethods | undefined = options?.methods;\n\n if (initialState instanceof Map) {\n methods = { ...mapMethods, ...methods };\n } else if (initialState instanceof Set) {\n methods = { ...setMethods, ...methods };\n } else if (Array.isArray(initialState)) {\n methods = { ...arrayMethods, ...methods };\n } else if (isObject(initialState)) {\n methods = { ...recordMethods, ...methods };\n }\n\n const boundMethods = Object.fromEntries(\n Object.entries(methods ?? ({} as BoundStoreMethods<T, any>))\n .filter(([name]) => !(name in store))\n .map(([name, action]) => [name, (action as any).bind(store)]),\n ) as BoundStoreMethods<T, any>;\n\n return Object.assign(store, boundMethods);\n}\n\nexport const createStore = /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n equals: deepEqual,\n } as StoreOptions,\n});\n"],"names":["value","deepEqual","get","debounce","set","_a","isObject"],"mappings":"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"}
|
package/dist/es/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { C, I, R, S, a, c, b, d } from "./scope.mjs";
|
|
2
|
-
import { q as queue } from "./store.mjs";
|
|
2
|
+
import { i as isPromise, q as queue } from "./store.mjs";
|
|
3
3
|
import { S as S2, e, d as d2, c as c2, f, r, s } from "./store.mjs";
|
|
4
4
|
import { c as c3, a as a2, u } from "./urlStore.mjs";
|
|
5
5
|
import { d as diff } from "./diff.mjs";
|
|
@@ -19,7 +19,7 @@ const isAncestor = (ancestor, path) => {
|
|
|
19
19
|
return ancestor.length <= path.length && ancestor.every((v, i) => v === "*" || path[i] === "*" || v === path[i]);
|
|
20
20
|
};
|
|
21
21
|
function maybeAsync(value, action) {
|
|
22
|
-
if (value
|
|
22
|
+
if (isPromise(value)) {
|
|
23
23
|
return value.then(action);
|
|
24
24
|
}
|
|
25
25
|
return action(value);
|
|
@@ -111,7 +111,7 @@ class Persist {
|
|
|
111
111
|
}
|
|
112
112
|
async watchStorage() {
|
|
113
113
|
let keys = this.storage.keys();
|
|
114
|
-
if (keys
|
|
114
|
+
if (isPromise(keys)) {
|
|
115
115
|
keys = await keys;
|
|
116
116
|
}
|
|
117
117
|
if (this.stopped) {
|
package/dist/es/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/lib/updateHelpers.ts","../../src/persist/persistPathHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistStorage.ts","../../src/persist/persist.ts"],"sourcesContent":["export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n","import { isObject } from '@lib/helpers';\nimport type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (\n value: any,\n path: KeyType[],\n): [value: unknown, subValues: { path: KeyType[]; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*')\n return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: KeyType[]; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!isObject(newValue[key])) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import type { MaybePromise } from './maybePromise';\n\nexport function maybeAsync<T, R>(\n value: MaybePromise<T>,\n action: (value: T) => MaybePromise<R>,\n): MaybePromise<R> {\n if (value instanceof Promise) {\n return value.then(action);\n }\n return action(value);\n}\n\nexport function maybeAsyncArray<T>(values: (() => MaybePromise<T>)[]): MaybePromise<T[]> {\n const run = (remainingValues: (() => MaybePromise<T>)[], results: T[]): MaybePromise<T[]> => {\n const [first, ...rest] = remainingValues;\n if (!first) {\n return results;\n }\n\n return maybeAsync(first(), (result) => run(rest, results.concat(result)));\n };\n\n return run(values, []);\n}\n","import { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport type PersistStorage = PersistStorageBase &\n (PersistStorageWithKeys | PersistStorageWithLength);\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithKeys {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n keys(): string[] | Promise<string[]> {\n if ('keys' in storage) {\n return storage.keys();\n }\n\n return maybeAsync(\n storage.length instanceof Function ? storage.length() : storage.length,\n (length) => {\n const keyPromises = maybeAsyncArray(\n Array.from({ length }, (_, index) => () => storage.key(index)),\n );\n\n return maybeAsync(keyPromises, (keys) =>\n keys.filter((key): key is string => typeof key === 'string'),\n );\n },\n );\n },\n };\n}\n","import { isAncestor } from './persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithKeys,\n} from './persistStorage';\nimport { type Cancel, type Store } from '@core';\nimport { diff } from '@lib/diff';\nimport { shallowEqual } from '@lib/equals';\nimport { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport { castArrayPath, get, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n throttleMs?: number;\n };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttleMs?: number;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithKeys;\n\n readonly paths: {\n path: KeyType[];\n throttleMs?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress?: [any, any];\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttleMs?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return { path: castArrayPath(p) };\n }\n\n const _p = p as { path: KeyType[]; throttleMs?: number };\n\n return {\n path: castArrayPath(_p.path),\n throttleMs: _p.throttleMs,\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({ path: ['*'] });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n let committed = this.store.get();\n\n const cancel = this.store.subscribe(\n (value) => {\n const [patches] = diff(committed, value);\n committed = value;\n\n for (const patch of patches) {\n if (\n this.updateInProgress &&\n shallowEqual(this.updateInProgress[0], patch.path) &&\n this.updateInProgress[1] === (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));\n\n if (!ancestor) {\n continue;\n }\n\n const pathToSave = patch.path.slice(0, ancestor.path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n }\n },\n { runNow: false },\n );\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n let keys = this.storage.keys();\n if (keys instanceof Promise) {\n keys = await keys;\n }\n\n if (this.stopped) {\n return;\n }\n\n for (const key of keys) {\n const path = this.parseKey(key);\n if (!path) {\n continue;\n }\n\n this.queue(() => this.load(path));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load(event.data));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey(path: KeyType[]) {\n return `${this.prefix}${JSON.stringify(path)}`;\n }\n\n private parseKey(key: string) {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n return JSON.parse(key.slice(this.prefix.length)) as KeyType[];\n }\n\n private load(path: KeyType[]) {\n const matchingPath = this.paths.find(\n (p) => p.path.length === path.length && isAncestor(p.path, path),\n );\n if (!matchingPath) {\n return;\n }\n\n const key = this.buildKey(path);\n\n return maybeAsync(this.storage.getItem(key), (value) => {\n if (this.stopped || !value) {\n return;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, path) || isAncestor(path, ref));\n if (inSaveQueue) {\n return;\n }\n\n const parsedValue = value === 'undefined' ? undefined : JSON.parse(value);\n\n this.updateInProgress = [path, parsedValue];\n this.store.set((state) => set(state, path as any, parsedValue));\n this.updateInProgress = undefined;\n });\n }\n\n private save(path: KeyType[]) {\n const key = this.buildKey(path);\n const value = get(this.store.get(), path as any);\n const serializedValue = value === undefined ? 'undefined' : JSON.stringify(value);\n\n return maybeAsync(this.storage.setItem(key, serializedValue), () => {\n this.channel.postMessage(path);\n\n return maybeAsync(this.storage.keys(), (keys) => {\n const toRemove = keys.filter((k) => {\n const parsedKey = this.parseKey(k);\n return (\n parsedKey && parsedKey.length > path.length && isAncestor(path, parsedKey)\n // !this.queue.getRefs().find((ref) => isAncestor(ref, parsedKey))\n );\n });\n\n return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));\n });\n });\n }\n\n async stop() {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"names":["a","b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/lib/updateHelpers.ts","../../src/persist/persistPathHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistStorage.ts","../../src/persist/persist.ts"],"sourcesContent":["export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n","import { isObject } from '@lib/helpers';\nimport type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (\n value: any,\n path: KeyType[],\n): [value: unknown, subValues: { path: KeyType[]; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*')\n return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: KeyType[]; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!isObject(newValue[key])) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import isPromise from '@lib/isPromise';\nimport type { MaybePromise } from './maybePromise';\n\nexport function maybeAsync<T, R>(\n value: MaybePromise<T>,\n action: (value: T) => MaybePromise<R>,\n): MaybePromise<R> {\n if (isPromise(value)) {\n return value.then(action);\n }\n return action(value);\n}\n\nexport function maybeAsyncArray<T>(values: (() => MaybePromise<T>)[]): MaybePromise<T[]> {\n const run = (remainingValues: (() => MaybePromise<T>)[], results: T[]): MaybePromise<T[]> => {\n const [first, ...rest] = remainingValues;\n if (!first) {\n return results;\n }\n\n return maybeAsync(first(), (result) => run(rest, results.concat(result)));\n };\n\n return run(values, []);\n}\n","import { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport type PersistStorage = PersistStorageBase &\n (PersistStorageWithKeys | PersistStorageWithLength);\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithKeys {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n keys(): string[] | Promise<string[]> {\n if ('keys' in storage) {\n return storage.keys();\n }\n\n return maybeAsync(\n storage.length instanceof Function ? storage.length() : storage.length,\n (length) => {\n const keyPromises = maybeAsyncArray(\n Array.from({ length }, (_, index) => () => storage.key(index)),\n );\n\n return maybeAsync(keyPromises, (keys) =>\n keys.filter((key): key is string => typeof key === 'string'),\n );\n },\n );\n },\n };\n}\n","import { isAncestor } from './persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithKeys,\n} from './persistStorage';\nimport { type Cancel, type Store } from '@core';\nimport { diff } from '@lib/diff';\nimport { shallowEqual } from '@lib/equals';\nimport isPromise from '@lib/isPromise';\nimport { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport { castArrayPath, get, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n throttleMs?: number;\n };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttleMs?: number;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithKeys;\n\n readonly paths: {\n path: KeyType[];\n throttleMs?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress?: [any, any];\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttleMs?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return { path: castArrayPath(p) };\n }\n\n const _p = p as { path: KeyType[]; throttleMs?: number };\n\n return {\n path: castArrayPath(_p.path),\n throttleMs: _p.throttleMs,\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({ path: ['*'] });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n let committed = this.store.get();\n\n const cancel = this.store.subscribe(\n (value) => {\n const [patches] = diff(committed, value);\n committed = value;\n\n for (const patch of patches) {\n if (\n this.updateInProgress &&\n shallowEqual(this.updateInProgress[0], patch.path) &&\n this.updateInProgress[1] === (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));\n\n if (!ancestor) {\n continue;\n }\n\n const pathToSave = patch.path.slice(0, ancestor.path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n }\n },\n { runNow: false },\n );\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n let keys = this.storage.keys();\n if (isPromise(keys)) {\n keys = await keys;\n }\n\n if (this.stopped) {\n return;\n }\n\n for (const key of keys) {\n const path = this.parseKey(key);\n if (!path) {\n continue;\n }\n\n this.queue(() => this.load(path));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load(event.data));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey(path: KeyType[]) {\n return `${this.prefix}${JSON.stringify(path)}`;\n }\n\n private parseKey(key: string) {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n return JSON.parse(key.slice(this.prefix.length)) as KeyType[];\n }\n\n private load(path: KeyType[]) {\n const matchingPath = this.paths.find(\n (p) => p.path.length === path.length && isAncestor(p.path, path),\n );\n if (!matchingPath) {\n return;\n }\n\n const key = this.buildKey(path);\n\n return maybeAsync(this.storage.getItem(key), (value) => {\n if (this.stopped || !value) {\n return;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, path) || isAncestor(path, ref));\n if (inSaveQueue) {\n return;\n }\n\n const parsedValue = value === 'undefined' ? undefined : JSON.parse(value);\n\n this.updateInProgress = [path, parsedValue];\n this.store.set((state) => set(state, path as any, parsedValue));\n this.updateInProgress = undefined;\n });\n }\n\n private save(path: KeyType[]) {\n const key = this.buildKey(path);\n const value = get(this.store.get(), path as any);\n const serializedValue = value === undefined ? 'undefined' : JSON.stringify(value);\n\n return maybeAsync(this.storage.setItem(key, serializedValue), () => {\n this.channel.postMessage(path);\n\n return maybeAsync(this.storage.keys(), (keys) => {\n const toRemove = keys.filter((k) => {\n const parsedKey = this.parseKey(k);\n return (\n parsedKey && parsedKey.length > path.length && isAncestor(path, parsedKey)\n // !this.queue.getRefs().find((ref) => isAncestor(ref, parsedKey))\n );\n });\n\n return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));\n });\n });\n }\n\n async stop() {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"names":["a","b"],"mappings":"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"}
|
package/dist/es/store.mjs
CHANGED
|
@@ -59,6 +59,9 @@ class Deferred extends Promise {
|
|
|
59
59
|
return Promise;
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
|
+
function isPromise(value) {
|
|
63
|
+
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
64
|
+
}
|
|
62
65
|
function queue() {
|
|
63
66
|
const q = [];
|
|
64
67
|
const completionListeners = /* @__PURE__ */ new Set();
|
|
@@ -76,7 +79,7 @@ function queue() {
|
|
|
76
79
|
while (next = q.shift()) {
|
|
77
80
|
try {
|
|
78
81
|
let result = next.action();
|
|
79
|
-
if (result
|
|
82
|
+
if (isPromise(result)) {
|
|
80
83
|
result = await result;
|
|
81
84
|
}
|
|
82
85
|
next.resolve(result);
|
|
@@ -116,9 +119,6 @@ function queue() {
|
|
|
116
119
|
}
|
|
117
120
|
);
|
|
118
121
|
}
|
|
119
|
-
function isPromise(value) {
|
|
120
|
-
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
121
|
-
}
|
|
122
122
|
class PromiseWithState extends Promise {
|
|
123
123
|
constructor(value, state = { status: "pending" }) {
|
|
124
124
|
super((resolve) => resolve(value));
|
|
@@ -215,7 +215,7 @@ function calculatedValue(store, notify) {
|
|
|
215
215
|
if (update instanceof Function) {
|
|
216
216
|
update = update(await value);
|
|
217
217
|
}
|
|
218
|
-
if (update
|
|
218
|
+
if (isPromise(update)) {
|
|
219
219
|
update = await update;
|
|
220
220
|
}
|
|
221
221
|
if (!(connection == null ? void 0 : connection.active)) {
|
|
@@ -227,7 +227,8 @@ function calculatedValue(store, notify) {
|
|
|
227
227
|
},
|
|
228
228
|
updateError(error) {
|
|
229
229
|
(connection == null ? void 0 : connection.active) && q(() => {
|
|
230
|
-
|
|
230
|
+
value = PromiseWithState.reject(error);
|
|
231
|
+
notify();
|
|
231
232
|
});
|
|
232
233
|
},
|
|
233
234
|
updateIsConnected(isConnected) {
|
|
@@ -259,7 +260,7 @@ function calculatedValue(store, notify) {
|
|
|
259
260
|
return whenConnected;
|
|
260
261
|
}
|
|
261
262
|
value = store.getter instanceof Function ? store.getter({ signal: ac.signal, use, connect }) : store.getter;
|
|
262
|
-
if (value
|
|
263
|
+
if (isPromise(value)) {
|
|
263
264
|
value.finally(() => whenExecuted.resolve()).catch(() => void 0);
|
|
264
265
|
} else {
|
|
265
266
|
whenExecuted.resolve();
|
|
@@ -770,6 +771,7 @@ export {
|
|
|
770
771
|
arrayMethods as e,
|
|
771
772
|
mapMethods as f,
|
|
772
773
|
debounce as g,
|
|
774
|
+
isPromise as i,
|
|
773
775
|
makeSelector as m,
|
|
774
776
|
queue as q,
|
|
775
777
|
recordMethods as r,
|
package/dist/es/store.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.mjs","sources":["../../src/lib/autobind.ts","../../src/lib/calcDuration.ts","../../src/lib/deferred.ts","../../src/lib/queue.ts","../../src/lib/isPromise.ts","../../src/lib/promiseWithState.ts","../../src/lib/calculatedValue.ts","../../src/lib/makeSelector.ts","../../src/lib/callable.ts","../../src/lib/debounce.ts","../../src/lib/disposable.ts","../../src/lib/forwardError.ts","../../src/lib/promiseWithCancel.ts","../../src/lib/standardMethods.ts","../../src/lib/throttle.ts","../../src/core/store.ts"],"sourcesContent":["export const autobind = <\n TClass extends abstract new (...args: any) => any = abstract new (...args: any) => any,\n>(\n _class: TClass,\n _context?: ClassDecoratorContext<TClass>,\n) => {\n if (Reflect.getOwnPropertyDescriptor(_class.prototype, '__autobind_done__')) {\n return _class;\n }\n Reflect.defineProperty(_class.prototype, '__autobind_done__', { value: true });\n\n for (const key of Reflect.ownKeys(_class.prototype)) {\n if (key === 'constructor') {\n continue;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(_class.prototype, key);\n\n // Only methods need binding\n if (typeof descriptor?.value === 'function') {\n let method = descriptor.value as (...args: any[]) => any;\n let isBinding = false;\n\n Object.defineProperty(_class.prototype, key, {\n configurable: true,\n get() {\n if (\n isBinding ||\n this === _class.prototype ||\n Object.prototype.hasOwnProperty.call(this, key) ||\n typeof method !== 'function'\n ) {\n return method;\n }\n\n const boundMethod = (...args: any[]) => Reflect.apply(method, this, args);\n isBinding = true;\n\n Object.defineProperty(this, key, {\n configurable: true,\n get() {\n return boundMethod;\n },\n set(v) {\n method = v;\n // delete this[key];\n },\n });\n\n isBinding = false;\n return boundMethod;\n },\n set(v) {\n method = v;\n },\n });\n }\n }\n\n return _class;\n};\n","import type { Duration } from '../core/commonTypes';\n\nexport function 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 class Deferred<T = void> extends Promise<T> {\n static get [Symbol.species]() {\n return Promise;\n }\n\n resolve: (value: T | PromiseLike<T>) => void = () => undefined;\n reject: (reason?: any) => void = () => undefined;\n\n constructor() {\n const that = {};\n\n super((resolve, reject) => {\n Object.assign(that, { resolve, reject });\n });\n\n Object.assign(this, that);\n }\n}\n","import type { MaybePromise } from './maybePromise';\nimport type { Listener } from '@core';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>, ref?: any): Promise<T>;\n clear: () => void;\n whenDone: () => Promise<void>;\n size: number;\n getRefs: () => any[];\n}\n\nexport function queue(): Queue {\n const q: {\n action: Action<any>;\n resolve: (value: any) => void;\n reject: (error: unknown) => void;\n ref?: any;\n }[] = [];\n const completionListeners = new Set<Listener<void>>();\n let active = false;\n\n const notify = () => {\n for (const listener of completionListeners) {\n listener();\n }\n\n completionListeners.clear();\n };\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\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n active = false;\n notify();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>, ref?: any) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject, ref });\n run();\n });\n },\n {\n clear() {\n q.length = 0;\n },\n\n whenDone() {\n if (!active) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n completionListeners.add(resolve);\n });\n },\n\n get size() {\n return q.length;\n },\n\n getRefs() {\n return q.map((item) => item.ref).filter((x) => x !== undefined);\n },\n },\n );\n}\n","export default function isPromise(value: unknown): value is Promise<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n","import isPromise from '@lib/isPromise';\nimport { type ErrorState, type PendingState, type ValueState } from './cacheState';\nimport { type MaybePromise } from './maybePromise';\n\nexport class PromiseWithState<T> extends Promise<T> {\n static get [Symbol.species]() {\n return Promise;\n }\n\n static override resolve(): PromiseWithState<void>;\n\n static override resolve<T>(value: MaybePromise<T>): PromiseWithState<T>;\n\n static override resolve<T>(value?: MaybePromise<T>) {\n return new PromiseWithState<T>(value as MaybePromise<T>);\n }\n\n static override reject<T = never>(error: unknown) {\n return new PromiseWithState<T>(Promise.reject(error), { status: 'error', error });\n }\n\n constructor(\n value: MaybePromise<T>,\n public state: ValueState<T> | ErrorState | PendingState = { status: 'pending' },\n ) {\n super((resolve) => resolve(value));\n\n if (isPromise(value)) {\n value\n .then((value) => {\n this.state = { status: 'value', value: value };\n })\n .catch((error) => {\n this.state = { status: 'error', error };\n });\n } else {\n this.state = { status: 'value', value: value };\n }\n }\n}\n","import type { AsyncConnectionActions, Cancel, Connection } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { Deferred } from '@lib/deferred';\nimport { queue } from '@lib/queue';\nimport { deepEqual } from './equals';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Cache } from '@core';\n\nexport interface CalculatedValue<T> {\n value: T;\n check: () => void;\n stop(): void;\n invalidateDependencies(recursive?: boolean): void;\n}\n\nexport function calculatedValue<T>(store: Store<T>, notify: () => void): CalculatedValue<T> {\n let active = false;\n const deps = new Array<{ store: Store<any>; value: any; on: () => void; off: () => void }>();\n let value: T | undefined;\n const whenConnected = new Deferred();\n const whenExecuted = new Deferred();\n const ac = new AbortController();\n let connection: { active: boolean; cancel?: Cancel } | undefined;\n const q = queue();\n q(() => whenExecuted);\n\n const cancelEffect = store.addEffect(() => {\n if (connection) {\n store.invalidate();\n return;\n }\n\n active = true;\n\n for (const dep of deps) {\n dep.on();\n }\n\n return () => {\n active = false;\n\n for (const dep of deps) {\n dep.off();\n }\n\n if (connection) {\n connection.active = false;\n connection.cancel?.();\n q.clear();\n\n if ('state' in store) {\n (store as unknown as Cache<any>).state.set((state) => ({\n ...state,\n isConnected: false,\n isStale: true,\n }));\n }\n }\n };\n });\n\n function use<S>(dep: Store<S>) {\n const value = dep.get();\n let cancel: Cancel | undefined;\n\n const on = () => {\n cancel ||= dep.subscribe(() => store.invalidate(), { runNow: false });\n };\n\n const off = () => {\n cancel?.();\n cancel = undefined;\n };\n\n deps.push({ store: dep, value, on, off });\n\n if (active) {\n on();\n }\n\n return value;\n }\n\n async function connect(createConnection: Connection<T>) {\n if (!active) {\n connection = { active: false };\n return;\n }\n\n const actions: AsyncConnectionActions<any> = {\n set(_value) {\n connection?.active &&\n q(() => {\n value = _value;\n notify();\n });\n },\n updateValue(update) {\n connection?.active &&\n q(async () => {\n if (update instanceof Function) {\n update = update(await value);\n }\n\n if (update instanceof Promise) {\n update = await update;\n }\n\n if (!connection?.active) {\n return;\n }\n\n value = PromiseWithState.resolve(update) as T;\n notify();\n });\n },\n updateError(error) {\n connection?.active &&\n q(() => {\n (store as unknown as Store<Promise<any>>).set(Promise.reject(error));\n });\n },\n updateIsConnected(isConnected) {\n if (!connection?.active) {\n return;\n }\n\n if (isConnected) {\n whenConnected.resolve();\n }\n\n q(() => {\n if ('state' in store) {\n (store as unknown as Cache<any>).state.set('isConnected', isConnected);\n }\n });\n },\n close() {\n connection?.active && store.invalidate();\n },\n };\n\n connection = { active: true };\n let _cancel: Cancel | undefined = createConnection(actions as any);\n\n connection.cancel = () => {\n _cancel?.();\n _cancel = undefined;\n };\n\n if (!connection.active) {\n connection.cancel();\n }\n\n return whenConnected;\n }\n\n value =\n store.getter instanceof Function\n ? store.getter({ signal: ac.signal, use, connect })\n : store.getter;\n\n if (value instanceof Promise) {\n value.finally(() => whenExecuted.resolve()).catch(() => undefined);\n } else {\n whenExecuted.resolve();\n }\n\n function check() {\n if (active) {\n return;\n }\n\n for (const dep of deps) {\n if (!deepEqual(dep.store.get(), dep.value)) {\n store.invalidate();\n return;\n }\n }\n }\n\n function stop() {\n cancelEffect();\n whenExecuted.resolve();\n whenConnected.resolve();\n ac.abort();\n\n if (connection) {\n connection.active = false;\n connection.cancel?.();\n q.clear();\n }\n }\n\n function invalidateDependencies(recursive?: boolean) {\n for (const dep of deps) {\n dep.store.invalidate(recursive);\n }\n }\n\n return {\n get value() {\n return value!;\n },\n check,\n stop,\n invalidateDependencies,\n };\n}\n\nexport function staticValue<T>(value: T): CalculatedValue<T> {\n return {\n value,\n check: () => undefined,\n stop: () => undefined,\n invalidateDependencies: () => undefined,\n };\n}\n","import type { Path } from './path';\nimport { get } from './propAccess';\n\nexport function makeSelector<T, S>(selector?: ((value: T) => S) | Path<any>): (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","export class Callable<Args extends any[], T> extends Function {\n constructor(protected _call: (...args: Args) => T) {\n super('...args', 'return this._call(...args)');\n\n // eslint-disable-next-line no-constructor-return\n return this.bind(this);\n }\n}\n","import { calcDuration } from './calcDuration';\nimport type { Duration } from '@core';\n\nexport type DebounceOptions =\n | Duration\n | {\n wait: Duration;\n maxWait?: Duration;\n };\n\nexport function debounce<Args extends any[]>(\n action: (...args: Args) => void,\n options: Duration | DebounceOptions,\n) {\n const wait =\n typeof options === 'object' && 'wait' in options\n ? calcDuration(options.wait)\n : calcDuration(options);\n\n const maxWait =\n typeof options === 'object' && 'maxWait' in options && options.maxWait !== undefined\n ? calcDuration(options.maxWait)\n : undefined;\n\n let run: (() => void) | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let timeoutStarted: number | undefined;\n\n function flush() {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run?.();\n }\n\n function cancel() {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run = undefined;\n timeout = undefined;\n timeoutStarted = undefined;\n }\n\n function isScheduled() {\n return timeout !== undefined;\n }\n\n function debounce(...args: Args) {\n const now = Date.now();\n timeoutStarted ??= now;\n\n const deadline = Math.min(\n //\n now + wait,\n timeoutStarted + (maxWait ?? Number.POSITIVE_INFINITY),\n );\n\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run = () => {\n run = undefined;\n timeout = undefined;\n timeoutStarted = undefined;\n\n action(...args);\n };\n\n timeout = setTimeout(run, deadline - now);\n }\n\n return Object.assign(debounce, { flush, cancel, isScheduled });\n}\n","import type { Cancel } from '@core';\nimport type { DisposableCancel } from '@core/commonTypes';\n\nexport default function disposable(dispose: Cancel): DisposableCancel {\n return Object.assign(\n dispose,\n Symbol.dispose ? { [Symbol.dispose]: dispose } : {},\n ) as DisposableCancel;\n}\n","export function forwardError(error: unknown) {\n setTimeout(() => {\n throw error;\n });\n}\n","import { autobind } from '@lib/autobind';\n\nexport class PromiseCancelError extends Error {\n constructor() {\n super('cancelled');\n }\n}\n\nexport class PromiseWithCancel<T> extends Promise<T> {\n private abortController;\n\n constructor(\n executor: (\n resolve: (value: T) => void,\n reject: (error: unknown) => void,\n signal: AbortSignal,\n ) => void,\n ) {\n autobind(PromiseWithCancel);\n const abortController = new AbortController();\n\n super((resolve, reject) => {\n executor(resolve, reject, abortController.signal);\n\n abortController.signal.addEventListener('abort', (e) => {\n reject(abortController.signal.reason);\n });\n });\n\n this.abortController = abortController;\n }\n\n cancel(reason: any = new PromiseCancelError()) {\n this.abortController.abort(reason);\n }\n}\n","import type { Store } from '../core/store';\nimport type { OptionalPropertyOf } from './typeHelpers';\n\ntype Function_ = (...args: any) => any;\n\nfunction createArrayAction<P extends keyof Array<any>>(prop: P) {\n return function arrayAction<T extends Array<any>>(\n this: Store<T>,\n ...args: T[P] extends Function_ ? Parameters<T[P]> : never\n ): T[P] extends Function_ ? ReturnType<T[P]> : never {\n const newArray = this.get().slice() as T;\n const result = (newArray[prop] as Function_)(...(args as any));\n this.set(newArray);\n return result;\n };\n}\nexport const arrayMethods = {\n splice: /* @__PURE__ */ createArrayAction('splice'),\n push: /* @__PURE__ */ createArrayAction('push'),\n pop: /* @__PURE__ */ createArrayAction('pop'),\n shift: /* @__PURE__ */ createArrayAction('shift'),\n unshift: /* @__PURE__ */ createArrayAction('unshift'),\n reverse: /* @__PURE__ */ createArrayAction('reverse'),\n sort: /* @__PURE__ */ createArrayAction('sort'),\n};\n\nexport const recordMethods = {\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.set(copy);\n },\n\n clear<T extends Record<any, any>>(this: Store<Partial<T>>) {\n this.set({} as T);\n },\n};\n\nexport const mapMethods = {\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.set(newMap);\n return result;\n },\n\n clear<K, V>(this: Store<Map<K, V>>) {\n this.set(new Map());\n },\n};\n\nexport const setMethods = {\n add<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.add(value);\n this.set(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.set(newSet);\n },\n\n clear<T>(this: Store<Set<T>>) {\n this.set(new Set());\n },\n};\n","import { calcDuration } from './calcDuration';\nimport type { Duration } from '@core';\n\nexport function throttle<Args extends any[]>(\n action: (...args: Args) => void,\n duration: Duration,\n): (...args: Args) => void {\n const ms = calcDuration(duration);\n\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 action(...args);\n t = Date.now();\n return;\n }\n\n timeout = setTimeout(() => {\n action(...args);\n t = Date.now();\n }, dt);\n };\n}\n","import { autobind } from '@lib/autobind';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue, staticValue, type CalculatedValue } from '@lib/calculatedValue';\nimport { Callable } from '@lib/callable';\nimport { debounce } from '@lib/debounce';\nimport disposable from '@lib/disposable';\nimport { deepEqual } from '@lib/equals';\nimport { forwardError } from '@lib/forwardError';\nimport { isObject } from '@lib/helpers';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/path';\nimport { PromiseWithCancel } from '@lib/promiseWithCancel';\nimport { get, set } from '@lib/propAccess';\nimport { arrayMethods, mapMethods, recordMethods, setMethods } from '@lib/standardMethods';\nimport { throttle } from '@lib/throttle';\nimport type {\n CalculationActions,\n Cancel,\n DisposableCancel,\n Duration,\n Effect,\n Listener,\n Selector,\n SubscribeOptions,\n Update,\n} from './commonTypes';\n\nexport type StoreMethods = Record<string, (...args: any[]) => any>;\n\nexport type BoundStoreMethods<T, Methods extends StoreMethods> = Methods &\n ThisType<Store<T> & Methods>;\n\nexport interface StoreOptions {\n retain?: Duration;\n equals?: SubscribeOptions['equals'];\n}\n\nexport interface StoreOptionsWithMethods<T, Methods extends StoreMethods> extends StoreOptions {\n methods?: Methods & ThisType<Store<T> & Methods & StandardMethods<T>>;\n}\n\nexport type Calculate<T> = (helpers: CalculationActions<T>) => T;\n\ntype StandardMethods<T> =\n T extends Map<any, any>\n ? typeof mapMethods\n : T extends Set<any>\n ? typeof setMethods\n : T extends Array<any>\n ? typeof arrayMethods\n : T extends Record<any, any>\n ? typeof recordMethods\n : Record<string, never>;\n\ntype StoreWithMethods<T, Methods extends StoreMethods> = Store<T> &\n Omit<BoundStoreMethods<T, Methods>, keyof Store<T>> &\n StandardMethods<T>;\n\nexport interface OnceOptions {\n signal?: AbortSignal;\n timeout?: Duration;\n}\n\nfunction noop() {\n return undefined;\n}\n\nexport class Store<T> extends Callable<any, any> {\n protected calculatedValue?: CalculatedValue<T>;\n protected defaultValue?: CalculatedValue<T>;\n\n protected listeners = new Map<Listener, boolean>();\n\n protected effects = new Map<\n Effect,\n { handle?: Cancel; retain?: number; timeout?: ReturnType<typeof setTimeout> }\n >();\n\n protected notifyId = {};\n\n constructor(\n public readonly getter: T | Calculate<T>,\n public readonly options: StoreOptions = {},\n public readonly derivedFrom?: {\n store: Store<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n updater: (state: any) => void;\n },\n protected readonly _call: (...args: any[]) => any = () => undefined,\n ) {\n super(_call);\n autobind(Store);\n\n if (typeof getter !== 'function') {\n this.calculatedValue = this.defaultValue = staticValue(getter);\n }\n }\n\n get(): T {\n this.calculatedValue?.check();\n\n if (!this.calculatedValue) {\n this.calculatedValue = calculatedValue(this, this.notify);\n }\n\n return this.calculatedValue.value;\n }\n\n set(update: Update<T>): void;\n\n set<const P extends Path<T>>(path: P, update: Update<Value<T, P>>): void;\n\n set(...args: any[]): void {\n const path: any = args.length > 1 ? args[0] : [];\n let update: Update<any> = args.length > 1 ? args[1] : args[0];\n\n if (update instanceof Function) {\n const before = this.get();\n const valueBefore = get(before, path);\n const valueAfter = update(valueBefore);\n update = set(before, path, valueAfter);\n } else if (path.length > 0) {\n update = set(this.get(), path, update);\n }\n\n if (this.derivedFrom) {\n this.derivedFrom.updater(update);\n return;\n }\n\n this.calculatedValue?.stop();\n this.calculatedValue = staticValue(update);\n this.notify();\n }\n\n invalidate(recursive?: boolean) {\n if (recursive) {\n this.calculatedValue?.invalidateDependencies(recursive);\n }\n\n this.calculatedValue?.stop();\n this.calculatedValue = this.defaultValue;\n this.notify();\n }\n\n subscribe(listener: Listener<T>, options?: SubscribeOptions): DisposableCancel {\n const {\n passive,\n runNow = true,\n throttle: throttleOption,\n debounce: debounceOption,\n equals = deepEqual,\n } = options ?? {};\n\n let isSetup = false;\n let previousValue: { value: T } | undefined;\n\n let innerListener = () => {\n if (!isSetup) {\n return;\n }\n\n const value = passive ? this.calculatedValue : { value: this.get() };\n\n if (!value) {\n return;\n }\n\n if (previousValue && equals(value.value, previousValue.value)) {\n return;\n }\n\n const _previousValue = previousValue?.value;\n previousValue = this.calculatedValue && { value: this.calculatedValue?.value };\n\n try {\n listener(value.value, _previousValue);\n } catch (error) {\n forwardError(error);\n }\n };\n\n if (throttleOption) {\n innerListener = throttle(innerListener, throttleOption);\n } else if (debounceOption) {\n innerListener = debounce(innerListener, debounceOption);\n }\n\n this.listeners.set(innerListener, !passive);\n if (!passive) {\n this.onSubscribe();\n }\n\n isSetup = true;\n\n if (runNow) {\n innerListener();\n } else {\n previousValue = passive\n ? this.calculatedValue && { value: this.calculatedValue.value }\n : { value: this.get() };\n }\n\n return disposable(() => {\n this.listeners.delete(innerListener);\n if (!passive) {\n this.onUnsubscribe();\n }\n });\n }\n\n once<S extends T>(\n condition: (value: T) => value is S,\n options?: OnceOptions,\n ): PromiseWithCancel<S>;\n\n once(condition: (value: T) => boolean, options?: OnceOptions): PromiseWithCancel<T>;\n\n once(options?: OnceOptions): PromiseWithCancel<T>;\n\n once(\n ...args: [condition: (value: any) => boolean, options?: OnceOptions] | [options?: OnceOptions]\n ): PromiseWithCancel<any> {\n const condition = args[0] instanceof Function ? args[0] : Boolean;\n const options = args[0] instanceof Function ? args[1] : args[0];\n\n return new PromiseWithCancel<T>((resolve, reject, signal) => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const cancel = this.subscribe(\n (value) => {\n if (stopped || !condition(value)) {\n return;\n }\n\n resolve(value);\n stopped = true;\n timer && clearTimeout(timer);\n setTimeout(() => cancel());\n },\n {\n runNow: !!condition,\n },\n );\n\n if (stopped) {\n return;\n }\n\n signal.addEventListener('abort', cancel);\n\n options?.signal?.addEventListener('abort', () => {\n cancel();\n reject(options.signal?.reason ?? new Error('cancelled'));\n });\n\n if (options?.timeout !== undefined) {\n timer = setTimeout(() => {\n cancel();\n reject(new Error('timeout'));\n }, calcDuration(options.timeout));\n }\n });\n }\n\n map<S>(selector: Selector<T, S>, updater?: (value: S) => Update<T>): Store<S>;\n\n map<P extends Path<T>>(selector: P): Store<Value<T, P>>;\n\n map(_selector: Selector<T, any> | Path<any>, ...args: any[]): Store<any> {\n const updater: ((value: any) => Update<T>) | undefined =\n _selector instanceof Function\n ? args[0]\n : (value) => (state) => set(state, _selector as Path<T>, value);\n\n const selector = makeSelector(_selector);\n\n const derivedFrom = {\n store: this.derivedFrom ? this.derivedFrom.store : this,\n selectors: this.derivedFrom ? [...this.derivedFrom.selectors, _selector] : [_selector],\n\n updater: (value: any) => {\n if (!updater) {\n throw new TypeError(\n 'Can only update computed stores that either are derived from other stores using string selectors or have an updater function.',\n );\n }\n\n let update = updater(value);\n\n if (update instanceof Function) {\n update = update(this.get());\n }\n\n if (this.derivedFrom) {\n this.derivedFrom.updater(update);\n } else {\n this.set(update);\n }\n },\n };\n\n return new Store(\n ({ use }) => {\n return selector(use(this));\n },\n this.options,\n derivedFrom,\n );\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 = this.options.retain) {\n this.effects.set(effect, {\n handle: this.isActive() ? 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\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\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 isActive() {\n return [...this.listeners.values()].some(Boolean);\n }\n\n protected onSubscribe() {\n if ([...this.listeners.values()].filter(Boolean).length > 1) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\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.values()].some(Boolean)) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n if (!retain) {\n handle?.();\n\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n this.effects.set(effect, {\n handle: undefined,\n retain,\n timeout: undefined,\n });\n\n continue;\n }\n\n const newTimeout =\n timeout ??\n (handle\n ? setTimeout(() => {\n handle();\n this.effects.set(effect, {\n handle: undefined,\n retain,\n timeout: undefined,\n });\n }, retain)\n : undefined);\n\n this.effects.set(effect, {\n handle,\n retain,\n timeout: newTimeout,\n });\n }\n }\n\n protected notify() {\n const n = {};\n this.notifyId = n;\n\n const snapshot = [...this.listeners.keys()];\n for (const listener of snapshot) {\n listener();\n if (n !== this.notifyId) break;\n }\n }\n}\n\nfunction create<T>(calculate: Calculate<T>, options?: StoreOptions): Store<T>;\nfunction create<T, Methods extends StoreMethods = {}>(\n initialState: T,\n options?: StoreOptionsWithMethods<T, Methods>,\n): StoreWithMethods<T, Methods>;\nfunction create<T, Methods extends StoreMethods>(\n initialState: T | Calculate<T>,\n options?: StoreOptionsWithMethods<T, Methods>,\n): StoreWithMethods<T, Methods> | Store<T> {\n options = { ...createStore.defaultOptions, ...options };\n\n const store = new Store(initialState, options);\n\n if (initialState instanceof Function) {\n return store;\n }\n\n let methods: StoreMethods | undefined = options?.methods;\n\n if (initialState instanceof Map) {\n methods = { ...mapMethods, ...methods };\n } else if (initialState instanceof Set) {\n methods = { ...setMethods, ...methods };\n } else if (Array.isArray(initialState)) {\n methods = { ...arrayMethods, ...methods };\n } else if (isObject(initialState)) {\n methods = { ...recordMethods, ...methods };\n }\n\n const boundMethods = Object.fromEntries(\n Object.entries(methods ?? ({} as BoundStoreMethods<T, any>))\n .filter(([name]) => !(name in store))\n .map(([name, action]) => [name, (action as any).bind(store)]),\n ) as BoundStoreMethods<T, any>;\n\n return Object.assign(store, boundMethods);\n}\n\nexport const createStore = /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n equals: deepEqual,\n } as StoreOptions,\n});\n"],"names":["value","debounce","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.mjs","sources":["../../src/lib/autobind.ts","../../src/lib/calcDuration.ts","../../src/lib/deferred.ts","../../src/lib/isPromise.ts","../../src/lib/queue.ts","../../src/lib/promiseWithState.ts","../../src/lib/calculatedValue.ts","../../src/lib/makeSelector.ts","../../src/lib/callable.ts","../../src/lib/debounce.ts","../../src/lib/disposable.ts","../../src/lib/forwardError.ts","../../src/lib/promiseWithCancel.ts","../../src/lib/standardMethods.ts","../../src/lib/throttle.ts","../../src/core/store.ts"],"sourcesContent":["export const autobind = <\n TClass extends abstract new (...args: any) => any = abstract new (...args: any) => any,\n>(\n _class: TClass,\n _context?: ClassDecoratorContext<TClass>,\n) => {\n if (Reflect.getOwnPropertyDescriptor(_class.prototype, '__autobind_done__')) {\n return _class;\n }\n Reflect.defineProperty(_class.prototype, '__autobind_done__', { value: true });\n\n for (const key of Reflect.ownKeys(_class.prototype)) {\n if (key === 'constructor') {\n continue;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(_class.prototype, key);\n\n // Only methods need binding\n if (typeof descriptor?.value === 'function') {\n let method = descriptor.value as (...args: any[]) => any;\n let isBinding = false;\n\n Object.defineProperty(_class.prototype, key, {\n configurable: true,\n get() {\n if (\n isBinding ||\n this === _class.prototype ||\n Object.prototype.hasOwnProperty.call(this, key) ||\n typeof method !== 'function'\n ) {\n return method;\n }\n\n const boundMethod = (...args: any[]) => Reflect.apply(method, this, args);\n isBinding = true;\n\n Object.defineProperty(this, key, {\n configurable: true,\n get() {\n return boundMethod;\n },\n set(v) {\n method = v;\n // delete this[key];\n },\n });\n\n isBinding = false;\n return boundMethod;\n },\n set(v) {\n method = v;\n },\n });\n }\n }\n\n return _class;\n};\n","import type { Duration } from '../core/commonTypes';\n\nexport function 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 class Deferred<T = void> extends Promise<T> {\n static get [Symbol.species]() {\n return Promise;\n }\n\n resolve: (value: T | PromiseLike<T>) => void = () => undefined;\n reject: (reason?: any) => void = () => undefined;\n\n constructor() {\n const that = {};\n\n super((resolve, reject) => {\n Object.assign(that, { resolve, reject });\n });\n\n Object.assign(this, that);\n }\n}\n","export default function isPromise(value: unknown): value is Promise<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n","import isPromise from '@lib/isPromise';\nimport type { MaybePromise } from './maybePromise';\nimport type { Listener } from '@core';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>, ref?: any): Promise<T>;\n clear: () => void;\n whenDone: () => Promise<void>;\n size: number;\n getRefs: () => any[];\n}\n\nexport function queue(): Queue {\n const q: {\n action: Action<any>;\n resolve: (value: any) => void;\n reject: (error: unknown) => void;\n ref?: any;\n }[] = [];\n const completionListeners = new Set<Listener<void>>();\n let active = false;\n\n const notify = () => {\n for (const listener of completionListeners) {\n listener();\n }\n\n completionListeners.clear();\n };\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 (isPromise(result)) {\n result = await result;\n }\n\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n active = false;\n notify();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>, ref?: any) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject, ref });\n run();\n });\n },\n {\n clear() {\n q.length = 0;\n },\n\n whenDone() {\n if (!active) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n completionListeners.add(resolve);\n });\n },\n\n get size() {\n return q.length;\n },\n\n getRefs() {\n return q.map((item) => item.ref).filter((x) => x !== undefined);\n },\n },\n );\n}\n","import isPromise from '@lib/isPromise';\nimport { type ErrorState, type PendingState, type ValueState } from './cacheState';\nimport { type MaybePromise } from './maybePromise';\n\nexport class PromiseWithState<T> extends Promise<T> {\n static get [Symbol.species]() {\n return Promise;\n }\n\n static override resolve(): PromiseWithState<void>;\n\n static override resolve<T>(value: MaybePromise<T>): PromiseWithState<T>;\n\n static override resolve<T>(value?: MaybePromise<T>) {\n return new PromiseWithState<T>(value as MaybePromise<T>);\n }\n\n static override reject<T = never>(error: unknown) {\n return new PromiseWithState<T>(Promise.reject(error), { status: 'error', error });\n }\n\n constructor(\n value: MaybePromise<T>,\n public state: ValueState<T> | ErrorState | PendingState = { status: 'pending' },\n ) {\n super((resolve) => resolve(value));\n\n if (isPromise(value)) {\n value\n .then((value) => {\n this.state = { status: 'value', value: value };\n })\n .catch((error) => {\n this.state = { status: 'error', error };\n });\n } else {\n this.state = { status: 'value', value: value };\n }\n }\n}\n","import type { AsyncConnectionActions, Cancel, Connection } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { Deferred } from '@lib/deferred';\nimport { queue } from '@lib/queue';\nimport { deepEqual } from './equals';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Cache } from '@core';\nimport isPromise from '@lib/isPromise';\n\nexport interface CalculatedValue<T> {\n value: T;\n check: () => void;\n stop(): void;\n invalidateDependencies(recursive?: boolean): void;\n}\n\nexport function calculatedValue<T>(store: Store<T>, notify: () => void): CalculatedValue<T> {\n let active = false;\n const deps = new Array<{ store: Store<any>; value: any; on: () => void; off: () => void }>();\n let value: T | undefined;\n const whenConnected = new Deferred();\n const whenExecuted = new Deferred();\n const ac = new AbortController();\n let connection: { active: boolean; cancel?: Cancel } | undefined;\n const q = queue();\n q(() => whenExecuted);\n\n const cancelEffect = store.addEffect(() => {\n if (connection) {\n store.invalidate();\n return;\n }\n\n active = true;\n\n for (const dep of deps) {\n dep.on();\n }\n\n return () => {\n active = false;\n\n for (const dep of deps) {\n dep.off();\n }\n\n if (connection) {\n connection.active = false;\n connection.cancel?.();\n q.clear();\n\n if ('state' in store) {\n (store as unknown as Cache<any>).state.set((state) => ({\n ...state,\n isConnected: false,\n isStale: true,\n }));\n }\n }\n };\n });\n\n function use<S>(dep: Store<S>) {\n const value = dep.get();\n let cancel: Cancel | undefined;\n\n const on = () => {\n cancel ||= dep.subscribe(() => store.invalidate(), { runNow: false });\n };\n\n const off = () => {\n cancel?.();\n cancel = undefined;\n };\n\n deps.push({ store: dep, value, on, off });\n\n if (active) {\n on();\n }\n\n return value;\n }\n\n async function connect(createConnection: Connection<T>) {\n if (!active) {\n connection = { active: false };\n return;\n }\n\n const actions: AsyncConnectionActions<any> = {\n set(_value) {\n connection?.active &&\n q(() => {\n value = _value;\n notify();\n });\n },\n updateValue(update) {\n connection?.active &&\n q(async () => {\n if (update instanceof Function) {\n update = update(await value);\n }\n\n if (isPromise(update)) {\n update = await update;\n }\n\n if (!connection?.active) {\n return;\n }\n\n value = PromiseWithState.resolve(update) as T;\n notify();\n });\n },\n updateError(error) {\n connection?.active &&\n q(() => {\n value = PromiseWithState.reject(error) as T;\n notify();\n });\n },\n updateIsConnected(isConnected) {\n if (!connection?.active) {\n return;\n }\n\n if (isConnected) {\n whenConnected.resolve();\n }\n\n q(() => {\n if ('state' in store) {\n (store as unknown as Cache<any>).state.set('isConnected', isConnected);\n }\n });\n },\n close() {\n connection?.active && store.invalidate();\n },\n };\n\n connection = { active: true };\n let _cancel: Cancel | undefined = createConnection(actions as any);\n\n connection.cancel = () => {\n _cancel?.();\n _cancel = undefined;\n };\n\n if (!connection.active) {\n connection.cancel();\n }\n\n return whenConnected;\n }\n\n value =\n store.getter instanceof Function\n ? store.getter({ signal: ac.signal, use, connect })\n : store.getter;\n\n if (isPromise(value)) {\n value.finally(() => whenExecuted.resolve()).catch(() => undefined);\n } else {\n whenExecuted.resolve();\n }\n\n function check() {\n if (active) {\n return;\n }\n\n for (const dep of deps) {\n if (!deepEqual(dep.store.get(), dep.value)) {\n store.invalidate();\n return;\n }\n }\n }\n\n function stop() {\n cancelEffect();\n whenExecuted.resolve();\n whenConnected.resolve();\n ac.abort();\n\n if (connection) {\n connection.active = false;\n connection.cancel?.();\n q.clear();\n }\n }\n\n function invalidateDependencies(recursive?: boolean) {\n for (const dep of deps) {\n dep.store.invalidate(recursive);\n }\n }\n\n return {\n get value() {\n return value!;\n },\n check,\n stop,\n invalidateDependencies,\n };\n}\n\nexport function staticValue<T>(value: T): CalculatedValue<T> {\n return {\n value,\n check: () => undefined,\n stop: () => undefined,\n invalidateDependencies: () => undefined,\n };\n}\n","import type { Path } from './path';\nimport { get } from './propAccess';\n\nexport function makeSelector<T, S>(selector?: ((value: T) => S) | Path<any>): (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","export class Callable<Args extends any[], T> extends Function {\n constructor(protected _call: (...args: Args) => T) {\n super('...args', 'return this._call(...args)');\n\n // eslint-disable-next-line no-constructor-return\n return this.bind(this);\n }\n}\n","import { calcDuration } from './calcDuration';\nimport type { Duration } from '@core';\n\nexport type DebounceOptions =\n | Duration\n | {\n wait: Duration;\n maxWait?: Duration;\n };\n\nexport function debounce<Args extends any[]>(\n action: (...args: Args) => void,\n options: Duration | DebounceOptions,\n) {\n const wait =\n typeof options === 'object' && 'wait' in options\n ? calcDuration(options.wait)\n : calcDuration(options);\n\n const maxWait =\n typeof options === 'object' && 'maxWait' in options && options.maxWait !== undefined\n ? calcDuration(options.maxWait)\n : undefined;\n\n let run: (() => void) | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let timeoutStarted: number | undefined;\n\n function flush() {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run?.();\n }\n\n function cancel() {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run = undefined;\n timeout = undefined;\n timeoutStarted = undefined;\n }\n\n function isScheduled() {\n return timeout !== undefined;\n }\n\n function debounce(...args: Args) {\n const now = Date.now();\n timeoutStarted ??= now;\n\n const deadline = Math.min(\n //\n now + wait,\n timeoutStarted + (maxWait ?? Number.POSITIVE_INFINITY),\n );\n\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n run = () => {\n run = undefined;\n timeout = undefined;\n timeoutStarted = undefined;\n\n action(...args);\n };\n\n timeout = setTimeout(run, deadline - now);\n }\n\n return Object.assign(debounce, { flush, cancel, isScheduled });\n}\n","import type { Cancel } from '@core';\nimport type { DisposableCancel } from '@core/commonTypes';\n\nexport default function disposable(dispose: Cancel): DisposableCancel {\n return Object.assign(\n dispose,\n Symbol.dispose ? { [Symbol.dispose]: dispose } : {},\n ) as DisposableCancel;\n}\n","export function forwardError(error: unknown) {\n setTimeout(() => {\n throw error;\n });\n}\n","import { autobind } from '@lib/autobind';\n\nexport class PromiseCancelError extends Error {\n constructor() {\n super('cancelled');\n }\n}\n\nexport class PromiseWithCancel<T> extends Promise<T> {\n private abortController;\n\n constructor(\n executor: (\n resolve: (value: T) => void,\n reject: (error: unknown) => void,\n signal: AbortSignal,\n ) => void,\n ) {\n autobind(PromiseWithCancel);\n const abortController = new AbortController();\n\n super((resolve, reject) => {\n executor(resolve, reject, abortController.signal);\n\n abortController.signal.addEventListener('abort', (e) => {\n reject(abortController.signal.reason);\n });\n });\n\n this.abortController = abortController;\n }\n\n cancel(reason: any = new PromiseCancelError()) {\n this.abortController.abort(reason);\n }\n}\n","import type { Store } from '../core/store';\nimport type { OptionalPropertyOf } from './typeHelpers';\n\ntype Function_ = (...args: any) => any;\n\nfunction createArrayAction<P extends keyof Array<any>>(prop: P) {\n return function arrayAction<T extends Array<any>>(\n this: Store<T>,\n ...args: T[P] extends Function_ ? Parameters<T[P]> : never\n ): T[P] extends Function_ ? ReturnType<T[P]> : never {\n const newArray = this.get().slice() as T;\n const result = (newArray[prop] as Function_)(...(args as any));\n this.set(newArray);\n return result;\n };\n}\nexport const arrayMethods = {\n splice: /* @__PURE__ */ createArrayAction('splice'),\n push: /* @__PURE__ */ createArrayAction('push'),\n pop: /* @__PURE__ */ createArrayAction('pop'),\n shift: /* @__PURE__ */ createArrayAction('shift'),\n unshift: /* @__PURE__ */ createArrayAction('unshift'),\n reverse: /* @__PURE__ */ createArrayAction('reverse'),\n sort: /* @__PURE__ */ createArrayAction('sort'),\n};\n\nexport const recordMethods = {\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.set(copy);\n },\n\n clear<T extends Record<any, any>>(this: Store<Partial<T>>) {\n this.set({} as T);\n },\n};\n\nexport const mapMethods = {\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.set(newMap);\n return result;\n },\n\n clear<K, V>(this: Store<Map<K, V>>) {\n this.set(new Map());\n },\n};\n\nexport const setMethods = {\n add<T>(this: Store<Set<T>>, value: T) {\n const newSet = new Set(this.get());\n newSet.add(value);\n this.set(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.set(newSet);\n },\n\n clear<T>(this: Store<Set<T>>) {\n this.set(new Set());\n },\n};\n","import { calcDuration } from './calcDuration';\nimport type { Duration } from '@core';\n\nexport function throttle<Args extends any[]>(\n action: (...args: Args) => void,\n duration: Duration,\n): (...args: Args) => void {\n const ms = calcDuration(duration);\n\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 action(...args);\n t = Date.now();\n return;\n }\n\n timeout = setTimeout(() => {\n action(...args);\n t = Date.now();\n }, dt);\n };\n}\n","import { autobind } from '@lib/autobind';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue, staticValue, type CalculatedValue } from '@lib/calculatedValue';\nimport { Callable } from '@lib/callable';\nimport { debounce } from '@lib/debounce';\nimport disposable from '@lib/disposable';\nimport { deepEqual } from '@lib/equals';\nimport { forwardError } from '@lib/forwardError';\nimport { isObject } from '@lib/helpers';\nimport { makeSelector } from '@lib/makeSelector';\nimport type { Path, Value } from '@lib/path';\nimport { PromiseWithCancel } from '@lib/promiseWithCancel';\nimport { get, set } from '@lib/propAccess';\nimport { arrayMethods, mapMethods, recordMethods, setMethods } from '@lib/standardMethods';\nimport { throttle } from '@lib/throttle';\nimport type {\n CalculationActions,\n Cancel,\n DisposableCancel,\n Duration,\n Effect,\n Listener,\n Selector,\n SubscribeOptions,\n Update,\n} from './commonTypes';\n\nexport type StoreMethods = Record<string, (...args: any[]) => any>;\n\nexport type BoundStoreMethods<T, Methods extends StoreMethods> = Methods &\n ThisType<Store<T> & Methods>;\n\nexport interface StoreOptions {\n retain?: Duration;\n equals?: SubscribeOptions['equals'];\n}\n\nexport interface StoreOptionsWithMethods<T, Methods extends StoreMethods> extends StoreOptions {\n methods?: Methods & ThisType<Store<T> & Methods & StandardMethods<T>>;\n}\n\nexport type Calculate<T> = (helpers: CalculationActions<T>) => T;\n\ntype StandardMethods<T> =\n T extends Map<any, any>\n ? typeof mapMethods\n : T extends Set<any>\n ? typeof setMethods\n : T extends Array<any>\n ? typeof arrayMethods\n : T extends Record<any, any>\n ? typeof recordMethods\n : Record<string, never>;\n\ntype StoreWithMethods<T, Methods extends StoreMethods> = Store<T> &\n Omit<BoundStoreMethods<T, Methods>, keyof Store<T>> &\n StandardMethods<T>;\n\nexport interface OnceOptions {\n signal?: AbortSignal;\n timeout?: Duration;\n}\n\nfunction noop() {\n return undefined;\n}\n\nexport class Store<T> extends Callable<any, any> {\n protected calculatedValue?: CalculatedValue<T>;\n protected defaultValue?: CalculatedValue<T>;\n\n protected listeners = new Map<Listener, boolean>();\n\n protected effects = new Map<\n Effect,\n { handle?: Cancel; retain?: number; timeout?: ReturnType<typeof setTimeout> }\n >();\n\n protected notifyId = {};\n\n constructor(\n public readonly getter: T | Calculate<T>,\n public readonly options: StoreOptions = {},\n public readonly derivedFrom?: {\n store: Store<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n updater: (state: any) => void;\n },\n protected readonly _call: (...args: any[]) => any = () => undefined,\n ) {\n super(_call);\n autobind(Store);\n\n if (typeof getter !== 'function') {\n this.calculatedValue = this.defaultValue = staticValue(getter);\n }\n }\n\n get(): T {\n this.calculatedValue?.check();\n\n if (!this.calculatedValue) {\n this.calculatedValue = calculatedValue(this, this.notify);\n }\n\n return this.calculatedValue.value;\n }\n\n set(update: Update<T>): void;\n\n set<const P extends Path<T>>(path: P, update: Update<Value<T, P>>): void;\n\n set(...args: any[]): void {\n const path: any = args.length > 1 ? args[0] : [];\n let update: Update<any> = args.length > 1 ? args[1] : args[0];\n\n if (update instanceof Function) {\n const before = this.get();\n const valueBefore = get(before, path);\n const valueAfter = update(valueBefore);\n update = set(before, path, valueAfter);\n } else if (path.length > 0) {\n update = set(this.get(), path, update);\n }\n\n if (this.derivedFrom) {\n this.derivedFrom.updater(update);\n return;\n }\n\n this.calculatedValue?.stop();\n this.calculatedValue = staticValue(update);\n this.notify();\n }\n\n invalidate(recursive?: boolean) {\n if (recursive) {\n this.calculatedValue?.invalidateDependencies(recursive);\n }\n\n this.calculatedValue?.stop();\n this.calculatedValue = this.defaultValue;\n this.notify();\n }\n\n subscribe(listener: Listener<T>, options?: SubscribeOptions): DisposableCancel {\n const {\n passive,\n runNow = true,\n throttle: throttleOption,\n debounce: debounceOption,\n equals = deepEqual,\n } = options ?? {};\n\n let isSetup = false;\n let previousValue: { value: T } | undefined;\n\n let innerListener = () => {\n if (!isSetup) {\n return;\n }\n\n const value = passive ? this.calculatedValue : { value: this.get() };\n\n if (!value) {\n return;\n }\n\n if (previousValue && equals(value.value, previousValue.value)) {\n return;\n }\n\n const _previousValue = previousValue?.value;\n previousValue = this.calculatedValue && { value: this.calculatedValue?.value };\n\n try {\n listener(value.value, _previousValue);\n } catch (error) {\n forwardError(error);\n }\n };\n\n if (throttleOption) {\n innerListener = throttle(innerListener, throttleOption);\n } else if (debounceOption) {\n innerListener = debounce(innerListener, debounceOption);\n }\n\n this.listeners.set(innerListener, !passive);\n if (!passive) {\n this.onSubscribe();\n }\n\n isSetup = true;\n\n if (runNow) {\n innerListener();\n } else {\n previousValue = passive\n ? this.calculatedValue && { value: this.calculatedValue.value }\n : { value: this.get() };\n }\n\n return disposable(() => {\n this.listeners.delete(innerListener);\n if (!passive) {\n this.onUnsubscribe();\n }\n });\n }\n\n once<S extends T>(\n condition: (value: T) => value is S,\n options?: OnceOptions,\n ): PromiseWithCancel<S>;\n\n once(condition: (value: T) => boolean, options?: OnceOptions): PromiseWithCancel<T>;\n\n once(options?: OnceOptions): PromiseWithCancel<T>;\n\n once(\n ...args: [condition: (value: any) => boolean, options?: OnceOptions] | [options?: OnceOptions]\n ): PromiseWithCancel<any> {\n const condition = args[0] instanceof Function ? args[0] : Boolean;\n const options = args[0] instanceof Function ? args[1] : args[0];\n\n return new PromiseWithCancel<T>((resolve, reject, signal) => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const cancel = this.subscribe(\n (value) => {\n if (stopped || !condition(value)) {\n return;\n }\n\n resolve(value);\n stopped = true;\n timer && clearTimeout(timer);\n setTimeout(() => cancel());\n },\n {\n runNow: !!condition,\n },\n );\n\n if (stopped) {\n return;\n }\n\n signal.addEventListener('abort', cancel);\n\n options?.signal?.addEventListener('abort', () => {\n cancel();\n reject(options.signal?.reason ?? new Error('cancelled'));\n });\n\n if (options?.timeout !== undefined) {\n timer = setTimeout(() => {\n cancel();\n reject(new Error('timeout'));\n }, calcDuration(options.timeout));\n }\n });\n }\n\n map<S>(selector: Selector<T, S>, updater?: (value: S) => Update<T>): Store<S>;\n\n map<P extends Path<T>>(selector: P): Store<Value<T, P>>;\n\n map(_selector: Selector<T, any> | Path<any>, ...args: any[]): Store<any> {\n const updater: ((value: any) => Update<T>) | undefined =\n _selector instanceof Function\n ? args[0]\n : (value) => (state) => set(state, _selector as Path<T>, value);\n\n const selector = makeSelector(_selector);\n\n const derivedFrom = {\n store: this.derivedFrom ? this.derivedFrom.store : this,\n selectors: this.derivedFrom ? [...this.derivedFrom.selectors, _selector] : [_selector],\n\n updater: (value: any) => {\n if (!updater) {\n throw new TypeError(\n 'Can only update computed stores that either are derived from other stores using string selectors or have an updater function.',\n );\n }\n\n let update = updater(value);\n\n if (update instanceof Function) {\n update = update(this.get());\n }\n\n if (this.derivedFrom) {\n this.derivedFrom.updater(update);\n } else {\n this.set(update);\n }\n },\n };\n\n return new Store(\n ({ use }) => {\n return selector(use(this));\n },\n this.options,\n derivedFrom,\n );\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 = this.options.retain) {\n this.effects.set(effect, {\n handle: this.isActive() ? 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\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\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 isActive() {\n return [...this.listeners.values()].some(Boolean);\n }\n\n protected onSubscribe() {\n if ([...this.listeners.values()].filter(Boolean).length > 1) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\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.values()].some(Boolean)) return;\n\n for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {\n if (!retain) {\n handle?.();\n\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n\n this.effects.set(effect, {\n handle: undefined,\n retain,\n timeout: undefined,\n });\n\n continue;\n }\n\n const newTimeout =\n timeout ??\n (handle\n ? setTimeout(() => {\n handle();\n this.effects.set(effect, {\n handle: undefined,\n retain,\n timeout: undefined,\n });\n }, retain)\n : undefined);\n\n this.effects.set(effect, {\n handle,\n retain,\n timeout: newTimeout,\n });\n }\n }\n\n protected notify() {\n const n = {};\n this.notifyId = n;\n\n const snapshot = [...this.listeners.keys()];\n for (const listener of snapshot) {\n listener();\n if (n !== this.notifyId) break;\n }\n }\n}\n\nfunction create<T>(calculate: Calculate<T>, options?: StoreOptions): Store<T>;\nfunction create<T, Methods extends StoreMethods = {}>(\n initialState: T,\n options?: StoreOptionsWithMethods<T, Methods>,\n): StoreWithMethods<T, Methods>;\nfunction create<T, Methods extends StoreMethods>(\n initialState: T | Calculate<T>,\n options?: StoreOptionsWithMethods<T, Methods>,\n): StoreWithMethods<T, Methods> | Store<T> {\n options = { ...createStore.defaultOptions, ...options };\n\n const store = new Store(initialState, options);\n\n if (initialState instanceof Function) {\n return store;\n }\n\n let methods: StoreMethods | undefined = options?.methods;\n\n if (initialState instanceof Map) {\n methods = { ...mapMethods, ...methods };\n } else if (initialState instanceof Set) {\n methods = { ...setMethods, ...methods };\n } else if (Array.isArray(initialState)) {\n methods = { ...arrayMethods, ...methods };\n } else if (isObject(initialState)) {\n methods = { ...recordMethods, ...methods };\n }\n\n const boundMethods = Object.fromEntries(\n Object.entries(methods ?? ({} as BoundStoreMethods<T, any>))\n .filter(([name]) => !(name in store))\n .map(([name, action]) => [name, (action as any).bind(store)]),\n ) as BoundStoreMethods<T, any>;\n\n return Object.assign(store, boundMethods);\n}\n\nexport const createStore = /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n equals: deepEqual,\n } as StoreOptions,\n});\n"],"names":["value","debounce","_a"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cross-state",
|
|
3
|
-
"version": "0.37.
|
|
3
|
+
"version": "0.37.8",
|
|
4
4
|
"description": "(React) state library",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": "schummar/cross-state",
|
|
@@ -141,6 +141,7 @@
|
|
|
141
141
|
"@types/ws": "8.5.10",
|
|
142
142
|
"@vitejs/plugin-react": "4.2.1",
|
|
143
143
|
"@vitest/coverage-v8": "1.4.0",
|
|
144
|
+
"@vitest/ui": "^1.4.0",
|
|
144
145
|
"esbuild": "0.20.2",
|
|
145
146
|
"eslint": "8.57.0",
|
|
146
147
|
"happy-dom": "14.5.1",
|