ts-procedures 5.15.0 → 6.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/README.md +2 -0
- package/agent_config/claude-code/agents/ts-procedures-architect.md +13 -6
- package/agent_config/claude-code/skills/ts-procedures/SKILL.md +26 -4
- package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +85 -17
- package/agent_config/claude-code/skills/ts-procedures/api-reference.md +220 -9
- package/agent_config/claude-code/skills/ts-procedures/patterns.md +271 -16
- package/agent_config/claude-code/skills/ts-procedures-review/SKILL.md +1 -1
- package/agent_config/claude-code/skills/ts-procedures-review/checklist.md +20 -12
- package/agent_config/claude-code/skills/ts-procedures-scaffold/SKILL.md +2 -1
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/client.md +53 -18
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/express-rpc.md +20 -17
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-api.md +20 -16
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-rpc.md +20 -17
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-stream.md +16 -3
- package/agent_config/copilot/copilot-instructions.md +132 -19
- package/agent_config/cursor/cursorrules +132 -19
- package/build/client/call.d.ts +19 -9
- package/build/client/call.js +33 -19
- package/build/client/call.js.map +1 -1
- package/build/client/call.test.js +167 -17
- package/build/client/call.test.js.map +1 -1
- package/build/client/error-dispatch.d.ts +13 -0
- package/build/client/error-dispatch.js +26 -0
- package/build/client/error-dispatch.js.map +1 -0
- package/build/client/error-dispatch.test.d.ts +1 -0
- package/build/client/error-dispatch.test.js +56 -0
- package/build/client/error-dispatch.test.js.map +1 -0
- package/build/client/fetch-adapter.js +10 -4
- package/build/client/fetch-adapter.js.map +1 -1
- package/build/client/index.d.ts +2 -1
- package/build/client/index.js +22 -3
- package/build/client/index.js.map +1 -1
- package/build/client/index.test.js +104 -0
- package/build/client/index.test.js.map +1 -1
- package/build/client/resolve-options.d.ts +45 -0
- package/build/client/resolve-options.js +82 -0
- package/build/client/resolve-options.js.map +1 -0
- package/build/client/resolve-options.test.d.ts +1 -0
- package/build/client/resolve-options.test.js +158 -0
- package/build/client/resolve-options.test.js.map +1 -0
- package/build/client/stream.d.ts +19 -9
- package/build/client/stream.js +36 -21
- package/build/client/stream.js.map +1 -1
- package/build/client/stream.test.js +102 -46
- package/build/client/stream.test.js.map +1 -1
- package/build/client/typed-error-dispatch.test.d.ts +1 -0
- package/build/client/typed-error-dispatch.test.js +168 -0
- package/build/client/typed-error-dispatch.test.js.map +1 -0
- package/build/client/types.d.ts +105 -1
- package/build/client/types.js +1 -1
- package/build/codegen/e2e.test.js +150 -4
- package/build/codegen/e2e.test.js.map +1 -1
- package/build/codegen/emit-client-runtime.js +7 -0
- package/build/codegen/emit-client-runtime.js.map +1 -1
- package/build/codegen/emit-errors.d.ts +17 -6
- package/build/codegen/emit-errors.integration.test.d.ts +1 -0
- package/build/codegen/emit-errors.integration.test.js +162 -0
- package/build/codegen/emit-errors.integration.test.js.map +1 -0
- package/build/codegen/emit-errors.js +50 -39
- package/build/codegen/emit-errors.js.map +1 -1
- package/build/codegen/emit-errors.test.js +75 -78
- package/build/codegen/emit-errors.test.js.map +1 -1
- package/build/codegen/emit-index.d.ts +7 -0
- package/build/codegen/emit-index.js +26 -4
- package/build/codegen/emit-index.js.map +1 -1
- package/build/codegen/emit-index.test.js +55 -23
- package/build/codegen/emit-index.test.js.map +1 -1
- package/build/codegen/emit-scope.d.ts +8 -0
- package/build/codegen/emit-scope.js +82 -7
- package/build/codegen/emit-scope.js.map +1 -1
- package/build/codegen/pipeline.js +22 -2
- package/build/codegen/pipeline.js.map +1 -1
- package/build/implementations/http/doc-registry.d.ts +21 -0
- package/build/implementations/http/doc-registry.js +51 -78
- package/build/implementations/http/doc-registry.js.map +1 -1
- package/build/implementations/http/doc-registry.test.js +8 -6
- package/build/implementations/http/doc-registry.test.js.map +1 -1
- package/build/implementations/http/error-taxonomy.d.ts +240 -0
- package/build/implementations/http/error-taxonomy.js +230 -0
- package/build/implementations/http/error-taxonomy.js.map +1 -0
- package/build/implementations/http/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/error-taxonomy.test.js +399 -0
- package/build/implementations/http/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/express-rpc/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/express-rpc/error-taxonomy.test.js +83 -0
- package/build/implementations/http/express-rpc/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/express-rpc/index.d.ts +39 -8
- package/build/implementations/http/express-rpc/index.js +39 -8
- package/build/implementations/http/express-rpc/index.js.map +1 -1
- package/build/implementations/http/hono-api/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/hono-api/error-taxonomy.test.js +137 -0
- package/build/implementations/http/hono-api/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/hono-api/index.d.ts +38 -1
- package/build/implementations/http/hono-api/index.js +32 -0
- package/build/implementations/http/hono-api/index.js.map +1 -1
- package/build/implementations/http/hono-rpc/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/hono-rpc/error-taxonomy.test.js +64 -0
- package/build/implementations/http/hono-rpc/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/hono-rpc/index.d.ts +34 -7
- package/build/implementations/http/hono-rpc/index.js +31 -4
- package/build/implementations/http/hono-rpc/index.js.map +1 -1
- package/build/implementations/http/hono-stream/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/hono-stream/error-taxonomy.test.js +87 -0
- package/build/implementations/http/hono-stream/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/hono-stream/index.d.ts +40 -3
- package/build/implementations/http/hono-stream/index.js +37 -10
- package/build/implementations/http/hono-stream/index.js.map +1 -1
- package/build/implementations/http/hono-stream/index.test.js +45 -18
- package/build/implementations/http/hono-stream/index.test.js.map +1 -1
- package/build/implementations/http/on-request-error.test.d.ts +1 -0
- package/build/implementations/http/on-request-error.test.js +173 -0
- package/build/implementations/http/on-request-error.test.js.map +1 -0
- package/build/implementations/http/route-errors.test.d.ts +1 -0
- package/build/implementations/http/route-errors.test.js +140 -0
- package/build/implementations/http/route-errors.test.js.map +1 -0
- package/build/implementations/types.d.ts +30 -2
- package/docs/client-and-codegen.md +228 -14
- package/docs/core.md +14 -5
- package/docs/http-integrations.md +135 -4
- package/docs/streaming.md +3 -1
- package/package.json +7 -2
- package/src/client/call.test.ts +202 -29
- package/src/client/call.ts +50 -28
- package/src/client/error-dispatch.test.ts +72 -0
- package/src/client/error-dispatch.ts +27 -0
- package/src/client/fetch-adapter.ts +11 -5
- package/src/client/index.test.ts +117 -0
- package/src/client/index.ts +34 -8
- package/src/client/resolve-options.test.ts +205 -0
- package/src/client/resolve-options.ts +113 -0
- package/src/client/stream.test.ts +132 -107
- package/src/client/stream.ts +53 -27
- package/src/client/typed-error-dispatch.test.ts +211 -0
- package/src/client/types.ts +116 -2
- package/src/codegen/e2e.test.ts +160 -4
- package/src/codegen/emit-client-runtime.ts +7 -0
- package/src/codegen/emit-errors.integration.test.ts +183 -0
- package/src/codegen/emit-errors.test.ts +91 -87
- package/src/codegen/emit-errors.ts +123 -41
- package/src/codegen/emit-index.test.ts +68 -24
- package/src/codegen/emit-index.ts +66 -4
- package/src/codegen/emit-scope.ts +124 -7
- package/src/codegen/pipeline.ts +25 -2
- package/src/implementations/http/README.md +28 -5
- package/src/implementations/http/doc-registry.test.ts +10 -6
- package/src/implementations/http/doc-registry.ts +63 -80
- package/src/implementations/http/error-taxonomy.test.ts +438 -0
- package/src/implementations/http/error-taxonomy.ts +337 -0
- package/src/implementations/http/express-rpc/README.md +21 -22
- package/src/implementations/http/express-rpc/error-taxonomy.test.ts +103 -0
- package/src/implementations/http/express-rpc/index.ts +75 -14
- package/src/implementations/http/hono-api/README.md +284 -0
- package/src/implementations/http/hono-api/error-taxonomy.test.ts +179 -0
- package/src/implementations/http/hono-api/index.ts +76 -1
- package/src/implementations/http/hono-rpc/README.md +18 -19
- package/src/implementations/http/hono-rpc/error-taxonomy.test.ts +82 -0
- package/src/implementations/http/hono-rpc/index.ts +65 -9
- package/src/implementations/http/hono-stream/README.md +44 -25
- package/src/implementations/http/hono-stream/error-taxonomy.test.ts +98 -0
- package/src/implementations/http/hono-stream/index.test.ts +54 -18
- package/src/implementations/http/hono-stream/index.ts +83 -13
- package/src/implementations/http/on-request-error.test.ts +201 -0
- package/src/implementations/http/route-errors.test.ts +177 -0
- package/src/implementations/types.ts +30 -2
|
@@ -32,6 +32,9 @@ function makeStreamAdapter(response, items) {
|
|
|
32
32
|
})),
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
+
function run({ adapter, hooks = {}, defaults, options, descriptor = makeDescriptor(), basePath = 'https://api.example.com', }) {
|
|
36
|
+
return executeStream({ descriptor, basePath, adapter, hooks, defaults, options });
|
|
37
|
+
}
|
|
35
38
|
// ── createTypedStream — SSE mode ──────────────────────────
|
|
36
39
|
describe('createTypedStream — SSE mode', () => {
|
|
37
40
|
it('yields data payloads for normal events', async () => {
|
|
@@ -41,9 +44,8 @@ describe('createTypedStream — SSE mode', () => {
|
|
|
41
44
|
];
|
|
42
45
|
const stream = createTypedStream(makeAsyncIterable(sseItems), 'sse');
|
|
43
46
|
const received = [];
|
|
44
|
-
for await (const item of stream)
|
|
47
|
+
for await (const item of stream)
|
|
45
48
|
received.push(item);
|
|
46
|
-
}
|
|
47
49
|
expect(received).toEqual([{ count: 1 }, { count: 2 }]);
|
|
48
50
|
});
|
|
49
51
|
it('captures return event data in .result instead of yielding', async () => {
|
|
@@ -53,23 +55,15 @@ describe('createTypedStream — SSE mode', () => {
|
|
|
53
55
|
];
|
|
54
56
|
const stream = createTypedStream(makeAsyncIterable(sseItems), 'sse');
|
|
55
57
|
const yielded = [];
|
|
56
|
-
for await (const item of stream)
|
|
58
|
+
for await (const item of stream)
|
|
57
59
|
yielded.push(item);
|
|
58
|
-
}
|
|
59
|
-
// Only the 'update' event is yielded
|
|
60
60
|
expect(yielded).toEqual([{ count: 1 }]);
|
|
61
|
-
|
|
62
|
-
const result = await stream.result;
|
|
63
|
-
expect(result).toEqual({ total: 99 });
|
|
61
|
+
await expect(stream.result).resolves.toEqual({ total: 99 });
|
|
64
62
|
});
|
|
65
63
|
it('resolves .result with undefined when no return event', async () => {
|
|
66
|
-
const
|
|
67
|
-
{ data: 'hello', event: 'message' },
|
|
68
|
-
];
|
|
69
|
-
const stream = createTypedStream(makeAsyncIterable(sseItems), 'sse');
|
|
64
|
+
const stream = createTypedStream(makeAsyncIterable([{ data: 'hello', event: 'message' }]), 'sse');
|
|
70
65
|
for await (const _ of stream) { /* drain */ }
|
|
71
|
-
|
|
72
|
-
expect(result).toBeUndefined();
|
|
66
|
+
await expect(stream.result).resolves.toBeUndefined();
|
|
73
67
|
});
|
|
74
68
|
it('rejects .result and re-throws on error', async () => {
|
|
75
69
|
async function* errorIterable() {
|
|
@@ -77,23 +71,16 @@ describe('createTypedStream — SSE mode', () => {
|
|
|
77
71
|
throw new Error('stream broke');
|
|
78
72
|
}
|
|
79
73
|
const stream = createTypedStream(errorIterable(), 'sse');
|
|
80
|
-
// Consuming the stream should throw
|
|
81
74
|
await expect(async () => {
|
|
82
75
|
for await (const _ of stream) { /* drain */ }
|
|
83
76
|
}).rejects.toThrow('stream broke');
|
|
84
|
-
// .result should also reject
|
|
85
77
|
await expect(stream.result).rejects.toThrow('stream broke');
|
|
86
78
|
});
|
|
87
79
|
it('handles SSE items without event field (defaults to yielding data)', async () => {
|
|
88
|
-
const
|
|
89
|
-
{ data: 'a' },
|
|
90
|
-
{ data: 'b' },
|
|
91
|
-
];
|
|
92
|
-
const stream = createTypedStream(makeAsyncIterable(sseItems), 'sse');
|
|
80
|
+
const stream = createTypedStream(makeAsyncIterable([{ data: 'a' }, { data: 'b' }]), 'sse');
|
|
93
81
|
const yielded = [];
|
|
94
|
-
for await (const item of stream)
|
|
82
|
+
for await (const item of stream)
|
|
95
83
|
yielded.push(item);
|
|
96
|
-
}
|
|
97
84
|
expect(yielded).toEqual(['a', 'b']);
|
|
98
85
|
});
|
|
99
86
|
});
|
|
@@ -103,16 +90,14 @@ describe('createTypedStream — text mode', () => {
|
|
|
103
90
|
const chunks = ['chunk1', 'chunk2', 'chunk3'];
|
|
104
91
|
const stream = createTypedStream(makeAsyncIterable(chunks), 'text');
|
|
105
92
|
const received = [];
|
|
106
|
-
for await (const chunk of stream)
|
|
93
|
+
for await (const chunk of stream)
|
|
107
94
|
received.push(chunk);
|
|
108
|
-
}
|
|
109
95
|
expect(received).toEqual(chunks);
|
|
110
96
|
});
|
|
111
97
|
it('.result resolves to void on normal completion', async () => {
|
|
112
98
|
const stream = createTypedStream(makeAsyncIterable(['a', 'b']), 'text');
|
|
113
99
|
for await (const _ of stream) { /* drain */ }
|
|
114
|
-
|
|
115
|
-
expect(result).toBeUndefined();
|
|
100
|
+
await expect(stream.result).resolves.toBeUndefined();
|
|
116
101
|
});
|
|
117
102
|
it('rejects .result and re-throws on error', async () => {
|
|
118
103
|
async function* errorIterable() {
|
|
@@ -131,12 +116,11 @@ describe('executeStream', () => {
|
|
|
131
116
|
it('calls adapter.stream and returns a TypedStream', async () => {
|
|
132
117
|
const items = [{ data: 'hello', event: 'msg' }];
|
|
133
118
|
const adapter = makeStreamAdapter({}, items);
|
|
134
|
-
const stream = await
|
|
119
|
+
const stream = await run({ adapter });
|
|
135
120
|
expect(adapter.stream).toHaveBeenCalledOnce();
|
|
136
121
|
const received = [];
|
|
137
|
-
for await (const item of stream)
|
|
122
|
+
for await (const item of stream)
|
|
138
123
|
received.push(item);
|
|
139
|
-
}
|
|
140
124
|
expect(received).toEqual(['hello']);
|
|
141
125
|
});
|
|
142
126
|
it('runs onBeforeRequest before calling adapter', async () => {
|
|
@@ -148,15 +132,14 @@ describe('executeStream', () => {
|
|
|
148
132
|
return { status: 200, headers: {}, body: makeAsyncIterable([]) };
|
|
149
133
|
}),
|
|
150
134
|
};
|
|
151
|
-
const
|
|
135
|
+
const hooks = {
|
|
152
136
|
onBeforeRequest: (ctx) => ({
|
|
153
137
|
...ctx,
|
|
154
138
|
request: { ...ctx.request, headers: { 'x-stream-auth': 'stream-token' } },
|
|
155
139
|
}),
|
|
156
140
|
};
|
|
157
|
-
const stream = await
|
|
158
|
-
|
|
159
|
-
for await (const _ of stream) { /* noop */ }
|
|
141
|
+
const stream = await run({ adapter, hooks });
|
|
142
|
+
for await (const _ of stream) { /* drain */ }
|
|
160
143
|
expect(capturedHeaders[0]?.['x-stream-auth']).toBe('stream-token');
|
|
161
144
|
});
|
|
162
145
|
it('runs onAfterResponse immediately (before iteration)', async () => {
|
|
@@ -168,11 +151,10 @@ describe('executeStream', () => {
|
|
|
168
151
|
return { status: 200, headers: {}, body: makeAsyncIterable([]) };
|
|
169
152
|
}),
|
|
170
153
|
};
|
|
171
|
-
const
|
|
154
|
+
const hooks = {
|
|
172
155
|
onAfterResponse: () => { order.push('afterResponse'); },
|
|
173
156
|
};
|
|
174
|
-
await
|
|
175
|
-
// After executeStream returns (before iteration), afterResponse should have fired
|
|
157
|
+
await run({ adapter, hooks });
|
|
176
158
|
expect(order).toEqual(['adapter', 'afterResponse']);
|
|
177
159
|
});
|
|
178
160
|
it('throws ClientRequestError on non-2xx status', async () => {
|
|
@@ -184,7 +166,7 @@ describe('executeStream', () => {
|
|
|
184
166
|
body: makeAsyncIterable([]),
|
|
185
167
|
})),
|
|
186
168
|
};
|
|
187
|
-
await expect(
|
|
169
|
+
await expect(run({ adapter })).rejects.toThrow(ClientRequestError);
|
|
188
170
|
});
|
|
189
171
|
it('runs onError on adapter failure and re-throws', async () => {
|
|
190
172
|
const adapterError = new Error('stream connection failed');
|
|
@@ -193,10 +175,10 @@ describe('executeStream', () => {
|
|
|
193
175
|
stream: vi.fn(async () => { throw adapterError; }),
|
|
194
176
|
};
|
|
195
177
|
const receivedErrors = [];
|
|
196
|
-
const
|
|
178
|
+
const hooks = {
|
|
197
179
|
onError: (ctx) => { receivedErrors.push(ctx.error); },
|
|
198
180
|
};
|
|
199
|
-
await expect(
|
|
181
|
+
await expect(run({ adapter, hooks })).rejects.toThrow('stream connection failed');
|
|
200
182
|
expect(receivedErrors[0]).toBe(adapterError);
|
|
201
183
|
});
|
|
202
184
|
it('returns TypedStream with working .result for SSE return event', async () => {
|
|
@@ -205,24 +187,98 @@ describe('executeStream', () => {
|
|
|
205
187
|
{ data: { final: true }, event: 'return' },
|
|
206
188
|
];
|
|
207
189
|
const adapter = makeStreamAdapter({}, sseItems);
|
|
208
|
-
const stream = await
|
|
190
|
+
const stream = await run({
|
|
191
|
+
adapter,
|
|
192
|
+
descriptor: makeDescriptor({ streamMode: 'sse' }),
|
|
193
|
+
});
|
|
209
194
|
const yielded = [];
|
|
210
|
-
for await (const item of stream)
|
|
195
|
+
for await (const item of stream)
|
|
211
196
|
yielded.push(item);
|
|
212
|
-
}
|
|
213
197
|
expect(yielded).toEqual([{ n: 1 }]);
|
|
214
198
|
await expect(stream.result).resolves.toEqual({ final: true });
|
|
215
199
|
});
|
|
216
200
|
it('returns TypedStream for text mode', async () => {
|
|
217
201
|
const chunks = ['line1', 'line2'];
|
|
218
202
|
const adapter = makeStreamAdapter({}, chunks);
|
|
219
|
-
const stream = await
|
|
203
|
+
const stream = await run({
|
|
204
|
+
adapter,
|
|
205
|
+
descriptor: makeDescriptor({ streamMode: 'text' }),
|
|
206
|
+
});
|
|
220
207
|
const received = [];
|
|
221
|
-
for await (const chunk of stream)
|
|
208
|
+
for await (const chunk of stream)
|
|
222
209
|
received.push(chunk);
|
|
223
|
-
}
|
|
224
210
|
expect(received).toEqual(chunks);
|
|
225
211
|
await expect(stream.result).resolves.toBeUndefined();
|
|
226
212
|
});
|
|
213
|
+
// ── Per-call options ──
|
|
214
|
+
it('per-call timeout attaches a signal via AbortSignal.timeout', async () => {
|
|
215
|
+
const spy = vi.spyOn(AbortSignal, 'timeout');
|
|
216
|
+
try {
|
|
217
|
+
let observedSignal;
|
|
218
|
+
const adapter = {
|
|
219
|
+
request: vi.fn(async () => { throw new Error('not expected'); }),
|
|
220
|
+
stream: vi.fn(async (req) => {
|
|
221
|
+
observedSignal = req.signal;
|
|
222
|
+
return { status: 200, headers: {}, body: makeAsyncIterable([]) };
|
|
223
|
+
}),
|
|
224
|
+
};
|
|
225
|
+
await run({ adapter, options: { timeout: 5000 } });
|
|
226
|
+
expect(spy).toHaveBeenCalledWith(5000);
|
|
227
|
+
expect(observedSignal).toBeDefined();
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
spy.mockRestore();
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
it('adapter receives a signal that reflects abort when the caller cancels', async () => {
|
|
234
|
+
const controller = new AbortController();
|
|
235
|
+
const adapter = {
|
|
236
|
+
request: vi.fn(async () => { throw new Error('not expected'); }),
|
|
237
|
+
stream: vi.fn(async (req) => {
|
|
238
|
+
return new Promise((_resolve, reject) => {
|
|
239
|
+
const abort = () => reject(new Error('aborted'));
|
|
240
|
+
if (req.signal?.aborted)
|
|
241
|
+
abort();
|
|
242
|
+
else
|
|
243
|
+
req.signal?.addEventListener('abort', abort, { once: true });
|
|
244
|
+
});
|
|
245
|
+
}),
|
|
246
|
+
};
|
|
247
|
+
const promise = run({ adapter, options: { signal: controller.signal } });
|
|
248
|
+
// Let executeStream reach the adapter before aborting
|
|
249
|
+
await Promise.resolve();
|
|
250
|
+
controller.abort();
|
|
251
|
+
await expect(promise).rejects.toThrow('aborted');
|
|
252
|
+
});
|
|
253
|
+
it('per-call basePath overrides base path for streams', async () => {
|
|
254
|
+
const capturedUrls = [];
|
|
255
|
+
const adapter = {
|
|
256
|
+
request: vi.fn(async () => { throw new Error('not expected'); }),
|
|
257
|
+
stream: vi.fn(async (req) => {
|
|
258
|
+
capturedUrls.push(req.url);
|
|
259
|
+
return { status: 200, headers: {}, body: makeAsyncIterable([]) };
|
|
260
|
+
}),
|
|
261
|
+
};
|
|
262
|
+
const stream = await run({
|
|
263
|
+
adapter,
|
|
264
|
+
descriptor: makeDescriptor({ path: '/tail' }),
|
|
265
|
+
basePath: 'https://default.example.com',
|
|
266
|
+
options: { basePath: 'https://override.example.com' },
|
|
267
|
+
});
|
|
268
|
+
for await (const _ of stream) { /* drain */ }
|
|
269
|
+
expect(capturedUrls[0]).toBe('https://override.example.com/tail');
|
|
270
|
+
});
|
|
271
|
+
it('per-call meta is forwarded to the adapter', async () => {
|
|
272
|
+
let observedMeta;
|
|
273
|
+
const adapter = {
|
|
274
|
+
request: vi.fn(async () => { throw new Error('not expected'); }),
|
|
275
|
+
stream: vi.fn(async (req) => {
|
|
276
|
+
observedMeta = req.meta;
|
|
277
|
+
return { status: 200, headers: {}, body: makeAsyncIterable([]) };
|
|
278
|
+
}),
|
|
279
|
+
};
|
|
280
|
+
await run({ adapter, options: { meta: { traceId: 'stream-trace' } } });
|
|
281
|
+
expect(observedMeta).toEqual({ traceId: 'stream-trace' });
|
|
282
|
+
});
|
|
227
283
|
});
|
|
228
284
|
//# sourceMappingURL=stream.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.test.js","sourceRoot":"","sources":["../../src/client/stream.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.test.js","sourceRoot":"","sources":["../../src/client/stream.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-empty-object-type */
|
|
2
|
+
import { describe, expect, test } from 'vitest';
|
|
3
|
+
import { Type } from 'typebox';
|
|
4
|
+
import { Procedures } from '../index.js';
|
|
5
|
+
import { HonoAPIAppBuilder, defineErrorTaxonomy } from '../implementations/http/hono-api/index.js';
|
|
6
|
+
import { createClient } from './index.js';
|
|
7
|
+
import { ClientRequestError } from './errors.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Error taxonomy + simulated generated error classes
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
class UseCaseError extends Error {
|
|
12
|
+
externalMsg;
|
|
13
|
+
internalMsg;
|
|
14
|
+
constructor(externalMsg, internalMsg) {
|
|
15
|
+
super(externalMsg);
|
|
16
|
+
this.externalMsg = externalMsg;
|
|
17
|
+
this.internalMsg = internalMsg;
|
|
18
|
+
this.name = 'UseCaseError';
|
|
19
|
+
Object.setPrototypeOf(this, UseCaseError.prototype);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const appErrors = defineErrorTaxonomy({
|
|
23
|
+
UseCaseError: {
|
|
24
|
+
class: UseCaseError,
|
|
25
|
+
statusCode: 422,
|
|
26
|
+
toResponse: (err) => ({ message: err.externalMsg }),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
// Simulates what the codegen emits: a runtime class + a registry entry the
|
|
30
|
+
// client uses for dispatch. In real usage this comes from the generated
|
|
31
|
+
// `_errors.ts`; here we inline it to test the client-side dispatch path end
|
|
32
|
+
// to end without invoking the codegen pipeline.
|
|
33
|
+
class ApiUseCaseError extends Error {
|
|
34
|
+
status;
|
|
35
|
+
procedureName;
|
|
36
|
+
scope;
|
|
37
|
+
body;
|
|
38
|
+
constructor(args) {
|
|
39
|
+
super(args.message);
|
|
40
|
+
this.name = 'UseCaseError';
|
|
41
|
+
this.status = args.status;
|
|
42
|
+
this.procedureName = args.procedureName;
|
|
43
|
+
this.scope = args.scope;
|
|
44
|
+
this.body = args.body;
|
|
45
|
+
Object.setPrototypeOf(this, ApiUseCaseError.prototype);
|
|
46
|
+
}
|
|
47
|
+
static fromResponse(body, meta) {
|
|
48
|
+
const b = body;
|
|
49
|
+
return new ApiUseCaseError({
|
|
50
|
+
message: b.message,
|
|
51
|
+
status: meta.status,
|
|
52
|
+
procedureName: meta.procedureName,
|
|
53
|
+
scope: meta.scope,
|
|
54
|
+
body: b,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const errorRegistry = { UseCaseError: ApiUseCaseError };
|
|
59
|
+
function honoAdapter(app) {
|
|
60
|
+
return {
|
|
61
|
+
async request(req) {
|
|
62
|
+
const res = await Promise.resolve(app.request(req.url, {
|
|
63
|
+
method: req.method,
|
|
64
|
+
headers: req.headers,
|
|
65
|
+
body: req.body !== undefined ? JSON.stringify(req.body) : undefined,
|
|
66
|
+
}));
|
|
67
|
+
const headers = {};
|
|
68
|
+
res.headers.forEach((v, k) => (headers[k] = v));
|
|
69
|
+
const body = await res.json().catch(() => null);
|
|
70
|
+
return { status: res.status, headers, body };
|
|
71
|
+
},
|
|
72
|
+
async stream() {
|
|
73
|
+
throw new Error('not used');
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Tests
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
describe('typed error dispatch — end-to-end', () => {
|
|
81
|
+
function buildApp() {
|
|
82
|
+
const API = Procedures();
|
|
83
|
+
API.Create('GetUser', {
|
|
84
|
+
path: '/users/:id',
|
|
85
|
+
method: 'get',
|
|
86
|
+
schema: {
|
|
87
|
+
input: { pathParams: Type.Object({ id: Type.String() }) },
|
|
88
|
+
returnType: Type.Object({ id: Type.String() }),
|
|
89
|
+
},
|
|
90
|
+
}, async (_ctx, { pathParams }) => {
|
|
91
|
+
if (pathParams.id === 'missing') {
|
|
92
|
+
throw new UseCaseError('User not found', `no user with id=${pathParams.id}`);
|
|
93
|
+
}
|
|
94
|
+
return { id: pathParams.id };
|
|
95
|
+
});
|
|
96
|
+
return new HonoAPIAppBuilder({ errors: appErrors }).register(API, () => ({})).build();
|
|
97
|
+
}
|
|
98
|
+
test('server-thrown UseCaseError arrives on client as a typed class instance', async () => {
|
|
99
|
+
const app = buildApp();
|
|
100
|
+
const api = createClient({
|
|
101
|
+
adapter: honoAdapter(app),
|
|
102
|
+
basePath: '',
|
|
103
|
+
errorRegistry,
|
|
104
|
+
scopes: (client) => ({
|
|
105
|
+
getUser: (id) => client.call({
|
|
106
|
+
name: 'GetUser',
|
|
107
|
+
scope: 'users',
|
|
108
|
+
path: '/users/:id',
|
|
109
|
+
method: 'get',
|
|
110
|
+
kind: 'api',
|
|
111
|
+
params: { pathParams: { id } },
|
|
112
|
+
}),
|
|
113
|
+
}),
|
|
114
|
+
});
|
|
115
|
+
await expect(api.getUser('missing')).rejects.toBeInstanceOf(ApiUseCaseError);
|
|
116
|
+
try {
|
|
117
|
+
await api.getUser('missing');
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
expect(err).toBeInstanceOf(ApiUseCaseError);
|
|
121
|
+
expect(err).toBeInstanceOf(Error);
|
|
122
|
+
expect(err.status).toBe(422);
|
|
123
|
+
expect(err.procedureName).toBe('GetUser');
|
|
124
|
+
expect(err.message).toBe('User not found');
|
|
125
|
+
expect(err.body.name).toBe('UseCaseError');
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
test('unregistered error body falls back to ClientRequestError', async () => {
|
|
129
|
+
const app = buildApp();
|
|
130
|
+
// Omit the registry so dispatch can't match; client sees the raw
|
|
131
|
+
// transport error instead of a typed class.
|
|
132
|
+
const api = createClient({
|
|
133
|
+
adapter: honoAdapter(app),
|
|
134
|
+
basePath: '',
|
|
135
|
+
scopes: (client) => ({
|
|
136
|
+
getUser: (id) => client.call({
|
|
137
|
+
name: 'GetUser',
|
|
138
|
+
scope: 'users',
|
|
139
|
+
path: '/users/:id',
|
|
140
|
+
method: 'get',
|
|
141
|
+
kind: 'api',
|
|
142
|
+
params: { pathParams: { id } },
|
|
143
|
+
}),
|
|
144
|
+
}),
|
|
145
|
+
});
|
|
146
|
+
await expect(api.getUser('missing')).rejects.toBeInstanceOf(ClientRequestError);
|
|
147
|
+
});
|
|
148
|
+
test('success responses are not disturbed by dispatch logic', async () => {
|
|
149
|
+
const app = buildApp();
|
|
150
|
+
const api = createClient({
|
|
151
|
+
adapter: honoAdapter(app),
|
|
152
|
+
basePath: '',
|
|
153
|
+
errorRegistry,
|
|
154
|
+
scopes: (client) => ({
|
|
155
|
+
getUser: (id) => client.call({
|
|
156
|
+
name: 'GetUser',
|
|
157
|
+
scope: 'users',
|
|
158
|
+
path: '/users/:id',
|
|
159
|
+
method: 'get',
|
|
160
|
+
kind: 'api',
|
|
161
|
+
params: { pathParams: { id } },
|
|
162
|
+
}),
|
|
163
|
+
}),
|
|
164
|
+
});
|
|
165
|
+
await expect(api.getUser('u_42')).resolves.toEqual({ id: 'u_42' });
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=typed-error-dispatch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-error-dispatch.test.js","sourceRoot":"","sources":["../../src/client/typed-error-dispatch.test.ts"],"names":[],"mappings":"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"}
|
package/build/client/types.d.ts
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request metadata visible to adapters and hooks. Defined as an empty
|
|
3
|
+
* interface so consumers can augment it via TypeScript declaration merging
|
|
4
|
+
* to get end-to-end type safety for their own metadata fields.
|
|
5
|
+
*
|
|
6
|
+
* @example With a non-self-contained client:
|
|
7
|
+
* ```ts
|
|
8
|
+
* declare module 'ts-procedures/client' {
|
|
9
|
+
* interface RequestMeta {
|
|
10
|
+
* traceId?: string
|
|
11
|
+
* priority?: 'high' | 'low'
|
|
12
|
+
* }
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @example With a self-contained (code-generated) client:
|
|
17
|
+
* ```ts
|
|
18
|
+
* declare module './generated/_types' {
|
|
19
|
+
* interface RequestMeta {
|
|
20
|
+
* traceId?: string
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* After augmentation, `request.meta.traceId` is typed everywhere — per-call
|
|
26
|
+
* options, hooks, and adapters.
|
|
27
|
+
*/
|
|
28
|
+
export interface RequestMeta {
|
|
29
|
+
}
|
|
1
30
|
export interface ClientAdapter {
|
|
2
31
|
request(config: AdapterRequest): Promise<AdapterResponse>;
|
|
3
32
|
stream(config: AdapterRequest): Promise<AdapterStreamResponse>;
|
|
@@ -8,6 +37,11 @@ export interface AdapterRequest {
|
|
|
8
37
|
headers?: Record<string, string>;
|
|
9
38
|
body?: unknown;
|
|
10
39
|
signal?: AbortSignal;
|
|
40
|
+
/**
|
|
41
|
+
* Per-request metadata. Augment `RequestMeta` via declaration merging to
|
|
42
|
+
* type your own fields. See {@link RequestMeta}.
|
|
43
|
+
*/
|
|
44
|
+
meta?: RequestMeta;
|
|
11
45
|
}
|
|
12
46
|
export interface AdapterResponse {
|
|
13
47
|
status: number;
|
|
@@ -18,6 +52,12 @@ export interface AdapterStreamResponse {
|
|
|
18
52
|
status: number;
|
|
19
53
|
headers: Record<string, string>;
|
|
20
54
|
body: AsyncIterable<unknown>;
|
|
55
|
+
/**
|
|
56
|
+
* Populated when `status` is non-2xx — the parsed response body. Surfaced so
|
|
57
|
+
* `executeStream` can dispatch typed errors via the error registry instead
|
|
58
|
+
* of always falling back to `ClientRequestError` with `body: null`.
|
|
59
|
+
*/
|
|
60
|
+
errorBody?: unknown;
|
|
21
61
|
}
|
|
22
62
|
export interface ClientHooks {
|
|
23
63
|
onBeforeRequest?(context: BeforeRequestContext): BeforeRequestContext | Promise<BeforeRequestContext>;
|
|
@@ -62,11 +102,62 @@ export interface TypedStream<TYield, TReturn = void> extends AsyncIterable<TYiel
|
|
|
62
102
|
*/
|
|
63
103
|
result: Promise<TReturn>;
|
|
64
104
|
}
|
|
65
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Request-level configuration that can be set as client-level defaults
|
|
107
|
+
* (via `CreateClientConfig.defaults`) or per-call (via `ProcedureCallOptions`).
|
|
108
|
+
*
|
|
109
|
+
* - `signal`: AbortSignal for cancellation. When both a default and per-call
|
|
110
|
+
* signal are provided, they're combined — whichever aborts first wins.
|
|
111
|
+
* - `timeout`: Timeout in milliseconds. Combined with `signal` the same way.
|
|
112
|
+
* A per-call `timeout: 0` disables an inherited default timeout.
|
|
113
|
+
* - `headers`: Extra headers merged into the request. Per-call keys win over
|
|
114
|
+
* default keys. Still subject to further mutation by `onBeforeRequest` hooks.
|
|
115
|
+
* - `basePath`: Override the base path for this call. Per-call > default > config.
|
|
116
|
+
* - `meta`: Per-request metadata typed via the {@link RequestMeta} interface.
|
|
117
|
+
* Merged shallowly (per-call keys win over default keys).
|
|
118
|
+
*/
|
|
119
|
+
export interface ProcedureCallDefaults {
|
|
120
|
+
signal?: AbortSignal;
|
|
121
|
+
timeout?: number;
|
|
122
|
+
headers?: Record<string, string>;
|
|
123
|
+
basePath?: string;
|
|
124
|
+
meta?: RequestMeta;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Per-call options. Extends both `ProcedureCallDefaults` (request config) and
|
|
128
|
+
* `ClientHooks` (hooks), so a single options bag covers both concerns.
|
|
129
|
+
*/
|
|
130
|
+
export interface ProcedureCallOptions extends ProcedureCallDefaults, ClientHooks {
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Metadata attached to a typed error at construction. Supplies the transport
|
|
134
|
+
* context (status, procedure, scope) that isn't part of the response body.
|
|
135
|
+
*/
|
|
136
|
+
export interface ErrorResponseMeta {
|
|
137
|
+
status: number;
|
|
138
|
+
procedureName: string;
|
|
139
|
+
scope: string;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* A factory for a typed error class — constructed from the response body plus
|
|
143
|
+
* transport metadata. Generated error classes expose this as a static method.
|
|
144
|
+
*/
|
|
145
|
+
export interface ErrorFactory {
|
|
146
|
+
fromResponse(body: unknown, meta: ErrorResponseMeta): Error;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Maps `body.name` values (taxonomy keys) to error class factories. When the
|
|
150
|
+
* client sees a non-2xx response whose body has a `name` matching a registry
|
|
151
|
+
* entry, it throws the typed error instead of a generic `ClientRequestError`.
|
|
152
|
+
*/
|
|
153
|
+
export type ErrorRegistry = Record<string, ErrorFactory>;
|
|
66
154
|
export interface ClientInstance {
|
|
67
155
|
basePath: string;
|
|
68
156
|
adapter: ClientAdapter;
|
|
69
157
|
hooks: ClientHooks;
|
|
158
|
+
defaults: ProcedureCallDefaults;
|
|
159
|
+
/** Optional registry for runtime dispatch of typed errors by `body.name`. */
|
|
160
|
+
errorRegistry?: ErrorRegistry;
|
|
70
161
|
call<TResponse>(descriptor: CallDescriptor, options?: ProcedureCallOptions): Promise<TResponse>;
|
|
71
162
|
stream<TYield, TReturn>(descriptor: StreamDescriptor, options?: ProcedureCallOptions): TypedStream<TYield, TReturn>;
|
|
72
163
|
}
|
|
@@ -75,4 +166,17 @@ export interface CreateClientConfig<TScopes> {
|
|
|
75
166
|
basePath: string;
|
|
76
167
|
scopes: (client: ClientInstance) => TScopes;
|
|
77
168
|
hooks?: ClientHooks;
|
|
169
|
+
/**
|
|
170
|
+
* Default request options applied to every call. Per-call options override
|
|
171
|
+
* these (except `signal`, which combines via AbortSignal.any — whichever
|
|
172
|
+
* fires first cancels the request).
|
|
173
|
+
*/
|
|
174
|
+
defaults?: ProcedureCallDefaults;
|
|
175
|
+
/**
|
|
176
|
+
* Optional error-dispatch registry. When a non-2xx response body has a
|
|
177
|
+
* `name` field matching a registry key, the client throws the typed error
|
|
178
|
+
* constructed via that entry's `fromResponse`. When absent or when no key
|
|
179
|
+
* matches, falls back to `ClientRequestError` (transport error shape).
|
|
180
|
+
*/
|
|
181
|
+
errorRegistry?: ErrorRegistry;
|
|
78
182
|
}
|
package/build/client/types.js
CHANGED