ts-procedures 5.9.1 → 5.10.2
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 +1 -1
- 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 +46 -101
- package/agent_config/claude-code/skills/{guide → ts-procedures}/SKILL.md +50 -35
- package/agent_config/claude-code/skills/{guide → ts-procedures}/anti-patterns.md +6 -5
- package/agent_config/claude-code/skills/{guide → ts-procedures}/api-reference.md +60 -49
- package/agent_config/claude-code/skills/ts-procedures-review/SKILL.md +48 -0
- package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/SKILL.md +19 -24
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/client.md +115 -0
- package/agent_config/lib/install-claude.mjs +35 -87
- 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/core.md +5 -9
- package/docs/streaming.md +9 -9
- package/package.json +2 -13
- package/src/client/call.test.ts +162 -0
- package/src/client/errors.test.ts +43 -0
- package/src/client/fetch-adapter.test.ts +340 -0
- package/src/client/hooks.test.ts +191 -0
- package/src/client/index.test.ts +290 -0
- package/src/client/request-builder.test.ts +184 -0
- package/src/client/stream.test.ts +331 -0
- package/src/codegen/bin/cli.test.ts +260 -0
- package/src/codegen/bin/cli.ts +282 -0
- package/src/codegen/constants.ts +1 -0
- package/src/codegen/e2e.test.ts +565 -0
- package/src/codegen/emit-client-runtime.test.ts +93 -0
- package/src/codegen/emit-client-runtime.ts +114 -0
- package/src/codegen/emit-client-types.test.ts +39 -0
- package/src/codegen/emit-client-types.ts +27 -0
- package/src/codegen/emit-errors.test.ts +202 -0
- package/src/codegen/emit-errors.ts +80 -0
- package/src/codegen/emit-index.test.ts +127 -0
- package/src/codegen/emit-index.ts +58 -0
- package/src/codegen/emit-scope.test.ts +624 -0
- package/src/codegen/emit-scope.ts +389 -0
- package/src/codegen/emit-types.test.ts +205 -0
- package/src/codegen/emit-types.ts +158 -0
- package/src/codegen/group-routes.test.ts +159 -0
- package/src/codegen/group-routes.ts +61 -0
- package/src/codegen/index.ts +30 -0
- package/src/codegen/naming.test.ts +50 -0
- package/src/codegen/naming.ts +25 -0
- package/src/codegen/pipeline.test.ts +316 -0
- package/src/codegen/pipeline.ts +108 -0
- package/src/codegen/resolve-envelope.test.ts +76 -0
- package/src/codegen/resolve-envelope.ts +61 -0
- package/src/errors.test.ts +163 -0
- package/src/errors.ts +107 -0
- package/src/exports.ts +7 -0
- package/src/implementations/http/doc-registry.test.ts +415 -0
- package/src/implementations/http/doc-registry.ts +143 -0
- package/src/implementations/http/express-rpc/README.md +6 -6
- package/src/implementations/http/express-rpc/index.test.ts +957 -0
- package/src/implementations/http/express-rpc/index.ts +266 -0
- package/src/implementations/http/express-rpc/types.ts +16 -0
- package/src/implementations/http/hono-api/index.test.ts +1341 -0
- package/src/implementations/http/hono-api/index.ts +463 -0
- package/src/implementations/http/hono-api/types.ts +16 -0
- package/src/implementations/http/hono-rpc/README.md +6 -6
- package/src/implementations/http/hono-rpc/index.test.ts +1075 -0
- package/src/implementations/http/hono-rpc/index.ts +238 -0
- package/src/implementations/http/hono-rpc/types.ts +16 -0
- package/src/implementations/http/hono-stream/README.md +12 -12
- package/src/implementations/http/hono-stream/index.test.ts +1768 -0
- package/src/implementations/http/hono-stream/index.ts +456 -0
- package/src/implementations/http/hono-stream/types.ts +20 -0
- package/src/implementations/types.ts +174 -0
- package/src/index.test.ts +1185 -0
- package/src/index.ts +522 -0
- package/src/schema/compute-schema.test.ts +128 -0
- package/src/schema/compute-schema.ts +88 -0
- package/src/schema/extract-json-schema.test.ts +25 -0
- package/src/schema/extract-json-schema.ts +15 -0
- package/src/schema/parser.test.ts +182 -0
- package/src/schema/parser.ts +215 -0
- package/src/schema/resolve-schema-lib.test.ts +19 -0
- package/src/schema/resolve-schema-lib.ts +29 -0
- package/src/schema/types.ts +20 -0
- package/src/stack-utils.test.ts +94 -0
- package/src/stack-utils.ts +129 -0
- package/agent_config/claude-code/skills/review/SKILL.md +0 -53
- package/docs/superpowers/plans/2026-03-30-client-codegen.md +0 -2833
- package/docs/superpowers/specs/2026-03-30-client-codegen-design.md +0 -632
- /package/agent_config/claude-code/skills/{guide → ts-procedures}/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,120 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { extractSingleJsonSchema, v } from 'suretype';
|
|
3
|
+
import { schemaParser } from './parser.js';
|
|
4
|
+
import { Type } from 'typebox';
|
|
5
|
+
describe('schemaParser', () => {
|
|
6
|
+
test('it parses params to json-schema', async () => {
|
|
7
|
+
let done = () => void 0;
|
|
8
|
+
const promise = new Promise((r) => {
|
|
9
|
+
done = r;
|
|
10
|
+
});
|
|
11
|
+
const params = v.object({
|
|
12
|
+
name: v.string(),
|
|
13
|
+
age: v.number(),
|
|
14
|
+
});
|
|
15
|
+
const result = schemaParser({
|
|
16
|
+
params: params,
|
|
17
|
+
}, (errors) => {
|
|
18
|
+
throw new Error(JSON.stringify(errors));
|
|
19
|
+
});
|
|
20
|
+
expect(result.jsonSchema.params).toEqual(extractSingleJsonSchema(params)?.schema);
|
|
21
|
+
done();
|
|
22
|
+
await promise;
|
|
23
|
+
await promise;
|
|
24
|
+
});
|
|
25
|
+
test('it parses params and generates a validator function', async () => {
|
|
26
|
+
let done = () => void 0;
|
|
27
|
+
const promise = new Promise((r) => {
|
|
28
|
+
done = r;
|
|
29
|
+
});
|
|
30
|
+
const params = v.object({
|
|
31
|
+
name: v.string(),
|
|
32
|
+
age: v.number().required(),
|
|
33
|
+
});
|
|
34
|
+
const result = schemaParser({
|
|
35
|
+
params: params,
|
|
36
|
+
}, (errors) => {
|
|
37
|
+
throw new Error(JSON.stringify(errors));
|
|
38
|
+
});
|
|
39
|
+
expect(result.validation.params?.({
|
|
40
|
+
name: 'John',
|
|
41
|
+
age: 30,
|
|
42
|
+
})?.errors).toBeUndefined();
|
|
43
|
+
expect(result.validation.params?.({
|
|
44
|
+
name: { name: '' },
|
|
45
|
+
age: 'poop',
|
|
46
|
+
})?.errors).toBeDefined();
|
|
47
|
+
expect(result.validation.params?.({
|
|
48
|
+
name: { name: '' },
|
|
49
|
+
age: 'poop',
|
|
50
|
+
})?.errors?.length).toEqual(2);
|
|
51
|
+
done();
|
|
52
|
+
await promise;
|
|
53
|
+
});
|
|
54
|
+
test('it parses returnType to json-schema', async () => {
|
|
55
|
+
let done = () => void 0;
|
|
56
|
+
const promise = new Promise((r) => {
|
|
57
|
+
done = r;
|
|
58
|
+
});
|
|
59
|
+
const returnType = v.object({
|
|
60
|
+
name: v.string(),
|
|
61
|
+
age: v.number(),
|
|
62
|
+
});
|
|
63
|
+
const result = schemaParser({
|
|
64
|
+
returnType: returnType,
|
|
65
|
+
}, (errors) => {
|
|
66
|
+
throw new Error(JSON.stringify(errors));
|
|
67
|
+
});
|
|
68
|
+
expect(result.jsonSchema.returnType).toEqual(extractSingleJsonSchema(returnType)?.schema);
|
|
69
|
+
done();
|
|
70
|
+
await promise;
|
|
71
|
+
});
|
|
72
|
+
test('it throws a meaningful error to the dev', async () => {
|
|
73
|
+
schemaParser(
|
|
74
|
+
// invalid params schema
|
|
75
|
+
{ params: { test: Type.String() } }, (errors) => {
|
|
76
|
+
expect(errors.params).toMatch(/Error extracting json schema schema.params/);
|
|
77
|
+
});
|
|
78
|
+
schemaParser(
|
|
79
|
+
// invalid returnType schema
|
|
80
|
+
{ returnType: 'string value' }, (errors) => {
|
|
81
|
+
expect(errors.returnType).toMatch(/Error extracting json schema schema.returnType/);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
test('it parses multiple schemas correct', async () => {
|
|
85
|
+
const schema = schemaParser({
|
|
86
|
+
params: Type.Object({ a: Type.String() }),
|
|
87
|
+
returnType: Type.Object({ b: Type.Null() }),
|
|
88
|
+
}, (error) => {
|
|
89
|
+
throw new Error(JSON.stringify(error));
|
|
90
|
+
});
|
|
91
|
+
const schema2 = schemaParser({
|
|
92
|
+
params: Type.Object({ c: Type.String() }),
|
|
93
|
+
returnType: Type.Object({ d: Type.Number() }),
|
|
94
|
+
}, (error) => {
|
|
95
|
+
throw new Error(JSON.stringify(error));
|
|
96
|
+
});
|
|
97
|
+
expect(schema.validation.params?.({}).errors?.[0]?.message).toMatch(/must have required property 'a'/);
|
|
98
|
+
expect(schema2.validation.params?.({ c: 'test' })).toMatchObject({});
|
|
99
|
+
expect(schema.validation.params?.({}).errors?.[0]?.message).toMatch(/must have required property 'a'/);
|
|
100
|
+
});
|
|
101
|
+
test('validation returns error if validator fails to initialize', async () => {
|
|
102
|
+
// Create a schema that will pass extraction but creates a validation function
|
|
103
|
+
// that handles the uninitialized case gracefully
|
|
104
|
+
let parseErrorCalled = false;
|
|
105
|
+
const result = schemaParser({
|
|
106
|
+
// Using a valid schema to get through extraction, but we'll test the guard
|
|
107
|
+
params: Type.Object({ name: Type.String() }),
|
|
108
|
+
}, () => {
|
|
109
|
+
parseErrorCalled = true;
|
|
110
|
+
});
|
|
111
|
+
// The validator should be initialized for valid schemas
|
|
112
|
+
expect(result.validation.params).toBeDefined();
|
|
113
|
+
// Test that the validation function works correctly
|
|
114
|
+
const validResult = result.validation.params?.({ name: 'test' });
|
|
115
|
+
expect(validResult?.errors).toBeUndefined();
|
|
116
|
+
const invalidResult = result.validation.params?.({});
|
|
117
|
+
expect(invalidResult?.errors).toBeDefined();
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../../src/schema/parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CoreValidator } from 'suretype';
|
|
2
|
+
import { Type } from 'typebox';
|
|
3
|
+
export type IsTypeboxSchema<TSchema> = TSchema extends {
|
|
4
|
+
static: unknown;
|
|
5
|
+
params: unknown;
|
|
6
|
+
} ? true : false;
|
|
7
|
+
export declare function isTypeboxSchema(schema: any): schema is Type.TSchema;
|
|
8
|
+
export type IsSuretypeSchema<TSchema> = TSchema extends {
|
|
9
|
+
required: () => object;
|
|
10
|
+
nullable?: never;
|
|
11
|
+
} ? true : false;
|
|
12
|
+
export declare function isSuretypeSchema(schema: any): schema is CoreValidator<any>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function isTypeboxSchema(schema) {
|
|
2
|
+
return (
|
|
3
|
+
// typebox v1
|
|
4
|
+
(typeof schema === 'object' && '~kind' in schema) ||
|
|
5
|
+
// @sinclair/typebox v0.3x
|
|
6
|
+
(typeof schema === 'object' && Symbol.for('TypeBox.Kind') in schema));
|
|
7
|
+
}
|
|
8
|
+
export function isSuretypeSchema(schema) {
|
|
9
|
+
return typeof schema === 'object' && 'getJsonSchemaObject' in schema;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=resolve-schema-lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-schema-lib.js","sourceRoot":"","sources":["../../../src/schema/resolve-schema-lib.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,eAAe,CAAC,MAAW;IACzC,OAAO;IACL,cAAc;IACd,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM,CAAC;QACjD,0BAA0B;QAC1B,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,CACrE,CAAA;AACH,CAAC;AASD,MAAM,UAAU,gBAAgB,CAAC,MAAW;IAC1C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,qBAAqB,IAAI,MAAM,CAAA;AACtE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { isSuretypeSchema, isTypeboxSchema } from './resolve-schema-lib.js';
|
|
3
|
+
import { Type } from 'typebox';
|
|
4
|
+
import { v } from 'suretype';
|
|
5
|
+
describe('lib schema resolvers', () => {
|
|
6
|
+
const typebox = Type.Object({ name: Type.String() });
|
|
7
|
+
const suretype = v.object({ name: v.string() });
|
|
8
|
+
test('it recognizes TypeBox schema', async () => {
|
|
9
|
+
expect(isTypeboxSchema(typebox)).toBe(true);
|
|
10
|
+
expect(isTypeboxSchema(suretype)).toBe(false);
|
|
11
|
+
});
|
|
12
|
+
test('it recognizes Suretype schema', async () => {
|
|
13
|
+
expect(isSuretypeSchema(suretype)).toBe(true);
|
|
14
|
+
expect(isSuretypeSchema(typebox)).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=resolve-schema-lib.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-schema-lib.test.js","sourceRoot":"","sources":["../../../src/schema/resolve-schema-lib.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,UAAU,CAAA;AAE5B,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACpD,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAE/C,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CoreValidator, TypeOf } from 'suretype';
|
|
2
|
+
import { Static, TSchema } from 'typebox';
|
|
3
|
+
export type TSchemaLib<SchemaLibType> = SchemaLibType extends CoreValidator<any> ? TypeOf<SchemaLibType> : SchemaLibType extends TSchema ? Static<SchemaLibType> : unknown;
|
|
4
|
+
export type TSchemaLibGenerator<TYield, TReturn = void> = AsyncGenerator<TSchemaLib<TYield>, TSchemaLib<TReturn>, unknown>;
|
|
5
|
+
export type TJSONSchema = Record<string, any>;
|
|
6
|
+
export type Prettify<TObject> = {
|
|
7
|
+
[Key in keyof TObject]: TObject[Key];
|
|
8
|
+
} & {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/schema/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a specific location in source code where a procedure was defined.
|
|
3
|
+
*/
|
|
4
|
+
export type DefinitionLocation = {
|
|
5
|
+
file: string;
|
|
6
|
+
line: number;
|
|
7
|
+
column: number;
|
|
8
|
+
raw: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Contains information about where a procedure was defined.
|
|
12
|
+
*/
|
|
13
|
+
export type DefinitionInfo = {
|
|
14
|
+
definedAt?: DefinitionLocation;
|
|
15
|
+
definitionStack?: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Captures the stack trace at the call site and extracts the definition location.
|
|
19
|
+
* Finds the first stack frame outside of ts-procedures internal files.
|
|
20
|
+
*/
|
|
21
|
+
export declare function captureDefinitionInfo(): DefinitionInfo;
|
|
22
|
+
/**
|
|
23
|
+
* Formats definition info for appending to error stacks.
|
|
24
|
+
*/
|
|
25
|
+
export declare function formatDefinitionInfo(info: DefinitionInfo, procedureName: string): string | undefined;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal ts-procedures files that should be skipped when finding user code.
|
|
3
|
+
* Only skip the core library files, not test files or user code.
|
|
4
|
+
*/
|
|
5
|
+
const INTERNAL_FILES = [
|
|
6
|
+
'/index.ts',
|
|
7
|
+
'/index.js',
|
|
8
|
+
'/errors.ts',
|
|
9
|
+
'/errors.js',
|
|
10
|
+
'/stack-utils.ts',
|
|
11
|
+
'/stack-utils.js',
|
|
12
|
+
'/compute-schema.ts',
|
|
13
|
+
'/compute-schema.js',
|
|
14
|
+
'/parser.ts',
|
|
15
|
+
'/parser.js',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Captures the stack trace at the call site and extracts the definition location.
|
|
19
|
+
* Finds the first stack frame outside of ts-procedures internal files.
|
|
20
|
+
*/
|
|
21
|
+
export function captureDefinitionInfo() {
|
|
22
|
+
const err = new Error();
|
|
23
|
+
const stack = err.stack;
|
|
24
|
+
if (!stack) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
const lines = stack.split('\n');
|
|
28
|
+
// Find the first frame that's not from ts-procedures internals
|
|
29
|
+
// Skip the first line (Error message) and frames from this module
|
|
30
|
+
let userFrame;
|
|
31
|
+
for (let i = 1; i < lines.length; i++) {
|
|
32
|
+
const rawLine = lines[i];
|
|
33
|
+
if (!rawLine)
|
|
34
|
+
continue;
|
|
35
|
+
const line = rawLine.trim();
|
|
36
|
+
// Skip empty or invalid frames
|
|
37
|
+
if (!line.startsWith('at ')) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Skip frames from ts-procedures internal source files
|
|
41
|
+
const isInternalFile = INTERNAL_FILES.some(file => line.includes(file));
|
|
42
|
+
if (isInternalFile) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Skip frames from ts-procedures in node_modules (when used as a dependency)
|
|
46
|
+
if (line.includes('/node_modules/ts-procedures/') || line.includes('\\node_modules\\ts-procedures\\')) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Skip internal node frames
|
|
50
|
+
if (line.includes('node:') || line.startsWith('at Module.') || line.startsWith('at Object.<anonymous> (node:')) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
userFrame = line;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
if (!userFrame) {
|
|
57
|
+
return { definitionStack: stack };
|
|
58
|
+
}
|
|
59
|
+
const definedAt = parseStackFrame(userFrame);
|
|
60
|
+
return {
|
|
61
|
+
definedAt,
|
|
62
|
+
definitionStack: stack,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parses a V8 stack frame line to extract file, line, and column info.
|
|
67
|
+
* Handles formats like:
|
|
68
|
+
* - "at Object.<anonymous> (/path/to/file.ts:10:5)"
|
|
69
|
+
* - "at functionName (/path/to/file.ts:10:5)"
|
|
70
|
+
* - "at /path/to/file.ts:10:5"
|
|
71
|
+
*/
|
|
72
|
+
function parseStackFrame(frame) {
|
|
73
|
+
// Match patterns like "(path:line:column)" or just "path:line:column"
|
|
74
|
+
const match = frame.match(/\(([^)]+):(\d+):(\d+)\)$/) || frame.match(/at ([^:]+):(\d+):(\d+)$/);
|
|
75
|
+
if (match && match[1] && match[2] && match[3]) {
|
|
76
|
+
return {
|
|
77
|
+
file: match[1],
|
|
78
|
+
line: parseInt(match[2], 10),
|
|
79
|
+
column: parseInt(match[3], 10),
|
|
80
|
+
raw: frame,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Formats definition info for appending to error stacks.
|
|
87
|
+
*/
|
|
88
|
+
export function formatDefinitionInfo(info, procedureName) {
|
|
89
|
+
if (!info.definedAt) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const { file, line, column } = info.definedAt;
|
|
93
|
+
return `\n--- Procedure "${procedureName}" defined at ---\n at ${file}:${line}:${column}`;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=stack-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-utils.js","sourceRoot":"","sources":["../../src/stack-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { captureDefinitionInfo, formatDefinitionInfo } from './stack-utils.js';
|
|
3
|
+
describe('Stack Utils', () => {
|
|
4
|
+
describe('captureDefinitionInfo', () => {
|
|
5
|
+
test('returns definition info with definedAt', () => {
|
|
6
|
+
const info = captureDefinitionInfo();
|
|
7
|
+
// Should capture the call site in this test file
|
|
8
|
+
expect(info).toBeDefined();
|
|
9
|
+
expect(info.definitionStack).toBeDefined();
|
|
10
|
+
expect(typeof info.definitionStack).toBe('string');
|
|
11
|
+
});
|
|
12
|
+
test('definedAt contains file, line, column when available', () => {
|
|
13
|
+
const info = captureDefinitionInfo();
|
|
14
|
+
// The definedAt should be present since we're calling from user code (test file)
|
|
15
|
+
if (info.definedAt) {
|
|
16
|
+
expect(info.definedAt.file).toBeDefined();
|
|
17
|
+
expect(typeof info.definedAt.file).toBe('string');
|
|
18
|
+
expect(info.definedAt.line).toBeDefined();
|
|
19
|
+
expect(typeof info.definedAt.line).toBe('number');
|
|
20
|
+
expect(info.definedAt.line).toBeGreaterThan(0);
|
|
21
|
+
expect(info.definedAt.column).toBeDefined();
|
|
22
|
+
expect(typeof info.definedAt.column).toBe('number');
|
|
23
|
+
expect(info.definedAt.column).toBeGreaterThan(0);
|
|
24
|
+
expect(info.definedAt.raw).toBeDefined();
|
|
25
|
+
expect(typeof info.definedAt.raw).toBe('string');
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
test('definitionStack contains Error stack trace', () => {
|
|
29
|
+
const info = captureDefinitionInfo();
|
|
30
|
+
expect(info.definitionStack).toContain('Error');
|
|
31
|
+
expect(info.definitionStack).toContain('at ');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('formatDefinitionInfo', () => {
|
|
35
|
+
test('returns undefined when definedAt is not present', () => {
|
|
36
|
+
const info = {};
|
|
37
|
+
const result = formatDefinitionInfo(info, 'TestProcedure');
|
|
38
|
+
expect(result).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
test('returns formatted string when definedAt is present', () => {
|
|
41
|
+
const info = {
|
|
42
|
+
definedAt: {
|
|
43
|
+
file: '/app/procedures/test.ts',
|
|
44
|
+
line: 42,
|
|
45
|
+
column: 5,
|
|
46
|
+
raw: 'at Object.<anonymous> (/app/procedures/test.ts:42:5)',
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
const result = formatDefinitionInfo(info, 'TestProcedure');
|
|
50
|
+
expect(result).toBeDefined();
|
|
51
|
+
expect(result).toContain('--- Procedure "TestProcedure" defined at ---');
|
|
52
|
+
expect(result).toContain('/app/procedures/test.ts:42:5');
|
|
53
|
+
});
|
|
54
|
+
test('includes procedure name in formatted output', () => {
|
|
55
|
+
const info = {
|
|
56
|
+
definedAt: {
|
|
57
|
+
file: '/path/to/file.ts',
|
|
58
|
+
line: 10,
|
|
59
|
+
column: 3,
|
|
60
|
+
raw: 'at /path/to/file.ts:10:3',
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
const result = formatDefinitionInfo(info, 'MyCustomProcedure');
|
|
64
|
+
expect(result).toContain('"MyCustomProcedure"');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('integration with procedure creation', () => {
|
|
68
|
+
test('captures location from calling code', () => {
|
|
69
|
+
// Helper to simulate what happens in Create()
|
|
70
|
+
function simulateCreate() {
|
|
71
|
+
return captureDefinitionInfo();
|
|
72
|
+
}
|
|
73
|
+
const info = simulateCreate();
|
|
74
|
+
// Should have captured the location of the simulateCreate() call
|
|
75
|
+
expect(info).toBeDefined();
|
|
76
|
+
expect(info.definitionStack).toBeDefined();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=stack-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-utils.test.js","sourceRoot":"","sources":["../../src/stack-utils.test.ts"],"names":[],"mappings":"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"}
|
package/docs/ai-agent-setup.md
CHANGED
|
@@ -22,7 +22,7 @@ npx ts-procedures-setup copilot # GitHub Copilot only
|
|
|
22
22
|
|
|
23
23
|
| Tool | Files | Auto-updates? |
|
|
24
24
|
|------|-------|---------------|
|
|
25
|
-
| **Claude Code** | `.claude/
|
|
25
|
+
| **Claude Code** | `.claude/skills/ts-procedures/`, `.claude/skills/ts-procedures-scaffold/`, `.claude/skills/ts-procedures-review/`, `.claude/agents/ts-procedures-architect.md` | Yes |
|
|
26
26
|
| **Cursor** | `.cursorrules` (marker-based section) | Yes |
|
|
27
27
|
| **GitHub Copilot** | `.github/copilot-instructions.md` (marker-based section) | Yes |
|
|
28
28
|
|
|
@@ -34,9 +34,9 @@ After initial setup, rules are automatically refreshed on every `npm install` or
|
|
|
34
34
|
|
|
35
35
|
Once installed, Claude Code gets:
|
|
36
36
|
|
|
37
|
-
- **Framework reference** —
|
|
38
|
-
- **Scaffold
|
|
39
|
-
- **Review
|
|
37
|
+
- **Framework reference skill** — `ts-procedures` with core API, schema system, error handling, and decision framework (auto-discovered by Claude Code)
|
|
38
|
+
- **Scaffold skill** — `/ts-procedures-scaffold <type> <Name>` generates procedures, streams, and HTTP setups with correct patterns
|
|
39
|
+
- **Review skill** — `/ts-procedures-review <path>` checks code against a 60+ item checklist
|
|
40
40
|
- **Architecture agent** — `ts-procedures-architect` helps plan procedure structure, schema design, and HTTP implementation choices
|
|
41
41
|
|
|
42
42
|
## CLI Options
|
|
@@ -53,8 +53,9 @@ The `.claude/` files are auto-generated and regenerated on `npm install`. You ca
|
|
|
53
53
|
|
|
54
54
|
```gitignore
|
|
55
55
|
# Auto-generated AI agent rules (regenerated on npm install)
|
|
56
|
-
.claude/
|
|
57
|
-
.claude/
|
|
56
|
+
.claude/skills/ts-procedures/
|
|
57
|
+
.claude/skills/ts-procedures-scaffold/
|
|
58
|
+
.claude/skills/ts-procedures-review/
|
|
58
59
|
.claude/agents/ts-procedures-*.md
|
|
59
60
|
```
|
|
60
61
|
|
package/docs/core.md
CHANGED
|
@@ -203,18 +203,15 @@ const { CreateUser } = Create(
|
|
|
203
203
|
|
|
204
204
|
## Schema Validation
|
|
205
205
|
|
|
206
|
-
ts-procedures
|
|
206
|
+
ts-procedures uses **TypeBox** for schema definitions:
|
|
207
207
|
|
|
208
208
|
```typescript
|
|
209
|
-
// TypeBox
|
|
210
209
|
import { Type } from 'typebox'
|
|
211
210
|
schema: { params: Type.Object({ title: Type.String() }) }
|
|
212
|
-
|
|
213
|
-
// Suretype
|
|
214
|
-
import { v } from 'suretype'
|
|
215
|
-
schema: { params: v.object({ title: v.string().required() }) }
|
|
216
211
|
```
|
|
217
212
|
|
|
213
|
+
TypeBox schemas are valid JSON Schema and work directly with AJV for runtime validation.
|
|
214
|
+
|
|
218
215
|
### Validation Behavior
|
|
219
216
|
|
|
220
217
|
AJV is configured with:
|
|
@@ -426,8 +423,8 @@ Defines a procedure.
|
|
|
426
423
|
**Parameters:**
|
|
427
424
|
- `name` - Unique procedure name (becomes named export)
|
|
428
425
|
- `config.description` - Optional description
|
|
429
|
-
- `config.schema.params` -
|
|
430
|
-
- `config.schema.returnType` -
|
|
426
|
+
- `config.schema.params` - TypeBox schema for params (validated at runtime)
|
|
427
|
+
- `config.schema.returnType` - TypeBox schema for return type (documentation only)
|
|
431
428
|
- Additional properties from `TExtendedConfig`
|
|
432
429
|
- `handler` - Async function `(ctx, params) => Promise<returnType>`
|
|
433
430
|
|
|
@@ -460,7 +457,6 @@ import {
|
|
|
460
457
|
extractJsonSchema,
|
|
461
458
|
schemaParser,
|
|
462
459
|
isTypeboxSchema,
|
|
463
|
-
isSuretypeSchema,
|
|
464
460
|
|
|
465
461
|
// Schema types
|
|
466
462
|
TJSONSchema,
|
package/docs/streaming.md
CHANGED
|
@@ -10,7 +10,7 @@ For the `CreateStream` function signature and config options, see [Core Procedur
|
|
|
10
10
|
|
|
11
11
|
```typescript
|
|
12
12
|
import { Procedures } from 'ts-procedures'
|
|
13
|
-
import {
|
|
13
|
+
import { Type } from 'typebox'
|
|
14
14
|
|
|
15
15
|
const { CreateStream } = Procedures<{ userId: string }>()
|
|
16
16
|
|
|
@@ -19,11 +19,11 @@ const { StreamUpdates } = CreateStream(
|
|
|
19
19
|
{
|
|
20
20
|
description: 'Stream real-time updates',
|
|
21
21
|
schema: {
|
|
22
|
-
params:
|
|
23
|
-
yieldType:
|
|
24
|
-
id:
|
|
25
|
-
message:
|
|
26
|
-
timestamp:
|
|
22
|
+
params: Type.Object({ topic: Type.String() }),
|
|
23
|
+
yieldType: Type.Object({
|
|
24
|
+
id: Type.String(),
|
|
25
|
+
message: Type.String(),
|
|
26
|
+
timestamp: Type.Number(),
|
|
27
27
|
}),
|
|
28
28
|
},
|
|
29
29
|
},
|
|
@@ -60,7 +60,7 @@ const { ValidatedStream } = CreateStream(
|
|
|
60
60
|
'ValidatedStream',
|
|
61
61
|
{
|
|
62
62
|
schema: {
|
|
63
|
-
yieldType:
|
|
63
|
+
yieldType: Type.Object({ count: Type.Number() }),
|
|
64
64
|
},
|
|
65
65
|
validateYields: true, // Enable runtime validation of each yield
|
|
66
66
|
},
|
|
@@ -148,8 +148,8 @@ CreateStream(
|
|
|
148
148
|
'LiveFeed',
|
|
149
149
|
{
|
|
150
150
|
schema: {
|
|
151
|
-
params:
|
|
152
|
-
yieldType:
|
|
151
|
+
params: Type.Object({ channel: Type.String() }),
|
|
152
|
+
yieldType: Type.Object({ event: Type.String(), data: Type.Any() }),
|
|
153
153
|
},
|
|
154
154
|
},
|
|
155
155
|
async function* (ctx, params) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-procedures",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.10.2",
|
|
4
4
|
"description": "A TypeScript RPC framework that creates type-safe, schema-validated procedure calls with a single function definition. Define your procedures once and get full type inference, runtime validation, and framework integration hooks.",
|
|
5
5
|
"main": "build/exports.js",
|
|
6
6
|
"types": "build/exports.d.ts",
|
|
@@ -61,18 +61,7 @@
|
|
|
61
61
|
"build",
|
|
62
62
|
"docs",
|
|
63
63
|
"agent_config",
|
|
64
|
-
"src
|
|
65
|
-
"src/implementations/http/express-rpc/README.md",
|
|
66
|
-
"src/implementations/http/hono-rpc/README.md",
|
|
67
|
-
"src/implementations/http/hono-stream/README.md",
|
|
68
|
-
"src/client/types.ts",
|
|
69
|
-
"src/client/errors.ts",
|
|
70
|
-
"src/client/request-builder.ts",
|
|
71
|
-
"src/client/hooks.ts",
|
|
72
|
-
"src/client/call.ts",
|
|
73
|
-
"src/client/stream.ts",
|
|
74
|
-
"src/client/fetch-adapter.ts",
|
|
75
|
-
"src/client/index.ts"
|
|
64
|
+
"src"
|
|
76
65
|
],
|
|
77
66
|
"keywords": [
|
|
78
67
|
"typescript",
|