fork of hey-api/openapi-ts because I need some additional things
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #2876 from hey-api/chore/symbol-query-cache

chore: cache queries with no results

authored by

Lubos and committed by
GitHub
9cc82cd2 afb4dfbe

+62 -3
+27
packages/codegen-core/src/__tests__/symbols.test.ts
··· 203 203 expect(resultFoo2.map((r) => r.name).sort()).toEqual(['A', 'B']); 204 204 expect(registry['queryCache'].size).toBe(2); 205 205 }); 206 + 207 + it('caches empty results across all early exit paths', () => { 208 + const registry = new SymbolRegistry(); 209 + 210 + // 1. Key doesn't exist in indices 211 + const resNoKey = registry.query({ foo: 'bar' }); 212 + expect(resNoKey).toEqual([]); 213 + const cacheKeys1 = Array.from(registry['queryCache'].keys()); 214 + expect(cacheKeys1.length).toBe(1); 215 + expect(registry['queryCache'].get(cacheKeys1[0]!)).toEqual([]); 216 + 217 + // 2. Key exists but value doesn't 218 + // Insert symbol with unrelated meta 219 + registry.register({ meta: { something: 'else' }, name: 'A' }); 220 + const resNoValue = registry.query({ bar: 'baz' }); 221 + expect(resNoValue).toEqual([]); 222 + const cacheKeys2 = Array.from(registry['queryCache'].keys()); 223 + expect(cacheKeys2.length).toBe(2); 224 + expect(registry['queryCache'].get(cacheKeys2[1]!)).toEqual([]); 225 + 226 + // 3. Empty indexKeySpace (empty meta object) 227 + const resEmpty = registry.query({}); 228 + expect(resEmpty).toEqual([]); 229 + const cacheKeys3 = Array.from(registry['queryCache'].keys()); 230 + expect(cacheKeys3.length).toBe(3); 231 + expect(registry['queryCache'].get(cacheKeys3[2]!)).toEqual([]); 232 + }); 206 233 });
+14 -3
packages/codegen-core/src/symbols/registry.ts
··· 80 80 const sets: Array<Set<SymbolId>> = []; 81 81 const indexKeySpace = this.buildIndexKeySpace(filter); 82 82 const cacheDependencies = new Set<QueryCacheKey>(); 83 + let missed = false; 83 84 for (const indexEntry of indexKeySpace) { 84 85 cacheDependencies.add(this.serializeIndexEntry(indexEntry)); 85 86 const values = this.indices.get(indexEntry[0]); 86 - if (!values) return []; 87 + if (!values) { 88 + missed = true; 89 + break; 90 + } 87 91 const set = values.get(indexEntry[1]); 88 - if (!set) return []; 92 + if (!set) { 93 + missed = true; 94 + break; 95 + } 89 96 sets.push(set); 90 97 } 91 - if (!sets.length) return []; 98 + if (missed || !sets.length) { 99 + this.queryCacheDependencies.set(cacheKey, cacheDependencies); 100 + this.queryCache.set(cacheKey, []); 101 + return []; 102 + } 92 103 let result = new Set(sets[0]); 93 104 for (const set of sets.slice(1)) { 94 105 result = new Set([...result].filter((symbolId) => set.has(symbolId)));
+1
packages/openapi-ts/src/plugins/@angular/common/api.ts
··· 21 21 * - `inject`: never 22 22 * - `Injectable`: never 23 23 * @returns Selector array 24 + * @deprecated 24 25 */ 25 26 selector: (type: SelectorType, value?: string) => Selector; 26 27 };
+1
packages/openapi-ts/src/plugins/@hey-api/client-angular/api.ts
··· 10 10 * @param value Depends on `type`: 11 11 * - `client`: never 12 12 * @returns Selector array 13 + * @deprecated 13 14 */ 14 15 selector: (type: SelectorType, value?: string) => Selector; 15 16 };
+1
packages/openapi-ts/src/plugins/@hey-api/client-axios/api.ts
··· 10 10 * @param value Depends on `type`: 11 11 * - `client`: never 12 12 * @returns Selector array 13 + * @deprecated 13 14 */ 14 15 selector: (type: SelectorType, value?: string) => Selector; 15 16 };
+1
packages/openapi-ts/src/plugins/@hey-api/client-fetch/api.ts
··· 10 10 * @param value Depends on `type`: 11 11 * - `client`: never 12 12 * @returns Selector array 13 + * @deprecated 13 14 */ 14 15 selector: (type: SelectorType, value?: string) => Selector; 15 16 };
+1
packages/openapi-ts/src/plugins/@hey-api/client-next/api.ts
··· 10 10 * @param value Depends on `type`: 11 11 * - `client`: never 12 12 * @returns Selector array 13 + * @deprecated 13 14 */ 14 15 selector: (type: SelectorType, value?: string) => Selector; 15 16 };
+1
packages/openapi-ts/src/plugins/@hey-api/client-nuxt/api.ts
··· 10 10 * @param value Depends on `type`: 11 11 * - `client`: never 12 12 * @returns Selector array 13 + * @deprecated 13 14 */ 14 15 selector: (type: SelectorType, value?: string) => Selector; 15 16 };
+1
packages/openapi-ts/src/plugins/@hey-api/client-ofetch/api.ts
··· 10 10 * @param value Depends on `type`: 11 11 * - `client`: never 12 12 * @returns Selector array 13 + * @deprecated 13 14 */ 14 15 selector: (type: SelectorType, value?: string) => Selector; 15 16 };
+1
packages/openapi-ts/src/plugins/@hey-api/schemas/api.ts
··· 10 10 * @param value Depends on `type`: 11 11 * - `ref`: `$ref` JSON pointer 12 12 * @returns Selector array 13 + * @deprecated 13 14 */ 14 15 selector: (type: SelectorType, value?: string) => Selector; 15 16 };
+1
packages/openapi-ts/src/plugins/@hey-api/sdk/api.ts
··· 27 27 * - `Options`: never 28 28 * - `urlSearchParamsBodySerializer`: never 29 29 * @returns Selector array 30 + * @deprecated 30 31 */ 31 32 selector: (type: SelectorType, value?: string) => Selector; 32 33 };
+1
packages/openapi-ts/src/plugins/@hey-api/transformers/api.ts
··· 11 11 * - `response`: `operation.id` string 12 12 * - `response-ref`: `$ref` JSON pointer 13 13 * @returns Selector array 14 + * @deprecated 14 15 */ 15 16 selector: (type: SelectorType, value?: string) => Selector; 16 17 };
+1
packages/openapi-ts/src/plugins/@hey-api/typescript/api.ts
··· 21 21 * - `webhook-request`: `operation.id` string 22 22 * - `Webhooks`: never 23 23 * @returns Selector array 24 + * @deprecated 24 25 */ 25 26 selector: (type: SelectorType, value?: string) => Selector; 26 27 };
+1
packages/openapi-ts/src/plugins/@pinia/colada/api.ts
··· 27 27 * - `UseMutationOptions`: never 28 28 * - `UseQueryOptions`: never 29 29 * @returns Selector array 30 + * @deprecated 30 31 */ 31 32 selector: (type: SelectorType, value?: string) => Selector; 32 33 };
+1
packages/openapi-ts/src/plugins/@tanstack/angular-query-experimental/api.ts
··· 31 31 * - `QueryKey`: never 32 32 * - `useQuery`: never 33 33 * @returns Selector array 34 + * @deprecated 34 35 */ 35 36 selector: (type: SelectorType, value?: string) => Selector; 36 37 };
+1
packages/openapi-ts/src/plugins/@tanstack/react-query/api.ts
··· 31 31 * - `QueryKey`: never 32 32 * - `useQuery`: never 33 33 * @returns Selector array 34 + * @deprecated 34 35 */ 35 36 selector: (type: SelectorType, value?: string) => Selector; 36 37 };
+1
packages/openapi-ts/src/plugins/@tanstack/solid-query/api.ts
··· 31 31 * - `QueryKey`: never 32 32 * - `useQuery`: never 33 33 * @returns Selector array 34 + * @deprecated 34 35 */ 35 36 selector: (type: SelectorType, value?: string) => Selector; 36 37 };
+1
packages/openapi-ts/src/plugins/@tanstack/svelte-query/api.ts
··· 31 31 * - `QueryKey`: never 32 32 * - `useQuery`: never 33 33 * @returns Selector array 34 + * @deprecated 34 35 */ 35 36 selector: (type: SelectorType, value?: string) => Selector; 36 37 };
+1
packages/openapi-ts/src/plugins/@tanstack/vue-query/api.ts
··· 31 31 * - `QueryKey`: never 32 32 * - `useQuery`: never 33 33 * @returns Selector array 34 + * @deprecated 34 35 */ 35 36 selector: (type: SelectorType, value?: string) => Selector; 36 37 };
+1
packages/openapi-ts/src/plugins/arktype/api.ts
··· 35 35 * - `type-infer-webhook-request`: `operation.id` string 36 36 * - `webhook-request`: `operation.id` string 37 37 * @returns Selector array 38 + * @deprecated 38 39 */ 39 40 selector: (type: SelectorType, value?: string) => Selector; 40 41 };
+1
packages/openapi-ts/src/plugins/fastify/api.ts
··· 10 10 * @param value Depends on `type`: 11 11 * - `RouteHandler`: never 12 12 * @returns Selector array 13 + * @deprecated 13 14 */ 14 15 selector: (type: SelectorType, value?: string) => Selector; 15 16 };
+1
packages/openapi-ts/src/plugins/valibot/api.ts
··· 27 27 * - `responses`: `operation.id` string 28 28 * - `webhook-request`: `operation.id` string 29 29 * @returns Selector array 30 + * @deprecated 30 31 */ 31 32 selector: (type: SelectorType, value?: string) => Selector; 32 33 };
+1
packages/openapi-ts/src/plugins/zod/api.ts
··· 40 40 * - `type-infer-webhook-request`: `operation.id` string 41 41 * - `webhook-request`: `operation.id` string 42 42 * @returns Selector array 43 + * @deprecated 43 44 */ 44 45 selector: (type: SelectorType, value?: string) => Selector; 45 46 };