@fgrzl/fetch 1.1.0-alpha.3 → 1.1.0-alpha.7

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 (231) hide show
  1. package/README.md +15 -12
  2. package/dist/cjs/client/fetch-client.d.ts +189 -0
  3. package/dist/cjs/client/fetch-client.d.ts.map +1 -0
  4. package/dist/cjs/client/fetch-client.js +339 -0
  5. package/dist/cjs/client/fetch-client.js.map +1 -0
  6. package/dist/cjs/client/index.d.ts +11 -0
  7. package/dist/cjs/client/index.d.ts.map +1 -0
  8. package/dist/cjs/client/index.js +14 -0
  9. package/dist/cjs/client/index.js.map +1 -0
  10. package/dist/cjs/client/types.d.ts +63 -0
  11. package/dist/cjs/client/types.d.ts.map +1 -0
  12. package/dist/cjs/client/types.js +9 -0
  13. package/dist/cjs/client/types.js.map +1 -0
  14. package/dist/{errors.d.ts → cjs/errors/index.d.ts} +20 -3
  15. package/dist/cjs/errors/index.d.ts.map +1 -0
  16. package/dist/{errors.js → cjs/errors/index.js} +23 -3
  17. package/dist/cjs/errors/index.js.map +1 -0
  18. package/dist/cjs/index.d.ts +65 -0
  19. package/dist/cjs/index.d.ts.map +1 -0
  20. package/dist/cjs/index.js +118 -0
  21. package/dist/cjs/index.js.map +1 -0
  22. package/dist/cjs/middleware/authentication/authentication.d.ts +31 -0
  23. package/dist/cjs/middleware/authentication/authentication.d.ts.map +1 -0
  24. package/dist/cjs/middleware/authentication/authentication.js +93 -0
  25. package/dist/cjs/middleware/authentication/authentication.js.map +1 -0
  26. package/dist/cjs/middleware/authentication/index.d.ts +37 -0
  27. package/dist/cjs/middleware/authentication/index.d.ts.map +1 -0
  28. package/dist/cjs/middleware/authentication/index.js +42 -0
  29. package/dist/cjs/middleware/authentication/index.js.map +1 -0
  30. package/dist/cjs/middleware/authentication/types.d.ts +73 -0
  31. package/dist/cjs/middleware/authentication/types.d.ts.map +1 -0
  32. package/dist/cjs/middleware/authentication/types.js +6 -0
  33. package/dist/cjs/middleware/authentication/types.js.map +1 -0
  34. package/dist/cjs/middleware/authorization/authorization.d.ts +30 -0
  35. package/dist/cjs/middleware/authorization/authorization.d.ts.map +1 -0
  36. package/dist/cjs/middleware/authorization/authorization.js +82 -0
  37. package/dist/cjs/middleware/authorization/authorization.js.map +1 -0
  38. package/dist/cjs/middleware/authorization/index.d.ts +36 -0
  39. package/dist/cjs/middleware/authorization/index.d.ts.map +1 -0
  40. package/dist/cjs/middleware/authorization/index.js +41 -0
  41. package/dist/cjs/middleware/authorization/index.js.map +1 -0
  42. package/dist/cjs/middleware/authorization/types.d.ts +67 -0
  43. package/dist/cjs/middleware/authorization/types.d.ts.map +1 -0
  44. package/dist/cjs/middleware/authorization/types.js +6 -0
  45. package/dist/cjs/middleware/authorization/types.js.map +1 -0
  46. package/dist/cjs/middleware/cache/cache.d.ts +41 -0
  47. package/dist/cjs/middleware/cache/cache.d.ts.map +1 -0
  48. package/dist/cjs/middleware/cache/cache.js +191 -0
  49. package/dist/cjs/middleware/cache/cache.js.map +1 -0
  50. package/dist/cjs/middleware/cache/index.d.ts +44 -0
  51. package/dist/cjs/middleware/cache/index.d.ts.map +1 -0
  52. package/dist/cjs/middleware/cache/index.js +50 -0
  53. package/dist/cjs/middleware/cache/index.js.map +1 -0
  54. package/dist/cjs/middleware/cache/types.d.ts +89 -0
  55. package/dist/cjs/middleware/cache/types.d.ts.map +1 -0
  56. package/dist/cjs/middleware/cache/types.js +6 -0
  57. package/dist/cjs/middleware/cache/types.js.map +1 -0
  58. package/dist/cjs/middleware/csrf/csrf.d.ts +34 -0
  59. package/dist/cjs/middleware/csrf/csrf.d.ts.map +1 -0
  60. package/dist/cjs/middleware/csrf/csrf.js +94 -0
  61. package/dist/cjs/middleware/csrf/csrf.js.map +1 -0
  62. package/dist/cjs/middleware/csrf/index.d.ts +57 -0
  63. package/dist/cjs/middleware/csrf/index.d.ts.map +1 -0
  64. package/dist/cjs/middleware/csrf/index.js +62 -0
  65. package/dist/cjs/middleware/csrf/index.js.map +1 -0
  66. package/dist/cjs/middleware/csrf/types.d.ts +57 -0
  67. package/dist/cjs/middleware/csrf/types.d.ts.map +1 -0
  68. package/dist/cjs/middleware/csrf/types.js +6 -0
  69. package/dist/cjs/middleware/csrf/types.js.map +1 -0
  70. package/dist/cjs/middleware/index.d.ts +115 -0
  71. package/dist/cjs/middleware/index.d.ts.map +1 -0
  72. package/dist/cjs/middleware/index.js +153 -0
  73. package/dist/cjs/middleware/index.js.map +1 -0
  74. package/dist/cjs/middleware/logging/index.d.ts +42 -0
  75. package/dist/cjs/middleware/logging/index.d.ts.map +1 -0
  76. package/dist/cjs/middleware/logging/index.js +47 -0
  77. package/dist/cjs/middleware/logging/index.js.map +1 -0
  78. package/dist/cjs/middleware/logging/logging.d.ts +29 -0
  79. package/dist/cjs/middleware/logging/logging.d.ts.map +1 -0
  80. package/dist/cjs/middleware/logging/logging.js +171 -0
  81. package/dist/cjs/middleware/logging/logging.js.map +1 -0
  82. package/dist/cjs/middleware/logging/types.d.ts +90 -0
  83. package/dist/cjs/middleware/logging/types.d.ts.map +1 -0
  84. package/dist/cjs/middleware/logging/types.js +6 -0
  85. package/dist/cjs/middleware/logging/types.js.map +1 -0
  86. package/dist/cjs/middleware/rate-limit/index.d.ts +16 -0
  87. package/dist/cjs/middleware/rate-limit/index.d.ts.map +1 -0
  88. package/dist/cjs/middleware/rate-limit/index.js +21 -0
  89. package/dist/cjs/middleware/rate-limit/index.js.map +1 -0
  90. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts +14 -0
  91. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts.map +1 -0
  92. package/dist/cjs/middleware/rate-limit/rate-limit.js +87 -0
  93. package/dist/cjs/middleware/rate-limit/rate-limit.js.map +1 -0
  94. package/dist/cjs/middleware/rate-limit/types.d.ts +97 -0
  95. package/dist/cjs/middleware/rate-limit/types.d.ts.map +1 -0
  96. package/dist/cjs/middleware/rate-limit/types.js +6 -0
  97. package/dist/cjs/middleware/rate-limit/types.js.map +1 -0
  98. package/dist/cjs/middleware/retry/index.d.ts +6 -0
  99. package/dist/cjs/middleware/retry/index.d.ts.map +1 -0
  100. package/dist/cjs/middleware/retry/index.js +11 -0
  101. package/dist/cjs/middleware/retry/index.js.map +1 -0
  102. package/dist/cjs/middleware/retry/retry.d.ts +39 -0
  103. package/dist/cjs/middleware/retry/retry.d.ts.map +1 -0
  104. package/dist/cjs/middleware/retry/retry.js +144 -0
  105. package/dist/cjs/middleware/retry/retry.js.map +1 -0
  106. package/dist/cjs/middleware/retry/types.d.ts +61 -0
  107. package/dist/cjs/middleware/retry/types.d.ts.map +1 -0
  108. package/dist/cjs/middleware/retry/types.js +6 -0
  109. package/dist/cjs/middleware/retry/types.js.map +1 -0
  110. package/dist/client/fetch-client.d.ts +189 -0
  111. package/dist/client/fetch-client.d.ts.map +1 -0
  112. package/dist/client/fetch-client.js +335 -0
  113. package/dist/client/fetch-client.js.map +1 -0
  114. package/dist/client/index.d.ts +11 -0
  115. package/dist/client/index.d.ts.map +1 -0
  116. package/dist/client/index.js +10 -0
  117. package/dist/client/index.js.map +1 -0
  118. package/dist/client/types.d.ts +63 -0
  119. package/dist/client/types.d.ts.map +1 -0
  120. package/dist/client/types.js +8 -0
  121. package/dist/client/types.js.map +1 -0
  122. package/dist/errors/index.d.ts +64 -0
  123. package/dist/errors/index.d.ts.map +1 -0
  124. package/dist/errors/index.js +73 -0
  125. package/dist/errors/index.js.map +1 -0
  126. package/dist/index.d.ts +49 -20
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +86 -42
  129. package/dist/index.js.map +1 -1
  130. package/dist/middleware/authentication/authentication.d.ts +31 -0
  131. package/dist/middleware/authentication/authentication.d.ts.map +1 -0
  132. package/dist/middleware/authentication/authentication.js +90 -0
  133. package/dist/middleware/authentication/authentication.js.map +1 -0
  134. package/dist/middleware/authentication/index.d.ts +37 -0
  135. package/dist/middleware/authentication/index.d.ts.map +1 -0
  136. package/dist/middleware/authentication/index.js +37 -0
  137. package/dist/middleware/authentication/index.js.map +1 -0
  138. package/dist/middleware/authentication/types.d.ts +73 -0
  139. package/dist/middleware/authentication/types.d.ts.map +1 -0
  140. package/dist/middleware/authentication/types.js +5 -0
  141. package/dist/middleware/authentication/types.js.map +1 -0
  142. package/dist/middleware/authorization/authorization.d.ts +30 -0
  143. package/dist/middleware/authorization/authorization.d.ts.map +1 -0
  144. package/dist/middleware/authorization/authorization.js +79 -0
  145. package/dist/middleware/authorization/authorization.js.map +1 -0
  146. package/dist/middleware/authorization/index.d.ts +36 -0
  147. package/dist/middleware/authorization/index.d.ts.map +1 -0
  148. package/dist/middleware/authorization/index.js +36 -0
  149. package/dist/middleware/authorization/index.js.map +1 -0
  150. package/dist/middleware/authorization/types.d.ts +67 -0
  151. package/dist/middleware/authorization/types.d.ts.map +1 -0
  152. package/dist/middleware/authorization/types.js +5 -0
  153. package/dist/middleware/authorization/types.js.map +1 -0
  154. package/dist/middleware/cache/cache.d.ts +41 -0
  155. package/dist/middleware/cache/cache.d.ts.map +1 -0
  156. package/dist/middleware/cache/cache.js +186 -0
  157. package/dist/middleware/cache/cache.js.map +1 -0
  158. package/dist/middleware/cache/index.d.ts +44 -0
  159. package/dist/middleware/cache/index.d.ts.map +1 -0
  160. package/dist/middleware/cache/index.js +44 -0
  161. package/dist/middleware/cache/index.js.map +1 -0
  162. package/dist/middleware/cache/types.d.ts +89 -0
  163. package/dist/middleware/cache/types.d.ts.map +1 -0
  164. package/dist/middleware/cache/types.js +5 -0
  165. package/dist/middleware/cache/types.js.map +1 -0
  166. package/dist/middleware/csrf/csrf.d.ts +34 -0
  167. package/dist/middleware/csrf/csrf.d.ts.map +1 -0
  168. package/dist/middleware/csrf/csrf.js +91 -0
  169. package/dist/middleware/csrf/csrf.js.map +1 -0
  170. package/dist/middleware/csrf/index.d.ts +57 -0
  171. package/dist/middleware/csrf/index.d.ts.map +1 -0
  172. package/dist/middleware/csrf/index.js +57 -0
  173. package/dist/middleware/csrf/index.js.map +1 -0
  174. package/dist/middleware/csrf/types.d.ts +57 -0
  175. package/dist/middleware/csrf/types.d.ts.map +1 -0
  176. package/dist/middleware/csrf/types.js +5 -0
  177. package/dist/middleware/csrf/types.js.map +1 -0
  178. package/dist/middleware/index.d.ts +115 -0
  179. package/dist/middleware/index.d.ts.map +1 -0
  180. package/dist/middleware/index.js +134 -0
  181. package/dist/middleware/index.js.map +1 -0
  182. package/dist/middleware/logging/index.d.ts +42 -0
  183. package/dist/middleware/logging/index.d.ts.map +1 -0
  184. package/dist/middleware/logging/index.js +42 -0
  185. package/dist/middleware/logging/index.js.map +1 -0
  186. package/dist/middleware/logging/logging.d.ts +29 -0
  187. package/dist/middleware/logging/logging.d.ts.map +1 -0
  188. package/dist/middleware/logging/logging.js +168 -0
  189. package/dist/middleware/logging/logging.js.map +1 -0
  190. package/dist/middleware/logging/types.d.ts +90 -0
  191. package/dist/middleware/logging/types.d.ts.map +1 -0
  192. package/dist/middleware/logging/types.js +5 -0
  193. package/dist/middleware/logging/types.js.map +1 -0
  194. package/dist/middleware/rate-limit/index.d.ts +16 -0
  195. package/dist/middleware/rate-limit/index.d.ts.map +1 -0
  196. package/dist/middleware/rate-limit/index.js +16 -0
  197. package/dist/middleware/rate-limit/index.js.map +1 -0
  198. package/dist/middleware/rate-limit/rate-limit.d.ts +14 -0
  199. package/dist/middleware/rate-limit/rate-limit.d.ts.map +1 -0
  200. package/dist/middleware/rate-limit/rate-limit.js +84 -0
  201. package/dist/middleware/rate-limit/rate-limit.js.map +1 -0
  202. package/dist/middleware/rate-limit/types.d.ts +97 -0
  203. package/dist/middleware/rate-limit/types.d.ts.map +1 -0
  204. package/dist/middleware/rate-limit/types.js +5 -0
  205. package/dist/middleware/rate-limit/types.js.map +1 -0
  206. package/dist/middleware/retry/index.d.ts +6 -0
  207. package/dist/middleware/retry/index.d.ts.map +1 -0
  208. package/dist/middleware/retry/index.js +6 -0
  209. package/dist/middleware/retry/index.js.map +1 -0
  210. package/dist/middleware/retry/retry.d.ts +39 -0
  211. package/dist/middleware/retry/retry.d.ts.map +1 -0
  212. package/dist/middleware/retry/retry.js +141 -0
  213. package/dist/middleware/retry/retry.js.map +1 -0
  214. package/dist/middleware/retry/types.d.ts +61 -0
  215. package/dist/middleware/retry/types.d.ts.map +1 -0
  216. package/dist/middleware/retry/types.js +5 -0
  217. package/dist/middleware/retry/types.js.map +1 -0
  218. package/package.json +42 -8
  219. package/dist/client.d.ts +0 -133
  220. package/dist/client.js +0 -166
  221. package/dist/client.js.map +0 -1
  222. package/dist/csrf.d.ts +0 -32
  223. package/dist/csrf.js +0 -53
  224. package/dist/csrf.js.map +0 -1
  225. package/dist/errors.js.map +0 -1
  226. package/dist/test-utils.d.ts +0 -24
  227. package/dist/test-utils.js +0 -52
  228. package/dist/test-utils.js.map +0 -1
  229. package/dist/unauthorized.d.ts +0 -27
  230. package/dist/unauthorized.js +0 -41
  231. package/dist/unauthorized.js.map +0 -1
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @fileoverview Authentication middleware types and configuration.
3
+ */
4
+ /**
5
+ * Authentication token provider function.
6
+ * Should return the current auth token or empty string if not available.
7
+ */
8
+ export type AuthTokenProvider = () => string | Promise<string>;
9
+ /**
10
+ * Authentication configuration options - optimized for "pit of success".
11
+ *
12
+ * Smart defaults:
13
+ * - Uses standard Authorization header with Bearer token
14
+ * - Applies to all requests by default
15
+ * - Graceful handling when token is unavailable
16
+ */
17
+ export interface AuthenticationOptions {
18
+ /**
19
+ * Function to get the current authentication token.
20
+ * Can be synchronous or asynchronous.
21
+ *
22
+ * @returns The auth token or empty string if not available
23
+ *
24
+ * @example Token from localStorage:
25
+ * ```typescript
26
+ * const getToken = () => localStorage.getItem('auth-token') || '';
27
+ * ```
28
+ *
29
+ * @example Async token refresh:
30
+ * ```typescript
31
+ * const getToken = async () => {
32
+ * const token = localStorage.getItem('auth-token');
33
+ * if (!token || isExpired(token)) {
34
+ * return await refreshToken();
35
+ * }
36
+ * return token;
37
+ * };
38
+ * ```
39
+ */
40
+ tokenProvider: AuthTokenProvider;
41
+ /**
42
+ * Header name for the authentication token (default: 'Authorization')
43
+ * The token will be prefixed with the tokenType
44
+ */
45
+ headerName?: string;
46
+ /**
47
+ * Token type prefix (default: 'Bearer')
48
+ * Common alternatives: 'Token', 'JWT', 'ApiKey'
49
+ */
50
+ tokenType?: string;
51
+ /**
52
+ * Skip authentication for requests matching these URL patterns
53
+ * Useful for public endpoints that don't need auth
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * skipPatterns: [/^\/public\//, '/health', '/login']
58
+ * ```
59
+ */
60
+ skipPatterns?: (RegExp | string)[];
61
+ /**
62
+ * Only apply authentication to requests matching these patterns
63
+ * If specified, only these patterns will get auth headers
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * includePatterns: [/^\/api\//, '/graphql']
68
+ * ```
69
+ */
70
+ includePatterns?: (RegExp | string)[];
71
+ }
72
+ export {};
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/middleware/authentication/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE/D;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,aAAa,EAAE,iBAAiB,CAAC;IAEjC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEnC;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACvC;AAGD,OAAO,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @fileoverview Authentication middleware types and configuration.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/middleware/authentication/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fileoverview Authorization middleware implementation.
3
+ */
4
+ import type { FetchMiddleware } from '../../client/fetch-client';
5
+ import type { AuthorizationOptions } from './types';
6
+ /**
7
+ * Creates authorization middleware with smart defaults.
8
+ * Handles 401/403 responses by calling configured handlers.
9
+ *
10
+ * @param options - Authorization configuration options
11
+ * @returns Authorization middleware for use with FetchClient
12
+ *
13
+ * @example Basic redirect on 401:
14
+ * ```typescript
15
+ * const authzClient = useAuthorization(client, {
16
+ * onUnauthorized: () => window.location.href = '/login'
17
+ * });
18
+ * ```
19
+ *
20
+ * @example Handle both 401 and 403:
21
+ * ```typescript
22
+ * const authzClient = useAuthorization(client, {
23
+ * onUnauthorized: () => redirectToLogin(),
24
+ * onForbidden: () => showAccessDeniedMessage(),
25
+ * statusCodes: [401, 403]
26
+ * });
27
+ * ```
28
+ */
29
+ export declare function createAuthorizationMiddleware(options: AuthorizationOptions): FetchMiddleware;
30
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../../src/middleware/authorization/authorization.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAyBpD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,oBAAoB,GAC5B,eAAe,CAuCjB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @fileoverview Authorization middleware implementation.
3
+ */
4
+ /**
5
+ * Checks if a URL should skip authorization handling based on configured patterns.
6
+ */
7
+ function shouldSkipAuth(url, skipPatterns = []) {
8
+ // Extract pathname from URL for pattern matching
9
+ let pathname;
10
+ try {
11
+ pathname = new URL(url).pathname;
12
+ }
13
+ catch {
14
+ pathname = url; // fallback if not a valid URL
15
+ }
16
+ return skipPatterns.some((pattern) => {
17
+ if (typeof pattern === 'string') {
18
+ return pathname.includes(pattern);
19
+ }
20
+ return pattern.test(pathname);
21
+ });
22
+ }
23
+ /**
24
+ * Creates authorization middleware with smart defaults.
25
+ * Handles 401/403 responses by calling configured handlers.
26
+ *
27
+ * @param options - Authorization configuration options
28
+ * @returns Authorization middleware for use with FetchClient
29
+ *
30
+ * @example Basic redirect on 401:
31
+ * ```typescript
32
+ * const authzClient = useAuthorization(client, {
33
+ * onUnauthorized: () => window.location.href = '/login'
34
+ * });
35
+ * ```
36
+ *
37
+ * @example Handle both 401 and 403:
38
+ * ```typescript
39
+ * const authzClient = useAuthorization(client, {
40
+ * onUnauthorized: () => redirectToLogin(),
41
+ * onForbidden: () => showAccessDeniedMessage(),
42
+ * statusCodes: [401, 403]
43
+ * });
44
+ * ```
45
+ */
46
+ export function createAuthorizationMiddleware(options) {
47
+ const { onUnauthorized, onForbidden, skipPatterns = [], statusCodes = [401], } = options;
48
+ return async (request, next) => {
49
+ const url = request.url || '';
50
+ // Skip authorization handling if URL matches skip patterns
51
+ if (shouldSkipAuth(url, skipPatterns)) {
52
+ return next(request);
53
+ }
54
+ // Execute the request
55
+ const response = await next(request);
56
+ // Check if response status requires handling
57
+ if (statusCodes.includes(response.status)) {
58
+ try {
59
+ if (response.status === 401 && onUnauthorized) {
60
+ await onUnauthorized(response, request);
61
+ }
62
+ else if (response.status === 403 && onForbidden) {
63
+ await onForbidden(response, request);
64
+ }
65
+ else if (onUnauthorized) {
66
+ // For any other configured status codes, use the first available handler
67
+ await onUnauthorized(response, request);
68
+ }
69
+ }
70
+ catch (error) {
71
+ // If handler fails, log but don't break the response chain
72
+ // eslint-disable-next-line no-console
73
+ console.warn('Authorization handler failed:', error);
74
+ }
75
+ }
76
+ return response;
77
+ };
78
+ }
79
+ //# sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../../src/middleware/authorization/authorization.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,SAAS,cAAc,CACrB,GAAW,EACX,eAAoC,EAAE;IAEtC,iDAAiD;IACjD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,GAAG,CAAC,CAAC,8BAA8B;IAChD,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,6BAA6B,CAC3C,OAA6B;IAE7B,MAAM,EACJ,cAAc,EACd,WAAW,EACX,YAAY,GAAG,EAAE,EACjB,WAAW,GAAG,CAAC,GAAG,CAAC,GACpB,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;QAE9B,2DAA2D;QAC3D,IAAI,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,sBAAsB;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QAErC,6CAA6C;QAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,cAAc,EAAE,CAAC;oBAC9C,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC1C,CAAC;qBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;oBAClD,MAAM,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACvC,CAAC;qBAAM,IAAI,cAAc,EAAE,CAAC;oBAC1B,yEAAyE;oBACzE,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,2DAA2D;gBAC3D,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @fileoverview Authorization middleware - "pit of success" API.
3
+ */
4
+ import type { FetchClient } from '../../client/fetch-client';
5
+ import type { AuthorizationOptions } from './types';
6
+ export type { AuthorizationOptions, UnauthorizedHandler } from './types';
7
+ export { createAuthorizationMiddleware } from './authorization';
8
+ /**
9
+ * "Pit of success" API for adding authorization handling to a FetchClient.
10
+ * Automatically handles 401 Unauthorized responses.
11
+ *
12
+ * @param client - The FetchClient to add authorization handling to
13
+ * @param options - Authorization configuration
14
+ * @returns A new FetchClient with authorization middleware
15
+ *
16
+ * @example Basic redirect on 401:
17
+ * ```typescript
18
+ * const authzClient = useAuthorization(client, {
19
+ * onUnauthorized: () => {
20
+ * localStorage.removeItem('auth-token');
21
+ * window.location.href = '/login';
22
+ * }
23
+ * });
24
+ * ```
25
+ *
26
+ * @example Handle multiple status codes:
27
+ * ```typescript
28
+ * const authzClient = useAuthorization(client, {
29
+ * onUnauthorized: () => redirectToLogin(),
30
+ * onForbidden: () => showAccessDenied(),
31
+ * statusCodes: [401, 403]
32
+ * });
33
+ * ```
34
+ */
35
+ export declare function useAuthorization(client: FetchClient, options: AuthorizationOptions): FetchClient;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/middleware/authorization/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAIpD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,oBAAoB,GAC5B,WAAW,CAEb"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @fileoverview Authorization middleware - "pit of success" API.
3
+ */
4
+ import { createAuthorizationMiddleware } from './authorization';
5
+ export { createAuthorizationMiddleware } from './authorization';
6
+ /**
7
+ * "Pit of success" API for adding authorization handling to a FetchClient.
8
+ * Automatically handles 401 Unauthorized responses.
9
+ *
10
+ * @param client - The FetchClient to add authorization handling to
11
+ * @param options - Authorization configuration
12
+ * @returns A new FetchClient with authorization middleware
13
+ *
14
+ * @example Basic redirect on 401:
15
+ * ```typescript
16
+ * const authzClient = useAuthorization(client, {
17
+ * onUnauthorized: () => {
18
+ * localStorage.removeItem('auth-token');
19
+ * window.location.href = '/login';
20
+ * }
21
+ * });
22
+ * ```
23
+ *
24
+ * @example Handle multiple status codes:
25
+ * ```typescript
26
+ * const authzClient = useAuthorization(client, {
27
+ * onUnauthorized: () => redirectToLogin(),
28
+ * onForbidden: () => showAccessDenied(),
29
+ * statusCodes: [401, 403]
30
+ * });
31
+ * ```
32
+ */
33
+ export function useAuthorization(client, options) {
34
+ return client.use(createAuthorizationMiddleware(options));
35
+ }
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/authorization/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAmB,EACnB,OAA6B;IAE7B,OAAO,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview Authorization middleware types and configuration.
3
+ */
4
+ import type { FetchResponse } from '../../client/types';
5
+ /**
6
+ * Handler function for unauthorized/forbidden responses.
7
+ */
8
+ export type UnauthorizedHandler = (response: FetchResponse<unknown>, request: RequestInit & {
9
+ url?: string;
10
+ }) => void | Promise<void>;
11
+ /**
12
+ * Authorization configuration options - optimized for "pit of success".
13
+ *
14
+ * Smart defaults:
15
+ * - Handles 401 Unauthorized responses
16
+ * - Optionally handles 403 Forbidden responses
17
+ * - Graceful error handling
18
+ */
19
+ export interface AuthorizationOptions {
20
+ /**
21
+ * Handler called when 401 Unauthorized response is received.
22
+ *
23
+ * @param response - The 401 response object
24
+ * @param request - The original request that was unauthorized
25
+ *
26
+ * @example Redirect to login:
27
+ * ```typescript
28
+ * onUnauthorized: () => {
29
+ * window.location.href = '/login';
30
+ * }
31
+ * ```
32
+ *
33
+ * @example Clear token and reload:
34
+ * ```typescript
35
+ * onUnauthorized: () => {
36
+ * localStorage.removeItem('auth-token');
37
+ * window.location.reload();
38
+ * }
39
+ * ```
40
+ */
41
+ onUnauthorized: UnauthorizedHandler;
42
+ /**
43
+ * Handler called when 403 Forbidden response is received.
44
+ * Optional - if not provided, 403 responses are ignored.
45
+ *
46
+ * @param response - The 403 response object
47
+ * @param request - The original request that was forbidden
48
+ */
49
+ onForbidden?: UnauthorizedHandler;
50
+ /**
51
+ * Skip authorization handling for requests matching these URL patterns
52
+ * Useful for login/public endpoints where 401 is expected
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * skipPatterns: ['/login', '/register', /^\/public\//]
57
+ * ```
58
+ */
59
+ skipPatterns?: (RegExp | string)[];
60
+ /**
61
+ * Status codes to handle (default: [401])
62
+ * You can add 403 if you want to handle forbidden responses
63
+ */
64
+ statusCodes?: number[];
65
+ }
66
+ export {};
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/middleware/authorization/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAChC,OAAO,EAAE,WAAW,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KACpC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,cAAc,EAAE,mBAAmB,CAAC;IAEpC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAElC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEnC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAGD,OAAO,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @fileoverview Authorization middleware types and configuration.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/middleware/authorization/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @fileoverview Cache middleware implementation.
3
+ */
4
+ import type { FetchMiddleware } from '../../client/fetch-client';
5
+ import type { CacheOptions, CacheStorage, CacheEntry } from './types';
6
+ /**
7
+ * Default in-memory cache storage implementation.
8
+ */
9
+ export declare class MemoryStorage implements CacheStorage {
10
+ private cache;
11
+ get(key: string): Promise<CacheEntry | null>;
12
+ getWithExpiry(key: string): Promise<{
13
+ entry: CacheEntry | null;
14
+ isExpired: boolean;
15
+ }>;
16
+ set(key: string, entry: CacheEntry): Promise<void>;
17
+ delete(key: string): Promise<void>;
18
+ clear(): Promise<void>;
19
+ }
20
+ /**
21
+ * Creates cache middleware with smart defaults.
22
+ * Caches GET responses for faster subsequent requests.
23
+ *
24
+ * @param options - Cache configuration options
25
+ * @returns Cache middleware for use with FetchClient
26
+ *
27
+ * @example Basic caching:
28
+ * ```typescript
29
+ * const cachedClient = useCache(client);
30
+ * // GET requests will be cached for 5 minutes
31
+ * ```
32
+ *
33
+ * @example Custom TTL:
34
+ * ```typescript
35
+ * const cachedClient = useCache(client, {
36
+ * ttl: 10 * 60 * 1000 // 10 minutes
37
+ * });
38
+ * ```
39
+ */
40
+ export declare function createCacheMiddleware(options?: CacheOptions): FetchMiddleware;
41
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/middleware/cache/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EAEX,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,KAAK,CAAiC;IAExC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAe5C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAWrF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AA2BD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,YAAiB,GACzB,eAAe,CA0HjB"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * @fileoverview Cache middleware implementation.
3
+ */
4
+ /**
5
+ * Default in-memory cache storage implementation.
6
+ */
7
+ export class MemoryStorage {
8
+ constructor() {
9
+ this.cache = new Map();
10
+ }
11
+ async get(key) {
12
+ const entry = this.cache.get(key);
13
+ if (!entry) {
14
+ return null;
15
+ }
16
+ // Check if expired
17
+ if (Date.now() > entry.expiresAt) {
18
+ this.cache.delete(key);
19
+ return null;
20
+ }
21
+ return entry;
22
+ }
23
+ async getWithExpiry(key) {
24
+ const entry = this.cache.get(key);
25
+ if (!entry) {
26
+ return { entry: null, isExpired: false };
27
+ }
28
+ const isExpired = Date.now() > entry.expiresAt;
29
+ // Don't delete expired entries when using getWithExpiry - let the caller decide
30
+ return { entry, isExpired };
31
+ }
32
+ async set(key, entry) {
33
+ this.cache.set(key, entry);
34
+ }
35
+ async delete(key) {
36
+ this.cache.delete(key);
37
+ }
38
+ async clear() {
39
+ this.cache.clear();
40
+ }
41
+ }
42
+ /**
43
+ * Default cache key generator.
44
+ */
45
+ const defaultKeyGenerator = (request) => {
46
+ const url = request.url || '';
47
+ const method = request.method || 'GET';
48
+ const headers = request.headers ? JSON.stringify(request.headers) : '';
49
+ return `${method}:${url}:${headers}`;
50
+ };
51
+ /**
52
+ * Checks if a URL should skip caching based on configured patterns.
53
+ */
54
+ function shouldSkipCache(url, skipPatterns = []) {
55
+ return skipPatterns.some((pattern) => {
56
+ if (typeof pattern === 'string') {
57
+ return url.includes(pattern);
58
+ }
59
+ return pattern.test(url);
60
+ });
61
+ }
62
+ /**
63
+ * Creates cache middleware with smart defaults.
64
+ * Caches GET responses for faster subsequent requests.
65
+ *
66
+ * @param options - Cache configuration options
67
+ * @returns Cache middleware for use with FetchClient
68
+ *
69
+ * @example Basic caching:
70
+ * ```typescript
71
+ * const cachedClient = useCache(client);
72
+ * // GET requests will be cached for 5 minutes
73
+ * ```
74
+ *
75
+ * @example Custom TTL:
76
+ * ```typescript
77
+ * const cachedClient = useCache(client, {
78
+ * ttl: 10 * 60 * 1000 // 10 minutes
79
+ * });
80
+ * ```
81
+ */
82
+ export function createCacheMiddleware(options = {}) {
83
+ const { ttl = 5 * 60 * 1000, // 5 minutes
84
+ methods = ['GET'], storage = new MemoryStorage(), keyGenerator = defaultKeyGenerator, skipPatterns = [], staleWhileRevalidate = false, } = options;
85
+ return async (request, next) => {
86
+ const method = (request.method || 'GET').toUpperCase();
87
+ const url = request.url || '';
88
+ // Skip caching if:
89
+ // 1. Method is not in cached methods list
90
+ // 2. URL matches a skip pattern
91
+ if (!methods.includes(method) || shouldSkipCache(url, skipPatterns)) {
92
+ return next(request);
93
+ }
94
+ const cacheKey = keyGenerator(request);
95
+ try {
96
+ // Try to get cached response with expiry info
97
+ const { entry: cached, isExpired } = storage.getWithExpiry
98
+ ? await storage.getWithExpiry(cacheKey)
99
+ : await (async () => {
100
+ const entry = await storage.get(cacheKey);
101
+ return { entry, isExpired: false };
102
+ })();
103
+ if (cached && !isExpired) {
104
+ // Return fresh cached response
105
+ return {
106
+ ...cached.response,
107
+ headers: new Headers(cached.response.headers),
108
+ data: cached.response.data,
109
+ };
110
+ }
111
+ // If stale-while-revalidate and we have cached data (even expired), return it immediately
112
+ // and update in background
113
+ if (cached && staleWhileRevalidate) {
114
+ // Return cached data immediately (even if stale)
115
+ const cachedResponse = {
116
+ ...cached.response,
117
+ headers: new Headers(cached.response.headers),
118
+ data: cached.response.data,
119
+ };
120
+ // Update cache in background if expired
121
+ if (isExpired) {
122
+ next(request)
123
+ .then(async (freshResponse) => {
124
+ const headersObj = {};
125
+ freshResponse.headers.forEach((value, key) => {
126
+ headersObj[key] = value;
127
+ });
128
+ const cacheEntry = {
129
+ response: {
130
+ status: freshResponse.status,
131
+ statusText: freshResponse.statusText,
132
+ headers: headersObj,
133
+ data: freshResponse.data,
134
+ },
135
+ timestamp: Date.now(),
136
+ expiresAt: Date.now() + ttl,
137
+ };
138
+ await storage.set(cacheKey, cacheEntry);
139
+ })
140
+ .catch(() => {
141
+ // Ignore background update errors
142
+ });
143
+ }
144
+ return cachedResponse;
145
+ }
146
+ // No cached data or not using stale-while-revalidate
147
+ const response = await next(request);
148
+ // Cache successful responses
149
+ if (response.ok) {
150
+ try {
151
+ const headersObj = {};
152
+ response.headers.forEach((value, key) => {
153
+ headersObj[key] = value;
154
+ });
155
+ const cacheEntry = {
156
+ response: {
157
+ status: response.status,
158
+ statusText: response.statusText,
159
+ headers: headersObj,
160
+ data: response.data,
161
+ },
162
+ timestamp: Date.now(),
163
+ expiresAt: Date.now() + ttl,
164
+ };
165
+ await storage.set(cacheKey, cacheEntry);
166
+ }
167
+ catch {
168
+ // Ignore cache storage errors, but still return the response
169
+ }
170
+ }
171
+ return response;
172
+ }
173
+ catch (error) {
174
+ // Only catch cache retrieval errors, let network errors through
175
+ if (error && typeof error === 'object' && 'message' in error) {
176
+ const errorMessage = error.message;
177
+ if (errorMessage.includes('Network') || errorMessage.includes('fetch')) {
178
+ throw error; // Re-throw network errors
179
+ }
180
+ }
181
+ // If cache retrieval fails, just proceed with the request
182
+ return next(request);
183
+ }
184
+ };
185
+ }
186
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/middleware/cache/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @fileoverview Cache middleware - "pit of success" API.
3
+ */
4
+ import type { FetchClient } from '../../client/fetch-client';
5
+ import type { CacheOptions } from './types';
6
+ export type { CacheOptions, CacheStorage, CacheEntry, CacheKeyGenerator, } from './types';
7
+ export { createCacheMiddleware, MemoryStorage } from './cache';
8
+ /**
9
+ * "Pit of success" API for adding response caching to a FetchClient.
10
+ * Caches GET responses for faster subsequent requests.
11
+ *
12
+ * @param client - The FetchClient to add caching to
13
+ * @param options - Cache configuration options
14
+ * @returns A new FetchClient with cache middleware
15
+ *
16
+ * @example Basic caching (5 minute TTL):
17
+ * ```typescript
18
+ * const cachedClient = useCache(client);
19
+ *
20
+ * // First call hits the network
21
+ * await cachedClient.get('/api/data');
22
+ *
23
+ * // Second call returns cached data
24
+ * await cachedClient.get('/api/data');
25
+ * ```
26
+ *
27
+ * @example Custom TTL and methods:
28
+ * ```typescript
29
+ * const cachedClient = useCache(client, {
30
+ * ttl: 10 * 60 * 1000, // 10 minutes
31
+ * methods: ['GET', 'HEAD']
32
+ * });
33
+ * ```
34
+ *
35
+ * @example Stale-while-revalidate:
36
+ * ```typescript
37
+ * const cachedClient = useCache(client, {
38
+ * staleWhileRevalidate: true
39
+ * });
40
+ * // Returns stale data immediately, updates cache in background
41
+ * ```
42
+ */
43
+ export declare function useCache(client: FetchClient, options?: CacheOptions): FetchClient;
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/middleware/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,iBAAiB,GAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,YAAiB,GACzB,WAAW,CAEb"}