From 3336b925d2047a1cf084df93b2171c50fd260de1 Mon Sep 17 00:00:00 2001 From: dangreen Date: Fri, 19 Jun 2026 16:27:34 +0400 Subject: [PATCH] feat(query): save request params into entries --- packages/query/.size-limit.json | 6 +++--- packages/query/src/CacheStorage.spec.ts | 15 +++++++++++++++ packages/query/src/CacheStorage.ts | 3 +++ packages/query/src/CacheStorage.types.ts | 7 ++++--- packages/query/src/RequestContext.ts | 3 ++- packages/query/src/cache.spec.ts | 17 +++++++++++++---- packages/query/src/cache.ts | 3 ++- packages/query/src/settings/entities.ts | 2 +- 8 files changed, 43 insertions(+), 13 deletions(-) diff --git a/packages/query/.size-limit.json b/packages/query/.size-limit.json index 8e273e31..aaa3bf0b 100644 --- a/packages/query/.size-limit.json +++ b/packages/query/.size-limit.json @@ -3,12 +3,12 @@ "name": "All publics", "path": "dist/index.js", "import": "*", - "limit": "3.96 kB" + "limit": "3.98 kB" }, { "name": "Minimal set", "path": "dist/index.js", - "import": "{ client, mutations }", - "limit": "1.6 kB" + "import": "{ client, mutations, queryKey }", + "limit": "1.7 kB" } ] diff --git a/packages/query/src/CacheStorage.spec.ts b/packages/query/src/CacheStorage.spec.ts index 54927ffa..3c22f724 100644 --- a/packages/query/src/CacheStorage.spec.ts +++ b/packages/query/src/CacheStorage.spec.ts @@ -65,6 +65,7 @@ describe('query', () => { rev: expect.any(Number), dedupes: 0, expires: 0, + params: [], data: null, error: null, loading: false @@ -103,6 +104,7 @@ describe('query', () => { rev: 1, dedupes: 2, expires: 3, + params: key.params, data: 'data', error: null, loading: false @@ -242,6 +244,7 @@ describe('query', () => { rev: 100, dedupes: 500, expires: 1000, + params: key.params, data: 'data', error: null, loading: false @@ -274,6 +277,7 @@ describe('query', () => { rev: 100, dedupes: 500, expires: 1000, + params: userKey.params, data: 'user', error: null, loading: false @@ -282,6 +286,7 @@ describe('query', () => { rev: 200, dedupes: 600, expires: 1000, + params: postKey.params, data: 'post', error: null, loading: false @@ -328,6 +333,7 @@ describe('query', () => { rev: 1, dedupes: 0, expires: 0, + params: [], data: null, error: null, loading: true @@ -341,6 +347,7 @@ describe('query', () => { rev: 1, dedupes: Date.now() + 10000, expires: 0, + params: [], data: null, error: null, loading: false @@ -354,6 +361,7 @@ describe('query', () => { rev: revLock(5), dedupes: 0, expires: 0, + params: [], data: null, error: null, loading: false @@ -367,6 +375,7 @@ describe('query', () => { rev: 1, dedupes: Date.now() - 1000, expires: 0, + params: [], data: null, error: null, loading: false @@ -380,6 +389,7 @@ describe('query', () => { rev: 1, dedupes: 0, expires: 0, + params: [], data: null, error: null, loading: true @@ -393,6 +403,7 @@ describe('query', () => { rev: 1, dedupes: Date.now() + 10000, expires: 0, + params: [], data: null, error: null, loading: false @@ -410,6 +421,7 @@ describe('query', () => { rev: 1, dedupes: 0, expires: 0, + params: key.params, data: null, error: 'previous error', loading: false @@ -438,6 +450,7 @@ describe('query', () => { rev: 1, dedupes: 0, expires: Date.now() + 10000, + params: key.params, data: 'cached data', error: null, loading: false @@ -458,6 +471,7 @@ describe('query', () => { rev: 1, dedupes: 0, expires: Date.now() - 1000, + params: key.params, data: 'old data', error: null, loading: false @@ -515,6 +529,7 @@ describe('query', () => { rev: 1, dedupes: 0, expires: 0, + params: key.params, data: 'previous data', error: null, loading: true diff --git a/packages/query/src/CacheStorage.ts b/packages/query/src/CacheStorage.ts index 57232554..1a5b3ccc 100644 --- a/packages/query/src/CacheStorage.ts +++ b/packages/query/src/CacheStorage.ts @@ -47,6 +47,7 @@ export class CacheStorage { rev: UNSET_REV, dedupes: 0, expires: 0, + params: [], data: null, error: null, loading: false @@ -110,6 +111,7 @@ export class CacheStorage { this.set(key, (entry = this.initial()) => ({ ...entry, rev, + params: key.params, data: entry.expires > Date.now() ? entry.data : null, error: null, loading: true @@ -133,6 +135,7 @@ export class CacheStorage { ...entry, dedupes: now + this.dedupeTime, expires: now + this.cacheTime, + params: key.params, data: error === null ? data : entry.data, error, loading: false diff --git a/packages/query/src/CacheStorage.types.ts b/packages/query/src/CacheStorage.types.ts index 47ef1f41..9bc4a517 100644 --- a/packages/query/src/CacheStorage.types.ts +++ b/packages/query/src/CacheStorage.types.ts @@ -4,11 +4,12 @@ import type { ShardedKey } from './map.js' -export interface CacheEntry { +export interface CacheEntry

{ rev: number dedupes: number expires: number - data: T | null + params: P + data: R | null error: string | null loading: boolean } @@ -34,7 +35,7 @@ export interface CacheKey< P extends unknown[] = unknown[], R = unknown > extends ShardedKey { + params: P // Only types info: - P: P R: R } diff --git a/packages/query/src/RequestContext.ts b/packages/query/src/RequestContext.ts index 644a3f9b..7455938e 100644 --- a/packages/query/src/RequestContext.ts +++ b/packages/query/src/RequestContext.ts @@ -36,7 +36,7 @@ export class QueryContext

implements CacheKey { shard: string key: string - P!: P + params: P R!: R constructor( @@ -47,6 +47,7 @@ export class QueryContext

this.shard = key.shard this.key = key.key + this.params = key.params } } diff --git a/packages/query/src/cache.spec.ts b/packages/query/src/cache.spec.ts index c4189a35..4c2c23a5 100644 --- a/packages/query/src/cache.spec.ts +++ b/packages/query/src/cache.spec.ts @@ -33,7 +33,8 @@ describe('query', () => { expect(UserKey()).toEqual({ shard: 'users', - key: '[]' + key: '[]', + params: [] }) }) @@ -42,7 +43,8 @@ describe('query', () => { expect(UserKey(42)).toEqual({ shard: 'users', - key: '[42]' + key: '[42]', + params: [42] }) }) @@ -51,7 +53,8 @@ describe('query', () => { expect(UserKey(42, 'Dan')).toEqual({ shard: 'users', - key: '[42,"Dan"]' + key: '[42,"Dan"]', + params: [42, 'Dan'] }) }) @@ -65,7 +68,13 @@ describe('query', () => { force: true })).toEqual({ shard: 'users', - key: '[42]' + key: '[42]', + params: [ + 42, + { + force: true + } + ] }) }) }) diff --git a/packages/query/src/cache.ts b/packages/query/src/cache.ts index 3d5dff8d..92f4e0ca 100644 --- a/packages/query/src/cache.ts +++ b/packages/query/src/cache.ts @@ -29,7 +29,8 @@ export function queryKey

( ) { const key = ((...params: Partial

) => ({ shard: name, - key: JSON.stringify(filter(params)) + key: JSON.stringify(filter(params)), + params })) as CacheKeyBuilder key.shard = name diff --git a/packages/query/src/settings/entities.ts b/packages/query/src/settings/entities.ts index 721eadf1..77e3f058 100644 --- a/packages/query/src/settings/entities.ts +++ b/packages/query/src/settings/entities.ts @@ -128,7 +128,7 @@ export function entities( ctx.set(key, { ...ctx.initial(), - // params: key.params, + params: key.params, data: entity })