@nano_kit/query 1.0.0-alpha.2 → 1.0.0-alpha.4

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.
@@ -1,11 +1,11 @@
1
- import { type ReadableSignal, type TasksRunner, type Task } from '@nano_kit/store';
1
+ import { type ReadableSignal, type Accessor, type TasksRunner, type Task } from '@nano_kit/store';
2
2
  import type { ClientSetting } from './client.types.js';
3
3
  import type { RequestContext } from './RequestContext.js';
4
4
  import { type CacheKey, type CacheEntry, CacheStorage } from './CacheStorage.js';
5
5
  export type OnEveryError = (error: unknown, stopped: boolean) => void;
6
6
  export declare class ClientContext<T = unknown> extends CacheStorage {
7
7
  $key?: ReadableSignal<CacheKey>;
8
- $disabled?: ReadableSignal<boolean>;
8
+ $disabled?: Accessor<boolean>;
9
9
  loadingDedupe: boolean;
10
10
  timeDedupe: boolean;
11
11
  onEveryError: OnEveryError | undefined;
@@ -15,7 +15,7 @@ export declare class ClientContext<T = unknown> extends CacheStorage {
15
15
  mapError(error: unknown): string;
16
16
  mounted(): void;
17
17
  mute(entry: CacheEntry): boolean;
18
- run(requestCtx: RequestContext<T>, start: () => Promise<T>, onSettled: (data: T | null, error: string | null) => void, interrupt?: (error: unknown) => boolean): Promise<readonly [T | undefined, unknown] | undefined>;
18
+ run(requestCtx: RequestContext<T>, start: () => Promise<T>, onSettled: (data: T | null, error: string | null) => void, interrupt?: (error: unknown) => boolean): Promise<readonly [T, unknown] | undefined>;
19
19
  handleError(error: unknown, stopped: boolean): void;
20
20
  }
21
21
  export interface QueryClientContext<T = unknown> extends ClientContext<T> {
@@ -57,7 +57,7 @@ export declare function onEveryError(fn: OnEveryError): ClientSetting;
57
57
  * @param $disabled - Readable signal indicating whether requests are disabled.
58
58
  * @returns The client setting function.
59
59
  */
60
- export declare function disabled($disabled: ReadableSignal<boolean>): ClientSetting;
60
+ export declare function disabled($disabled: Accessor<boolean>): ClientSetting;
61
61
  /**
62
62
  * Enable or disable deduplication of requests (by loading state and dedupe time).
63
63
  * @param enabled - Whether deduplication is enabled.
@@ -1 +1 @@
1
- {"version":3,"file":"ClientContext.d.ts","sourceRoot":"","sources":["../src/ClientContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClientContext.d.ts","sourceRoot":"","sources":["../src/ClientContext.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { ClientExtension, ExtendedClient, AnyClientSetting, AnyClientExtension } from './client.types.js';
2
2
  import { query, infinite, operation, mutation } from './queries/index.js';
3
+ export type { InfinitePages } from './queries/index.js';
3
4
  export * from './client.types.js';
4
5
  /**
5
6
  * Create a query client with optional settings and extensions.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,mBAAmB,CAAA;AAW1B,OAAO,EACL,KAAK,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,EACT,MAAM,oBAAoB,CAAA;AAE3B,cAAc,mBAAmB,CAAA;AAEjC;;;;GAIG;AAEH,wBAAgB,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,GAgBvE,cAAc;WAZH,OAAO,KAAK;;;;;;GAYO,CAAC,CAAC,CAClD;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,QAAQ,CAAA;CAC1B;AAED;;;GAGG;AAEH,wBAAgB,SAAS,IAKjB,eAAe,CAAC,kBAAkB,CAAC,CAC1C;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,OAAO,SAAS,CAAA;CAC5B;AAED;;;GAGG;AAEH,wBAAgB,UAAU,IAKlB,eAAe,CAAC,mBAAmB,CAAC,CAC3C;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,QAAQ,CAAA;CAC1B;AAED;;;GAGG;AAEH,wBAAgB,SAAS,IAKjB,eAAe,CAAC,kBAAkB,CAAC,CAC1C"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,mBAAmB,CAAA;AAW1B,OAAO,EACL,KAAK,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,EACT,MAAM,oBAAoB,CAAA;AAE3B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,cAAc,mBAAmB,CAAA;AAEjC;;;;GAIG;AAEH,wBAAgB,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,GAgBvE,cAAc;WAZH,OAAO,KAAK;;;;;;GAYO,CAAC,CAAC,CAClD;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,QAAQ,CAAA;CAC1B;AAED;;;GAGG;AAEH,wBAAgB,SAAS,IAKjB,eAAe,CAAC,kBAAkB,CAAC,CAC1C;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,OAAO,SAAS,CAAA;CAC5B;AAED;;;GAGG;AAEH,wBAAgB,UAAU,IAKlB,eAAe,CAAC,mBAAmB,CAAC,CAC3C;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,QAAQ,CAAA;CAC1B;AAED;;;GAGG;AAEH,wBAAgB,SAAS,IAKjB,eAAe,CAAC,kBAAkB,CAAC,CAC1C"}
package/dist/index.js CHANGED
@@ -695,10 +695,11 @@ var ClientContext = class extends CacheStorage {
695
695
  const { mapData, mapError } = this;
696
696
  return this.task(settle(start(), (data, error) => {
697
697
  if (error && interrupt?.(error)) return;
698
- onSettled(error ? null : mapData(data), error ? mapError(error) : null);
699
- requestCtx.settled(data, error);
698
+ const mappedData = mapData(data);
699
+ onSettled(error ? null : mappedData, error ? mapError(error) : null);
700
+ requestCtx.settled(mappedData, error);
700
701
  this.handleError(error, requestCtx.stopErrorPropagation);
701
- return [data, error];
702
+ return [mappedData, error];
702
703
  }));
703
704
  }
704
705
  handleError(error, stopped) {
@@ -924,11 +925,12 @@ function query(key, params, fn, settings) {
924
925
  function infinite(key, params, next, fn, settings) {
925
926
  const { clientCtx, fetch, $params, $key, $rev, $data, $error, $loading } = /* @__PURE__ */ baseQuery(this, key, params, async (...args) => {
926
927
  const queryCtx = args[args.length - 1];
928
+ const cursor = args[args.length - 2];
927
929
  const data = clientCtx.$get(queryCtx).data;
928
930
  const page = await fn(...args);
929
931
  const nextValue = next(page);
930
932
  return {
931
- pages: [...data?.pages || [], page],
933
+ pages: cursor === void 0 ? [page] : [...data?.pages || [], page],
932
934
  next: nextValue,
933
935
  more: Boolean(nextValue)
934
936
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/settings/abortable.ts","../src/cache.ts","../src/settings/entities.ts","../src/map.ts","../src/CacheStorage.ts","../src/settings/persistence.ts","../src/settings/indexedDbStorage.ts","../src/utils.ts","../src/settings/revalidateOnFocus.ts","../src/settings/revalidateOnInterval.ts","../src/settings/revalidateOnReconnect.ts","../src/settings/retryOnError.ts","../src/settings/hydratable.ts","../src/ClientContext.ts","../src/settings/ssr.ts","../src/RequestContext.ts","../src/queries/base.ts","../src/queries/query.ts","../src/queries/infinite.ts","../src/queries/operation.ts","../src/queries/mutation.ts","../src/client.ts"],"sourcesContent":["import type { ClientSetting } from '../client.types.js'\nimport type { ClientContext } from '../ClientContext.js'\nimport type { RequestContext } from '../RequestContext.js'\n\ninterface AbortableContext extends ClientContext {\n abortable?: boolean\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst abortControllers = new WeakMap<RequestContext<any> | Promise<any>, AbortController>()\n\n/**\n * Returns the AbortSignal for the given RequestContext\n * @param ctx - RequestContext\n * @returns AbortSignal\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function abortSignal<T>(ctx: RequestContext<T>) {\n let controller = abortControllers.get(ctx)\n\n if (!controller) {\n abortControllers.set(ctx, controller = new AbortController())\n }\n\n return controller.signal\n}\n\n/**\n * Aborts request associated with the given Promise or RequestContext\n * @param promiseOrCtx - Promise or RequestContext\n */\nexport function abort<T>(promiseOrCtx: Promise<T> | RequestContext<T>) {\n abortControllers.get(promiseOrCtx)?.abort()\n}\n\n/**\n * Aborts previous request associated with the given RequestContext\n * @param ctx - RequestContext\n */\nexport function abortPrevious<T>(ctx: RequestContext<T>) {\n abort(ctx.prevCtx!)\n}\n\n/**\n * Make requests abortable.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function abortable(): ClientSetting {\n return (ctx: AbortableContext) => {\n if (ctx.abortable === undefined) {\n const superRun = ctx.run\n\n ctx.run = function (\n this: ClientContext,\n requestCtx: RequestContext<unknown>,\n start,\n onSettled: (data: unknown, error: string | null) => void,\n interrupt\n ) {\n let abortController: AbortController | undefined\n const promise = superRun.call(\n this,\n requestCtx,\n start,\n onSettled,\n error => interrupt?.(error) || abortController?.signal.aborted === true\n )\n\n if (abortController = abortControllers.get(requestCtx)) {\n abortControllers.set(promise, abortController)\n void promise.finally(() => abortControllers.delete(promise))\n }\n\n return promise\n } as typeof superRun\n }\n\n ctx.abortable = true\n }\n}\n","import type { NewValue } from '@nano_kit/store'\nimport type {\n CacheKeyBuilder,\n CacheDataFacade,\n CacheKey,\n ExtrasCacheKeyBuilder\n} from './cache.types.js'\nimport type { CacheStorage } from './CacheStorage.js'\n\nexport * from './cache.types.js'\n\n/**\n * Create a query cache key builder.\n * @param name - The cache shard name.\n * @param filter - Optional filter to process parameters before building the key.\n * @returns The cache key builder.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function queryKey<P extends unknown[], R>(\n name: string,\n filter: (params: Partial<P>) => unknown[] = params => params\n) {\n const key = ((...params: Partial<P>) => ({\n shard: name,\n key: JSON.stringify(filter(params))\n })) as CacheKeyBuilder<P, R>\n\n key.shard = name\n key.key = undefined\n\n return key\n}\n\n/**\n * Create an operation cache key builder with extra parameters.\n * @param name - The cache shard name.\n * @param filter - Optional filter to process parameters before building the key.\n * @returns The extras cache key builder.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function operationKey<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n name: string,\n filter?: (params: Partial<P>) => unknown[]\n) {\n return queryKey<P, R>(name, filter) as ExtrasCacheKeyBuilder<P, E, R>\n}\n\n/**\n * Create cache getter/setter for data.\n * @param cache - The cache map.\n * @returns The data getter/setter.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function dataCacheFacade(cache: CacheStorage) {\n return dataCacheGetterSetter.bind(cache) as CacheDataFacade\n}\n\nfunction dataCacheGetterSetter<P extends unknown[], R>(\n this: CacheStorage,\n key: CacheKey<P, R>,\n ...value: [NewValue<R | null>]\n) {\n if (value.length) {\n const newValue = value[0]\n\n this.set(key, (entry = this.initial()) => ({\n ...entry,\n data: typeof newValue === 'function'\n ? (newValue as (value: unknown) => unknown)(entry.data)\n : newValue\n }))\n } else {\n return this.$get(key).data as R | null\n }\n}\n\n/**\n * Create cache getter for loading state.\n * @param cache - The cache map.\n * @returns The loading state getter.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function loadingCacheFacade(cache: CacheStorage) {\n return (key: CacheKey) => cache.$get(key).loading\n}\n\n/**\n * Create cache getter for error state.\n * @param cache - The cache map.\n * @returns The error state getter.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function errorCacheFacade(cache: CacheStorage) {\n return (key: CacheKey) => cache.$get(key).error\n}\n","import type { PickNonEmptyValue } from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { CacheKey } from '../CacheStorage.types.js'\nimport type {\n ClientContext,\n MutationClientContext,\n QueryClientContext\n} from '../ClientContext.js'\nimport { queryKey } from '../cache.js'\n\nexport interface Entity<T extends {}> {\n /**\n * Get the cache key for the entity by its identifier.\n */\n (id: number | string): CacheKey<[id: number | string], T | null>\n /**\n * Get or upsert the entity in the cache.\n */\n (entity: T): T\n}\n\nconst ENTITY_KEY = '#entity'\nconst EntityKey = queryKey(ENTITY_KEY)\n\ninterface EntityRef {\n [ENTITY_KEY]: CacheKey\n}\n\nfunction isIdentifier(value: unknown): value is number | string {\n const type = typeof value\n\n return type === 'number' || type === 'string'\n}\n\nfunction isEntityRef<T extends {}>(value: T): value is T & EntityRef {\n return ENTITY_KEY in value\n}\n\nlet currentCtx: ClientContext | null = null\n\n/**\n * Create an entity manager for a specific entity type.\n * @param name - The name of the entity type.\n * @returns The entity manager.\n */\nexport function entity<T extends { id: number | string }>(\n name: string\n): Entity<T>\n\n/**\n * Create an entity manager for a specific entity type.\n * @param name - The name of the entity type.\n * @param id - A function to extract the identifier from the entity.\n * @returns The entity manager.\n */\nexport function entity<T extends {}>(\n name: string,\n id: (entity: T) => number | string\n): Entity<T>\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function entity<T extends { id: number | string }>(\n name: string,\n id = (entity: T) => entity.id\n) {\n return (idOrRefOrEntity: number | string | null | undefined | T) => {\n if (isIdentifier(idOrRefOrEntity)) {\n return EntityKey(name, idOrRefOrEntity)\n }\n\n if (!idOrRefOrEntity || !currentCtx) {\n return idOrRefOrEntity\n }\n\n if (isEntityRef(idOrRefOrEntity)) {\n return currentCtx.$get(idOrRefOrEntity[ENTITY_KEY]).data\n }\n\n const key = EntityKey(name, id(idOrRefOrEntity))\n\n currentCtx.set(key, {\n ...currentCtx.initial(),\n data: idOrRefOrEntity\n })\n\n return {\n ...idOrRefOrEntity,\n [ENTITY_KEY]: key\n }\n }\n}\n\n/**\n * Map entities from the fetched data.\n * @param mapper - A function to map entities from the fetched data.\n * @returns The client setting function.\n */\nexport function entities<T>(\n mapper: (data: NoInfer<PickNonEmptyValue<T>>) => NoInfer<PickNonEmptyValue<T>>\n): ClientSetting<QueryClientContext<T>>\n\n/**\n * Map entities from the fetched data.\n * @param mapper - A function to map entities from the fetched data.\n * @returns The client setting function.\n */\nexport function entities<T>(\n mapper: (data: NoInfer<PickNonEmptyValue<T>>) => NoInfer<PickNonEmptyValue<T>>\n): ClientSetting<MutationClientContext<T>>\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function entities(mapper: (data: unknown) => unknown) {\n return (ctx: ClientContext) => {\n const safeMapper = (data: unknown) => {\n if (data) {\n try {\n currentCtx = ctx\n\n return mapper(data)\n } finally {\n currentCtx = null\n }\n }\n\n return data\n }\n\n ctx.mapComputedData = ctx.mapData = safeMapper\n }\n}\n","import {\n type SignalsMap,\n type SignalsMapEvents,\n type NewValue,\n batch,\n $getMapKey,\n setMapKey,\n clearMap,\n deleteMapKey,\n $$insert,\n fireMapEvent,\n subMapEvent\n} from '@nano_kit/store'\n\nexport interface ShardKey<S> {\n shard: S\n key?: undefined\n}\n\nexport interface ShardedKey<S, K> {\n shard: S\n key: K\n}\n\nexport interface ShardedSignalsMap<S, K, T> extends SignalsMapEvents, Map<\n S,\n SignalsMap<K, T>\n> {}\n\n/**\n * Check if sharded map has the key.\n * Checks full key.\n * @param map - The sharded map.\n * @param shardedKey - The sharded key.\n * @returns True if the sharded map has the key, false otherwise.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function hasShardedMapKey<S, K, T>(\n map: ShardedSignalsMap<S, K, T>,\n shardedKey: ShardKey<S> | ShardedKey<S, K>\n) {\n const {\n shard,\n key\n } = shardedKey\n\n if (key === undefined) {\n return map.has(shard)\n }\n\n return map.get(shard)?.has(key) || false\n}\n\n/**\n * Get value from sharded map by key.\n * @param map - The sharded map.\n * @param shardedKey - The sharded key.\n * @returns The value or undefined if not found.\n */\nexport function $getShardedMapKey<S, K, T>(\n map: ShardedSignalsMap<S, K, T>,\n shardedKey: ShardedKey<S, K>\n) {\n const {\n shard,\n key\n } = shardedKey\n let shardMap\n\n if ((shardMap = map.get(shard)) === undefined) {\n subMapEvent(map, $$insert)\n return undefined\n }\n\n return $getMapKey(shardMap, key)\n}\n\n/**\n * Set value in sharded map by key.\n * If sharded key contains only shard name, sets value for all entries in the shard.\n * @param map - The sharded map.\n * @param shardedKey - The sharded key.\n * @param value - The value to set.\n */\nexport function setShardedMapKey<S, K, T>(\n map: ShardedSignalsMap<S, K, T>,\n shardedKey: ShardKey<S> | ShardedKey<S, K>,\n value: NewValue<T | undefined>\n) {\n const {\n shard,\n key\n } = shardedKey\n let shardMap = map.get(shard)\n const shardExists = shardMap !== undefined\n\n if (key === undefined) {\n if (shardExists) {\n batch(() => {\n for (const params of shardMap!.keys()) {\n setMapKey(shardMap!, params, value)\n }\n })\n }\n\n return\n }\n\n if (!shardExists) {\n map.set(\n shard,\n shardMap = new Map<K, T>() as SignalsMap<K, T>\n )\n }\n\n setMapKey(shardMap!, key, value)\n\n if (!shardExists) {\n fireMapEvent(map, $$insert)\n }\n}\n\n/**\n * Delete sharded map key.\n * If sharded key contains only shard name, deletes all entries in the shard.\n * @param map - The sharded map.\n * @param shardedKey - The sharded key.\n */\nexport function deleteShardedMapKey<S, K, T>(\n map: ShardedSignalsMap<S, K, T>,\n shardedKey: ShardKey<S> | ShardedKey<S, K>\n) {\n const {\n shard,\n key\n } = shardedKey\n const shardMap = map.get(shard)\n\n if (shardMap === undefined) {\n return\n }\n\n if (key === undefined) {\n clearMap(shardMap)\n return\n }\n\n deleteMapKey(shardMap, key)\n}\n","import type { NewValue } from '@nano_kit/store'\nimport type {\n CacheMap,\n CacheShardKey,\n CacheKey,\n CacheEntry\n} from './CacheStorage.types.js'\nimport {\n hasShardedMapKey,\n $getShardedMapKey,\n setShardedMapKey,\n deleteShardedMapKey\n} from './map.js'\n\nexport * from './CacheStorage.types.js'\n\nexport const DEFAULT_DEDUPE_TIME = 4_000\nexport const DEFAULT_CACHE_TIME = Infinity\nexport const UNSET_REV = Infinity\n\n/*\nREV\n< 0 = locked, do not fetch\n0 = unset, need to fetch\n> 0 = current revision, used to identify latest fetch\n*/\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function revLock(rev: number) {\n return rev > 0 ? rev * -1 : rev\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function revLocked(rev: number) {\n return rev < 0\n}\n\nlet revCounter = 0\n\nexport class CacheStorage {\n dedupeTime = DEFAULT_DEDUPE_TIME\n cacheTime = DEFAULT_CACHE_TIME\n cache: CacheMap = new Map()\n\n initial() {\n return {\n rev: UNSET_REV,\n dedupes: 0,\n expires: 0,\n data: null,\n error: null,\n loading: false\n }\n }\n\n $get(key: CacheKey) {\n const cache = this.cache\n\n if (!hasShardedMapKey(cache, key)) {\n setShardedMapKey(cache, key, this.initial())\n }\n\n const result = $getShardedMapKey(cache, key)!\n\n return result\n }\n\n set(\n key: CacheShardKey | CacheKey,\n entry: NewValue<CacheEntry | undefined>\n ) {\n setShardedMapKey(this.cache, key, entry)\n }\n\n /**\n * Invalidate cache entry for the given key.\n * If shard key is used, invalidate all entries in the shard.\n * @param key - The cache key to invalidate.\n */\n invalidate(key: CacheShardKey | CacheKey) {\n deleteShardedMapKey(this.cache, key)\n }\n\n /**\n * Revalidate cache entry for the given key.\n * If shard key is used, revalidate all entries in the shard.\n * @param key - The cache key to revalidate.\n */\n revalidate(key: CacheShardKey | CacheKey) {\n if (key.key === undefined || hasShardedMapKey(this.cache, key)) {\n this.set(key, entry => ({\n ...entry!,\n rev: UNSET_REV,\n dedupes: 0\n }))\n }\n }\n\n mute(entry: CacheEntry, loadingDedupe = true, timeDedupe = true) {\n return (\n loadingDedupe && entry.loading\n || timeDedupe && entry.dedupes > Date.now()\n || revLocked(entry.rev)\n )\n }\n\n loading(key: CacheKey) {\n const rev = ++revCounter\n\n this.set(key, (entry = this.initial()) => ({\n ...entry,\n rev,\n data: entry.expires > Date.now() ? entry.data : null,\n error: null,\n loading: true\n }))\n\n return rev\n }\n\n settled(\n key: CacheKey,\n data: unknown,\n error: string | null,\n rev?: number\n ) {\n const now = Date.now()\n\n this.set(key, (entry = this.initial()) => (\n rev !== undefined && rev !== entry.rev\n ? entry\n : {\n ...entry,\n dedupes: now + this.dedupeTime,\n expires: now + this.cacheTime,\n data: error === null ? data : entry.data,\n error,\n loading: false\n }\n ))\n }\n}\n","import { untracked } from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheShardKey,\n CacheEntry\n} from '../CacheStorage.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport { revLock, revLocked, UNSET_REV } from '../CacheStorage.js'\nimport { hasShardedMapKey } from '../map.js'\n\ninterface PersistenceContext extends QueryClientContext {\n persistenceLifetime?: number\n}\n\nexport interface Storage {\n get(key: CacheKey): Promise<CacheEntry | null>\n set(key: CacheKey, entry: CacheEntry, lifetime: number): Promise<void>\n delete(key: CacheShardKey | CacheKey): Promise<void>\n}\n\n/**\n * Generic persistent storage client setting.\n * @param storage - The storage implementation to use for persistence.\n * @param lifetime - How long to keep entries in storage in milliseconds.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function persistence(storage: Storage | null, lifetime: number): ClientSetting<QueryClientContext> {\n return (ctx: PersistenceContext) => {\n if (!storage) {\n return\n }\n\n if (ctx.persistenceLifetime === undefined) {\n const superGet = ctx.$get\n const superSet = ctx.set\n const superInvalidate = ctx.invalidate\n\n ctx.$get = function (key) {\n const cache = this.cache\n const hasKey = hasShardedMapKey(cache, key)\n const entry = superGet.call(this, key)\n\n if (hasKey) {\n return entry\n }\n\n superSet.call(this, key, {\n ...entry,\n rev: revLock(entry.rev)\n })\n\n void this.task(storage.get(key).then(storedEntry => superSet.call(this, key, {\n ...entry,\n ...storedEntry,\n rev: UNSET_REV\n })))\n\n return superGet.call(this, key)\n }\n\n function saveSingleEntry(\n this: PersistenceContext,\n key: CacheKey\n ) {\n const entry = untracked(superGet.bind(this, key))\n\n if (entry && !entry.loading && !entry.error && !revLocked(entry.rev)) {\n void this.task(storage!.set(key, entry, this.persistenceLifetime!))\n }\n }\n\n ctx.set = function (cacheKey, entry) {\n superSet.call(this, cacheKey, entry)\n\n const {\n shard,\n key\n } = cacheKey\n\n if (key !== undefined) {\n saveSingleEntry.call(this, cacheKey)\n } else {\n const shardMap = this.cache.get(shard)\n\n if (shardMap) {\n for (const key of shardMap.keys()) {\n saveSingleEntry.call(this, {\n shard,\n key\n } as CacheKey)\n }\n }\n }\n }\n\n ctx.invalidate = function (key) {\n superInvalidate.call(this, key)\n void this.task(storage.delete(key))\n }\n }\n\n ctx.persistenceLifetime = lifetime\n }\n}\n","import type {\n CacheKey,\n CacheShardKey,\n CacheEntry\n} from '../CacheStorage.types.js'\nimport type { Storage } from './persistence.js'\n\nexport const DB_NAME = 'nano_kit'\nexport const STORE_NAME = 'query'\nexport const DB_VERSION = 1\n\ninterface StoredEntry {\n shard: string\n key: string\n data: CacheEntry\n expires: number\n}\n\nexport function connect(): Promise<IDBDatabase | null> {\n return new Promise((resolve) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n\n request.onerror = () => resolve(null)\n\n request.onsuccess = () => resolve(request.result)\n\n request.onupgradeneeded = () => {\n const db = request.result\n\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, {\n keyPath: ['shard', 'key']\n })\n\n store.createIndex('shard', 'shard', {\n unique: false\n })\n }\n }\n })\n}\n\nexport async function SELECT(\n connection: Promise<IDBDatabase | null>,\n key: CacheKey\n): Promise<CacheEntry | null> {\n const db = await connection\n\n if (!db) {\n return null\n }\n\n return new Promise((resolve) => {\n const transaction = db.transaction(STORE_NAME, 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.get([key.shard, key.key])\n\n request.onerror = () => resolve(null)\n\n request.onsuccess = () => {\n const result = request.result as StoredEntry | undefined\n\n if (!result) {\n resolve(null)\n return\n }\n\n const now = Date.now()\n\n if (result.expires < now || result.data.expires < now) {\n void DELETE(connection, key)\n resolve(null)\n return\n }\n\n resolve(result.data)\n }\n })\n}\n\nexport async function SET(\n connection: Promise<IDBDatabase | null>,\n cacheKey: CacheKey,\n entry: CacheEntry,\n lifetime: number\n): Promise<void> {\n const db = await connection\n\n if (!db) {\n return\n }\n\n return new Promise((resolve) => {\n const {\n shard,\n key\n } = cacheKey\n const transaction = db.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const storedEntry: StoredEntry = {\n shard,\n key,\n data: entry,\n expires: Date.now() + lifetime\n }\n const request = store.put(storedEntry)\n\n request.onerror = () => resolve()\n request.onsuccess = () => resolve()\n })\n}\n\nexport async function DELETE(\n connection: Promise<IDBDatabase | null>,\n cacheKey: CacheShardKey | CacheKey\n): Promise<void> {\n const db = await connection\n\n if (!db) {\n return\n }\n\n return new Promise((resolve) => {\n const {\n shard,\n key\n } = cacheKey\n const transaction = db.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n\n if (key === undefined) {\n const index = store.index('shard')\n const range = IDBKeyRange.only(shard)\n const request = index.openCursor(range)\n\n request.onerror = () => resolve()\n\n request.onsuccess = () => {\n const cursor = request.result\n\n if (cursor) {\n cursor.delete()\n cursor.continue()\n } else {\n resolve()\n }\n }\n } else {\n const request = store.delete([shard, key])\n\n request.onerror = () => resolve()\n request.onsuccess = () => resolve()\n }\n })\n}\n\n/**\n * IndexedDB adapter for persistent storage.\n * @returns IndexedDB storage implementation or null if IndexedDB is not supported.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function indexedDbStorage(): Storage | null {\n if (typeof indexedDB === 'undefined') {\n return null\n }\n\n const db = connect()\n\n return {\n get(key: CacheKey) {\n return SELECT(db, key)\n },\n set(cacheKey: CacheKey, entry: CacheEntry, lifetime: number) {\n return SET(db, cacheKey, entry, lifetime)\n },\n delete(cacheKey: CacheShardKey | CacheKey) {\n return DELETE(db, cacheKey)\n }\n }\n}\n","/* @__NO_SIDE_EFFECTS__ */\nexport function addFn<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends (...args: any[]) => void\n>(prevFn: T | undefined, fn: T): T {\n if (prevFn === undefined) {\n return fn\n }\n\n return function (this: unknown, ...args: Parameters<T>) {\n prevFn.apply(this, args)\n fn.apply(this, args)\n } as T\n}\n\nexport function settle<T, R>(\n promise: Promise<T>,\n onSettled: (data: T | undefined, error?: unknown) => R\n) {\n return promise.then(\n onSettled,\n error => onSettled(undefined, error)\n )\n}\n","import {\n listen,\n external,\n onMount,\n mountable\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport { addFn } from '../utils.js'\n\ninterface RevalidateOnFocusContext extends QueryClientContext {\n revalidateOnFocusEnabled?: boolean\n}\n\n/**\n * @todo Move to common extras package\n */\nexport const $windowVisible = external<boolean>(($windowVisible) => {\n if (typeof document === 'undefined') {\n $windowVisible(true)\n return\n }\n\n const set = () => $windowVisible(!document.hidden)\n\n set()\n\n onMount(mountable($windowVisible), () => {\n document.addEventListener('visibilitychange', set)\n\n return () => {\n document.removeEventListener('visibilitychange', set)\n }\n })\n})\n\n/**\n * Revalidate the query when the window gains focus.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function revalidateOnFocus(): ClientSetting<QueryClientContext> {\n return (ctx: RevalidateOnFocusContext) => {\n if (ctx.revalidateOnFocusEnabled === undefined) {\n ctx.mounted = addFn(ctx.mounted, function (this: RevalidateOnFocusContext) {\n listen($windowVisible, (visible) => {\n if (visible) {\n this.revalidate(this.$key())\n }\n })\n })\n }\n\n ctx.revalidateOnFocusEnabled = true\n }\n}\n","import { effect } from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport { addFn } from '../utils.js'\n\ninterface RevalidateOnIntervalContext extends QueryClientContext {\n revalidateInterval?: number\n}\n\n/**\n * Revalidate the query on a specified interval.\n * @param interval - The interval in milliseconds.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function revalidateOnInterval(interval: number): ClientSetting<QueryClientContext> {\n return (ctx: RevalidateOnIntervalContext) => {\n if (ctx.revalidateInterval === undefined) {\n ctx.mounted = addFn(ctx.mounted, function (this: RevalidateOnIntervalContext) {\n effect(() => {\n const id = setInterval(() => {\n this.revalidate(this.$key())\n }, this.revalidateInterval)\n\n return () => clearInterval(id)\n })\n })\n }\n\n ctx.revalidateInterval = interval\n }\n}\n","import {\n listen,\n external,\n onMount,\n mountable\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport { addFn } from '../utils.js'\n\ninterface RevalidateOnReconnectContext extends QueryClientContext {\n revalidateOnReconnectEnabled?: boolean\n}\n\n/**\n * @todo Move to common extras package\n */\nexport const $networkOnline = external<boolean>(($networkOnline) => {\n if (typeof navigator === 'undefined') {\n $networkOnline(true)\n return\n }\n\n const set = () => $networkOnline(navigator.onLine)\n\n set()\n\n onMount(mountable($networkOnline), () => {\n window.addEventListener('online', set)\n window.addEventListener('offline', set)\n\n return () => {\n window.removeEventListener('online', set)\n window.removeEventListener('offline', set)\n }\n })\n})\n\n/**\n * Revalidate the query when the network reconnects.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function revalidateOnReconnect(): ClientSetting<QueryClientContext> {\n return (ctx: RevalidateOnReconnectContext) => {\n if (ctx.revalidateOnReconnectEnabled === undefined) {\n ctx.mounted = addFn(ctx.mounted, function (this: RevalidateOnReconnectContext) {\n listen($networkOnline, (online) => {\n if (online) {\n this.revalidate(this.$key())\n }\n })\n })\n }\n\n ctx.revalidateOnReconnectEnabled = true\n }\n}\n","import type { ClientSetting } from '../client.types.js'\nimport type { CacheKey } from '../CacheStorage.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport type { QueryContext } from '../RequestContext.js'\n\nexport type CalcRetryDelay = (retryCount: number, error: unknown) => number\n\ninterface RetryContext extends QueryClientContext {\n retryCounts?: Map<string, number>\n retryTimeoutId?: ReturnType<typeof setTimeout>\n calcRetryDelay?: CalcRetryDelay\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function defaultCalcRetryDelay(retryCount: number) {\n return (\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ~~((Math.random() + 0.5) * (1 << (retryCount < 8 ? retryCount : 8))) * 2000\n )\n}\n\nfunction getRetryCount(ctx: RetryContext, key: CacheKey) {\n return ctx.retryCounts?.get(key.key) || 0\n}\n\nfunction setRetryCount(ctx: RetryContext, key: CacheKey, count: number) {\n (ctx.retryCounts ??= new Map()).set(key.key, count)\n}\n\nfunction clearRetryCount(ctx: RetryContext, key: CacheKey) {\n ctx.retryCounts?.delete(key.key)\n}\n\n/**\n * Retry the query on error with exponential backoff.\n * @param calcRetryDelay - Function to calculate the delay before retrying.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function retryOnError(\n calcRetryDelay: CalcRetryDelay = defaultCalcRetryDelay\n): ClientSetting<QueryClientContext> {\n return (ctx: RetryContext) => {\n if (ctx.calcRetryDelay === undefined) {\n const superRun = ctx.run\n\n ctx.run = function (\n this: RetryContext,\n queryCtx: QueryContext<unknown[], unknown>,\n start,\n onSettled: (data: unknown, error: string | null) => void,\n interrupt\n ) {\n clearTimeout(this.retryTimeoutId)\n\n const promise = superRun.call(this, queryCtx, start, onSettled, interrupt)\n\n if (!('shard' in queryCtx)) {\n return promise\n }\n\n void this.task(promise.then(\n (result) => {\n const error = result?.[1]\n\n if (!error) {\n clearRetryCount(this, queryCtx)\n } else {\n const retryCount = getRetryCount(this, queryCtx) + 1\n const delay = this.calcRetryDelay!(retryCount, error)\n\n this.retryTimeoutId = setTimeout(() => {\n this.invalidate(queryCtx)\n setRetryCount(this, queryCtx, retryCount)\n }, delay)\n }\n }\n ))\n\n return promise\n } as typeof superRun\n }\n\n ctx.calcRetryDelay = calcRetryDelay\n }\n}\n","import {\n type AnyAccessor,\n type Hydrator,\n Hydrator$,\n Hydratables$,\n inject\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { ClientContext } from '../ClientContext.js'\nimport type {\n CacheMap,\n CacheEntry,\n SerializedCacheEntry\n} from '../CacheStorage.types.js'\nimport { setShardedMapKey } from '../map.js'\n\ninterface HydratableContext extends ClientContext {\n hydratable?: boolean\n}\n\ntype SerializedShardedMap = [string, string, SerializedCacheEntry][]\n\nconst id = '@nano_kit/query'\n\nfunction mapEntry(\n entry: CacheEntry,\n map: StringConstructor\n): SerializedCacheEntry\n\nfunction mapEntry(\n entry: SerializedCacheEntry,\n map: NumberConstructor\n): CacheEntry\n\nfunction mapEntry(\n entry: CacheEntry | SerializedCacheEntry,\n map: StringConstructor | NumberConstructor\n) {\n return {\n ...entry,\n rev: map(entry.rev),\n dedupes: map(entry.dedupes),\n expires: map(entry.expires)\n }\n}\n\nfunction serialize(cache: CacheMap) {\n const serialized: SerializedShardedMap = []\n\n cache.forEach((shard, shardKey) => {\n shard.forEach(($signal, key) => {\n const value = $signal?.()\n\n if (value !== undefined) {\n serialized.push([shardKey, key, mapEntry(value, String)])\n }\n })\n })\n\n return serialized\n}\n\nfunction deserialize(cache: CacheMap, serialized: SerializedShardedMap) {\n serialized.forEach(([shard, key, value]) => {\n setShardedMapKey(cache, {\n shard,\n key\n }, mapEntry(value, Number))\n })\n}\n\n/**\n * Make client cache hydratable.\n * Without arguments, it will try to inject {@link Hydrator$} and {@link Hydratables$} from the injection context.\n * @param hydrator - Optional hydrator to use for rehydrating the cache. Pass `null` to skip hydration and only register for dehydration.\n * @param hydratables - Optional map to register the cache serializer for dehydration.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function hydratable(\n hydrator?: Hydrator | null,\n hydratables?: Map<string, AnyAccessor> | null\n): ClientSetting {\n return (ctx: HydratableContext) => {\n if (!ctx.hydratable) {\n const finalHydrator = hydrator === undefined\n ? inject(Hydrator$)\n : hydrator\n\n if (finalHydrator) {\n finalHydrator.pull(id, (value) => {\n deserialize(ctx.cache, value as SerializedShardedMap)\n })\n } else {\n const finalHydratables = hydratables === undefined\n ? inject(Hydratables$)\n : hydratables\n\n if (finalHydratables) {\n finalHydratables.set(id, () => serialize(ctx.cache))\n }\n }\n }\n\n ctx.hydratable = true\n }\n}\n","import {\n type ReadableSignal,\n type TasksRunner,\n type Task,\n TasksRunner$,\n taskPromise,\n inject\n} from '@nano_kit/store'\nimport type { ClientSetting } from './client.types.js'\nimport type { RequestContext } from './RequestContext.js'\nimport {\n type CacheKey,\n type CacheEntry,\n CacheStorage\n} from './CacheStorage.js'\nimport {\n addFn,\n settle\n} from './utils.js'\n\nexport type OnEveryError = (error: unknown, stopped: boolean) => void\n\nexport class ClientContext<T = unknown> extends CacheStorage {\n $key?: ReadableSignal<CacheKey> = undefined\n $disabled?: ReadableSignal<boolean> = undefined\n loadingDedupe = true\n timeDedupe = true\n onEveryError: OnEveryError | undefined = undefined\n\n task<T>(task: Task<T>): Promise<T> {\n return taskPromise(task)\n }\n\n mapData(data: T): T {\n return data\n }\n\n mapComputedData(data: T | null): T | null {\n return data\n }\n\n mapError(error: unknown) {\n return (error as Error)?.message\n }\n\n mounted() {}\n\n override mute(entry: CacheEntry) {\n return (\n this.$disabled?.() === true\n || super.mute(entry, this.loadingDedupe, this.timeDedupe)\n )\n }\n\n run(\n requestCtx: RequestContext<T>,\n start: () => Promise<T>,\n onSettled: (data: T | null, error: string | null) => void,\n interrupt?: (error: unknown) => boolean\n ) {\n const {\n mapData,\n mapError\n } = this\n\n return this.task(settle(start(), (data, error) => {\n if (error && interrupt?.(error)) {\n return\n }\n\n const dataOrNull = error ? null : mapData(data as T)\n const errorString = error ? mapError(error) : null\n\n onSettled(dataOrNull, errorString)\n requestCtx.settled(data, error)\n this.handleError(error, requestCtx.stopErrorPropagation)\n\n return [data, error] as const\n }))\n }\n\n handleError(\n error: unknown,\n stopped: boolean\n ) {\n if (error !== undefined) {\n this.onEveryError?.(error, stopped)\n }\n }\n}\n\nexport interface QueryClientContext<T = unknown> extends ClientContext<T> {\n $key: ReadableSignal<CacheKey>\n Q: true\n}\n\nexport interface MutationClientContext<T = unknown> extends ClientContext<T> {\n $key: never\n M: true\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function forkMutationClient<T>(\n ctx: ClientContext,\n settings: ClientSetting<MutationClientContext<T>>[] = []\n) {\n const child = Object.create(ctx) as MutationClientContext<T>\n\n for (const setting of settings) {\n setting(child)\n }\n\n return child\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function forkQueryClient<T>(\n ctx: ClientContext,\n $key: ReadableSignal<CacheKey>,\n settings: ClientSetting<QueryClientContext<T>>[] = []\n) {\n const child = Object.create(ctx) as QueryClientContext<T>\n\n child.$key = $key\n\n for (const setting of settings) {\n setting(child)\n }\n\n return child\n}\n\n/**\n * Set dedupe time in which identical requests are deduped.\n * @param time - Dedupe time in milliseconds.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function dedupeTime(time: number): ClientSetting<QueryClientContext> {\n return ctx => ctx.dedupeTime = time\n}\n\n/**\n * Set cache time for cached query results.\n * @param time - Cache time in milliseconds.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function cacheTime(time: number): ClientSetting<QueryClientContext> {\n return ctx => ctx.cacheTime = time\n}\n\n/**\n * Map error object to string.\n * @param fn - Function to map error to string.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function mapError(fn: (error: unknown) => string): ClientSetting {\n return ctx => ctx.mapError = fn\n}\n\n/**\n * Register a callback to be called on every error.\n * @param fn - The error callback.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function onEveryError(fn: OnEveryError): ClientSetting {\n return ctx => ctx.onEveryError = addFn(ctx.onEveryError, fn)\n}\n\n/**\n * Disable requests when the signal is true.\n * @param $disabled - Readable signal indicating whether requests are disabled.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function disabled($disabled: ReadableSignal<boolean>): ClientSetting {\n return ctx => ctx.$disabled = $disabled\n}\n\n/**\n * Enable or disable deduplication of requests (by loading state and dedupe time).\n * @param enabled - Whether deduplication is enabled.\n * @returns The client setting function.\n */\nexport function dedupe(dedupe: boolean): ClientSetting\n\n/**\n * Enable or disable deduplication of requests (by loading state and dedupe time).\n * @param loading - Whether loading state deduplication is enabled.\n * @param time - Whether time-based deduplication is enabled.\n * @returns The client setting function.\n */\nexport function dedupe(loading: boolean, time: boolean): ClientSetting<QueryClientContext>\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function dedupe(loading: boolean, time = loading): ClientSetting {\n return (ctx) => {\n ctx.loadingDedupe = loading\n ctx.timeDedupe = time\n }\n}\n\n/**\n * Set task runner for handling tasks.\n * Without arguments, it will try to inject tasks runner from context.\n * @param runner - The tasks runner function.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function tasks(runner: TasksRunner = inject(TasksRunner$)): ClientSetting {\n return ctx => ctx.task = runner\n}\n","import type { ClientSetting } from '../client.types.js'\nimport { tasks } from '../ClientContext.js'\nimport { hydratable } from './hydratable.js'\n\n/**\n * Client setting for enabling SSR support.\n * It combines tasks management and cache hydration to ensure that queries can be executed on the server and their results can be sent to the client for hydration.\n * Should be called inside injection context.\n * @returns The client setting function.\n */\nexport function ssr(): ClientSetting {\n const tasksSetting = tasks()\n const hydratableSetting = hydratable()\n\n return (ctx) => {\n tasksSetting(ctx)\n hydratableSetting(ctx)\n }\n}\n","import type { CacheKey } from './CacheStorage.types.js'\nimport { addFn } from './utils.js'\n\nexport type OnSuccess<T> = (data: T) => void\n\nexport type OnError = (error: unknown) => void\n\nexport type OnSettled<T> = (data: T | undefined, error: unknown) => void\n\nexport class RequestContext<T> {\n onSuccess: OnSuccess<T> | undefined = undefined\n onError: OnError | undefined = undefined\n onSettled: OnSettled<T> | undefined = undefined\n stopErrorPropagation = false\n prevCtx: RequestContext<T> | undefined = undefined\n\n constructor(prevCtx?: RequestContext<T>) {\n if (this.prevCtx = prevCtx) {\n prevCtx.prevCtx = undefined\n }\n }\n\n settled(data: T | undefined, error: unknown) {\n this.onSettled?.(data, error)\n\n if (error !== undefined) {\n this.onError?.(error)\n } else {\n this.onSuccess?.(data!)\n }\n }\n}\n\nexport class QueryContext<P extends unknown[], R>\n extends RequestContext<R>\n implements CacheKey<P, R> {\n shard: string\n key: string\n P!: P\n R!: R\n\n constructor(\n key: CacheKey<P, R>,\n prevCtx?: QueryContext<P, R>\n ) {\n super(prevCtx)\n\n this.shard = key.shard\n this.key = key.key\n }\n}\n\n/**\n * Add a success callback to the query context.\n * @param ctx - The query context.\n * @param fn - The success callback.\n */\nexport function onSuccess<T>(ctx: RequestContext<T>, fn: OnSuccess<T>) {\n ctx.onSuccess = addFn(ctx.onSuccess, fn)\n}\n\n/**\n * Add an error callback to the query context.\n * @param ctx - The query context.\n * @param fn - The error callback.\n */\nexport function onError<T>(ctx: RequestContext<T>, fn: OnError) {\n ctx.onError = addFn(ctx.onError, fn)\n}\n\n/**\n * Add a settled callback to the query context.\n * @param ctx - The query context.\n * @param fn - The settled callback.\n */\nexport function onSettled<T>(ctx: RequestContext<T>, fn: OnSettled<T>) {\n ctx.onSettled = addFn(ctx.onSettled, fn)\n}\n\n/**\n * Mark error as \"stopped\", so error will be passed to onEveryError with stopped=true.\n * @param ctx - The query context.\n */\nexport function stopErrorPropagation<T>(ctx: RequestContext<T>) {\n ctx.stopErrorPropagation = true\n}\n","import {\n type ReadableSignal,\n action,\n computed,\n mountable\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheKeyBuilder\n} from '../cache.types.js'\nimport { UNSET_REV } from '../CacheStorage.js'\nimport {\n type ClientContext,\n type QueryClientContext,\n forkQueryClient\n} from '../ClientContext.js'\nimport { QueryContext } from '../RequestContext.js'\n\nexport type SignalsParams<T extends unknown[]> = T extends [infer First, ...infer Rest]\n ? [ReadableSignal<First>, ...SignalsParams<Rest>]\n : []\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function baseQuery<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n rootCtx: ClientContext,\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, ...E, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n) {\n const $params = computed(() => params.map($signal => $signal()) as P)\n const $key = computed((prevKey?: CacheKey<P, R>) => {\n const nextKey = key(...$params())\n\n if (\n prevKey\n && prevKey.shard === nextKey.shard\n && prevKey.key === nextKey.key\n ) {\n return prevKey\n }\n\n return nextKey\n })\n const clientCtx = forkQueryClient<R>(rootCtx, $key, settings)\n const $entry = computed(() => clientCtx.$get($key()))\n /**\n * Changes on every entry rev reset\n */\n const $rev = computed((v: number = 0): number => ($entry().rev === UNSET_REV ? v + 1 : v))\n const { mapComputedData } = clientCtx\n const $data = mountable(computed(() => mapComputedData($entry().data as R | null)))\n const $error = computed(() => $entry().error)\n const $loading = computed(() => $entry().loading)\n let prevQueryCtx: QueryContext<P, R> | undefined\n const fetch = action((...extraParams: E) => {\n if (clientCtx.mute($entry())) {\n return Promise.resolve() as Promise<undefined>\n }\n\n const key = $key()\n const params = $params()\n const queryCtx = prevQueryCtx = new QueryContext<P, R>(key, prevQueryCtx)\n let rev: number | undefined\n\n return clientCtx.run(\n queryCtx,\n () => {\n rev = clientCtx.loading(key)\n\n return fn(...params, ...extraParams, queryCtx)\n },\n (data, error) => clientCtx.settled(key, data, error, rev)\n )\n })\n\n return {\n clientCtx,\n fetch,\n $params,\n $key,\n $rev,\n $data,\n $error,\n $loading\n }\n}\n","import {\n type Mountable,\n type ReadableSignal,\n effect,\n effectScope,\n onStart\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheKeyBuilder\n} from '../cache.types.js'\nimport type {\n ClientContext,\n QueryClientContext\n} from '../ClientContext.js'\nimport type { QueryContext } from '../RequestContext.js'\nimport {\n type SignalsParams,\n baseQuery\n} from './base.js'\n\n/**\n * Create a query that automatically fetches data when parameters change with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the query.\n * @param fn - The fetcher function that returns a promise of the data.\n * @param settings - Optional settings for the query.\n * @returns A tuple containing signals for data, error, loading state, and the cache key.\n */\nexport function query<\n P extends unknown[],\n R\n>(\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/**\n * Create a query that automatically fetches data when parameters change with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the query.\n * @param fn - The fetcher function that returns a promise of the data.\n * @param settings - Optional settings for the query.\n * @returns A tuple containing signals for data, error, loading state, and the cache key.\n */\nexport function query<\n P extends unknown[],\n R\n>(\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: P) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function query<P extends unknown[], R>(\n this: ClientContext,\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n) {\n const {\n clientCtx,\n fetch,\n $params,\n $key,\n $rev,\n $data,\n $error,\n $loading\n } = baseQuery<P, [], R>(this, key, params, fn, settings)\n\n onStart($data, () => effectScope(() => {\n effect(() => {\n $rev()\n $params()\n clientCtx.$disabled?.()\n void fetch()\n })\n\n clientCtx.mounted()\n }))\n\n return [$data, $error, $loading, $key] as const\n}\n","import {\n type Mountable,\n type ReadableSignal,\n action,\n effect,\n effectScope,\n onStart\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheKeyBuilder\n} from '../cache.types.js'\nimport type {\n ClientContext,\n QueryClientContext\n} from '../ClientContext.js'\nimport type { QueryContext } from '../RequestContext.js'\nimport {\n type SignalsParams,\n baseQuery\n} from './base.js'\n\nexport interface InfinitePages<P, C> {\n pages: P[]\n next: C | undefined\n more: boolean\n}\n\n/**\n * Create an infinite query that fetches paginated data with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the query.\n * @param next - A function to determine the next cursor from the last page.\n * @param fn - The fetcher function that returns a promise of the data.\n * @param settings - Optional settings for the query.\n * @returns A tuple containing the fetchNext function and signals for data, error, loading state, and the cache key.\n */\nexport function infinite<\n P extends unknown[],\n C,\n R\n>(\n key: CacheKeyBuilder<P, InfinitePages<R, C>>,\n params: SignalsParams<P>,\n next: (lastPage: R) => C | undefined,\n fn: (...args: [...P, cursor: C | undefined, queryCtx: QueryContext<P, InfinitePages<R, C>>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<InfinitePages<R, C>>>[]\n): readonly [\n fetchNext: () => Promise<readonly [InfinitePages<R, C> | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<InfinitePages<R, C> | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, InfinitePages<R, C>>>\n]\n\n/**\n * Create an infinite query that fetches paginated data with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the query.\n * @param next - A function to determine the next cursor from the last page.\n * @param fn - The fetcher function that returns a promise of the data.\n * @param settings - Optional settings for the query.\n * @returns A tuple containing the fetchNext function and signals for data, error, loading state, and the cache key.\n */\nexport function infinite<\n P extends unknown[],\n C,\n R\n>(\n key: CacheKeyBuilder<P, InfinitePages<R, C>>,\n params: SignalsParams<P>,\n next: (lastPage: R) => C | undefined,\n fn: (...args: [...P, cursor: C | undefined]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<InfinitePages<R, C>>>[]\n): readonly [\n fetchNext: () => Promise<readonly [InfinitePages<R, C> | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<InfinitePages<R, C> | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, InfinitePages<R, C>>>\n]\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function infinite<P extends unknown[], C, R>(\n this: ClientContext,\n key: CacheKeyBuilder<P, InfinitePages<R, C>>,\n params: SignalsParams<P>,\n next: (lastPage: R) => C | undefined,\n fn: (...args: [...P, cursor: C | undefined, queryCtx: QueryContext<P, InfinitePages<R, C>>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<InfinitePages<R, C>>>[]\n) {\n const {\n clientCtx,\n fetch,\n $params,\n $key,\n $rev,\n $data,\n $error,\n $loading\n } = baseQuery<P, [cursor: C | undefined], InfinitePages<R, C>>(this, key, params, async (...args) => {\n const queryCtx = args[args.length - 1] as QueryContext<P, InfinitePages<R, C>>\n const data = clientCtx.$get(queryCtx).data as InfinitePages<R, C> | null\n const page = await fn(...args)\n const nextValue = next(page)\n\n return {\n pages: [...data?.pages || [], page],\n next: nextValue,\n more: Boolean(nextValue)\n }\n }, settings)\n const initialTimeDedupe = clientCtx.timeDedupe\n const fetchNext = action(() => {\n const data = $data()\n\n if (!data?.more) {\n return Promise.resolve() as Promise<undefined>\n }\n\n clientCtx.timeDedupe = false\n\n return fetch(data.next)\n })\n\n onStart($data, () => effectScope(() => {\n effect(() => {\n $rev()\n $params()\n clientCtx.$disabled?.()\n clientCtx.timeDedupe = initialTimeDedupe\n void fetch(undefined)\n })\n\n clientCtx.mounted()\n }))\n\n return [fetchNext, $data, $error, $loading, $key] as const\n}\n","import {\n type Mountable,\n type ReadableSignal,\n effectScope,\n onStart\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheKeyBuilder,\n ExtrasCacheKeyBuilder\n} from '../cache.types.js'\nimport type { QueryContext } from '../RequestContext.js'\nimport {\n type ClientContext,\n type QueryClientContext,\n dedupe\n} from '../ClientContext.js'\nimport {\n type SignalsParams,\n baseQuery\n} from './base.js'\n\n/**\n * Create an operation that do requests on demand with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the operation.\n * @param fn - The request function that returns a promise of the data.\n * @param settings - Optional settings for the operation.\n * @returns A tuple containing the fetch function and signals for data, error, loading state, and the cache key.\n */\nexport function operation<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n key: ExtrasCacheKeyBuilder<P, E, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, ...E, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n fetch: (...extraParams: E) => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/**\n * Create an operation that do requests on demand with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the operation.\n * @param fn - The request function that returns a promise of the data.\n * @param settings - Optional settings for the operation.\n * @returns A tuple containing the fetch function and signals for data, error, loading state, and the cache key.\n */\nexport function operation<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n key: ExtrasCacheKeyBuilder<P, E, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, ...E]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n fetch: (...extraParams: E) => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/**\n * Create an operation that do requests on demand with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the operation.\n * @param fn - The request function that returns a promise of the data.\n * @param settings - Optional settings for the operation.\n * @returns A tuple containing the fetch function and signals for data, error, loading state, and the cache key.\n */\nexport function operation<\n P extends unknown[],\n R\n>(\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n fetch: () => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/**\n * Create an operation that do requests on demand with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the operation.\n * @param fn - The request function that returns a promise of the data.\n * @param settings - Optional settings for the operation.\n * @returns A tuple containing the fetch function and signals for data, error, loading state, and the cache key.\n */\nexport function operation<\n P extends unknown[],\n R\n>(\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: P) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n fetch: () => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: ReadableSignal<R | null>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function operation<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n this: ClientContext,\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, ...E, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings: ClientSetting<QueryClientContext<R>>[] = []\n) {\n const {\n clientCtx,\n fetch,\n $key,\n $data,\n $error,\n $loading\n } = baseQuery<P, E, R>(this, key, params, fn, [dedupe(true, false), ...settings])\n\n onStart($data, () => effectScope(() => clientCtx.mounted()))\n\n return [fetch, $data, $error, $loading, $key] as const\n}\n","import {\n type ReadableSignal,\n action,\n batch,\n computed,\n readonly,\n signal\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport {\n type ClientContext,\n type MutationClientContext,\n forkMutationClient\n} from '../ClientContext.js'\nimport { RequestContext } from '../RequestContext.js'\n\n/**\n * Create a mutation that performs data modifications with cache management.\n * @param fn - The mutator function that returns a promise of the result.\n * @param settings - Optional settings for the mutation.\n * @returns A tuple containing the mutate function and signals for data, error, and loading state.\n */\nexport function mutation<\n P extends unknown[],\n R\n>(\n fn: (...args: [...P, requestCtx: RequestContext<R>]) => Promise<R>,\n settings?: ClientSetting<MutationClientContext<R>>[]\n): readonly [\n mutate: (...params: P) => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: ReadableSignal<R | null>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>\n]\n\n/**\n * Create a mutation that performs data modifications with cache management.\n * @param fn - The mutator function that returns a promise of the result.\n * @param settings - Optional settings for the mutation.\n * @returns A tuple containing the mutate function and signals for data, error, and loading state.\n */\nexport function mutation<\n P extends unknown[],\n R\n>(\n fn: (...args: P) => Promise<R>,\n settings?: ClientSetting<MutationClientContext<R>>[]\n): readonly [\n mutate: (...params: P) => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: ReadableSignal<R | null>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>\n]\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function mutation<\n P extends unknown[],\n R\n>(\n this: ClientContext,\n fn: (...args: [...P, requestCtx: RequestContext<R>]) => Promise<R>,\n settings: ClientSetting<MutationClientContext<R>>[] = []\n) {\n const clientCtx = forkMutationClient<R>(this, settings)\n const {\n mapComputedData,\n $disabled,\n loadingDedupe\n } = clientCtx\n const $result = signal<R | null>(null)\n const $data = computed(() => mapComputedData($result()))\n const $error = signal<string | null>(null)\n const $loading = signal(false)\n let prevRequestCtx: RequestContext<R> | undefined\n const fetch = action((...params: P) => {\n if (\n $disabled?.() === true\n || loadingDedupe && $loading()\n ) {\n return Promise.resolve() as Promise<undefined>\n }\n\n const requestCtx = prevRequestCtx = new RequestContext(prevRequestCtx)\n\n return clientCtx.run(\n requestCtx,\n () => {\n $loading(true)\n\n return fn(...params, requestCtx)\n },\n (data, error) => {\n if (prevRequestCtx === requestCtx) {\n batch(() => {\n if (error === null) {\n $result(data)\n }\n\n $error(error)\n $loading(false)\n })\n }\n }\n )\n })\n\n return [\n fetch,\n $data,\n readonly($error),\n readonly($loading)\n ] as const\n}\n","import type {\n ClientExtension,\n ExtendedClient,\n AnyClientSetting,\n AnyClientExtension\n} from './client.types.js'\nimport {\n type QueryClientContext,\n type MutationClientContext,\n ClientContext\n} from './ClientContext.js'\nimport {\n dataCacheFacade,\n errorCacheFacade,\n loadingCacheFacade\n} from './cache.js'\nimport {\n query,\n infinite,\n operation,\n mutation\n} from './queries/index.js'\n\nexport * from './client.types.js'\n\n/**\n * Create a query client with optional settings and extensions.\n * @param settings - The client settings and extensions.\n * @returns The query client.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function client<S extends (AnyClientSetting | AnyClientExtension)[]>(...settings: S) {\n const ctx = new ClientContext()\n const client = {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n query: query.bind(ctx) as typeof query,\n invalidate: (key => ctx.invalidate(key)) as typeof ctx.invalidate,\n revalidate: (key => ctx.revalidate(key)) as typeof ctx.revalidate,\n $data: dataCacheFacade(ctx),\n $error: errorCacheFacade(ctx),\n $loading: loadingCacheFacade(ctx)\n }\n\n for (const setting of settings) {\n setting(ctx as QueryClientContext & MutationClientContext, client)\n }\n\n return client as ExtendedClient<typeof client, S>\n}\n\ninterface InfinitesExtension {\n infinite: typeof infinite\n}\n\n/**\n * Extend client with infinite query capability.\n * @returns The client extension.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function infinites() {\n return ((ctx, client) => {\n (client as InfinitesExtension).infinite = infinite.bind(ctx)\n\n return client\n }) as ClientExtension<InfinitesExtension>\n}\n\ninterface OperationsExtension {\n operation: typeof operation\n}\n\n/**\n * Extend client with operation capability.\n * @returns The client extension.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function operations() {\n return ((ctx, client) => {\n (client as OperationsExtension).operation = operation.bind(ctx)\n\n return client\n }) as ClientExtension<OperationsExtension>\n}\n\ninterface MutationsExtension {\n mutation: typeof mutation\n}\n\n/**\n * Extend client with mutation capability.\n * @returns The client extension.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function mutations() {\n return ((ctx, client) => {\n (client as MutationsExtension).mutation = mutation.bind(ctx)\n\n return client\n }) as ClientExtension<MutationsExtension>\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/settings/abortable.ts","../src/cache.ts","../src/settings/entities.ts","../src/map.ts","../src/CacheStorage.ts","../src/settings/persistence.ts","../src/settings/indexedDbStorage.ts","../src/utils.ts","../src/settings/revalidateOnFocus.ts","../src/settings/revalidateOnInterval.ts","../src/settings/revalidateOnReconnect.ts","../src/settings/retryOnError.ts","../src/settings/hydratable.ts","../src/ClientContext.ts","../src/settings/ssr.ts","../src/RequestContext.ts","../src/queries/base.ts","../src/queries/query.ts","../src/queries/infinite.ts","../src/queries/operation.ts","../src/queries/mutation.ts","../src/client.ts"],"sourcesContent":["import type { ClientSetting } from '../client.types.js'\nimport type { ClientContext } from '../ClientContext.js'\nimport type { RequestContext } from '../RequestContext.js'\n\ninterface AbortableContext extends ClientContext {\n abortable?: boolean\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst abortControllers = new WeakMap<RequestContext<any> | Promise<any>, AbortController>()\n\n/**\n * Returns the AbortSignal for the given RequestContext\n * @param ctx - RequestContext\n * @returns AbortSignal\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function abortSignal<T>(ctx: RequestContext<T>) {\n let controller = abortControllers.get(ctx)\n\n if (!controller) {\n abortControllers.set(ctx, controller = new AbortController())\n }\n\n return controller.signal\n}\n\n/**\n * Aborts request associated with the given Promise or RequestContext\n * @param promiseOrCtx - Promise or RequestContext\n */\nexport function abort<T>(promiseOrCtx: Promise<T> | RequestContext<T>) {\n abortControllers.get(promiseOrCtx)?.abort()\n}\n\n/**\n * Aborts previous request associated with the given RequestContext\n * @param ctx - RequestContext\n */\nexport function abortPrevious<T>(ctx: RequestContext<T>) {\n abort(ctx.prevCtx!)\n}\n\n/**\n * Make requests abortable.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function abortable(): ClientSetting {\n return (ctx: AbortableContext) => {\n if (ctx.abortable === undefined) {\n const superRun = ctx.run\n\n ctx.run = function (\n this: ClientContext,\n requestCtx: RequestContext<unknown>,\n start,\n onSettled: (data: unknown, error: string | null) => void,\n interrupt\n ) {\n let abortController: AbortController | undefined\n const promise = superRun.call(\n this,\n requestCtx,\n start,\n onSettled,\n error => interrupt?.(error) || abortController?.signal.aborted === true\n )\n\n if (abortController = abortControllers.get(requestCtx)) {\n abortControllers.set(promise, abortController)\n void promise.finally(() => abortControllers.delete(promise))\n }\n\n return promise\n } as typeof superRun\n }\n\n ctx.abortable = true\n }\n}\n","import type { NewValue } from '@nano_kit/store'\nimport type {\n CacheKeyBuilder,\n CacheDataFacade,\n CacheKey,\n ExtrasCacheKeyBuilder\n} from './cache.types.js'\nimport type { CacheStorage } from './CacheStorage.js'\n\nexport * from './cache.types.js'\n\n/**\n * Create a query cache key builder.\n * @param name - The cache shard name.\n * @param filter - Optional filter to process parameters before building the key.\n * @returns The cache key builder.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function queryKey<P extends unknown[], R>(\n name: string,\n filter: (params: Partial<P>) => unknown[] = params => params\n) {\n const key = ((...params: Partial<P>) => ({\n shard: name,\n key: JSON.stringify(filter(params))\n })) as CacheKeyBuilder<P, R>\n\n key.shard = name\n key.key = undefined\n\n return key\n}\n\n/**\n * Create an operation cache key builder with extra parameters.\n * @param name - The cache shard name.\n * @param filter - Optional filter to process parameters before building the key.\n * @returns The extras cache key builder.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function operationKey<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n name: string,\n filter?: (params: Partial<P>) => unknown[]\n) {\n return queryKey<P, R>(name, filter) as ExtrasCacheKeyBuilder<P, E, R>\n}\n\n/**\n * Create cache getter/setter for data.\n * @param cache - The cache map.\n * @returns The data getter/setter.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function dataCacheFacade(cache: CacheStorage) {\n return dataCacheGetterSetter.bind(cache) as CacheDataFacade\n}\n\nfunction dataCacheGetterSetter<P extends unknown[], R>(\n this: CacheStorage,\n key: CacheKey<P, R>,\n ...value: [NewValue<R | null>]\n) {\n if (value.length) {\n const newValue = value[0]\n\n this.set(key, (entry = this.initial()) => ({\n ...entry,\n data: typeof newValue === 'function'\n ? (newValue as (value: unknown) => unknown)(entry.data)\n : newValue\n }))\n } else {\n return this.$get(key).data as R | null\n }\n}\n\n/**\n * Create cache getter for loading state.\n * @param cache - The cache map.\n * @returns The loading state getter.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function loadingCacheFacade(cache: CacheStorage) {\n return (key: CacheKey) => cache.$get(key).loading\n}\n\n/**\n * Create cache getter for error state.\n * @param cache - The cache map.\n * @returns The error state getter.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function errorCacheFacade(cache: CacheStorage) {\n return (key: CacheKey) => cache.$get(key).error\n}\n","import type { PickNonEmptyValue } from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { CacheKey } from '../CacheStorage.types.js'\nimport type {\n ClientContext,\n MutationClientContext,\n QueryClientContext\n} from '../ClientContext.js'\nimport { queryKey } from '../cache.js'\n\nexport interface Entity<T extends {}> {\n /**\n * Get the cache key for the entity by its identifier.\n */\n (id: number | string): CacheKey<[id: number | string], T | null>\n /**\n * Get or upsert the entity in the cache.\n */\n (entity: T): T\n}\n\nconst ENTITY_KEY = '#entity'\nconst EntityKey = queryKey(ENTITY_KEY)\n\ninterface EntityRef {\n [ENTITY_KEY]: CacheKey\n}\n\nfunction isIdentifier(value: unknown): value is number | string {\n const type = typeof value\n\n return type === 'number' || type === 'string'\n}\n\nfunction isEntityRef<T extends {}>(value: T): value is T & EntityRef {\n return ENTITY_KEY in value\n}\n\nlet currentCtx: ClientContext | null = null\n\n/**\n * Create an entity manager for a specific entity type.\n * @param name - The name of the entity type.\n * @returns The entity manager.\n */\nexport function entity<T extends { id: number | string }>(\n name: string\n): Entity<T>\n\n/**\n * Create an entity manager for a specific entity type.\n * @param name - The name of the entity type.\n * @param id - A function to extract the identifier from the entity.\n * @returns The entity manager.\n */\nexport function entity<T extends {}>(\n name: string,\n id: (entity: T) => number | string\n): Entity<T>\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function entity<T extends { id: number | string }>(\n name: string,\n id = (entity: T) => entity.id\n) {\n return (idOrRefOrEntity: number | string | null | undefined | T) => {\n if (isIdentifier(idOrRefOrEntity)) {\n return EntityKey(name, idOrRefOrEntity)\n }\n\n if (!idOrRefOrEntity || !currentCtx) {\n return idOrRefOrEntity\n }\n\n if (isEntityRef(idOrRefOrEntity)) {\n return currentCtx.$get(idOrRefOrEntity[ENTITY_KEY]).data\n }\n\n const key = EntityKey(name, id(idOrRefOrEntity))\n\n currentCtx.set(key, {\n ...currentCtx.initial(),\n data: idOrRefOrEntity\n })\n\n return {\n ...idOrRefOrEntity,\n [ENTITY_KEY]: key\n }\n }\n}\n\n/**\n * Map entities from the fetched data.\n * @param mapper - A function to map entities from the fetched data.\n * @returns The client setting function.\n */\nexport function entities<T>(\n mapper: (data: NoInfer<PickNonEmptyValue<T>>) => NoInfer<PickNonEmptyValue<T>>\n): ClientSetting<QueryClientContext<T>>\n\n/**\n * Map entities from the fetched data.\n * @param mapper - A function to map entities from the fetched data.\n * @returns The client setting function.\n */\nexport function entities<T>(\n mapper: (data: NoInfer<PickNonEmptyValue<T>>) => NoInfer<PickNonEmptyValue<T>>\n): ClientSetting<MutationClientContext<T>>\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function entities(mapper: (data: unknown) => unknown) {\n return (ctx: ClientContext) => {\n const safeMapper = (data: unknown) => {\n if (data) {\n try {\n currentCtx = ctx\n\n return mapper(data)\n } finally {\n currentCtx = null\n }\n }\n\n return data\n }\n\n ctx.mapComputedData = ctx.mapData = safeMapper\n }\n}\n","import {\n type SignalsMap,\n type SignalsMapEvents,\n type NewValue,\n batch,\n $getMapKey,\n setMapKey,\n clearMap,\n deleteMapKey,\n $$insert,\n fireMapEvent,\n subMapEvent\n} from '@nano_kit/store'\n\nexport interface ShardKey<S> {\n shard: S\n key?: undefined\n}\n\nexport interface ShardedKey<S, K> {\n shard: S\n key: K\n}\n\nexport interface ShardedSignalsMap<S, K, T> extends SignalsMapEvents, Map<\n S,\n SignalsMap<K, T>\n> {}\n\n/**\n * Check if sharded map has the key.\n * Checks full key.\n * @param map - The sharded map.\n * @param shardedKey - The sharded key.\n * @returns True if the sharded map has the key, false otherwise.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function hasShardedMapKey<S, K, T>(\n map: ShardedSignalsMap<S, K, T>,\n shardedKey: ShardKey<S> | ShardedKey<S, K>\n) {\n const {\n shard,\n key\n } = shardedKey\n\n if (key === undefined) {\n return map.has(shard)\n }\n\n return map.get(shard)?.has(key) || false\n}\n\n/**\n * Get value from sharded map by key.\n * @param map - The sharded map.\n * @param shardedKey - The sharded key.\n * @returns The value or undefined if not found.\n */\nexport function $getShardedMapKey<S, K, T>(\n map: ShardedSignalsMap<S, K, T>,\n shardedKey: ShardedKey<S, K>\n) {\n const {\n shard,\n key\n } = shardedKey\n let shardMap\n\n if ((shardMap = map.get(shard)) === undefined) {\n subMapEvent(map, $$insert)\n return undefined\n }\n\n return $getMapKey(shardMap, key)\n}\n\n/**\n * Set value in sharded map by key.\n * If sharded key contains only shard name, sets value for all entries in the shard.\n * @param map - The sharded map.\n * @param shardedKey - The sharded key.\n * @param value - The value to set.\n */\nexport function setShardedMapKey<S, K, T>(\n map: ShardedSignalsMap<S, K, T>,\n shardedKey: ShardKey<S> | ShardedKey<S, K>,\n value: NewValue<T | undefined>\n) {\n const {\n shard,\n key\n } = shardedKey\n let shardMap = map.get(shard)\n const shardExists = shardMap !== undefined\n\n if (key === undefined) {\n if (shardExists) {\n batch(() => {\n for (const params of shardMap!.keys()) {\n setMapKey(shardMap!, params, value)\n }\n })\n }\n\n return\n }\n\n if (!shardExists) {\n map.set(\n shard,\n shardMap = new Map<K, T>() as SignalsMap<K, T>\n )\n }\n\n setMapKey(shardMap!, key, value)\n\n if (!shardExists) {\n fireMapEvent(map, $$insert)\n }\n}\n\n/**\n * Delete sharded map key.\n * If sharded key contains only shard name, deletes all entries in the shard.\n * @param map - The sharded map.\n * @param shardedKey - The sharded key.\n */\nexport function deleteShardedMapKey<S, K, T>(\n map: ShardedSignalsMap<S, K, T>,\n shardedKey: ShardKey<S> | ShardedKey<S, K>\n) {\n const {\n shard,\n key\n } = shardedKey\n const shardMap = map.get(shard)\n\n if (shardMap === undefined) {\n return\n }\n\n if (key === undefined) {\n clearMap(shardMap)\n return\n }\n\n deleteMapKey(shardMap, key)\n}\n","import type { NewValue } from '@nano_kit/store'\nimport type {\n CacheMap,\n CacheShardKey,\n CacheKey,\n CacheEntry\n} from './CacheStorage.types.js'\nimport {\n hasShardedMapKey,\n $getShardedMapKey,\n setShardedMapKey,\n deleteShardedMapKey\n} from './map.js'\n\nexport * from './CacheStorage.types.js'\n\nexport const DEFAULT_DEDUPE_TIME = 4_000\nexport const DEFAULT_CACHE_TIME = Infinity\nexport const UNSET_REV = Infinity\n\n/*\nREV\n< 0 = locked, do not fetch\n0 = unset, need to fetch\n> 0 = current revision, used to identify latest fetch\n*/\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function revLock(rev: number) {\n return rev > 0 ? rev * -1 : rev\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function revLocked(rev: number) {\n return rev < 0\n}\n\nlet revCounter = 0\n\nexport class CacheStorage {\n dedupeTime = DEFAULT_DEDUPE_TIME\n cacheTime = DEFAULT_CACHE_TIME\n cache: CacheMap = new Map()\n\n initial() {\n return {\n rev: UNSET_REV,\n dedupes: 0,\n expires: 0,\n data: null,\n error: null,\n loading: false\n }\n }\n\n $get(key: CacheKey) {\n const cache = this.cache\n\n if (!hasShardedMapKey(cache, key)) {\n setShardedMapKey(cache, key, this.initial())\n }\n\n const result = $getShardedMapKey(cache, key)!\n\n return result\n }\n\n set(\n key: CacheShardKey | CacheKey,\n entry: NewValue<CacheEntry | undefined>\n ) {\n setShardedMapKey(this.cache, key, entry)\n }\n\n /**\n * Invalidate cache entry for the given key.\n * If shard key is used, invalidate all entries in the shard.\n * @param key - The cache key to invalidate.\n */\n invalidate(key: CacheShardKey | CacheKey) {\n deleteShardedMapKey(this.cache, key)\n }\n\n /**\n * Revalidate cache entry for the given key.\n * If shard key is used, revalidate all entries in the shard.\n * @param key - The cache key to revalidate.\n */\n revalidate(key: CacheShardKey | CacheKey) {\n if (key.key === undefined || hasShardedMapKey(this.cache, key)) {\n this.set(key, entry => ({\n ...entry!,\n rev: UNSET_REV,\n dedupes: 0\n }))\n }\n }\n\n mute(entry: CacheEntry, loadingDedupe = true, timeDedupe = true) {\n return (\n loadingDedupe && entry.loading\n || timeDedupe && entry.dedupes > Date.now()\n || revLocked(entry.rev)\n )\n }\n\n loading(key: CacheKey) {\n const rev = ++revCounter\n\n this.set(key, (entry = this.initial()) => ({\n ...entry,\n rev,\n data: entry.expires > Date.now() ? entry.data : null,\n error: null,\n loading: true\n }))\n\n return rev\n }\n\n settled(\n key: CacheKey,\n data: unknown,\n error: string | null,\n rev?: number\n ) {\n const now = Date.now()\n\n this.set(key, (entry = this.initial()) => (\n rev !== undefined && rev !== entry.rev\n ? entry\n : {\n ...entry,\n dedupes: now + this.dedupeTime,\n expires: now + this.cacheTime,\n data: error === null ? data : entry.data,\n error,\n loading: false\n }\n ))\n }\n}\n","import { untracked } from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheShardKey,\n CacheEntry\n} from '../CacheStorage.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport { revLock, revLocked, UNSET_REV } from '../CacheStorage.js'\nimport { hasShardedMapKey } from '../map.js'\n\ninterface PersistenceContext extends QueryClientContext {\n persistenceLifetime?: number\n}\n\nexport interface Storage {\n get(key: CacheKey): Promise<CacheEntry | null>\n set(key: CacheKey, entry: CacheEntry, lifetime: number): Promise<void>\n delete(key: CacheShardKey | CacheKey): Promise<void>\n}\n\n/**\n * Generic persistent storage client setting.\n * @param storage - The storage implementation to use for persistence.\n * @param lifetime - How long to keep entries in storage in milliseconds.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function persistence(storage: Storage | null, lifetime: number): ClientSetting<QueryClientContext> {\n return (ctx: PersistenceContext) => {\n if (!storage) {\n return\n }\n\n if (ctx.persistenceLifetime === undefined) {\n const superGet = ctx.$get\n const superSet = ctx.set\n const superInvalidate = ctx.invalidate\n\n ctx.$get = function (key) {\n const cache = this.cache\n const hasKey = hasShardedMapKey(cache, key)\n const entry = superGet.call(this, key)\n\n if (hasKey) {\n return entry\n }\n\n superSet.call(this, key, {\n ...entry,\n rev: revLock(entry.rev)\n })\n\n void this.task(storage.get(key).then(storedEntry => superSet.call(this, key, {\n ...entry,\n ...storedEntry,\n rev: UNSET_REV\n })))\n\n return superGet.call(this, key)\n }\n\n function saveSingleEntry(\n this: PersistenceContext,\n key: CacheKey\n ) {\n const entry = untracked(superGet.bind(this, key))\n\n if (entry && !entry.loading && !entry.error && !revLocked(entry.rev)) {\n void this.task(storage!.set(key, entry, this.persistenceLifetime!))\n }\n }\n\n ctx.set = function (cacheKey, entry) {\n superSet.call(this, cacheKey, entry)\n\n const {\n shard,\n key\n } = cacheKey\n\n if (key !== undefined) {\n saveSingleEntry.call(this, cacheKey)\n } else {\n const shardMap = this.cache.get(shard)\n\n if (shardMap) {\n for (const key of shardMap.keys()) {\n saveSingleEntry.call(this, {\n shard,\n key\n } as CacheKey)\n }\n }\n }\n }\n\n ctx.invalidate = function (key) {\n superInvalidate.call(this, key)\n void this.task(storage.delete(key))\n }\n }\n\n ctx.persistenceLifetime = lifetime\n }\n}\n","import type {\n CacheKey,\n CacheShardKey,\n CacheEntry\n} from '../CacheStorage.types.js'\nimport type { Storage } from './persistence.js'\n\nexport const DB_NAME = 'nano_kit'\nexport const STORE_NAME = 'query'\nexport const DB_VERSION = 1\n\ninterface StoredEntry {\n shard: string\n key: string\n data: CacheEntry\n expires: number\n}\n\nexport function connect(): Promise<IDBDatabase | null> {\n return new Promise((resolve) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n\n request.onerror = () => resolve(null)\n\n request.onsuccess = () => resolve(request.result)\n\n request.onupgradeneeded = () => {\n const db = request.result\n\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, {\n keyPath: ['shard', 'key']\n })\n\n store.createIndex('shard', 'shard', {\n unique: false\n })\n }\n }\n })\n}\n\nexport async function SELECT(\n connection: Promise<IDBDatabase | null>,\n key: CacheKey\n): Promise<CacheEntry | null> {\n const db = await connection\n\n if (!db) {\n return null\n }\n\n return new Promise((resolve) => {\n const transaction = db.transaction(STORE_NAME, 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.get([key.shard, key.key])\n\n request.onerror = () => resolve(null)\n\n request.onsuccess = () => {\n const result = request.result as StoredEntry | undefined\n\n if (!result) {\n resolve(null)\n return\n }\n\n const now = Date.now()\n\n if (result.expires < now || result.data.expires < now) {\n void DELETE(connection, key)\n resolve(null)\n return\n }\n\n resolve(result.data)\n }\n })\n}\n\nexport async function SET(\n connection: Promise<IDBDatabase | null>,\n cacheKey: CacheKey,\n entry: CacheEntry,\n lifetime: number\n): Promise<void> {\n const db = await connection\n\n if (!db) {\n return\n }\n\n return new Promise((resolve) => {\n const {\n shard,\n key\n } = cacheKey\n const transaction = db.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const storedEntry: StoredEntry = {\n shard,\n key,\n data: entry,\n expires: Date.now() + lifetime\n }\n const request = store.put(storedEntry)\n\n request.onerror = () => resolve()\n request.onsuccess = () => resolve()\n })\n}\n\nexport async function DELETE(\n connection: Promise<IDBDatabase | null>,\n cacheKey: CacheShardKey | CacheKey\n): Promise<void> {\n const db = await connection\n\n if (!db) {\n return\n }\n\n return new Promise((resolve) => {\n const {\n shard,\n key\n } = cacheKey\n const transaction = db.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n\n if (key === undefined) {\n const index = store.index('shard')\n const range = IDBKeyRange.only(shard)\n const request = index.openCursor(range)\n\n request.onerror = () => resolve()\n\n request.onsuccess = () => {\n const cursor = request.result\n\n if (cursor) {\n cursor.delete()\n cursor.continue()\n } else {\n resolve()\n }\n }\n } else {\n const request = store.delete([shard, key])\n\n request.onerror = () => resolve()\n request.onsuccess = () => resolve()\n }\n })\n}\n\n/**\n * IndexedDB adapter for persistent storage.\n * @returns IndexedDB storage implementation or null if IndexedDB is not supported.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function indexedDbStorage(): Storage | null {\n if (typeof indexedDB === 'undefined') {\n return null\n }\n\n const db = connect()\n\n return {\n get(key: CacheKey) {\n return SELECT(db, key)\n },\n set(cacheKey: CacheKey, entry: CacheEntry, lifetime: number) {\n return SET(db, cacheKey, entry, lifetime)\n },\n delete(cacheKey: CacheShardKey | CacheKey) {\n return DELETE(db, cacheKey)\n }\n }\n}\n","/* @__NO_SIDE_EFFECTS__ */\nexport function addFn<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends (...args: any[]) => void\n>(prevFn: T | undefined, fn: T): T {\n if (prevFn === undefined) {\n return fn\n }\n\n return function (this: unknown, ...args: Parameters<T>) {\n prevFn.apply(this, args)\n fn.apply(this, args)\n } as T\n}\n\nexport function settle<T, R>(\n promise: Promise<T>,\n onSettled: (data: T | undefined, error?: unknown) => R\n) {\n return promise.then(\n onSettled,\n error => onSettled(undefined, error)\n )\n}\n","import {\n listen,\n external,\n onMount,\n mountable\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport { addFn } from '../utils.js'\n\ninterface RevalidateOnFocusContext extends QueryClientContext {\n revalidateOnFocusEnabled?: boolean\n}\n\n/**\n * @todo Move to common extras package\n */\nexport const $windowVisible = external<boolean>(($windowVisible) => {\n if (typeof document === 'undefined') {\n $windowVisible(true)\n return\n }\n\n const set = () => $windowVisible(!document.hidden)\n\n set()\n\n onMount(mountable($windowVisible), () => {\n document.addEventListener('visibilitychange', set)\n\n return () => {\n document.removeEventListener('visibilitychange', set)\n }\n })\n})\n\n/**\n * Revalidate the query when the window gains focus.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function revalidateOnFocus(): ClientSetting<QueryClientContext> {\n return (ctx: RevalidateOnFocusContext) => {\n if (ctx.revalidateOnFocusEnabled === undefined) {\n ctx.mounted = addFn(ctx.mounted, function (this: RevalidateOnFocusContext) {\n listen($windowVisible, (visible) => {\n if (visible) {\n this.revalidate(this.$key())\n }\n })\n })\n }\n\n ctx.revalidateOnFocusEnabled = true\n }\n}\n","import { effect } from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport { addFn } from '../utils.js'\n\ninterface RevalidateOnIntervalContext extends QueryClientContext {\n revalidateInterval?: number\n}\n\n/**\n * Revalidate the query on a specified interval.\n * @param interval - The interval in milliseconds.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function revalidateOnInterval(interval: number): ClientSetting<QueryClientContext> {\n return (ctx: RevalidateOnIntervalContext) => {\n if (ctx.revalidateInterval === undefined) {\n ctx.mounted = addFn(ctx.mounted, function (this: RevalidateOnIntervalContext) {\n effect(() => {\n const id = setInterval(() => {\n this.revalidate(this.$key())\n }, this.revalidateInterval)\n\n return () => clearInterval(id)\n })\n })\n }\n\n ctx.revalidateInterval = interval\n }\n}\n","import {\n listen,\n external,\n onMount,\n mountable\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport { addFn } from '../utils.js'\n\ninterface RevalidateOnReconnectContext extends QueryClientContext {\n revalidateOnReconnectEnabled?: boolean\n}\n\n/**\n * @todo Move to common extras package\n */\nexport const $networkOnline = external<boolean>(($networkOnline) => {\n if (typeof navigator === 'undefined') {\n $networkOnline(true)\n return\n }\n\n const set = () => $networkOnline(navigator.onLine)\n\n set()\n\n onMount(mountable($networkOnline), () => {\n window.addEventListener('online', set)\n window.addEventListener('offline', set)\n\n return () => {\n window.removeEventListener('online', set)\n window.removeEventListener('offline', set)\n }\n })\n})\n\n/**\n * Revalidate the query when the network reconnects.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function revalidateOnReconnect(): ClientSetting<QueryClientContext> {\n return (ctx: RevalidateOnReconnectContext) => {\n if (ctx.revalidateOnReconnectEnabled === undefined) {\n ctx.mounted = addFn(ctx.mounted, function (this: RevalidateOnReconnectContext) {\n listen($networkOnline, (online) => {\n if (online) {\n this.revalidate(this.$key())\n }\n })\n })\n }\n\n ctx.revalidateOnReconnectEnabled = true\n }\n}\n","import type { ClientSetting } from '../client.types.js'\nimport type { CacheKey } from '../CacheStorage.types.js'\nimport type { QueryClientContext } from '../ClientContext.js'\nimport type { QueryContext } from '../RequestContext.js'\n\nexport type CalcRetryDelay = (retryCount: number, error: unknown) => number\n\ninterface RetryContext extends QueryClientContext {\n retryCounts?: Map<string, number>\n retryTimeoutId?: ReturnType<typeof setTimeout>\n calcRetryDelay?: CalcRetryDelay\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function defaultCalcRetryDelay(retryCount: number) {\n return (\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ~~((Math.random() + 0.5) * (1 << (retryCount < 8 ? retryCount : 8))) * 2000\n )\n}\n\nfunction getRetryCount(ctx: RetryContext, key: CacheKey) {\n return ctx.retryCounts?.get(key.key) || 0\n}\n\nfunction setRetryCount(ctx: RetryContext, key: CacheKey, count: number) {\n (ctx.retryCounts ??= new Map()).set(key.key, count)\n}\n\nfunction clearRetryCount(ctx: RetryContext, key: CacheKey) {\n ctx.retryCounts?.delete(key.key)\n}\n\n/**\n * Retry the query on error with exponential backoff.\n * @param calcRetryDelay - Function to calculate the delay before retrying.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function retryOnError(\n calcRetryDelay: CalcRetryDelay = defaultCalcRetryDelay\n): ClientSetting<QueryClientContext> {\n return (ctx: RetryContext) => {\n if (ctx.calcRetryDelay === undefined) {\n const superRun = ctx.run\n\n ctx.run = function (\n this: RetryContext,\n queryCtx: QueryContext<unknown[], unknown>,\n start,\n onSettled: (data: unknown, error: string | null) => void,\n interrupt\n ) {\n clearTimeout(this.retryTimeoutId)\n\n const promise = superRun.call(this, queryCtx, start, onSettled, interrupt)\n\n if (!('shard' in queryCtx)) {\n return promise\n }\n\n void this.task(promise.then(\n (result) => {\n const error = result?.[1]\n\n if (!error) {\n clearRetryCount(this, queryCtx)\n } else {\n const retryCount = getRetryCount(this, queryCtx) + 1\n const delay = this.calcRetryDelay!(retryCount, error)\n\n this.retryTimeoutId = setTimeout(() => {\n this.invalidate(queryCtx)\n setRetryCount(this, queryCtx, retryCount)\n }, delay)\n }\n }\n ))\n\n return promise\n } as typeof superRun\n }\n\n ctx.calcRetryDelay = calcRetryDelay\n }\n}\n","import {\n type AnyAccessor,\n type Hydrator,\n Hydrator$,\n Hydratables$,\n inject\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type { ClientContext } from '../ClientContext.js'\nimport type {\n CacheMap,\n CacheEntry,\n SerializedCacheEntry\n} from '../CacheStorage.types.js'\nimport { setShardedMapKey } from '../map.js'\n\ninterface HydratableContext extends ClientContext {\n hydratable?: boolean\n}\n\ntype SerializedShardedMap = [string, string, SerializedCacheEntry][]\n\nconst id = '@nano_kit/query'\n\nfunction mapEntry(\n entry: CacheEntry,\n map: StringConstructor\n): SerializedCacheEntry\n\nfunction mapEntry(\n entry: SerializedCacheEntry,\n map: NumberConstructor\n): CacheEntry\n\nfunction mapEntry(\n entry: CacheEntry | SerializedCacheEntry,\n map: StringConstructor | NumberConstructor\n) {\n return {\n ...entry,\n rev: map(entry.rev),\n dedupes: map(entry.dedupes),\n expires: map(entry.expires)\n }\n}\n\nfunction serialize(cache: CacheMap) {\n const serialized: SerializedShardedMap = []\n\n cache.forEach((shard, shardKey) => {\n shard.forEach(($signal, key) => {\n const value = $signal?.()\n\n if (value !== undefined) {\n serialized.push([shardKey, key, mapEntry(value, String)])\n }\n })\n })\n\n return serialized\n}\n\nfunction deserialize(cache: CacheMap, serialized: SerializedShardedMap) {\n serialized.forEach(([shard, key, value]) => {\n setShardedMapKey(cache, {\n shard,\n key\n }, mapEntry(value, Number))\n })\n}\n\n/**\n * Make client cache hydratable.\n * Without arguments, it will try to inject {@link Hydrator$} and {@link Hydratables$} from the injection context.\n * @param hydrator - Optional hydrator to use for rehydrating the cache. Pass `null` to skip hydration and only register for dehydration.\n * @param hydratables - Optional map to register the cache serializer for dehydration.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function hydratable(\n hydrator?: Hydrator | null,\n hydratables?: Map<string, AnyAccessor> | null\n): ClientSetting {\n return (ctx: HydratableContext) => {\n if (!ctx.hydratable) {\n const finalHydrator = hydrator === undefined\n ? inject(Hydrator$)\n : hydrator\n\n if (finalHydrator) {\n finalHydrator.pull(id, (value) => {\n deserialize(ctx.cache, value as SerializedShardedMap)\n })\n } else {\n const finalHydratables = hydratables === undefined\n ? inject(Hydratables$)\n : hydratables\n\n if (finalHydratables) {\n finalHydratables.set(id, () => serialize(ctx.cache))\n }\n }\n }\n\n ctx.hydratable = true\n }\n}\n","import {\n type ReadableSignal,\n type Accessor,\n type TasksRunner,\n type Task,\n TasksRunner$,\n taskPromise,\n inject\n} from '@nano_kit/store'\nimport type { ClientSetting } from './client.types.js'\nimport type { RequestContext } from './RequestContext.js'\nimport {\n type CacheKey,\n type CacheEntry,\n CacheStorage\n} from './CacheStorage.js'\nimport {\n addFn,\n settle\n} from './utils.js'\n\nexport type OnEveryError = (error: unknown, stopped: boolean) => void\n\nexport class ClientContext<T = unknown> extends CacheStorage {\n $key?: ReadableSignal<CacheKey> = undefined\n $disabled?: Accessor<boolean> = undefined\n loadingDedupe = true\n timeDedupe = true\n onEveryError: OnEveryError | undefined = undefined\n\n task<T>(task: Task<T>): Promise<T> {\n return taskPromise(task)\n }\n\n mapData(data: T): T {\n return data\n }\n\n mapComputedData(data: T | null): T | null {\n return data\n }\n\n mapError(error: unknown) {\n return (error as Error)?.message\n }\n\n mounted() {}\n\n override mute(entry: CacheEntry) {\n return (\n this.$disabled?.() === true\n || super.mute(entry, this.loadingDedupe, this.timeDedupe)\n )\n }\n\n run(\n requestCtx: RequestContext<T>,\n start: () => Promise<T>,\n onSettled: (data: T | null, error: string | null) => void,\n interrupt?: (error: unknown) => boolean\n ) {\n const {\n mapData,\n mapError\n } = this\n\n return this.task(settle(start(), (data, error) => {\n if (error && interrupt?.(error)) {\n return\n }\n\n const mappedData = mapData(data as T)\n const dataOrNull = error ? null : mappedData\n const errorString = error ? mapError(error) : null\n\n onSettled(dataOrNull, errorString)\n requestCtx.settled(mappedData, error)\n this.handleError(error, requestCtx.stopErrorPropagation)\n\n return [mappedData, error] as const\n }))\n }\n\n handleError(\n error: unknown,\n stopped: boolean\n ) {\n if (error !== undefined) {\n this.onEveryError?.(error, stopped)\n }\n }\n}\n\nexport interface QueryClientContext<T = unknown> extends ClientContext<T> {\n $key: ReadableSignal<CacheKey>\n Q: true\n}\n\nexport interface MutationClientContext<T = unknown> extends ClientContext<T> {\n $key: never\n M: true\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function forkMutationClient<T>(\n ctx: ClientContext,\n settings: ClientSetting<MutationClientContext<T>>[] = []\n) {\n const child = Object.create(ctx) as MutationClientContext<T>\n\n for (const setting of settings) {\n setting(child)\n }\n\n return child\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function forkQueryClient<T>(\n ctx: ClientContext,\n $key: ReadableSignal<CacheKey>,\n settings: ClientSetting<QueryClientContext<T>>[] = []\n) {\n const child = Object.create(ctx) as QueryClientContext<T>\n\n child.$key = $key\n\n for (const setting of settings) {\n setting(child)\n }\n\n return child\n}\n\n/**\n * Set dedupe time in which identical requests are deduped.\n * @param time - Dedupe time in milliseconds.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function dedupeTime(time: number): ClientSetting<QueryClientContext> {\n return ctx => ctx.dedupeTime = time\n}\n\n/**\n * Set cache time for cached query results.\n * @param time - Cache time in milliseconds.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function cacheTime(time: number): ClientSetting<QueryClientContext> {\n return ctx => ctx.cacheTime = time\n}\n\n/**\n * Map error object to string.\n * @param fn - Function to map error to string.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function mapError(fn: (error: unknown) => string): ClientSetting {\n return ctx => ctx.mapError = fn\n}\n\n/**\n * Register a callback to be called on every error.\n * @param fn - The error callback.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function onEveryError(fn: OnEveryError): ClientSetting {\n return ctx => ctx.onEveryError = addFn(ctx.onEveryError, fn)\n}\n\n/**\n * Disable requests when the signal is true.\n * @param $disabled - Readable signal indicating whether requests are disabled.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function disabled($disabled: Accessor<boolean>): ClientSetting {\n return ctx => ctx.$disabled = $disabled\n}\n\n/**\n * Enable or disable deduplication of requests (by loading state and dedupe time).\n * @param enabled - Whether deduplication is enabled.\n * @returns The client setting function.\n */\nexport function dedupe(dedupe: boolean): ClientSetting\n\n/**\n * Enable or disable deduplication of requests (by loading state and dedupe time).\n * @param loading - Whether loading state deduplication is enabled.\n * @param time - Whether time-based deduplication is enabled.\n * @returns The client setting function.\n */\nexport function dedupe(loading: boolean, time: boolean): ClientSetting<QueryClientContext>\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function dedupe(loading: boolean, time = loading): ClientSetting {\n return (ctx) => {\n ctx.loadingDedupe = loading\n ctx.timeDedupe = time\n }\n}\n\n/**\n * Set task runner for handling tasks.\n * Without arguments, it will try to inject tasks runner from context.\n * @param runner - The tasks runner function.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function tasks(runner: TasksRunner = inject(TasksRunner$)): ClientSetting {\n return ctx => ctx.task = runner\n}\n","import type { ClientSetting } from '../client.types.js'\nimport { tasks } from '../ClientContext.js'\nimport { hydratable } from './hydratable.js'\n\n/**\n * Client setting for enabling SSR support.\n * It combines tasks management and cache hydration to ensure that queries can be executed on the server and their results can be sent to the client for hydration.\n * Should be called inside injection context.\n * @returns The client setting function.\n */\nexport function ssr(): ClientSetting {\n const tasksSetting = tasks()\n const hydratableSetting = hydratable()\n\n return (ctx) => {\n tasksSetting(ctx)\n hydratableSetting(ctx)\n }\n}\n","import type { CacheKey } from './CacheStorage.types.js'\nimport { addFn } from './utils.js'\n\nexport type OnSuccess<T> = (data: T) => void\n\nexport type OnError = (error: unknown) => void\n\nexport type OnSettled<T> = (data: T | undefined, error: unknown) => void\n\nexport class RequestContext<T> {\n onSuccess: OnSuccess<T> | undefined = undefined\n onError: OnError | undefined = undefined\n onSettled: OnSettled<T> | undefined = undefined\n stopErrorPropagation = false\n prevCtx: RequestContext<T> | undefined = undefined\n\n constructor(prevCtx?: RequestContext<T>) {\n if (this.prevCtx = prevCtx) {\n prevCtx.prevCtx = undefined\n }\n }\n\n settled(data: T | undefined, error: unknown) {\n this.onSettled?.(data, error)\n\n if (error !== undefined) {\n this.onError?.(error)\n } else {\n this.onSuccess?.(data!)\n }\n }\n}\n\nexport class QueryContext<P extends unknown[], R>\n extends RequestContext<R>\n implements CacheKey<P, R> {\n shard: string\n key: string\n P!: P\n R!: R\n\n constructor(\n key: CacheKey<P, R>,\n prevCtx?: QueryContext<P, R>\n ) {\n super(prevCtx)\n\n this.shard = key.shard\n this.key = key.key\n }\n}\n\n/**\n * Add a success callback to the query context.\n * @param ctx - The query context.\n * @param fn - The success callback.\n */\nexport function onSuccess<T>(ctx: RequestContext<T>, fn: OnSuccess<T>) {\n ctx.onSuccess = addFn(ctx.onSuccess, fn)\n}\n\n/**\n * Add an error callback to the query context.\n * @param ctx - The query context.\n * @param fn - The error callback.\n */\nexport function onError<T>(ctx: RequestContext<T>, fn: OnError) {\n ctx.onError = addFn(ctx.onError, fn)\n}\n\n/**\n * Add a settled callback to the query context.\n * @param ctx - The query context.\n * @param fn - The settled callback.\n */\nexport function onSettled<T>(ctx: RequestContext<T>, fn: OnSettled<T>) {\n ctx.onSettled = addFn(ctx.onSettled, fn)\n}\n\n/**\n * Mark error as \"stopped\", so error will be passed to onEveryError with stopped=true.\n * @param ctx - The query context.\n */\nexport function stopErrorPropagation<T>(ctx: RequestContext<T>) {\n ctx.stopErrorPropagation = true\n}\n","import {\n type ReadableSignal,\n action,\n computed,\n mountable\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheKeyBuilder\n} from '../cache.types.js'\nimport { UNSET_REV } from '../CacheStorage.js'\nimport {\n type ClientContext,\n type QueryClientContext,\n forkQueryClient\n} from '../ClientContext.js'\nimport { QueryContext } from '../RequestContext.js'\n\nexport type SignalsParams<T extends unknown[]> = T extends [infer First, ...infer Rest]\n ? [ReadableSignal<First>, ...SignalsParams<Rest>]\n : []\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function baseQuery<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n rootCtx: ClientContext,\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, ...E, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n) {\n const $params = computed(() => params.map($signal => $signal()) as P)\n const $key = computed((prevKey?: CacheKey<P, R>) => {\n const nextKey = key(...$params())\n\n if (\n prevKey\n && prevKey.shard === nextKey.shard\n && prevKey.key === nextKey.key\n ) {\n return prevKey\n }\n\n return nextKey\n })\n const clientCtx = forkQueryClient<R>(rootCtx, $key, settings)\n const $entry = computed(() => clientCtx.$get($key()))\n /**\n * Changes on every entry rev reset\n */\n const $rev = computed((v: number = 0): number => ($entry().rev === UNSET_REV ? v + 1 : v))\n const { mapComputedData } = clientCtx\n const $data = mountable(computed(() => mapComputedData($entry().data as R | null)))\n const $error = computed(() => $entry().error)\n const $loading = computed(() => $entry().loading)\n let prevQueryCtx: QueryContext<P, R> | undefined\n const fetch = action((...extraParams: E) => {\n if (clientCtx.mute($entry())) {\n return Promise.resolve() as Promise<undefined>\n }\n\n const key = $key()\n const params = $params()\n const queryCtx = prevQueryCtx = new QueryContext<P, R>(key, prevQueryCtx)\n let rev: number | undefined\n\n return clientCtx.run(\n queryCtx,\n () => {\n rev = clientCtx.loading(key)\n\n return fn(...params, ...extraParams, queryCtx)\n },\n (data, error) => clientCtx.settled(key, data, error, rev)\n )\n })\n\n return {\n clientCtx,\n fetch,\n $params,\n $key,\n $rev,\n $data,\n $error,\n $loading\n }\n}\n","import {\n type Mountable,\n type ReadableSignal,\n effect,\n effectScope,\n onStart\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheKeyBuilder\n} from '../cache.types.js'\nimport type {\n ClientContext,\n QueryClientContext\n} from '../ClientContext.js'\nimport type { QueryContext } from '../RequestContext.js'\nimport {\n type SignalsParams,\n baseQuery\n} from './base.js'\n\n/**\n * Create a query that automatically fetches data when parameters change with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the query.\n * @param fn - The fetcher function that returns a promise of the data.\n * @param settings - Optional settings for the query.\n * @returns A tuple containing signals for data, error, loading state, and the cache key.\n */\nexport function query<\n P extends unknown[],\n R\n>(\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/**\n * Create a query that automatically fetches data when parameters change with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the query.\n * @param fn - The fetcher function that returns a promise of the data.\n * @param settings - Optional settings for the query.\n * @returns A tuple containing signals for data, error, loading state, and the cache key.\n */\nexport function query<\n P extends unknown[],\n R\n>(\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: P) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function query<P extends unknown[], R>(\n this: ClientContext,\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n) {\n const {\n clientCtx,\n fetch,\n $params,\n $key,\n $rev,\n $data,\n $error,\n $loading\n } = baseQuery<P, [], R>(this, key, params, fn, settings)\n\n onStart($data, () => effectScope(() => {\n effect(() => {\n $rev()\n $params()\n clientCtx.$disabled?.()\n void fetch()\n })\n\n clientCtx.mounted()\n }))\n\n return [$data, $error, $loading, $key] as const\n}\n","import {\n type Mountable,\n type ReadableSignal,\n action,\n effect,\n effectScope,\n onStart\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheKeyBuilder\n} from '../cache.types.js'\nimport type {\n ClientContext,\n QueryClientContext\n} from '../ClientContext.js'\nimport type { QueryContext } from '../RequestContext.js'\nimport {\n type SignalsParams,\n baseQuery\n} from './base.js'\n\nexport interface InfinitePages<P, C> {\n pages: P[]\n next: C | undefined\n more: boolean\n}\n\n/**\n * Create an infinite query that fetches paginated data with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the query.\n * @param next - A function to determine the next cursor from the last page.\n * @param fn - The fetcher function that returns a promise of the data.\n * @param settings - Optional settings for the query.\n * @returns A tuple containing the fetchNext function and signals for data, error, loading state, and the cache key.\n */\nexport function infinite<\n P extends unknown[],\n C,\n R\n>(\n key: CacheKeyBuilder<P, InfinitePages<R, C>>,\n params: SignalsParams<P>,\n next: (lastPage: R) => C | undefined,\n fn: (...args: [...P, cursor: C | undefined, queryCtx: QueryContext<P, InfinitePages<R, C>>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<InfinitePages<R, C>>>[]\n): readonly [\n fetchNext: () => Promise<readonly [InfinitePages<R, C> | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<InfinitePages<R, C> | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, InfinitePages<R, C>>>\n]\n\n/**\n * Create an infinite query that fetches paginated data with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the query.\n * @param next - A function to determine the next cursor from the last page.\n * @param fn - The fetcher function that returns a promise of the data.\n * @param settings - Optional settings for the query.\n * @returns A tuple containing the fetchNext function and signals for data, error, loading state, and the cache key.\n */\nexport function infinite<\n P extends unknown[],\n C,\n R\n>(\n key: CacheKeyBuilder<P, InfinitePages<R, C>>,\n params: SignalsParams<P>,\n next: (lastPage: R) => C | undefined,\n fn: (...args: [...P, cursor: C | undefined]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<InfinitePages<R, C>>>[]\n): readonly [\n fetchNext: () => Promise<readonly [InfinitePages<R, C> | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<InfinitePages<R, C> | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, InfinitePages<R, C>>>\n]\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function infinite<P extends unknown[], C, R>(\n this: ClientContext,\n key: CacheKeyBuilder<P, InfinitePages<R, C>>,\n params: SignalsParams<P>,\n next: (lastPage: R) => C | undefined,\n fn: (...args: [...P, cursor: C | undefined, queryCtx: QueryContext<P, InfinitePages<R, C>>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<InfinitePages<R, C>>>[]\n) {\n const {\n clientCtx,\n fetch,\n $params,\n $key,\n $rev,\n $data,\n $error,\n $loading\n } = baseQuery<P, [cursor: C | undefined], InfinitePages<R, C>>(this, key, params, async (...args) => {\n const queryCtx = args[args.length - 1] as QueryContext<P, InfinitePages<R, C>>\n const cursor = args[args.length - 2] as C | undefined\n const data = clientCtx.$get(queryCtx).data as InfinitePages<R, C> | null\n const page = await fn(...args)\n const nextValue = next(page)\n\n return {\n pages: cursor === undefined\n ? [page]\n : [...data?.pages || [], page],\n next: nextValue,\n more: Boolean(nextValue)\n }\n }, settings)\n const initialTimeDedupe = clientCtx.timeDedupe\n const fetchNext = action(() => {\n const data = $data()\n\n if (!data?.more) {\n return Promise.resolve() as Promise<undefined>\n }\n\n clientCtx.timeDedupe = false\n\n return fetch(data.next)\n })\n\n onStart($data, () => effectScope(() => {\n effect(() => {\n $rev()\n $params()\n clientCtx.$disabled?.()\n clientCtx.timeDedupe = initialTimeDedupe\n void fetch(undefined)\n })\n\n clientCtx.mounted()\n }))\n\n return [fetchNext, $data, $error, $loading, $key] as const\n}\n","import {\n type Mountable,\n type ReadableSignal,\n effectScope,\n onStart\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheKey,\n CacheKeyBuilder,\n ExtrasCacheKeyBuilder\n} from '../cache.types.js'\nimport type { QueryContext } from '../RequestContext.js'\nimport {\n type ClientContext,\n type QueryClientContext,\n dedupe\n} from '../ClientContext.js'\nimport {\n type SignalsParams,\n baseQuery\n} from './base.js'\n\n/**\n * Create an operation that do requests on demand with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the operation.\n * @param fn - The request function that returns a promise of the data.\n * @param settings - Optional settings for the operation.\n * @returns A tuple containing the fetch function and signals for data, error, loading state, and the cache key.\n */\nexport function operation<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n key: ExtrasCacheKeyBuilder<P, E, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, ...E, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n fetch: (...extraParams: E) => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/**\n * Create an operation that do requests on demand with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the operation.\n * @param fn - The request function that returns a promise of the data.\n * @param settings - Optional settings for the operation.\n * @returns A tuple containing the fetch function and signals for data, error, loading state, and the cache key.\n */\nexport function operation<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n key: ExtrasCacheKeyBuilder<P, E, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, ...E]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n fetch: (...extraParams: E) => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/**\n * Create an operation that do requests on demand with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the operation.\n * @param fn - The request function that returns a promise of the data.\n * @param settings - Optional settings for the operation.\n * @returns A tuple containing the fetch function and signals for data, error, loading state, and the cache key.\n */\nexport function operation<\n P extends unknown[],\n R\n>(\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n fetch: () => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: Mountable<ReadableSignal<R | null>>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/**\n * Create an operation that do requests on demand with cache management.\n * @param key - The cache key builder.\n * @param params - The signal parameters for the operation.\n * @param fn - The request function that returns a promise of the data.\n * @param settings - Optional settings for the operation.\n * @returns A tuple containing the fetch function and signals for data, error, loading state, and the cache key.\n */\nexport function operation<\n P extends unknown[],\n R\n>(\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: P) => Promise<R>,\n settings?: ClientSetting<QueryClientContext<R>>[]\n): readonly [\n fetch: () => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: ReadableSignal<R | null>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>,\n $key: ReadableSignal<CacheKey<P, R>>\n]\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function operation<\n P extends unknown[],\n E extends unknown[],\n R\n>(\n this: ClientContext,\n key: CacheKeyBuilder<P, R>,\n params: SignalsParams<P>,\n fn: (...args: [...P, ...E, queryCtx: QueryContext<P, R>]) => Promise<R>,\n settings: ClientSetting<QueryClientContext<R>>[] = []\n) {\n const {\n clientCtx,\n fetch,\n $key,\n $data,\n $error,\n $loading\n } = baseQuery<P, E, R>(this, key, params, fn, [dedupe(true, false), ...settings])\n\n onStart($data, () => effectScope(() => clientCtx.mounted()))\n\n return [fetch, $data, $error, $loading, $key] as const\n}\n","import {\n type ReadableSignal,\n action,\n batch,\n computed,\n readonly,\n signal\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport {\n type ClientContext,\n type MutationClientContext,\n forkMutationClient\n} from '../ClientContext.js'\nimport { RequestContext } from '../RequestContext.js'\n\n/**\n * Create a mutation that performs data modifications with cache management.\n * @param fn - The mutator function that returns a promise of the result.\n * @param settings - Optional settings for the mutation.\n * @returns A tuple containing the mutate function and signals for data, error, and loading state.\n */\nexport function mutation<\n P extends unknown[],\n R\n>(\n fn: (...args: [...P, requestCtx: RequestContext<R>]) => Promise<R>,\n settings?: ClientSetting<MutationClientContext<R>>[]\n): readonly [\n mutate: (...params: P) => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: ReadableSignal<R | null>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>\n]\n\n/**\n * Create a mutation that performs data modifications with cache management.\n * @param fn - The mutator function that returns a promise of the result.\n * @param settings - Optional settings for the mutation.\n * @returns A tuple containing the mutate function and signals for data, error, and loading state.\n */\nexport function mutation<\n P extends unknown[],\n R\n>(\n fn: (...args: P) => Promise<R>,\n settings?: ClientSetting<MutationClientContext<R>>[]\n): readonly [\n mutate: (...params: P) => Promise<readonly [R | undefined, unknown] | undefined>,\n $data: ReadableSignal<R | null>,\n $error: ReadableSignal<string | null>,\n $loading: ReadableSignal<boolean>\n]\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function mutation<\n P extends unknown[],\n R\n>(\n this: ClientContext,\n fn: (...args: [...P, requestCtx: RequestContext<R>]) => Promise<R>,\n settings: ClientSetting<MutationClientContext<R>>[] = []\n) {\n const clientCtx = forkMutationClient<R>(this, settings)\n const {\n mapComputedData,\n $disabled,\n loadingDedupe\n } = clientCtx\n const $result = signal<R | null>(null)\n const $data = computed(() => mapComputedData($result()))\n const $error = signal<string | null>(null)\n const $loading = signal(false)\n let prevRequestCtx: RequestContext<R> | undefined\n const fetch = action((...params: P) => {\n if (\n $disabled?.() === true\n || loadingDedupe && $loading()\n ) {\n return Promise.resolve() as Promise<undefined>\n }\n\n const requestCtx = prevRequestCtx = new RequestContext(prevRequestCtx)\n\n return clientCtx.run(\n requestCtx,\n () => {\n $loading(true)\n\n return fn(...params, requestCtx)\n },\n (data, error) => {\n if (prevRequestCtx === requestCtx) {\n batch(() => {\n if (error === null) {\n $result(data)\n }\n\n $error(error)\n $loading(false)\n })\n }\n }\n )\n })\n\n return [\n fetch,\n $data,\n readonly($error),\n readonly($loading)\n ] as const\n}\n","import type {\n ClientExtension,\n ExtendedClient,\n AnyClientSetting,\n AnyClientExtension\n} from './client.types.js'\nimport {\n type QueryClientContext,\n type MutationClientContext,\n ClientContext\n} from './ClientContext.js'\nimport {\n dataCacheFacade,\n errorCacheFacade,\n loadingCacheFacade\n} from './cache.js'\nimport {\n query,\n infinite,\n operation,\n mutation\n} from './queries/index.js'\n\nexport type { InfinitePages } from './queries/index.js'\nexport * from './client.types.js'\n\n/**\n * Create a query client with optional settings and extensions.\n * @param settings - The client settings and extensions.\n * @returns The query client.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function client<S extends (AnyClientSetting | AnyClientExtension)[]>(...settings: S) {\n const ctx = new ClientContext()\n const client = {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n query: query.bind(ctx) as typeof query,\n invalidate: (key => ctx.invalidate(key)) as typeof ctx.invalidate,\n revalidate: (key => ctx.revalidate(key)) as typeof ctx.revalidate,\n $data: dataCacheFacade(ctx),\n $error: errorCacheFacade(ctx),\n $loading: loadingCacheFacade(ctx)\n }\n\n for (const setting of settings) {\n setting(ctx as QueryClientContext & MutationClientContext, client)\n }\n\n return client as ExtendedClient<typeof client, S>\n}\n\ninterface InfinitesExtension {\n infinite: typeof infinite\n}\n\n/**\n * Extend client with infinite query capability.\n * @returns The client extension.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function infinites() {\n return ((ctx, client) => {\n (client as InfinitesExtension).infinite = infinite.bind(ctx)\n\n return client\n }) as ClientExtension<InfinitesExtension>\n}\n\ninterface OperationsExtension {\n operation: typeof operation\n}\n\n/**\n * Extend client with operation capability.\n * @returns The client extension.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function operations() {\n return ((ctx, client) => {\n (client as OperationsExtension).operation = operation.bind(ctx)\n\n return client\n }) as ClientExtension<OperationsExtension>\n}\n\ninterface MutationsExtension {\n mutation: typeof mutation\n}\n\n/**\n * Extend client with mutation capability.\n * @returns The client extension.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function mutations() {\n return ((ctx, client) => {\n (client as MutationsExtension).mutation = mutation.bind(ctx)\n\n return client\n }) as ClientExtension<MutationsExtension>\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { QueryContext } from '../RequestContext.js';
6
6
  export type SignalsParams<T extends unknown[]> = T extends [infer First, ...infer Rest] ? [ReadableSignal<First>, ...SignalsParams<Rest>] : [];
7
7
  export declare function baseQuery<P extends unknown[], E extends unknown[], R>(rootCtx: ClientContext, key: CacheKeyBuilder<P, R>, params: SignalsParams<P>, fn: (...args: [...P, ...E, queryCtx: QueryContext<P, R>]) => Promise<R>, settings?: ClientSetting<QueryClientContext<R>>[]): {
8
8
  clientCtx: QueryClientContext<R>;
9
- fetch: (...extraParams: E) => Promise<readonly [R | undefined, unknown] | undefined>;
9
+ fetch: (...extraParams: E) => Promise<readonly [R, unknown] | undefined>;
10
10
  $params: ReadableSignal<P>;
11
11
  $key: ReadableSignal<CacheKey<P, R>>;
12
12
  $rev: ReadableSignal<number>;
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@nano_kit/query",
3
3
  "type": "module",
4
- "version": "1.0.0-alpha.2",
5
- "description": "A small and powerful remote data manager for @nano_kit/store state manager.",
4
+ "version": "1.0.0-alpha.4",
5
+ "description": "A small and powerful remote data management library for @nano_kit/store.",
6
6
  "author": "dangreen",
7
7
  "license": "MIT",
8
8
  "homepage": "https://nano-kit.js.org/query",
@@ -40,6 +40,6 @@
40
40
  "dist"
41
41
  ],
42
42
  "peerDependencies": {
43
- "@nano_kit/store": "^1.0.0-beta.0"
43
+ "@nano_kit/store": "^1.0.0-beta.1"
44
44
  }
45
45
  }