ts-procedures 5.10.0 → 5.12.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/agent_config/bin/postinstall.mjs +3 -3
- package/agent_config/bin/setup.mjs +22 -11
- package/agent_config/claude-code/agents/ts-procedures-architect.md +2 -2
- package/agent_config/claude-code/skills/{guide → ts-procedures}/SKILL.md +1 -1
- package/agent_config/claude-code/skills/{guide → ts-procedures}/api-reference.md +11 -8
- package/agent_config/claude-code/skills/{guide → ts-procedures}/patterns.md +8 -2
- package/agent_config/claude-code/skills/{review → ts-procedures-review}/SKILL.md +3 -3
- package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/SKILL.md +2 -2
- package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/client.md +4 -4
- package/agent_config/copilot/copilot-instructions.md +6 -5
- package/agent_config/cursor/cursorrules +6 -5
- package/agent_config/lib/install-claude.mjs +35 -87
- package/build/codegen/e2e.test.js +21 -14
- package/build/codegen/e2e.test.js.map +1 -1
- package/build/codegen/emit-index.d.ts +7 -3
- package/build/codegen/emit-index.js +33 -20
- package/build/codegen/emit-index.js.map +1 -1
- package/build/codegen/emit-index.test.js +69 -45
- package/build/codegen/emit-index.test.js.map +1 -1
- package/build/codegen/pipeline.js +4 -5
- package/build/codegen/pipeline.js.map +1 -1
- package/build/codegen/pipeline.test.js +4 -4
- package/build/codegen/pipeline.test.js.map +1 -1
- package/build/src/client/call.d.ts +14 -0
- package/build/src/client/call.js +47 -0
- package/build/src/client/call.js.map +1 -0
- package/build/src/client/call.test.d.ts +1 -0
- package/build/src/client/call.test.js +124 -0
- package/build/src/client/call.test.js.map +1 -0
- package/build/src/client/errors.d.ts +25 -0
- package/build/src/client/errors.js +33 -0
- package/build/src/client/errors.js.map +1 -0
- package/build/src/client/errors.test.d.ts +1 -0
- package/build/src/client/errors.test.js +41 -0
- package/build/src/client/errors.test.js.map +1 -0
- package/build/src/client/fetch-adapter.d.ts +12 -0
- package/build/src/client/fetch-adapter.js +156 -0
- package/build/src/client/fetch-adapter.js.map +1 -0
- package/build/src/client/fetch-adapter.test.d.ts +1 -0
- package/build/src/client/fetch-adapter.test.js +271 -0
- package/build/src/client/fetch-adapter.test.js.map +1 -0
- package/build/src/client/hooks.d.ts +17 -0
- package/build/src/client/hooks.js +40 -0
- package/build/src/client/hooks.js.map +1 -0
- package/build/src/client/hooks.test.d.ts +1 -0
- package/build/src/client/hooks.test.js +163 -0
- package/build/src/client/hooks.test.js.map +1 -0
- package/build/src/client/index.d.ts +22 -0
- package/build/src/client/index.js +67 -0
- package/build/src/client/index.js.map +1 -0
- package/build/src/client/index.test.d.ts +1 -0
- package/build/src/client/index.test.js +231 -0
- package/build/src/client/index.test.js.map +1 -0
- package/build/src/client/request-builder.d.ts +13 -0
- package/build/src/client/request-builder.js +53 -0
- package/build/src/client/request-builder.js.map +1 -0
- package/build/src/client/request-builder.test.d.ts +1 -0
- package/build/src/client/request-builder.test.js +160 -0
- package/build/src/client/request-builder.test.js.map +1 -0
- package/build/src/client/stream.d.ts +27 -0
- package/build/src/client/stream.js +118 -0
- package/build/src/client/stream.js.map +1 -0
- package/build/src/client/stream.test.d.ts +1 -0
- package/build/src/client/stream.test.js +228 -0
- package/build/src/client/stream.test.js.map +1 -0
- package/build/src/client/types.d.ts +78 -0
- package/build/src/client/types.js +3 -0
- package/build/src/client/types.js.map +1 -0
- package/build/src/codegen/bin/cli.d.ts +45 -0
- package/build/src/codegen/bin/cli.js +246 -0
- package/build/src/codegen/bin/cli.js.map +1 -0
- package/build/src/codegen/bin/cli.test.d.ts +1 -0
- package/build/src/codegen/bin/cli.test.js +220 -0
- package/build/src/codegen/bin/cli.test.js.map +1 -0
- package/build/src/codegen/constants.d.ts +1 -0
- package/build/src/codegen/constants.js +2 -0
- package/build/src/codegen/constants.js.map +1 -0
- package/build/src/codegen/e2e.test.d.ts +1 -0
- package/build/src/codegen/e2e.test.js +464 -0
- package/build/src/codegen/e2e.test.js.map +1 -0
- package/build/src/codegen/emit-client-runtime.d.ts +9 -0
- package/build/src/codegen/emit-client-runtime.js +99 -0
- package/build/src/codegen/emit-client-runtime.js.map +1 -0
- package/build/src/codegen/emit-client-runtime.test.d.ts +1 -0
- package/build/src/codegen/emit-client-runtime.test.js +78 -0
- package/build/src/codegen/emit-client-runtime.test.js.map +1 -0
- package/build/src/codegen/emit-client-types.d.ts +8 -0
- package/build/src/codegen/emit-client-types.js +25 -0
- package/build/src/codegen/emit-client-types.js.map +1 -0
- package/build/src/codegen/emit-client-types.test.d.ts +1 -0
- package/build/src/codegen/emit-client-types.test.js +33 -0
- package/build/src/codegen/emit-client-types.test.js.map +1 -0
- package/build/src/codegen/emit-errors.d.ts +19 -0
- package/build/src/codegen/emit-errors.js +59 -0
- package/build/src/codegen/emit-errors.js.map +1 -0
- package/build/src/codegen/emit-errors.test.d.ts +1 -0
- package/build/src/codegen/emit-errors.test.js +175 -0
- package/build/src/codegen/emit-errors.test.js.map +1 -0
- package/build/src/codegen/emit-index.d.ts +12 -0
- package/build/src/codegen/emit-index.js +41 -0
- package/build/src/codegen/emit-index.js.map +1 -0
- package/build/src/codegen/emit-index.test.d.ts +1 -0
- package/build/src/codegen/emit-index.test.js +106 -0
- package/build/src/codegen/emit-index.test.js.map +1 -0
- package/build/src/codegen/emit-scope.d.ts +15 -0
- package/build/src/codegen/emit-scope.js +299 -0
- package/build/src/codegen/emit-scope.js.map +1 -0
- package/build/src/codegen/emit-scope.test.d.ts +1 -0
- package/build/src/codegen/emit-scope.test.js +559 -0
- package/build/src/codegen/emit-scope.test.js.map +1 -0
- package/build/src/codegen/emit-types.d.ts +43 -0
- package/build/src/codegen/emit-types.js +111 -0
- package/build/src/codegen/emit-types.js.map +1 -0
- package/build/src/codegen/emit-types.test.d.ts +1 -0
- package/build/src/codegen/emit-types.test.js +184 -0
- package/build/src/codegen/emit-types.test.js.map +1 -0
- package/build/src/codegen/group-routes.d.ts +23 -0
- package/build/src/codegen/group-routes.js +46 -0
- package/build/src/codegen/group-routes.js.map +1 -0
- package/build/src/codegen/group-routes.test.d.ts +1 -0
- package/build/src/codegen/group-routes.test.js +131 -0
- package/build/src/codegen/group-routes.test.js.map +1 -0
- package/build/src/codegen/index.d.ts +15 -0
- package/build/src/codegen/index.js +16 -0
- package/build/src/codegen/index.js.map +1 -0
- package/build/src/codegen/naming.d.ts +7 -0
- package/build/src/codegen/naming.js +21 -0
- package/build/src/codegen/naming.js.map +1 -0
- package/build/src/codegen/naming.test.d.ts +1 -0
- package/build/src/codegen/naming.test.js +40 -0
- package/build/src/codegen/naming.test.js.map +1 -0
- package/build/src/codegen/pipeline.d.ts +17 -0
- package/build/src/codegen/pipeline.js +78 -0
- package/build/src/codegen/pipeline.js.map +1 -0
- package/build/src/codegen/pipeline.test.d.ts +1 -0
- package/build/src/codegen/pipeline.test.js +269 -0
- package/build/src/codegen/pipeline.test.js.map +1 -0
- package/build/src/codegen/resolve-envelope.d.ts +7 -0
- package/build/src/codegen/resolve-envelope.js +46 -0
- package/build/src/codegen/resolve-envelope.js.map +1 -0
- package/build/src/codegen/resolve-envelope.test.d.ts +1 -0
- package/build/src/codegen/resolve-envelope.test.js +69 -0
- package/build/src/codegen/resolve-envelope.test.js.map +1 -0
- package/build/src/errors.d.ts +33 -0
- package/build/src/errors.js +91 -0
- package/build/src/errors.js.map +1 -0
- package/build/src/errors.test.d.ts +1 -0
- package/build/src/errors.test.js +122 -0
- package/build/src/errors.test.js.map +1 -0
- package/build/src/exports.d.ts +7 -0
- package/build/src/exports.js +8 -0
- package/build/src/exports.js.map +1 -0
- package/build/src/implementations/http/doc-registry.d.ts +12 -0
- package/build/src/implementations/http/doc-registry.js +114 -0
- package/build/src/implementations/http/doc-registry.js.map +1 -0
- package/build/src/implementations/http/doc-registry.test.d.ts +1 -0
- package/build/src/implementations/http/doc-registry.test.js +347 -0
- package/build/src/implementations/http/doc-registry.test.js.map +1 -0
- package/build/src/implementations/http/express-rpc/index.d.ts +94 -0
- package/build/src/implementations/http/express-rpc/index.js +185 -0
- package/build/src/implementations/http/express-rpc/index.js.map +1 -0
- package/build/src/implementations/http/express-rpc/index.test.d.ts +1 -0
- package/build/src/implementations/http/express-rpc/index.test.js +684 -0
- package/build/src/implementations/http/express-rpc/index.test.js.map +1 -0
- package/build/src/implementations/http/express-rpc/types.d.ts +11 -0
- package/build/src/implementations/http/express-rpc/types.js +2 -0
- package/build/src/implementations/http/express-rpc/types.js.map +1 -0
- package/build/src/implementations/http/hono-api/index.d.ts +102 -0
- package/build/src/implementations/http/hono-api/index.js +341 -0
- package/build/src/implementations/http/hono-api/index.js.map +1 -0
- package/build/src/implementations/http/hono-api/index.test.d.ts +1 -0
- package/build/src/implementations/http/hono-api/index.test.js +992 -0
- package/build/src/implementations/http/hono-api/index.test.js.map +1 -0
- package/build/src/implementations/http/hono-api/types.d.ts +13 -0
- package/build/src/implementations/http/hono-api/types.js +2 -0
- package/build/src/implementations/http/hono-api/types.js.map +1 -0
- package/build/src/implementations/http/hono-rpc/index.d.ts +92 -0
- package/build/src/implementations/http/hono-rpc/index.js +161 -0
- package/build/src/implementations/http/hono-rpc/index.js.map +1 -0
- package/build/src/implementations/http/hono-rpc/index.test.d.ts +1 -0
- package/build/src/implementations/http/hono-rpc/index.test.js +803 -0
- package/build/src/implementations/http/hono-rpc/index.test.js.map +1 -0
- package/build/src/implementations/http/hono-rpc/types.d.ts +11 -0
- package/build/src/implementations/http/hono-rpc/types.js +2 -0
- package/build/src/implementations/http/hono-rpc/types.js.map +1 -0
- package/build/src/implementations/http/hono-stream/index.d.ts +120 -0
- package/build/src/implementations/http/hono-stream/index.js +309 -0
- package/build/src/implementations/http/hono-stream/index.js.map +1 -0
- package/build/src/implementations/http/hono-stream/index.test.d.ts +1 -0
- package/build/src/implementations/http/hono-stream/index.test.js +1356 -0
- package/build/src/implementations/http/hono-stream/index.test.js.map +1 -0
- package/build/src/implementations/http/hono-stream/types.d.ts +15 -0
- package/build/src/implementations/http/hono-stream/types.js +2 -0
- package/build/src/implementations/http/hono-stream/types.js.map +1 -0
- package/build/src/implementations/types.d.ts +142 -0
- package/build/src/implementations/types.js +2 -0
- package/build/src/implementations/types.js.map +1 -0
- package/build/src/index.d.ts +165 -0
- package/build/src/index.js +253 -0
- package/build/src/index.js.map +1 -0
- package/build/src/index.test.d.ts +1 -0
- package/build/src/index.test.js +890 -0
- package/build/src/index.test.js.map +1 -0
- package/build/src/schema/compute-schema.d.ts +35 -0
- package/build/src/schema/compute-schema.js +41 -0
- package/build/src/schema/compute-schema.js.map +1 -0
- package/build/src/schema/compute-schema.test.d.ts +1 -0
- package/build/src/schema/compute-schema.test.js +107 -0
- package/build/src/schema/compute-schema.test.js.map +1 -0
- package/build/src/schema/extract-json-schema.d.ts +2 -0
- package/build/src/schema/extract-json-schema.js +12 -0
- package/build/src/schema/extract-json-schema.js.map +1 -0
- package/build/src/schema/extract-json-schema.test.d.ts +1 -0
- package/build/src/schema/extract-json-schema.test.js +23 -0
- package/build/src/schema/extract-json-schema.test.js.map +1 -0
- package/build/src/schema/parser.d.ts +28 -0
- package/build/src/schema/parser.js +170 -0
- package/build/src/schema/parser.js.map +1 -0
- package/build/src/schema/parser.test.d.ts +1 -0
- package/build/src/schema/parser.test.js +120 -0
- package/build/src/schema/parser.test.js.map +1 -0
- package/build/src/schema/resolve-schema-lib.d.ts +12 -0
- package/build/src/schema/resolve-schema-lib.js +11 -0
- package/build/src/schema/resolve-schema-lib.js.map +1 -0
- package/build/src/schema/resolve-schema-lib.test.d.ts +1 -0
- package/build/src/schema/resolve-schema-lib.test.js +17 -0
- package/build/src/schema/resolve-schema-lib.test.js.map +1 -0
- package/build/src/schema/types.d.ts +8 -0
- package/build/src/schema/types.js +2 -0
- package/build/src/schema/types.js.map +1 -0
- package/build/src/stack-utils.d.ts +25 -0
- package/build/src/stack-utils.js +95 -0
- package/build/src/stack-utils.js.map +1 -0
- package/build/src/stack-utils.test.d.ts +1 -0
- package/build/src/stack-utils.test.js +80 -0
- package/build/src/stack-utils.test.js.map +1 -0
- package/docs/ai-agent-setup.md +7 -6
- package/docs/client-and-codegen.md +9 -6
- package/package.json +1 -1
- package/src/codegen/e2e.test.ts +23 -14
- package/src/codegen/emit-index.test.ts +72 -45
- package/src/codegen/emit-index.ts +43 -20
- package/src/codegen/pipeline.test.ts +4 -4
- package/src/codegen/pipeline.ts +4 -5
- /package/agent_config/claude-code/skills/{guide → ts-procedures}/anti-patterns.md +0 -0
- /package/agent_config/claude-code/skills/{review → ts-procedures-review}/checklist.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/express-rpc.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/hono-api.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/hono-rpc.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/hono-stream.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/procedure.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/stream-procedure.md +0 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { createTypedStream, executeStream } from './stream.js';
|
|
3
|
+
import { ClientRequestError } from './errors.js';
|
|
4
|
+
// ── helpers ───────────────────────────────────────────────
|
|
5
|
+
function makeDescriptor(overrides) {
|
|
6
|
+
return {
|
|
7
|
+
name: 'WatchUpdates',
|
|
8
|
+
scope: 'updates',
|
|
9
|
+
path: '/stream/updates',
|
|
10
|
+
method: 'POST',
|
|
11
|
+
kind: 'stream',
|
|
12
|
+
streamMode: 'sse',
|
|
13
|
+
params: {},
|
|
14
|
+
...overrides,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async function* makeAsyncIterable(items) {
|
|
18
|
+
for (const item of items) {
|
|
19
|
+
yield item;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function makeStreamAdapter(response, items) {
|
|
23
|
+
return {
|
|
24
|
+
request: vi.fn(async () => {
|
|
25
|
+
throw new Error('request not expected in stream tests');
|
|
26
|
+
}),
|
|
27
|
+
stream: vi.fn(async (_req) => ({
|
|
28
|
+
status: 200,
|
|
29
|
+
headers: {},
|
|
30
|
+
body: makeAsyncIterable(items ?? []),
|
|
31
|
+
...response,
|
|
32
|
+
})),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// ── createTypedStream — SSE mode ──────────────────────────
|
|
36
|
+
describe('createTypedStream — SSE mode', () => {
|
|
37
|
+
it('yields data payloads for normal events', async () => {
|
|
38
|
+
const sseItems = [
|
|
39
|
+
{ data: { count: 1 }, event: 'update' },
|
|
40
|
+
{ data: { count: 2 }, event: 'update' },
|
|
41
|
+
];
|
|
42
|
+
const stream = createTypedStream(makeAsyncIterable(sseItems), 'sse');
|
|
43
|
+
const received = [];
|
|
44
|
+
for await (const item of stream) {
|
|
45
|
+
received.push(item);
|
|
46
|
+
}
|
|
47
|
+
expect(received).toEqual([{ count: 1 }, { count: 2 }]);
|
|
48
|
+
});
|
|
49
|
+
it('captures return event data in .result instead of yielding', async () => {
|
|
50
|
+
const sseItems = [
|
|
51
|
+
{ data: { count: 1 }, event: 'update' },
|
|
52
|
+
{ data: { total: 99 }, event: 'return' },
|
|
53
|
+
];
|
|
54
|
+
const stream = createTypedStream(makeAsyncIterable(sseItems), 'sse');
|
|
55
|
+
const yielded = [];
|
|
56
|
+
for await (const item of stream) {
|
|
57
|
+
yielded.push(item);
|
|
58
|
+
}
|
|
59
|
+
// Only the 'update' event is yielded
|
|
60
|
+
expect(yielded).toEqual([{ count: 1 }]);
|
|
61
|
+
// The 'return' event resolves .result
|
|
62
|
+
const result = await stream.result;
|
|
63
|
+
expect(result).toEqual({ total: 99 });
|
|
64
|
+
});
|
|
65
|
+
it('resolves .result with undefined when no return event', async () => {
|
|
66
|
+
const sseItems = [
|
|
67
|
+
{ data: 'hello', event: 'message' },
|
|
68
|
+
];
|
|
69
|
+
const stream = createTypedStream(makeAsyncIterable(sseItems), 'sse');
|
|
70
|
+
for await (const _ of stream) { /* drain */ }
|
|
71
|
+
const result = await stream.result;
|
|
72
|
+
expect(result).toBeUndefined();
|
|
73
|
+
});
|
|
74
|
+
it('rejects .result and re-throws on error', async () => {
|
|
75
|
+
async function* errorIterable() {
|
|
76
|
+
yield { data: 'first', event: 'message' };
|
|
77
|
+
throw new Error('stream broke');
|
|
78
|
+
}
|
|
79
|
+
const stream = createTypedStream(errorIterable(), 'sse');
|
|
80
|
+
// Consuming the stream should throw
|
|
81
|
+
await expect(async () => {
|
|
82
|
+
for await (const _ of stream) { /* drain */ }
|
|
83
|
+
}).rejects.toThrow('stream broke');
|
|
84
|
+
// .result should also reject
|
|
85
|
+
await expect(stream.result).rejects.toThrow('stream broke');
|
|
86
|
+
});
|
|
87
|
+
it('handles SSE items without event field (defaults to yielding data)', async () => {
|
|
88
|
+
const sseItems = [
|
|
89
|
+
{ data: 'a' },
|
|
90
|
+
{ data: 'b' },
|
|
91
|
+
];
|
|
92
|
+
const stream = createTypedStream(makeAsyncIterable(sseItems), 'sse');
|
|
93
|
+
const yielded = [];
|
|
94
|
+
for await (const item of stream) {
|
|
95
|
+
yielded.push(item);
|
|
96
|
+
}
|
|
97
|
+
expect(yielded).toEqual(['a', 'b']);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
// ── createTypedStream — text mode ────────────────────────
|
|
101
|
+
describe('createTypedStream — text mode', () => {
|
|
102
|
+
it('yields each chunk as-is', async () => {
|
|
103
|
+
const chunks = ['chunk1', 'chunk2', 'chunk3'];
|
|
104
|
+
const stream = createTypedStream(makeAsyncIterable(chunks), 'text');
|
|
105
|
+
const received = [];
|
|
106
|
+
for await (const chunk of stream) {
|
|
107
|
+
received.push(chunk);
|
|
108
|
+
}
|
|
109
|
+
expect(received).toEqual(chunks);
|
|
110
|
+
});
|
|
111
|
+
it('.result resolves to void on normal completion', async () => {
|
|
112
|
+
const stream = createTypedStream(makeAsyncIterable(['a', 'b']), 'text');
|
|
113
|
+
for await (const _ of stream) { /* drain */ }
|
|
114
|
+
const result = await stream.result;
|
|
115
|
+
expect(result).toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
it('rejects .result and re-throws on error', async () => {
|
|
118
|
+
async function* errorIterable() {
|
|
119
|
+
yield 'before error';
|
|
120
|
+
throw new Error('text stream error');
|
|
121
|
+
}
|
|
122
|
+
const stream = createTypedStream(errorIterable(), 'text');
|
|
123
|
+
await expect(async () => {
|
|
124
|
+
for await (const _ of stream) { /* drain */ }
|
|
125
|
+
}).rejects.toThrow('text stream error');
|
|
126
|
+
await expect(stream.result).rejects.toThrow('text stream error');
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
// ── executeStream ─────────────────────────────────────────
|
|
130
|
+
describe('executeStream', () => {
|
|
131
|
+
it('calls adapter.stream and returns a TypedStream', async () => {
|
|
132
|
+
const items = [{ data: 'hello', event: 'msg' }];
|
|
133
|
+
const adapter = makeStreamAdapter({}, items);
|
|
134
|
+
const stream = await executeStream(makeDescriptor(), 'https://api.example.com', adapter, {}, undefined);
|
|
135
|
+
expect(adapter.stream).toHaveBeenCalledOnce();
|
|
136
|
+
const received = [];
|
|
137
|
+
for await (const item of stream) {
|
|
138
|
+
received.push(item);
|
|
139
|
+
}
|
|
140
|
+
expect(received).toEqual(['hello']);
|
|
141
|
+
});
|
|
142
|
+
it('runs onBeforeRequest before calling adapter', async () => {
|
|
143
|
+
const capturedHeaders = [];
|
|
144
|
+
const adapter = {
|
|
145
|
+
request: vi.fn(async () => { throw new Error('not expected'); }),
|
|
146
|
+
stream: vi.fn(async (req) => {
|
|
147
|
+
capturedHeaders.push(req.headers ?? {});
|
|
148
|
+
return { status: 200, headers: {}, body: makeAsyncIterable([]) };
|
|
149
|
+
}),
|
|
150
|
+
};
|
|
151
|
+
const globalHooks = {
|
|
152
|
+
onBeforeRequest: (ctx) => ({
|
|
153
|
+
...ctx,
|
|
154
|
+
request: { ...ctx.request, headers: { 'x-stream-auth': 'stream-token' } },
|
|
155
|
+
}),
|
|
156
|
+
};
|
|
157
|
+
const stream = await executeStream(makeDescriptor(), 'https://api.example.com', adapter, globalHooks, undefined);
|
|
158
|
+
// Drain
|
|
159
|
+
for await (const _ of stream) { /* noop */ }
|
|
160
|
+
expect(capturedHeaders[0]?.['x-stream-auth']).toBe('stream-token');
|
|
161
|
+
});
|
|
162
|
+
it('runs onAfterResponse immediately (before iteration)', async () => {
|
|
163
|
+
const order = [];
|
|
164
|
+
const adapter = {
|
|
165
|
+
request: vi.fn(async () => { throw new Error('not expected'); }),
|
|
166
|
+
stream: vi.fn(async () => {
|
|
167
|
+
order.push('adapter');
|
|
168
|
+
return { status: 200, headers: {}, body: makeAsyncIterable([]) };
|
|
169
|
+
}),
|
|
170
|
+
};
|
|
171
|
+
const globalHooks = {
|
|
172
|
+
onAfterResponse: () => { order.push('afterResponse'); },
|
|
173
|
+
};
|
|
174
|
+
await executeStream(makeDescriptor(), 'https://api.example.com', adapter, globalHooks, undefined);
|
|
175
|
+
// After executeStream returns (before iteration), afterResponse should have fired
|
|
176
|
+
expect(order).toEqual(['adapter', 'afterResponse']);
|
|
177
|
+
});
|
|
178
|
+
it('throws ClientRequestError on non-2xx status', async () => {
|
|
179
|
+
const adapter = {
|
|
180
|
+
request: vi.fn(async () => { throw new Error('not expected'); }),
|
|
181
|
+
stream: vi.fn(async () => ({
|
|
182
|
+
status: 403,
|
|
183
|
+
headers: {},
|
|
184
|
+
body: makeAsyncIterable([]),
|
|
185
|
+
})),
|
|
186
|
+
};
|
|
187
|
+
await expect(executeStream(makeDescriptor(), 'https://api.example.com', adapter, {}, undefined)).rejects.toThrow(ClientRequestError);
|
|
188
|
+
});
|
|
189
|
+
it('runs onError on adapter failure and re-throws', async () => {
|
|
190
|
+
const adapterError = new Error('stream connection failed');
|
|
191
|
+
const adapter = {
|
|
192
|
+
request: vi.fn(async () => { throw new Error('not expected'); }),
|
|
193
|
+
stream: vi.fn(async () => { throw adapterError; }),
|
|
194
|
+
};
|
|
195
|
+
const receivedErrors = [];
|
|
196
|
+
const globalHooks = {
|
|
197
|
+
onError: (ctx) => { receivedErrors.push(ctx.error); },
|
|
198
|
+
};
|
|
199
|
+
await expect(executeStream(makeDescriptor(), 'https://api.example.com', adapter, globalHooks, undefined)).rejects.toThrow('stream connection failed');
|
|
200
|
+
expect(receivedErrors[0]).toBe(adapterError);
|
|
201
|
+
});
|
|
202
|
+
it('returns TypedStream with working .result for SSE return event', async () => {
|
|
203
|
+
const sseItems = [
|
|
204
|
+
{ data: { n: 1 }, event: 'tick' },
|
|
205
|
+
{ data: { final: true }, event: 'return' },
|
|
206
|
+
];
|
|
207
|
+
const adapter = makeStreamAdapter({}, sseItems);
|
|
208
|
+
const stream = await executeStream(makeDescriptor({ streamMode: 'sse' }), 'https://api.example.com', adapter, {}, undefined);
|
|
209
|
+
const yielded = [];
|
|
210
|
+
for await (const item of stream) {
|
|
211
|
+
yielded.push(item);
|
|
212
|
+
}
|
|
213
|
+
expect(yielded).toEqual([{ n: 1 }]);
|
|
214
|
+
await expect(stream.result).resolves.toEqual({ final: true });
|
|
215
|
+
});
|
|
216
|
+
it('returns TypedStream for text mode', async () => {
|
|
217
|
+
const chunks = ['line1', 'line2'];
|
|
218
|
+
const adapter = makeStreamAdapter({}, chunks);
|
|
219
|
+
const stream = await executeStream(makeDescriptor({ streamMode: 'text' }), 'https://api.example.com', adapter, {}, undefined);
|
|
220
|
+
const received = [];
|
|
221
|
+
for await (const chunk of stream) {
|
|
222
|
+
received.push(chunk);
|
|
223
|
+
}
|
|
224
|
+
expect(received).toEqual(chunks);
|
|
225
|
+
await expect(stream.result).resolves.toBeUndefined();
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
//# sourceMappingURL=stream.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.test.js","sourceRoot":"","sources":["../../../src/client/stream.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export interface ClientAdapter {
|
|
2
|
+
request(config: AdapterRequest): Promise<AdapterResponse>;
|
|
3
|
+
stream(config: AdapterRequest): Promise<AdapterStreamResponse>;
|
|
4
|
+
}
|
|
5
|
+
export interface AdapterRequest {
|
|
6
|
+
url: string;
|
|
7
|
+
method: string;
|
|
8
|
+
headers?: Record<string, string>;
|
|
9
|
+
body?: unknown;
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
}
|
|
12
|
+
export interface AdapterResponse {
|
|
13
|
+
status: number;
|
|
14
|
+
headers: Record<string, string>;
|
|
15
|
+
body: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface AdapterStreamResponse {
|
|
18
|
+
status: number;
|
|
19
|
+
headers: Record<string, string>;
|
|
20
|
+
body: AsyncIterable<unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface ClientHooks {
|
|
23
|
+
onBeforeRequest?(context: BeforeRequestContext): BeforeRequestContext | Promise<BeforeRequestContext>;
|
|
24
|
+
onAfterResponse?(context: AfterResponseContext): void | Promise<void>;
|
|
25
|
+
onError?(context: ErrorContext): void | Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export interface BeforeRequestContext {
|
|
28
|
+
procedureName: string;
|
|
29
|
+
scope: string;
|
|
30
|
+
request: AdapterRequest;
|
|
31
|
+
}
|
|
32
|
+
export interface AfterResponseContext {
|
|
33
|
+
procedureName: string;
|
|
34
|
+
scope: string;
|
|
35
|
+
request: AdapterRequest;
|
|
36
|
+
response: AdapterResponse;
|
|
37
|
+
}
|
|
38
|
+
export interface ErrorContext {
|
|
39
|
+
procedureName: string;
|
|
40
|
+
scope: string;
|
|
41
|
+
request: AdapterRequest;
|
|
42
|
+
error: unknown;
|
|
43
|
+
}
|
|
44
|
+
export interface CallDescriptor {
|
|
45
|
+
name: string;
|
|
46
|
+
scope: string;
|
|
47
|
+
path: string;
|
|
48
|
+
method: string;
|
|
49
|
+
kind: 'rpc' | 'api' | 'stream';
|
|
50
|
+
params: unknown;
|
|
51
|
+
}
|
|
52
|
+
export interface StreamDescriptor extends CallDescriptor {
|
|
53
|
+
kind: 'stream';
|
|
54
|
+
streamMode: 'sse' | 'text';
|
|
55
|
+
}
|
|
56
|
+
export interface TypedStream<TYield, TReturn = void> extends AsyncIterable<TYield> {
|
|
57
|
+
/**
|
|
58
|
+
* Resolves when the stream completes with the final return value.
|
|
59
|
+
* Rejects if the stream errors before completing.
|
|
60
|
+
* Note: iteration must begin (via for-await) for this promise to settle,
|
|
61
|
+
* since resolution depends on the async generator running to completion.
|
|
62
|
+
*/
|
|
63
|
+
result: Promise<TReturn>;
|
|
64
|
+
}
|
|
65
|
+
export type ProcedureCallOptions = ClientHooks;
|
|
66
|
+
export interface ClientInstance {
|
|
67
|
+
basePath: string;
|
|
68
|
+
adapter: ClientAdapter;
|
|
69
|
+
hooks: ClientHooks;
|
|
70
|
+
call<TResponse>(descriptor: CallDescriptor, options?: ProcedureCallOptions): Promise<TResponse>;
|
|
71
|
+
stream<TYield, TReturn>(descriptor: StreamDescriptor, options?: ProcedureCallOptions): TypedStream<TYield, TReturn>;
|
|
72
|
+
}
|
|
73
|
+
export interface CreateClientConfig<TScopes> {
|
|
74
|
+
adapter: ClientAdapter;
|
|
75
|
+
basePath: string;
|
|
76
|
+
scopes: (client: ClientInstance) => TScopes;
|
|
77
|
+
hooks?: ClientHooks;
|
|
78
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":"AAAA,4DAA4D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import type { AjscOptions } from '../emit-types.js';
|
|
3
|
+
export interface CodegenConfig {
|
|
4
|
+
url?: string;
|
|
5
|
+
file?: string;
|
|
6
|
+
outDir?: string;
|
|
7
|
+
watch?: boolean;
|
|
8
|
+
interval?: number;
|
|
9
|
+
ajsc?: AjscOptions;
|
|
10
|
+
clientImportPath?: string;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
namespaceTypes?: boolean;
|
|
13
|
+
selfContained?: boolean;
|
|
14
|
+
serviceName?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ParsedArgs {
|
|
17
|
+
url?: string;
|
|
18
|
+
file?: string;
|
|
19
|
+
outDir: string;
|
|
20
|
+
watch: boolean;
|
|
21
|
+
interval: number;
|
|
22
|
+
ajsc?: AjscOptions;
|
|
23
|
+
clientImportPath?: string;
|
|
24
|
+
dryRun: boolean;
|
|
25
|
+
namespaceTypes: boolean;
|
|
26
|
+
selfContained: boolean;
|
|
27
|
+
serviceName?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Loads a JSON config file. Returns undefined if the file doesn't exist.
|
|
31
|
+
* Throws on parse errors.
|
|
32
|
+
*/
|
|
33
|
+
export declare function loadConfigFile(configPath?: string): Promise<CodegenConfig | undefined>;
|
|
34
|
+
/**
|
|
35
|
+
* Parses CLI argv (pass process.argv.slice(2)).
|
|
36
|
+
* Throws with a descriptive message on validation errors.
|
|
37
|
+
*
|
|
38
|
+
* When a config object is provided, its values are used as defaults
|
|
39
|
+
* and CLI flags override them.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseArgs(argv: string[], config?: CodegenConfig): ParsedArgs;
|
|
42
|
+
/**
|
|
43
|
+
* Extracts the --config value from argv without full parsing.
|
|
44
|
+
*/
|
|
45
|
+
export declare function extractConfigPath(argv: string[]): string | undefined;
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { generateClient } from '../index.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Config file loading
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
const DEFAULT_CONFIG_NAME = 'ts-procedures-codegen.config.json';
|
|
10
|
+
/**
|
|
11
|
+
* Loads a JSON config file. Returns undefined if the file doesn't exist.
|
|
12
|
+
* Throws on parse errors.
|
|
13
|
+
*/
|
|
14
|
+
export async function loadConfigFile(configPath) {
|
|
15
|
+
const filePath = resolve(configPath ?? DEFAULT_CONFIG_NAME);
|
|
16
|
+
try {
|
|
17
|
+
const raw = await readFile(filePath, 'utf8');
|
|
18
|
+
return JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
if (configPath !== undefined) {
|
|
22
|
+
// Explicit path — always throw
|
|
23
|
+
throw new Error(`[ts-procedures-codegen] Failed to load config from ${filePath}: ${err instanceof Error ? err.message : err}`);
|
|
24
|
+
}
|
|
25
|
+
// Default path — silently ignore if not found
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// parseArgs
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
/**
|
|
33
|
+
* Parses CLI argv (pass process.argv.slice(2)).
|
|
34
|
+
* Throws with a descriptive message on validation errors.
|
|
35
|
+
*
|
|
36
|
+
* When a config object is provided, its values are used as defaults
|
|
37
|
+
* and CLI flags override them.
|
|
38
|
+
*/
|
|
39
|
+
export function parseArgs(argv, config) {
|
|
40
|
+
let url = config?.url;
|
|
41
|
+
let file = config?.file;
|
|
42
|
+
let outDir = config?.outDir;
|
|
43
|
+
let watch = config?.watch ?? false;
|
|
44
|
+
let interval = config?.interval ?? 3000;
|
|
45
|
+
const ajsc = { jsdoc: true, ...config?.ajsc };
|
|
46
|
+
let clientImportPath = config?.clientImportPath;
|
|
47
|
+
let dryRun = config?.dryRun ?? false;
|
|
48
|
+
let namespaceTypes = config?.namespaceTypes ?? true;
|
|
49
|
+
let selfContained = config?.selfContained ?? true;
|
|
50
|
+
let serviceName = config?.serviceName;
|
|
51
|
+
let configPath;
|
|
52
|
+
for (let i = 0; i < argv.length; i++) {
|
|
53
|
+
const arg = argv[i];
|
|
54
|
+
if (arg === '--url') {
|
|
55
|
+
url = argv[++i];
|
|
56
|
+
}
|
|
57
|
+
else if (arg === '--file') {
|
|
58
|
+
file = argv[++i];
|
|
59
|
+
}
|
|
60
|
+
else if (arg === '--out') {
|
|
61
|
+
outDir = argv[++i];
|
|
62
|
+
}
|
|
63
|
+
else if (arg === '--watch') {
|
|
64
|
+
watch = true;
|
|
65
|
+
}
|
|
66
|
+
else if (arg === '--interval') {
|
|
67
|
+
interval = parseInt(argv[++i] ?? '3000', 10);
|
|
68
|
+
}
|
|
69
|
+
else if (arg === '--enum-style') {
|
|
70
|
+
const val = argv[++i];
|
|
71
|
+
if (val === 'union' || val === 'enum') {
|
|
72
|
+
ajsc.enumStyle = val;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if (arg === '--depluralize') {
|
|
76
|
+
ajsc.depluralize = true;
|
|
77
|
+
}
|
|
78
|
+
else if (arg === '--array-item-naming') {
|
|
79
|
+
const val = argv[++i];
|
|
80
|
+
ajsc.arrayItemNaming = val === 'false' ? false : val;
|
|
81
|
+
}
|
|
82
|
+
else if (arg === '--uncountable-words') {
|
|
83
|
+
ajsc.uncountableWords = (argv[++i] ?? '').split(',').map((w) => w.trim()).filter(Boolean);
|
|
84
|
+
}
|
|
85
|
+
else if (arg === '--jsdoc') {
|
|
86
|
+
ajsc.jsdoc = true;
|
|
87
|
+
}
|
|
88
|
+
else if (arg === '--no-jsdoc') {
|
|
89
|
+
ajsc.jsdoc = false;
|
|
90
|
+
}
|
|
91
|
+
else if (arg === '--client-import-path') {
|
|
92
|
+
clientImportPath = argv[++i];
|
|
93
|
+
}
|
|
94
|
+
else if (arg === '--dry-run') {
|
|
95
|
+
dryRun = true;
|
|
96
|
+
}
|
|
97
|
+
else if (arg === '--namespace-types') {
|
|
98
|
+
namespaceTypes = true;
|
|
99
|
+
}
|
|
100
|
+
else if (arg === '--no-namespace-types') {
|
|
101
|
+
namespaceTypes = false;
|
|
102
|
+
}
|
|
103
|
+
else if (arg === '--self-contained') {
|
|
104
|
+
selfContained = true;
|
|
105
|
+
}
|
|
106
|
+
else if (arg === '--no-self-contained') {
|
|
107
|
+
selfContained = false;
|
|
108
|
+
}
|
|
109
|
+
else if (arg === '--service-name') {
|
|
110
|
+
serviceName = argv[++i];
|
|
111
|
+
}
|
|
112
|
+
else if (arg === '--config') {
|
|
113
|
+
configPath = argv[++i];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// configPath is consumed by the caller (main) before parseArgs is called with the loaded config.
|
|
117
|
+
// When called from main, config is already loaded. When called directly (tests), configPath is ignored.
|
|
118
|
+
if (outDir === undefined) {
|
|
119
|
+
throw new Error('Missing required argument: --out <dir>');
|
|
120
|
+
}
|
|
121
|
+
if (url === undefined && file === undefined) {
|
|
122
|
+
throw new Error('Missing required input source: provide --url <url> or --file <path>');
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
url,
|
|
126
|
+
file,
|
|
127
|
+
outDir,
|
|
128
|
+
watch,
|
|
129
|
+
interval,
|
|
130
|
+
ajsc,
|
|
131
|
+
...(clientImportPath !== undefined ? { clientImportPath } : {}),
|
|
132
|
+
dryRun,
|
|
133
|
+
namespaceTypes,
|
|
134
|
+
selfContained,
|
|
135
|
+
...(serviceName !== undefined ? { serviceName } : {}),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Extracts the --config value from argv without full parsing.
|
|
140
|
+
*/
|
|
141
|
+
export function extractConfigPath(argv) {
|
|
142
|
+
for (let i = 0; i < argv.length; i++) {
|
|
143
|
+
if (argv[i] === '--config')
|
|
144
|
+
return argv[i + 1];
|
|
145
|
+
}
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Watch mode
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
function hashEnvelope(envelope) {
|
|
152
|
+
return createHash('md5').update(JSON.stringify(envelope)).digest('hex');
|
|
153
|
+
}
|
|
154
|
+
async function runWithWatch(parsed) {
|
|
155
|
+
const opts = {
|
|
156
|
+
url: parsed.url,
|
|
157
|
+
file: parsed.file,
|
|
158
|
+
outDir: parsed.outDir,
|
|
159
|
+
ajsc: parsed.ajsc,
|
|
160
|
+
clientImportPath: parsed.clientImportPath,
|
|
161
|
+
dryRun: parsed.dryRun,
|
|
162
|
+
namespaceTypes: parsed.namespaceTypes,
|
|
163
|
+
selfContained: parsed.selfContained,
|
|
164
|
+
serviceName: parsed.serviceName,
|
|
165
|
+
};
|
|
166
|
+
let lastHash;
|
|
167
|
+
const run = async () => {
|
|
168
|
+
try {
|
|
169
|
+
// Resolve envelope separately so we can hash it
|
|
170
|
+
const { resolveEnvelope } = await import('../resolve-envelope.js');
|
|
171
|
+
const envelope = await resolveEnvelope(opts);
|
|
172
|
+
const hash = hashEnvelope(envelope);
|
|
173
|
+
if (hash === lastHash) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
lastHash = hash;
|
|
177
|
+
const { runPipeline } = await import('../pipeline.js');
|
|
178
|
+
await runPipeline({
|
|
179
|
+
envelope,
|
|
180
|
+
outDir: parsed.outDir,
|
|
181
|
+
ajsc: parsed.ajsc,
|
|
182
|
+
clientImportPath: parsed.clientImportPath,
|
|
183
|
+
dryRun: parsed.dryRun,
|
|
184
|
+
namespaceTypes: parsed.namespaceTypes,
|
|
185
|
+
selfContained: parsed.selfContained,
|
|
186
|
+
serviceName: parsed.serviceName,
|
|
187
|
+
});
|
|
188
|
+
console.log(`[ts-procedures-codegen] Generated client files → ${parsed.outDir}`);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
console.error('[ts-procedures-codegen] Error:', err instanceof Error ? err.message : err);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
await run();
|
|
195
|
+
setInterval(() => {
|
|
196
|
+
void run();
|
|
197
|
+
}, parsed.interval);
|
|
198
|
+
}
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
// Main
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
async function main() {
|
|
203
|
+
const argv = process.argv.slice(2);
|
|
204
|
+
const configPath = extractConfigPath(argv);
|
|
205
|
+
const config = await loadConfigFile(configPath);
|
|
206
|
+
if (config != null) {
|
|
207
|
+
console.log(`[ts-procedures-codegen] Loaded config from ${configPath ?? DEFAULT_CONFIG_NAME}`);
|
|
208
|
+
}
|
|
209
|
+
const parsed = parseArgs(argv, config);
|
|
210
|
+
const source = parsed.url ?? parsed.file;
|
|
211
|
+
console.log(`[ts-procedures-codegen] Reading docs from ${source}...`);
|
|
212
|
+
if (parsed.watch) {
|
|
213
|
+
await runWithWatch(parsed);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const result = await generateClient({
|
|
217
|
+
url: parsed.url,
|
|
218
|
+
file: parsed.file,
|
|
219
|
+
outDir: parsed.outDir,
|
|
220
|
+
ajsc: parsed.ajsc,
|
|
221
|
+
clientImportPath: parsed.clientImportPath,
|
|
222
|
+
dryRun: parsed.dryRun,
|
|
223
|
+
namespaceTypes: parsed.namespaceTypes,
|
|
224
|
+
selfContained: parsed.selfContained,
|
|
225
|
+
serviceName: parsed.serviceName,
|
|
226
|
+
});
|
|
227
|
+
if (parsed.dryRun) {
|
|
228
|
+
console.log(`[ts-procedures-codegen] Dry run complete — ${result.length} files would be generated`);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
console.log(`[ts-procedures-codegen] Generated ${result.length} files → ${parsed.outDir}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Run when this file is the entry point (direct execution or via npx bin symlink)
|
|
236
|
+
const isMain = typeof process !== 'undefined' &&
|
|
237
|
+
process.argv[1] !== undefined &&
|
|
238
|
+
!process.argv[1].includes('vitest') &&
|
|
239
|
+
!process.argv[1].includes('jest');
|
|
240
|
+
if (isMain) {
|
|
241
|
+
main().catch((err) => {
|
|
242
|
+
console.error('[ts-procedures-codegen] Fatal error:', err instanceof Error ? err.message : err);
|
|
243
|
+
process.exit(1);
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../src/codegen/bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|