@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.
- package/LICENSE.md +21 -0
- package/README.md +932 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/scripts/benchmark.d.ts +2 -0
- package/dist/scripts/benchmark.d.ts.map +1 -0
- package/dist/scripts/benchmark.js +69 -0
- package/dist/scripts/benchmark.js.map +1 -0
- package/dist/scripts/edge-smoke-entry.d.ts +8 -0
- package/dist/scripts/edge-smoke-entry.d.ts.map +1 -0
- package/dist/scripts/edge-smoke-entry.js +23 -0
- package/dist/scripts/edge-smoke-entry.js.map +1 -0
- package/dist/src/adapters/fetchAdapter.d.ts +3 -0
- package/dist/src/adapters/fetchAdapter.d.ts.map +1 -0
- package/dist/src/adapters/fetchAdapter.js +4 -0
- package/dist/src/adapters/fetchAdapter.js.map +1 -0
- package/dist/src/adapters/instrumentedAdapter.d.ts +21 -0
- package/dist/src/adapters/instrumentedAdapter.d.ts.map +1 -0
- package/dist/src/adapters/instrumentedAdapter.js +25 -0
- package/dist/src/adapters/instrumentedAdapter.js.map +1 -0
- package/dist/src/client/createClient.d.ts +193 -0
- package/dist/src/client/createClient.d.ts.map +1 -0
- package/dist/src/client/createClient.js +310 -0
- package/dist/src/client/createClient.js.map +1 -0
- package/dist/src/executor/execute.d.ts +19 -0
- package/dist/src/executor/execute.d.ts.map +1 -0
- package/dist/src/executor/execute.js +121 -0
- package/dist/src/executor/execute.js.map +1 -0
- package/dist/src/index.d.ts +37 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +36 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/middleware/circuitBreaker.d.ts +77 -0
- package/dist/src/middleware/circuitBreaker.d.ts.map +1 -0
- package/dist/src/middleware/circuitBreaker.js +246 -0
- package/dist/src/middleware/circuitBreaker.js.map +1 -0
- package/dist/src/middleware/circuitBreakerKeys.d.ts +5 -0
- package/dist/src/middleware/circuitBreakerKeys.d.ts.map +1 -0
- package/dist/src/middleware/circuitBreakerKeys.js +30 -0
- package/dist/src/middleware/circuitBreakerKeys.js.map +1 -0
- package/dist/src/middleware/compose.d.ts +9 -0
- package/dist/src/middleware/compose.d.ts.map +1 -0
- package/dist/src/middleware/compose.js +45 -0
- package/dist/src/middleware/compose.js.map +1 -0
- package/dist/src/middleware/concurrencyLimit.d.ts +11 -0
- package/dist/src/middleware/concurrencyLimit.d.ts.map +1 -0
- package/dist/src/middleware/concurrencyLimit.js +126 -0
- package/dist/src/middleware/concurrencyLimit.js.map +1 -0
- package/dist/src/middleware/deadline.d.ts +10 -0
- package/dist/src/middleware/deadline.d.ts.map +1 -0
- package/dist/src/middleware/deadline.js +99 -0
- package/dist/src/middleware/deadline.js.map +1 -0
- package/dist/src/middleware/dedupe.d.ts +13 -0
- package/dist/src/middleware/dedupe.d.ts.map +1 -0
- package/dist/src/middleware/dedupe.js +46 -0
- package/dist/src/middleware/dedupe.js.map +1 -0
- package/dist/src/middleware/defaultTimeout.d.ts +6 -0
- package/dist/src/middleware/defaultTimeout.d.ts.map +1 -0
- package/dist/src/middleware/defaultTimeout.js +23 -0
- package/dist/src/middleware/defaultTimeout.js.map +1 -0
- package/dist/src/middleware/diagnostics.d.ts +28 -0
- package/dist/src/middleware/diagnostics.d.ts.map +1 -0
- package/dist/src/middleware/diagnostics.js +131 -0
- package/dist/src/middleware/diagnostics.js.map +1 -0
- package/dist/src/middleware/diagnosticsExporters.d.ts +27 -0
- package/dist/src/middleware/diagnosticsExporters.d.ts.map +1 -0
- package/dist/src/middleware/diagnosticsExporters.js +45 -0
- package/dist/src/middleware/diagnosticsExporters.js.map +1 -0
- package/dist/src/middleware/hedge.d.ts +17 -0
- package/dist/src/middleware/hedge.d.ts.map +1 -0
- package/dist/src/middleware/hedge.js +125 -0
- package/dist/src/middleware/hedge.js.map +1 -0
- package/dist/src/middleware/httpCache.d.ts +14 -0
- package/dist/src/middleware/httpCache.d.ts.map +1 -0
- package/dist/src/middleware/httpCache.js +126 -0
- package/dist/src/middleware/httpCache.js.map +1 -0
- package/dist/src/middleware/idempotencyKey.d.ts +12 -0
- package/dist/src/middleware/idempotencyKey.d.ts.map +1 -0
- package/dist/src/middleware/idempotencyKey.js +33 -0
- package/dist/src/middleware/idempotencyKey.js.map +1 -0
- package/dist/src/middleware/offlineQueue.d.ts +78 -0
- package/dist/src/middleware/offlineQueue.d.ts.map +1 -0
- package/dist/src/middleware/offlineQueue.js +189 -0
- package/dist/src/middleware/offlineQueue.js.map +1 -0
- package/dist/src/middleware/presets.d.ts +31 -0
- package/dist/src/middleware/presets.d.ts.map +1 -0
- package/dist/src/middleware/presets.js +122 -0
- package/dist/src/middleware/presets.js.map +1 -0
- package/dist/src/middleware/retry.d.ts +27 -0
- package/dist/src/middleware/retry.d.ts.map +1 -0
- package/dist/src/middleware/retry.js +189 -0
- package/dist/src/middleware/retry.js.map +1 -0
- package/dist/src/middleware/stalePolicy.d.ts +14 -0
- package/dist/src/middleware/stalePolicy.d.ts.map +1 -0
- package/dist/src/middleware/stalePolicy.js +13 -0
- package/dist/src/middleware/stalePolicy.js.map +1 -0
- package/dist/src/observability/otelMapping.d.ts +13 -0
- package/dist/src/observability/otelMapping.d.ts.map +1 -0
- package/dist/src/observability/otelMapping.js +31 -0
- package/dist/src/observability/otelMapping.js.map +1 -0
- package/dist/src/observability/otelProfiles.d.ts +16 -0
- package/dist/src/observability/otelProfiles.d.ts.map +1 -0
- package/dist/src/observability/otelProfiles.js +66 -0
- package/dist/src/observability/otelProfiles.js.map +1 -0
- package/dist/src/observability/redaction.d.ts +39 -0
- package/dist/src/observability/redaction.d.ts.map +1 -0
- package/dist/src/observability/redaction.js +112 -0
- package/dist/src/observability/redaction.js.map +1 -0
- package/dist/src/policy/guardrails.d.ts +14 -0
- package/dist/src/policy/guardrails.d.ts.map +1 -0
- package/dist/src/policy/guardrails.js +36 -0
- package/dist/src/policy/guardrails.js.map +1 -0
- package/dist/src/response/response.d.ts +58 -0
- package/dist/src/response/response.d.ts.map +1 -0
- package/dist/src/response/response.js +91 -0
- package/dist/src/response/response.js.map +1 -0
- package/dist/src/serializers/formUrlEncodedSerializer.d.ts +6 -0
- package/dist/src/serializers/formUrlEncodedSerializer.d.ts.map +1 -0
- package/dist/src/serializers/formUrlEncodedSerializer.js +38 -0
- package/dist/src/serializers/formUrlEncodedSerializer.js.map +1 -0
- package/dist/src/serializers/jsonBodySerializer.d.ts +3 -0
- package/dist/src/serializers/jsonBodySerializer.d.ts.map +1 -0
- package/dist/src/serializers/jsonBodySerializer.js +24 -0
- package/dist/src/serializers/jsonBodySerializer.js.map +1 -0
- package/dist/src/types/events.d.ts +49 -0
- package/dist/src/types/events.d.ts.map +1 -0
- package/dist/src/types/events.js +2 -0
- package/dist/src/types/events.js.map +1 -0
- package/dist/src/types/http.d.ts +78 -0
- package/dist/src/types/http.d.ts.map +1 -0
- package/dist/src/types/http.js +2 -0
- package/dist/src/types/http.js.map +1 -0
- package/dist/src/types/internal.d.ts +20 -0
- package/dist/src/types/internal.d.ts.map +1 -0
- package/dist/src/types/internal.js +2 -0
- package/dist/src/types/internal.js.map +1 -0
- package/dist/src/types/result.d.ts +32 -0
- package/dist/src/types/result.d.ts.map +1 -0
- package/dist/src/types/result.js +66 -0
- package/dist/src/types/result.js.map +1 -0
- package/dist/src/utils/crypto.d.ts +8 -0
- package/dist/src/utils/crypto.d.ts.map +1 -0
- package/dist/src/utils/crypto.js +21 -0
- package/dist/src/utils/crypto.js.map +1 -0
- package/dist/src/utils/policyTrace.d.ts +17 -0
- package/dist/src/utils/policyTrace.d.ts.map +1 -0
- package/dist/src/utils/policyTrace.js +34 -0
- package/dist/src/utils/policyTrace.js.map +1 -0
- package/dist/src/utils/stableKey.d.ts +17 -0
- package/dist/src/utils/stableKey.d.ts.map +1 -0
- package/dist/src/utils/stableKey.js +41 -0
- package/dist/src/utils/stableKey.js.map +1 -0
- package/dist/src/utils/url.d.ts +22 -0
- package/dist/src/utils/url.d.ts.map +1 -0
- package/dist/src/utils/url.js +2 -0
- package/dist/src/utils/url.js.map +1 -0
- package/dist/tests/adapter-serializer.test.d.ts +2 -0
- package/dist/tests/adapter-serializer.test.d.ts.map +1 -0
- package/dist/tests/adapter-serializer.test.js +59 -0
- package/dist/tests/adapter-serializer.test.js.map +1 -0
- package/dist/tests/browser-runtime.smoke.test.d.ts +2 -0
- package/dist/tests/browser-runtime.smoke.test.d.ts.map +1 -0
- package/dist/tests/browser-runtime.smoke.test.js +17 -0
- package/dist/tests/browser-runtime.smoke.test.js.map +1 -0
- package/dist/tests/circuit-breaker.test.d.ts +2 -0
- package/dist/tests/circuit-breaker.test.d.ts.map +1 -0
- package/dist/tests/circuit-breaker.test.js +184 -0
- package/dist/tests/circuit-breaker.test.js.map +1 -0
- package/dist/tests/client.integration.d.ts +2 -0
- package/dist/tests/client.integration.d.ts.map +1 -0
- package/dist/tests/client.integration.js +44 -0
- package/dist/tests/client.integration.js.map +1 -0
- package/dist/tests/client.integration.test.d.ts +2 -0
- package/dist/tests/client.integration.test.d.ts.map +1 -0
- package/dist/tests/client.integration.test.js +63 -0
- package/dist/tests/client.integration.test.js.map +1 -0
- package/dist/tests/compose.test.d.ts +2 -0
- package/dist/tests/compose.test.d.ts.map +1 -0
- package/dist/tests/compose.test.js +24 -0
- package/dist/tests/compose.test.js.map +1 -0
- package/dist/tests/concurrency-limit.test.d.ts +2 -0
- package/dist/tests/concurrency-limit.test.d.ts.map +1 -0
- package/dist/tests/concurrency-limit.test.js +87 -0
- package/dist/tests/concurrency-limit.test.js.map +1 -0
- package/dist/tests/deadline-middleware.test.d.ts +2 -0
- package/dist/tests/deadline-middleware.test.d.ts.map +1 -0
- package/dist/tests/deadline-middleware.test.js +38 -0
- package/dist/tests/deadline-middleware.test.js.map +1 -0
- package/dist/tests/dedupe-middleware.test.d.ts +2 -0
- package/dist/tests/dedupe-middleware.test.d.ts.map +1 -0
- package/dist/tests/dedupe-middleware.test.js +56 -0
- package/dist/tests/dedupe-middleware.test.js.map +1 -0
- package/dist/tests/default-timeout.test.d.ts +2 -0
- package/dist/tests/default-timeout.test.d.ts.map +1 -0
- package/dist/tests/default-timeout.test.js +28 -0
- package/dist/tests/default-timeout.test.js.map +1 -0
- package/dist/tests/diagnostics-exporters.test.d.ts +2 -0
- package/dist/tests/diagnostics-exporters.test.d.ts.map +1 -0
- package/dist/tests/diagnostics-exporters.test.js +41 -0
- package/dist/tests/diagnostics-exporters.test.js.map +1 -0
- package/dist/tests/diagnostics.test.d.ts +2 -0
- package/dist/tests/diagnostics.test.d.ts.map +1 -0
- package/dist/tests/diagnostics.test.js +38 -0
- package/dist/tests/diagnostics.test.js.map +1 -0
- package/dist/tests/error-metadata.test.d.ts +2 -0
- package/dist/tests/error-metadata.test.d.ts.map +1 -0
- package/dist/tests/error-metadata.test.js +23 -0
- package/dist/tests/error-metadata.test.js.map +1 -0
- package/dist/tests/execute-timeout.test.d.ts +2 -0
- package/dist/tests/execute-timeout.test.d.ts.map +1 -0
- package/dist/tests/execute-timeout.test.js +30 -0
- package/dist/tests/execute-timeout.test.js.map +1 -0
- package/dist/tests/form-serializer.test.d.ts +2 -0
- package/dist/tests/form-serializer.test.d.ts.map +1 -0
- package/dist/tests/form-serializer.test.js +16 -0
- package/dist/tests/form-serializer.test.js.map +1 -0
- package/dist/tests/hedge.test.d.ts +2 -0
- package/dist/tests/hedge.test.d.ts.map +1 -0
- package/dist/tests/hedge.test.js +45 -0
- package/dist/tests/hedge.test.js.map +1 -0
- package/dist/tests/http-cache.test.d.ts +2 -0
- package/dist/tests/http-cache.test.d.ts.map +1 -0
- package/dist/tests/http-cache.test.js +60 -0
- package/dist/tests/http-cache.test.js.map +1 -0
- package/dist/tests/idempotency-key.test.d.ts +2 -0
- package/dist/tests/idempotency-key.test.d.ts.map +1 -0
- package/dist/tests/idempotency-key.test.js +31 -0
- package/dist/tests/idempotency-key.test.js.map +1 -0
- package/dist/tests/instrumented-adapter.test.d.ts +2 -0
- package/dist/tests/instrumented-adapter.test.d.ts.map +1 -0
- package/dist/tests/instrumented-adapter.test.js +33 -0
- package/dist/tests/instrumented-adapter.test.js.map +1 -0
- package/dist/tests/interceptor-order.test.d.ts +2 -0
- package/dist/tests/interceptor-order.test.d.ts.map +1 -0
- package/dist/tests/interceptor-order.test.js +38 -0
- package/dist/tests/interceptor-order.test.js.map +1 -0
- package/dist/tests/json-helper.test.d.ts +2 -0
- package/dist/tests/json-helper.test.d.ts.map +1 -0
- package/dist/tests/json-helper.test.js +42 -0
- package/dist/tests/json-helper.test.js.map +1 -0
- package/dist/tests/observability.test.d.ts +2 -0
- package/dist/tests/observability.test.d.ts.map +1 -0
- package/dist/tests/observability.test.js +59 -0
- package/dist/tests/observability.test.js.map +1 -0
- package/dist/tests/offline-queue.test.d.ts +2 -0
- package/dist/tests/offline-queue.test.d.ts.map +1 -0
- package/dist/tests/offline-queue.test.js +35 -0
- package/dist/tests/offline-queue.test.js.map +1 -0
- package/dist/tests/otel-mapping.test.d.ts +2 -0
- package/dist/tests/otel-mapping.test.d.ts.map +1 -0
- package/dist/tests/otel-mapping.test.js +20 -0
- package/dist/tests/otel-mapping.test.js.map +1 -0
- package/dist/tests/policy-guardrails.test.d.ts +2 -0
- package/dist/tests/policy-guardrails.test.d.ts.map +1 -0
- package/dist/tests/policy-guardrails.test.js +25 -0
- package/dist/tests/policy-guardrails.test.js.map +1 -0
- package/dist/tests/presets.test.d.ts +2 -0
- package/dist/tests/presets.test.d.ts.map +1 -0
- package/dist/tests/presets.test.js +41 -0
- package/dist/tests/presets.test.js.map +1 -0
- package/dist/tests/public-api.contract.d.ts +2 -0
- package/dist/tests/public-api.contract.d.ts.map +1 -0
- package/dist/tests/public-api.contract.js +14 -0
- package/dist/tests/public-api.contract.js.map +1 -0
- package/dist/tests/public-api.contract.test.d.ts +2 -0
- package/dist/tests/public-api.contract.test.d.ts.map +1 -0
- package/dist/tests/public-api.contract.test.js +25 -0
- package/dist/tests/public-api.contract.test.js.map +1 -0
- package/dist/tests/redaction.test.d.ts +2 -0
- package/dist/tests/redaction.test.d.ts.map +1 -0
- package/dist/tests/redaction.test.js +23 -0
- package/dist/tests/redaction.test.js.map +1 -0
- package/dist/tests/retry-after-budget.test.d.ts +2 -0
- package/dist/tests/retry-after-budget.test.d.ts.map +1 -0
- package/dist/tests/retry-after-budget.test.js +72 -0
- package/dist/tests/retry-after-budget.test.js.map +1 -0
- package/dist/tests/retry-policy-trace.test.d.ts +2 -0
- package/dist/tests/retry-policy-trace.test.d.ts.map +1 -0
- package/dist/tests/retry-policy-trace.test.js +35 -0
- package/dist/tests/retry-policy-trace.test.js.map +1 -0
- package/dist/tests/retry-policy.test.d.ts +2 -0
- package/dist/tests/retry-policy.test.d.ts.map +1 -0
- package/dist/tests/retry-policy.test.js +51 -0
- package/dist/tests/retry-policy.test.js.map +1 -0
- package/dist/tests/retry.stress.d.ts +2 -0
- package/dist/tests/retry.stress.d.ts.map +1 -0
- package/dist/tests/retry.stress.js +21 -0
- package/dist/tests/retry.stress.js.map +1 -0
- package/dist/tests/retry.stress.test.d.ts +2 -0
- package/dist/tests/retry.stress.test.d.ts.map +1 -0
- package/dist/tests/retry.stress.test.js +21 -0
- package/dist/tests/retry.stress.test.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-cache.test.js","sourceRoot":"","sources":["../../tests/http-cache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency-key.test.d.ts","sourceRoot":"","sources":["../../tests/idempotency-key.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createClient } from "../src/client/createClient";
|
|
3
|
+
import { idempotencyKey } from "../src/middleware/idempotencyKey";
|
|
4
|
+
describe("idempotency key middleware", () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
vi.restoreAllMocks();
|
|
7
|
+
});
|
|
8
|
+
it("adds idempotency key header for mutation requests", async () => {
|
|
9
|
+
const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("ok", { status: 200 }));
|
|
10
|
+
const client = createClient().use(idempotencyKey({
|
|
11
|
+
keyFactory: () => "idem-123",
|
|
12
|
+
}));
|
|
13
|
+
await client.post("https://api.example.com/orders", { itemId: "p1" });
|
|
14
|
+
const init = fetchMock.mock.calls[0]?.[1];
|
|
15
|
+
const headers = (init?.headers ?? {});
|
|
16
|
+
expect(headers["Idempotency-Key"]).toBe("idem-123");
|
|
17
|
+
});
|
|
18
|
+
it("does not override existing idempotency key", async () => {
|
|
19
|
+
const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("ok", { status: 200 }));
|
|
20
|
+
const client = createClient().use(idempotencyKey({
|
|
21
|
+
keyFactory: () => "idem-generated",
|
|
22
|
+
}));
|
|
23
|
+
await client.post("/orders", { itemId: "p1" }, {
|
|
24
|
+
headers: { "Idempotency-Key": "idem-existing" },
|
|
25
|
+
});
|
|
26
|
+
const init = fetchMock.mock.calls[0]?.[1];
|
|
27
|
+
const headers = (init?.headers ?? {});
|
|
28
|
+
expect(headers["Idempotency-Key"]).toBe("idem-existing");
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=idempotency-key.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency-key.test.js","sourceRoot":"","sources":["../../tests/idempotency-key.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAElE,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEvG,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,GAAG,CAC/B,cAAc,CAAC;YACb,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU;SAC7B,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;QACrE,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAA2B,CAAC;QAChE,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEvG,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,GAAG,CAC/B,cAAc,CAAC;YACb,UAAU,EAAE,GAAG,EAAE,CAAC,gBAAgB;SACnC,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE;SAChD,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;QACrE,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAA2B,CAAC;QAChE,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumented-adapter.test.d.ts","sourceRoot":"","sources":["../../tests/instrumented-adapter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createInstrumentedAdapter } from "../src/adapters/instrumentedAdapter";
|
|
3
|
+
describe("instrumented adapter", () => {
|
|
4
|
+
it("emits start and success hooks", async () => {
|
|
5
|
+
const starts = [];
|
|
6
|
+
const successes = [];
|
|
7
|
+
const adapter = createInstrumentedAdapter(async () => new Response("ok", { status: 200 }), {
|
|
8
|
+
onStart(event) {
|
|
9
|
+
starts.push(event.url);
|
|
10
|
+
},
|
|
11
|
+
onSuccess(event) {
|
|
12
|
+
successes.push(event.response.status);
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
const response = await adapter("https://api.example.com/ok", { method: "GET" });
|
|
16
|
+
expect(response.status).toBe(200);
|
|
17
|
+
expect(starts).toEqual(["https://api.example.com/ok"]);
|
|
18
|
+
expect(successes).toEqual([200]);
|
|
19
|
+
});
|
|
20
|
+
it("emits error hook and rethrows", async () => {
|
|
21
|
+
const errors = [];
|
|
22
|
+
const adapter = createInstrumentedAdapter(async () => {
|
|
23
|
+
throw new Error("boom");
|
|
24
|
+
}, {
|
|
25
|
+
onError(event) {
|
|
26
|
+
errors.push(String(event.error));
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
await expect(adapter("https://api.example.com/fail", { method: "GET" })).rejects.toThrow("boom");
|
|
30
|
+
expect(errors.length).toBe(1);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=instrumented-adapter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumented-adapter.test.js","sourceRoot":"","sources":["../../tests/instrumented-adapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAEhF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,MAAM,OAAO,GAAG,yBAAyB,CACvC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAC/C;YACE,OAAO,CAAC,KAAK;gBACX,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YACD,SAAS,CAAC,KAAK;gBACb,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;SACF,CACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,MAAM,OAAO,GAAG,yBAAyB,CACvC,KAAK,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,EACD;YACE,OAAO,CAAC,KAAK;gBACX,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACnC,CAAC;SACF,CACF,CAAC;QAEF,MAAM,MAAM,CAAC,OAAO,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor-order.test.d.ts","sourceRoot":"","sources":["../../tests/interceptor-order.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, expect, it, vi, afterEach } from "vitest";
|
|
2
|
+
import { createClient } from "../src/client/createClient";
|
|
3
|
+
describe("interceptor order", () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it("applies request interceptors by descending priority", async () => {
|
|
8
|
+
const callOrder = [];
|
|
9
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("{}", { status: 200, headers: { "content-type": "application/json" } }));
|
|
10
|
+
const client = createClient()
|
|
11
|
+
.useRequestInterceptor((req) => {
|
|
12
|
+
callOrder.push("low");
|
|
13
|
+
return req;
|
|
14
|
+
}, { priority: 1 })
|
|
15
|
+
.useRequestInterceptor((req) => {
|
|
16
|
+
callOrder.push("high");
|
|
17
|
+
return req;
|
|
18
|
+
}, { priority: 10 });
|
|
19
|
+
await client.get("https://example.com");
|
|
20
|
+
expect(callOrder).toEqual(["high", "low"]);
|
|
21
|
+
});
|
|
22
|
+
it("applies response interceptors by descending priority", async () => {
|
|
23
|
+
const callOrder = [];
|
|
24
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("{}", { status: 200 }));
|
|
25
|
+
const client = createClient()
|
|
26
|
+
.useResponseInterceptor((res) => {
|
|
27
|
+
callOrder.push("low");
|
|
28
|
+
return res;
|
|
29
|
+
}, { priority: 1 })
|
|
30
|
+
.useResponseInterceptor((res) => {
|
|
31
|
+
callOrder.push("high");
|
|
32
|
+
return res;
|
|
33
|
+
}, { priority: 10 });
|
|
34
|
+
await client.get("https://example.com");
|
|
35
|
+
expect(callOrder).toEqual(["high", "low"]);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=interceptor-order.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor-order.test.js","sourceRoot":"","sources":["../../tests/interceptor-order.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAC7C,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CACrF,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY,EAAE;aAC1B,qBAAqB,CACpB,CAAC,GAAG,EAAE,EAAE;YACN,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChB;aACA,qBAAqB,CACpB,CAAC,GAAG,EAAE,EAAE;YACN,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,QAAQ,EAAE,EAAE,EAAE,CACjB,CAAC;QAEJ,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAExC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,YAAY,EAAE;aAC1B,sBAAsB,CACrB,CAAC,GAAG,EAAE,EAAE;YACN,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChB;aACA,sBAAsB,CACrB,CAAC,GAAG,EAAE,EAAE;YACN,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,QAAQ,EAAE,EAAE,EAAE,CACjB,CAAC;QAEJ,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAExC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-helper.test.d.ts","sourceRoot":"","sources":["../../tests/json-helper.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createClient } from "../src/client/createClient";
|
|
3
|
+
describe("beginner JSON helpers", () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it("getJson returns parsed data for 2xx responses", async () => {
|
|
8
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({ id: "u1", name: "Alice" }), {
|
|
9
|
+
status: 200,
|
|
10
|
+
headers: { "content-type": "application/json" },
|
|
11
|
+
}));
|
|
12
|
+
const client = createClient();
|
|
13
|
+
const data = await client.getJson("https://example.com/users/:id", {
|
|
14
|
+
params: { id: "u1" },
|
|
15
|
+
});
|
|
16
|
+
expect(data).toEqual({ id: "u1", name: "Alice" });
|
|
17
|
+
});
|
|
18
|
+
it("getJsonResult returns http error for non-2xx responses", async () => {
|
|
19
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("not found", { status: 404, statusText: "Not Found" }));
|
|
20
|
+
const client = createClient();
|
|
21
|
+
const result = await client.getJsonResult("https://example.com/users/:id", {
|
|
22
|
+
params: { id: "u1" },
|
|
23
|
+
});
|
|
24
|
+
expect(result.ok).toBe(false);
|
|
25
|
+
if (!result.ok) {
|
|
26
|
+
expect(result.error.kind).toBe("http");
|
|
27
|
+
expect(result.error.status).toBe(404);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
it("getJsonResult returns network error on transport failure", async () => {
|
|
31
|
+
vi.spyOn(globalThis, "fetch").mockRejectedValue(new TypeError("Network error"));
|
|
32
|
+
const client = createClient();
|
|
33
|
+
const result = await client.getJsonResult("https://example.com/users/:id", {
|
|
34
|
+
params: { id: "u1" },
|
|
35
|
+
});
|
|
36
|
+
expect(result.ok).toBe(false);
|
|
37
|
+
if (!result.ok) {
|
|
38
|
+
expect(result.error.kind).toBe("network");
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=json-helper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-helper.test.js","sourceRoot":"","sources":["../../tests/json-helper.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAC7C,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;YACxD,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAA+B,+BAA+B,EAAE;YAC/F,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAErH,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAiB,+BAA+B,EAAE;YACzF,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC;QAEhF,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAiB,+BAA+B,EAAE;YACzF,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.test.d.ts","sourceRoot":"","sources":["../../tests/observability.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createClient } from "../src/client/createClient";
|
|
3
|
+
describe("observability hooks", () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it("emits start and success events and propagates request/trace headers", async () => {
|
|
8
|
+
const starts = [];
|
|
9
|
+
const successes = [];
|
|
10
|
+
const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("{}", {
|
|
11
|
+
status: 200,
|
|
12
|
+
headers: { "content-type": "application/json" },
|
|
13
|
+
}));
|
|
14
|
+
const client = createClient({
|
|
15
|
+
baseURL: "https://api.example.com",
|
|
16
|
+
requestIdFactory: () => "req-123",
|
|
17
|
+
traceContextProvider: () => ({
|
|
18
|
+
traceparent: "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00",
|
|
19
|
+
}),
|
|
20
|
+
hooks: {
|
|
21
|
+
onRequestStart: (event) => {
|
|
22
|
+
starts.push({ requestId: event.requestId, url: event.url });
|
|
23
|
+
},
|
|
24
|
+
onRequestSuccess: (event) => {
|
|
25
|
+
successes.push({
|
|
26
|
+
requestId: event.requestId,
|
|
27
|
+
status: event.status,
|
|
28
|
+
retryCount: event.retryCount,
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
await client.get("/health");
|
|
34
|
+
expect(starts).toEqual([{ requestId: "req-123", url: "https://api.example.com/health" }]);
|
|
35
|
+
expect(successes).toEqual([{ requestId: "req-123", status: 200, retryCount: 0 }]);
|
|
36
|
+
const firstCall = fetchMock.mock.calls[0];
|
|
37
|
+
expect(firstCall).toBeDefined();
|
|
38
|
+
const init = firstCall?.[1];
|
|
39
|
+
const headers = (init?.headers ?? {});
|
|
40
|
+
expect(headers["x-request-id"]).toBe("req-123");
|
|
41
|
+
expect(headers.traceparent).toBe("00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00");
|
|
42
|
+
});
|
|
43
|
+
it("emits error event with enriched metadata", async () => {
|
|
44
|
+
const errors = [];
|
|
45
|
+
vi.spyOn(globalThis, "fetch").mockRejectedValue(new TypeError("Network failed"));
|
|
46
|
+
const client = createClient({
|
|
47
|
+
requestIdFactory: () => "req-err-1",
|
|
48
|
+
hooks: {
|
|
49
|
+
onRequestError: (event) => {
|
|
50
|
+
errors.push(event.error.metadata?.requestId ?? "");
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
const result = await client.getResult("/users");
|
|
55
|
+
expect(result.ok).toBe(false);
|
|
56
|
+
expect(errors).toEqual(["req-err-1"]);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=observability.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.test.js","sourceRoot":"","sources":["../../tests/observability.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-queue.test.d.ts","sourceRoot":"","sources":["../../tests/offline-queue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createOfflineQueue } from "../src/middleware/offlineQueue";
|
|
3
|
+
import { HttpResponse } from "../src/response/response";
|
|
4
|
+
describe("offline queue middleware", () => {
|
|
5
|
+
it("queues mutation requests when offline and returns 202", async () => {
|
|
6
|
+
const queue = createOfflineQueue({
|
|
7
|
+
isOffline: () => true,
|
|
8
|
+
});
|
|
9
|
+
const response = await queue.middleware({
|
|
10
|
+
method: "POST",
|
|
11
|
+
url: "https://example.com/events",
|
|
12
|
+
body: { a: 1 },
|
|
13
|
+
}, async () => new HttpResponse(new Response("ok", { status: 200 })));
|
|
14
|
+
expect(response.status).toBe(202);
|
|
15
|
+
expect((await queue.snapshot()).size).toBe(1);
|
|
16
|
+
});
|
|
17
|
+
it("flushes queued requests through a replay executor", async () => {
|
|
18
|
+
const queue = createOfflineQueue({ isOffline: () => true });
|
|
19
|
+
await queue.middleware({
|
|
20
|
+
method: "POST",
|
|
21
|
+
url: "https://example.com/events",
|
|
22
|
+
body: { a: 1 },
|
|
23
|
+
}, async () => new HttpResponse(new Response("ok", { status: 200 })));
|
|
24
|
+
const replayed = [];
|
|
25
|
+
const responses = await queue.flush(async (req) => {
|
|
26
|
+
replayed.push(`${req.method}:${req.url}`);
|
|
27
|
+
return new HttpResponse(new Response("ok", { status: 201 }));
|
|
28
|
+
});
|
|
29
|
+
expect(replayed).toEqual(["POST:https://example.com/events"]);
|
|
30
|
+
expect(responses.length).toBe(1);
|
|
31
|
+
expect(responses[0]?.status).toBe(201);
|
|
32
|
+
expect((await queue.snapshot()).size).toBe(0);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=offline-queue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-queue.test.js","sourceRoot":"","sources":["../../tests/offline-queue.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,KAAK,GAAG,kBAAkB,CAAC;YAC/B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;SACtB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CACrC;YACE,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,4BAA4B;YACjC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;SACf,EACD,KAAK,IAAI,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAClE,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5D,MAAM,KAAK,CAAC,UAAU,CACpB;YACE,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,4BAA4B;YACjC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;SACf,EACD,KAAK,IAAI,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAClE,CAAC;QAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAChD,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1C,OAAO,IAAI,YAAY,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-mapping.test.d.ts","sourceRoot":"","sources":["../../tests/otel-mapping.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { mapTransportEventToOtelAttributes } from "../src/observability/otelMapping";
|
|
3
|
+
describe("otel mapping", () => {
|
|
4
|
+
it("maps transport event fields into stable otel-like attributes", () => {
|
|
5
|
+
const attributes = mapTransportEventToOtelAttributes({
|
|
6
|
+
phase: "success",
|
|
7
|
+
at: Date.now(),
|
|
8
|
+
method: "GET",
|
|
9
|
+
url: "https://example.com/health",
|
|
10
|
+
status: 200,
|
|
11
|
+
durationMs: 12,
|
|
12
|
+
retryCount: 1,
|
|
13
|
+
policyTrace: [],
|
|
14
|
+
});
|
|
15
|
+
expect(attributes["http.request.method"]).toBe("GET");
|
|
16
|
+
expect(attributes["http.response.status_code"]).toBe(200);
|
|
17
|
+
expect(attributes["pureq.retry_count"]).toBe(1);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=otel-mapping.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-mapping.test.js","sourceRoot":"","sources":["../../tests/otel-mapping.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAErF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,UAAU,GAAG,iCAAiC,CAAC;YACnD,KAAK,EAAE,SAAS;YAChB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,4BAA4B;YACjC,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-guardrails.test.d.ts","sourceRoot":"","sources":["../../tests/policy-guardrails.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createClient, deadline, defaultTimeout, retry } from "../src/index";
|
|
3
|
+
describe("policy guardrails", () => {
|
|
4
|
+
it("rejects conflicting timeout policies at client creation time", () => {
|
|
5
|
+
expect(() => createClient({
|
|
6
|
+
middlewares: [defaultTimeout(1000), deadline({ defaultTimeoutMs: 1000 })],
|
|
7
|
+
})).toThrow("use deadline or defaultTimeout, not both");
|
|
8
|
+
});
|
|
9
|
+
it("rejects retry policies that exceed the configured max retry limit", () => {
|
|
10
|
+
expect(() => createClient().use(retry({
|
|
11
|
+
maxRetries: 11,
|
|
12
|
+
delay: 0,
|
|
13
|
+
backoff: false,
|
|
14
|
+
}))).toThrow("retry maxRetries must be 10 or less");
|
|
15
|
+
});
|
|
16
|
+
it("allows a normal policy stack", () => {
|
|
17
|
+
const client = createClient().use(retry({
|
|
18
|
+
maxRetries: 2,
|
|
19
|
+
delay: 0,
|
|
20
|
+
backoff: false,
|
|
21
|
+
}));
|
|
22
|
+
expect(typeof client.get).toBe("function");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=policy-guardrails.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-guardrails.test.js","sourceRoot":"","sources":["../../tests/policy-guardrails.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE7E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,GAAG,EAAE,CACV,YAAY,CAAC;YACX,WAAW,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;SAC1E,CAAC,CACH,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,GAAG,EAAE,CACV,YAAY,EAAE,CAAC,GAAG,CAChB,KAAK,CAAC;YACJ,UAAU,EAAE,EAAE;YACd,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK;SACf,CAAC,CACH,CACF,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,GAAG,CAC/B,KAAK,CAAC;YACJ,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK;SACf,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.test.d.ts","sourceRoot":"","sources":["../../tests/presets.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createClient } from "../src/client/createClient";
|
|
3
|
+
import { backendPreset, bffPreset, frontendPreset, resilientPreset } from "../src/middleware/presets";
|
|
4
|
+
describe("resilient preset", () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
vi.restoreAllMocks();
|
|
7
|
+
});
|
|
8
|
+
it("provides a composable production-ready stack", async () => {
|
|
9
|
+
const fetchMock = vi
|
|
10
|
+
.spyOn(globalThis, "fetch")
|
|
11
|
+
.mockResolvedValueOnce(new Response("error", { status: 503 }))
|
|
12
|
+
.mockResolvedValueOnce(new Response("ok", { status: 200 }));
|
|
13
|
+
const middlewares = resilientPreset({
|
|
14
|
+
retry: { maxRetries: 1, delay: 0, backoff: false },
|
|
15
|
+
circuitBreaker: { failureThreshold: 5, cooldownMs: 1000 },
|
|
16
|
+
});
|
|
17
|
+
let client = createClient();
|
|
18
|
+
for (const mw of middlewares) {
|
|
19
|
+
client = client.use(mw);
|
|
20
|
+
}
|
|
21
|
+
const result = await client.getResult("https://api.example.com/health");
|
|
22
|
+
expect(result.ok).toBe(true);
|
|
23
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
24
|
+
});
|
|
25
|
+
it("provides dedicated profile presets", async () => {
|
|
26
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("ok", { status: 200 }));
|
|
27
|
+
const front = frontendPreset();
|
|
28
|
+
const bff = bffPreset();
|
|
29
|
+
const back = backendPreset();
|
|
30
|
+
expect(front.length).toBeGreaterThan(0);
|
|
31
|
+
expect(bff.length).toBeGreaterThan(0);
|
|
32
|
+
expect(back.length).toBeGreaterThan(0);
|
|
33
|
+
let client = createClient();
|
|
34
|
+
for (const mw of front) {
|
|
35
|
+
client = client.use(mw);
|
|
36
|
+
}
|
|
37
|
+
const result = await client.getResult("https://api.example.com/health");
|
|
38
|
+
expect(result.ok).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=presets.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.test.js","sourceRoot":"","sources":["../../tests/presets.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEtG,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,SAAS,GAAG,EAAE;aACjB,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC;aAC1B,qBAAqB,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;aAC7D,qBAAqB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAE9D,MAAM,WAAW,GAAG,eAAe,CAAC;YAClC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;YAClD,cAAc,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;SAC1D,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,YAAY,EAAE,CAAC;QAC5B,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAErF,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;QAE7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEvC,IAAI,MAAM,GAAG,YAAY,EAAE,CAAC;QAC5B,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-api.contract.d.ts","sourceRoot":"","sources":["../../tests/public-api.contract.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import * as pureq from "../src/index";
|
|
3
|
+
describe("contract: public api", () => {
|
|
4
|
+
it("exports required stable surface", () => {
|
|
5
|
+
expect(typeof pureq.createClient).toBe("function");
|
|
6
|
+
expect(typeof pureq.retry).toBe("function");
|
|
7
|
+
expect(typeof pureq.compose).toBe("function");
|
|
8
|
+
expect(typeof pureq.execute).toBe("function");
|
|
9
|
+
expect(typeof pureq.executeResult).toBe("function");
|
|
10
|
+
expect(typeof pureq.HttpResponse).toBe("function");
|
|
11
|
+
expect(typeof pureq.toPureqError).toBe("function");
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=public-api.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-api.contract.js","sourceRoot":"","sources":["../../tests/public-api.contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-api.contract.test.d.ts","sourceRoot":"","sources":["../../tests/public-api.contract.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import * as pureq from "../src/index";
|
|
3
|
+
describe("contract: public api", () => {
|
|
4
|
+
it("exports required stable surface", () => {
|
|
5
|
+
expect(typeof pureq.createClient).toBe("function");
|
|
6
|
+
expect(typeof pureq.retry).toBe("function");
|
|
7
|
+
expect(typeof pureq.hedge).toBe("function");
|
|
8
|
+
expect(typeof pureq.httpCache).toBe("function");
|
|
9
|
+
expect(typeof pureq.offlineQueue).toBe("function");
|
|
10
|
+
expect(typeof pureq.createOfflineQueue).toBe("function");
|
|
11
|
+
expect(typeof pureq.deadline).toBe("function");
|
|
12
|
+
expect(typeof pureq.concurrencyLimit).toBe("function");
|
|
13
|
+
expect(typeof pureq.validatePolicyGuardrails).toBe("function");
|
|
14
|
+
expect(typeof pureq.mapTransportEventToOtelAttributes).toBe("function");
|
|
15
|
+
expect(typeof pureq.redactHeaders).toBe("function");
|
|
16
|
+
expect(typeof pureq.redactObjectFields).toBe("function");
|
|
17
|
+
expect(typeof pureq.createClient().fetch).toBe("function");
|
|
18
|
+
expect(typeof pureq.compose).toBe("function");
|
|
19
|
+
expect(typeof pureq.execute).toBe("function");
|
|
20
|
+
expect(typeof pureq.executeResult).toBe("function");
|
|
21
|
+
expect(typeof pureq.HttpResponse).toBe("function");
|
|
22
|
+
expect(typeof pureq.toPureqError).toBe("function");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=public-api.contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-api.contract.test.js","sourceRoot":"","sources":["../../tests/public-api.contract.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,KAAK,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,KAAK,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,CAAC,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.test.d.ts","sourceRoot":"","sources":["../../tests/redaction.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { redactHeaders, redactObjectFields } from "../src/observability/redaction";
|
|
3
|
+
describe("redaction helpers", () => {
|
|
4
|
+
it("redacts sensitive headers by default", () => {
|
|
5
|
+
const redacted = redactHeaders({
|
|
6
|
+
Authorization: "Bearer secret",
|
|
7
|
+
Accept: "application/json",
|
|
8
|
+
});
|
|
9
|
+
expect(redacted.Authorization).toBe("[REDACTED]");
|
|
10
|
+
expect(redacted.Accept).toBe("application/json");
|
|
11
|
+
});
|
|
12
|
+
it("redacts sensitive object fields by default patterns", () => {
|
|
13
|
+
const redacted = redactObjectFields({
|
|
14
|
+
token: "abc",
|
|
15
|
+
userId: "u1",
|
|
16
|
+
passwordHash: "xxx",
|
|
17
|
+
});
|
|
18
|
+
expect(redacted.token).toBe("[REDACTED]");
|
|
19
|
+
expect(redacted.userId).toBe("u1");
|
|
20
|
+
expect(redacted.passwordHash).toBe("[REDACTED]");
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=redaction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.test.js","sourceRoot":"","sources":["../../tests/redaction.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEnF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC;YAC7B,aAAa,EAAE,eAAe;YAC9B,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,QAAQ,GAAG,kBAAkB,CAAC;YAClC,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-after-budget.test.d.ts","sourceRoot":"","sources":["../../tests/retry-after-budget.test.ts"],"names":[],"mappings":""}
|