brass-runtime 1.15.0 → 1.16.1
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/CHANGELOG.md +17 -0
- package/README.md +673 -136
- package/dist/agent/cli/main.cjs +40 -35
- package/dist/agent/cli/main.js +9 -4
- package/dist/agent/cli/main.mjs +9 -4
- package/dist/agent/index.cjs +8 -4
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.js +7 -3
- package/dist/agent/index.mjs +7 -3
- package/dist/chunk-2HQTDLHF.mjs +683 -0
- package/dist/chunk-36I3M4UC.mjs +370 -0
- package/dist/chunk-3AYM6WPJ.js +1629 -0
- package/dist/chunk-3LOYJFRR.cjs +300 -0
- package/dist/chunk-3RG5ZIWI.js +10 -0
- package/dist/chunk-3Y2RIUMM.js +300 -0
- package/dist/{chunk-VEZNF5GZ.cjs → chunk-4ROBZFL6.cjs} +130 -126
- package/dist/{chunk-3QMOKAS5.js → chunk-52OB2ROS.js} +9 -5
- package/dist/chunk-52PPNNI4.cjs +416 -0
- package/dist/chunk-5EC274J5.cjs +2874 -0
- package/dist/chunk-5QC7LRZ3.js +229 -0
- package/dist/chunk-5VRJNBLZ.mjs +2874 -0
- package/dist/chunk-62AZW6UT.cjs +313 -0
- package/dist/chunk-6IXXWIUM.js +683 -0
- package/dist/chunk-74ZTY6CP.js +2871 -0
- package/dist/chunk-76YMRMH2.cjs +777 -0
- package/dist/chunk-7CMJS3QE.mjs +2871 -0
- package/dist/{chunk-4NHES7VK.mjs → chunk-7JIJOVCT.js} +27 -13
- package/dist/chunk-A2OM6NEH.mjs +194 -0
- package/dist/chunk-AGR5B2BC.cjs +683 -0
- package/dist/chunk-AVNQLJ5V.js +777 -0
- package/dist/chunk-B33ICAKP.js +313 -0
- package/dist/{chunk-ELOOF35R.mjs → chunk-B5JD23U7.mjs} +1 -1
- package/dist/chunk-BABBZK4Y.js +2024 -0
- package/dist/chunk-C3MDXTRZ.js +354 -0
- package/dist/chunk-CIZFIMK5.js +2193 -0
- package/dist/chunk-CZIVE6NT.cjs +354 -0
- package/dist/chunk-DNFJLJMW.mjs +354 -0
- package/dist/chunk-DNFO2EIZ.mjs +777 -0
- package/dist/chunk-EJ6BPYVR.mjs +416 -0
- package/dist/chunk-ENKODRU3.cjs +2193 -0
- package/dist/chunk-EOC4UHBS.mjs +229 -0
- package/dist/{chunk-BMH5AV44.js → chunk-FH2X7BVP.js} +756 -440
- package/dist/{chunk-PPUXIH5R.js → chunk-FHQGHPMO.mjs} +27 -13
- package/dist/{chunk-TGIFUAK4.cjs → chunk-GLE2WY7Z.cjs} +951 -635
- package/dist/{chunk-BDF4AMWX.mjs → chunk-GYM3LLGS.mjs} +756 -440
- package/dist/chunk-HLWLMW2F.mjs +2024 -0
- package/dist/chunk-JF5WGYJJ.cjs +194 -0
- package/dist/chunk-KH4SYAOS.mjs +1629 -0
- package/dist/chunk-KN32XNTH.mjs +313 -0
- package/dist/chunk-KQLYONSE.cjs +2871 -0
- package/dist/{chunk-STVLQ3XD.cjs → chunk-KZJQ723N.cjs} +92 -78
- package/dist/chunk-L2SYFEBS.js +194 -0
- package/dist/chunk-L6VB5N7Q.cjs +104 -0
- package/dist/{chunk-K6M7MDZ4.mjs → chunk-MBEJI5HF.mjs} +9 -5
- package/dist/chunk-MIIYDLGM.js +2874 -0
- package/dist/chunk-MOO4L7F4.mjs +104 -0
- package/dist/chunk-MT3OWDPC.mjs +2193 -0
- package/dist/chunk-MVGUEJ5Z.cjs +370 -0
- package/dist/chunk-OBGZSXTJ.cjs +10 -0
- package/dist/chunk-PD4EJTQC.cjs +229 -0
- package/dist/chunk-PWC3RBQE.mjs +300 -0
- package/dist/chunk-Q2I37RP3.cjs +1629 -0
- package/dist/chunk-RKGKFN2A.js +416 -0
- package/dist/{chunk-R3R2FVLG.cjs → chunk-SA6HUJVI.cjs} +5 -5
- package/dist/chunk-TRM4JUZQ.js +104 -0
- package/dist/chunk-UB4B6OFY.js +370 -0
- package/dist/{chunk-TO7IKXYT.js → chunk-UCUBNWM2.js} +1 -1
- package/dist/chunk-VN44DYYT.cjs +2024 -0
- package/dist/chunk-Y6FXYEAI.mjs +10 -0
- package/dist/client-CZHU674n.d.ts +820 -0
- package/dist/core/index.cjs +198 -4
- package/dist/core/index.d.ts +311 -212
- package/dist/core/index.js +237 -43
- package/dist/core/index.mjs +237 -43
- package/dist/{effect-CMOQKX8y.d.ts → effect-DIUHZ9IN.d.ts} +195 -1
- package/dist/effectRunner-CFLC32IK.cjs +8 -0
- package/dist/effectRunner-L4S7IPT3.js +8 -0
- package/dist/effectRunner-NNGG75QA.mjs +8 -0
- package/dist/http/index.cjs +1227 -2971
- package/dist/http/index.d.ts +826 -280
- package/dist/http/index.js +1089 -2833
- package/dist/http/index.mjs +1089 -2833
- package/dist/http/testing.cjs +161 -0
- package/dist/http/testing.d.ts +43 -0
- package/dist/http/testing.js +161 -0
- package/dist/http/testing.mjs +161 -0
- package/dist/index.cjs +486 -250
- package/dist/index.d.ts +87 -95
- package/dist/index.js +391 -155
- package/dist/index.mjs +391 -155
- package/dist/observability/index.cjs +162 -0
- package/dist/observability/index.d.ts +152 -0
- package/dist/observability/index.js +162 -0
- package/dist/observability/index.mjs +162 -0
- package/dist/perf/cli.cjs +401 -0
- package/dist/perf/cli.d.ts +1 -0
- package/dist/perf/cli.js +401 -0
- package/dist/perf/cli.mjs +401 -0
- package/dist/perf/index.cjs +141 -0
- package/dist/perf/index.d.ts +483 -0
- package/dist/perf/index.js +141 -0
- package/dist/perf/index.mjs +141 -0
- package/dist/schedule-CK3Ml_7p.d.ts +259 -0
- package/dist/schema/index.cjs +29 -0
- package/dist/schema/index.d.ts +179 -0
- package/dist/schema/index.js +29 -0
- package/dist/schema/index.mjs +29 -0
- package/dist/server-GJPg8ZSG.d.ts +675 -0
- package/dist/{stream-FQm9h4Mg.d.ts → stream-B4oK9JFP.d.ts} +1 -1
- package/dist/tracer-Hwt1cl7h.d.ts +189 -0
- package/dist/tracing-DqbTKGcf.d.ts +148 -0
- package/docs/ARCHITECTURE.md +292 -0
- package/docs/README.md +63 -0
- package/docs/adr/0001-ai-context-pack.md +32 -0
- package/docs/agent-apply-mode.md +104 -0
- package/docs/agent-approvals.md +110 -0
- package/docs/agent-batch.md +185 -0
- package/docs/agent-boundaries.md +112 -0
- package/docs/agent-chat-sessions.md +160 -0
- package/docs/agent-ci.md +17 -0
- package/docs/agent-cli.md +405 -0
- package/docs/agent-config.md +480 -0
- package/docs/agent-context-discovery.md +159 -0
- package/docs/agent-copilot-like-dx.md +126 -0
- package/docs/agent-declarative-optimized-planning.md +138 -0
- package/docs/agent-dx.md +224 -0
- package/docs/agent-env-files.md +126 -0
- package/docs/agent-follow-up-context.md +43 -0
- package/docs/agent-global-usage.md +180 -0
- package/docs/agent-init.md +109 -0
- package/docs/agent-install-and-configure.md +516 -0
- package/docs/agent-language-workspace-ux.md +99 -0
- package/docs/agent-llm-adapters.md +123 -0
- package/docs/agent-local-install.md +190 -0
- package/docs/agent-local-tests.md +51 -0
- package/docs/agent-observability.md +155 -0
- package/docs/agent-patch-quality-loop.md +162 -0
- package/docs/agent-presets.md +22 -0
- package/docs/agent-project-commands.md +237 -0
- package/docs/agent-project-intelligence.md +156 -0
- package/docs/agent-redaction.md +18 -0
- package/docs/agent-release-readiness.md +76 -0
- package/docs/agent-rollback-safety.md +162 -0
- package/docs/agent-rollback.md +23 -0
- package/docs/agent-run-artifacts.md +16 -0
- package/docs/agent-vscode-auto-discovery.md +137 -0
- package/docs/agent-vscode-batch-runner.md +100 -0
- package/docs/agent-vscode-chat-layout.md +90 -0
- package/docs/agent-vscode-clean-install.md +147 -0
- package/docs/agent-vscode-code-actions.md +70 -0
- package/docs/agent-vscode-diff-preview.md +45 -0
- package/docs/agent-vscode-inline-assist.md +56 -0
- package/docs/agent-vscode-install.md +186 -0
- package/docs/agent-vscode-model-setup.md +97 -0
- package/docs/agent-vscode-patch-preview.md +92 -0
- package/docs/agent-vscode-problems.md +79 -0
- package/docs/agent-vscode-project-dashboard.md +106 -0
- package/docs/agent-vscode-run-history.md +92 -0
- package/docs/agent-vscode-ux.md +73 -0
- package/docs/ai/INVARIANTS.md +84 -0
- package/docs/ai/PROJECT_MAP.md +338 -0
- package/docs/ai/PUBLIC_API.md +336 -0
- package/docs/ai/VALIDATION_MATRIX.md +67 -0
- package/docs/api-polish.md +37 -0
- package/docs/cancellation.md +162 -0
- package/docs/coverage.md +46 -0
- package/docs/getting-started.md +159 -0
- package/docs/guides/README.md +40 -0
- package/docs/guides/circuit-breaker.md +89 -0
- package/docs/guides/error-handling.md +91 -0
- package/docs/guides/getting-started.md +107 -0
- package/docs/guides/layers.md +189 -0
- package/docs/guides/metrics.md +101 -0
- package/docs/guides/resource-management.md +141 -0
- package/docs/guides/retry.md +215 -0
- package/docs/guides/semaphore.md +66 -0
- package/docs/guides/streams.md +117 -0
- package/docs/guides/supervisors.md +98 -0
- package/docs/guides/testing.md +162 -0
- package/docs/guides/tracing.md +71 -0
- package/docs/http-recipes.md +399 -0
- package/docs/http.md +749 -0
- package/docs/modules.md +285 -0
- package/docs/observability-collector-smoke.md +31 -0
- package/docs/observability-framework-examples.md +98 -0
- package/docs/observability.md +542 -0
- package/docs/otel-collector-smoke.yaml +27 -0
- package/docs/performance-profiler.md +199 -0
- package/docs/production-readiness.md +73 -0
- package/docs/recipes/README.md +12 -0
- package/docs/recipes/http-server.md +45 -0
- package/docs/recipes/layers.md +44 -0
- package/docs/recipes/performance.md +47 -0
- package/docs/recipes/runtime.md +41 -0
- package/docs/recipes/testing.md +41 -0
- package/docs/release.md +53 -0
- package/docs/wasm-bounded-queues.md +44 -0
- package/docs/wasm-engine-observability-benchmarks.md +85 -0
- package/docs/wasm-fiber-engine.md +117 -0
- package/docs/wasm-scheduler-state-machine.md +122 -0
- package/docs/wasm-stream-chunks.md +54 -0
- package/package.json +48 -2
- package/dist/chunk-AR22SXML.js +0 -1043
- package/dist/chunk-BDYEENHT.js +0 -224
- package/dist/chunk-JFPU5GQI.mjs +0 -1043
- package/dist/chunk-MS34J5LY.cjs +0 -224
- package/dist/chunk-UMAZLXAB.mjs +0 -224
- package/dist/chunk-XPZNXSVN.cjs +0 -1043
- package/dist/tracing-DNT9jEbr.d.ts +0 -106
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
|
+
|
|
3
|
+
var _chunk5EC274J5cjs = require('../chunk-5EC274J5.cjs');
|
|
4
|
+
require('../chunk-L6VB5N7Q.cjs');
|
|
5
|
+
require('../chunk-KZJQ723N.cjs');
|
|
6
|
+
require('../chunk-SA6HUJVI.cjs');
|
|
7
|
+
require('../chunk-AGR5B2BC.cjs');
|
|
8
|
+
require('../chunk-JF5WGYJJ.cjs');
|
|
9
|
+
require('../chunk-3LOYJFRR.cjs');
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var _chunkGLE2WY7Zcjs = require('../chunk-GLE2WY7Z.cjs');
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
var _chunkMVGUEJ5Zcjs = require('../chunk-MVGUEJ5Z.cjs');
|
|
17
|
+
require('../chunk-CZIVE6NT.cjs');
|
|
18
|
+
require('../chunk-OBGZSXTJ.cjs');
|
|
19
|
+
|
|
20
|
+
// src/http/testing.ts
|
|
21
|
+
function makeHttpResponse(bodyText = "", init = {}) {
|
|
22
|
+
return {
|
|
23
|
+
status: _nullishCoalesce(init.status, () => ( 200)),
|
|
24
|
+
statusText: _nullishCoalesce(init.statusText, () => ( "OK")),
|
|
25
|
+
headers: _nullishCoalesce(init.headers, () => ( {})),
|
|
26
|
+
bodyText,
|
|
27
|
+
ms: _nullishCoalesce(init.ms, () => ( 0))
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function makeTextHttpResponse(bodyText, init = {}) {
|
|
31
|
+
return makeHttpResponse(bodyText, init);
|
|
32
|
+
}
|
|
33
|
+
function makeJsonHttpResponse(body, init = {}) {
|
|
34
|
+
return makeHttpResponse(JSON.stringify(body), {
|
|
35
|
+
...init,
|
|
36
|
+
headers: {
|
|
37
|
+
"content-type": "application/json",
|
|
38
|
+
..._nullishCoalesce(init.headers, () => ( {}))
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function makeMockHttpClient(handler = () => makeHttpResponse()) {
|
|
43
|
+
const calls = [];
|
|
44
|
+
const stats = {
|
|
45
|
+
inFlight: 0,
|
|
46
|
+
started: 0,
|
|
47
|
+
succeeded: 0,
|
|
48
|
+
failed: 0,
|
|
49
|
+
aborted: 0,
|
|
50
|
+
timedOut: 0,
|
|
51
|
+
poolRejected: 0,
|
|
52
|
+
poolTimeouts: 0
|
|
53
|
+
};
|
|
54
|
+
const run = (req) => {
|
|
55
|
+
calls.push(req);
|
|
56
|
+
stats.started++;
|
|
57
|
+
try {
|
|
58
|
+
const result = handler(req, calls.length - 1);
|
|
59
|
+
if (isAsync(result)) return result;
|
|
60
|
+
stats.succeeded++;
|
|
61
|
+
return _chunkMVGUEJ5Zcjs.asyncSucceed.call(void 0, result);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
stats.failed++;
|
|
64
|
+
return _chunkMVGUEJ5Zcjs.asyncFail.call(void 0, toHttpError(error));
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return Object.assign(_chunk5EC274J5cjs.decorate.call(void 0, run, () => ({ ...stats })), {
|
|
68
|
+
calls: () => [...calls],
|
|
69
|
+
calledTimes: () => calls.length,
|
|
70
|
+
lastRequest: () => calls.at(-1),
|
|
71
|
+
reset: () => {
|
|
72
|
+
calls.length = 0;
|
|
73
|
+
stats.inFlight = 0;
|
|
74
|
+
stats.started = 0;
|
|
75
|
+
stats.succeeded = 0;
|
|
76
|
+
stats.failed = 0;
|
|
77
|
+
stats.aborted = 0;
|
|
78
|
+
stats.timedOut = 0;
|
|
79
|
+
stats.poolRejected = 0;
|
|
80
|
+
stats.poolTimeouts = 0;
|
|
81
|
+
delete stats.lastDurationMs;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function makeSequenceHttpClient(responses, fallback = makeHttpResponse()) {
|
|
86
|
+
return makeMockHttpClient((_req, index) => _nullishCoalesce(responses[index], () => ( fallback)));
|
|
87
|
+
}
|
|
88
|
+
function runHttpEffect(effect, env = {}) {
|
|
89
|
+
return _chunkGLE2WY7Zcjs.toPromise.call(void 0, effect, env);
|
|
90
|
+
}
|
|
91
|
+
function makeFetchResponse(body = null, init = {}) {
|
|
92
|
+
assertResponseAvailable();
|
|
93
|
+
return new Response(body, init);
|
|
94
|
+
}
|
|
95
|
+
function makeJsonFetchResponse(body, init = {}) {
|
|
96
|
+
assertResponseAvailable();
|
|
97
|
+
return new Response(JSON.stringify(body), {
|
|
98
|
+
...init,
|
|
99
|
+
headers: {
|
|
100
|
+
"content-type": "application/json",
|
|
101
|
+
...init.headers
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function installMockFetch(handler) {
|
|
106
|
+
const target = globalThis;
|
|
107
|
+
const original = target.fetch;
|
|
108
|
+
const calls = [];
|
|
109
|
+
const mockFetch = (async (input, init) => {
|
|
110
|
+
calls.push({ input, init });
|
|
111
|
+
return handler(input, init, calls.length - 1);
|
|
112
|
+
});
|
|
113
|
+
target.fetch = mockFetch;
|
|
114
|
+
return {
|
|
115
|
+
fetch: mockFetch,
|
|
116
|
+
calls: () => [...calls],
|
|
117
|
+
calledTimes: () => calls.length,
|
|
118
|
+
lastCall: () => calls.at(-1),
|
|
119
|
+
restore: () => {
|
|
120
|
+
if (original) target.fetch = original;
|
|
121
|
+
else Reflect.deleteProperty(target, "fetch");
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async function withMockFetch(handler, run) {
|
|
126
|
+
const mock = installMockFetch(handler);
|
|
127
|
+
try {
|
|
128
|
+
return await run(mock);
|
|
129
|
+
} finally {
|
|
130
|
+
mock.restore();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function isAsync(value) {
|
|
134
|
+
return typeof value === "object" && value !== null && "_tag" in value;
|
|
135
|
+
}
|
|
136
|
+
function toHttpError(error) {
|
|
137
|
+
if (isHttpError(error)) return error;
|
|
138
|
+
return { _tag: "FetchError", message: error instanceof Error ? error.message : String(error) };
|
|
139
|
+
}
|
|
140
|
+
function isHttpError(error) {
|
|
141
|
+
if (typeof error !== "object" || error === null || !("_tag" in error)) return false;
|
|
142
|
+
const tag = error._tag;
|
|
143
|
+
return tag === "Abort" || tag === "BadUrl" || tag === "FetchError" || tag === "Timeout" || tag === "PoolRejected" || tag === "PoolTimeout" || tag === "PoolClosed" || tag === "BatchSplitError";
|
|
144
|
+
}
|
|
145
|
+
function assertResponseAvailable() {
|
|
146
|
+
if (typeof Response === "undefined") {
|
|
147
|
+
throw new Error("HTTP test helpers require global Response for fetch response mocks.");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
exports.installMockFetch = installMockFetch; exports.makeFetchResponse = makeFetchResponse; exports.makeHttpResponse = makeHttpResponse; exports.makeJsonFetchResponse = makeJsonFetchResponse; exports.makeJsonHttpResponse = makeJsonHttpResponse; exports.makeMockHttpClient = makeMockHttpClient; exports.makeSequenceHttpClient = makeSequenceHttpClient; exports.makeTextHttpResponse = makeTextHttpResponse; exports.runHttpEffect = runHttpEffect; exports.withMockFetch = withMockFetch;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { A as Async } from '../effect-DIUHZ9IN.js';
|
|
2
|
+
import { H as HttpClient, a as HttpRequest, b as HttpWireResponse, c as HttpError } from '../client-CZHU674n.js';
|
|
3
|
+
import '../stream-B4oK9JFP.js';
|
|
4
|
+
import '../schedule-CK3Ml_7p.js';
|
|
5
|
+
import '../schema/index.js';
|
|
6
|
+
|
|
7
|
+
type HttpTestResponseInit = {
|
|
8
|
+
readonly status?: number;
|
|
9
|
+
readonly statusText?: string;
|
|
10
|
+
readonly headers?: Record<string, string>;
|
|
11
|
+
readonly ms?: number;
|
|
12
|
+
};
|
|
13
|
+
type MockHttpHandler = (req: HttpRequest, index: number) => HttpWireResponse | Async<unknown, HttpError, HttpWireResponse>;
|
|
14
|
+
type MockHttpClient = HttpClient & {
|
|
15
|
+
readonly calls: () => readonly HttpRequest[];
|
|
16
|
+
readonly calledTimes: () => number;
|
|
17
|
+
readonly lastRequest: () => HttpRequest | undefined;
|
|
18
|
+
readonly reset: () => void;
|
|
19
|
+
};
|
|
20
|
+
type MockFetchCall = {
|
|
21
|
+
readonly input: RequestInfo | URL;
|
|
22
|
+
readonly init?: RequestInit;
|
|
23
|
+
};
|
|
24
|
+
type MockFetchHandler = (input: RequestInfo | URL, init: RequestInit | undefined, index: number) => Response | Promise<Response>;
|
|
25
|
+
type MockFetchController = {
|
|
26
|
+
readonly fetch: typeof fetch;
|
|
27
|
+
readonly calls: () => readonly MockFetchCall[];
|
|
28
|
+
readonly calledTimes: () => number;
|
|
29
|
+
readonly lastCall: () => MockFetchCall | undefined;
|
|
30
|
+
readonly restore: () => void;
|
|
31
|
+
};
|
|
32
|
+
declare function makeHttpResponse(bodyText?: string, init?: HttpTestResponseInit): HttpWireResponse;
|
|
33
|
+
declare function makeTextHttpResponse(bodyText: string, init?: HttpTestResponseInit): HttpWireResponse;
|
|
34
|
+
declare function makeJsonHttpResponse(body: unknown, init?: HttpTestResponseInit): HttpWireResponse;
|
|
35
|
+
declare function makeMockHttpClient(handler?: MockHttpHandler): MockHttpClient;
|
|
36
|
+
declare function makeSequenceHttpClient(responses: readonly HttpWireResponse[], fallback?: HttpWireResponse): MockHttpClient;
|
|
37
|
+
declare function runHttpEffect<E, A>(effect: Async<unknown, E, A>, env?: unknown): Promise<A>;
|
|
38
|
+
declare function makeFetchResponse(body?: BodyInit | null, init?: ResponseInit): Response;
|
|
39
|
+
declare function makeJsonFetchResponse(body: unknown, init?: ResponseInit): Response;
|
|
40
|
+
declare function installMockFetch(handler: MockFetchHandler): MockFetchController;
|
|
41
|
+
declare function withMockFetch<A>(handler: MockFetchHandler, run: (mock: MockFetchController) => Promise<A> | A): Promise<A>;
|
|
42
|
+
|
|
43
|
+
export { type HttpTestResponseInit, type MockFetchCall, type MockFetchController, type MockFetchHandler, type MockHttpClient, type MockHttpHandler, installMockFetch, makeFetchResponse, makeHttpResponse, makeJsonFetchResponse, makeJsonHttpResponse, makeMockHttpClient, makeSequenceHttpClient, makeTextHttpResponse, runHttpEffect, withMockFetch };
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decorate
|
|
3
|
+
} from "../chunk-MIIYDLGM.js";
|
|
4
|
+
import "../chunk-TRM4JUZQ.js";
|
|
5
|
+
import "../chunk-7JIJOVCT.js";
|
|
6
|
+
import "../chunk-UCUBNWM2.js";
|
|
7
|
+
import "../chunk-6IXXWIUM.js";
|
|
8
|
+
import "../chunk-L2SYFEBS.js";
|
|
9
|
+
import "../chunk-3Y2RIUMM.js";
|
|
10
|
+
import {
|
|
11
|
+
toPromise
|
|
12
|
+
} from "../chunk-FH2X7BVP.js";
|
|
13
|
+
import {
|
|
14
|
+
asyncFail,
|
|
15
|
+
asyncSucceed
|
|
16
|
+
} from "../chunk-UB4B6OFY.js";
|
|
17
|
+
import "../chunk-C3MDXTRZ.js";
|
|
18
|
+
import "../chunk-3RG5ZIWI.js";
|
|
19
|
+
|
|
20
|
+
// src/http/testing.ts
|
|
21
|
+
function makeHttpResponse(bodyText = "", init = {}) {
|
|
22
|
+
return {
|
|
23
|
+
status: init.status ?? 200,
|
|
24
|
+
statusText: init.statusText ?? "OK",
|
|
25
|
+
headers: init.headers ?? {},
|
|
26
|
+
bodyText,
|
|
27
|
+
ms: init.ms ?? 0
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function makeTextHttpResponse(bodyText, init = {}) {
|
|
31
|
+
return makeHttpResponse(bodyText, init);
|
|
32
|
+
}
|
|
33
|
+
function makeJsonHttpResponse(body, init = {}) {
|
|
34
|
+
return makeHttpResponse(JSON.stringify(body), {
|
|
35
|
+
...init,
|
|
36
|
+
headers: {
|
|
37
|
+
"content-type": "application/json",
|
|
38
|
+
...init.headers ?? {}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function makeMockHttpClient(handler = () => makeHttpResponse()) {
|
|
43
|
+
const calls = [];
|
|
44
|
+
const stats = {
|
|
45
|
+
inFlight: 0,
|
|
46
|
+
started: 0,
|
|
47
|
+
succeeded: 0,
|
|
48
|
+
failed: 0,
|
|
49
|
+
aborted: 0,
|
|
50
|
+
timedOut: 0,
|
|
51
|
+
poolRejected: 0,
|
|
52
|
+
poolTimeouts: 0
|
|
53
|
+
};
|
|
54
|
+
const run = (req) => {
|
|
55
|
+
calls.push(req);
|
|
56
|
+
stats.started++;
|
|
57
|
+
try {
|
|
58
|
+
const result = handler(req, calls.length - 1);
|
|
59
|
+
if (isAsync(result)) return result;
|
|
60
|
+
stats.succeeded++;
|
|
61
|
+
return asyncSucceed(result);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
stats.failed++;
|
|
64
|
+
return asyncFail(toHttpError(error));
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return Object.assign(decorate(run, () => ({ ...stats })), {
|
|
68
|
+
calls: () => [...calls],
|
|
69
|
+
calledTimes: () => calls.length,
|
|
70
|
+
lastRequest: () => calls.at(-1),
|
|
71
|
+
reset: () => {
|
|
72
|
+
calls.length = 0;
|
|
73
|
+
stats.inFlight = 0;
|
|
74
|
+
stats.started = 0;
|
|
75
|
+
stats.succeeded = 0;
|
|
76
|
+
stats.failed = 0;
|
|
77
|
+
stats.aborted = 0;
|
|
78
|
+
stats.timedOut = 0;
|
|
79
|
+
stats.poolRejected = 0;
|
|
80
|
+
stats.poolTimeouts = 0;
|
|
81
|
+
delete stats.lastDurationMs;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function makeSequenceHttpClient(responses, fallback = makeHttpResponse()) {
|
|
86
|
+
return makeMockHttpClient((_req, index) => responses[index] ?? fallback);
|
|
87
|
+
}
|
|
88
|
+
function runHttpEffect(effect, env = {}) {
|
|
89
|
+
return toPromise(effect, env);
|
|
90
|
+
}
|
|
91
|
+
function makeFetchResponse(body = null, init = {}) {
|
|
92
|
+
assertResponseAvailable();
|
|
93
|
+
return new Response(body, init);
|
|
94
|
+
}
|
|
95
|
+
function makeJsonFetchResponse(body, init = {}) {
|
|
96
|
+
assertResponseAvailable();
|
|
97
|
+
return new Response(JSON.stringify(body), {
|
|
98
|
+
...init,
|
|
99
|
+
headers: {
|
|
100
|
+
"content-type": "application/json",
|
|
101
|
+
...init.headers
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function installMockFetch(handler) {
|
|
106
|
+
const target = globalThis;
|
|
107
|
+
const original = target.fetch;
|
|
108
|
+
const calls = [];
|
|
109
|
+
const mockFetch = (async (input, init) => {
|
|
110
|
+
calls.push({ input, init });
|
|
111
|
+
return handler(input, init, calls.length - 1);
|
|
112
|
+
});
|
|
113
|
+
target.fetch = mockFetch;
|
|
114
|
+
return {
|
|
115
|
+
fetch: mockFetch,
|
|
116
|
+
calls: () => [...calls],
|
|
117
|
+
calledTimes: () => calls.length,
|
|
118
|
+
lastCall: () => calls.at(-1),
|
|
119
|
+
restore: () => {
|
|
120
|
+
if (original) target.fetch = original;
|
|
121
|
+
else Reflect.deleteProperty(target, "fetch");
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async function withMockFetch(handler, run) {
|
|
126
|
+
const mock = installMockFetch(handler);
|
|
127
|
+
try {
|
|
128
|
+
return await run(mock);
|
|
129
|
+
} finally {
|
|
130
|
+
mock.restore();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function isAsync(value) {
|
|
134
|
+
return typeof value === "object" && value !== null && "_tag" in value;
|
|
135
|
+
}
|
|
136
|
+
function toHttpError(error) {
|
|
137
|
+
if (isHttpError(error)) return error;
|
|
138
|
+
return { _tag: "FetchError", message: error instanceof Error ? error.message : String(error) };
|
|
139
|
+
}
|
|
140
|
+
function isHttpError(error) {
|
|
141
|
+
if (typeof error !== "object" || error === null || !("_tag" in error)) return false;
|
|
142
|
+
const tag = error._tag;
|
|
143
|
+
return tag === "Abort" || tag === "BadUrl" || tag === "FetchError" || tag === "Timeout" || tag === "PoolRejected" || tag === "PoolTimeout" || tag === "PoolClosed" || tag === "BatchSplitError";
|
|
144
|
+
}
|
|
145
|
+
function assertResponseAvailable() {
|
|
146
|
+
if (typeof Response === "undefined") {
|
|
147
|
+
throw new Error("HTTP test helpers require global Response for fetch response mocks.");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export {
|
|
151
|
+
installMockFetch,
|
|
152
|
+
makeFetchResponse,
|
|
153
|
+
makeHttpResponse,
|
|
154
|
+
makeJsonFetchResponse,
|
|
155
|
+
makeJsonHttpResponse,
|
|
156
|
+
makeMockHttpClient,
|
|
157
|
+
makeSequenceHttpClient,
|
|
158
|
+
makeTextHttpResponse,
|
|
159
|
+
runHttpEffect,
|
|
160
|
+
withMockFetch
|
|
161
|
+
};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decorate
|
|
3
|
+
} from "../chunk-5VRJNBLZ.mjs";
|
|
4
|
+
import "../chunk-MOO4L7F4.mjs";
|
|
5
|
+
import "../chunk-FHQGHPMO.mjs";
|
|
6
|
+
import "../chunk-B5JD23U7.mjs";
|
|
7
|
+
import "../chunk-2HQTDLHF.mjs";
|
|
8
|
+
import "../chunk-A2OM6NEH.mjs";
|
|
9
|
+
import "../chunk-PWC3RBQE.mjs";
|
|
10
|
+
import {
|
|
11
|
+
toPromise
|
|
12
|
+
} from "../chunk-GYM3LLGS.mjs";
|
|
13
|
+
import {
|
|
14
|
+
asyncFail,
|
|
15
|
+
asyncSucceed
|
|
16
|
+
} from "../chunk-36I3M4UC.mjs";
|
|
17
|
+
import "../chunk-DNFJLJMW.mjs";
|
|
18
|
+
import "../chunk-Y6FXYEAI.mjs";
|
|
19
|
+
|
|
20
|
+
// src/http/testing.ts
|
|
21
|
+
function makeHttpResponse(bodyText = "", init = {}) {
|
|
22
|
+
return {
|
|
23
|
+
status: init.status ?? 200,
|
|
24
|
+
statusText: init.statusText ?? "OK",
|
|
25
|
+
headers: init.headers ?? {},
|
|
26
|
+
bodyText,
|
|
27
|
+
ms: init.ms ?? 0
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function makeTextHttpResponse(bodyText, init = {}) {
|
|
31
|
+
return makeHttpResponse(bodyText, init);
|
|
32
|
+
}
|
|
33
|
+
function makeJsonHttpResponse(body, init = {}) {
|
|
34
|
+
return makeHttpResponse(JSON.stringify(body), {
|
|
35
|
+
...init,
|
|
36
|
+
headers: {
|
|
37
|
+
"content-type": "application/json",
|
|
38
|
+
...init.headers ?? {}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function makeMockHttpClient(handler = () => makeHttpResponse()) {
|
|
43
|
+
const calls = [];
|
|
44
|
+
const stats = {
|
|
45
|
+
inFlight: 0,
|
|
46
|
+
started: 0,
|
|
47
|
+
succeeded: 0,
|
|
48
|
+
failed: 0,
|
|
49
|
+
aborted: 0,
|
|
50
|
+
timedOut: 0,
|
|
51
|
+
poolRejected: 0,
|
|
52
|
+
poolTimeouts: 0
|
|
53
|
+
};
|
|
54
|
+
const run = (req) => {
|
|
55
|
+
calls.push(req);
|
|
56
|
+
stats.started++;
|
|
57
|
+
try {
|
|
58
|
+
const result = handler(req, calls.length - 1);
|
|
59
|
+
if (isAsync(result)) return result;
|
|
60
|
+
stats.succeeded++;
|
|
61
|
+
return asyncSucceed(result);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
stats.failed++;
|
|
64
|
+
return asyncFail(toHttpError(error));
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return Object.assign(decorate(run, () => ({ ...stats })), {
|
|
68
|
+
calls: () => [...calls],
|
|
69
|
+
calledTimes: () => calls.length,
|
|
70
|
+
lastRequest: () => calls.at(-1),
|
|
71
|
+
reset: () => {
|
|
72
|
+
calls.length = 0;
|
|
73
|
+
stats.inFlight = 0;
|
|
74
|
+
stats.started = 0;
|
|
75
|
+
stats.succeeded = 0;
|
|
76
|
+
stats.failed = 0;
|
|
77
|
+
stats.aborted = 0;
|
|
78
|
+
stats.timedOut = 0;
|
|
79
|
+
stats.poolRejected = 0;
|
|
80
|
+
stats.poolTimeouts = 0;
|
|
81
|
+
delete stats.lastDurationMs;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function makeSequenceHttpClient(responses, fallback = makeHttpResponse()) {
|
|
86
|
+
return makeMockHttpClient((_req, index) => responses[index] ?? fallback);
|
|
87
|
+
}
|
|
88
|
+
function runHttpEffect(effect, env = {}) {
|
|
89
|
+
return toPromise(effect, env);
|
|
90
|
+
}
|
|
91
|
+
function makeFetchResponse(body = null, init = {}) {
|
|
92
|
+
assertResponseAvailable();
|
|
93
|
+
return new Response(body, init);
|
|
94
|
+
}
|
|
95
|
+
function makeJsonFetchResponse(body, init = {}) {
|
|
96
|
+
assertResponseAvailable();
|
|
97
|
+
return new Response(JSON.stringify(body), {
|
|
98
|
+
...init,
|
|
99
|
+
headers: {
|
|
100
|
+
"content-type": "application/json",
|
|
101
|
+
...init.headers
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function installMockFetch(handler) {
|
|
106
|
+
const target = globalThis;
|
|
107
|
+
const original = target.fetch;
|
|
108
|
+
const calls = [];
|
|
109
|
+
const mockFetch = (async (input, init) => {
|
|
110
|
+
calls.push({ input, init });
|
|
111
|
+
return handler(input, init, calls.length - 1);
|
|
112
|
+
});
|
|
113
|
+
target.fetch = mockFetch;
|
|
114
|
+
return {
|
|
115
|
+
fetch: mockFetch,
|
|
116
|
+
calls: () => [...calls],
|
|
117
|
+
calledTimes: () => calls.length,
|
|
118
|
+
lastCall: () => calls.at(-1),
|
|
119
|
+
restore: () => {
|
|
120
|
+
if (original) target.fetch = original;
|
|
121
|
+
else Reflect.deleteProperty(target, "fetch");
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async function withMockFetch(handler, run) {
|
|
126
|
+
const mock = installMockFetch(handler);
|
|
127
|
+
try {
|
|
128
|
+
return await run(mock);
|
|
129
|
+
} finally {
|
|
130
|
+
mock.restore();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function isAsync(value) {
|
|
134
|
+
return typeof value === "object" && value !== null && "_tag" in value;
|
|
135
|
+
}
|
|
136
|
+
function toHttpError(error) {
|
|
137
|
+
if (isHttpError(error)) return error;
|
|
138
|
+
return { _tag: "FetchError", message: error instanceof Error ? error.message : String(error) };
|
|
139
|
+
}
|
|
140
|
+
function isHttpError(error) {
|
|
141
|
+
if (typeof error !== "object" || error === null || !("_tag" in error)) return false;
|
|
142
|
+
const tag = error._tag;
|
|
143
|
+
return tag === "Abort" || tag === "BadUrl" || tag === "FetchError" || tag === "Timeout" || tag === "PoolRejected" || tag === "PoolTimeout" || tag === "PoolClosed" || tag === "BatchSplitError";
|
|
144
|
+
}
|
|
145
|
+
function assertResponseAvailable() {
|
|
146
|
+
if (typeof Response === "undefined") {
|
|
147
|
+
throw new Error("HTTP test helpers require global Response for fetch response mocks.");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export {
|
|
151
|
+
installMockFetch,
|
|
152
|
+
makeFetchResponse,
|
|
153
|
+
makeHttpResponse,
|
|
154
|
+
makeJsonFetchResponse,
|
|
155
|
+
makeJsonHttpResponse,
|
|
156
|
+
makeMockHttpClient,
|
|
157
|
+
makeSequenceHttpClient,
|
|
158
|
+
makeTextHttpResponse,
|
|
159
|
+
runHttpEffect,
|
|
160
|
+
withMockFetch
|
|
161
|
+
};
|