@fgrzl/fetch 1.1.0-alpha.7 → 1.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 (224) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/CONTRIBUTING.md +327 -0
  3. package/README.md +50 -21
  4. package/dist/cjs/index.js +1110 -105
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/index.min.js +2 -0
  7. package/dist/cjs/index.min.js.map +1 -0
  8. package/dist/index.d.ts +1381 -10
  9. package/dist/index.js +1066 -91
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.min.js +2 -0
  12. package/dist/index.min.js.map +1 -0
  13. package/package.json +14 -5
  14. package/dist/cjs/client/fetch-client.d.ts +0 -189
  15. package/dist/cjs/client/fetch-client.d.ts.map +0 -1
  16. package/dist/cjs/client/fetch-client.js +0 -339
  17. package/dist/cjs/client/fetch-client.js.map +0 -1
  18. package/dist/cjs/client/index.d.ts +0 -11
  19. package/dist/cjs/client/index.d.ts.map +0 -1
  20. package/dist/cjs/client/index.js +0 -14
  21. package/dist/cjs/client/index.js.map +0 -1
  22. package/dist/cjs/client/types.d.ts +0 -63
  23. package/dist/cjs/client/types.d.ts.map +0 -1
  24. package/dist/cjs/client/types.js +0 -9
  25. package/dist/cjs/client/types.js.map +0 -1
  26. package/dist/cjs/errors/index.d.ts +0 -64
  27. package/dist/cjs/errors/index.d.ts.map +0 -1
  28. package/dist/cjs/errors/index.js +0 -79
  29. package/dist/cjs/errors/index.js.map +0 -1
  30. package/dist/cjs/index.d.ts +0 -65
  31. package/dist/cjs/index.d.ts.map +0 -1
  32. package/dist/cjs/middleware/authentication/authentication.d.ts +0 -31
  33. package/dist/cjs/middleware/authentication/authentication.d.ts.map +0 -1
  34. package/dist/cjs/middleware/authentication/authentication.js +0 -93
  35. package/dist/cjs/middleware/authentication/authentication.js.map +0 -1
  36. package/dist/cjs/middleware/authentication/index.d.ts +0 -37
  37. package/dist/cjs/middleware/authentication/index.d.ts.map +0 -1
  38. package/dist/cjs/middleware/authentication/index.js +0 -42
  39. package/dist/cjs/middleware/authentication/index.js.map +0 -1
  40. package/dist/cjs/middleware/authentication/types.d.ts +0 -73
  41. package/dist/cjs/middleware/authentication/types.d.ts.map +0 -1
  42. package/dist/cjs/middleware/authentication/types.js +0 -6
  43. package/dist/cjs/middleware/authentication/types.js.map +0 -1
  44. package/dist/cjs/middleware/authorization/authorization.d.ts +0 -30
  45. package/dist/cjs/middleware/authorization/authorization.d.ts.map +0 -1
  46. package/dist/cjs/middleware/authorization/authorization.js +0 -82
  47. package/dist/cjs/middleware/authorization/authorization.js.map +0 -1
  48. package/dist/cjs/middleware/authorization/index.d.ts +0 -36
  49. package/dist/cjs/middleware/authorization/index.d.ts.map +0 -1
  50. package/dist/cjs/middleware/authorization/index.js +0 -41
  51. package/dist/cjs/middleware/authorization/index.js.map +0 -1
  52. package/dist/cjs/middleware/authorization/types.d.ts +0 -67
  53. package/dist/cjs/middleware/authorization/types.d.ts.map +0 -1
  54. package/dist/cjs/middleware/authorization/types.js +0 -6
  55. package/dist/cjs/middleware/authorization/types.js.map +0 -1
  56. package/dist/cjs/middleware/cache/cache.d.ts +0 -41
  57. package/dist/cjs/middleware/cache/cache.d.ts.map +0 -1
  58. package/dist/cjs/middleware/cache/cache.js +0 -191
  59. package/dist/cjs/middleware/cache/cache.js.map +0 -1
  60. package/dist/cjs/middleware/cache/index.d.ts +0 -44
  61. package/dist/cjs/middleware/cache/index.d.ts.map +0 -1
  62. package/dist/cjs/middleware/cache/index.js +0 -50
  63. package/dist/cjs/middleware/cache/index.js.map +0 -1
  64. package/dist/cjs/middleware/cache/types.d.ts +0 -89
  65. package/dist/cjs/middleware/cache/types.d.ts.map +0 -1
  66. package/dist/cjs/middleware/cache/types.js +0 -6
  67. package/dist/cjs/middleware/cache/types.js.map +0 -1
  68. package/dist/cjs/middleware/csrf/csrf.d.ts +0 -34
  69. package/dist/cjs/middleware/csrf/csrf.d.ts.map +0 -1
  70. package/dist/cjs/middleware/csrf/csrf.js +0 -94
  71. package/dist/cjs/middleware/csrf/csrf.js.map +0 -1
  72. package/dist/cjs/middleware/csrf/index.d.ts +0 -57
  73. package/dist/cjs/middleware/csrf/index.d.ts.map +0 -1
  74. package/dist/cjs/middleware/csrf/index.js +0 -62
  75. package/dist/cjs/middleware/csrf/index.js.map +0 -1
  76. package/dist/cjs/middleware/csrf/types.d.ts +0 -57
  77. package/dist/cjs/middleware/csrf/types.d.ts.map +0 -1
  78. package/dist/cjs/middleware/csrf/types.js +0 -6
  79. package/dist/cjs/middleware/csrf/types.js.map +0 -1
  80. package/dist/cjs/middleware/index.d.ts +0 -115
  81. package/dist/cjs/middleware/index.d.ts.map +0 -1
  82. package/dist/cjs/middleware/index.js +0 -153
  83. package/dist/cjs/middleware/index.js.map +0 -1
  84. package/dist/cjs/middleware/logging/index.d.ts +0 -42
  85. package/dist/cjs/middleware/logging/index.d.ts.map +0 -1
  86. package/dist/cjs/middleware/logging/index.js +0 -47
  87. package/dist/cjs/middleware/logging/index.js.map +0 -1
  88. package/dist/cjs/middleware/logging/logging.d.ts +0 -29
  89. package/dist/cjs/middleware/logging/logging.d.ts.map +0 -1
  90. package/dist/cjs/middleware/logging/logging.js +0 -171
  91. package/dist/cjs/middleware/logging/logging.js.map +0 -1
  92. package/dist/cjs/middleware/logging/types.d.ts +0 -90
  93. package/dist/cjs/middleware/logging/types.d.ts.map +0 -1
  94. package/dist/cjs/middleware/logging/types.js +0 -6
  95. package/dist/cjs/middleware/logging/types.js.map +0 -1
  96. package/dist/cjs/middleware/rate-limit/index.d.ts +0 -16
  97. package/dist/cjs/middleware/rate-limit/index.d.ts.map +0 -1
  98. package/dist/cjs/middleware/rate-limit/index.js +0 -21
  99. package/dist/cjs/middleware/rate-limit/index.js.map +0 -1
  100. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts +0 -14
  101. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts.map +0 -1
  102. package/dist/cjs/middleware/rate-limit/rate-limit.js +0 -87
  103. package/dist/cjs/middleware/rate-limit/rate-limit.js.map +0 -1
  104. package/dist/cjs/middleware/rate-limit/types.d.ts +0 -97
  105. package/dist/cjs/middleware/rate-limit/types.d.ts.map +0 -1
  106. package/dist/cjs/middleware/rate-limit/types.js +0 -6
  107. package/dist/cjs/middleware/rate-limit/types.js.map +0 -1
  108. package/dist/cjs/middleware/retry/index.d.ts +0 -6
  109. package/dist/cjs/middleware/retry/index.d.ts.map +0 -1
  110. package/dist/cjs/middleware/retry/index.js +0 -11
  111. package/dist/cjs/middleware/retry/index.js.map +0 -1
  112. package/dist/cjs/middleware/retry/retry.d.ts +0 -39
  113. package/dist/cjs/middleware/retry/retry.d.ts.map +0 -1
  114. package/dist/cjs/middleware/retry/retry.js +0 -144
  115. package/dist/cjs/middleware/retry/retry.js.map +0 -1
  116. package/dist/cjs/middleware/retry/types.d.ts +0 -61
  117. package/dist/cjs/middleware/retry/types.d.ts.map +0 -1
  118. package/dist/cjs/middleware/retry/types.js +0 -6
  119. package/dist/cjs/middleware/retry/types.js.map +0 -1
  120. package/dist/client/fetch-client.d.ts +0 -189
  121. package/dist/client/fetch-client.d.ts.map +0 -1
  122. package/dist/client/fetch-client.js +0 -335
  123. package/dist/client/fetch-client.js.map +0 -1
  124. package/dist/client/index.d.ts +0 -11
  125. package/dist/client/index.d.ts.map +0 -1
  126. package/dist/client/index.js +0 -10
  127. package/dist/client/index.js.map +0 -1
  128. package/dist/client/types.d.ts +0 -63
  129. package/dist/client/types.d.ts.map +0 -1
  130. package/dist/client/types.js +0 -8
  131. package/dist/client/types.js.map +0 -1
  132. package/dist/errors/index.d.ts +0 -64
  133. package/dist/errors/index.d.ts.map +0 -1
  134. package/dist/errors/index.js +0 -73
  135. package/dist/errors/index.js.map +0 -1
  136. package/dist/index.d.ts.map +0 -1
  137. package/dist/middleware/authentication/authentication.d.ts +0 -31
  138. package/dist/middleware/authentication/authentication.d.ts.map +0 -1
  139. package/dist/middleware/authentication/authentication.js +0 -90
  140. package/dist/middleware/authentication/authentication.js.map +0 -1
  141. package/dist/middleware/authentication/index.d.ts +0 -37
  142. package/dist/middleware/authentication/index.d.ts.map +0 -1
  143. package/dist/middleware/authentication/index.js +0 -37
  144. package/dist/middleware/authentication/index.js.map +0 -1
  145. package/dist/middleware/authentication/types.d.ts +0 -73
  146. package/dist/middleware/authentication/types.d.ts.map +0 -1
  147. package/dist/middleware/authentication/types.js +0 -5
  148. package/dist/middleware/authentication/types.js.map +0 -1
  149. package/dist/middleware/authorization/authorization.d.ts +0 -30
  150. package/dist/middleware/authorization/authorization.d.ts.map +0 -1
  151. package/dist/middleware/authorization/authorization.js +0 -79
  152. package/dist/middleware/authorization/authorization.js.map +0 -1
  153. package/dist/middleware/authorization/index.d.ts +0 -36
  154. package/dist/middleware/authorization/index.d.ts.map +0 -1
  155. package/dist/middleware/authorization/index.js +0 -36
  156. package/dist/middleware/authorization/index.js.map +0 -1
  157. package/dist/middleware/authorization/types.d.ts +0 -67
  158. package/dist/middleware/authorization/types.d.ts.map +0 -1
  159. package/dist/middleware/authorization/types.js +0 -5
  160. package/dist/middleware/authorization/types.js.map +0 -1
  161. package/dist/middleware/cache/cache.d.ts +0 -41
  162. package/dist/middleware/cache/cache.d.ts.map +0 -1
  163. package/dist/middleware/cache/cache.js +0 -186
  164. package/dist/middleware/cache/cache.js.map +0 -1
  165. package/dist/middleware/cache/index.d.ts +0 -44
  166. package/dist/middleware/cache/index.d.ts.map +0 -1
  167. package/dist/middleware/cache/index.js +0 -44
  168. package/dist/middleware/cache/index.js.map +0 -1
  169. package/dist/middleware/cache/types.d.ts +0 -89
  170. package/dist/middleware/cache/types.d.ts.map +0 -1
  171. package/dist/middleware/cache/types.js +0 -5
  172. package/dist/middleware/cache/types.js.map +0 -1
  173. package/dist/middleware/csrf/csrf.d.ts +0 -34
  174. package/dist/middleware/csrf/csrf.d.ts.map +0 -1
  175. package/dist/middleware/csrf/csrf.js +0 -91
  176. package/dist/middleware/csrf/csrf.js.map +0 -1
  177. package/dist/middleware/csrf/index.d.ts +0 -57
  178. package/dist/middleware/csrf/index.d.ts.map +0 -1
  179. package/dist/middleware/csrf/index.js +0 -57
  180. package/dist/middleware/csrf/index.js.map +0 -1
  181. package/dist/middleware/csrf/types.d.ts +0 -57
  182. package/dist/middleware/csrf/types.d.ts.map +0 -1
  183. package/dist/middleware/csrf/types.js +0 -5
  184. package/dist/middleware/csrf/types.js.map +0 -1
  185. package/dist/middleware/index.d.ts +0 -115
  186. package/dist/middleware/index.d.ts.map +0 -1
  187. package/dist/middleware/index.js +0 -134
  188. package/dist/middleware/index.js.map +0 -1
  189. package/dist/middleware/logging/index.d.ts +0 -42
  190. package/dist/middleware/logging/index.d.ts.map +0 -1
  191. package/dist/middleware/logging/index.js +0 -42
  192. package/dist/middleware/logging/index.js.map +0 -1
  193. package/dist/middleware/logging/logging.d.ts +0 -29
  194. package/dist/middleware/logging/logging.d.ts.map +0 -1
  195. package/dist/middleware/logging/logging.js +0 -168
  196. package/dist/middleware/logging/logging.js.map +0 -1
  197. package/dist/middleware/logging/types.d.ts +0 -90
  198. package/dist/middleware/logging/types.d.ts.map +0 -1
  199. package/dist/middleware/logging/types.js +0 -5
  200. package/dist/middleware/logging/types.js.map +0 -1
  201. package/dist/middleware/rate-limit/index.d.ts +0 -16
  202. package/dist/middleware/rate-limit/index.d.ts.map +0 -1
  203. package/dist/middleware/rate-limit/index.js +0 -16
  204. package/dist/middleware/rate-limit/index.js.map +0 -1
  205. package/dist/middleware/rate-limit/rate-limit.d.ts +0 -14
  206. package/dist/middleware/rate-limit/rate-limit.d.ts.map +0 -1
  207. package/dist/middleware/rate-limit/rate-limit.js +0 -84
  208. package/dist/middleware/rate-limit/rate-limit.js.map +0 -1
  209. package/dist/middleware/rate-limit/types.d.ts +0 -97
  210. package/dist/middleware/rate-limit/types.d.ts.map +0 -1
  211. package/dist/middleware/rate-limit/types.js +0 -5
  212. package/dist/middleware/rate-limit/types.js.map +0 -1
  213. package/dist/middleware/retry/index.d.ts +0 -6
  214. package/dist/middleware/retry/index.d.ts.map +0 -1
  215. package/dist/middleware/retry/index.js +0 -6
  216. package/dist/middleware/retry/index.js.map +0 -1
  217. package/dist/middleware/retry/retry.d.ts +0 -39
  218. package/dist/middleware/retry/retry.d.ts.map +0 -1
  219. package/dist/middleware/retry/retry.js +0 -141
  220. package/dist/middleware/retry/retry.js.map +0 -1
  221. package/dist/middleware/retry/types.d.ts +0 -61
  222. package/dist/middleware/retry/types.d.ts.map +0 -1
  223. package/dist/middleware/retry/types.js +0 -5
  224. package/dist/middleware/retry/types.js.map +0 -1
@@ -1,186 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/middleware/cache/cache.ts"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,44 +0,0 @@
1
- /**
2
- * @fileoverview Cache middleware - "pit of success" API.
3
- */
4
- import { createCacheMiddleware } from './cache';
5
- export { createCacheMiddleware, MemoryStorage } from './cache';
6
- /**
7
- * "Pit of success" API for adding response caching to a FetchClient.
8
- * Caches GET responses for faster subsequent requests.
9
- *
10
- * @param client - The FetchClient to add caching to
11
- * @param options - Cache configuration options
12
- * @returns A new FetchClient with cache middleware
13
- *
14
- * @example Basic caching (5 minute TTL):
15
- * ```typescript
16
- * const cachedClient = useCache(client);
17
- *
18
- * // First call hits the network
19
- * await cachedClient.get('/api/data');
20
- *
21
- * // Second call returns cached data
22
- * await cachedClient.get('/api/data');
23
- * ```
24
- *
25
- * @example Custom TTL and methods:
26
- * ```typescript
27
- * const cachedClient = useCache(client, {
28
- * ttl: 10 * 60 * 1000, // 10 minutes
29
- * methods: ['GET', 'HEAD']
30
- * });
31
- * ```
32
- *
33
- * @example Stale-while-revalidate:
34
- * ```typescript
35
- * const cachedClient = useCache(client, {
36
- * staleWhileRevalidate: true
37
- * });
38
- * // Returns stale data immediately, updates cache in background
39
- * ```
40
- */
41
- export function useCache(client, options = {}) {
42
- return client.use(createCacheMiddleware(options));
43
- }
44
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAShD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,QAAQ,CACtB,MAAmB,EACnB,UAAwB,EAAE;IAE1B,OAAO,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -1,89 +0,0 @@
1
- /**
2
- * @fileoverview Cache middleware types and configuration.
3
- */
4
- /**
5
- * Cache key generator function.
6
- * Should return a unique key for the request.
7
- */
8
- export type CacheKeyGenerator = (request: RequestInit & {
9
- url?: string;
10
- }) => string;
11
- /**
12
- * Cache storage interface.
13
- * Allows custom cache implementations.
14
- */
15
- export interface CacheStorage {
16
- get(key: string): Promise<CacheEntry | null>;
17
- getWithExpiry?(key: string): Promise<{
18
- entry: CacheEntry | null;
19
- isExpired: boolean;
20
- }>;
21
- set(key: string, entry: CacheEntry): Promise<void>;
22
- delete(key: string): Promise<void>;
23
- clear(): Promise<void>;
24
- }
25
- /**
26
- * Cached response entry.
27
- */
28
- export interface CacheEntry {
29
- response: {
30
- status: number;
31
- statusText: string;
32
- headers: Record<string, string>;
33
- data: unknown;
34
- };
35
- timestamp: number;
36
- expiresAt: number;
37
- }
38
- /**
39
- * Cache configuration options - optimized for "pit of success".
40
- *
41
- * Smart defaults:
42
- * - Only caches GET requests
43
- * - 5 minute default TTL
44
- * - Memory-based storage
45
- * - Automatic cache key generation
46
- */
47
- export interface CacheOptions {
48
- /**
49
- * Time to live in milliseconds (default: 300000 = 5 minutes)
50
- * How long responses should be cached
51
- */
52
- ttl?: number;
53
- /**
54
- * HTTP methods to cache (default: ['GET'])
55
- * Only these methods will be cached
56
- */
57
- methods?: string[];
58
- /**
59
- * Cache storage implementation (default: in-memory)
60
- * Can be replaced with localStorage, IndexedDB, etc.
61
- */
62
- storage?: CacheStorage;
63
- /**
64
- * Custom cache key generator (default: URL + method + headers)
65
- * Should return a unique key for each request
66
- *
67
- * @example Custom key generator:
68
- * ```typescript
69
- * keyGenerator: (request) => `${request.method}:${request.url}`
70
- * ```
71
- */
72
- keyGenerator?: CacheKeyGenerator;
73
- /**
74
- * Skip caching for requests matching these URL patterns
75
- *
76
- * @example
77
- * ```typescript
78
- * skipPatterns: [/\/api\/user/, '/dynamic-data']
79
- * ```
80
- */
81
- skipPatterns?: (RegExp | string)[];
82
- /**
83
- * Whether to serve stale cache entries while revalidating
84
- * When true, returns cached data immediately and updates cache in background
85
- */
86
- staleWhileRevalidate?: boolean;
87
- }
88
- export {};
89
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/middleware/cache/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,WAAW,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KACpC,MAAM,CAAC;AAEZ;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC7C,aAAa,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACvF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAEjC;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEnC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAGD,OAAO,EAAE,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * @fileoverview Cache middleware types and configuration.
3
- */
4
- export {};
5
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/middleware/cache/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,34 +0,0 @@
1
- /**
2
- * @fileoverview CSRF protection middleware implementation.
3
- */
4
- import type { FetchMiddleware } from '../../client/fetch-client';
5
- import type { CSRFOptions } from './types';
6
- /**
7
- * Creates CSRF protection middleware with smart defaults.
8
- * Automatically adds CSRF tokens to state-changing requests.
9
- *
10
- * @param options - CSRF configuration options (all optional for "pit of success")
11
- * @returns CSRF middleware for use with FetchClient
12
- *
13
- * @example Basic usage (uses cookies automatically):
14
- * ```typescript
15
- * const client = new FetchClient();
16
- * const csrfClient = useCSRF(client);
17
- * ```
18
- *
19
- * @example Custom token provider:
20
- * ```typescript
21
- * const csrfClient = useCSRF(client, {
22
- * tokenProvider: () => localStorage.getItem('csrf-token') || ''
23
- * });
24
- * ```
25
- *
26
- * @example Skip external APIs:
27
- * ```typescript
28
- * const csrfClient = useCSRF(client, {
29
- * skipPatterns: [/^https:\/\/api\.external\.com\//, '/webhook/']
30
- * });
31
- * ```
32
- */
33
- export declare function createCSRFMiddleware(options?: CSRFOptions): FetchMiddleware;
34
- //# sourceMappingURL=csrf.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../../src/middleware/csrf/csrf.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAwC3C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,WAAgB,GACxB,eAAe,CA4CjB"}
@@ -1,91 +0,0 @@
1
- /**
2
- * @fileoverview CSRF protection middleware implementation.
3
- */
4
- /**
5
- * Default CSRF token provider that extracts token from XSRF-TOKEN cookie.
6
- * This follows the standard convention used by Rails, Laravel, and many other frameworks.
7
- */
8
- function getTokenFromCookie(cookieName = 'XSRF-TOKEN') {
9
- if (typeof document === 'undefined') {
10
- return ''; // Server-side, no cookies available
11
- }
12
- const name = `${cookieName}=`;
13
- const decodedCookie = decodeURIComponent(document.cookie);
14
- const cookies = decodedCookie.split(';');
15
- for (const cookie of cookies) {
16
- const c = cookie.trim();
17
- if (c.indexOf(name) === 0) {
18
- return c.substring(name.length);
19
- }
20
- }
21
- return '';
22
- }
23
- /**
24
- * Checks if a URL should skip CSRF protection based on configured patterns.
25
- */
26
- function shouldSkipCSRF(url, skipPatterns = []) {
27
- return skipPatterns.some((pattern) => {
28
- if (typeof pattern === 'string') {
29
- return url.includes(pattern);
30
- }
31
- return pattern.test(url);
32
- });
33
- }
34
- /**
35
- * Creates CSRF protection middleware with smart defaults.
36
- * Automatically adds CSRF tokens to state-changing requests.
37
- *
38
- * @param options - CSRF configuration options (all optional for "pit of success")
39
- * @returns CSRF middleware for use with FetchClient
40
- *
41
- * @example Basic usage (uses cookies automatically):
42
- * ```typescript
43
- * const client = new FetchClient();
44
- * const csrfClient = useCSRF(client);
45
- * ```
46
- *
47
- * @example Custom token provider:
48
- * ```typescript
49
- * const csrfClient = useCSRF(client, {
50
- * tokenProvider: () => localStorage.getItem('csrf-token') || ''
51
- * });
52
- * ```
53
- *
54
- * @example Skip external APIs:
55
- * ```typescript
56
- * const csrfClient = useCSRF(client, {
57
- * skipPatterns: [/^https:\/\/api\.external\.com\//, '/webhook/']
58
- * });
59
- * ```
60
- */
61
- export function createCSRFMiddleware(options = {}) {
62
- // Smart defaults for "pit of success"
63
- const { headerName = 'X-XSRF-TOKEN', cookieName = 'XSRF-TOKEN', protectedMethods = ['POST', 'PUT', 'PATCH', 'DELETE'], skipPatterns = [], tokenProvider = () => getTokenFromCookie(cookieName), } = options;
64
- return async (request, next) => {
65
- const method = (request.method || 'GET').toUpperCase();
66
- const url = request.url || '';
67
- // Skip CSRF protection if:
68
- // 1. Method is not in protected methods list
69
- // 2. URL matches a skip pattern
70
- if (!protectedMethods.includes(method) ||
71
- shouldSkipCSRF(url, skipPatterns)) {
72
- return next(request);
73
- }
74
- // Get CSRF token
75
- const token = tokenProvider();
76
- // Skip if no token available (let the server handle the error)
77
- if (!token) {
78
- return next(request);
79
- }
80
- // Add CSRF token to request headers
81
- const headers = new Headers(request.headers);
82
- headers.set(headerName, token);
83
- // Create modified request with CSRF header
84
- const modifiedRequest = {
85
- ...request,
86
- headers,
87
- };
88
- return next(modifiedRequest);
89
- };
90
- }
91
- //# sourceMappingURL=csrf.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../../src/middleware/csrf/csrf.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;GAGG;AACH,SAAS,kBAAkB,CAAC,aAAqB,YAAY;IAC3D,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC,CAAC,oCAAoC;IACjD,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,UAAU,GAAG,CAAC;IAC9B,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,GAAW,EACX,eAAoC,EAAE;IAEtC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAuB,EAAE;IAEzB,sCAAsC;IACtC,MAAM,EACJ,UAAU,GAAG,cAAc,EAC3B,UAAU,GAAG,YAAY,EACzB,gBAAgB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EACrD,YAAY,GAAG,EAAE,EACjB,aAAa,GAAG,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,GACrD,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;QAE9B,2BAA2B;QAC3B,6CAA6C;QAC7C,gCAAgC;QAChC,IACE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;YAClC,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,EACjC,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAE9B,+DAA+D;QAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,oCAAoC;QACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAE/B,2CAA2C;QAC3C,MAAM,eAAe,GAAG;YACtB,GAAG,OAAO;YACV,OAAO;SACR,CAAC;QAEF,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC"}
@@ -1,57 +0,0 @@
1
- /**
2
- * @fileoverview CSRF protection middleware - "pit of success" API.
3
- */
4
- import type { FetchClient } from '../../client/fetch-client';
5
- import type { CSRFOptions } from './types';
6
- export type { CSRFOptions, CSRFTokenProvider } from './types';
7
- export { createCSRFMiddleware } from './csrf';
8
- /**
9
- * "Pit of success" API for adding CSRF protection to a FetchClient.
10
- * Uses smart defaults that work with most web frameworks out of the box.
11
- *
12
- * Default behavior:
13
- * - Reads CSRF token from XSRF-TOKEN cookie
14
- * - Adds X-XSRF-TOKEN header to POST, PUT, PATCH, DELETE requests
15
- * - Skips GET/HEAD requests (they don't need CSRF protection)
16
- *
17
- * @param client - The FetchClient to add CSRF protection to
18
- * @param options - Optional CSRF configuration
19
- * @returns A new FetchClient with CSRF protection
20
- *
21
- * @example Basic usage (automatic cookie-based CSRF):
22
- * ```typescript
23
- * const client = new FetchClient();
24
- * const protectedClient = useCSRF(client);
25
- *
26
- * // CSRF token automatically added to POST requests
27
- * await protectedClient.post('/api/users', { name: 'John' });
28
- * ```
29
- *
30
- * @example Custom token provider:
31
- * ```typescript
32
- * const protectedClient = useCSRF(client, {
33
- * tokenProvider: () => localStorage.getItem('csrf-token') || ''
34
- * });
35
- * ```
36
- *
37
- * @example Custom header and cookie names:
38
- * ```typescript
39
- * const protectedClient = useCSRF(client, {
40
- * headerName: 'X-CSRF-Token',
41
- * cookieName: 'csrf-token'
42
- * });
43
- * ```
44
- *
45
- * @example Skip patterns for external APIs:
46
- * ```typescript
47
- * const protectedClient = useCSRF(client, {
48
- * skipPatterns: [
49
- * /^https:\/\/api\.external\.com\//, // Skip external API
50
- * '/webhook/', // Skip webhook endpoints
51
- * '/public-api/' // Skip public API endpoints
52
- * ]
53
- * });
54
- * ```
55
- */
56
- export declare function useCSRF(client: FetchClient, options?: CSRFOptions): FetchClient;
57
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/middleware/csrf/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,WAAgB,GACxB,WAAW,CAEb"}
@@ -1,57 +0,0 @@
1
- /**
2
- * @fileoverview CSRF protection middleware - "pit of success" API.
3
- */
4
- import { createCSRFMiddleware } from './csrf';
5
- export { createCSRFMiddleware } from './csrf';
6
- /**
7
- * "Pit of success" API for adding CSRF protection to a FetchClient.
8
- * Uses smart defaults that work with most web frameworks out of the box.
9
- *
10
- * Default behavior:
11
- * - Reads CSRF token from XSRF-TOKEN cookie
12
- * - Adds X-XSRF-TOKEN header to POST, PUT, PATCH, DELETE requests
13
- * - Skips GET/HEAD requests (they don't need CSRF protection)
14
- *
15
- * @param client - The FetchClient to add CSRF protection to
16
- * @param options - Optional CSRF configuration
17
- * @returns A new FetchClient with CSRF protection
18
- *
19
- * @example Basic usage (automatic cookie-based CSRF):
20
- * ```typescript
21
- * const client = new FetchClient();
22
- * const protectedClient = useCSRF(client);
23
- *
24
- * // CSRF token automatically added to POST requests
25
- * await protectedClient.post('/api/users', { name: 'John' });
26
- * ```
27
- *
28
- * @example Custom token provider:
29
- * ```typescript
30
- * const protectedClient = useCSRF(client, {
31
- * tokenProvider: () => localStorage.getItem('csrf-token') || ''
32
- * });
33
- * ```
34
- *
35
- * @example Custom header and cookie names:
36
- * ```typescript
37
- * const protectedClient = useCSRF(client, {
38
- * headerName: 'X-CSRF-Token',
39
- * cookieName: 'csrf-token'
40
- * });
41
- * ```
42
- *
43
- * @example Skip patterns for external APIs:
44
- * ```typescript
45
- * const protectedClient = useCSRF(client, {
46
- * skipPatterns: [
47
- * /^https:\/\/api\.external\.com\//, // Skip external API
48
- * '/webhook/', // Skip webhook endpoints
49
- * '/public-api/' // Skip public API endpoints
50
- * ]
51
- * });
52
- * ```
53
- */
54
- export function useCSRF(client, options = {}) {
55
- return client.use(createCSRFMiddleware(options));
56
- }
57
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/csrf/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAI9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,UAAU,OAAO,CACrB,MAAmB,EACnB,UAAuB,EAAE;IAEzB,OAAO,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC"}