cross-state 0.50.0 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,7 +23,10 @@ class InstanceCache {
23
23
  }
24
24
  }
25
25
  get(...args) {
26
- const key = hash.simpleHash(args);
26
+ return this.getWithKey(args, args);
27
+ }
28
+ getWithKey(args, cacheKey) {
29
+ const key = hash.simpleHash(cacheKey);
27
30
  let entry = this.cache.get(key);
28
31
  let value = entry?.ref ?? entry?.weakRef?.deref();
29
32
  if (!entry || !value) {
@@ -293,9 +296,6 @@ function internalCreate(source, options) {
293
296
  let baseInstance;
294
297
  const instanceCache = new InstanceCache(
295
298
  (...args) => {
296
- if (args.length === 0 && baseInstance) {
297
- return baseInstance;
298
- }
299
299
  if (Array.isArray(source)) {
300
300
  const [cache, selector] = source;
301
301
  return mapValue(cache(...args), selector, get);
@@ -320,25 +320,34 @@ function internalCreate(source, options) {
320
320
  if (sliceAfter !== -1) {
321
321
  args = args.slice(0, sliceAfter);
322
322
  }
323
- return instanceCache.get(...args);
323
+ const cacheKey = options?.getCacheKey ? options.getCacheKey(...args) : args;
324
+ return instanceCache.getWithKey(args, cacheKey);
324
325
  }
325
326
  const mapCache = (selector) => {
326
327
  return internalCreate([baseInstance, selector]);
327
328
  };
328
- const invalidateAll = () => {
329
+ const invalidateAll = ({ filter = () => true } = {}) => {
329
330
  for (const instance of instanceCache.values()) {
330
- instance.invalidate();
331
+ if (filter(instance)) {
332
+ instance.invalidate();
333
+ }
331
334
  }
332
335
  };
333
- const clearAll = () => {
336
+ const clearAll = ({ filter = () => true } = {}) => {
334
337
  for (const instance of instanceCache.values()) {
335
- instance.clear();
338
+ if (filter(instance)) {
339
+ instance.clear();
340
+ }
336
341
  }
337
342
  };
343
+ const getInstances = () => {
344
+ return instanceCache.values();
345
+ };
338
346
  baseInstance = Object.assign(get(...[]), {
339
347
  mapCache,
340
348
  invalidateAll,
341
- clearAll
349
+ clearAll,
350
+ getInstances
342
351
  });
343
352
  const groups = Array.isArray(resourceGroup) ? resourceGroup : resourceGroup ? [resourceGroup] : [];
344
353
  for (const group of groups.concat(allResources)) {
@@ -349,7 +358,6 @@ function internalCreate(source, options) {
349
358
  const createCache = /* @__PURE__ */ Object.assign(create, {
350
359
  defaultOptions: {
351
360
  invalidateOnWindowFocus: true,
352
- invalidateOnActivation: true,
353
361
  clearUnusedAfter: { days: 1 },
354
362
  retain: { milliseconds: 1 },
355
363
  equals: propAccess.deepEqual
@@ -1 +1 @@
1
- {"version":3,"file":"scope.cjs","sources":["../../src/lib/instanceCache.ts","../../src/core/resourceGroup.ts","../../src/core/cache.ts","../../src/core/scope.ts"],"sourcesContent":["import { simpleHash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(\n public readonly factory: (...args: Args) => T,\n public readonly cacheTime?: number,\n ) {}\n\n cleanup(): void {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args): T {\n const key = simpleHash(args);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values(): T[] {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats(): { count: number; withRef: number; withWeakRef: number } {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n autobind(ResourceGroup);\n }\n\n add(resource: Resource): void {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource): void {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources: ResourceGroup = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string): ResourceGroup {\n return new ResourceGroup(name);\n}\n","import { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue } from '@lib/calculatedValue';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual } from '@lib/equals';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { AnyPath, Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Duration, Selector } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore, type Calculate, type StoreOptions } from './store';\n\nexport interface CacheGetOptions {\n update?: 'whenMissing' | 'whenStale' | 'force';\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (...args: Args): Promise<T> | Calculate<Promise<T>>;\n}\n\nexport interface CacheOptions<T> extends StoreOptions<Promise<T>> {\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n invalidateOnWindowFocus?: boolean;\n invalidateOnActivation?: boolean;\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state: Store<CacheState<T>> = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: Calculate<Promise<T>>,\n public readonly options: CacheOptions<T> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | AnyPath)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(getter, options, undefined, _call);\n autobind(Cache);\n\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}): Promise<T> {\n this.calculatedValue?.check();\n const promise = this.calculatedValue?.value;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return this.calculatedValue.value;\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T> | ((value: T | undefined) => T)): void {\n if (value instanceof Function) {\n value = value(this.state.get().value);\n }\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown): void {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate(recursive?: boolean): void {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear(recursive);\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this.calculatedValue?.value;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.invalidate(recursive);\n }\n\n clear(recursive?: boolean): void {\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n delete this.stalePromise;\n\n super.invalidate(recursive);\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<const P extends AnyPath>(selector: P extends Path<T> ? P : Path<T>): Cache<Value<T, P>>;\n\n mapValue(selector: Selector<any, any> | AnyPath) {\n return mapValue(this, selector);\n }\n\n protected watchPromise(): void {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState && promise.state.status !== 'pending') {\n promise.catch(() => undefined);\n\n this.state.set((state) => ({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers(): void {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus(): void {\n const { invalidateOnWindowFocus } = this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden && !that.state.get().isConnected) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\nfunction mapValue<T, S>(cache: Cache<T>, _selector: Selector<T, S> | AnyPath, get?: any): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,\n selectors: cache.derivedFromCache\n ? [...cache.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(cache);\n return selector(value);\n },\n {\n equals: cache.options.equals,\n },\n derivedFromCache,\n get,\n );\n}\n\nexport type CreateCacheResult<T, Args extends any[]> = [] extends Args\n ? CacheBundle<T, Args> & Cache<T>\n : CacheBundle<T, Args>;\n\nexport type CacheBundle<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;\n invalidateAll: () => void;\n clearAll: () => void;\n};\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateCacheResult<T, Args> {\n return internalCreate<T, Args>(cacheFunction, options);\n}\n\nfunction internalCreate<T, Args extends any[] = []>(\n source:\n | CacheFunction<T, Args>\n | [cache: CacheBundle<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T>,\n): CreateCacheResult<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CacheBundle<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n if (Array.isArray(source)) {\n const [cache, selector] = source;\n return mapValue(cache(...args), selector, get);\n }\n\n return new Cache(\n (helpers) => {\n const result = source.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n args.length === 0 ? get : undefined,\n );\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n function get(...args: Args) {\n const sliceAfter = args.lastIndexOf(undefined);\n if (sliceAfter !== -1) {\n args = args.slice(0, sliceAfter) as Args;\n }\n\n return instanceCache.get(...args);\n }\n\n const mapCache = (selector: any) => {\n return internalCreate([baseInstance, selector]);\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(get(...([] as unknown as Args)), {\n mapCache,\n invalidateAll,\n clearAll,\n }) as CacheBundle<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n return baseInstance;\n}\n\nexport const createCache: typeof create & { defaultOptions: CacheOptions<any> } =\n /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n invalidateOnActivation: true,\n clearUnusedAfter: { days: 1 },\n retain: { milliseconds: 1 },\n equals: deepEqual,\n } as CacheOptions<any>,\n });\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":["simpleHash","autobind","Store","createStore","calculatedValue","PromiseWithState","calcDuration","makeSelector","deepEqual"],"mappings":"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"}
1
+ {"version":3,"file":"scope.cjs","sources":["../../src/lib/instanceCache.ts","../../src/core/resourceGroup.ts","../../src/core/cache.ts","../../src/core/scope.ts"],"sourcesContent":["import { simpleHash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(\n public readonly factory: (...args: Args) => T,\n public readonly cacheTime?: number,\n ) {}\n\n cleanup(): void {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args): T {\n return this.getWithKey(args, args);\n }\n\n getWithKey(args: Args, cacheKey: unknown): T {\n const key = simpleHash(cacheKey);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values(): T[] {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats(): { count: number; withRef: number; withWeakRef: number } {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n autobind(ResourceGroup);\n }\n\n add(resource: Resource): void {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource): void {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources: ResourceGroup = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string): ResourceGroup {\n return new ResourceGroup(name);\n}\n","import { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue } from '@lib/calculatedValue';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual } from '@lib/equals';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { AnyPath, Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Duration, Selector } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore, type Calculate, type StoreOptions } from './store';\n\nexport interface CacheGetOptions {\n /**\n * How to handle the cache when getting the value.\n * - `whenMissing`: Only fetch a new value if there is no cached value.\n * - `whenStale`: Fetch a new value if there is no cached value or if the cached value is stale.\n * - `force`: Always fetch a new value, regardless of the cache state.\n */\n update?: 'whenMissing' | 'whenStale' | 'force';\n\n /**\n * If set to `true`, the cache will be updated in the background.\n * This means that a stale value will be returned immediately, if available, while the new value is being fetched.\n */\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (...args: Args): Promise<T> | Calculate<Promise<T>>;\n}\n\nexport interface CacheOptions<T, Args extends any[]> extends StoreOptions<Promise<T>> {\n /**\n * How long to keep the cache entry before it is considered stale.\n * If set to `undefined` or `null`, the cache entry will never be invalidated automatically.\n *\n * @example\n * ```typescript\n * createCache(fetchData, {\n * invalidateAfter: { seconds: 10 },\n * });\n * ```\n */\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n\n /**\n * If set, the cache will be invalidated when the window gets focused.\n * This is useful for caches that are used in a browser environment and might become stale when the user switches tabs.\n */\n invalidateOnWindowFocus?: boolean;\n\n /**\n * If set, the cached value will be cleared when the cache is invalidated.\n * Without this option, the cache will keep the last value as stale until a new value becomes available.\n */\n clearOnInvalidate?: boolean;\n\n /**\n * If set, cache entries will be cleared after approximately the specified duration.\n * This is useful for long lived pages or applications and helps to prevent memory leaks.\n * The exact time when the entry is cleared is not guaranteed, since it will be cleared during garbage collection.\n */\n clearUnusedAfter?: Duration | null;\n\n /**\n * Add the cache to the specified resource group(s).\n * This allows you to invalidate or clear multiple caches that belong to the same group.\n * All caches are always added to the `allResources` group.\n */\n resourceGroup?: ResourceGroup | ResourceGroup[];\n\n /**\n * Function to generate a custom cache key based on the provided arguments.\n * This allows you to control how cache entries are identified and reused.\n * By default, the arguments array is used as the cache key.\n *\n * @example\n * ```typescript\n * // Will use the same instance when provided with `undefined`, `{ num: 0 }`, `{ bool: false }`, etc.\n * createCache((filter?: { num?: number, bool?: boolean }) => fetchData(filter), {\n * getCacheKey: (filter?) => ({\n * num: filter?.num ?? 0,\n * bool: filter?.bool ?? false,\n * }),\n * });\n * ```\n */\n getCacheKey?: (...args: NoInfer<Args>) => unknown;\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state: Store<CacheState<T>> = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: Calculate<Promise<T>>,\n public readonly options: CacheOptions<T, any> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | AnyPath)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(getter, options, undefined, _call);\n autobind(Cache);\n\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}): Promise<T> {\n this.calculatedValue?.check();\n const promise = this.calculatedValue?.value;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return this.calculatedValue.value;\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T> | ((value: T | undefined) => T)): void {\n if (value instanceof Function) {\n value = value(this.state.get().value);\n }\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown): void {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate(recursive?: boolean): void {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear(recursive);\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this.calculatedValue?.value;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.invalidate(recursive);\n }\n\n clear(recursive?: boolean): void {\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n delete this.stalePromise;\n\n super.invalidate(recursive);\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<const P extends AnyPath>(selector: P extends Path<T> ? P : Path<T>): Cache<Value<T, P>>;\n\n mapValue(selector: Selector<any, any> | AnyPath) {\n return mapValue(this, selector);\n }\n\n protected watchPromise(): void {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState && promise.state.status !== 'pending') {\n promise.catch(() => undefined);\n\n this.state.set((state) => ({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers(): void {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus(): void {\n const { invalidateOnWindowFocus } = this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden && !that.state.get().isConnected) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\nfunction mapValue<T, S>(cache: Cache<T>, _selector: Selector<T, S> | AnyPath, get?: any): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,\n selectors: cache.derivedFromCache\n ? [...cache.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(cache);\n return selector(value);\n },\n {\n equals: cache.options.equals,\n },\n derivedFromCache,\n get,\n );\n}\n\nexport type CreateCacheResult<T, Args extends any[]> = [] extends Args\n ? CacheBundle<T, Args> & Cache<T>\n : CacheBundle<T, Args>;\n\nexport interface InvalidationOptions<T> {\n filter?: (cache: Cache<T>) => boolean;\n}\n\nexport type CacheBundle<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;\n invalidateAll: (options?: InvalidationOptions<T>) => void;\n clearAll: (options?: InvalidationOptions<T>) => void;\n getInstances: () => Cache<T>[];\n};\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T, Args>,\n): CreateCacheResult<T, Args> {\n return internalCreate<T, Args>(cacheFunction, options);\n}\n\nfunction internalCreate<T, Args extends any[] = []>(\n source:\n | CacheFunction<T, Args>\n | [cache: CacheBundle<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T, Args>,\n): CreateCacheResult<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CacheBundle<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (Array.isArray(source)) {\n const [cache, selector] = source;\n return mapValue(cache(...args), selector, get);\n }\n\n return new Cache(\n (helpers) => {\n const result = source.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n args.length === 0 ? get : undefined,\n );\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n function get(...args: Args) {\n const sliceAfter = args.lastIndexOf(undefined);\n if (sliceAfter !== -1) {\n args = args.slice(0, sliceAfter) as Args;\n }\n\n const cacheKey = options?.getCacheKey ? options.getCacheKey(...args) : args;\n return instanceCache.getWithKey(args, cacheKey);\n }\n\n const mapCache = (selector: any) => {\n return internalCreate([baseInstance, selector]);\n };\n\n const invalidateAll = ({ filter = () => true }: InvalidationOptions<T> = {}) => {\n for (const instance of instanceCache.values()) {\n if (filter(instance)) {\n instance.invalidate();\n }\n }\n };\n\n const clearAll = ({ filter = () => true }: InvalidationOptions<T> = {}) => {\n for (const instance of instanceCache.values()) {\n if (filter(instance)) {\n instance.clear();\n }\n }\n };\n\n const getInstances = () => {\n return instanceCache.values();\n };\n\n baseInstance = Object.assign(get(...([] as unknown as Args)), {\n mapCache,\n invalidateAll,\n clearAll,\n getInstances,\n }) as CacheBundle<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n return baseInstance;\n}\n\nexport const createCache: typeof create & { defaultOptions: CacheOptions<any, any> } =\n /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n clearUnusedAfter: { days: 1 },\n retain: { milliseconds: 1 },\n equals: deepEqual,\n } as CacheOptions<any, any>,\n });\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":["simpleHash","autobind","Store","createStore","calculatedValue","PromiseWithState","calcDuration","makeSelector","deepEqual"],"mappings":"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"}
package/dist/es/scope.mjs CHANGED
@@ -21,7 +21,10 @@ class InstanceCache {
21
21
  }
22
22
  }
23
23
  get(...args) {
24
- const key = simpleHash(args);
24
+ return this.getWithKey(args, args);
25
+ }
26
+ getWithKey(args, cacheKey) {
27
+ const key = simpleHash(cacheKey);
25
28
  let entry = this.cache.get(key);
26
29
  let value = entry?.ref ?? entry?.weakRef?.deref();
27
30
  if (!entry || !value) {
@@ -291,9 +294,6 @@ function internalCreate(source, options) {
291
294
  let baseInstance;
292
295
  const instanceCache = new InstanceCache(
293
296
  (...args) => {
294
- if (args.length === 0 && baseInstance) {
295
- return baseInstance;
296
- }
297
297
  if (Array.isArray(source)) {
298
298
  const [cache, selector] = source;
299
299
  return mapValue(cache(...args), selector, get);
@@ -318,25 +318,34 @@ function internalCreate(source, options) {
318
318
  if (sliceAfter !== -1) {
319
319
  args = args.slice(0, sliceAfter);
320
320
  }
321
- return instanceCache.get(...args);
321
+ const cacheKey = options?.getCacheKey ? options.getCacheKey(...args) : args;
322
+ return instanceCache.getWithKey(args, cacheKey);
322
323
  }
323
324
  const mapCache = (selector) => {
324
325
  return internalCreate([baseInstance, selector]);
325
326
  };
326
- const invalidateAll = () => {
327
+ const invalidateAll = ({ filter = () => true } = {}) => {
327
328
  for (const instance of instanceCache.values()) {
328
- instance.invalidate();
329
+ if (filter(instance)) {
330
+ instance.invalidate();
331
+ }
329
332
  }
330
333
  };
331
- const clearAll = () => {
334
+ const clearAll = ({ filter = () => true } = {}) => {
332
335
  for (const instance of instanceCache.values()) {
333
- instance.clear();
336
+ if (filter(instance)) {
337
+ instance.clear();
338
+ }
334
339
  }
335
340
  };
341
+ const getInstances = () => {
342
+ return instanceCache.values();
343
+ };
336
344
  baseInstance = Object.assign(get(...[]), {
337
345
  mapCache,
338
346
  invalidateAll,
339
- clearAll
347
+ clearAll,
348
+ getInstances
340
349
  });
341
350
  const groups = Array.isArray(resourceGroup) ? resourceGroup : resourceGroup ? [resourceGroup] : [];
342
351
  for (const group of groups.concat(allResources)) {
@@ -347,7 +356,6 @@ function internalCreate(source, options) {
347
356
  const createCache = /* @__PURE__ */ Object.assign(create, {
348
357
  defaultOptions: {
349
358
  invalidateOnWindowFocus: true,
350
- invalidateOnActivation: true,
351
359
  clearUnusedAfter: { days: 1 },
352
360
  retain: { milliseconds: 1 },
353
361
  equals: deepEqual
@@ -1 +1 @@
1
- {"version":3,"file":"scope.mjs","sources":["../../src/lib/instanceCache.ts","../../src/core/resourceGroup.ts","../../src/core/cache.ts","../../src/core/scope.ts"],"sourcesContent":["import { simpleHash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(\n public readonly factory: (...args: Args) => T,\n public readonly cacheTime?: number,\n ) {}\n\n cleanup(): void {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args): T {\n const key = simpleHash(args);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values(): T[] {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats(): { count: number; withRef: number; withWeakRef: number } {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n autobind(ResourceGroup);\n }\n\n add(resource: Resource): void {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource): void {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources: ResourceGroup = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string): ResourceGroup {\n return new ResourceGroup(name);\n}\n","import { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue } from '@lib/calculatedValue';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual } from '@lib/equals';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { AnyPath, Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Duration, Selector } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore, type Calculate, type StoreOptions } from './store';\n\nexport interface CacheGetOptions {\n update?: 'whenMissing' | 'whenStale' | 'force';\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (...args: Args): Promise<T> | Calculate<Promise<T>>;\n}\n\nexport interface CacheOptions<T> extends StoreOptions<Promise<T>> {\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n invalidateOnWindowFocus?: boolean;\n invalidateOnActivation?: boolean;\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state: Store<CacheState<T>> = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: Calculate<Promise<T>>,\n public readonly options: CacheOptions<T> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | AnyPath)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(getter, options, undefined, _call);\n autobind(Cache);\n\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}): Promise<T> {\n this.calculatedValue?.check();\n const promise = this.calculatedValue?.value;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return this.calculatedValue.value;\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T> | ((value: T | undefined) => T)): void {\n if (value instanceof Function) {\n value = value(this.state.get().value);\n }\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown): void {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate(recursive?: boolean): void {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear(recursive);\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this.calculatedValue?.value;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.invalidate(recursive);\n }\n\n clear(recursive?: boolean): void {\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n delete this.stalePromise;\n\n super.invalidate(recursive);\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<const P extends AnyPath>(selector: P extends Path<T> ? P : Path<T>): Cache<Value<T, P>>;\n\n mapValue(selector: Selector<any, any> | AnyPath) {\n return mapValue(this, selector);\n }\n\n protected watchPromise(): void {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState && promise.state.status !== 'pending') {\n promise.catch(() => undefined);\n\n this.state.set((state) => ({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers(): void {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus(): void {\n const { invalidateOnWindowFocus } = this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden && !that.state.get().isConnected) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\nfunction mapValue<T, S>(cache: Cache<T>, _selector: Selector<T, S> | AnyPath, get?: any): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,\n selectors: cache.derivedFromCache\n ? [...cache.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(cache);\n return selector(value);\n },\n {\n equals: cache.options.equals,\n },\n derivedFromCache,\n get,\n );\n}\n\nexport type CreateCacheResult<T, Args extends any[]> = [] extends Args\n ? CacheBundle<T, Args> & Cache<T>\n : CacheBundle<T, Args>;\n\nexport type CacheBundle<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;\n invalidateAll: () => void;\n clearAll: () => void;\n};\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateCacheResult<T, Args> {\n return internalCreate<T, Args>(cacheFunction, options);\n}\n\nfunction internalCreate<T, Args extends any[] = []>(\n source:\n | CacheFunction<T, Args>\n | [cache: CacheBundle<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T>,\n): CreateCacheResult<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CacheBundle<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n if (Array.isArray(source)) {\n const [cache, selector] = source;\n return mapValue(cache(...args), selector, get);\n }\n\n return new Cache(\n (helpers) => {\n const result = source.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n args.length === 0 ? get : undefined,\n );\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n function get(...args: Args) {\n const sliceAfter = args.lastIndexOf(undefined);\n if (sliceAfter !== -1) {\n args = args.slice(0, sliceAfter) as Args;\n }\n\n return instanceCache.get(...args);\n }\n\n const mapCache = (selector: any) => {\n return internalCreate([baseInstance, selector]);\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(get(...([] as unknown as Args)), {\n mapCache,\n invalidateAll,\n clearAll,\n }) as CacheBundle<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n return baseInstance;\n}\n\nexport const createCache: typeof create & { defaultOptions: CacheOptions<any> } =\n /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n invalidateOnActivation: true,\n clearUnusedAfter: { days: 1 },\n retain: { milliseconds: 1 },\n equals: deepEqual,\n } as CacheOptions<any>,\n });\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scope.mjs","sources":["../../src/lib/instanceCache.ts","../../src/core/resourceGroup.ts","../../src/core/cache.ts","../../src/core/scope.ts"],"sourcesContent":["import { simpleHash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(\n public readonly factory: (...args: Args) => T,\n public readonly cacheTime?: number,\n ) {}\n\n cleanup(): void {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args): T {\n return this.getWithKey(args, args);\n }\n\n getWithKey(args: Args, cacheKey: unknown): T {\n const key = simpleHash(cacheKey);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values(): T[] {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats(): { count: number; withRef: number; withWeakRef: number } {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n autobind(ResourceGroup);\n }\n\n add(resource: Resource): void {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource): void {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll(): void {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources: ResourceGroup = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string): ResourceGroup {\n return new ResourceGroup(name);\n}\n","import { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue } from '@lib/calculatedValue';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual } from '@lib/equals';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { AnyPath, Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\nimport type { Duration, Selector } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore, type Calculate, type StoreOptions } from './store';\n\nexport interface CacheGetOptions {\n /**\n * How to handle the cache when getting the value.\n * - `whenMissing`: Only fetch a new value if there is no cached value.\n * - `whenStale`: Fetch a new value if there is no cached value or if the cached value is stale.\n * - `force`: Always fetch a new value, regardless of the cache state.\n */\n update?: 'whenMissing' | 'whenStale' | 'force';\n\n /**\n * If set to `true`, the cache will be updated in the background.\n * This means that a stale value will be returned immediately, if available, while the new value is being fetched.\n */\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (...args: Args): Promise<T> | Calculate<Promise<T>>;\n}\n\nexport interface CacheOptions<T, Args extends any[]> extends StoreOptions<Promise<T>> {\n /**\n * How long to keep the cache entry before it is considered stale.\n * If set to `undefined` or `null`, the cache entry will never be invalidated automatically.\n *\n * @example\n * ```typescript\n * createCache(fetchData, {\n * invalidateAfter: { seconds: 10 },\n * });\n * ```\n */\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n\n /**\n * If set, the cache will be invalidated when the window gets focused.\n * This is useful for caches that are used in a browser environment and might become stale when the user switches tabs.\n */\n invalidateOnWindowFocus?: boolean;\n\n /**\n * If set, the cached value will be cleared when the cache is invalidated.\n * Without this option, the cache will keep the last value as stale until a new value becomes available.\n */\n clearOnInvalidate?: boolean;\n\n /**\n * If set, cache entries will be cleared after approximately the specified duration.\n * This is useful for long lived pages or applications and helps to prevent memory leaks.\n * The exact time when the entry is cleared is not guaranteed, since it will be cleared during garbage collection.\n */\n clearUnusedAfter?: Duration | null;\n\n /**\n * Add the cache to the specified resource group(s).\n * This allows you to invalidate or clear multiple caches that belong to the same group.\n * All caches are always added to the `allResources` group.\n */\n resourceGroup?: ResourceGroup | ResourceGroup[];\n\n /**\n * Function to generate a custom cache key based on the provided arguments.\n * This allows you to control how cache entries are identified and reused.\n * By default, the arguments array is used as the cache key.\n *\n * @example\n * ```typescript\n * // Will use the same instance when provided with `undefined`, `{ num: 0 }`, `{ bool: false }`, etc.\n * createCache((filter?: { num?: number, bool?: boolean }) => fetchData(filter), {\n * getCacheKey: (filter?) => ({\n * num: filter?.num ?? 0,\n * bool: filter?.bool ?? false,\n * }),\n * });\n * ```\n */\n getCacheKey?: (...args: NoInfer<Args>) => unknown;\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state: Store<CacheState<T>> = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: Calculate<Promise<T>>,\n public readonly options: CacheOptions<T, any> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | AnyPath)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(getter, options, undefined, _call);\n autobind(Cache);\n\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}): Promise<T> {\n this.calculatedValue?.check();\n const promise = this.calculatedValue?.value;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return this.calculatedValue.value;\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T> | ((value: T | undefined) => T)): void {\n if (value instanceof Function) {\n value = value(this.state.get().value);\n }\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown): void {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate(recursive?: boolean): void {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear(recursive);\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this.calculatedValue?.value;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.invalidate(recursive);\n }\n\n clear(recursive?: boolean): void {\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n delete this.stalePromise;\n\n super.invalidate(recursive);\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<const P extends AnyPath>(selector: P extends Path<T> ? P : Path<T>): Cache<Value<T, P>>;\n\n mapValue(selector: Selector<any, any> | AnyPath) {\n return mapValue(this, selector);\n }\n\n protected watchPromise(): void {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState && promise.state.status !== 'pending') {\n promise.catch(() => undefined);\n\n this.state.set((state) => ({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers(): void {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus(): void {\n const { invalidateOnWindowFocus } = this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden && !that.state.get().isConnected) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\nfunction mapValue<T, S>(cache: Cache<T>, _selector: Selector<T, S> | AnyPath, get?: any): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: cache.derivedFromCache ? cache.derivedFromCache.cache : cache,\n selectors: cache.derivedFromCache\n ? [...cache.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n\n return new Cache(\n async ({ use }) => {\n const value = await use(cache);\n return selector(value);\n },\n {\n equals: cache.options.equals,\n },\n derivedFromCache,\n get,\n );\n}\n\nexport type CreateCacheResult<T, Args extends any[]> = [] extends Args\n ? CacheBundle<T, Args> & Cache<T>\n : CacheBundle<T, Args>;\n\nexport interface InvalidationOptions<T> {\n filter?: (cache: Cache<T>) => boolean;\n}\n\nexport type CacheBundle<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;\n mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;\n invalidateAll: (options?: InvalidationOptions<T>) => void;\n clearAll: (options?: InvalidationOptions<T>) => void;\n getInstances: () => Cache<T>[];\n};\n\nfunction create<T, Args extends any[] = []>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T, Args>,\n): CreateCacheResult<T, Args> {\n return internalCreate<T, Args>(cacheFunction, options);\n}\n\nfunction internalCreate<T, Args extends any[] = []>(\n source:\n | CacheFunction<T, Args>\n | [cache: CacheBundle<any, Args>, selector: Selector<any, T> | AnyPath],\n options?: CacheOptions<T, Args>,\n): CreateCacheResult<T, Args> {\n options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = options ?? {};\n\n let baseInstance: CacheBundle<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (Array.isArray(source)) {\n const [cache, selector] = source;\n return mapValue(cache(...args), selector, get);\n }\n\n return new Cache(\n (helpers) => {\n const result = source.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\n },\n options,\n undefined,\n args.length === 0 ? get : undefined,\n );\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n function get(...args: Args) {\n const sliceAfter = args.lastIndexOf(undefined);\n if (sliceAfter !== -1) {\n args = args.slice(0, sliceAfter) as Args;\n }\n\n const cacheKey = options?.getCacheKey ? options.getCacheKey(...args) : args;\n return instanceCache.getWithKey(args, cacheKey);\n }\n\n const mapCache = (selector: any) => {\n return internalCreate([baseInstance, selector]);\n };\n\n const invalidateAll = ({ filter = () => true }: InvalidationOptions<T> = {}) => {\n for (const instance of instanceCache.values()) {\n if (filter(instance)) {\n instance.invalidate();\n }\n }\n };\n\n const clearAll = ({ filter = () => true }: InvalidationOptions<T> = {}) => {\n for (const instance of instanceCache.values()) {\n if (filter(instance)) {\n instance.clear();\n }\n }\n };\n\n const getInstances = () => {\n return instanceCache.values();\n };\n\n baseInstance = Object.assign(get(...([] as unknown as Args)), {\n mapCache,\n invalidateAll,\n clearAll,\n getInstances,\n }) as CacheBundle<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n return baseInstance;\n}\n\nexport const createCache: typeof create & { defaultOptions: CacheOptions<any, any> } =\n /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n clearUnusedAfter: { days: 1 },\n retain: { milliseconds: 1 },\n equals: deepEqual,\n } as CacheOptions<any, any>,\n });\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":[],"mappings":"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"}
@@ -6,22 +6,77 @@ import type { Duration, Selector } from './commonTypes';
6
6
  import { type ResourceGroup } from './resourceGroup';
7
7
  import { Store, type Calculate, type StoreOptions } from './store';
8
8
  export interface CacheGetOptions {
9
+ /**
10
+ * How to handle the cache when getting the value.
11
+ * - `whenMissing`: Only fetch a new value if there is no cached value.
12
+ * - `whenStale`: Fetch a new value if there is no cached value or if the cached value is stale.
13
+ * - `force`: Always fetch a new value, regardless of the cache state.
14
+ */
9
15
  update?: 'whenMissing' | 'whenStale' | 'force';
16
+ /**
17
+ * If set to `true`, the cache will be updated in the background.
18
+ * This means that a stale value will be returned immediately, if available, while the new value is being fetched.
19
+ */
10
20
  backgroundUpdate?: boolean;
11
21
  }
12
22
  export interface CacheFunction<T, Args extends any[] = []> {
13
23
  (...args: Args): Promise<T> | Calculate<Promise<T>>;
14
24
  }
15
- export interface CacheOptions<T> extends StoreOptions<Promise<T>> {
25
+ export interface CacheOptions<T, Args extends any[]> extends StoreOptions<Promise<T>> {
26
+ /**
27
+ * How long to keep the cache entry before it is considered stale.
28
+ * If set to `undefined` or `null`, the cache entry will never be invalidated automatically.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * createCache(fetchData, {
33
+ * invalidateAfter: { seconds: 10 },
34
+ * });
35
+ * ```
36
+ */
16
37
  invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;
38
+ /**
39
+ * If set, the cache will be invalidated when the window gets focused.
40
+ * This is useful for caches that are used in a browser environment and might become stale when the user switches tabs.
41
+ */
17
42
  invalidateOnWindowFocus?: boolean;
18
- invalidateOnActivation?: boolean;
43
+ /**
44
+ * If set, the cached value will be cleared when the cache is invalidated.
45
+ * Without this option, the cache will keep the last value as stale until a new value becomes available.
46
+ */
19
47
  clearOnInvalidate?: boolean;
48
+ /**
49
+ * If set, cache entries will be cleared after approximately the specified duration.
50
+ * This is useful for long lived pages or applications and helps to prevent memory leaks.
51
+ * The exact time when the entry is cleared is not guaranteed, since it will be cleared during garbage collection.
52
+ */
20
53
  clearUnusedAfter?: Duration | null;
54
+ /**
55
+ * Add the cache to the specified resource group(s).
56
+ * This allows you to invalidate or clear multiple caches that belong to the same group.
57
+ * All caches are always added to the `allResources` group.
58
+ */
21
59
  resourceGroup?: ResourceGroup | ResourceGroup[];
60
+ /**
61
+ * Function to generate a custom cache key based on the provided arguments.
62
+ * This allows you to control how cache entries are identified and reused.
63
+ * By default, the arguments array is used as the cache key.
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * // Will use the same instance when provided with `undefined`, `{ num: 0 }`, `{ bool: false }`, etc.
68
+ * createCache((filter?: { num?: number, bool?: boolean }) => fetchData(filter), {
69
+ * getCacheKey: (filter?) => ({
70
+ * num: filter?.num ?? 0,
71
+ * bool: filter?.bool ?? false,
72
+ * }),
73
+ * });
74
+ * ```
75
+ */
76
+ getCacheKey?: (...args: NoInfer<Args>) => unknown;
22
77
  }
23
78
  export declare class Cache<T> extends Store<Promise<T>> {
24
- readonly options: CacheOptions<T>;
79
+ readonly options: CacheOptions<T, any>;
25
80
  readonly derivedFromCache?: {
26
81
  cache: Cache<any>;
27
82
  selectors: (Selector<any, any> | AnyPath)[];
@@ -29,7 +84,7 @@ export declare class Cache<T> extends Store<Promise<T>> {
29
84
  readonly state: Store<CacheState<T>>;
30
85
  protected stalePromise?: Promise<T>;
31
86
  protected invalidationTimer?: ReturnType<typeof setTimeout>;
32
- constructor(getter: Calculate<Promise<T>>, options?: CacheOptions<T>, derivedFromCache?: {
87
+ constructor(getter: Calculate<Promise<T>>, options?: CacheOptions<T, any>, derivedFromCache?: {
33
88
  cache: Cache<any>;
34
89
  selectors: (Selector<any, any> | AnyPath)[];
35
90
  } | undefined, _call?: (...args: any[]) => any);
@@ -45,15 +100,19 @@ export declare class Cache<T> extends Store<Promise<T>> {
45
100
  protected watchFocus(): void;
46
101
  }
47
102
  export type CreateCacheResult<T, Args extends any[]> = [] extends Args ? CacheBundle<T, Args> & Cache<T> : CacheBundle<T, Args>;
103
+ export interface InvalidationOptions<T> {
104
+ filter?: (cache: Cache<T>) => boolean;
105
+ }
48
106
  export type CacheBundle<T, Args extends any[]> = {
49
107
  (...args: Args): Cache<T>;
50
108
  mapCache<S>(selector: Selector<T, S>): CreateCacheResult<S, Args>;
51
109
  mapValue<const P>(selector: Constrain<P, Path<T>>): CreateCacheResult<Value<T, P>, Args>;
52
- invalidateAll: () => void;
53
- clearAll: () => void;
110
+ invalidateAll: (options?: InvalidationOptions<T>) => void;
111
+ clearAll: (options?: InvalidationOptions<T>) => void;
112
+ getInstances: () => Cache<T>[];
54
113
  };
55
- declare function create<T, Args extends any[] = []>(cacheFunction: CacheFunction<T, Args>, options?: CacheOptions<T>): CreateCacheResult<T, Args>;
114
+ declare function create<T, Args extends any[] = []>(cacheFunction: CacheFunction<T, Args>, options?: CacheOptions<T, Args>): CreateCacheResult<T, Args>;
56
115
  export declare const createCache: typeof create & {
57
- defaultOptions: CacheOptions<any>;
116
+ defaultOptions: CacheOptions<any, any>;
58
117
  };
59
118
  export {};
@@ -6,6 +6,7 @@ export declare class InstanceCache<Args extends any[], T extends object> {
6
6
  constructor(factory: (...args: Args) => T, cacheTime?: number | undefined);
7
7
  cleanup(): void;
8
8
  get(...args: Args): T;
9
+ getWithKey(args: Args, cacheKey: unknown): T;
9
10
  values(): T[];
10
11
  stop(): void;
11
12
  stats(): {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cross-state",
3
- "version": "0.50.0",
3
+ "version": "0.52.0",
4
4
  "description": "(React) state library",
5
5
  "license": "ISC",
6
6
  "repository": "schummar/cross-state",
@@ -208,7 +208,7 @@
208
208
  "name": "core: InstanceCache",
209
209
  "path": "dist/es/index.mjs",
210
210
  "import": "{InstanceCache}",
211
- "limit": "603 B"
211
+ "limit": "610 B"
212
212
  },
213
213
  {
214
214
  "name": "core: calcDuration",