@micro-graphql/core
Advanced tools
+7
-2
@@ -6,8 +6,13 @@ export interface IMicroGraphQLCacheResult<TValue> { | ||
| export interface IMicroGraphQLCache { | ||
| tryGet<TValue>(key: string): IMicroGraphQLCacheResult<TValue>; | ||
| trySet<TValue>(key: string, data?: TValue): boolean; | ||
| tryGet<TValue>(query: string, variables: { | ||
| [key: string]: unknown; | ||
| } | undefined): IMicroGraphQLCacheResult<TValue>; | ||
| trySet<TValue>(query: string, variables: { | ||
| [key: string]: unknown; | ||
| } | undefined, data?: TValue): boolean; | ||
| stringify(): string; | ||
| restore(data: string): void; | ||
| prepareQuery(query: string): string; | ||
| } | ||
| export declare function createCache(): IMicroGraphQLCache; | ||
| //# sourceMappingURL=cache.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB,CAAC,MAAM;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACpD,SAAS,IAAI,MAAM,CAAC;IACpB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,WAAW,IAAI,kBAAkB,CAyBhD"} | ||
| {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB,CAAC,MAAM;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,CAAC,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,SAAS,GAC/C,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,SAAS,EACjD,IAAI,CAAC,EAAE,MAAM,GACX,OAAO,CAAC;IACX,SAAS,IAAI,MAAM,CAAC;IACpB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACpC;AAED,wBAAgB,WAAW,IAAI,kBAAkB,CAuChD"} |
+8
-2
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const hash_1 = require("./hash"); | ||
| function createCache() { | ||
| let cache = {}; | ||
| return { | ||
| tryGet: (key) => { | ||
| tryGet: (query, variables) => { | ||
| const key = hash_1.objectHash({ query, variables }); | ||
| const success = key in cache; | ||
@@ -14,3 +16,4 @@ const data = success ? cache[key] : undefined; | ||
| }, | ||
| trySet: (key, data) => { | ||
| trySet: (query, variables, data) => { | ||
| const key = hash_1.objectHash({ query, variables }); | ||
| cache[key] = data; | ||
@@ -24,2 +27,5 @@ return false; | ||
| cache = JSON.parse(data); | ||
| }, | ||
| prepareQuery(query) { | ||
| return query; | ||
| } | ||
@@ -26,0 +32,0 @@ }; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":";;AAYA,SAAgB,WAAW;IAC1B,IAAI,KAAK,GAA+B,EAAE,CAAC;IAE3C,OAAO;QACN,MAAM,EAAE,CAAS,GAAW,EAAoC,EAAE;YACjE,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC;YAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE9C,OAAO;gBACN,IAAI,EAAE,IAAc;gBACpB,OAAO;aACP,CAAC;QACH,CAAC;QACD,MAAM,EAAE,CAAS,GAAW,EAAE,IAAa,EAAW,EAAE;YACvD,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAElB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,SAAS;YACR,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,IAAY;YACnB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACD,CAAC;AACH,CAAC;AAzBD,kCAyBC"} | ||
| {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":";;AAAA,iCAAoC;AAsBpC,SAAgB,WAAW;IAC1B,IAAI,KAAK,GAA+B,EAAE,CAAC;IAE3C,OAAO;QACN,MAAM,EAAE,CACP,KAAa,EACb,SAAiD,EACd,EAAE;YACrC,MAAM,GAAG,GAAG,iBAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAE7C,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC;YAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE9C,OAAO;gBACN,IAAI,EAAE,IAAc;gBACpB,OAAO;aACP,CAAC;QACH,CAAC;QACD,MAAM,EAAE,CACP,KAAa,EACb,SAAiD,EACjD,IAAa,EACH,EAAE;YACZ,MAAM,GAAG,GAAG,iBAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAE7C,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAElB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,SAAS;YACR,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,IAAY;YACnB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,YAAY,CAAC,KAAa;YACzB,OAAO,KAAK,CAAC;QACd,CAAC;KACD,CAAC;AACH,CAAC;AAvCD,kCAuCC"} |
+18
-9
| import { IMicroGraphQLCache } from './cache'; | ||
| import { ObjectHasher } from './hash'; | ||
| export interface IMicroGraphQLConfig { | ||
@@ -8,3 +7,2 @@ cache: IMicroGraphQLCache; | ||
| fetch(input: RequestInfo, init?: RequestInit | undefined): Promise<Response>; | ||
| hash: ObjectHasher; | ||
| } | ||
@@ -23,15 +21,26 @@ export interface IMicroGraphQLError { | ||
| } | ||
| export interface IMicroGraphQLQueryOptions<TQueryVariables> { | ||
| export interface IMicroGraphQLQueryOptions<TQueryVariables extends { | ||
| [key: string]: unknown; | ||
| }> { | ||
| skipCache?: boolean; | ||
| variables?: TQueryVariables; | ||
| } | ||
| export interface IMicroGraphQLSubscriptionOptions<TQueryVariables = unknown> extends IMicroGraphQLQueryOptions<TQueryVariables> { | ||
| export interface IMicroGraphQLSubscriptionOptions<TQueryVariables extends { | ||
| [key: string]: unknown; | ||
| }> extends IMicroGraphQLQueryOptions<TQueryVariables> { | ||
| query: string; | ||
| } | ||
| export interface IMicroGraphQLClient { | ||
| cache?: IMicroGraphQLCache; | ||
| hash: ObjectHasher; | ||
| cache: IMicroGraphQLCache; | ||
| ssr?: boolean; | ||
| query<TData, TQueryVariables>(query: string, options?: IMicroGraphQLQueryOptions<TQueryVariables>): Promise<IMicroGraphQLResult<TData>>; | ||
| subscribe: <TData, TQueryVariables>(options: IMicroGraphQLSubscriptionOptions<TQueryVariables>, subscription: (data: IMicroGraphQLResult<TData>) => void) => () => void; | ||
| query<TData extends { | ||
| [key: string]: any; | ||
| }, TQueryVariables extends { | ||
| [key: string]: any; | ||
| }>(query: string, options?: IMicroGraphQLQueryOptions<TQueryVariables>): Promise<IMicroGraphQLResult<TData>>; | ||
| subscribe: <TData extends { | ||
| [key: string]: any; | ||
| }, TQueryVariables extends { | ||
| [key: string]: any; | ||
| }>(options: IMicroGraphQLSubscriptionOptions<TQueryVariables>, subscription: (data: IMicroGraphQLResult<TData>) => void) => () => void; | ||
| resolveQueries(): Promise<void>; | ||
@@ -42,3 +51,3 @@ } | ||
| export declare const queryKeyError = "error creating a unique key for the query"; | ||
| export declare function createClient({ url, cache, ssr, fetch, hash }: IMicroGraphQLConfig): IMicroGraphQLClient; | ||
| export declare function createClient({ url, cache, ssr, fetch }: IMicroGraphQLConfig): IMicroGraphQLClient; | ||
| //# sourceMappingURL=client.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7E,IAAI,EAAE,YAAY,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB,CAAC,KAAK;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB,CAAC,eAAe;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,gCAAgC,CAAC,eAAe,GAAG,OAAO,CAC1E,SAAQ,yBAAyB,CAAC,eAAe,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IACnC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,KAAK,EAAE,eAAe,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,yBAAyB,CAAC,eAAe,CAAC,GAClD,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,SAAS,EAAE,CAAC,KAAK,EAAE,eAAe,EACjC,OAAO,EAAE,gCAAgC,CAAC,eAAe,CAAC,EAC1D,YAAY,EAAE,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,IAAI,KACpD,MAAM,IAAI,CAAC;IAChB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;CAAG;AAElD,eAAO,MAAM,aAAa,8CAA8C,CAAC;AAEzE,wBAAgB,YAAY,CAAC,EAC5B,GAAG,EACH,KAAK,EACL,GAAG,EACH,KAAK,EACL,IAAI,EACJ,EAAE,mBAAmB,GAAG,mBAAmB,CAiH3C"} | ||
| {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAG7C,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB,CAAC,KAAK;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB,CAAC,eAAe,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;IAC5F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,gCAAgC,CAChD,eAAe,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAElD,SAAQ,yBAAyB,CAAC,eAAe,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAC;IAGd,KAAK,CAAC,KAAK,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAAE,eAAe,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EACzF,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,yBAAyB,CAAC,eAAe,CAAC,GAClD,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAGvC,SAAS,EAAE,CAAC,KAAK,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAAE,eAAe,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAC/F,OAAO,EAAE,gCAAgC,CAAC,eAAe,CAAC,EAC1D,YAAY,EAAE,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,IAAI,KACpD,MAAM,IAAI,CAAC;IAChB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;CAAG;AAElD,eAAO,MAAM,aAAa,8CAA8C,CAAC;AAEzE,wBAAgB,YAAY,CAAC,EAC5B,GAAG,EACH,KAAK,EACL,GAAG,EACH,KAAK,EACL,EAAE,mBAAmB,GAAG,mBAAmB,CA8G3C"} |
+20
-20
| "use strict"; | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| /* eslint-disable import/extensions */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const hash_1 = require("./hash"); | ||
| class MicroGraphQLKeyError extends Error { | ||
@@ -8,4 +10,3 @@ } | ||
| exports.queryKeyError = 'error creating a unique key for the query'; | ||
| function createClient({ url, cache, ssr, fetch, hash }) { | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| function createClient({ url, cache, ssr, fetch }) { | ||
| const subscriptions = new Map(); | ||
@@ -15,3 +16,2 @@ const queries = {}; | ||
| cache, | ||
| hash, | ||
| ssr, | ||
@@ -21,8 +21,6 @@ resolveQueries: async () => { | ||
| }, | ||
| // eslint-disable-next-line max-len | ||
| subscribe: (options, subscription) => { | ||
| const key = hash({ query: options.query, variables: options.variables }); | ||
| if (!key) { | ||
| throw new MicroGraphQLKeyError(exports.queryKeyError); | ||
| } | ||
| const cached = cache.tryGet(key); | ||
| const query = cache.prepareQuery(options.query); | ||
| const cached = cache.tryGet(query, options.variables); | ||
| if (cached.success) { | ||
@@ -34,2 +32,3 @@ subscription({ | ||
| } | ||
| const key = hash_1.objectHash({ query, variables: options.variables }); | ||
| const subs = subscriptions.get(key) || []; | ||
@@ -43,7 +42,4 @@ subs.push(subscription); | ||
| }, | ||
| query: async (query, options) => { | ||
| const key = hash({ query, variables: options && options.variables }); | ||
| if (!key) { | ||
| throw new MicroGraphQLKeyError(exports.queryKeyError); | ||
| } | ||
| // eslint-disable-next-line max-len | ||
| query: async (inputQuery, options) => { | ||
| const { skipCache } = { | ||
@@ -53,9 +49,13 @@ skipCache: false, | ||
| }; | ||
| const cachedResult = !skipCache && cache.tryGet(key); | ||
| if (!skipCache && cachedResult && cachedResult.success) { | ||
| return { | ||
| loading: false, | ||
| data: cachedResult.data | ||
| }; | ||
| const query = cache.prepareQuery(inputQuery); | ||
| if (!skipCache) { | ||
| const cachedResult = !skipCache && cache.tryGet(query, options && options.variables); | ||
| if (cachedResult.success) { | ||
| return { | ||
| loading: false, | ||
| data: cachedResult.data | ||
| }; | ||
| } | ||
| } | ||
| const key = hash_1.objectHash({ query, variables: options && options.variables }); | ||
| const subs = subscriptions.get(key); | ||
@@ -80,3 +80,3 @@ if (subs) { | ||
| if (json.data) { | ||
| cache.trySet(key, json.data); | ||
| cache.trySet(query, options && options.variables, json.data); | ||
| } | ||
@@ -83,0 +83,0 @@ return { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"} |
+2
-2
@@ -7,5 +7,5 @@ export declare function sortObjectKeys<T extends { | ||
| }) => string | null; | ||
| export declare function objectHash(obj?: null | { | ||
| export declare function objectHash(obj: { | ||
| [key: string]: unknown; | ||
| }): string | null; | ||
| }): string; | ||
| //# sourceMappingURL=hash.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAOjF;AAED,oBAAY,YAAY,GAAG,CAC1B,GAAG,CAAC,EAAE,IAAI,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,KACnC,MAAM,GAAG,IAAI,CAAC;AAEnB,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAUjF"} | ||
| {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAOjF;AAED,oBAAY,YAAY,GAAG,CAC1B,GAAG,CAAC,EAAE,IAAI,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,KACnC,MAAM,GAAG,IAAI,CAAC;AAEnB,wBAAgB,UAAU,CAAC,GAAG,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,MAAM,CAMlE"} |
+0
-3
@@ -12,5 +12,2 @@ "use strict"; | ||
| function objectHash(obj) { | ||
| if (!obj) { | ||
| return null; | ||
| } | ||
| const sorted = sortObjectKeys(obj); | ||
@@ -17,0 +14,0 @@ const json = JSON.stringify(sorted); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":";;AAAA,SAAgB,cAAc,CAAuC,MAAS;IAC7E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEvC,OAAQ,EAAe,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACvE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACd,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,CAAC;AAPD,wCAOC;AAMD,SAAgB,UAAU,CAAC,GAAuC;IACjE,IAAI,CAAC,GAAG,EAAE;QACT,OAAO,IAAI,CAAC;KACZ;IAED,MAAM,MAAM,GAAY,cAAc,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEpC,qBAAqB;IACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAVD,gCAUC"} | ||
| {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":";;AAAA,SAAgB,cAAc,CAAuC,MAAS;IAC7E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEvC,OAAQ,EAAe,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACvE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACd,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,CAAC;AAPD,wCAOC;AAMD,SAAgB,UAAU,CAAC,GAA+B;IACzD,MAAM,MAAM,GAAY,cAAc,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEpC,qBAAqB;IACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAND,gCAMC"} |
+0
-1
| export * from './client'; | ||
| export * from './cache'; | ||
| export * from './gql'; | ||
| export * from './hash'; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC"} |
+0
-1
@@ -9,3 +9,2 @@ "use strict"; | ||
| __export(require("./gql")); | ||
| __export(require("./hash")); | ||
| //# sourceMappingURL=index.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,8BAAyB;AACzB,6BAAwB;AACxB,2BAAsB;AACtB,4BAAuB"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,8BAAyB;AACzB,6BAAwB;AACxB,2BAAsB"} |
+1
-1
| { | ||
| "name": "@micro-graphql/core", | ||
| "version": "0.0.6", | ||
| "version": "0.1.0", | ||
| "license": "MIT", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
+28
-4
@@ -0,1 +1,3 @@ | ||
| import { objectHash } from './hash'; | ||
| export interface IMicroGraphQLCacheResult<TValue> { | ||
@@ -7,6 +9,14 @@ data?: TValue; | ||
| export interface IMicroGraphQLCache { | ||
| tryGet<TValue>(key: string): IMicroGraphQLCacheResult<TValue>; | ||
| trySet<TValue>(key: string, data?: TValue): boolean; | ||
| tryGet<TValue>( | ||
| query: string, | ||
| variables: { [key: string]: unknown } | undefined | ||
| ): IMicroGraphQLCacheResult<TValue>; | ||
| trySet<TValue>( | ||
| query: string, | ||
| variables: { [key: string]: unknown } | undefined, | ||
| data?: TValue | ||
| ): boolean; | ||
| stringify(): string; | ||
| restore(data: string): void; | ||
| prepareQuery(query: string): string; | ||
| } | ||
@@ -18,3 +28,8 @@ | ||
| return { | ||
| tryGet: <TValue>(key: string): IMicroGraphQLCacheResult<TValue> => { | ||
| tryGet: <TValue>( | ||
| query: string, | ||
| variables: { [key: string]: unknown } | undefined | ||
| ): IMicroGraphQLCacheResult<TValue> => { | ||
| const key = objectHash({ query, variables }); | ||
| const success = key in cache; | ||
@@ -28,3 +43,9 @@ const data = success ? cache[key] : undefined; | ||
| }, | ||
| trySet: <TValue>(key: string, data?: TValue): boolean => { | ||
| trySet: <TValue>( | ||
| query: string, | ||
| variables: { [key: string]: unknown } | undefined, | ||
| data?: TValue | ||
| ): boolean => { | ||
| const key = objectHash({ query, variables }); | ||
| cache[key] = data; | ||
@@ -39,4 +60,7 @@ | ||
| cache = JSON.parse(data); | ||
| }, | ||
| prepareQuery(query: string): string { | ||
| return query; | ||
| } | ||
| }; | ||
| } |
+35
-34
@@ -0,5 +1,6 @@ | ||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||
| /* eslint-disable import/extensions */ | ||
| import { IMicroGraphQLCache } from './cache'; | ||
| import { ObjectHasher } from './hash'; | ||
| import { objectHash } from './hash'; | ||
@@ -11,3 +12,2 @@ export interface IMicroGraphQLConfig { | ||
| fetch(input: RequestInfo, init?: RequestInit | undefined): Promise<Response>; | ||
| hash: ObjectHasher; | ||
| } | ||
@@ -27,3 +27,3 @@ | ||
| export interface IMicroGraphQLQueryOptions<TQueryVariables> { | ||
| export interface IMicroGraphQLQueryOptions<TQueryVariables extends { [key: string]: unknown }> { | ||
| skipCache?: boolean; | ||
@@ -33,3 +33,5 @@ variables?: TQueryVariables; | ||
| export interface IMicroGraphQLSubscriptionOptions<TQueryVariables = unknown> | ||
| export interface IMicroGraphQLSubscriptionOptions< | ||
| TQueryVariables extends { [key: string]: unknown } | ||
| > | ||
| extends IMicroGraphQLQueryOptions<TQueryVariables> { | ||
@@ -40,10 +42,13 @@ query: string; | ||
| export interface IMicroGraphQLClient { | ||
| cache?: IMicroGraphQLCache; | ||
| hash: ObjectHasher; | ||
| cache: IMicroGraphQLCache; | ||
| ssr?: boolean; | ||
| query<TData, TQueryVariables>( | ||
| // eslint-disable-next-line max-len | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| query<TData extends { [key: string]: any }, TQueryVariables extends { [key: string]: any }>( | ||
| query: string, | ||
| options?: IMicroGraphQLQueryOptions<TQueryVariables> | ||
| ): Promise<IMicroGraphQLResult<TData>>; | ||
| subscribe: <TData, TQueryVariables>( | ||
| // eslint-disable-next-line max-len | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| subscribe: <TData extends { [key: string]: any }, TQueryVariables extends { [key: string]: any }>( | ||
| options: IMicroGraphQLSubscriptionOptions<TQueryVariables>, | ||
@@ -63,6 +68,4 @@ subscription: (data: IMicroGraphQLResult<TData>) => void | ||
| ssr, | ||
| fetch, | ||
| hash | ||
| fetch | ||
| }: IMicroGraphQLConfig): IMicroGraphQLClient { | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| const subscriptions = new Map<string, Array<(data: IMicroGraphQLResult<any> & {}) => void>>(); | ||
@@ -74,3 +77,2 @@ | ||
| cache, | ||
| hash, | ||
| ssr, | ||
@@ -80,13 +82,10 @@ resolveQueries: async (): Promise<void> => { | ||
| }, | ||
| subscribe: <TData, TQueryVariables>( | ||
| // eslint-disable-next-line max-len | ||
| subscribe: <TData extends { [key: string]: any }, TQueryVariables extends { [key: string]: any }>( | ||
| options: IMicroGraphQLSubscriptionOptions<TQueryVariables>, | ||
| subscription: (data: IMicroGraphQLResult<TData>) => void | ||
| ): (() => void) => { | ||
| const key = hash({ query: options.query, variables: options.variables }); | ||
| const query = cache.prepareQuery(options.query); | ||
| if (!key) { | ||
| throw new MicroGraphQLKeyError(queryKeyError); | ||
| } | ||
| const cached = cache.tryGet<TData>(key); | ||
| const cached = cache.tryGet<TData>(query, options.variables); | ||
| if (cached.success) { | ||
@@ -99,2 +98,4 @@ subscription({ | ||
| const key = objectHash({ query, variables: options.variables }); | ||
| const subs = subscriptions.get(key) || []; | ||
@@ -112,12 +113,7 @@ subs.push(subscription); | ||
| }, | ||
| query: async <TData, TQueryVariables = unknown>( | ||
| query: string, | ||
| // eslint-disable-next-line max-len | ||
| query: async <TData extends { [key: string]: any }, TQueryVariables extends { [key: string]: any }>( | ||
| inputQuery: string, | ||
| options?: IMicroGraphQLQueryOptions<TQueryVariables> | ||
| ): Promise<IMicroGraphQLResult<TData>> => { | ||
| const key = hash({ query, variables: options && options.variables }); | ||
| if (!key) { | ||
| throw new MicroGraphQLKeyError(queryKeyError); | ||
| } | ||
| const { skipCache }: IMicroGraphQLQueryOptions<TQueryVariables> = { | ||
@@ -128,11 +124,16 @@ skipCache: false, | ||
| const cachedResult = !skipCache && cache.tryGet<TData>(key); | ||
| const query = cache.prepareQuery(inputQuery); | ||
| if (!skipCache) { | ||
| const cachedResult = !skipCache && cache.tryGet<TData>(query, options && options.variables); | ||
| if (!skipCache && cachedResult && cachedResult.success) { | ||
| return { | ||
| loading: false, | ||
| data: cachedResult.data | ||
| }; | ||
| if (cachedResult.success) { | ||
| return { | ||
| loading: false, | ||
| data: cachedResult.data | ||
| }; | ||
| } | ||
| } | ||
| const key = objectHash({ query, variables: options && options.variables }); | ||
| const subs = subscriptions.get(key); | ||
@@ -161,3 +162,3 @@ | ||
| if (json.data) { | ||
| cache.trySet<TData>(key, json.data); | ||
| cache.trySet<TData>(query, options && options.variables, json.data); | ||
| } | ||
@@ -164,0 +165,0 @@ |
+1
-5
@@ -14,7 +14,3 @@ export function sortObjectKeys<T extends { [key: string]: unknown }>(object: T): T { | ||
| export function objectHash(obj?: null | { [key: string]: unknown }): string | null { | ||
| if (!obj) { | ||
| return null; | ||
| } | ||
| export function objectHash(obj: { [key: string]: unknown }): string { | ||
| const sorted: unknown = sortObjectKeys(obj); | ||
@@ -21,0 +17,0 @@ const json = JSON.stringify(sorted); |
+0
-1
| export * from './client'; | ||
| export * from './cache'; | ||
| export * from './gql'; | ||
| export * from './hash'; |
+29
-7
| /* eslint-disable import/extensions */ | ||
| import { createCache, IMicroGraphQLCache } from '../src'; | ||
| import { | ||
| createCache, | ||
| IMicroGraphQLCache, | ||
| gql, | ||
| frag | ||
| } from '../src'; | ||
| const fragment = frag` | ||
| fragment TestFrag on Film { | ||
| title | ||
| } | ||
| `; | ||
| const query = gql` | ||
| query TestQuery($id: ID) { | ||
| film(filmID: $id) { | ||
| id | ||
| ${fragment} | ||
| } | ||
| } | ||
| `; | ||
| const variables = { id: 'abc' }; | ||
| describe('cache', () => { | ||
@@ -12,3 +34,3 @@ let cache: IMicroGraphQLCache; | ||
| it('returns success as false and undefined data for unset key', () => { | ||
| const cached = cache.tryGet('unknown'); | ||
| const cached = cache.tryGet(query, variables); | ||
| expect(cached).toBeTruthy(); | ||
@@ -22,4 +44,4 @@ expect(cached.success).toBe(false); | ||
| cache.trySet('key', data); | ||
| const cached = cache.tryGet('key'); | ||
| cache.trySet(query, variables, data); | ||
| const cached = cache.tryGet(query, variables); | ||
| expect(cached).toBeTruthy(); | ||
@@ -33,3 +55,3 @@ expect(cached.success).toBe(true); | ||
| cache.trySet('key', data); | ||
| cache.trySet(query, variables, data); | ||
| const stringified = cache.stringify(); | ||
@@ -40,3 +62,3 @@ | ||
| const cached = cache.tryGet('key'); | ||
| const cached = cache.tryGet(query, variables); | ||
| expect(cached).toBeTruthy(); | ||
@@ -46,3 +68,3 @@ expect(cached.success).toBe(true); | ||
| const restoredCached = cache.tryGet('key'); | ||
| const restoredCached = cache.tryGet(query, variables); | ||
| expect(restoredCached).toBeTruthy(); | ||
@@ -49,0 +71,0 @@ expect(restoredCached.success).toBe(true); |
+69
-45
@@ -8,5 +8,4 @@ /* eslint-disable import/no-extraneous-dependencies */ | ||
| IMicroGraphQLResult, | ||
| objectHash, | ||
| queryKeyError, | ||
| IMicroGraphQLCacheResult | ||
| IMicroGraphQLCacheResult, | ||
| IMicroGraphQLConfig | ||
| } from '../src'; | ||
@@ -38,4 +37,3 @@ | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| let options: any; | ||
| let options: IMicroGraphQLConfig; | ||
| beforeEach(() => { | ||
@@ -49,3 +47,2 @@ global.fetch.resetMocks(); | ||
| fetch: global.fetch, | ||
| hash: objectHash, | ||
| url: 'https://swapi-graphql.netlify.com/.netlify/functions/index', | ||
@@ -56,16 +53,52 @@ cache: createCache() | ||
| it('throws if fails to hash query', async () => { | ||
| it('can return cached result with prepare query', async () => { | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| const cached: any = {}; | ||
| const client = createClient({ | ||
| ...options, | ||
| hash: () => null | ||
| cache: { | ||
| tryGet: <TValue>(): IMicroGraphQLCacheResult<TValue> => ({ | ||
| success: true, | ||
| data: cached | ||
| }), | ||
| trySet: (): boolean => false, | ||
| restore: jest.fn(), | ||
| stringify: jest.fn(), | ||
| prepareQuery: (q: string): string => q | ||
| } | ||
| }); | ||
| try { | ||
| await client.query<IQueryResult, unknown>(query, { variables }); | ||
| expect(false).toBe(true); | ||
| } catch (err) { | ||
| expect(err.message).toEqual(queryKeyError); | ||
| } | ||
| const result = await client.query<IQueryResult, {}>(query, { | ||
| variables | ||
| }); | ||
| expect(result).toBeTruthy(); | ||
| expect(result.data).toBe(cached); | ||
| }); | ||
| it('can skip cached result with prepare query', async () => { | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| const cached: any = {}; | ||
| const client = createClient({ | ||
| ...options, | ||
| cache: { | ||
| tryGet: <TValue>(): IMicroGraphQLCacheResult<TValue> => ({ | ||
| success: true, | ||
| data: cached | ||
| }), | ||
| trySet: (): boolean => false, | ||
| restore: jest.fn(), | ||
| stringify: jest.fn(), | ||
| prepareQuery: (q: string): string => q | ||
| } | ||
| }); | ||
| const result = await client.query<IQueryResult, {}>(query, { | ||
| variables, | ||
| skipCache: true | ||
| }); | ||
| expect(result).toBeTruthy(); | ||
| }); | ||
| it('can return cached result', async () => { | ||
@@ -84,7 +117,8 @@ // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| restore: jest.fn(), | ||
| stringify: jest.fn() | ||
| stringify: jest.fn(), | ||
| prepareQuery: (q: string): string => q | ||
| } | ||
| }); | ||
| const result = await client.query<IQueryResult, unknown>(query, { | ||
| const result = await client.query<IQueryResult, {}>(query, { | ||
| variables | ||
@@ -100,2 +134,3 @@ }); | ||
| let prepared = false; | ||
| const client = createClient({ | ||
@@ -110,3 +145,7 @@ ...options, | ||
| restore: jest.fn(), | ||
| stringify: jest.fn() | ||
| stringify: jest.fn(), | ||
| prepareQuery: (q: string): string => { | ||
| prepared = true; | ||
| return q; | ||
| } | ||
| } | ||
@@ -117,3 +156,3 @@ }); | ||
| let result: any; | ||
| client.subscribe<IQueryResult, unknown>({ | ||
| client.subscribe<IQueryResult, {}>({ | ||
| query, | ||
@@ -126,2 +165,3 @@ variables | ||
| expect(result.data).toBe(cached); | ||
| expect(prepared).toBe(true); | ||
| }); | ||
@@ -136,7 +176,7 @@ | ||
| const result = await client.query<IQueryResult, unknown>(query, { | ||
| const result = await client.query<IQueryResult, {}>(query, { | ||
| variables | ||
| }); | ||
| expect(result.data).toBeUndefined(); | ||
| expect(client.cache!.tryGet(client.hash({ query, variables }) as string).success).toBe(false); | ||
| expect(client.cache!.tryGet(query, variables).success).toBe(false); | ||
| }); | ||
@@ -147,3 +187,3 @@ | ||
| const result = await client.query<IQueryResult, unknown>(query, { | ||
| const result = await client.query<IQueryResult, {}>(query, { | ||
| variables | ||
@@ -157,3 +197,3 @@ }); | ||
| const result = client.query<IQueryResult, unknown>(query, { | ||
| const result = client.query<IQueryResult, {}>(query, { | ||
| variables | ||
@@ -173,3 +213,3 @@ }); | ||
| const result = await client.query<IQueryResult, unknown>(query, { | ||
| const result = await client.query<IQueryResult, {}>(query, { | ||
| variables | ||
@@ -179,3 +219,3 @@ }); | ||
| const secondResult = await client.query<IQueryResult, unknown>(query, { | ||
| const secondResult = await client.query<IQueryResult, {}>(query, { | ||
| variables | ||
@@ -192,3 +232,3 @@ }); | ||
| const result = await client.query<IQueryResult, unknown>(query, { | ||
| const result = await client.query<IQueryResult, {}>(query, { | ||
| variables | ||
@@ -198,3 +238,3 @@ }); | ||
| const secondResult = await client.query<IQueryResult, unknown>(query, { | ||
| const secondResult = await client.query<IQueryResult, {}>(query, { | ||
| skipCache: true, | ||
@@ -207,18 +247,2 @@ variables | ||
| it('throws if fails to hash query on subscription', async () => { | ||
| const client = createClient({ | ||
| ...options, | ||
| hash: () => null | ||
| }); | ||
| try { | ||
| client.subscribe({ query, variables }, () => { | ||
| expect(false).toBe(true); | ||
| }); | ||
| expect(false).toBe(true); | ||
| } catch (err) { | ||
| expect(err.message).toEqual(queryKeyError); | ||
| } | ||
| }); | ||
| it('can receive subscription value', async () => { | ||
@@ -232,3 +256,3 @@ const client = createClient({ | ||
| let dataFromSubscription: IMicroGraphQLResult<IQueryResult>; | ||
| const unsubscribe = client.subscribe<IQueryResult, unknown>( | ||
| const unsubscribe = client.subscribe<IQueryResult, {}>( | ||
| { query, variables }, | ||
@@ -241,3 +265,3 @@ data => { | ||
| const result = await client.query<IQueryResult, unknown>(query, { | ||
| const result = await client.query<IQueryResult, {}>(query, { | ||
| variables | ||
@@ -250,3 +274,3 @@ }); | ||
| const secondResult = await client.query<IQueryResult, unknown>(query, { | ||
| const secondResult = await client.query<IQueryResult, {}>(query, { | ||
| skipCache: true, | ||
@@ -253,0 +277,0 @@ variables |
| /* eslint-disable import/extensions */ | ||
| import { objectHash, sortObjectKeys } from '../src'; | ||
| import { objectHash, sortObjectKeys } from '../src/hash'; | ||
@@ -18,7 +18,2 @@ describe('hash', () => { | ||
| describe('objectHash', () => { | ||
| it('returns null for falsey input', () => { | ||
| expect(objectHash(null)).toBeNull(); | ||
| expect(objectHash(undefined)).toBeNull(); | ||
| }); | ||
| it('hashes object reliably', () => { | ||
@@ -25,0 +20,0 @@ const input = { |
Sorry, the diff of this file is not supported yet
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
184459
1.58%931
8.26%