quetch 0.1.0

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.
Files changed (125) hide show
  1. package/README.md +29 -0
  2. package/dist/errors/QueryError.d.ts +5 -0
  3. package/dist/errors/QueryError.js +23 -0
  4. package/dist/errors/QueryError.js.map +1 -0
  5. package/dist/errors/RequestError.d.ts +11 -0
  6. package/dist/errors/RequestError.js +33 -0
  7. package/dist/errors/RequestError.js.map +1 -0
  8. package/dist/errors.d.ts +1 -0
  9. package/dist/errors.js +3 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/main.d.ts +3 -0
  12. package/dist/main.js +3 -0
  13. package/dist/main.js.map +1 -0
  14. package/dist/middlewares/aggregate.d.ts +19 -0
  15. package/dist/middlewares/aggregate.js +86 -0
  16. package/dist/middlewares/aggregate.js.map +1 -0
  17. package/dist/middlewares/branch.d.ts +18 -0
  18. package/dist/middlewares/branch.js +21 -0
  19. package/dist/middlewares/branch.js.map +1 -0
  20. package/dist/middlewares/cache.d.ts +37 -0
  21. package/dist/middlewares/cache.js +40 -0
  22. package/dist/middlewares/cache.js.map +1 -0
  23. package/dist/middlewares/combine.d.ts +318 -0
  24. package/dist/middlewares/combine.js +20 -0
  25. package/dist/middlewares/combine.js.map +1 -0
  26. package/dist/middlewares/concurrent.d.ts +2 -0
  27. package/dist/middlewares/concurrent.js +20 -0
  28. package/dist/middlewares/concurrent.js.map +1 -0
  29. package/dist/middlewares/fetch.d.ts +2 -0
  30. package/dist/middlewares/fetch.js +20 -0
  31. package/dist/middlewares/fetch.js.map +1 -0
  32. package/dist/middlewares/fetchExternal.d.ts +8 -0
  33. package/dist/middlewares/fetchExternal.js +29 -0
  34. package/dist/middlewares/fetchExternal.js.map +1 -0
  35. package/dist/middlewares/fetchLocal.d.ts +9 -0
  36. package/dist/middlewares/fetchLocal.js +10 -0
  37. package/dist/middlewares/fetchLocal.js.map +1 -0
  38. package/dist/middlewares/identity.d.ts +4 -0
  39. package/dist/middlewares/identity.js +8 -0
  40. package/dist/middlewares/identity.js.map +1 -0
  41. package/dist/middlewares/log.d.ts +8 -0
  42. package/dist/middlewares/log.js +30 -0
  43. package/dist/middlewares/log.js.map +1 -0
  44. package/dist/middlewares/logQuery.d.ts +2 -0
  45. package/dist/middlewares/logQuery.js +25 -0
  46. package/dist/middlewares/logQuery.js.map +1 -0
  47. package/dist/middlewares/retry.d.ts +14 -0
  48. package/dist/middlewares/retry.js +38 -0
  49. package/dist/middlewares/retry.js.map +1 -0
  50. package/dist/middlewares.d.ts +9 -0
  51. package/dist/middlewares.js +11 -0
  52. package/dist/middlewares.js.map +1 -0
  53. package/dist/tools/add.d.ts +8 -0
  54. package/dist/tools/add.js +11 -0
  55. package/dist/tools/add.js.map +1 -0
  56. package/dist/tools/add.test.d.ts +1 -0
  57. package/dist/tools/add.test.js +6 -0
  58. package/dist/tools/add.test.js.map +1 -0
  59. package/dist/tools/defineCheckQuery.d.ts +17 -0
  60. package/dist/tools/defineCheckQuery.js +7 -0
  61. package/dist/tools/defineCheckQuery.js.map +1 -0
  62. package/dist/tools/defineCustomFetch.d.ts +19 -0
  63. package/dist/tools/defineCustomFetch.js +8 -0
  64. package/dist/tools/defineCustomFetch.js.map +1 -0
  65. package/dist/tools/filterFromContext.d.ts +2 -0
  66. package/dist/tools/filterFromContext.js +12 -0
  67. package/dist/tools/filterFromContext.js.map +1 -0
  68. package/dist/tools/filterItem.d.ts +9 -0
  69. package/dist/tools/filterItem.js +101 -0
  70. package/dist/tools/filterItem.js.map +1 -0
  71. package/dist/tools/filterItem.test.d.ts +1 -0
  72. package/dist/tools/filterItem.test.js +86 -0
  73. package/dist/tools/filterItem.test.js.map +1 -0
  74. package/dist/tools/impasse.d.ts +2 -0
  75. package/dist/tools/impasse.js +2 -0
  76. package/dist/tools/impasse.js.map +1 -0
  77. package/dist/tools/normalizeOrder.d.ts +5 -0
  78. package/dist/tools/normalizeOrder.js +10 -0
  79. package/dist/tools/normalizeOrder.js.map +1 -0
  80. package/dist/tools/queryItemList.d.ts +4 -0
  81. package/dist/tools/queryItemList.js +77 -0
  82. package/dist/tools/queryItemList.js.map +1 -0
  83. package/dist/tools/queryItemList.test.d.ts +1 -0
  84. package/dist/tools/queryItemList.test.js +141 -0
  85. package/dist/tools/queryItemList.test.js.map +1 -0
  86. package/dist/tools/sortItemList.d.ts +9 -0
  87. package/dist/tools/sortItemList.js +28 -0
  88. package/dist/tools/sortItemList.js.map +1 -0
  89. package/dist/tools/sortItemList.test.d.ts +1 -0
  90. package/dist/tools/sortItemList.test.js +47 -0
  91. package/dist/tools/sortItemList.test.js.map +1 -0
  92. package/dist/tools.d.ts +8 -0
  93. package/dist/tools.js +10 -0
  94. package/dist/tools.js.map +1 -0
  95. package/dist/types.d.ts +396 -0
  96. package/dist/types.js +2 -0
  97. package/dist/types.js.map +1 -0
  98. package/doc/README.md +1472 -0
  99. package/lib/errors/RequestError.ts +16 -0
  100. package/lib/errors.ts +2 -0
  101. package/lib/main.ts +4 -0
  102. package/lib/middlewares/aggregate.ts +113 -0
  103. package/lib/middlewares/branch.ts +27 -0
  104. package/lib/middlewares/cache.ts +89 -0
  105. package/lib/middlewares/combine.ts +959 -0
  106. package/lib/middlewares/fetchExternal.ts +38 -0
  107. package/lib/middlewares/fetchLocal.ts +14 -0
  108. package/lib/middlewares/identity.ts +20 -0
  109. package/lib/middlewares/log.ts +31 -0
  110. package/lib/middlewares/retry.ts +45 -0
  111. package/lib/middlewares.ts +10 -0
  112. package/lib/tools/defineCheckQuery.ts +24 -0
  113. package/lib/tools/defineCustomFetch.ts +70 -0
  114. package/lib/tools/filterFromContext.ts +16 -0
  115. package/lib/tools/filterItem.test.ts +203 -0
  116. package/lib/tools/filterItem.ts +113 -0
  117. package/lib/tools/impasse.ts +3 -0
  118. package/lib/tools/normalizeOrder.ts +13 -0
  119. package/lib/tools/queryItemList.test.ts +169 -0
  120. package/lib/tools/queryItemList.ts +108 -0
  121. package/lib/tools/sortItemList.test.ts +63 -0
  122. package/lib/tools/sortItemList.ts +33 -0
  123. package/lib/tools.ts +9 -0
  124. package/lib/types.ts +554 -0
  125. package/package.json +72 -0
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Quetch
2
+
3
+ 🍋 Simple abstraction layer over any API.
4
+
5
+ ### Features
6
+
7
+ - Provides a common query object format
8
+ - Separates data requests from API configuration
9
+ - Provides error handlers
10
+
11
+ ## Usage
12
+
13
+ Everything is exported from the main entry-point through an ES6 module:
14
+
15
+ ```js
16
+ import { add } from "quetch";
17
+ ```
18
+
19
+ ## Installation
20
+
21
+ Install with the [Node Package Manager](https://www.npmjs.com/package/quetch):
22
+
23
+ ```bash
24
+ npm install quetch
25
+ ```
26
+
27
+ ## Documentation
28
+
29
+ Documentation is generated [here](doc/README.md).
@@ -0,0 +1,5 @@
1
+ export declare class QueryError extends Error {
2
+ status: number;
3
+ response: Object;
4
+ constructor(message: string, status: number, response: Object);
5
+ }
@@ -0,0 +1,23 @@
1
+ export class QueryError extends Error {
2
+ /*
3
+ Error to be thrown in case there is an issue with the query call. Only instances of this error will be caught by the `retry()` middleware.
4
+ */
5
+ constructor(message, status, response) {
6
+ super(message);
7
+ Object.defineProperty(this, "status", {
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true,
11
+ value: void 0
12
+ });
13
+ Object.defineProperty(this, "response", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: void 0
18
+ });
19
+ this.status = status;
20
+ this.response = response;
21
+ }
22
+ }
23
+ //# sourceMappingURL=QueryError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryError.js","sourceRoot":"","sources":["../../lib/errors/QueryError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAInC;;MAEE;IACF,YAAY,OAAe,EAAE,MAAc,EAAE,QAAgB;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAA;QAPhB;;;;;WAAc;QACd;;;;;WAAgB;QAOd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { AnyQuery } from "../types";
2
+ /**
3
+ * Error to be thrown in case there is an issue with the query call. Only instances of this error will be caught by the `retry()` middleware.
4
+ */
5
+ export declare class RequestError extends Error {
6
+ status: number;
7
+ query?: AnyQuery | undefined;
8
+ request?: Request | undefined;
9
+ response?: Response | undefined;
10
+ constructor(message: string, status: number, query?: AnyQuery | undefined, request?: Request | undefined, response?: Response | undefined);
11
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Error to be thrown in case there is an issue with the query call. Only instances of this error will be caught by the `retry()` middleware.
3
+ */
4
+ export class RequestError extends Error {
5
+ constructor(message, status, query, request, response) {
6
+ super(message);
7
+ Object.defineProperty(this, "status", {
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true,
11
+ value: status
12
+ });
13
+ Object.defineProperty(this, "query", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: query
18
+ });
19
+ Object.defineProperty(this, "request", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: request
24
+ });
25
+ Object.defineProperty(this, "response", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: response
30
+ });
31
+ }
32
+ }
33
+ //# sourceMappingURL=RequestError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestError.js","sourceRoot":"","sources":["../../lib/errors/RequestError.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YACE,OAAe,EACR,MAAc,EACd,KAAgB,EAChB,OAAiB,EACjB,QAAmB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QALf;;;;mBAAO,MAAM;WAAQ;QACrB;;;;mBAAO,KAAK;WAAW;QACvB;;;;mBAAO,OAAO;WAAU;QACxB;;;;mBAAO,QAAQ;WAAW;IAG5B,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export { RequestError } from "./errors/RequestError";
package/dist/errors.js ADDED
@@ -0,0 +1,3 @@
1
+ // File automatically generated by `vite-plugin-module-list`
2
+ export { RequestError } from "./errors/RequestError";
3
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export type * from "./types";
2
+ export * from "./tools";
3
+ export * from "./middlewares";
package/dist/main.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./tools";
2
+ export * from "./middlewares";
3
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../lib/main.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { AnyQuery, Handler } from "../types";
2
+ /**
3
+ * Aggregates multiple incoming query calls into one query.
4
+ * Queries are grouped according to the string key returned by `queryGroupId(query)`. Inside a group, each query is identified with `queryId(query)`.
5
+ * The aggregated query is built from the object returned by `queryForGroup(queryList, groupId)`, after at least `delay` milliseconds after the first non-aggregated aggregatable query call.
6
+ * When the aggregated query resolves, the result is dispatched back to each aggregatable query call of the category by dispatching the result for each query returned by `resultForQuery(result, query)`.
7
+ * If a query occurs twice, `mergeQuery(query, currentQuery)` is called and the output replaces the previous query.
8
+ *
9
+ * @param options
10
+ * @returns
11
+ */
12
+ export declare function aggregate<I extends AnyQuery, O, In extends AnyQuery, On>({ queryGroupId, queryId, mergeQuery, delay, queryForGroup, resultForQuery, }: {
13
+ queryGroupId?: (query: I) => string | undefined;
14
+ queryId?: (query: I) => string | undefined;
15
+ mergeQuery?: (query: I, currentQuery: I) => I;
16
+ delay?: number;
17
+ queryForGroup: (queryList: I[], group: string) => AnyQuery;
18
+ resultForQuery: (resultList: O[], query: I) => O | never;
19
+ }): Handler<I, O, In, On>;
@@ -0,0 +1,86 @@
1
+ import { sleep } from "futurise";
2
+ import { RequestError } from "../errors";
3
+ /**
4
+ * Aggregates multiple incoming query calls into one query.
5
+ * Queries are grouped according to the string key returned by `queryGroupId(query)`. Inside a group, each query is identified with `queryId(query)`.
6
+ * The aggregated query is built from the object returned by `queryForGroup(queryList, groupId)`, after at least `delay` milliseconds after the first non-aggregated aggregatable query call.
7
+ * When the aggregated query resolves, the result is dispatched back to each aggregatable query call of the category by dispatching the result for each query returned by `resultForQuery(result, query)`.
8
+ * If a query occurs twice, `mergeQuery(query, currentQuery)` is called and the output replaces the previous query.
9
+ *
10
+ * @param options
11
+ * @returns
12
+ */
13
+ export function aggregate({ queryGroupId = ({ type, method = "get" }) => {
14
+ if (method !== "get") {
15
+ return undefined;
16
+ }
17
+ if (typeof type !== "string") {
18
+ return undefined;
19
+ }
20
+ return type;
21
+ }, queryId = ({ context = {} }) => {
22
+ if (context.id === undefined) {
23
+ return undefined;
24
+ }
25
+ return `${context.id}`;
26
+ }, mergeQuery = (query, _currentQuery) => query, delay = 200, queryForGroup = (queryList, _) => ({
27
+ type: queryList[0].type,
28
+ method: "get",
29
+ multiple: true,
30
+ filter: {
31
+ operator: "include",
32
+ field: "id",
33
+ value: queryList.map((query) => query.context.id),
34
+ },
35
+ }), resultForQuery = (resultList, query) => {
36
+ const result = resultList.find((result) => result.id === query.context.id);
37
+ if (result === undefined) {
38
+ throw new RequestError("Not found", 404, query);
39
+ }
40
+ return result;
41
+ }, }) {
42
+ const queryGroupMap = new Map();
43
+ return ((query, next) => {
44
+ const groupId = queryGroupId(query);
45
+ if (!groupId) {
46
+ return next(query);
47
+ }
48
+ const id = queryId(query);
49
+ if (!id) {
50
+ return next(query);
51
+ }
52
+ if (!queryGroupMap.has(groupId)) {
53
+ const queryMap = new Map();
54
+ queryGroupMap.set(groupId, {
55
+ groupRequest: (async () => {
56
+ await sleep(delay);
57
+ queryGroupMap.delete(groupId);
58
+ return queryMap.size === 1
59
+ ? next(queryMap.values().next().value)
60
+ : next(queryForGroup([...queryMap.values()], groupId));
61
+ })(),
62
+ requestMap: new Map(),
63
+ queryMap,
64
+ });
65
+ }
66
+ const { groupRequest, requestMap, queryMap } = queryGroupMap.get(groupId);
67
+ if (requestMap.has(id)) {
68
+ const currentQuery = queryMap.get(id);
69
+ const mergedQuery = mergeQuery(query, currentQuery);
70
+ if (mergedQuery !== currentQuery) {
71
+ queryMap.set(id, mergedQuery);
72
+ }
73
+ return requestMap.get(id);
74
+ }
75
+ queryMap.set(id, query);
76
+ const request = (async () => {
77
+ const result = await groupRequest;
78
+ return queryMap.size === 1
79
+ ? result
80
+ : resultForQuery(result, query);
81
+ })();
82
+ requestMap.set(id, request);
83
+ return request;
84
+ });
85
+ }
86
+ //# sourceMappingURL=aggregate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../lib/middlewares/aggregate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Handler } from "../types";
2
+ /**
3
+ * Dispatches an incoming query to `left` if `condition(query)` returns a truthy value, `right` otherwise. This is helpful for sending queries to different resolvers.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * const customFetch = combine(
8
+ * branch(query => query.protocol === 'gql', gqlHandlers),
9
+ * restHandlers,
10
+ * )
11
+ * ```
12
+ *
13
+ * @param condition
14
+ * @param left
15
+ * @param right
16
+ * @returns
17
+ */
18
+ export declare function branch<I, O, In, On>(condition: (input: I) => boolean, left: Handler<I, O, In, On>, right?: Handler<I, O, In, On>): Handler<I, O, In, On>;
@@ -0,0 +1,21 @@
1
+ import { identity } from "./identity";
2
+ /**
3
+ * Dispatches an incoming query to `left` if `condition(query)` returns a truthy value, `right` otherwise. This is helpful for sending queries to different resolvers.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * const customFetch = combine(
8
+ * branch(query => query.protocol === 'gql', gqlHandlers),
9
+ * restHandlers,
10
+ * )
11
+ * ```
12
+ *
13
+ * @param condition
14
+ * @param left
15
+ * @param right
16
+ * @returns
17
+ */
18
+ export function branch(condition, left, right = identity) {
19
+ return (input, next) => (condition(input) ? left : right)(input, next);
20
+ }
21
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../lib/middlewares/branch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,MAAM,CACpB,SAAgC,EAChC,IAA2B,EAC3B,QAA+B,QAAiC;IAEhE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { AnyQueryExternal, Handler, Store } from "../types";
2
+ type CachedItem<I extends AnyQueryExternal> = {
3
+ query: I;
4
+ value: any;
5
+ };
6
+ type CacheOptions<I extends AnyQueryExternal> = {
7
+ /**
8
+ * Unique identifier for the item to cache.
9
+ * Returns `undefined` if the item should not be cached.
10
+ */
11
+ itemId?: (query: I) => string | undefined;
12
+ /**
13
+ * Cache store.
14
+ */
15
+ store: Store<CachedItem<I>>;
16
+ /**
17
+ * Returns `true` if the cached item must be invalidated.
18
+ */
19
+ invalidatesItem: (query: I, cachedQuery: I, cachedValue: any) => boolean;
20
+ /**
21
+ * Returns a query that completes the cached value.
22
+ * Returns `undefined` if the query should not be completed.
23
+ */
24
+ extendCachedQuery: (query: I, cachedQuery: I) => I | undefined;
25
+ /**
26
+ * Merges the extended query with the cached query.
27
+ * Only called when `extendCachedQuery` returns a query.
28
+ */
29
+ mergeQuery: (extendedQuery: I, cachedQuery: I) => I;
30
+ /**
31
+ * Merges the value from the extended query with the cached value.
32
+ * Only called when `extendCachedQuery` returns a query.
33
+ */
34
+ mergeItem: (value: any, cachedValue: any, query: I, cachedQuery: I) => any;
35
+ };
36
+ export declare function cache<I extends AnyQueryExternal, O, In extends AnyQueryExternal, On>({ itemId, store, invalidatesItem, extendCachedQuery, mergeQuery, mergeItem, }: CacheOptions<I>): Handler<I, O, In, On>;
37
+ export {};
@@ -0,0 +1,40 @@
1
+ export function cache({ itemId = ({ context = {}, method = "get", type }) => {
2
+ if (method === "get" && context.id) {
3
+ return `${type}/${context.id}`;
4
+ }
5
+ return undefined;
6
+ }, store, invalidatesItem, extendCachedQuery, mergeQuery, mergeItem, }) {
7
+ /*
8
+ Caches the result of a query if `serialize` returns a non-empty string key. The `engine` should follow the `Map` API. Elements are kept in the cache until the `duration` in milliseconds expires.
9
+ Note that a `duration` set to `Infinity` indefinitely keeps items in the cache.
10
+ */
11
+ return async (query, next) => {
12
+ const id = itemId(query);
13
+ if (!id) {
14
+ return next(query);
15
+ }
16
+ if (await store.has(id)) {
17
+ const { query: cachedQuery, value: cachedValue } = await store.get(id);
18
+ if (invalidatesItem(query, cachedQuery, cachedValue)) {
19
+ const value = await next(query);
20
+ store.set(id, { query, value });
21
+ return value;
22
+ }
23
+ const extendedQuery = extendCachedQuery(query, cachedQuery);
24
+ if (extendedQuery === undefined) {
25
+ return cachedValue;
26
+ }
27
+ const value = await next(extendedQuery);
28
+ const extendedValue = mergeItem(value, cachedValue, query, cachedQuery);
29
+ store.set(id, {
30
+ query: mergeQuery(extendedQuery, cachedQuery),
31
+ value: extendedValue,
32
+ });
33
+ return extendedValue;
34
+ }
35
+ const value = await next(query);
36
+ store.set(id, { query, value });
37
+ return value;
38
+ };
39
+ }
40
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../lib/middlewares/cache.ts"],"names":[],"mappings":"AAsCA,MAAM,UAAU,KAAK,CAKnB,EACA,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAK,EAAE,EAAE;IACrD,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,EAAE,EAAE;QAClC,OAAO,GAAG,IAAI,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;KAChC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,EACD,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,SAAS,GACO;IAChB;;;MAGE;IACF,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,EAAE,EAAE;YACP,OAAO,IAAI,CAAC,KAAsB,CAAC,CAAC;SACrC;QACD,IAAI,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACvB,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvE,IAAI,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE;gBACpD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAsB,CAAC,CAAC;gBACjD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChC,OAAO,KAAK,CAAC;aACd;YACD,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAC5D,IAAI,aAAa,KAAK,SAAS,EAAE;gBAC/B,OAAO,WAAW,CAAC;aACpB;YACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAA8B,CAAC,CAAC;YACzD,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACxE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE;gBACZ,KAAK,EAAE,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC;gBAC7C,KAAK,EAAE,aAAa;aACrB,CAAC,CAAC;YACH,OAAO,aAAa,CAAC;SACtB;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAsB,CAAC,CAAC;QACjD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}