@pureq/pureq 1.0.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 (295) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +932 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/scripts/benchmark.d.ts +2 -0
  8. package/dist/scripts/benchmark.d.ts.map +1 -0
  9. package/dist/scripts/benchmark.js +69 -0
  10. package/dist/scripts/benchmark.js.map +1 -0
  11. package/dist/scripts/edge-smoke-entry.d.ts +8 -0
  12. package/dist/scripts/edge-smoke-entry.d.ts.map +1 -0
  13. package/dist/scripts/edge-smoke-entry.js +23 -0
  14. package/dist/scripts/edge-smoke-entry.js.map +1 -0
  15. package/dist/src/adapters/fetchAdapter.d.ts +3 -0
  16. package/dist/src/adapters/fetchAdapter.d.ts.map +1 -0
  17. package/dist/src/adapters/fetchAdapter.js +4 -0
  18. package/dist/src/adapters/fetchAdapter.js.map +1 -0
  19. package/dist/src/adapters/instrumentedAdapter.d.ts +21 -0
  20. package/dist/src/adapters/instrumentedAdapter.d.ts.map +1 -0
  21. package/dist/src/adapters/instrumentedAdapter.js +25 -0
  22. package/dist/src/adapters/instrumentedAdapter.js.map +1 -0
  23. package/dist/src/client/createClient.d.ts +193 -0
  24. package/dist/src/client/createClient.d.ts.map +1 -0
  25. package/dist/src/client/createClient.js +310 -0
  26. package/dist/src/client/createClient.js.map +1 -0
  27. package/dist/src/executor/execute.d.ts +19 -0
  28. package/dist/src/executor/execute.d.ts.map +1 -0
  29. package/dist/src/executor/execute.js +121 -0
  30. package/dist/src/executor/execute.js.map +1 -0
  31. package/dist/src/index.d.ts +37 -0
  32. package/dist/src/index.d.ts.map +1 -0
  33. package/dist/src/index.js +36 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/middleware/circuitBreaker.d.ts +77 -0
  36. package/dist/src/middleware/circuitBreaker.d.ts.map +1 -0
  37. package/dist/src/middleware/circuitBreaker.js +246 -0
  38. package/dist/src/middleware/circuitBreaker.js.map +1 -0
  39. package/dist/src/middleware/circuitBreakerKeys.d.ts +5 -0
  40. package/dist/src/middleware/circuitBreakerKeys.d.ts.map +1 -0
  41. package/dist/src/middleware/circuitBreakerKeys.js +30 -0
  42. package/dist/src/middleware/circuitBreakerKeys.js.map +1 -0
  43. package/dist/src/middleware/compose.d.ts +9 -0
  44. package/dist/src/middleware/compose.d.ts.map +1 -0
  45. package/dist/src/middleware/compose.js +45 -0
  46. package/dist/src/middleware/compose.js.map +1 -0
  47. package/dist/src/middleware/concurrencyLimit.d.ts +11 -0
  48. package/dist/src/middleware/concurrencyLimit.d.ts.map +1 -0
  49. package/dist/src/middleware/concurrencyLimit.js +126 -0
  50. package/dist/src/middleware/concurrencyLimit.js.map +1 -0
  51. package/dist/src/middleware/deadline.d.ts +10 -0
  52. package/dist/src/middleware/deadline.d.ts.map +1 -0
  53. package/dist/src/middleware/deadline.js +99 -0
  54. package/dist/src/middleware/deadline.js.map +1 -0
  55. package/dist/src/middleware/dedupe.d.ts +13 -0
  56. package/dist/src/middleware/dedupe.d.ts.map +1 -0
  57. package/dist/src/middleware/dedupe.js +46 -0
  58. package/dist/src/middleware/dedupe.js.map +1 -0
  59. package/dist/src/middleware/defaultTimeout.d.ts +6 -0
  60. package/dist/src/middleware/defaultTimeout.d.ts.map +1 -0
  61. package/dist/src/middleware/defaultTimeout.js +23 -0
  62. package/dist/src/middleware/defaultTimeout.js.map +1 -0
  63. package/dist/src/middleware/diagnostics.d.ts +28 -0
  64. package/dist/src/middleware/diagnostics.d.ts.map +1 -0
  65. package/dist/src/middleware/diagnostics.js +131 -0
  66. package/dist/src/middleware/diagnostics.js.map +1 -0
  67. package/dist/src/middleware/diagnosticsExporters.d.ts +27 -0
  68. package/dist/src/middleware/diagnosticsExporters.d.ts.map +1 -0
  69. package/dist/src/middleware/diagnosticsExporters.js +45 -0
  70. package/dist/src/middleware/diagnosticsExporters.js.map +1 -0
  71. package/dist/src/middleware/hedge.d.ts +17 -0
  72. package/dist/src/middleware/hedge.d.ts.map +1 -0
  73. package/dist/src/middleware/hedge.js +125 -0
  74. package/dist/src/middleware/hedge.js.map +1 -0
  75. package/dist/src/middleware/httpCache.d.ts +14 -0
  76. package/dist/src/middleware/httpCache.d.ts.map +1 -0
  77. package/dist/src/middleware/httpCache.js +126 -0
  78. package/dist/src/middleware/httpCache.js.map +1 -0
  79. package/dist/src/middleware/idempotencyKey.d.ts +12 -0
  80. package/dist/src/middleware/idempotencyKey.d.ts.map +1 -0
  81. package/dist/src/middleware/idempotencyKey.js +33 -0
  82. package/dist/src/middleware/idempotencyKey.js.map +1 -0
  83. package/dist/src/middleware/offlineQueue.d.ts +78 -0
  84. package/dist/src/middleware/offlineQueue.d.ts.map +1 -0
  85. package/dist/src/middleware/offlineQueue.js +189 -0
  86. package/dist/src/middleware/offlineQueue.js.map +1 -0
  87. package/dist/src/middleware/presets.d.ts +31 -0
  88. package/dist/src/middleware/presets.d.ts.map +1 -0
  89. package/dist/src/middleware/presets.js +122 -0
  90. package/dist/src/middleware/presets.js.map +1 -0
  91. package/dist/src/middleware/retry.d.ts +27 -0
  92. package/dist/src/middleware/retry.d.ts.map +1 -0
  93. package/dist/src/middleware/retry.js +189 -0
  94. package/dist/src/middleware/retry.js.map +1 -0
  95. package/dist/src/middleware/stalePolicy.d.ts +14 -0
  96. package/dist/src/middleware/stalePolicy.d.ts.map +1 -0
  97. package/dist/src/middleware/stalePolicy.js +13 -0
  98. package/dist/src/middleware/stalePolicy.js.map +1 -0
  99. package/dist/src/observability/otelMapping.d.ts +13 -0
  100. package/dist/src/observability/otelMapping.d.ts.map +1 -0
  101. package/dist/src/observability/otelMapping.js +31 -0
  102. package/dist/src/observability/otelMapping.js.map +1 -0
  103. package/dist/src/observability/otelProfiles.d.ts +16 -0
  104. package/dist/src/observability/otelProfiles.d.ts.map +1 -0
  105. package/dist/src/observability/otelProfiles.js +66 -0
  106. package/dist/src/observability/otelProfiles.js.map +1 -0
  107. package/dist/src/observability/redaction.d.ts +39 -0
  108. package/dist/src/observability/redaction.d.ts.map +1 -0
  109. package/dist/src/observability/redaction.js +112 -0
  110. package/dist/src/observability/redaction.js.map +1 -0
  111. package/dist/src/policy/guardrails.d.ts +14 -0
  112. package/dist/src/policy/guardrails.d.ts.map +1 -0
  113. package/dist/src/policy/guardrails.js +36 -0
  114. package/dist/src/policy/guardrails.js.map +1 -0
  115. package/dist/src/response/response.d.ts +58 -0
  116. package/dist/src/response/response.d.ts.map +1 -0
  117. package/dist/src/response/response.js +91 -0
  118. package/dist/src/response/response.js.map +1 -0
  119. package/dist/src/serializers/formUrlEncodedSerializer.d.ts +6 -0
  120. package/dist/src/serializers/formUrlEncodedSerializer.d.ts.map +1 -0
  121. package/dist/src/serializers/formUrlEncodedSerializer.js +38 -0
  122. package/dist/src/serializers/formUrlEncodedSerializer.js.map +1 -0
  123. package/dist/src/serializers/jsonBodySerializer.d.ts +3 -0
  124. package/dist/src/serializers/jsonBodySerializer.d.ts.map +1 -0
  125. package/dist/src/serializers/jsonBodySerializer.js +24 -0
  126. package/dist/src/serializers/jsonBodySerializer.js.map +1 -0
  127. package/dist/src/types/events.d.ts +49 -0
  128. package/dist/src/types/events.d.ts.map +1 -0
  129. package/dist/src/types/events.js +2 -0
  130. package/dist/src/types/events.js.map +1 -0
  131. package/dist/src/types/http.d.ts +78 -0
  132. package/dist/src/types/http.d.ts.map +1 -0
  133. package/dist/src/types/http.js +2 -0
  134. package/dist/src/types/http.js.map +1 -0
  135. package/dist/src/types/internal.d.ts +20 -0
  136. package/dist/src/types/internal.d.ts.map +1 -0
  137. package/dist/src/types/internal.js +2 -0
  138. package/dist/src/types/internal.js.map +1 -0
  139. package/dist/src/types/result.d.ts +32 -0
  140. package/dist/src/types/result.d.ts.map +1 -0
  141. package/dist/src/types/result.js +66 -0
  142. package/dist/src/types/result.js.map +1 -0
  143. package/dist/src/utils/crypto.d.ts +8 -0
  144. package/dist/src/utils/crypto.d.ts.map +1 -0
  145. package/dist/src/utils/crypto.js +21 -0
  146. package/dist/src/utils/crypto.js.map +1 -0
  147. package/dist/src/utils/policyTrace.d.ts +17 -0
  148. package/dist/src/utils/policyTrace.d.ts.map +1 -0
  149. package/dist/src/utils/policyTrace.js +34 -0
  150. package/dist/src/utils/policyTrace.js.map +1 -0
  151. package/dist/src/utils/stableKey.d.ts +17 -0
  152. package/dist/src/utils/stableKey.d.ts.map +1 -0
  153. package/dist/src/utils/stableKey.js +41 -0
  154. package/dist/src/utils/stableKey.js.map +1 -0
  155. package/dist/src/utils/url.d.ts +22 -0
  156. package/dist/src/utils/url.d.ts.map +1 -0
  157. package/dist/src/utils/url.js +2 -0
  158. package/dist/src/utils/url.js.map +1 -0
  159. package/dist/tests/adapter-serializer.test.d.ts +2 -0
  160. package/dist/tests/adapter-serializer.test.d.ts.map +1 -0
  161. package/dist/tests/adapter-serializer.test.js +59 -0
  162. package/dist/tests/adapter-serializer.test.js.map +1 -0
  163. package/dist/tests/browser-runtime.smoke.test.d.ts +2 -0
  164. package/dist/tests/browser-runtime.smoke.test.d.ts.map +1 -0
  165. package/dist/tests/browser-runtime.smoke.test.js +17 -0
  166. package/dist/tests/browser-runtime.smoke.test.js.map +1 -0
  167. package/dist/tests/circuit-breaker.test.d.ts +2 -0
  168. package/dist/tests/circuit-breaker.test.d.ts.map +1 -0
  169. package/dist/tests/circuit-breaker.test.js +184 -0
  170. package/dist/tests/circuit-breaker.test.js.map +1 -0
  171. package/dist/tests/client.integration.d.ts +2 -0
  172. package/dist/tests/client.integration.d.ts.map +1 -0
  173. package/dist/tests/client.integration.js +44 -0
  174. package/dist/tests/client.integration.js.map +1 -0
  175. package/dist/tests/client.integration.test.d.ts +2 -0
  176. package/dist/tests/client.integration.test.d.ts.map +1 -0
  177. package/dist/tests/client.integration.test.js +63 -0
  178. package/dist/tests/client.integration.test.js.map +1 -0
  179. package/dist/tests/compose.test.d.ts +2 -0
  180. package/dist/tests/compose.test.d.ts.map +1 -0
  181. package/dist/tests/compose.test.js +24 -0
  182. package/dist/tests/compose.test.js.map +1 -0
  183. package/dist/tests/concurrency-limit.test.d.ts +2 -0
  184. package/dist/tests/concurrency-limit.test.d.ts.map +1 -0
  185. package/dist/tests/concurrency-limit.test.js +87 -0
  186. package/dist/tests/concurrency-limit.test.js.map +1 -0
  187. package/dist/tests/deadline-middleware.test.d.ts +2 -0
  188. package/dist/tests/deadline-middleware.test.d.ts.map +1 -0
  189. package/dist/tests/deadline-middleware.test.js +38 -0
  190. package/dist/tests/deadline-middleware.test.js.map +1 -0
  191. package/dist/tests/dedupe-middleware.test.d.ts +2 -0
  192. package/dist/tests/dedupe-middleware.test.d.ts.map +1 -0
  193. package/dist/tests/dedupe-middleware.test.js +56 -0
  194. package/dist/tests/dedupe-middleware.test.js.map +1 -0
  195. package/dist/tests/default-timeout.test.d.ts +2 -0
  196. package/dist/tests/default-timeout.test.d.ts.map +1 -0
  197. package/dist/tests/default-timeout.test.js +28 -0
  198. package/dist/tests/default-timeout.test.js.map +1 -0
  199. package/dist/tests/diagnostics-exporters.test.d.ts +2 -0
  200. package/dist/tests/diagnostics-exporters.test.d.ts.map +1 -0
  201. package/dist/tests/diagnostics-exporters.test.js +41 -0
  202. package/dist/tests/diagnostics-exporters.test.js.map +1 -0
  203. package/dist/tests/diagnostics.test.d.ts +2 -0
  204. package/dist/tests/diagnostics.test.d.ts.map +1 -0
  205. package/dist/tests/diagnostics.test.js +38 -0
  206. package/dist/tests/diagnostics.test.js.map +1 -0
  207. package/dist/tests/error-metadata.test.d.ts +2 -0
  208. package/dist/tests/error-metadata.test.d.ts.map +1 -0
  209. package/dist/tests/error-metadata.test.js +23 -0
  210. package/dist/tests/error-metadata.test.js.map +1 -0
  211. package/dist/tests/execute-timeout.test.d.ts +2 -0
  212. package/dist/tests/execute-timeout.test.d.ts.map +1 -0
  213. package/dist/tests/execute-timeout.test.js +30 -0
  214. package/dist/tests/execute-timeout.test.js.map +1 -0
  215. package/dist/tests/form-serializer.test.d.ts +2 -0
  216. package/dist/tests/form-serializer.test.d.ts.map +1 -0
  217. package/dist/tests/form-serializer.test.js +16 -0
  218. package/dist/tests/form-serializer.test.js.map +1 -0
  219. package/dist/tests/hedge.test.d.ts +2 -0
  220. package/dist/tests/hedge.test.d.ts.map +1 -0
  221. package/dist/tests/hedge.test.js +45 -0
  222. package/dist/tests/hedge.test.js.map +1 -0
  223. package/dist/tests/http-cache.test.d.ts +2 -0
  224. package/dist/tests/http-cache.test.d.ts.map +1 -0
  225. package/dist/tests/http-cache.test.js +60 -0
  226. package/dist/tests/http-cache.test.js.map +1 -0
  227. package/dist/tests/idempotency-key.test.d.ts +2 -0
  228. package/dist/tests/idempotency-key.test.d.ts.map +1 -0
  229. package/dist/tests/idempotency-key.test.js +31 -0
  230. package/dist/tests/idempotency-key.test.js.map +1 -0
  231. package/dist/tests/instrumented-adapter.test.d.ts +2 -0
  232. package/dist/tests/instrumented-adapter.test.d.ts.map +1 -0
  233. package/dist/tests/instrumented-adapter.test.js +33 -0
  234. package/dist/tests/instrumented-adapter.test.js.map +1 -0
  235. package/dist/tests/interceptor-order.test.d.ts +2 -0
  236. package/dist/tests/interceptor-order.test.d.ts.map +1 -0
  237. package/dist/tests/interceptor-order.test.js +38 -0
  238. package/dist/tests/interceptor-order.test.js.map +1 -0
  239. package/dist/tests/json-helper.test.d.ts +2 -0
  240. package/dist/tests/json-helper.test.d.ts.map +1 -0
  241. package/dist/tests/json-helper.test.js +42 -0
  242. package/dist/tests/json-helper.test.js.map +1 -0
  243. package/dist/tests/observability.test.d.ts +2 -0
  244. package/dist/tests/observability.test.d.ts.map +1 -0
  245. package/dist/tests/observability.test.js +59 -0
  246. package/dist/tests/observability.test.js.map +1 -0
  247. package/dist/tests/offline-queue.test.d.ts +2 -0
  248. package/dist/tests/offline-queue.test.d.ts.map +1 -0
  249. package/dist/tests/offline-queue.test.js +35 -0
  250. package/dist/tests/offline-queue.test.js.map +1 -0
  251. package/dist/tests/otel-mapping.test.d.ts +2 -0
  252. package/dist/tests/otel-mapping.test.d.ts.map +1 -0
  253. package/dist/tests/otel-mapping.test.js +20 -0
  254. package/dist/tests/otel-mapping.test.js.map +1 -0
  255. package/dist/tests/policy-guardrails.test.d.ts +2 -0
  256. package/dist/tests/policy-guardrails.test.d.ts.map +1 -0
  257. package/dist/tests/policy-guardrails.test.js +25 -0
  258. package/dist/tests/policy-guardrails.test.js.map +1 -0
  259. package/dist/tests/presets.test.d.ts +2 -0
  260. package/dist/tests/presets.test.d.ts.map +1 -0
  261. package/dist/tests/presets.test.js +41 -0
  262. package/dist/tests/presets.test.js.map +1 -0
  263. package/dist/tests/public-api.contract.d.ts +2 -0
  264. package/dist/tests/public-api.contract.d.ts.map +1 -0
  265. package/dist/tests/public-api.contract.js +14 -0
  266. package/dist/tests/public-api.contract.js.map +1 -0
  267. package/dist/tests/public-api.contract.test.d.ts +2 -0
  268. package/dist/tests/public-api.contract.test.d.ts.map +1 -0
  269. package/dist/tests/public-api.contract.test.js +25 -0
  270. package/dist/tests/public-api.contract.test.js.map +1 -0
  271. package/dist/tests/redaction.test.d.ts +2 -0
  272. package/dist/tests/redaction.test.d.ts.map +1 -0
  273. package/dist/tests/redaction.test.js +23 -0
  274. package/dist/tests/redaction.test.js.map +1 -0
  275. package/dist/tests/retry-after-budget.test.d.ts +2 -0
  276. package/dist/tests/retry-after-budget.test.d.ts.map +1 -0
  277. package/dist/tests/retry-after-budget.test.js +72 -0
  278. package/dist/tests/retry-after-budget.test.js.map +1 -0
  279. package/dist/tests/retry-policy-trace.test.d.ts +2 -0
  280. package/dist/tests/retry-policy-trace.test.d.ts.map +1 -0
  281. package/dist/tests/retry-policy-trace.test.js +35 -0
  282. package/dist/tests/retry-policy-trace.test.js.map +1 -0
  283. package/dist/tests/retry-policy.test.d.ts +2 -0
  284. package/dist/tests/retry-policy.test.d.ts.map +1 -0
  285. package/dist/tests/retry-policy.test.js +51 -0
  286. package/dist/tests/retry-policy.test.js.map +1 -0
  287. package/dist/tests/retry.stress.d.ts +2 -0
  288. package/dist/tests/retry.stress.d.ts.map +1 -0
  289. package/dist/tests/retry.stress.js +21 -0
  290. package/dist/tests/retry.stress.js.map +1 -0
  291. package/dist/tests/retry.stress.test.d.ts +2 -0
  292. package/dist/tests/retry.stress.test.d.ts.map +1 -0
  293. package/dist/tests/retry.stress.test.js +21 -0
  294. package/dist/tests/retry.stress.test.js.map +1 -0
  295. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpCache.js","sourceRoot":"","sources":["../../../src/middleware/httpCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Middleware, RequestConfig } from "../types/http";
2
+ export interface IdempotencyKeyOptions {
3
+ readonly methods?: readonly RequestConfig["method"][];
4
+ readonly headerName?: string;
5
+ readonly onlyIfBodyPresent?: boolean;
6
+ readonly keyFactory?: () => string;
7
+ }
8
+ /**
9
+ * Adds idempotency key headers for mutation requests when absent.
10
+ */
11
+ export declare function idempotencyKey(options?: IdempotencyKeyOptions): Middleware;
12
+ //# sourceMappingURL=idempotencyKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotencyKey.d.ts","sourceRoot":"","sources":["../../../src/middleware/idempotencyKey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,UAAU,CAkC9E"}
@@ -0,0 +1,33 @@
1
+ import { generateSecureId } from "../utils/crypto";
2
+ /**
3
+ * Adds idempotency key headers for mutation requests when absent.
4
+ */
5
+ export function idempotencyKey(options = {}) {
6
+ const methods = new Set(options.methods ?? ["POST", "PUT", "PATCH", "DELETE"]);
7
+ const headerName = options.headerName ?? "Idempotency-Key";
8
+ const onlyIfBodyPresent = options.onlyIfBodyPresent ?? false;
9
+ const keyFactory = options.keyFactory ?? (() => generateSecureId("idem"));
10
+ return async (req, next) => {
11
+ if (!methods.has(req.method)) {
12
+ return next(req);
13
+ }
14
+ if (onlyIfBodyPresent && req.body === undefined) {
15
+ return next(req);
16
+ }
17
+ // Use case-insensitive header lookup to avoid double-setting
18
+ const existingHeaderValue = req.headers &&
19
+ Object.entries(req.headers).find(([k]) => k.toLowerCase() === headerName.toLowerCase())?.[1];
20
+ if (existingHeaderValue) {
21
+ return next(req);
22
+ }
23
+ const nextReq = {
24
+ ...req,
25
+ headers: {
26
+ ...(req.headers ?? {}),
27
+ [headerName]: keyFactory(),
28
+ },
29
+ };
30
+ return next(nextReq);
31
+ };
32
+ }
33
+ //# sourceMappingURL=idempotencyKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotencyKey.js","sourceRoot":"","sources":["../../../src/middleware/idempotencyKey.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AASnD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAiC,EAAE;IAChE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,KAAK,CAAC;IAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IAE1E,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,iBAAiB,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,6DAA6D;QAC7D,MAAM,mBAAmB,GAAG,GAAG,CAAC,OAAO;YACrC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAC9B,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CACtD,EAAE,CAAC,CAAC,CAAC,CAAC;QACT,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAkB;YAC7B,GAAG,GAAG;YACN,OAAO,EAAE;gBACP,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;gBACtB,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE;aAC3B;SACF,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { Middleware, RequestConfig } from "../types/http";
2
+ import type { HttpResponse } from "../response/response";
3
+ export interface OfflineQueueHooks {
4
+ readonly onQueued?: (event: {
5
+ readonly id: number;
6
+ readonly method: RequestConfig["method"];
7
+ readonly url: string;
8
+ readonly at: number;
9
+ }) => void;
10
+ readonly onReplayed?: (event: {
11
+ readonly id: number;
12
+ readonly method: RequestConfig["method"];
13
+ readonly url: string;
14
+ readonly at: number;
15
+ readonly status: number;
16
+ }) => void;
17
+ readonly onReplayError?: (event: {
18
+ readonly id: number;
19
+ readonly method: RequestConfig["method"];
20
+ readonly url: string;
21
+ readonly at: number;
22
+ readonly error: unknown;
23
+ }) => void;
24
+ }
25
+ export interface OfflineQueueOptions {
26
+ readonly methods?: readonly RequestConfig["method"][];
27
+ readonly isOffline?: () => boolean;
28
+ readonly maxQueueSize?: number;
29
+ readonly hooks?: OfflineQueueHooks;
30
+ readonly storage?: OfflineQueueStorageAdapter;
31
+ readonly generateId?: () => number | Promise<number>;
32
+ }
33
+ export interface QueuedRequest {
34
+ readonly id: number;
35
+ readonly req: RequestConfig;
36
+ readonly queuedAt: number;
37
+ }
38
+ export interface OfflineQueueStorageAdapter {
39
+ readonly push: (item: QueuedRequest) => Promise<void> | void;
40
+ readonly getAll: () => Promise<readonly QueuedRequest[]> | readonly QueuedRequest[];
41
+ readonly remove: (id: number) => Promise<void> | void;
42
+ readonly clear: () => Promise<void> | void;
43
+ readonly size: () => Promise<number> | number;
44
+ }
45
+ export declare class InMemoryQueueStorageAdapter implements OfflineQueueStorageAdapter {
46
+ private queue;
47
+ push(item: QueuedRequest): void;
48
+ getAll(): readonly QueuedRequest[];
49
+ remove(id: number): void;
50
+ clear(): void;
51
+ size(): number;
52
+ }
53
+ export interface OfflineQueueSnapshot {
54
+ readonly size: number;
55
+ readonly items: readonly {
56
+ readonly id: number;
57
+ readonly method: RequestConfig["method"];
58
+ readonly url: string;
59
+ readonly queuedAt: number;
60
+ }[];
61
+ }
62
+ export interface OfflineQueueController {
63
+ readonly middleware: Middleware;
64
+ readonly flush: (replay: (req: RequestConfig) => Promise<HttpResponse>, options?: {
65
+ readonly concurrency?: number;
66
+ }) => Promise<readonly HttpResponse[]>;
67
+ readonly snapshot: () => Promise<OfflineQueueSnapshot>;
68
+ readonly clear: () => Promise<void>;
69
+ }
70
+ /**
71
+ * Creates an offline queue controller for safe mutation replay in browser-like contexts.
72
+ */
73
+ export declare function createOfflineQueue(options?: OfflineQueueOptions): OfflineQueueController;
74
+ /**
75
+ * Middleware shortcut when queue controls are not needed directly.
76
+ */
77
+ export declare function offlineQueue(options?: OfflineQueueOptions): Middleware;
78
+ //# sourceMappingURL=offlineQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offlineQueue.d.ts","sourceRoot":"","sources":["../../../src/middleware/offlineQueue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,189 @@
1
+ import { markPolicyMiddleware } from "../policy/guardrails";
2
+ import { HttpResponse as PureqHttpResponse } from "../response/response";
3
+ import { appendPolicyTrace } from "../utils/policyTrace";
4
+ export class InMemoryQueueStorageAdapter {
5
+ constructor() {
6
+ this.queue = [];
7
+ }
8
+ push(item) {
9
+ this.queue.push(item);
10
+ }
11
+ getAll() {
12
+ return [...this.queue];
13
+ }
14
+ remove(id) {
15
+ this.queue = this.queue.filter((item) => item.id !== id);
16
+ }
17
+ clear() {
18
+ this.queue.length = 0;
19
+ }
20
+ size() {
21
+ return this.queue.length;
22
+ }
23
+ }
24
+ // appendPolicyTrace is imported from ../utils/policyTrace
25
+ /**
26
+ * Creates a serializable copy of the request suitable for offline storage.
27
+ * Deliberately excludes AbortSignal since it is not serializable and
28
+ * would reference a stale controller upon replay.
29
+ */
30
+ function cloneRequestForQueue(req) {
31
+ return {
32
+ method: req.method,
33
+ url: req.url,
34
+ ...(req.params !== undefined ? { params: { ...req.params } } : {}),
35
+ ...(req.query !== undefined ? { query: req.query } : {}),
36
+ ...(req.body !== undefined ? { body: req.body } : {}),
37
+ ...(req.headers !== undefined ? { headers: { ...req.headers } } : {}),
38
+ ...(req.timeout !== undefined ? { timeout: req.timeout } : {}),
39
+ };
40
+ }
41
+ /**
42
+ * Creates an offline queue controller for safe mutation replay in browser-like contexts.
43
+ */
44
+ export function createOfflineQueue(options = {}) {
45
+ const methods = new Set(options.methods ?? ["POST", "PUT", "PATCH", "DELETE"]);
46
+ const maxQueueSize = options.maxQueueSize ?? 500;
47
+ const isOffline = options.isOffline ?? (() => {
48
+ if (typeof navigator === "undefined") {
49
+ return false;
50
+ }
51
+ return navigator.onLine === false;
52
+ });
53
+ const storage = options.storage ?? new InMemoryQueueStorageAdapter();
54
+ const hooks = options.hooks;
55
+ let nextIdCounter = 1;
56
+ const generateId = options.generateId ?? (() => nextIdCounter++);
57
+ const middleware = async (req, next) => {
58
+ if (!methods.has(req.method) || !isOffline()) {
59
+ return next(req);
60
+ }
61
+ const currentSize = await storage.size();
62
+ if (currentSize >= maxQueueSize) {
63
+ throw new Error("pureq: offline queue is full");
64
+ }
65
+ const id = await generateId();
66
+ const queuedAt = Date.now();
67
+ await storage.push({
68
+ id,
69
+ req: cloneRequestForQueue(req),
70
+ queuedAt,
71
+ });
72
+ appendPolicyTrace(req, {
73
+ policy: "offline-queue",
74
+ decision: "queued",
75
+ at: queuedAt,
76
+ reason: "offline mode",
77
+ key: `${req.method}:${req.url}`,
78
+ });
79
+ hooks?.onQueued?.({ id, method: req.method, url: req.url, at: queuedAt });
80
+ return new PureqHttpResponse(new Response(JSON.stringify({ queued: true, queueId: id }), {
81
+ status: 202,
82
+ headers: { "content-type": "application/json" },
83
+ }));
84
+ };
85
+ const flush = async (replay, options) => {
86
+ const pending = await storage.getAll();
87
+ const concurrency = options?.concurrency ?? 1;
88
+ const responses = [];
89
+ if (concurrency <= 1) {
90
+ // Sequential replay (default, safest for ordering guarantees)
91
+ for (const item of pending) {
92
+ try {
93
+ const response = await replay(item.req);
94
+ responses.push(response);
95
+ // Remove from queue only after successful replay.
96
+ // NOTE: If the app crashes between successful replay and this removal,
97
+ // the request might be replayed again upon restart. It is strongly recommended
98
+ // to use `idempotencyKey` middleware to prevent duplicate operations on the backend.
99
+ await storage.remove(item.id);
100
+ hooks?.onReplayed?.({
101
+ id: item.id,
102
+ method: item.req.method,
103
+ url: item.req.url,
104
+ at: Date.now(),
105
+ status: response.status,
106
+ });
107
+ }
108
+ catch (error) {
109
+ // Leave in storage on failure (defer to next flush or retry budgets)
110
+ hooks?.onReplayError?.({
111
+ id: item.id,
112
+ method: item.req.method,
113
+ url: item.req.url,
114
+ at: Date.now(),
115
+ error,
116
+ });
117
+ }
118
+ }
119
+ }
120
+ else {
121
+ // Concurrent replay in batches of `concurrency`
122
+ for (let i = 0; i < pending.length; i += concurrency) {
123
+ const batch = pending.slice(i, i + concurrency);
124
+ const results = await Promise.allSettled(batch.map(async (item) => {
125
+ const response = await replay(item.req);
126
+ await storage.remove(item.id);
127
+ hooks?.onReplayed?.({
128
+ id: item.id,
129
+ method: item.req.method,
130
+ url: item.req.url,
131
+ at: Date.now(),
132
+ status: response.status,
133
+ });
134
+ return response;
135
+ }));
136
+ for (let j = 0; j < results.length; j++) {
137
+ const result = results[j];
138
+ if (result && result.status === "fulfilled") {
139
+ responses.push(result.value);
140
+ }
141
+ else if (result && result.status === "rejected") {
142
+ const item = batch[j];
143
+ if (item) {
144
+ hooks?.onReplayError?.({
145
+ id: item.id,
146
+ method: item.req.method,
147
+ url: item.req.url,
148
+ at: Date.now(),
149
+ error: result.reason,
150
+ });
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ return responses;
157
+ };
158
+ const snapshot = async () => {
159
+ const items = await storage.getAll();
160
+ return {
161
+ size: items.length,
162
+ items: items.map((item) => ({
163
+ id: item.id,
164
+ method: item.req.method,
165
+ url: item.req.url,
166
+ queuedAt: item.queuedAt,
167
+ })),
168
+ };
169
+ };
170
+ const clear = async () => {
171
+ await storage.clear();
172
+ };
173
+ return {
174
+ middleware: markPolicyMiddleware(middleware, {
175
+ name: "offlineQueue",
176
+ kind: "cache",
177
+ }),
178
+ flush,
179
+ snapshot,
180
+ clear,
181
+ };
182
+ }
183
+ /**
184
+ * Middleware shortcut when queue controls are not needed directly.
185
+ */
186
+ export function offlineQueue(options = {}) {
187
+ return createOfflineQueue(options).middleware;
188
+ }
189
+ //# sourceMappingURL=offlineQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offlineQueue.js","sourceRoot":"","sources":["../../../src/middleware/offlineQueue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Middleware } from "../types/http";
2
+ import { type CircuitBreakerOptions } from "./circuitBreaker";
3
+ import { type DedupeOptions } from "./dedupe";
4
+ import { type RetryOptions } from "./retry";
5
+ import { type IdempotencyKeyOptions } from "./idempotencyKey";
6
+ export interface ResilientPresetOptions {
7
+ readonly dedupe?: false | DedupeOptions;
8
+ readonly retry?: RetryOptions;
9
+ readonly circuitBreaker?: CircuitBreakerOptions;
10
+ readonly idempotencyKey?: false | IdempotencyKeyOptions;
11
+ }
12
+ export interface PresetProfileOptions extends ResilientPresetOptions {
13
+ readonly requestTimeoutMs?: number;
14
+ }
15
+ /**
16
+ * Production-ready middleware stack preset for fetch/axios replacement use cases.
17
+ */
18
+ export declare function resilientPreset(options?: ResilientPresetOptions): readonly Middleware[];
19
+ /**
20
+ * Frontend-focused preset with conservative retries for user-facing responsiveness.
21
+ */
22
+ export declare function frontendPreset(options?: PresetProfileOptions): readonly Middleware[];
23
+ /**
24
+ * BFF-focused preset balancing latency and upstream stability.
25
+ */
26
+ export declare function bffPreset(options?: PresetProfileOptions): readonly Middleware[];
27
+ /**
28
+ * Backend-focused preset prioritizing dependency resilience under sustained load.
29
+ */
30
+ export declare function backendPreset(options?: PresetProfileOptions): readonly Middleware[];
31
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../src/middleware/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAG9E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IAChD,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,GAAG,qBAAqB,CAAC;CACzD;AAED,MAAM,WAAW,oBAAqB,SAAQ,sBAAsB;IAClE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAyBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,SAAS,UAAU,EAAE,CAiC3F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,oBAAyB,GAAG,SAAS,UAAU,EAAE,CA2BxF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,oBAAyB,GAAG,SAAS,UAAU,EAAE,CA4BnF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,SAAS,UAAU,EAAE,CA4BvF"}
@@ -0,0 +1,122 @@
1
+ import { circuitBreaker } from "./circuitBreaker";
2
+ import { dedupe } from "./dedupe";
3
+ import { retry } from "./retry";
4
+ import { idempotencyKey } from "./idempotencyKey";
5
+ import { defaultTimeout } from "./defaultTimeout";
6
+ function mergeRetry(defaults, override) {
7
+ if (!override) {
8
+ return defaults;
9
+ }
10
+ return {
11
+ ...defaults,
12
+ ...override,
13
+ };
14
+ }
15
+ function mergeCircuitBreaker(defaults, override) {
16
+ if (!override) {
17
+ return defaults;
18
+ }
19
+ return {
20
+ ...defaults,
21
+ ...override,
22
+ };
23
+ }
24
+ /**
25
+ * Production-ready middleware stack preset for fetch/axios replacement use cases.
26
+ */
27
+ export function resilientPreset(options = {}) {
28
+ const stack = [];
29
+ if (options.dedupe !== false) {
30
+ stack.push(dedupe(options.dedupe));
31
+ }
32
+ if (options.idempotencyKey !== false) {
33
+ stack.push(idempotencyKey(options.idempotencyKey));
34
+ }
35
+ stack.push(retry(options.retry ?? {
36
+ maxRetries: 2,
37
+ delay: 200,
38
+ backoff: true,
39
+ retryOnStatus: [429, 500, 502, 503, 504],
40
+ }));
41
+ stack.push(circuitBreaker(options.circuitBreaker ?? {
42
+ failureThreshold: 5,
43
+ successThreshold: 1,
44
+ cooldownMs: 30000,
45
+ }));
46
+ return stack;
47
+ }
48
+ /**
49
+ * Frontend-focused preset with conservative retries for user-facing responsiveness.
50
+ */
51
+ export function frontendPreset(options = {}) {
52
+ const timeoutMs = options.requestTimeoutMs ?? 5000;
53
+ return [
54
+ defaultTimeout(timeoutMs),
55
+ ...resilientPreset({
56
+ ...options,
57
+ dedupe: options.dedupe ?? { methods: ["GET", "HEAD"] },
58
+ retry: mergeRetry({
59
+ maxRetries: 1,
60
+ delay: 150,
61
+ backoff: true,
62
+ retryOnStatus: [429, 500, 502, 503, 504],
63
+ }, options.retry),
64
+ circuitBreaker: mergeCircuitBreaker({
65
+ failureThreshold: 4,
66
+ successThreshold: 1,
67
+ cooldownMs: 10000,
68
+ }, options.circuitBreaker),
69
+ }),
70
+ ];
71
+ }
72
+ /**
73
+ * BFF-focused preset balancing latency and upstream stability.
74
+ */
75
+ export function bffPreset(options = {}) {
76
+ const timeoutMs = options.requestTimeoutMs ?? 3000;
77
+ return [
78
+ defaultTimeout(timeoutMs),
79
+ ...resilientPreset({
80
+ ...options,
81
+ dedupe: options.dedupe ?? { methods: ["GET", "HEAD"] },
82
+ idempotencyKey: options.idempotencyKey ?? { onlyIfBodyPresent: true },
83
+ retry: mergeRetry({
84
+ maxRetries: 2,
85
+ delay: 200,
86
+ backoff: true,
87
+ retryOnStatus: [429, 500, 502, 503, 504],
88
+ }, options.retry),
89
+ circuitBreaker: mergeCircuitBreaker({
90
+ failureThreshold: 5,
91
+ successThreshold: 1,
92
+ cooldownMs: 20000,
93
+ }, options.circuitBreaker),
94
+ }),
95
+ ];
96
+ }
97
+ /**
98
+ * Backend-focused preset prioritizing dependency resilience under sustained load.
99
+ */
100
+ export function backendPreset(options = {}) {
101
+ const timeoutMs = options.requestTimeoutMs ?? 2500;
102
+ return [
103
+ defaultTimeout(timeoutMs),
104
+ ...resilientPreset({
105
+ ...options,
106
+ dedupe: options.dedupe ?? false,
107
+ idempotencyKey: options.idempotencyKey ?? { onlyIfBodyPresent: true },
108
+ retry: mergeRetry({
109
+ maxRetries: 3,
110
+ delay: 250,
111
+ backoff: true,
112
+ retryOnStatus: [408, 425, 429, 500, 502, 503, 504],
113
+ }, options.retry),
114
+ circuitBreaker: mergeCircuitBreaker({
115
+ failureThreshold: 6,
116
+ successThreshold: 2,
117
+ cooldownMs: 30000,
118
+ }, options.circuitBreaker),
119
+ }),
120
+ ];
121
+ }
122
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/middleware/presets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Middleware } from "../types/http";
2
+ export interface RetryOptions {
3
+ readonly maxRetries: number;
4
+ readonly delay?: number;
5
+ readonly backoff?: boolean;
6
+ readonly maxDelay?: number;
7
+ readonly retryBudgetMs?: number;
8
+ readonly retryOnStatus?: readonly number[];
9
+ readonly retryOnNetworkError?: boolean;
10
+ readonly respectRetryAfter?: boolean;
11
+ readonly retryAfterHeaderName?: string;
12
+ readonly onRetry?: (event: {
13
+ readonly attempt: number;
14
+ readonly waitTime: number;
15
+ readonly status?: number;
16
+ readonly error?: unknown;
17
+ readonly retryAfterMs?: number;
18
+ readonly budgetRemainingMs?: number;
19
+ readonly source: "status" | "network";
20
+ }) => void;
21
+ }
22
+ /**
23
+ * pureq Retry Middleware
24
+ * Implements exponential backoff strategy for network failures or configured status codes.
25
+ */
26
+ export declare function retry(options: RetryOptions): Middleware;
27
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/middleware/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,eAAe,CAAC;AAK/D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;KACvC,KAAK,IAAI,CAAC;CACZ;AA4DD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,CAiKvD"}