cross-state 0.31.2 → 0.31.5

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.
@@ -439,6 +439,7 @@ exports.set = store.set;
439
439
  exports.setMethods = store.setMethods;
440
440
  exports.connectUrl = urlStore.connectUrl;
441
441
  exports.createUrlStore = urlStore.createUrlStore;
442
+ exports.updateUrlStore = urlStore.updateUrlStore;
442
443
  exports.SubstriptionCache = SubstriptionCache;
443
444
  exports.Sync = Sync;
444
445
  exports.applyPatches = applyPatches;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/core/subscriptionCache.ts","../../src/lib/applyPatches.ts","../../src/lib/diff.ts","../../src/lib/updateHelpers.ts","../../src/persist/persistPathHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistStorage.ts","../../src/persist/persist.ts","../../src/sync/sync.ts"],"sourcesContent":["import {\n type CalculationHelpers,\n type Cancel,\n type ConnectionState,\n type Duration,\n type Selector,\n} from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { createStore, Store } from './store';\nimport { calcDuration } from '@lib/calcDuration';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { type Path } from '@lib/path';\n\nexport interface SubscriptionCacheFunction<T, Args extends any[] = []> {\n (\n this: CalculationHelpers<T>,\n ...args: Args\n ): Cancel | void | ((cache: CalculationHelpers<T>) => Cancel | void);\n}\n\nexport type SubstriptionCacheOptions<T> = {\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n retain?: Duration;\n} & (T extends undefined ? { default?: T } : { default: T });\n\nexport class SubstriptionCache<T> extends Store<T> {\n readonly state = createStore({\n connectionState: 'closed' as ConnectionState,\n error: undefined as unknown | undefined,\n });\n\n constructor(\n public readonly connectFunction: SubscriptionCacheFunction<T>,\n public readonly options: SubstriptionCacheOptions<T>,\n public readonly derivedFromSubscriptionCache?: {\n subscriptionCache: SubstriptionCache<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(options.default as T, options, undefined, _call);\n\n this.calculationHelper.options = {\n ...this.calculationHelper.options,\n calculate: (helpers) => {\n let result = connectFunction.apply(helpers);\n\n if (result instanceof Function && result.length > 0) {\n result = result(helpers);\n }\n\n return result as Cancel | void;\n },\n onValue: (value) => {\n this.set(value);\n },\n onError: (error) => {\n this.state.set('error', error);\n },\n onConnectionState: (state) => {\n this.state.set('connectionState', state);\n },\n onInvalidate: () => {\n this.invalidate();\n },\n };\n }\n\n invalidate({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}) {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear({ invalidateDependencies });\n }\n\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.calculationHelper.stop();\n\n if (this.isActive()) {\n this.calculationHelper.execute();\n }\n }\n\n clear({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}): void {\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.calculationHelper.stop();\n\n if (this.isActive()) {\n this.calculationHelper.execute();\n }\n }\n}\n\nconst defaultOptions: SubstriptionCacheOptions<any> = {\n clearUnusedAfter: { days: 1 },\n retain: { seconds: 1 },\n};\n\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): SubstriptionCache<T>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? SubstriptionCache<T> : {});\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: SubscriptionCacheFunction<T, Args>,\n ...[options = {} as SubstriptionCacheOptions<T>]: undefined extends T\n ? [options?: SubstriptionCacheOptions<T>]\n : [options: SubstriptionCacheOptions<T>]\n): CreateReturnType<T, Args> {\n options = Object.assign({}, defaultOptions, options);\n const { clearUnusedAfter, resourceGroup } = options;\n\n let baseInstance: CreateReturnType<T, Args> & SubstriptionCache<T>;\n\n const instanceCache = new InstanceCache<Args, SubstriptionCache<T>>(\n (...args: Args): SubstriptionCache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n return new SubstriptionCache<T>(function () {\n return cacheFunction.apply(this, args);\n }, options);\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n const get = (...args: Args) => {\n return instanceCache.get(...args);\n };\n\n const invalidateAll = () => {\n for (const instance of instanceCache.values()) {\n instance.invalidate();\n }\n };\n\n const clearAll = () => {\n for (const instance of instanceCache.values()) {\n instance.clear();\n }\n };\n\n baseInstance = Object.assign(\n new SubstriptionCache<T>(\n function () {\n return cacheFunction.apply(this);\n },\n options,\n undefined,\n get,\n ),\n {\n invalidateAll,\n clearAll,\n },\n ) as CreateReturnType<T, Args> & SubstriptionCache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n get(...([] as any));\n\n return baseInstance;\n}\n\nexport const createSubscriptionCache = /* @__PURE__ */ Object.assign(create, {\n defaultOptions,\n});\n","import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport function diff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) } = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n a = [...a];\n b = [...b];\n }\n\n if (a instanceof Object && b instanceof Object && Array.isArray(a) === Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n const castKey = (key: string) => (Array.isArray(a) ? Number(key) : key);\n\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, castKey(key)] },\n { op: 'add', path: [...prefix, castKey(key)], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, castKey(key)]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, castKey(key)], value },\n { op: 'remove', path: [...prefix, castKey(key)] },\n ];\n }\n }\n}\n","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 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 (!(newValue[key] instanceof Object)) 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 constructor(public readonly store: Store<T>, public readonly options: PersistOptions<T>) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${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 = JSON.parse(key);\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 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 = JSON.stringify(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 = JSON.stringify(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 = JSON.parse(k);\n return (\n 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","import { type Store } from '@core';\nimport { applyPatches } from '@lib/applyPatches';\nimport { type Patch, diff } from '@lib/diff';\n\nexport interface Message<T> {\n id: string;\n previousId?: string;\n patches: Patch[];\n}\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport class Sync<T> {\n private previousId = genId();\n private previousState = this.store.get();\n\n private patchStream = this.store.map((state) => {\n const id = genId();\n const previousId = this.previousId;\n const patches = diff(this.previousState, state)[0];\n\n this.previousId = id;\n this.previousState = state;\n return { id, previousId, patches };\n });\n\n constructor(public readonly store: Store<T>) {\n this.patchStream.addEffect(() => {\n this.previousId = genId();\n this.previousState = this.store.get();\n });\n }\n\n connectToClient(listener: (message: Message<T>) => void) {\n const cancel = this.patchStream.subscribe(listener, { runNow: false });\n\n listener({\n id: this.previousId,\n patches: [{ op: 'replace', path: [], value: this.previousState }],\n });\n\n return cancel;\n }\n\n async connectToServer(stream: AsyncIterable<Message<T>>) {\n let previousId;\n\n for await (const message of stream) {\n if (message.previousId && message.previousId !== previousId) {\n throw new Error('previousId mismatch');\n }\n\n previousId = message.id;\n this.store.set((state) => applyPatches(state, ...message.patches));\n }\n }\n}\n\nexport function createSync<T>(store: Store<T>) {\n return new Sync(store);\n}\n"],"names":["Store","createStore","InstanceCache","calcDuration","allResources","remove","set","deepEqual","store","queue","castArrayPath","shallowEqual","get"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/core/subscriptionCache.ts","../../src/lib/applyPatches.ts","../../src/lib/diff.ts","../../src/lib/updateHelpers.ts","../../src/persist/persistPathHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistStorage.ts","../../src/persist/persist.ts","../../src/sync/sync.ts"],"sourcesContent":["import {\n type CalculationHelpers,\n type Cancel,\n type ConnectionState,\n type Duration,\n type Selector,\n} from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { createStore, Store } from './store';\nimport { calcDuration } from '@lib/calcDuration';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { type Path } from '@lib/path';\n\nexport interface SubscriptionCacheFunction<T, Args extends any[] = []> {\n (\n this: CalculationHelpers<T>,\n ...args: Args\n ): Cancel | void | ((cache: CalculationHelpers<T>) => Cancel | void);\n}\n\nexport type SubstriptionCacheOptions<T> = {\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n retain?: Duration;\n} & (T extends undefined ? { default?: T } : { default: T });\n\nexport class SubstriptionCache<T> extends Store<T> {\n readonly state = createStore({\n connectionState: 'closed' as ConnectionState,\n error: undefined as unknown | undefined,\n });\n\n constructor(\n public readonly connectFunction: SubscriptionCacheFunction<T>,\n public readonly options: SubstriptionCacheOptions<T>,\n public readonly derivedFromSubscriptionCache?: {\n subscriptionCache: SubstriptionCache<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(options.default as T, options, undefined, _call);\n\n this.calculationHelper.options = {\n ...this.calculationHelper.options,\n calculate: (helpers) => {\n let result = connectFunction.apply(helpers);\n\n if (result instanceof Function && result.length > 0) {\n result = result(helpers);\n }\n\n return result as Cancel | void;\n },\n onValue: (value) => {\n this.set(value);\n },\n onError: (error) => {\n this.state.set('error', error);\n },\n onConnectionState: (state) => {\n this.state.set('connectionState', state);\n },\n onInvalidate: () => {\n this.invalidate();\n },\n };\n }\n\n invalidate({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}) {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear({ invalidateDependencies });\n }\n\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.calculationHelper.stop();\n\n if (this.isActive()) {\n this.calculationHelper.execute();\n }\n }\n\n clear({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}): void {\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.calculationHelper.stop();\n\n if (this.isActive()) {\n this.calculationHelper.execute();\n }\n }\n}\n\nconst defaultOptions: SubstriptionCacheOptions<any> = {\n clearUnusedAfter: { days: 1 },\n retain: { seconds: 1 },\n};\n\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): SubstriptionCache<T>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? SubstriptionCache<T> : {});\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: SubscriptionCacheFunction<T, Args>,\n ...[options = {} as SubstriptionCacheOptions<T>]: undefined extends T\n ? [options?: SubstriptionCacheOptions<T>]\n : [options: SubstriptionCacheOptions<T>]\n): CreateReturnType<T, Args> {\n options = Object.assign({}, defaultOptions, options);\n const { clearUnusedAfter, resourceGroup } = options;\n\n let baseInstance: CreateReturnType<T, Args> & SubstriptionCache<T>;\n\n const instanceCache = new InstanceCache<Args, SubstriptionCache<T>>(\n (...args: Args): SubstriptionCache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n return new SubstriptionCache<T>(function () {\n return cacheFunction.apply(this, args);\n }, options);\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n const get = (...args: Args) => {\n return instanceCache.get(...args);\n };\n\n const invalidateAll = () => {\n for (const instance of instanceCache.values()) {\n instance.invalidate();\n }\n };\n\n const clearAll = () => {\n for (const instance of instanceCache.values()) {\n instance.clear();\n }\n };\n\n baseInstance = Object.assign(\n new SubstriptionCache<T>(\n function () {\n return cacheFunction.apply(this);\n },\n options,\n undefined,\n get,\n ),\n {\n invalidateAll,\n clearAll,\n },\n ) as CreateReturnType<T, Args> & SubstriptionCache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n get(...([] as any));\n\n return baseInstance;\n}\n\nexport const createSubscriptionCache = /* @__PURE__ */ Object.assign(create, {\n defaultOptions,\n});\n","import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport function diff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) } = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n a = [...a];\n b = [...b];\n }\n\n if (a instanceof Object && b instanceof Object && Array.isArray(a) === Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n const castKey = (key: string) => (Array.isArray(a) ? Number(key) : key);\n\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, castKey(key)] },\n { op: 'add', path: [...prefix, castKey(key)], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, castKey(key)]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, castKey(key)], value },\n { op: 'remove', path: [...prefix, castKey(key)] },\n ];\n }\n }\n}\n","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 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 (!(newValue[key] instanceof Object)) 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 constructor(public readonly store: Store<T>, public readonly options: PersistOptions<T>) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${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 = JSON.parse(key);\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 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 = JSON.stringify(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 = JSON.stringify(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 = JSON.parse(k);\n return (\n 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","import { type Store } from '@core';\nimport { applyPatches } from '@lib/applyPatches';\nimport { type Patch, diff } from '@lib/diff';\n\nexport interface Message<T> {\n id: string;\n previousId?: string;\n patches: Patch[];\n}\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport class Sync<T> {\n private previousId = genId();\n private previousState = this.store.get();\n\n private patchStream = this.store.map((state) => {\n const id = genId();\n const previousId = this.previousId;\n const patches = diff(this.previousState, state)[0];\n\n this.previousId = id;\n this.previousState = state;\n return { id, previousId, patches };\n });\n\n constructor(public readonly store: Store<T>) {\n this.patchStream.addEffect(() => {\n this.previousId = genId();\n this.previousState = this.store.get();\n });\n }\n\n connectToClient(listener: (message: Message<T>) => void) {\n const cancel = this.patchStream.subscribe(listener, { runNow: false });\n\n listener({\n id: this.previousId,\n patches: [{ op: 'replace', path: [], value: this.previousState }],\n });\n\n return cancel;\n }\n\n async connectToServer(stream: AsyncIterable<Message<T>>) {\n let previousId;\n\n for await (const message of stream) {\n if (message.previousId && message.previousId !== previousId) {\n throw new Error('previousId mismatch');\n }\n\n previousId = message.id;\n this.store.set((state) => applyPatches(state, ...message.patches));\n }\n }\n}\n\nexport function createSync<T>(store: Store<T>) {\n return new Sync(store);\n}\n"],"names":["Store","createStore","InstanceCache","calcDuration","allResources","remove","set","deepEqual","store","queue","castArrayPath","shallowEqual","get"],"mappings":"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"}
@@ -22,6 +22,9 @@ urlStore.addEffect(() => {
22
22
  window.removeEventListener("popstate", update);
23
23
  };
24
24
  });
25
+ function updateUrlStore() {
26
+ urlStore.set(window.location.href);
27
+ }
25
28
  function connectUrl(store2, {
26
29
  key,
27
30
  type = "search",
@@ -92,4 +95,5 @@ function createUrlStore(options) {
92
95
  }
93
96
  exports.connectUrl = connectUrl;
94
97
  exports.createUrlStore = createUrlStore;
98
+ exports.updateUrlStore = updateUrlStore;
95
99
  //# sourceMappingURL=urlStore.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"urlStore.cjs","sources":["../../src/core/urlStore.ts"],"sourcesContent":["import { type Cancel } from './commonTypes';\nimport { createStore, type Store, type StoreOptions } from './store';\n\nexport interface UrlStoreOptions<T> extends StoreOptions {\n key: string;\n type?: 'search' | 'hash';\n serialize?: (value: T) => string;\n deserialize?: (value: string) => T;\n defaultValue?: T;\n onCommit?: (value: T | undefined) => void;\n}\n\nexport interface UrlStoreOptionsWithDefaults<T> extends UrlStoreOptions<T> {\n defaultValue: T;\n}\n\nexport type UrlStoreOptionsRequired<T> = UrlStoreOptions<T> &\n Required<Pick<UrlStoreOptions<T>, 'type' | 'serialize' | 'deserialize' | 'defaultValue'>>;\n\nconst urlStore = createStore(() => (typeof window !== 'undefined' ? window.location.href : ''));\n\nurlStore.addEffect(() => {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n const update = () => {\n urlStore.set(window.location.href);\n };\n\n window.history.pushState = (...args) => {\n originalPushState.apply(window.history, args);\n update();\n };\n\n window.history.replaceState = (...args) => {\n originalReplaceState.apply(window.history, args);\n update();\n };\n\n window.addEventListener('popstate', update);\n\n return () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', update);\n };\n});\n\nexport function connectUrl<T>(store: Store<T>, options: UrlStoreOptionsWithDefaults<T>): Cancel;\n\nexport function connectUrl<T>(store: Store<T | undefined>, options: UrlStoreOptions<T>): Cancel;\n\nexport function connectUrl<T>(\n store: Store<T>,\n {\n key,\n type = 'search',\n serialize = defaultSerializer,\n deserialize = defaultDeserializer,\n defaultValue = undefined as T,\n onCommit,\n }: UrlStoreOptions<T>,\n): Cancel {\n const serializedDefaultValue = serialize(defaultValue);\n\n const cancelUrlListener = urlStore.subscribe((_url) => {\n const url = new URL(_url);\n const parameters = new URLSearchParams(url[type].slice(1));\n const urlValue = parameters.get(key);\n\n store.set(urlValue !== null ? deserialize(urlValue) : defaultValue);\n });\n\n const cancelSubscription = store.subscribe((value) => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n const serializedValue = value !== undefined ? serialize(value) : undefined;\n\n if (serializedValue === undefined || serializedValue === serializedDefaultValue) {\n parameters.delete(key);\n } else {\n parameters.set(key, serializedValue);\n }\n\n url[type] = parameters.toString();\n\n window.history.replaceState(null, '', url.toString());\n window.dispatchEvent(new PopStateEvent('popstate'));\n\n onCommit?.(value);\n });\n\n return () => {\n cancelUrlListener();\n cancelSubscription();\n };\n}\n\nfunction defaultDeserializer(value: string): any {\n if (value === undefined) {\n return undefined;\n }\n\n try {\n return JSON.parse(value, (_k, v) => {\n if (typeof v === 'object' && v !== null && '__set' in v) {\n return new Set(v.__set);\n }\n if (typeof v === 'object' && v !== null && '__map' in v) {\n return new Map(v.__map);\n }\n return v;\n });\n } catch {\n return undefined;\n }\n}\n\nfunction defaultSerializer(value: any): string {\n return JSON.stringify(value, (_k, v) => {\n if (v instanceof Set) {\n return { __set: Array.from(v) };\n }\n if (v instanceof Map) {\n return { __map: Array.from(v) };\n }\n return v;\n });\n}\n\nexport function createUrlStore<T>(options: UrlStoreOptionsWithDefaults<T>): Store<T>;\n\nexport function createUrlStore<T>(options: UrlStoreOptions<T>): Store<T | undefined>;\n\nexport function createUrlStore<T>(options: UrlStoreOptions<T>) {\n const store = createStore(options.defaultValue, options);\n connectUrl(store, options);\n return store;\n}\n"],"names":["createStore","store"],"mappings":"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"}
1
+ {"version":3,"file":"urlStore.cjs","sources":["../../src/core/urlStore.ts"],"sourcesContent":["import { type Cancel } from './commonTypes';\nimport { createStore, type Store, type StoreOptions } from './store';\n\nexport interface UrlStoreOptions<T> extends StoreOptions {\n key: string;\n type?: 'search' | 'hash';\n serialize?: (value: T) => string;\n deserialize?: (value: string) => T;\n defaultValue?: T;\n onCommit?: (value: T | undefined) => void;\n}\n\nexport interface UrlStoreOptionsWithDefaults<T> extends UrlStoreOptions<T> {\n defaultValue: T;\n}\n\nexport type UrlStoreOptionsRequired<T> = UrlStoreOptions<T> &\n Required<Pick<UrlStoreOptions<T>, 'type' | 'serialize' | 'deserialize' | 'defaultValue'>>;\n\nconst urlStore = createStore(() => (typeof window !== 'undefined' ? window.location.href : ''));\n\nurlStore.addEffect(() => {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n const update = () => {\n urlStore.set(window.location.href);\n };\n\n window.history.pushState = (...args) => {\n originalPushState.apply(window.history, args);\n update();\n };\n\n window.history.replaceState = (...args) => {\n originalReplaceState.apply(window.history, args);\n update();\n };\n\n window.addEventListener('popstate', update);\n\n return () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', update);\n };\n});\n\nexport function updateUrlStore() {\n urlStore.set(window.location.href);\n}\n\nexport function connectUrl<T>(store: Store<T>, options: UrlStoreOptionsWithDefaults<T>): Cancel;\n\nexport function connectUrl<T>(store: Store<T | undefined>, options: UrlStoreOptions<T>): Cancel;\n\nexport function connectUrl<T>(\n store: Store<T>,\n {\n key,\n type = 'search',\n serialize = defaultSerializer,\n deserialize = defaultDeserializer,\n defaultValue = undefined as T,\n onCommit,\n }: UrlStoreOptions<T>,\n): Cancel {\n const serializedDefaultValue = serialize(defaultValue);\n\n const cancelUrlListener = urlStore.subscribe((_url) => {\n const url = new URL(_url);\n const parameters = new URLSearchParams(url[type].slice(1));\n const urlValue = parameters.get(key);\n\n store.set(urlValue !== null ? deserialize(urlValue) : defaultValue);\n });\n\n const cancelSubscription = store.subscribe((value) => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n const serializedValue = value !== undefined ? serialize(value) : undefined;\n\n if (serializedValue === undefined || serializedValue === serializedDefaultValue) {\n parameters.delete(key);\n } else {\n parameters.set(key, serializedValue);\n }\n\n url[type] = parameters.toString();\n\n window.history.replaceState(null, '', url.toString());\n window.dispatchEvent(new PopStateEvent('popstate'));\n\n onCommit?.(value);\n });\n\n return () => {\n cancelUrlListener();\n cancelSubscription();\n };\n}\n\nfunction defaultDeserializer(value: string): any {\n if (value === undefined) {\n return undefined;\n }\n\n try {\n return JSON.parse(value, (_k, v) => {\n if (typeof v === 'object' && v !== null && '__set' in v) {\n return new Set(v.__set);\n }\n if (typeof v === 'object' && v !== null && '__map' in v) {\n return new Map(v.__map);\n }\n return v;\n });\n } catch {\n return undefined;\n }\n}\n\nfunction defaultSerializer(value: any): string {\n return JSON.stringify(value, (_k, v) => {\n if (v instanceof Set) {\n return { __set: Array.from(v) };\n }\n if (v instanceof Map) {\n return { __map: Array.from(v) };\n }\n return v;\n });\n}\n\nexport function createUrlStore<T>(options: UrlStoreOptionsWithDefaults<T>): Store<T>;\n\nexport function createUrlStore<T>(options: UrlStoreOptions<T>): Store<T | undefined>;\n\nexport function createUrlStore<T>(options: UrlStoreOptions<T>) {\n const store = createStore(options.defaultValue, options);\n connectUrl(store, options);\n return store;\n}\n"],"names":["createStore","store"],"mappings":"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"}
package/dist/es/index.mjs CHANGED
@@ -2,7 +2,7 @@ import { I as InstanceCache, a as allResources } from "./scope.mjs";
2
2
  import { C, R, S, c, b, d } from "./scope.mjs";
3
3
  import { S as Store, c as createStore, b as calcDuration, r as remove, s as set, d as deepEqual, q as queue, e as castArrayPath, f as shallowEqual, g as get } from "./store.mjs";
4
4
  import { h, i, j, k } from "./store.mjs";
5
- import { c as c2, a } from "./urlStore.mjs";
5
+ import { c as c2, a, u } from "./urlStore.mjs";
6
6
  import "./hash.mjs";
7
7
  class SubstriptionCache extends Store {
8
8
  constructor(connectFunction, options, derivedFromSubscriptionCache, _call) {
@@ -447,6 +447,7 @@ export {
447
447
  persist,
448
448
  j as recordMethods,
449
449
  set,
450
- k as setMethods
450
+ k as setMethods,
451
+ u as updateUrlStore
451
452
  };
452
453
  //# sourceMappingURL=index.mjs.map
@@ -21,6 +21,9 @@ urlStore.addEffect(() => {
21
21
  window.removeEventListener("popstate", update);
22
22
  };
23
23
  });
24
+ function updateUrlStore() {
25
+ urlStore.set(window.location.href);
26
+ }
24
27
  function connectUrl(store, {
25
28
  key,
26
29
  type = "search",
@@ -91,6 +94,7 @@ function createUrlStore(options) {
91
94
  }
92
95
  export {
93
96
  createUrlStore as a,
94
- connectUrl as c
97
+ connectUrl as c,
98
+ updateUrlStore as u
95
99
  };
96
100
  //# sourceMappingURL=urlStore.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"urlStore.mjs","sources":["../../src/core/urlStore.ts"],"sourcesContent":["import { type Cancel } from './commonTypes';\nimport { createStore, type Store, type StoreOptions } from './store';\n\nexport interface UrlStoreOptions<T> extends StoreOptions {\n key: string;\n type?: 'search' | 'hash';\n serialize?: (value: T) => string;\n deserialize?: (value: string) => T;\n defaultValue?: T;\n onCommit?: (value: T | undefined) => void;\n}\n\nexport interface UrlStoreOptionsWithDefaults<T> extends UrlStoreOptions<T> {\n defaultValue: T;\n}\n\nexport type UrlStoreOptionsRequired<T> = UrlStoreOptions<T> &\n Required<Pick<UrlStoreOptions<T>, 'type' | 'serialize' | 'deserialize' | 'defaultValue'>>;\n\nconst urlStore = createStore(() => (typeof window !== 'undefined' ? window.location.href : ''));\n\nurlStore.addEffect(() => {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n const update = () => {\n urlStore.set(window.location.href);\n };\n\n window.history.pushState = (...args) => {\n originalPushState.apply(window.history, args);\n update();\n };\n\n window.history.replaceState = (...args) => {\n originalReplaceState.apply(window.history, args);\n update();\n };\n\n window.addEventListener('popstate', update);\n\n return () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', update);\n };\n});\n\nexport function connectUrl<T>(store: Store<T>, options: UrlStoreOptionsWithDefaults<T>): Cancel;\n\nexport function connectUrl<T>(store: Store<T | undefined>, options: UrlStoreOptions<T>): Cancel;\n\nexport function connectUrl<T>(\n store: Store<T>,\n {\n key,\n type = 'search',\n serialize = defaultSerializer,\n deserialize = defaultDeserializer,\n defaultValue = undefined as T,\n onCommit,\n }: UrlStoreOptions<T>,\n): Cancel {\n const serializedDefaultValue = serialize(defaultValue);\n\n const cancelUrlListener = urlStore.subscribe((_url) => {\n const url = new URL(_url);\n const parameters = new URLSearchParams(url[type].slice(1));\n const urlValue = parameters.get(key);\n\n store.set(urlValue !== null ? deserialize(urlValue) : defaultValue);\n });\n\n const cancelSubscription = store.subscribe((value) => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n const serializedValue = value !== undefined ? serialize(value) : undefined;\n\n if (serializedValue === undefined || serializedValue === serializedDefaultValue) {\n parameters.delete(key);\n } else {\n parameters.set(key, serializedValue);\n }\n\n url[type] = parameters.toString();\n\n window.history.replaceState(null, '', url.toString());\n window.dispatchEvent(new PopStateEvent('popstate'));\n\n onCommit?.(value);\n });\n\n return () => {\n cancelUrlListener();\n cancelSubscription();\n };\n}\n\nfunction defaultDeserializer(value: string): any {\n if (value === undefined) {\n return undefined;\n }\n\n try {\n return JSON.parse(value, (_k, v) => {\n if (typeof v === 'object' && v !== null && '__set' in v) {\n return new Set(v.__set);\n }\n if (typeof v === 'object' && v !== null && '__map' in v) {\n return new Map(v.__map);\n }\n return v;\n });\n } catch {\n return undefined;\n }\n}\n\nfunction defaultSerializer(value: any): string {\n return JSON.stringify(value, (_k, v) => {\n if (v instanceof Set) {\n return { __set: Array.from(v) };\n }\n if (v instanceof Map) {\n return { __map: Array.from(v) };\n }\n return v;\n });\n}\n\nexport function createUrlStore<T>(options: UrlStoreOptionsWithDefaults<T>): Store<T>;\n\nexport function createUrlStore<T>(options: UrlStoreOptions<T>): Store<T | undefined>;\n\nexport function createUrlStore<T>(options: UrlStoreOptions<T>) {\n const store = createStore(options.defaultValue, options);\n connectUrl(store, options);\n return store;\n}\n"],"names":[],"mappings":";AAmBA,MAAM,WAAW,YAAY,MAAO,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO,EAAG;AAE9F,SAAS,UAAU,MAAM;AACjB,QAAA,oBAAoB,OAAO,QAAQ;AACnC,QAAA,uBAAuB,OAAO,QAAQ;AAE5C,QAAM,SAAS,MAAM;AACV,aAAA,IAAI,OAAO,SAAS,IAAI;AAAA,EAAA;AAG5B,SAAA,QAAQ,YAAY,IAAI,SAAS;AACpB,sBAAA,MAAM,OAAO,SAAS,IAAI;AACrC;EAAA;AAGF,SAAA,QAAQ,eAAe,IAAI,SAAS;AACpB,yBAAA,MAAM,OAAO,SAAS,IAAI;AACxC;EAAA;AAGF,SAAA,iBAAiB,YAAY,MAAM;AAE1C,SAAO,MAAM;AACX,WAAO,QAAQ,YAAY;AAC3B,WAAO,QAAQ,eAAe;AACvB,WAAA,oBAAoB,YAAY,MAAM;AAAA,EAAA;AAEjD,CAAC;AAMM,SAAS,WACd,OACA;AAAA,EACE;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,eAAe;AAAA,EACf;AACF,GACQ;AACF,QAAA,yBAAyB,UAAU,YAAY;AAErD,QAAM,oBAAoB,SAAS,UAAU,CAAC,SAAS;AAC/C,UAAA,MAAM,IAAI,IAAI,IAAI;AAClB,UAAA,aAAa,IAAI,gBAAgB,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AACnD,UAAA,WAAW,WAAW,IAAI,GAAG;AAEnC,UAAM,IAAI,aAAa,OAAO,YAAY,QAAQ,IAAI,YAAY;AAAA,EAAA,CACnE;AAED,QAAM,qBAAqB,MAAM,UAAU,CAAC,UAAU;AACpD,UAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AAClC,UAAA,aAAa,IAAI,gBAAgB,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AACzD,UAAM,kBAAkB,UAAU,SAAY,UAAU,KAAK,IAAI;AAE7D,QAAA,oBAAoB,UAAa,oBAAoB,wBAAwB;AAC/E,iBAAW,OAAO,GAAG;AAAA,IAAA,OAChB;AACM,iBAAA,IAAI,KAAK,eAAe;AAAA,IACrC;AAEI,QAAA,IAAI,IAAI,WAAW,SAAS;AAEhC,WAAO,QAAQ,aAAa,MAAM,IAAI,IAAI,UAAU;AACpD,WAAO,cAAc,IAAI,cAAc,UAAU,CAAC;AAElD,yCAAW;AAAA,EAAK,CACjB;AAED,SAAO,MAAM;AACO;AACC;EAAA;AAEvB;AAEA,SAAS,oBAAoB,OAAoB;AAC/C,MAAI,UAAU,QAAW;AAChB,WAAA;AAAA,EACT;AAEI,MAAA;AACF,WAAO,KAAK,MAAM,OAAO,CAAC,IAAI,MAAM;AAClC,UAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,WAAW,GAAG;AAChD,eAAA,IAAI,IAAI,EAAE,KAAK;AAAA,MACxB;AACA,UAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,WAAW,GAAG;AAChD,eAAA,IAAI,IAAI,EAAE,KAAK;AAAA,MACxB;AACO,aAAA;AAAA,IAAA,CACR;AAAA,EAAA,QACK;AACC,WAAA;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,OAAoB;AAC7C,SAAO,KAAK,UAAU,OAAO,CAAC,IAAI,MAAM;AACtC,QAAI,aAAa,KAAK;AACpB,aAAO,EAAE,OAAO,MAAM,KAAK,CAAC,EAAE;AAAA,IAChC;AACA,QAAI,aAAa,KAAK;AACpB,aAAO,EAAE,OAAO,MAAM,KAAK,CAAC,EAAE;AAAA,IAChC;AACO,WAAA;AAAA,EAAA,CACR;AACH;AAMO,SAAS,eAAkB,SAA6B;AAC7D,QAAM,QAAQ,YAAY,QAAQ,cAAc,OAAO;AACvD,aAAW,OAAO,OAAO;AAClB,SAAA;AACT;"}
1
+ {"version":3,"file":"urlStore.mjs","sources":["../../src/core/urlStore.ts"],"sourcesContent":["import { type Cancel } from './commonTypes';\nimport { createStore, type Store, type StoreOptions } from './store';\n\nexport interface UrlStoreOptions<T> extends StoreOptions {\n key: string;\n type?: 'search' | 'hash';\n serialize?: (value: T) => string;\n deserialize?: (value: string) => T;\n defaultValue?: T;\n onCommit?: (value: T | undefined) => void;\n}\n\nexport interface UrlStoreOptionsWithDefaults<T> extends UrlStoreOptions<T> {\n defaultValue: T;\n}\n\nexport type UrlStoreOptionsRequired<T> = UrlStoreOptions<T> &\n Required<Pick<UrlStoreOptions<T>, 'type' | 'serialize' | 'deserialize' | 'defaultValue'>>;\n\nconst urlStore = createStore(() => (typeof window !== 'undefined' ? window.location.href : ''));\n\nurlStore.addEffect(() => {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n const update = () => {\n urlStore.set(window.location.href);\n };\n\n window.history.pushState = (...args) => {\n originalPushState.apply(window.history, args);\n update();\n };\n\n window.history.replaceState = (...args) => {\n originalReplaceState.apply(window.history, args);\n update();\n };\n\n window.addEventListener('popstate', update);\n\n return () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', update);\n };\n});\n\nexport function updateUrlStore() {\n urlStore.set(window.location.href);\n}\n\nexport function connectUrl<T>(store: Store<T>, options: UrlStoreOptionsWithDefaults<T>): Cancel;\n\nexport function connectUrl<T>(store: Store<T | undefined>, options: UrlStoreOptions<T>): Cancel;\n\nexport function connectUrl<T>(\n store: Store<T>,\n {\n key,\n type = 'search',\n serialize = defaultSerializer,\n deserialize = defaultDeserializer,\n defaultValue = undefined as T,\n onCommit,\n }: UrlStoreOptions<T>,\n): Cancel {\n const serializedDefaultValue = serialize(defaultValue);\n\n const cancelUrlListener = urlStore.subscribe((_url) => {\n const url = new URL(_url);\n const parameters = new URLSearchParams(url[type].slice(1));\n const urlValue = parameters.get(key);\n\n store.set(urlValue !== null ? deserialize(urlValue) : defaultValue);\n });\n\n const cancelSubscription = store.subscribe((value) => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n const serializedValue = value !== undefined ? serialize(value) : undefined;\n\n if (serializedValue === undefined || serializedValue === serializedDefaultValue) {\n parameters.delete(key);\n } else {\n parameters.set(key, serializedValue);\n }\n\n url[type] = parameters.toString();\n\n window.history.replaceState(null, '', url.toString());\n window.dispatchEvent(new PopStateEvent('popstate'));\n\n onCommit?.(value);\n });\n\n return () => {\n cancelUrlListener();\n cancelSubscription();\n };\n}\n\nfunction defaultDeserializer(value: string): any {\n if (value === undefined) {\n return undefined;\n }\n\n try {\n return JSON.parse(value, (_k, v) => {\n if (typeof v === 'object' && v !== null && '__set' in v) {\n return new Set(v.__set);\n }\n if (typeof v === 'object' && v !== null && '__map' in v) {\n return new Map(v.__map);\n }\n return v;\n });\n } catch {\n return undefined;\n }\n}\n\nfunction defaultSerializer(value: any): string {\n return JSON.stringify(value, (_k, v) => {\n if (v instanceof Set) {\n return { __set: Array.from(v) };\n }\n if (v instanceof Map) {\n return { __map: Array.from(v) };\n }\n return v;\n });\n}\n\nexport function createUrlStore<T>(options: UrlStoreOptionsWithDefaults<T>): Store<T>;\n\nexport function createUrlStore<T>(options: UrlStoreOptions<T>): Store<T | undefined>;\n\nexport function createUrlStore<T>(options: UrlStoreOptions<T>) {\n const store = createStore(options.defaultValue, options);\n connectUrl(store, options);\n return store;\n}\n"],"names":[],"mappings":"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"}
@@ -4,4 +4,4 @@ export { ResourceGroup, allResources, createResourceGroup, type Resource } from
4
4
  export { Scope, createScope } from './scope';
5
5
  export { Store, createStore, type BoundStoreMethods, type StoreMethods, type StoreOptions, type StoreOptionsWithMethods, } from './store';
6
6
  export { SubstriptionCache, createSubscriptionCache, type SubscriptionCacheFunction, type SubstriptionCacheOptions, } from './subscriptionCache';
7
- export { connectUrl, createUrlStore, type UrlStoreOptions } from './urlStore';
7
+ export { connectUrl, createUrlStore, updateUrlStore, type UrlStoreOptions } from './urlStore';
@@ -12,6 +12,7 @@ export interface UrlStoreOptionsWithDefaults<T> extends UrlStoreOptions<T> {
12
12
  defaultValue: T;
13
13
  }
14
14
  export type UrlStoreOptionsRequired<T> = UrlStoreOptions<T> & Required<Pick<UrlStoreOptions<T>, 'type' | 'serialize' | 'deserialize' | 'defaultValue'>>;
15
+ export declare function updateUrlStore(): void;
15
16
  export declare function connectUrl<T>(store: Store<T>, options: UrlStoreOptionsWithDefaults<T>): Cancel;
16
17
  export declare function connectUrl<T>(store: Store<T | undefined>, options: UrlStoreOptions<T>): Cancel;
17
18
  export declare function createUrlStore<T>(options: UrlStoreOptionsWithDefaults<T>): Store<T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cross-state",
3
- "version": "0.31.2",
3
+ "version": "0.31.5",
4
4
  "description": "(React) state library",
5
5
  "license": "ISC",
6
6
  "repository": "schummar/cross-state",