@nano_kit/query 1.0.0-alpha.5 → 1.0.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CacheStorage.d.ts.map +1 -1
- package/dist/CacheStorage.types.d.ts.map +1 -1
- package/dist/ClientContext.d.ts.map +1 -1
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.types.d.ts.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.mock.d.ts.map +1 -1
- package/dist/client.types.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/map.d.ts.map +1 -1
- package/dist/queries/base.d.ts.map +1 -1
- package/dist/queries/index.d.ts.map +1 -1
- package/dist/queries/infinite.d.ts.map +1 -1
- package/dist/queries/mutation.d.ts.map +1 -1
- package/dist/queries/operation.d.ts.map +1 -1
- package/dist/queries/query.d.ts.map +1 -1
- package/dist/settings/abortable.d.ts.map +1 -1
- package/dist/settings/codec.d.ts.map +1 -1
- package/dist/settings/entities.d.ts.map +1 -1
- package/dist/settings/hydratable.d.ts.map +1 -1
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/indexedDbStorage.d.ts.map +1 -1
- package/dist/settings/persistence.d.ts.map +1 -1
- package/dist/settings/retryOnError.d.ts.map +1 -1
- package/dist/settings/revalidateOn.d.ts.map +1 -1
- package/dist/settings/ssr.d.ts.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheStorage.d.ts","sourceRoot":"","sources":["../src/CacheStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,UAAU,EACX,MAAM,yBAAyB,CAAA;AAQhC,cAAc,yBAAyB,CAAA;AAEvC,eAAO,MAAM,mBAAmB,OAAQ,CAAA;AACxC,eAAO,MAAM,kBAAkB,QAAW,CAAA;AAC1C,eAAO,MAAM,SAAS,QAAW,CAAA;AAUjC,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,UAElC;AAGD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,WAEpC;AAID,qBAAa,YAAY;IACvB,UAAU,SAAsB;IAChC,SAAS,SAAqB;IAC9B,KAAK,EAAE,QAAQ,CAAY;IAE3B,OAAO;QAEH,GAAG;QACH,OAAO;QACP,OAAO;QACP,IAAI;QACJ,KAAK;QACL,OAAO;MAEV;IAED,IAAI,CAAC,GAAG,EAAE,QAAQ,uBAUjB;IAED,GAAG,CACD,GAAG,EAAE,aAAa,GAAG,QAAQ,EAC7B,KAAK,EAAE,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,QAGxC;IAED;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,QAEvC;IAED;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,QAQvC;IAED,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,UAAO,EAAE,UAAU,UAAO,WAM9D;IAED,OAAO,CAAC,GAAG,EAAE,QAAQ,UAYpB;IAED,OAAO,CACL,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,GAAG,CAAC,EAAE,MAAM,QAgBb;CACF"}
|
|
1
|
+
{"version":3,"file":"CacheStorage.d.ts","sourceRoot":"","sources":["../src/CacheStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,UAAU,EACX,MAAM,yBAAyB,CAAA;AAQhC,cAAc,yBAAyB,CAAA;AAEvC,eAAO,MAAM,mBAAmB,OAAQ,CAAA;AACxC,eAAO,MAAM,kBAAkB,QAAW,CAAA;AAC1C,eAAO,MAAM,SAAS,QAAW,CAAA;AAUjC,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,UAElC;AAGD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,WAEpC;AAID,qBAAa,YAAY;IACvB,UAAU,SAAsB;IAChC,SAAS,SAAqB;IAC9B,KAAK,EAAE,QAAQ,CAAY;IAE3B,OAAO;QAEH,GAAG;QACH,OAAO;QACP,OAAO;QACP,IAAI;QACJ,KAAK;QACL,OAAO;MAEV;IAED,IAAI,CAAC,GAAG,EAAE,QAAQ,uBAUjB;IAED,GAAG,CACD,GAAG,EAAE,aAAa,GAAG,QAAQ,EAC7B,KAAK,EAAE,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,QAGxC;IAED;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,QAEvC;IAED;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,QAQvC;IAED,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,UAAO,EAAE,UAAU,UAAO,WAM9D;IAED,OAAO,CAAC,GAAG,EAAE,QAAQ,UAYpB;IAED,OAAO,CACL,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,GAAG,CAAC,EAAE,MAAM,QAgBb;CACF","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheStorage.types.d.ts","sourceRoot":"","sources":["../src/CacheStorage.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACX,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IACxF,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;AAEpE,MAAM,WAAW,aAAa,CAC5B,CAAC,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAC/B,CAAC,GAAG,OAAO,CACX,SAAQ,QAAQ,CAAC,MAAM,CAAC;IAExB,CAAC,EAAE,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,CAAA;CACL;AAED,MAAM,WAAW,QAAQ,CACvB,CAAC,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAC/B,CAAC,GAAG,OAAO,CACX,SAAQ,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;IAElC,CAAC,EAAE,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,CAAA;CACL"}
|
|
1
|
+
{"version":3,"file":"CacheStorage.types.d.ts","sourceRoot":"","sources":["../src/CacheStorage.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACX,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IACxF,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;AAEpE,MAAM,WAAW,aAAa,CAC5B,CAAC,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAC/B,CAAC,GAAG,OAAO,CACX,SAAQ,QAAQ,CAAC,MAAM,CAAC;IAExB,CAAC,EAAE,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,CAAA;CACL;AAED,MAAM,WAAW,QAAQ,CACvB,CAAC,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAC/B,CAAC,GAAG,OAAO,CACX,SAAQ,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;IAElC,CAAC,EAAE,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,CAAA;CACL","sourcesContent":["import type {\n ShardedSignalsMap,\n ShardKey,\n ShardedKey\n} from './map.js'\n\nexport interface CacheEntry<T = unknown> {\n rev: number\n dedupes: number\n expires: number\n data: T | null\n error: string | null\n loading: boolean\n}\n\nexport interface EncodedCacheEntry extends Omit<CacheEntry, 'rev' | 'dedupes' | 'expires'> {\n rev: string\n dedupes: string\n expires: string\n}\n\nexport type CacheMap = ShardedSignalsMap<string, string, CacheEntry>\n\nexport interface CacheShardKey<\n P extends unknown[] = unknown[],\n R = unknown\n> extends ShardKey<string> {\n // Only types info:\n P: P\n R: R\n}\n\nexport interface CacheKey<\n P extends unknown[] = unknown[],\n R = unknown\n> extends ShardedKey<string, string> {\n // Only types info:\n P: P\n R: R\n}\n"]}
|
|
@@ -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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","sourcesContent":["import {\n type AnyCodec,\n type ReadableSignal,\n type Accessor,\n type TasksRunner,\n type Task,\n TasksRunner$,\n taskPromise,\n inject,\n NoopCodec\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 codec: AnyCodec = NoopCodec\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestContext.d.ts","sourceRoot":"","sources":["../src/RequestContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAGvD,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;AAE5C,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;AAE9C,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;AAExE,qBAAa,cAAc,CAAC,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAY;IAC/C,OAAO,EAAE,OAAO,GAAG,SAAS,CAAY;IACxC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAY;IAC/C,oBAAoB,UAAQ;IAC5B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAY;IAElD,YAAY,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAItC;IAED,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,QAQ1C;CACF;AAED,qBAAa,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,CAC9C,SAAQ,cAAc,CAAC,CAAC,CACxB,YAAW,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,CAAC,EAAG,CAAC,CAAA;IACL,CAAC,EAAG,CAAC,CAAA;IAEL,YACE,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EACnB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAM7B;CACF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,QAEpE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,QAE7D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,QAEpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,QAE7D"}
|
|
1
|
+
{"version":3,"file":"RequestContext.d.ts","sourceRoot":"","sources":["../src/RequestContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAGvD,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;AAE5C,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;AAE9C,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;AAExE,qBAAa,cAAc,CAAC,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAY;IAC/C,OAAO,EAAE,OAAO,GAAG,SAAS,CAAY;IACxC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAY;IAC/C,oBAAoB,UAAQ;IAC5B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAY;IAElD,YAAY,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAItC;IAED,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,QAQ1C;CACF;AAED,qBAAa,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,CAC9C,SAAQ,cAAc,CAAC,CAAC,CACxB,YAAW,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,CAAC,EAAG,CAAC,CAAA;IACL,CAAC,EAAG,CAAC,CAAA;IAEL,YACE,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EACnB,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAM7B;CACF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,QAEpE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,QAE7D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,QAEpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,QAE7D","sourcesContent":["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"]}
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,QAAQ,EACR,qBAAqB,EACtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,cAAc,kBAAkB,CAAA;AAEhC;;;;;GAKG;AAEH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAC7C,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAqB,yBAW7D;AAED;;;;;GAKG;AAEH,wBAAgB,YAAY,CAC1B,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,GAEH,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACtE;AAED;;;;GAIG;AAEH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GACL,eAAe,CAC5D;AAqBD;;;;GAIG;AAEH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,SACvC,QAAQ,aACtB;AAED;;;;GAIG;AAEH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,SACrC,QAAQ,mBACtB"}
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,QAAQ,EACR,qBAAqB,EACtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,cAAc,kBAAkB,CAAA;AAEhC;;;;;GAKG;AAEH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAC7C,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAqB,yBAW7D;AAED;;;;;GAKG;AAEH,wBAAgB,YAAY,CAC1B,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,GAEH,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACtE;AAED;;;;GAIG;AAEH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GACL,eAAe,CAC5D;AAqBD;;;;GAIG;AAEH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,SACvC,QAAQ,aACtB;AAED;;;;GAIG;AAEH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,SACrC,QAAQ,mBACtB","sourcesContent":["import {\n type NewValue,\n isFunction\n} 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: isFunction(newValue)\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.types.d.ts","sourceRoot":"","sources":["../src/cache.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACd,MAAM,yBAAyB,CAAA;AAEhC,YAAY,EACV,QAAQ,EACR,aAAa,EACd,CAAA;AAED,MAAM,WAAW,cAAc,CAC7B,CAAC,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAC/B,CAAC,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAC/B,CAAC,GAAG,OAAO,CACX,SAAQ,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IAEtB,CAAC,EAAE,CAAC,CAAA;CACL;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,IAAI,CACpD,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAC1C,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEvB,MAAM,MAAM,qBAAqB,CAC/B,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,IACC,CACF,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACnD,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEvB,MAAM,WAAW,eAAe;IAC9B,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACvD,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;CACrG"}
|
|
1
|
+
{"version":3,"file":"cache.types.d.ts","sourceRoot":"","sources":["../src/cache.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACd,MAAM,yBAAyB,CAAA;AAEhC,YAAY,EACV,QAAQ,EACR,aAAa,EACd,CAAA;AAED,MAAM,WAAW,cAAc,CAC7B,CAAC,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAC/B,CAAC,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EAC/B,CAAC,GAAG,OAAO,CACX,SAAQ,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IAEtB,CAAC,EAAE,CAAC,CAAA;CACL;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,IAAI,CACpD,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAC1C,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEvB,MAAM,MAAM,qBAAqB,CAC/B,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,IACC,CACF,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACnD,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEvB,MAAM,WAAW,eAAe;IAC9B,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACvD,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;CACrG","sourcesContent":["import type { NewValue } from '@nano_kit/store'\nimport type {\n CacheKey,\n CacheShardKey\n} from './CacheStorage.types.js'\n\nexport type {\n CacheKey,\n CacheShardKey\n}\n\nexport interface ExtrasCacheKey<\n P extends unknown[] = unknown[],\n E extends unknown[] = unknown[],\n R = unknown\n> extends CacheKey<P, R> {\n // Only types info:\n E: E\n}\n\nexport type CacheKeyBuilder<P extends unknown[], R> = (\n (...params: Partial<P>) => CacheKey<P, R>\n) & CacheShardKey<P, R>\n\nexport type ExtrasCacheKeyBuilder<\n P extends unknown[],\n E extends unknown[],\n R\n> = (\n (...params: Partial<P>) => ExtrasCacheKey<P, E, R>\n) & CacheShardKey<P, R>\n\nexport interface CacheDataFacade {\n <P extends unknown[], R>(key: CacheKey<P, R>): R | null\n <P extends unknown[], R>(key: CacheShardKey<P, R> | CacheKey<P, R>, value: NewValue<R | null>): void\n}\n"]}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -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,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"}
|
|
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","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.mock.d.ts","sourceRoot":"","sources":["../src/client.mock.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AASD,wBAAgB,aAAa,SAmB5B;AAED,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAI9D;AAED,wBAAsB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAYzE;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxE;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAa3F;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7D"}
|
|
1
|
+
{"version":3,"file":"client.mock.d.ts","sourceRoot":"","sources":["../src/client.mock.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AASD,wBAAgB,aAAa,SAmB5B;AAED,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAI9D;AAED,wBAAsB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAYzE;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxE;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAa3F;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7D","sourcesContent":["/* eslint-disable @typescript-eslint/require-await */\nexport interface Post {\n id: number\n title: string\n content: string\n}\n\nexport interface PostsPage {\n posts: Post[]\n nextCursor: number | null\n}\n\nexport interface CreatePostParams {\n title: string\n content: string\n}\n\nexport interface UpdatePostParams {\n title?: string\n content?: string\n}\n\n// In-memory storage\nlet posts: Post[] = []\nlet nextId = 0\nconst PAGE_SIZE = 2\n\nresetMockData()\n\nexport function resetMockData() {\n posts = [\n {\n id: 1,\n title: 'First Post',\n content: 'Hello World!'\n },\n {\n id: 2,\n title: 'Second Post',\n content: 'Another post content'\n },\n {\n id: 3,\n title: 'Third Post',\n content: 'Yet another post'\n }\n ]\n nextId = 4\n}\n\nexport async function getPost(id: number): Promise<Post | null> {\n const post = posts.find(p => p.id === id)\n\n return post ?? null\n}\n\nexport async function getPosts(cursor?: number | null): Promise<PostsPage> {\n const startIndex = cursor\n ? posts.findIndex(p => p.id === cursor) + 1\n : 0\n const pagePosts = posts.slice(startIndex, startIndex + PAGE_SIZE)\n const lastPost = pagePosts[pagePosts.length - 1]\n const hasMore = lastPost && posts.indexOf(lastPost) < posts.length - 1\n\n return {\n posts: pagePosts,\n nextCursor: hasMore ? lastPost.id : null\n }\n}\n\nexport async function createPost(params: CreatePostParams): Promise<Post> {\n const post: Post = {\n id: nextId++,\n title: params.title,\n content: params.content\n }\n\n posts.push(post)\n\n return post\n}\n\nexport async function updatePost(id: number, params: UpdatePostParams): Promise<Post | null> {\n const index = posts.findIndex(p => p.id === id)\n\n if (index === -1) {\n return null\n }\n\n posts[index] = {\n ...posts[index],\n ...params\n }\n\n return posts[index]\n}\n\nexport async function deletePost(id: number): Promise<boolean> {\n const index = posts.findIndex(p => p.id === id)\n\n if (index === -1) {\n return false\n }\n\n posts.splice(index, 1)\n\n return true\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.types.d.ts","sourceRoot":"","sources":["../src/client.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,kBAAkB,GAAG,qBAAqB,GAAG,kBAAkB,GAAG,qBAAqB,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAA;AAE/I,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,kBAAkB,CAAC,GAAG,aAAa,CAAC,qBAAqB,CAAC,GAAG,aAAa,CAAA;AAEvH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAE5E,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC,EAAE,CAAC,CAAA;AAEpD,KAAK,SAAS,CAAC,CAAC,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GACxG,KAAK,SAAS,eAAe,CAAC,MAAM,CAAC,CAAC,GACpC,IAAI,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,GACpD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GACnB,CAAC,GACH,IAAI,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,GACpD,SAAS,CAAC,IAAI,CAAC,GACf,EAAE,GACN,EAAE,CAAA;AAEN,KAAK,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,EAAE,CAAA;AAEhD,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"client.types.d.ts","sourceRoot":"","sources":["../src/client.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,kBAAkB,GAAG,qBAAqB,GAAG,kBAAkB,GAAG,qBAAqB,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAA;AAE/I,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,kBAAkB,CAAC,GAAG,aAAa,CAAC,qBAAqB,CAAC,GAAG,aAAa,CAAA;AAEvH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAE5E,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC,EAAE,CAAC,CAAA;AAEpD,KAAK,SAAS,CAAC,CAAC,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GACxG,KAAK,SAAS,eAAe,CAAC,MAAM,CAAC,CAAC,GACpC,IAAI,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,GACpD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GACnB,CAAC,GACH,IAAI,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,GACpD,SAAS,CAAC,IAAI,CAAC,GACf,EAAE,GACN,EAAE,CAAA;AAEN,KAAK,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,EAAE,CAAA;AAEhD,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,GAAG,kBAAkB,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA","sourcesContent":["import type {\n ClientContext,\n QueryClientContext,\n MutationClientContext\n} from './ClientContext.js'\n\nexport type ClientSetting<T extends QueryClientContext | MutationClientContext = QueryClientContext | MutationClientContext> = (ctx: T) => void\n\nexport type AnyClientSetting = ClientSetting<QueryClientContext> | ClientSetting<MutationClientContext> | ClientSetting\n\nexport type ClientExtension<E> = <T>(ctx: ClientContext, client: T) => T & E\n\nexport type AnyClientExtension = ClientExtension<{}>\n\ntype Extension<S extends (AnyClientSetting | AnyClientExtension)[]> = S extends [infer First, ...infer Rest]\n ? First extends ClientExtension<infer E>\n ? Rest extends (AnyClientSetting | AnyClientExtension)[]\n ? Extension<Rest> & E\n : E\n : Rest extends (AnyClientSetting | AnyClientExtension)[]\n ? Extension<Rest>\n : {}\n : {}\n\ntype Prettify<T> = { [K in keyof T]: T[K] } & {}\n\nexport type ExtendedClient<T, S extends (AnyClientSetting | AnyClientExtension)[]> = Prettify<T & Extension<S>>\n"]}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,OAAO,EACL,QAAQ,EACR,YAAY,EACb,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,aAAa,EACb,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,KAAK,EACN,MAAM,oBAAoB,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,OAAO,EACL,QAAQ,EACR,YAAY,EACb,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,aAAa,EACb,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,KAAK,EACN,MAAM,oBAAoB,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA","sourcesContent":["export * from './settings/index.js'\nexport {\n queryKey,\n operationKey\n} from './cache.js'\nexport {\n type CacheKey,\n type CacheShardKey,\n type CacheEntry,\n DEFAULT_DEDUPE_TIME,\n DEFAULT_CACHE_TIME\n} from './CacheStorage.js'\nexport {\n type QueryClientContext,\n type MutationClientContext,\n ClientContext,\n dedupeTime,\n cacheTime,\n mapError,\n onEveryError,\n disabled,\n dedupe,\n tasks\n} from './ClientContext.js'\nexport * from './RequestContext.js'\nexport * from './client.js'\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { $$insert, $getMapKey, Hydratables$, Hydrator$, NoopCodec, TasksRunner$, action, batch, clearMap, computed, deleteMapKey, effect, effectScope, fireMapEvent, identity, inject, isFunction, listen, mountable, onStart, readonly, setMapKey, signal, subMapEvent, taskPromise, untracked } from "@nano_kit/store";
|
|
2
2
|
//#region src/settings/abortable.ts
|
|
3
|
-
|
|
3
|
+
const abortControllers = /* @__PURE__ */ new WeakMap();
|
|
4
4
|
/**
|
|
5
5
|
* Returns the AbortSignal for the given RequestContext
|
|
6
6
|
* @param ctx - RequestContext
|
|
@@ -114,8 +114,8 @@ function errorCacheFacade(cache) {
|
|
|
114
114
|
}
|
|
115
115
|
//#endregion
|
|
116
116
|
//#region src/settings/entities.ts
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
const ENTITY_KEY = "#entity";
|
|
118
|
+
const EntityKey = /* @__PURE__ */ queryKey(ENTITY_KEY);
|
|
119
119
|
function isIdentifier(value) {
|
|
120
120
|
const type = typeof value;
|
|
121
121
|
return type === "number" || type === "string";
|
|
@@ -123,7 +123,7 @@ function isIdentifier(value) {
|
|
|
123
123
|
function isEntityRef(value) {
|
|
124
124
|
return ENTITY_KEY in value;
|
|
125
125
|
}
|
|
126
|
-
|
|
126
|
+
let currentCtx = null;
|
|
127
127
|
/* @__NO_SIDE_EFFECTS__ */
|
|
128
128
|
function entity(name, id = (entity) => entity.id) {
|
|
129
129
|
return (idOrRefOrEntity) => {
|
|
@@ -225,9 +225,9 @@ function deleteShardedMapKey(map, shardedKey) {
|
|
|
225
225
|
}
|
|
226
226
|
//#endregion
|
|
227
227
|
//#region src/CacheStorage.ts
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
228
|
+
const DEFAULT_DEDUPE_TIME = 4e3;
|
|
229
|
+
const DEFAULT_CACHE_TIME = Infinity;
|
|
230
|
+
const UNSET_REV = Infinity;
|
|
231
231
|
/* @__NO_SIDE_EFFECTS__ */
|
|
232
232
|
function revLock(rev) {
|
|
233
233
|
return rev > 0 ? rev * -1 : rev;
|
|
@@ -236,7 +236,7 @@ function revLock(rev) {
|
|
|
236
236
|
function revLocked(rev) {
|
|
237
237
|
return rev < 0;
|
|
238
238
|
}
|
|
239
|
-
|
|
239
|
+
let revCounter = 0;
|
|
240
240
|
var CacheStorage = class {
|
|
241
241
|
dedupeTime = DEFAULT_DEDUPE_TIME;
|
|
242
242
|
cacheTime = DEFAULT_CACHE_TIME;
|
|
@@ -403,8 +403,8 @@ function persistence(storage, lifetime) {
|
|
|
403
403
|
}
|
|
404
404
|
//#endregion
|
|
405
405
|
//#region src/settings/indexedDbStorage.ts
|
|
406
|
-
|
|
407
|
-
|
|
406
|
+
const DB_NAME = "nano_kit";
|
|
407
|
+
const STORE_NAME = "query";
|
|
408
408
|
function connect() {
|
|
409
409
|
return new Promise((resolve) => {
|
|
410
410
|
const request = indexedDB.open(DB_NAME, 1);
|
|
@@ -584,7 +584,7 @@ function retryOnError(calcRetryDelay = defaultCalcRetryDelay) {
|
|
|
584
584
|
}
|
|
585
585
|
//#endregion
|
|
586
586
|
//#region src/settings/hydratable.ts
|
|
587
|
-
|
|
587
|
+
const id = "@nano_kit/query";
|
|
588
588
|
function encode({ cache, codec }) {
|
|
589
589
|
const encoded = [];
|
|
590
590
|
cache.forEach((shard, shardKey) => {
|
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/codec.ts","../src/settings/persistence.ts","../src/settings/indexedDbStorage.ts","../src/utils.ts","../src/settings/revalidateOn.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 {\n type NewValue,\n isFunction\n} 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: isFunction(newValue)\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 {\n type AnyCodec,\n identity\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheEntry,\n EncodedCacheEntry\n} from '../CacheStorage.types.js'\n\nfunction mapEntry(\n entry: CacheEntry | EncodedCacheEntry,\n mapDetail: (data: number | string) => number | string,\n mapData: (data: unknown) => unknown\n) {\n return {\n ...entry,\n data: mapData(entry.data),\n rev: mapDetail(entry.rev),\n dedupes: mapDetail(entry.dedupes),\n expires: mapDetail(entry.expires)\n }\n}\n\nexport function encodeEntryData<T extends CacheEntry | EncodedCacheEntry>(entry: T, codec: AnyCodec) {\n return mapEntry(entry, identity, codec.encode) as T\n}\n\nexport function decodeEntryData<T extends CacheEntry | EncodedCacheEntry>(entry: T, codec: AnyCodec) {\n return mapEntry(entry, identity, codec.decode) as T\n}\n\nexport function encodeEntryDetails(entry: CacheEntry) {\n return mapEntry(entry, String, identity) as EncodedCacheEntry\n}\n\nexport function decodeEntryDetails(entry: EncodedCacheEntry) {\n return mapEntry(entry, Number, identity) as CacheEntry\n}\n\nexport function encodeEntry(entry: CacheEntry, codec: AnyCodec) {\n return mapEntry(entry, String, codec.encode) as EncodedCacheEntry\n}\n\nexport function decodeEntry(entry: EncodedCacheEntry, codec: AnyCodec) {\n return mapEntry(entry, Number, codec.decode) as CacheEntry\n}\n\n/**\n * Set cache entry data codec for query client.\n * @param codec - Codec used to encode and decode cached data.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function codec(codec: AnyCodec): ClientSetting {\n return (ctx) => {\n ctx.codec = codec\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'\nimport {\n encodeEntryData,\n decodeEntryData\n} from './codec.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 && decodeEntryData(storedEntry, this.codec),\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(\n storage!.set(\n key,\n encodeEntryData(entry, this.codec),\n this.persistenceLifetime!\n )\n )\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 type AnyAccessor,\n listen\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 RevalidateOnContext extends QueryClientContext {\n revalidateOn?: Set<AnyAccessor>\n}\n\n/**\n * Revalidate the query when the reactive condition becomes true.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function revalidateOn(...conditions: AnyAccessor[]): ClientSetting<QueryClientContext> {\n return (ctx: RevalidateOnContext) => {\n if (ctx.revalidateOn === undefined) {\n ctx.revalidateOn = new Set()\n }\n\n conditions.forEach(($condition) => {\n if (!ctx.revalidateOn!.has($condition)) {\n ctx.mounted = addFn(ctx.mounted, function (this: RevalidateOnContext) {\n listen($condition, (visible) => {\n if (visible) {\n this.revalidate(this.$key())\n }\n })\n })\n\n ctx.revalidateOn!.add($condition)\n }\n })\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 { EncodedCacheEntry } from '../CacheStorage.types.js'\nimport { setShardedMapKey } from '../map.js'\nimport {\n encodeEntry,\n decodeEntry\n} from './codec.js'\n\ninterface HydratableContext extends ClientContext {\n hydratable?: boolean\n}\n\ntype EncodedShardedMap = [string, string, EncodedCacheEntry][]\n\nconst id = '@nano_kit/query'\n\nfunction encode({\n cache,\n codec\n}: HydratableContext) {\n const encoded: EncodedShardedMap = []\n\n cache.forEach((shard, shardKey) => {\n shard.forEach(($signal, key) => {\n const value = $signal?.()\n\n if (value !== undefined) {\n encoded.push([shardKey, key, encodeEntry(value, codec)])\n }\n })\n })\n\n return encoded\n}\n\nfunction decode(\n {\n cache,\n codec\n }: HydratableContext,\n encoded: EncodedShardedMap\n) {\n encoded.forEach(([shard, key, value]) => setShardedMapKey(cache, {\n shard,\n key\n }, decodeEntry(value, codec)))\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 collector 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 => decode(ctx, value as EncodedShardedMap))\n } else {\n const finalHydratables = hydratables === undefined\n ? inject(Hydratables$)\n : hydratables\n\n if (finalHydratables) {\n finalHydratables.set(id, () => encode(ctx))\n }\n }\n }\n\n ctx.hydratable = true\n }\n}\n","import {\n type AnyCodec,\n type ReadableSignal,\n type Accessor,\n type TasksRunner,\n type Task,\n TasksRunner$,\n taskPromise,\n inject,\n NoopCodec\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 codec: AnyCodec = NoopCodec\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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"}
|
|
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/codec.ts","../src/settings/persistence.ts","../src/settings/indexedDbStorage.ts","../src/utils.ts","../src/settings/revalidateOn.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 {\n type NewValue,\n isFunction\n} 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: isFunction(newValue)\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 {\n type AnyCodec,\n identity\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheEntry,\n EncodedCacheEntry\n} from '../CacheStorage.types.js'\n\nfunction mapEntry(\n entry: CacheEntry | EncodedCacheEntry,\n mapDetail: (data: number | string) => number | string,\n mapData: (data: unknown) => unknown\n) {\n return {\n ...entry,\n data: mapData(entry.data),\n rev: mapDetail(entry.rev),\n dedupes: mapDetail(entry.dedupes),\n expires: mapDetail(entry.expires)\n }\n}\n\nexport function encodeEntryData<T extends CacheEntry | EncodedCacheEntry>(entry: T, codec: AnyCodec) {\n return mapEntry(entry, identity, codec.encode) as T\n}\n\nexport function decodeEntryData<T extends CacheEntry | EncodedCacheEntry>(entry: T, codec: AnyCodec) {\n return mapEntry(entry, identity, codec.decode) as T\n}\n\nexport function encodeEntryDetails(entry: CacheEntry) {\n return mapEntry(entry, String, identity) as EncodedCacheEntry\n}\n\nexport function decodeEntryDetails(entry: EncodedCacheEntry) {\n return mapEntry(entry, Number, identity) as CacheEntry\n}\n\nexport function encodeEntry(entry: CacheEntry, codec: AnyCodec) {\n return mapEntry(entry, String, codec.encode) as EncodedCacheEntry\n}\n\nexport function decodeEntry(entry: EncodedCacheEntry, codec: AnyCodec) {\n return mapEntry(entry, Number, codec.decode) as CacheEntry\n}\n\n/**\n * Set cache entry data codec for query client.\n * @param codec - Codec used to encode and decode cached data.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function codec(codec: AnyCodec): ClientSetting {\n return (ctx) => {\n ctx.codec = codec\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'\nimport {\n encodeEntryData,\n decodeEntryData\n} from './codec.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 && decodeEntryData(storedEntry, this.codec),\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(\n storage!.set(\n key,\n encodeEntryData(entry, this.codec),\n this.persistenceLifetime!\n )\n )\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 type AnyAccessor,\n listen\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 RevalidateOnContext extends QueryClientContext {\n revalidateOn?: Set<AnyAccessor>\n}\n\n/**\n * Revalidate the query when the reactive condition becomes true.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function revalidateOn(...conditions: AnyAccessor[]): ClientSetting<QueryClientContext> {\n return (ctx: RevalidateOnContext) => {\n if (ctx.revalidateOn === undefined) {\n ctx.revalidateOn = new Set()\n }\n\n conditions.forEach(($condition) => {\n if (!ctx.revalidateOn!.has($condition)) {\n ctx.mounted = addFn(ctx.mounted, function (this: RevalidateOnContext) {\n listen($condition, (visible) => {\n if (visible) {\n this.revalidate(this.$key())\n }\n })\n })\n\n ctx.revalidateOn!.add($condition)\n }\n })\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 { EncodedCacheEntry } from '../CacheStorage.types.js'\nimport { setShardedMapKey } from '../map.js'\nimport {\n encodeEntry,\n decodeEntry\n} from './codec.js'\n\ninterface HydratableContext extends ClientContext {\n hydratable?: boolean\n}\n\ntype EncodedShardedMap = [string, string, EncodedCacheEntry][]\n\nconst id = '@nano_kit/query'\n\nfunction encode({\n cache,\n codec\n}: HydratableContext) {\n const encoded: EncodedShardedMap = []\n\n cache.forEach((shard, shardKey) => {\n shard.forEach(($signal, key) => {\n const value = $signal?.()\n\n if (value !== undefined) {\n encoded.push([shardKey, key, encodeEntry(value, codec)])\n }\n })\n })\n\n return encoded\n}\n\nfunction decode(\n {\n cache,\n codec\n }: HydratableContext,\n encoded: EncodedShardedMap\n) {\n encoded.forEach(([shard, key, value]) => setShardedMapKey(cache, {\n shard,\n key\n }, decodeEntry(value, codec)))\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 collector 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 => decode(ctx, value as EncodedShardedMap))\n } else {\n const finalHydratables = hydratables === undefined\n ? inject(Hydratables$)\n : hydratables\n\n if (finalHydratables) {\n finalHydratables.set(id, () => encode(ctx))\n }\n }\n }\n\n ctx.hydratable = true\n }\n}\n","import {\n type AnyCodec,\n type ReadableSignal,\n type Accessor,\n type TasksRunner,\n type Task,\n TasksRunner$,\n taskPromise,\n inject,\n NoopCodec\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 codec: AnyCodec = NoopCodec\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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"}
|
package/dist/map.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../src/map.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EASd,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,KAAK,EAAE,CAAC,CAAA;IACR,GAAG,CAAC,EAAE,SAAS,CAAA;CAChB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAA;IACR,GAAG,EAAE,CAAC,CAAA;CACP;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,gBAAgB,EAAE,GAAG,CACvE,CAAC,EACD,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CACjB;CAAG;AAEJ;;;;;;GAMG;AAEH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACtC,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,WAY3C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACvC,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,iBAc7B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACtC,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1C,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,QAiC/B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACzC,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,QAkB3C"}
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../src/map.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EASd,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,KAAK,EAAE,CAAC,CAAA;IACR,GAAG,CAAC,EAAE,SAAS,CAAA;CAChB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAA;IACR,GAAG,EAAE,CAAC,CAAA;CACP;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,gBAAgB,EAAE,GAAG,CACvE,CAAC,EACD,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CACjB;CAAG;AAEJ;;;;;;GAMG;AAEH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACtC,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,WAY3C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACvC,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,iBAc7B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACtC,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1C,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,QAiC/B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACzC,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,QAkB3C","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/queries/base.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EAChB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAExB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GACnF,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAC/C,EAAE,CAAA;AAGN,wBAAgB,SAAS,CACvB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EACvE,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE;;4BA2BX,CAAC;;;;;;;EA+BxC"}
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/queries/base.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EAChB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAExB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GACnF,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAC/C,EAAE,CAAA;AAGN,wBAAgB,SAAS,CACvB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EACvE,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE;;4BA2BX,CAAC;;;;;;;EA+BxC","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queries/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queries/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA","sourcesContent":["export * from './query.js'\nexport * from './infinite.js'\nexport * from './operation.js'\nexport * from './mutation.js'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infinite.d.ts","sourceRoot":"","sources":["../../src/queries/infinite.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"infinite.d.ts","sourceRoot":"","sources":["../../src/queries/infinite.ts"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/queries/mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAMpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAClE,QAAQ,CAAC,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,GACnD,SAAS;IACV,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAChF,KAAK,EAAE,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC;CAClC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9B,QAAQ,CAAC,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,GACnD,SAAS;IACV,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAChF,KAAK,EAAE,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC;CAClC,CAAA"}
|
|
1
|
+
{"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/queries/mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAMpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAClE,QAAQ,CAAC,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,GACnD,SAAS;IACV,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAChF,KAAK,EAAE,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC;CAClC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9B,QAAQ,CAAC,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,GACnD,SAAS;IACV,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAChF,KAAK,EAAE,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC;CAClC,CAAA","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/queries/operation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/queries/operation.ts"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/queries/query.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAIpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,WAAW,CAAA;AAElB;;;;;;;GAOG;AACH,wBAAgB,KAAK,CACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EACjE,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,GAChD,SAAS;IACV,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC;IACjC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACrC,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9B,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,GAChD,SAAS;IACV,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC;IACjC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACrC,CAAA"}
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/queries/query.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAIpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,WAAW,CAAA;AAElB;;;;;;;GAOG;AACH,wBAAgB,KAAK,CACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EACjE,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,GAChD,SAAS;IACV,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC;IACjC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACrC,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CACnB,CAAC,SAAS,OAAO,EAAE,EACnB,CAAC,EAED,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9B,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,GAChD,SAAS;IACV,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC;IACjC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACrC,CAAA","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abortable.d.ts","sourceRoot":"","sources":["../../src/settings/abortable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAS1D;;;;GAIG;AAEH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,eAQpD;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,QAEpE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,QAEtD;AAED;;;GAGG;AAEH,wBAAgB,SAAS,IAAI,aAAa,CAgCzC"}
|
|
1
|
+
{"version":3,"file":"abortable.d.ts","sourceRoot":"","sources":["../../src/settings/abortable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAS1D;;;;GAIG;AAEH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,eAQpD;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,QAEpE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,QAEtD;AAED;;;GAGG;AAEH,wBAAgB,SAAS,IAAI,aAAa,CAgCzC","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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/settings/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAEd,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAClB,MAAM,0BAA0B,CAAA;AAgBjC,wBAAgB,eAAe,CAAC,CAAC,SAAS,UAAU,GAAG,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAC/C,CAAC,CACpD;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,UAAU,GAAG,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAC/C,CAAC,CACpD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GACN,iBAAiB,CAC9D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GACb,UAAU,CACvD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GACZ,iBAAiB,CAClE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,GACnB,UAAU,CAC3D;AAED;;;;GAIG;AAEH,wBAAgB,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAIpD"}
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/settings/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAEd,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAClB,MAAM,0BAA0B,CAAA;AAgBjC,wBAAgB,eAAe,CAAC,CAAC,SAAS,UAAU,GAAG,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAC/C,CAAC,CACpD;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,UAAU,GAAG,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAC/C,CAAC,CACpD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GACN,iBAAiB,CAC9D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GACb,UAAU,CACvD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GACZ,iBAAiB,CAClE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,GACnB,UAAU,CAC3D;AAED;;;;GAIG;AAEH,wBAAgB,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAIpD","sourcesContent":["import {\n type AnyCodec,\n identity\n} from '@nano_kit/store'\nimport type { ClientSetting } from '../client.types.js'\nimport type {\n CacheEntry,\n EncodedCacheEntry\n} from '../CacheStorage.types.js'\n\nfunction mapEntry(\n entry: CacheEntry | EncodedCacheEntry,\n mapDetail: (data: number | string) => number | string,\n mapData: (data: unknown) => unknown\n) {\n return {\n ...entry,\n data: mapData(entry.data),\n rev: mapDetail(entry.rev),\n dedupes: mapDetail(entry.dedupes),\n expires: mapDetail(entry.expires)\n }\n}\n\nexport function encodeEntryData<T extends CacheEntry | EncodedCacheEntry>(entry: T, codec: AnyCodec) {\n return mapEntry(entry, identity, codec.encode) as T\n}\n\nexport function decodeEntryData<T extends CacheEntry | EncodedCacheEntry>(entry: T, codec: AnyCodec) {\n return mapEntry(entry, identity, codec.decode) as T\n}\n\nexport function encodeEntryDetails(entry: CacheEntry) {\n return mapEntry(entry, String, identity) as EncodedCacheEntry\n}\n\nexport function decodeEntryDetails(entry: EncodedCacheEntry) {\n return mapEntry(entry, Number, identity) as CacheEntry\n}\n\nexport function encodeEntry(entry: CacheEntry, codec: AnyCodec) {\n return mapEntry(entry, String, codec.encode) as EncodedCacheEntry\n}\n\nexport function decodeEntry(entry: EncodedCacheEntry, codec: AnyCodec) {\n return mapEntry(entry, Number, codec.decode) as CacheEntry\n}\n\n/**\n * Set cache entry data codec for query client.\n * @param codec - Codec used to encode and decode cached data.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function codec(codec: AnyCodec): ClientSetting {\n return (ctx) => {\n ctx.codec = codec\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/settings/entities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAEV,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,qBAAqB,CAAA;AAG5B,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,EAAE;IAClC;;OAEG;IACH,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;IAChE;;OAEG;IACH,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;CACf;AAqBD;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACtD,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,CAAC,CAAC,CAAA;AAEZ;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,EAAE,EACjC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,GACjC,MAAM,CAAC,CAAC,CAAC,CAAA;AAkCZ;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAC7E,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;AAEvC;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAC7E,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/settings/entities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAEV,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,qBAAqB,CAAA;AAG5B,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,EAAE;IAClC;;OAEG;IACH,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;IAChE;;OAEG;IACH,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;CACf;AAqBD;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACtD,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,CAAC,CAAC,CAAA;AAEZ;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,EAAE,EACjC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,GACjC,MAAM,CAAC,CAAC,CAAC,CAAA;AAkCZ;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAC7E,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;AAEvC;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAC7E,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAA","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydratable.d.ts","sourceRoot":"","sources":["../../src/settings/hydratable.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,QAAQ,EAId,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAiDvD;;;;;;GAMG;AAEH,wBAAgB,UAAU,CACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI,GAC5C,aAAa,CAsBf"}
|
|
1
|
+
{"version":3,"file":"hydratable.d.ts","sourceRoot":"","sources":["../../src/settings/hydratable.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,QAAQ,EAId,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAiDvD;;;;;;GAMG;AAEH,wBAAgB,UAAU,CACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI,GAC5C,aAAa,CAsBf","sourcesContent":["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 { EncodedCacheEntry } from '../CacheStorage.types.js'\nimport { setShardedMapKey } from '../map.js'\nimport {\n encodeEntry,\n decodeEntry\n} from './codec.js'\n\ninterface HydratableContext extends ClientContext {\n hydratable?: boolean\n}\n\ntype EncodedShardedMap = [string, string, EncodedCacheEntry][]\n\nconst id = '@nano_kit/query'\n\nfunction encode({\n cache,\n codec\n}: HydratableContext) {\n const encoded: EncodedShardedMap = []\n\n cache.forEach((shard, shardKey) => {\n shard.forEach(($signal, key) => {\n const value = $signal?.()\n\n if (value !== undefined) {\n encoded.push([shardKey, key, encodeEntry(value, codec)])\n }\n })\n })\n\n return encoded\n}\n\nfunction decode(\n {\n cache,\n codec\n }: HydratableContext,\n encoded: EncodedShardedMap\n) {\n encoded.forEach(([shard, key, value]) => setShardedMapKey(cache, {\n shard,\n key\n }, decodeEntry(value, codec)))\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 collector 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 => decode(ctx, value as EncodedShardedMap))\n } else {\n const finalHydratables = hydratables === undefined\n ? inject(Hydratables$)\n : hydratables\n\n if (finalHydratables) {\n finalHydratables.set(id, () => encode(ctx))\n }\n }\n }\n\n ctx.hydratable = true\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA","sourcesContent":["export * from './abortable.js'\nexport * from './entities.js'\nexport * from './persistence.js'\nexport { indexedDbStorage } from './indexedDbStorage.js'\nexport * from './revalidateOn.js'\nexport * from './retryOnError.js'\nexport * from './codec.js'\nexport * from './hydratable.js'\nexport * from './ssr.js'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexedDbStorage.d.ts","sourceRoot":"","sources":["../../src/settings/indexedDbStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACX,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE/C,eAAO,MAAM,OAAO,aAAa,CAAA;AACjC,eAAO,MAAM,UAAU,UAAU,CAAA;AACjC,eAAO,MAAM,UAAU,IAAI,CAAA;AAS3B,wBAAgB,OAAO,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAsBrD;AAED,wBAAsB,MAAM,CAC1B,UAAU,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,EACvC,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAiC5B;AAED,wBAAsB,GAAG,CACvB,UAAU,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,EACvC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,MAAM,CAC1B,UAAU,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,EACvC,QAAQ,EAAE,aAAa,GAAG,QAAQ,GACjC,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED;;;GAGG;AAEH,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,IAAI,CAkBjD"}
|
|
1
|
+
{"version":3,"file":"indexedDbStorage.d.ts","sourceRoot":"","sources":["../../src/settings/indexedDbStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACX,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE/C,eAAO,MAAM,OAAO,aAAa,CAAA;AACjC,eAAO,MAAM,UAAU,UAAU,CAAA;AACjC,eAAO,MAAM,UAAU,IAAI,CAAA;AAS3B,wBAAgB,OAAO,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAsBrD;AAED,wBAAsB,MAAM,CAC1B,UAAU,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,EACvC,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAiC5B;AAED,wBAAsB,GAAG,CACvB,UAAU,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,EACvC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,MAAM,CAC1B,UAAU,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,EACvC,QAAQ,EAAE,aAAa,GAAG,QAAQ,GACjC,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED;;;GAGG;AAEH,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,IAAI,CAkBjD","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/settings/persistence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACX,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAY7D,MAAM,WAAW,OAAO;IACtB,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC9C,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrD;AAED;;;;;GAKG;AAEH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAmFxG"}
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/settings/persistence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACX,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAY7D,MAAM,WAAW,OAAO;IACtB,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC9C,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrD;AAED;;;;;GAKG;AAEH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAmFxG","sourcesContent":["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'\nimport {\n encodeEntryData,\n decodeEntryData\n} from './codec.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 && decodeEntryData(storedEntry, this.codec),\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(\n storage!.set(\n key,\n encodeEntryData(entry, this.codec),\n this.persistenceLifetime!\n )\n )\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retryOnError.d.ts","sourceRoot":"","sources":["../../src/settings/retryOnError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAG7D,MAAM,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,CAAA;AAS3E,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,UAKvD;AAcD;;;;GAIG;AAEH,wBAAgB,YAAY,CAC1B,cAAc,GAAE,cAAsC,GACrD,aAAa,CAAC,kBAAkB,CAAC,CA4CnC"}
|
|
1
|
+
{"version":3,"file":"retryOnError.d.ts","sourceRoot":"","sources":["../../src/settings/retryOnError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAG7D,MAAM,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,CAAA;AAS3E,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,UAKvD;AAcD;;;;GAIG;AAEH,wBAAgB,YAAY,CAC1B,cAAc,GAAE,cAAsC,GACrD,aAAa,CAAC,kBAAkB,CAAC,CA4CnC","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revalidateOn.d.ts","sourceRoot":"","sources":["../../src/settings/revalidateOn.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAO7D;;;GAGG;AAEH,wBAAgB,YAAY,CAAC,GAAG,UAAU,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAoB5F"}
|
|
1
|
+
{"version":3,"file":"revalidateOn.d.ts","sourceRoot":"","sources":["../../src/settings/revalidateOn.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAO7D;;;GAGG;AAEH,wBAAgB,YAAY,CAAC,GAAG,UAAU,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAoB5F","sourcesContent":["import {\n type AnyAccessor,\n listen\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 RevalidateOnContext extends QueryClientContext {\n revalidateOn?: Set<AnyAccessor>\n}\n\n/**\n * Revalidate the query when the reactive condition becomes true.\n * @returns The client setting function.\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function revalidateOn(...conditions: AnyAccessor[]): ClientSetting<QueryClientContext> {\n return (ctx: RevalidateOnContext) => {\n if (ctx.revalidateOn === undefined) {\n ctx.revalidateOn = new Set()\n }\n\n conditions.forEach(($condition) => {\n if (!ctx.revalidateOn!.has($condition)) {\n ctx.mounted = addFn(ctx.mounted, function (this: RevalidateOnContext) {\n listen($condition, (visible) => {\n if (visible) {\n this.revalidate(this.$key())\n }\n })\n })\n\n ctx.revalidateOn!.add($condition)\n }\n })\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr.d.ts","sourceRoot":"","sources":["../../src/settings/ssr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIvD;;;;;GAKG;AACH,wBAAgB,GAAG,IAAI,aAAa,CAQnC"}
|
|
1
|
+
{"version":3,"file":"ssr.d.ts","sourceRoot":"","sources":["../../src/settings/ssr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIvD;;;;;GAKG;AACH,wBAAgB,GAAG,IAAI,aAAa,CAQnC","sourcesContent":["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"]}
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,wBAAgB,KAAK,CAEnB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAClC,MAAM,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CASjC;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EACzB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,cAMvD"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,wBAAgB,KAAK,CAEnB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAClC,MAAM,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CASjC;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EACzB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,cAMvD","sourcesContent":["/* @__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"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nano_kit/query",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.0-alpha.
|
|
4
|
+
"version": "1.0.0-alpha.6",
|
|
5
5
|
"description": "A small and powerful remote data management library for @nano_kit/store.",
|
|
6
6
|
"author": "dangreen",
|
|
7
7
|
"license": "MIT",
|
|
@@ -40,6 +40,6 @@
|
|
|
40
40
|
"dist"
|
|
41
41
|
],
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@nano_kit/store": "^1.0.0-beta.
|
|
43
|
+
"@nano_kit/store": "^1.0.0-beta.5"
|
|
44
44
|
}
|
|
45
45
|
}
|