ts-procedures 7.3.0 → 8.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 +65 -3
- package/agent_config/claude-code/agents/ts-procedures-architect.md +6 -8
- package/agent_config/claude-code/skills/ts-procedures/SKILL.md +30 -33
- package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +104 -53
- package/agent_config/claude-code/skills/ts-procedures/api-reference.md +205 -232
- package/agent_config/claude-code/skills/ts-procedures/patterns.md +80 -153
- package/agent_config/claude-code/skills/ts-procedures-review/SKILL.md +1 -1
- package/agent_config/claude-code/skills/ts-procedures-review/checklist.md +4 -5
- package/agent_config/claude-code/skills/ts-procedures-scaffold/SKILL.md +4 -7
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono.md +223 -0
- package/agent_config/copilot/copilot-instructions.md +34 -48
- package/agent_config/cursor/cursorrules +34 -48
- package/build/client/call.js +4 -1
- package/build/client/call.js.map +1 -1
- package/build/client/call.test.js +23 -0
- package/build/client/call.test.js.map +1 -1
- package/build/client/fetch-adapter.js +3 -1
- package/build/client/fetch-adapter.js.map +1 -1
- package/build/client/fetch-adapter.test.js +11 -1
- package/build/client/fetch-adapter.test.js.map +1 -1
- package/build/client/index.test.js +7 -7
- package/build/client/index.test.js.map +1 -1
- package/build/client/request-builder.d.ts +1 -1
- package/build/client/request-builder.js +2 -2
- package/build/client/request-builder.js.map +1 -1
- package/build/client/stream.js +13 -2
- package/build/client/stream.js.map +1 -1
- package/build/client/stream.test.js +32 -7
- package/build/client/stream.test.js.map +1 -1
- package/build/client/typed-error-dispatch.test.js +8 -92
- package/build/client/typed-error-dispatch.test.js.map +1 -1
- package/build/client/types.d.ts +21 -3
- package/build/codegen/bin/cli.js +0 -0
- package/build/codegen/e2e.test.js +87 -23
- package/build/codegen/e2e.test.js.map +1 -1
- package/build/codegen/emit-errors.integration.test.js +1 -1
- package/build/codegen/emit-errors.integration.test.js.map +1 -1
- package/build/codegen/emit-scope.js +308 -47
- package/build/codegen/emit-scope.js.map +1 -1
- package/build/codegen/emit-scope.test.js +363 -110
- package/build/codegen/emit-scope.test.js.map +1 -1
- package/build/codegen/pipeline.test.js +7 -7
- package/build/codegen/pipeline.test.js.map +1 -1
- package/build/codegen/resolve-envelope.js +1 -1
- package/build/codegen/resolve-envelope.js.map +1 -1
- package/build/codegen/resolve-envelope.test.js +5 -5
- package/build/codegen/resolve-envelope.test.js.map +1 -1
- package/build/codegen/targets/_shared/route-slots.d.ts +8 -3
- package/build/codegen/targets/_shared/route-slots.js +49 -8
- package/build/codegen/targets/_shared/route-slots.js.map +1 -1
- package/build/codegen/targets/_shared/route-slots.test.js +99 -26
- package/build/codegen/targets/_shared/route-slots.test.js.map +1 -1
- package/build/codegen/targets/kotlin/emit-route-kotlin.test.js +88 -17
- package/build/codegen/targets/kotlin/emit-route-kotlin.test.js.map +1 -1
- package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js +9 -6
- package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js.map +1 -1
- package/build/codegen/targets/kotlin/integration.test.js +6 -0
- package/build/codegen/targets/kotlin/integration.test.js.map +1 -1
- package/build/codegen/targets/swift/access-level.test.js +8 -11
- package/build/codegen/targets/swift/access-level.test.js.map +1 -1
- package/build/codegen/targets/swift/emit-route-swift.test.js +91 -20
- package/build/codegen/targets/swift/emit-route-swift.test.js.map +1 -1
- package/build/codegen/targets/swift/emit-scope-swift.test.js +12 -9
- package/build/codegen/targets/swift/emit-scope-swift.test.js.map +1 -1
- package/build/codegen/targets/swift/integration.test.js +6 -0
- package/build/codegen/targets/swift/integration.test.js.map +1 -1
- package/build/create-http-stream.d.ts +58 -0
- package/build/create-http-stream.js +122 -0
- package/build/create-http-stream.js.map +1 -0
- package/build/create-http-stream.test.js +88 -0
- package/build/create-http-stream.test.js.map +1 -0
- package/build/create-http.d.ts +49 -0
- package/build/create-http.js +108 -0
- package/build/create-http.js.map +1 -0
- package/build/create-http.test.js +137 -0
- package/build/create-http.test.js.map +1 -0
- package/build/create-stream.d.ts +35 -0
- package/build/create-stream.js +123 -0
- package/build/create-stream.js.map +1 -0
- package/build/create-stream.test.js +428 -0
- package/build/create-stream.test.js.map +1 -0
- package/build/create.d.ts +28 -0
- package/build/create.js +82 -0
- package/build/create.js.map +1 -0
- package/build/create.test.js +483 -0
- package/build/create.test.js.map +1 -0
- package/build/exports.d.ts +2 -0
- package/build/implementations/http/astro/index.test.js +20 -12
- package/build/implementations/http/astro/index.test.js.map +1 -1
- package/build/implementations/http/doc-registry.js +1 -1
- package/build/implementations/http/doc-registry.js.map +1 -1
- package/build/implementations/http/doc-registry.test.js +36 -5
- package/build/implementations/http/doc-registry.test.js.map +1 -1
- package/build/implementations/http/error-dispatch.d.ts +76 -0
- package/build/implementations/http/error-dispatch.js +77 -0
- package/build/implementations/http/error-dispatch.js.map +1 -0
- package/build/implementations/http/error-dispatch.test.js +254 -0
- package/build/implementations/http/error-dispatch.test.js.map +1 -0
- package/build/implementations/http/error-taxonomy.d.ts +5 -5
- package/build/implementations/http/hono/docs/http-doc.d.ts +6 -0
- package/build/implementations/http/hono/docs/http-doc.js +42 -0
- package/build/implementations/http/hono/docs/http-doc.js.map +1 -0
- package/build/implementations/http/hono/docs/http-stream-doc.d.ts +6 -0
- package/build/implementations/http/hono/docs/http-stream-doc.js +40 -0
- package/build/implementations/http/hono/docs/http-stream-doc.js.map +1 -0
- package/build/implementations/http/hono/docs/rpc-doc.d.ts +6 -0
- package/build/implementations/http/hono/docs/rpc-doc.js +24 -0
- package/build/implementations/http/hono/docs/rpc-doc.js.map +1 -0
- package/build/implementations/http/hono/docs/stream-doc.d.ts +6 -0
- package/build/implementations/http/hono/docs/stream-doc.js +42 -0
- package/build/implementations/http/hono/docs/stream-doc.js.map +1 -0
- package/build/implementations/http/hono/handlers/http-stream.d.ts +10 -0
- package/build/implementations/http/hono/handlers/http-stream.js +123 -0
- package/build/implementations/http/hono/handlers/http-stream.js.map +1 -0
- package/build/implementations/http/hono/handlers/http-stream.test.js +128 -0
- package/build/implementations/http/hono/handlers/http-stream.test.js.map +1 -0
- package/build/implementations/http/hono/handlers/http.d.ts +10 -0
- package/build/implementations/http/hono/handlers/http.js +115 -0
- package/build/implementations/http/hono/handlers/http.js.map +1 -0
- package/build/implementations/http/hono/handlers/http.test.js +118 -0
- package/build/implementations/http/hono/handlers/http.test.js.map +1 -0
- package/build/implementations/http/hono/handlers/rpc.d.ts +11 -0
- package/build/implementations/http/hono/handlers/rpc.js +32 -0
- package/build/implementations/http/hono/handlers/rpc.js.map +1 -0
- package/build/implementations/http/hono/handlers/rpc.test.js +73 -0
- package/build/implementations/http/hono/handlers/rpc.test.js.map +1 -0
- package/build/implementations/http/hono/handlers/stream.d.ts +23 -0
- package/build/implementations/http/hono/handlers/stream.js +147 -0
- package/build/implementations/http/hono/handlers/stream.js.map +1 -0
- package/build/implementations/http/hono/handlers/stream.test.d.ts +1 -0
- package/build/implementations/http/hono/handlers/stream.test.js +177 -0
- package/build/implementations/http/hono/handlers/stream.test.js.map +1 -0
- package/build/implementations/http/hono/index.d.ts +57 -0
- package/build/implementations/http/hono/index.js +149 -0
- package/build/implementations/http/hono/index.js.map +1 -0
- package/build/implementations/http/hono/index.test.d.ts +1 -0
- package/build/implementations/http/hono/index.test.js +274 -0
- package/build/implementations/http/hono/index.test.js.map +1 -0
- package/build/implementations/http/hono/path.d.ts +17 -0
- package/build/implementations/http/hono/path.js +39 -0
- package/build/implementations/http/hono/path.js.map +1 -0
- package/build/implementations/http/hono/path.test.d.ts +1 -0
- package/build/implementations/http/hono/path.test.js +83 -0
- package/build/implementations/http/hono/path.test.js.map +1 -0
- package/build/implementations/http/hono/types.d.ts +51 -0
- package/build/implementations/http/hono/types.js.map +1 -0
- package/build/implementations/http/on-request-error.test.js +6 -96
- package/build/implementations/http/on-request-error.test.js.map +1 -1
- package/build/implementations/http/route-errors.test.js +11 -59
- package/build/implementations/http/route-errors.test.js.map +1 -1
- package/build/implementations/types.d.ts +43 -9
- package/build/index.d.ts +124 -124
- package/build/index.js +10 -221
- package/build/index.js.map +1 -1
- package/build/index.test.js +20 -919
- package/build/index.test.js.map +1 -1
- package/build/migration.test.d.ts +1 -0
- package/build/migration.test.js +34 -0
- package/build/migration.test.js.map +1 -0
- package/build/schema/compute-schema.d.ts +11 -3
- package/build/schema/compute-schema.js +13 -7
- package/build/schema/compute-schema.js.map +1 -1
- package/build/schema/parser.d.ts +11 -3
- package/build/schema/parser.js +49 -9
- package/build/schema/parser.js.map +1 -1
- package/build/stack-utils.js +8 -0
- package/build/stack-utils.js.map +1 -1
- package/build/types.d.ts +142 -0
- package/build/types.js.map +1 -0
- package/docs/astro-adapter.md +5 -5
- package/docs/core.md +15 -17
- package/docs/http-integrations.md +83 -170
- package/docs/streaming.md +3 -60
- package/docs/superpowers/plans/2026-05-07-astro-adapter.md +2 -7
- package/docs/superpowers/plans/2026-05-08-create-http.md +3355 -0
- package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +3365 -0
- package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +1 -3
- package/docs/superpowers/specs/2026-05-08-create-http-design.md +409 -0
- package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +411 -0
- package/package.json +4 -22
- package/src/client/call.test.ts +26 -0
- package/src/client/call.ts +4 -1
- package/src/client/fetch-adapter.test.ts +14 -1
- package/src/client/fetch-adapter.ts +3 -1
- package/src/client/index.test.ts +7 -7
- package/src/client/request-builder.ts +2 -2
- package/src/client/stream.test.ts +39 -7
- package/src/client/stream.ts +16 -2
- package/src/client/typed-error-dispatch.test.ts +7 -97
- package/src/client/types.ts +21 -3
- package/src/codegen/__fixtures__/users-envelope.json +119 -38
- package/src/codegen/e2e.test.ts +98 -24
- package/src/codegen/emit-errors.integration.test.ts +1 -1
- package/src/codegen/emit-scope.test.ts +395 -110
- package/src/codegen/emit-scope.ts +350 -55
- package/src/codegen/pipeline.test.ts +7 -7
- package/src/codegen/resolve-envelope.test.ts +5 -5
- package/src/codegen/resolve-envelope.ts +1 -1
- package/src/codegen/targets/_shared/route-slots.test.ts +109 -26
- package/src/codegen/targets/_shared/route-slots.ts +48 -11
- package/src/codegen/targets/kotlin/__fixtures__/users-golden.kt +73 -0
- package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +100 -17
- package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +9 -6
- package/src/codegen/targets/kotlin/integration.test.ts +19 -0
- package/src/codegen/targets/swift/__fixtures__/users-golden.swift +79 -0
- package/src/codegen/targets/swift/access-level.test.ts +8 -11
- package/src/codegen/targets/swift/emit-route-swift.test.ts +103 -20
- package/src/codegen/targets/swift/emit-scope-swift.test.ts +12 -9
- package/src/codegen/targets/swift/integration.test.ts +17 -0
- package/src/create-http-stream.test.ts +97 -0
- package/src/create-http-stream.ts +191 -0
- package/src/create-http.test.ts +163 -0
- package/src/create-http.ts +211 -0
- package/src/create-stream.test.ts +565 -0
- package/src/create-stream.ts +228 -0
- package/src/create.test.ts +658 -0
- package/src/create.ts +172 -0
- package/src/exports.ts +2 -0
- package/src/implementations/http/README.md +135 -95
- package/src/implementations/http/astro/README.md +4 -5
- package/src/implementations/http/astro/index.test.ts +25 -18
- package/src/implementations/http/doc-registry.test.ts +42 -5
- package/src/implementations/http/doc-registry.ts +1 -1
- package/src/implementations/http/error-dispatch.test.ts +283 -0
- package/src/implementations/http/error-dispatch.ts +176 -0
- package/src/implementations/http/error-taxonomy.ts +5 -5
- package/src/implementations/http/hono/docs/http-doc.ts +43 -0
- package/src/implementations/http/hono/docs/http-stream-doc.ts +44 -0
- package/src/implementations/http/hono/docs/rpc-doc.ts +34 -0
- package/src/implementations/http/hono/docs/stream-doc.ts +53 -0
- package/src/implementations/http/hono/handlers/http-stream.test.ts +150 -0
- package/src/implementations/http/hono/handlers/http-stream.ts +152 -0
- package/src/implementations/http/hono/handlers/http.test.ts +130 -0
- package/src/implementations/http/hono/handlers/http.ts +147 -0
- package/src/implementations/http/hono/handlers/rpc.test.ts +81 -0
- package/src/implementations/http/hono/handlers/rpc.ts +54 -0
- package/src/implementations/http/hono/handlers/stream.test.ts +198 -0
- package/src/implementations/http/hono/handlers/stream.ts +208 -0
- package/src/implementations/http/hono/index.test.ts +329 -0
- package/src/implementations/http/hono/index.ts +204 -0
- package/src/implementations/http/hono/path.test.ts +96 -0
- package/src/implementations/http/hono/path.ts +59 -0
- package/src/implementations/http/hono/types.ts +93 -0
- package/src/implementations/http/on-request-error.test.ts +10 -116
- package/src/implementations/http/route-errors.test.ts +11 -77
- package/src/implementations/types.ts +44 -9
- package/src/index.test.ts +22 -1249
- package/src/index.ts +49 -485
- package/src/migration.test.ts +48 -0
- package/src/schema/compute-schema.ts +26 -12
- package/src/schema/parser.ts +62 -12
- package/src/stack-utils.ts +8 -0
- package/src/types.ts +133 -0
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/express-rpc.md +0 -137
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-api.md +0 -173
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-rpc.md +0 -142
- package/agent_config/claude-code/skills/ts-procedures-scaffold/templates/hono-stream.md +0 -147
- package/build/implementations/http/express-rpc/error-taxonomy.test.js +0 -83
- package/build/implementations/http/express-rpc/error-taxonomy.test.js.map +0 -1
- package/build/implementations/http/express-rpc/index.d.ts +0 -125
- package/build/implementations/http/express-rpc/index.js +0 -216
- package/build/implementations/http/express-rpc/index.js.map +0 -1
- package/build/implementations/http/express-rpc/index.test.js +0 -684
- package/build/implementations/http/express-rpc/index.test.js.map +0 -1
- package/build/implementations/http/express-rpc/types.d.ts +0 -11
- package/build/implementations/http/express-rpc/types.js.map +0 -1
- package/build/implementations/http/hono-api/error-taxonomy.test.js +0 -137
- package/build/implementations/http/hono-api/error-taxonomy.test.js.map +0 -1
- package/build/implementations/http/hono-api/index.d.ts +0 -151
- package/build/implementations/http/hono-api/index.js +0 -344
- package/build/implementations/http/hono-api/index.js.map +0 -1
- package/build/implementations/http/hono-api/index.test.js +0 -992
- package/build/implementations/http/hono-api/index.test.js.map +0 -1
- package/build/implementations/http/hono-api/types.d.ts +0 -13
- package/build/implementations/http/hono-api/types.js.map +0 -1
- package/build/implementations/http/hono-rpc/error-taxonomy.test.js +0 -64
- package/build/implementations/http/hono-rpc/error-taxonomy.test.js.map +0 -1
- package/build/implementations/http/hono-rpc/index.d.ts +0 -130
- package/build/implementations/http/hono-rpc/index.js +0 -209
- package/build/implementations/http/hono-rpc/index.js.map +0 -1
- package/build/implementations/http/hono-rpc/index.test.js +0 -828
- package/build/implementations/http/hono-rpc/index.test.js.map +0 -1
- package/build/implementations/http/hono-rpc/types.d.ts +0 -11
- package/build/implementations/http/hono-rpc/types.js +0 -2
- package/build/implementations/http/hono-rpc/types.js.map +0 -1
- package/build/implementations/http/hono-stream/error-taxonomy.test.js +0 -159
- package/build/implementations/http/hono-stream/error-taxonomy.test.js.map +0 -1
- package/build/implementations/http/hono-stream/index.d.ts +0 -171
- package/build/implementations/http/hono-stream/index.js +0 -415
- package/build/implementations/http/hono-stream/index.js.map +0 -1
- package/build/implementations/http/hono-stream/index.test.js +0 -1383
- package/build/implementations/http/hono-stream/index.test.js.map +0 -1
- package/build/implementations/http/hono-stream/types.d.ts +0 -15
- package/build/implementations/http/hono-stream/types.js +0 -2
- package/build/implementations/http/hono-stream/types.js.map +0 -1
- package/src/implementations/http/express-rpc/README.md +0 -280
- package/src/implementations/http/express-rpc/error-taxonomy.test.ts +0 -103
- package/src/implementations/http/express-rpc/index.test.ts +0 -957
- package/src/implementations/http/express-rpc/index.ts +0 -327
- package/src/implementations/http/express-rpc/types.ts +0 -16
- package/src/implementations/http/hono-api/README.md +0 -284
- package/src/implementations/http/hono-api/error-taxonomy.test.ts +0 -179
- package/src/implementations/http/hono-api/index.test.ts +0 -1341
- package/src/implementations/http/hono-api/index.ts +0 -519
- package/src/implementations/http/hono-api/types.ts +0 -16
- package/src/implementations/http/hono-rpc/README.md +0 -357
- package/src/implementations/http/hono-rpc/error-taxonomy.test.ts +0 -82
- package/src/implementations/http/hono-rpc/index.test.ts +0 -1107
- package/src/implementations/http/hono-rpc/index.ts +0 -320
- package/src/implementations/http/hono-rpc/types.ts +0 -16
- package/src/implementations/http/hono-stream/README.md +0 -559
- package/src/implementations/http/hono-stream/error-taxonomy.test.ts +0 -178
- package/src/implementations/http/hono-stream/index.test.ts +0 -1804
- package/src/implementations/http/hono-stream/index.ts +0 -622
- package/src/implementations/http/hono-stream/types.ts +0 -20
- /package/build/{implementations/http/express-rpc/error-taxonomy.test.d.ts → create-http-stream.test.d.ts} +0 -0
- /package/build/{implementations/http/express-rpc/index.test.d.ts → create-http.test.d.ts} +0 -0
- /package/build/{implementations/http/hono-api/error-taxonomy.test.d.ts → create-stream.test.d.ts} +0 -0
- /package/build/{implementations/http/hono-api/index.test.d.ts → create.test.d.ts} +0 -0
- /package/build/implementations/http/{hono-rpc/error-taxonomy.test.d.ts → error-dispatch.test.d.ts} +0 -0
- /package/build/implementations/http/{hono-rpc/index.test.d.ts → hono/handlers/http-stream.test.d.ts} +0 -0
- /package/build/implementations/http/{hono-stream/error-taxonomy.test.d.ts → hono/handlers/http.test.d.ts} +0 -0
- /package/build/implementations/http/{hono-stream/index.test.d.ts → hono/handlers/rpc.test.d.ts} +0 -0
- /package/build/implementations/http/{express-rpc → hono}/types.js +0 -0
- /package/build/{implementations/http/hono-api/types.js → types.js} +0 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import { describe, expect, test } from 'vitest';
|
|
3
|
+
import { Procedures } from './index.js';
|
|
4
|
+
import { v } from 'suretype';
|
|
5
|
+
import { Type } from 'typebox';
|
|
6
|
+
import { ProcedureError, ProcedureValidationError } from './errors.js';
|
|
7
|
+
describe('Streaming Procedures - CreateStream', () => {
|
|
8
|
+
test('CreateStream creates a streaming procedure', async () => {
|
|
9
|
+
const { CreateStream } = Procedures();
|
|
10
|
+
const { StreamTest, procedure, info } = CreateStream('StreamTest', {
|
|
11
|
+
description: 'Test streaming procedure',
|
|
12
|
+
schema: {
|
|
13
|
+
params: v.object({ count: v.number().required() }),
|
|
14
|
+
yieldType: v.object({ value: v.number().required() }),
|
|
15
|
+
},
|
|
16
|
+
}, async function* (ctx, params) {
|
|
17
|
+
for (let i = 0; i < params.count; i++) {
|
|
18
|
+
yield { value: i };
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
expect(StreamTest).toBeDefined();
|
|
22
|
+
expect(procedure).toBeDefined();
|
|
23
|
+
expect(info.isStream).toBe(true);
|
|
24
|
+
expect(info.name).toBe('StreamTest');
|
|
25
|
+
expect(info.description).toBe('Test streaming procedure');
|
|
26
|
+
expect(info.schema.params).toEqual({
|
|
27
|
+
type: 'object',
|
|
28
|
+
properties: { count: { type: 'number' } },
|
|
29
|
+
required: ['count'],
|
|
30
|
+
});
|
|
31
|
+
expect(info.schema.yieldType).toEqual({
|
|
32
|
+
type: 'object',
|
|
33
|
+
properties: { value: { type: 'number' } },
|
|
34
|
+
required: ['value'],
|
|
35
|
+
});
|
|
36
|
+
// Collect yielded values
|
|
37
|
+
const values = [];
|
|
38
|
+
for await (const val of StreamTest({}, { count: 3 })) {
|
|
39
|
+
values.push(val);
|
|
40
|
+
}
|
|
41
|
+
expect(values).toEqual([{ value: 0 }, { value: 1 }, { value: 2 }]);
|
|
42
|
+
});
|
|
43
|
+
test('CreateStream validates params', async () => {
|
|
44
|
+
const { CreateStream } = Procedures();
|
|
45
|
+
const { StreamWithParams } = CreateStream('StreamWithParams', {
|
|
46
|
+
schema: {
|
|
47
|
+
params: v.object({ name: v.string().required() }),
|
|
48
|
+
yieldType: v.string(),
|
|
49
|
+
},
|
|
50
|
+
}, async function* (ctx, params) {
|
|
51
|
+
yield params.name;
|
|
52
|
+
});
|
|
53
|
+
// Missing required param should throw ProcedureValidationError
|
|
54
|
+
try {
|
|
55
|
+
// @ts-expect-error - intentionally passing invalid params
|
|
56
|
+
for await (const _val of StreamWithParams({}, {})) {
|
|
57
|
+
// Should not reach here
|
|
58
|
+
}
|
|
59
|
+
expect.fail('Should have thrown');
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
expect(e).toBeInstanceOf(ProcedureValidationError);
|
|
63
|
+
expect(e.message).toContain('Validation error for StreamWithParams');
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
test('CreateStream with validateYields validates each yielded value', async () => {
|
|
67
|
+
const { CreateStream } = Procedures();
|
|
68
|
+
const { ProcedureYieldValidationError } = await import('./errors.js');
|
|
69
|
+
const { StreamValidateYields } = CreateStream('StreamValidateYields', {
|
|
70
|
+
schema: {
|
|
71
|
+
yieldType: v.object({ id: v.number().required() }),
|
|
72
|
+
},
|
|
73
|
+
validateYields: true,
|
|
74
|
+
}, async function* () {
|
|
75
|
+
yield { id: 1 }; // Valid
|
|
76
|
+
yield { id: 'not-a-number' }; // Invalid - should throw
|
|
77
|
+
});
|
|
78
|
+
const values = [];
|
|
79
|
+
try {
|
|
80
|
+
for await (const val of StreamValidateYields({}, {})) {
|
|
81
|
+
values.push(val);
|
|
82
|
+
}
|
|
83
|
+
expect.fail('Should have thrown on invalid yield');
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
expect(e).toBeInstanceOf(ProcedureYieldValidationError);
|
|
87
|
+
expect(e.message).toContain('Yield validation error for StreamValidateYields');
|
|
88
|
+
expect(values).toEqual([{ id: 1 }]); // First value was valid
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
test('CreateStream without validateYields does not validate yields', async () => {
|
|
92
|
+
const { CreateStream } = Procedures();
|
|
93
|
+
const { StreamNoValidate } = CreateStream('StreamNoValidate', {
|
|
94
|
+
schema: {
|
|
95
|
+
yieldType: v.object({ id: v.number().required() }),
|
|
96
|
+
},
|
|
97
|
+
// validateYields defaults to false
|
|
98
|
+
}, async function* () {
|
|
99
|
+
yield { id: 1 };
|
|
100
|
+
yield { id: 'not-a-number' }; // Invalid but won't throw
|
|
101
|
+
});
|
|
102
|
+
const values = [];
|
|
103
|
+
for await (const val of StreamNoValidate({}, {})) {
|
|
104
|
+
values.push(val);
|
|
105
|
+
}
|
|
106
|
+
expect(values).toEqual([{ id: 1 }, { id: 'not-a-number' }]);
|
|
107
|
+
});
|
|
108
|
+
test('CreateStream ctx.error throws ProcedureError', async () => {
|
|
109
|
+
const { CreateStream } = Procedures();
|
|
110
|
+
const { StreamError } = CreateStream('StreamError', {}, async function* (ctx) {
|
|
111
|
+
yield 'first';
|
|
112
|
+
throw ctx.error('Custom stream error', { code: 'STREAM_ERR' });
|
|
113
|
+
});
|
|
114
|
+
const values = [];
|
|
115
|
+
try {
|
|
116
|
+
for await (const val of StreamError({}, {})) {
|
|
117
|
+
values.push(val);
|
|
118
|
+
}
|
|
119
|
+
expect.fail('Should have thrown');
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
expect(e).toBeInstanceOf(ProcedureError);
|
|
123
|
+
expect(e.message).toBe('Custom stream error');
|
|
124
|
+
expect(e.procedureName).toBe('StreamError');
|
|
125
|
+
expect(e.meta).toEqual({ code: 'STREAM_ERR' });
|
|
126
|
+
expect(values).toEqual(['first']);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
test('CreateStream provides ctx.signal for abort handling', async () => {
|
|
130
|
+
const { CreateStream } = Procedures();
|
|
131
|
+
let signalReceived = false;
|
|
132
|
+
const { StreamWithSignal } = CreateStream('StreamWithSignal', {}, async function* (ctx) {
|
|
133
|
+
expect(ctx.signal).toBeDefined();
|
|
134
|
+
expect(ctx.signal).toBeInstanceOf(AbortSignal);
|
|
135
|
+
signalReceived = true;
|
|
136
|
+
yield 'value';
|
|
137
|
+
});
|
|
138
|
+
for await (const _val of StreamWithSignal({}, {})) {
|
|
139
|
+
// consume
|
|
140
|
+
}
|
|
141
|
+
expect(signalReceived).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
test('CreateStream onCreate callback receives isStream flag', () => new Promise((done) => {
|
|
144
|
+
let receivedProc;
|
|
145
|
+
const { CreateStream } = Procedures({
|
|
146
|
+
onCreate: (proc) => {
|
|
147
|
+
receivedProc = proc;
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
CreateStream('OnCreateStream', {}, async function* () {
|
|
151
|
+
yield 'test';
|
|
152
|
+
});
|
|
153
|
+
expect(receivedProc).toBeDefined();
|
|
154
|
+
expect(receivedProc.isStream).toBe(true);
|
|
155
|
+
expect(receivedProc.name).toBe('OnCreateStream');
|
|
156
|
+
done();
|
|
157
|
+
}));
|
|
158
|
+
test('CreateStream duplicate registration throws', () => {
|
|
159
|
+
const { CreateStream } = Procedures();
|
|
160
|
+
CreateStream('DuplicateStream', {}, async function* () {
|
|
161
|
+
yield 'first';
|
|
162
|
+
});
|
|
163
|
+
expect(() => {
|
|
164
|
+
CreateStream('DuplicateStream', {}, async function* () {
|
|
165
|
+
yield 'second';
|
|
166
|
+
});
|
|
167
|
+
}).toThrow('Procedure with name DuplicateStream is already registered');
|
|
168
|
+
});
|
|
169
|
+
test('CreateStream error includes definition location', async () => {
|
|
170
|
+
const { CreateStream } = Procedures();
|
|
171
|
+
const { StreamErrorLocation } = CreateStream('StreamErrorLocation', {
|
|
172
|
+
schema: {
|
|
173
|
+
params: v.object({ id: v.number().required() }),
|
|
174
|
+
},
|
|
175
|
+
}, async function* () {
|
|
176
|
+
yield 'test';
|
|
177
|
+
});
|
|
178
|
+
try {
|
|
179
|
+
// @ts-expect-error - intentionally passing invalid params
|
|
180
|
+
for await (const _val of StreamErrorLocation({}, {})) {
|
|
181
|
+
// consume
|
|
182
|
+
}
|
|
183
|
+
expect.fail('Should have thrown');
|
|
184
|
+
}
|
|
185
|
+
catch (e) {
|
|
186
|
+
expect(e.definedAt).toBeDefined();
|
|
187
|
+
expect(e.definedAt.file).toContain('create-stream.test.ts');
|
|
188
|
+
expect(e.stack).toContain('--- Procedure "StreamErrorLocation" defined at ---');
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
test('CreateStream with Typebox schema', async () => {
|
|
192
|
+
const { CreateStream } = Procedures();
|
|
193
|
+
const { TypeboxStream } = CreateStream('TypeboxStream', {
|
|
194
|
+
schema: {
|
|
195
|
+
params: Type.Object({ limit: Type.Number() }),
|
|
196
|
+
yieldType: Type.Object({ data: Type.String() }),
|
|
197
|
+
},
|
|
198
|
+
}, async function* (ctx, params) {
|
|
199
|
+
for (let i = 0; i < params.limit; i++) {
|
|
200
|
+
yield { data: `item-${i}` };
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
const values = [];
|
|
204
|
+
for await (const val of TypeboxStream({}, { limit: 2 })) {
|
|
205
|
+
values.push(val);
|
|
206
|
+
}
|
|
207
|
+
expect(values).toEqual([{ data: 'item-0' }, { data: 'item-1' }]);
|
|
208
|
+
});
|
|
209
|
+
test('CreateStream with context type', async () => {
|
|
210
|
+
const { CreateStream } = Procedures();
|
|
211
|
+
const { ContextStream } = CreateStream('ContextStream', {}, async function* (ctx) {
|
|
212
|
+
// ctx should have both userId and error
|
|
213
|
+
expect(ctx.userId).toBe('user-123');
|
|
214
|
+
expect(ctx.error).toBeDefined();
|
|
215
|
+
expect(ctx.signal).toBeDefined();
|
|
216
|
+
yield ctx.userId;
|
|
217
|
+
});
|
|
218
|
+
const values = [];
|
|
219
|
+
for await (const val of ContextStream({ userId: 'user-123' }, {})) {
|
|
220
|
+
values.push(val);
|
|
221
|
+
}
|
|
222
|
+
expect(values).toEqual(['user-123']);
|
|
223
|
+
});
|
|
224
|
+
test('CreateStream rethrows the original error preserving class identity', async () => {
|
|
225
|
+
// The streaming wrapper must NOT box user errors inside ProcedureError —
|
|
226
|
+
// doing so would defeat route-declared typed-error dispatch on the client
|
|
227
|
+
// (the HTTP builder's taxonomy would see `ProcedureError` instead of the
|
|
228
|
+
// user's class). Stack annotation is added in place; class identity and
|
|
229
|
+
// custom properties are preserved.
|
|
230
|
+
class MyDomainError extends Error {
|
|
231
|
+
name = 'MyDomainError';
|
|
232
|
+
code = 'STREAM_FAIL';
|
|
233
|
+
}
|
|
234
|
+
const { CreateStream } = Procedures();
|
|
235
|
+
const originalError = new MyDomainError('Stream underlying error');
|
|
236
|
+
const { StreamCause } = CreateStream('StreamCause', {},
|
|
237
|
+
// eslint-disable-next-line require-yield
|
|
238
|
+
async function* () {
|
|
239
|
+
throw originalError;
|
|
240
|
+
});
|
|
241
|
+
try {
|
|
242
|
+
for await (const _val of StreamCause({}, {})) {
|
|
243
|
+
// consume
|
|
244
|
+
}
|
|
245
|
+
expect.fail('Should have thrown');
|
|
246
|
+
}
|
|
247
|
+
catch (e) {
|
|
248
|
+
expect(e).toBe(originalError);
|
|
249
|
+
expect(e).toBeInstanceOf(MyDomainError);
|
|
250
|
+
expect(e.code).toBe('STREAM_FAIL');
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
test('CreateStream propagates .return() to the user generator', async () => {
|
|
254
|
+
// Consumers that close a stream early (via `iterator.return()` or breaking
|
|
255
|
+
// out of for-await) must trigger the user generator's `finally` block so
|
|
256
|
+
// cleanup (db handles, subscriptions, signal-driven teardown) runs.
|
|
257
|
+
const { CreateStream } = Procedures();
|
|
258
|
+
let finallyRan = false;
|
|
259
|
+
const { EarlyClose } = CreateStream('EarlyClose', {}, async function* () {
|
|
260
|
+
try {
|
|
261
|
+
yield 1;
|
|
262
|
+
yield 2;
|
|
263
|
+
yield 3;
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
finallyRan = true;
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
const iter = EarlyClose({}, {});
|
|
270
|
+
const first = await iter.next();
|
|
271
|
+
expect(first.value).toBe(1);
|
|
272
|
+
await iter.return(undefined);
|
|
273
|
+
expect(finallyRan).toBe(true);
|
|
274
|
+
});
|
|
275
|
+
test('CreateStream with extended config', () => {
|
|
276
|
+
const { CreateStream } = Procedures();
|
|
277
|
+
const { info } = CreateStream('ExtendedStream', {
|
|
278
|
+
scope: 'api',
|
|
279
|
+
version: 1,
|
|
280
|
+
description: 'Extended config stream',
|
|
281
|
+
}, async function* () {
|
|
282
|
+
yield 'data';
|
|
283
|
+
});
|
|
284
|
+
expect(info.scope).toBe('api');
|
|
285
|
+
expect(info.version).toBe(1);
|
|
286
|
+
expect(info.description).toBe('Extended config stream');
|
|
287
|
+
expect(info.isStream).toBe(true);
|
|
288
|
+
});
|
|
289
|
+
test('CreateStream signal.aborted becomes true after generator completes', async () => {
|
|
290
|
+
const { CreateStream } = Procedures();
|
|
291
|
+
let capturedSignal = null;
|
|
292
|
+
const { AbortStream } = CreateStream('AbortStream', {}, async function* (ctx) {
|
|
293
|
+
capturedSignal = ctx.signal;
|
|
294
|
+
yield 'value';
|
|
295
|
+
});
|
|
296
|
+
// Consume the generator
|
|
297
|
+
for await (const _val of AbortStream({}, {})) {
|
|
298
|
+
// consume
|
|
299
|
+
}
|
|
300
|
+
// After generator completes, signal should be aborted
|
|
301
|
+
expect(capturedSignal).not.toBeNull();
|
|
302
|
+
expect(capturedSignal.aborted).toBe(true);
|
|
303
|
+
});
|
|
304
|
+
test('CreateStream signal.reason is stream-completed after normal completion', async () => {
|
|
305
|
+
const { CreateStream } = Procedures();
|
|
306
|
+
let capturedSignal = null;
|
|
307
|
+
const { ReasonStream } = CreateStream('ReasonStream', {}, async function* (ctx) {
|
|
308
|
+
capturedSignal = ctx.signal;
|
|
309
|
+
yield 'value';
|
|
310
|
+
});
|
|
311
|
+
for await (const _val of ReasonStream({}, {})) {
|
|
312
|
+
// consume
|
|
313
|
+
}
|
|
314
|
+
expect(capturedSignal.reason).toBe('stream-completed');
|
|
315
|
+
});
|
|
316
|
+
test('CreateStream combines external signal with internal signal', async () => {
|
|
317
|
+
const { CreateStream } = Procedures();
|
|
318
|
+
const externalAc = new AbortController();
|
|
319
|
+
let capturedSignal = null;
|
|
320
|
+
const { CombinedStream } = CreateStream('CombinedStream', {}, async function* (ctx) {
|
|
321
|
+
capturedSignal = ctx.signal;
|
|
322
|
+
// Combined signal is a new object, not the raw external signal
|
|
323
|
+
expect(ctx.signal).not.toBe(externalAc.signal);
|
|
324
|
+
yield 'value';
|
|
325
|
+
});
|
|
326
|
+
// Abort external before consuming — combined signal should reflect it
|
|
327
|
+
externalAc.abort('client-disconnected');
|
|
328
|
+
for await (const _val of CombinedStream({ signal: externalAc.signal }, {})) {
|
|
329
|
+
// consume
|
|
330
|
+
}
|
|
331
|
+
expect(capturedSignal.aborted).toBe(true);
|
|
332
|
+
// Reason comes from external abort, not internal 'stream-completed'
|
|
333
|
+
expect(capturedSignal.reason).toBe('client-disconnected');
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
describe('isPrevalidated context property', () => {
|
|
337
|
+
test('CreateStream skips validation when ctx.isPrevalidated is true', async () => {
|
|
338
|
+
const { CreateStream } = Procedures();
|
|
339
|
+
const { StreamSkipValidation } = CreateStream('StreamSkipValidation', {
|
|
340
|
+
schema: {
|
|
341
|
+
params: v.object({ count: v.number().required() }),
|
|
342
|
+
},
|
|
343
|
+
}, async function* (ctx, params) {
|
|
344
|
+
yield { received: params };
|
|
345
|
+
});
|
|
346
|
+
// With isPrevalidated: true, validation is skipped even with invalid params
|
|
347
|
+
const values = [];
|
|
348
|
+
for await (const val of StreamSkipValidation({ isPrevalidated: true }, {})) {
|
|
349
|
+
values.push(val);
|
|
350
|
+
}
|
|
351
|
+
expect(values).toEqual([{ received: {} }]);
|
|
352
|
+
});
|
|
353
|
+
test('CreateStream validates when ctx.isPrevalidated is false', async () => {
|
|
354
|
+
const { CreateStream } = Procedures();
|
|
355
|
+
const { StreamValidate } = CreateStream('StreamValidate', {
|
|
356
|
+
schema: {
|
|
357
|
+
params: v.object({ count: v.number().required() }),
|
|
358
|
+
},
|
|
359
|
+
}, async function* (ctx, params) {
|
|
360
|
+
yield { received: params };
|
|
361
|
+
});
|
|
362
|
+
// With isPrevalidated: false, validation should run
|
|
363
|
+
try {
|
|
364
|
+
for await (const _val of StreamValidate({ isPrevalidated: false }, {})) {
|
|
365
|
+
// consume
|
|
366
|
+
}
|
|
367
|
+
expect.fail('Should have thrown validation error');
|
|
368
|
+
}
|
|
369
|
+
catch (e) {
|
|
370
|
+
expect(e).toBeInstanceOf(ProcedureValidationError);
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
test('CreateStream validates when ctx.isPrevalidated is undefined', async () => {
|
|
374
|
+
const { CreateStream } = Procedures();
|
|
375
|
+
const { StreamValidateUndefined } = CreateStream('StreamValidateUndefined', {
|
|
376
|
+
schema: {
|
|
377
|
+
params: v.object({ value: v.string().required() }),
|
|
378
|
+
},
|
|
379
|
+
}, async function* (ctx, params) {
|
|
380
|
+
yield params;
|
|
381
|
+
});
|
|
382
|
+
// Without isPrevalidated property, validation should run
|
|
383
|
+
try {
|
|
384
|
+
for await (const _val of StreamValidateUndefined({}, {})) {
|
|
385
|
+
// consume
|
|
386
|
+
}
|
|
387
|
+
expect.fail('Should have thrown validation error');
|
|
388
|
+
}
|
|
389
|
+
catch (e) {
|
|
390
|
+
expect(e).toBeInstanceOf(ProcedureValidationError);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
describe('builder.config.noRuntimeValidation', () => {
|
|
395
|
+
test('CreateStream skips params validation when noRuntimeValidation is true', async () => {
|
|
396
|
+
const { CreateStream } = Procedures({ config: { noRuntimeValidation: true } });
|
|
397
|
+
const { StreamSkipParams } = CreateStream('StreamSkipParams', {
|
|
398
|
+
schema: {
|
|
399
|
+
params: Type.Object({ count: Type.Number() }),
|
|
400
|
+
},
|
|
401
|
+
}, async function* (_ctx, params) {
|
|
402
|
+
yield { received: params };
|
|
403
|
+
});
|
|
404
|
+
const values = [];
|
|
405
|
+
for await (const val of StreamSkipParams({}, {})) {
|
|
406
|
+
values.push(val);
|
|
407
|
+
}
|
|
408
|
+
expect(values).toEqual([{ received: {} }]);
|
|
409
|
+
});
|
|
410
|
+
// migrated to schema.req in Phase 3+ (CreateHttpStream)
|
|
411
|
+
test.todo('CreateStream skips input channel validation when noRuntimeValidation is true');
|
|
412
|
+
test('CreateStream still validates when noRuntimeValidation is omitted', async () => {
|
|
413
|
+
const { CreateStream } = Procedures({ config: {} });
|
|
414
|
+
const { StreamValidateDefault } = CreateStream('StreamValidateDefault', {
|
|
415
|
+
schema: {
|
|
416
|
+
params: Type.Object({ count: Type.Number() }),
|
|
417
|
+
},
|
|
418
|
+
}, async function* (_ctx, params) {
|
|
419
|
+
yield params;
|
|
420
|
+
});
|
|
421
|
+
await expect(async () => {
|
|
422
|
+
for await (const _v of StreamValidateDefault({}, {})) {
|
|
423
|
+
// consume
|
|
424
|
+
}
|
|
425
|
+
}).rejects.toBeInstanceOf(ProcedureValidationError);
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
//# sourceMappingURL=create-stream.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-stream.test.js","sourceRoot":"","sources":["../src/create-stream.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Prettify, TSchemaLib } from './schema/types.js';
|
|
2
|
+
import { TBuilderConfig, THttpProcedureRegistration, THttpStreamProcedureRegistration, TLocalContext, TProcedureRegistration, TStreamProcedureRegistration } from './types.js';
|
|
3
|
+
export type CreateBuilderArg<TContext, TExtendedConfig> = {
|
|
4
|
+
config?: TBuilderConfig;
|
|
5
|
+
onCreate?: (procedure: TProcedureRegistration<TContext, TExtendedConfig> | TStreamProcedureRegistration<TContext, TExtendedConfig>) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function makeCreate<TContext, TExtendedConfig>(procedures: Map<string, TProcedureRegistration<TContext, TExtendedConfig> | TStreamProcedureRegistration<TContext, TExtendedConfig> | THttpProcedureRegistration<TContext> | THttpStreamProcedureRegistration<TContext>>, builder?: CreateBuilderArg<TContext, TExtendedConfig>): <TName extends string, TParams, TReturnType>(name: TName, config: {
|
|
8
|
+
description?: string;
|
|
9
|
+
schema?: {
|
|
10
|
+
params?: TParams;
|
|
11
|
+
returnType?: TReturnType;
|
|
12
|
+
};
|
|
13
|
+
} & TExtendedConfig, handler: (ctx: Prettify<TContext & TLocalContext>, params: TSchemaLib<TParams>) => Promise<TSchemaLib<TReturnType>>) => { [K in TName]: (ctx: Prettify<TContext>, params: TSchemaLib<TParams>) => Promise<TSchemaLib<TReturnType>>; } & {
|
|
14
|
+
procedure: (ctx: Prettify<TContext>, params: TSchemaLib<TParams>) => Promise<TSchemaLib<TReturnType>>;
|
|
15
|
+
info: {
|
|
16
|
+
name: TName;
|
|
17
|
+
description?: string;
|
|
18
|
+
schema: {
|
|
19
|
+
params?: TParams;
|
|
20
|
+
returnType?: TReturnType;
|
|
21
|
+
};
|
|
22
|
+
validation?: {
|
|
23
|
+
params?: (params: any) => {
|
|
24
|
+
errors?: any[];
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
} & TExtendedConfig;
|
|
28
|
+
};
|
package/build/create.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ProcedureError, ProcedureRegistrationError, ProcedureValidationError } from './errors.js';
|
|
2
|
+
import { computeSchema } from './schema/compute-schema.js';
|
|
3
|
+
import { captureDefinitionInfo } from './stack-utils.js';
|
|
4
|
+
export function makeCreate(procedures, builder) {
|
|
5
|
+
return function Create(name, config, handler) {
|
|
6
|
+
// Capture definition location as first action
|
|
7
|
+
const definitionInfo = captureDefinitionInfo();
|
|
8
|
+
const HTTP_FIELDS = ['path', 'method', 'req', 'res', 'successStatus'];
|
|
9
|
+
const presentHttpFields = HTTP_FIELDS.filter((f) => config[f] !== undefined);
|
|
10
|
+
if (presentHttpFields.length > 0) {
|
|
11
|
+
throw new ProcedureRegistrationError(name, `HTTP fields require CreateHttp / CreateHttpStream. Procedure "${name}" has [${presentHttpFields.join(', ')}] which are not valid on Create.`, definitionInfo);
|
|
12
|
+
}
|
|
13
|
+
// BEFORE computeSchema - fail fast on duplicate
|
|
14
|
+
if (procedures.has(name)) {
|
|
15
|
+
throw new Error(`Procedure with name ${name} is already registered`);
|
|
16
|
+
}
|
|
17
|
+
const { jsonSchema, validations } = computeSchema(name, config.schema, definitionInfo);
|
|
18
|
+
// Create error factory once at registration time (outside handler)
|
|
19
|
+
const errorFactory = (message, meta) => new ProcedureError(name, message, meta, definitionInfo);
|
|
20
|
+
const registeredProcedure = {
|
|
21
|
+
name,
|
|
22
|
+
kind: 'rpc',
|
|
23
|
+
config: {
|
|
24
|
+
...config,
|
|
25
|
+
description: config.description,
|
|
26
|
+
schema: jsonSchema,
|
|
27
|
+
validation: {
|
|
28
|
+
params: validations.params,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
handler: async (ctx, params) => {
|
|
32
|
+
try {
|
|
33
|
+
// Skip validation if caller has already validated or if builder config dictates noRuntimeValidation
|
|
34
|
+
const skipValidation = ctx.isPrevalidated ||
|
|
35
|
+
builder?.config?.noRuntimeValidation;
|
|
36
|
+
if (validations?.params && !skipValidation) {
|
|
37
|
+
const { errors } = validations.params(params);
|
|
38
|
+
if (errors) {
|
|
39
|
+
throw new ProcedureValidationError(name, `Validation error for ${name}`, errors, definitionInfo);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const localCtx = {
|
|
43
|
+
error: errorFactory,
|
|
44
|
+
};
|
|
45
|
+
// params is correctly typed at the public API boundary;
|
|
46
|
+
// cast here because TS cannot narrow generics inside implementations
|
|
47
|
+
return await handler({ ...ctx, ...localCtx }, params);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error instanceof ProcedureError)
|
|
51
|
+
throw error;
|
|
52
|
+
const err = new ProcedureError(name, `Error in handler for ${name} - ${error?.message}`, undefined, definitionInfo);
|
|
53
|
+
err.cause = error;
|
|
54
|
+
// Preserve original stack but append definition info
|
|
55
|
+
if (error.stack && definitionInfo.definedAt) {
|
|
56
|
+
const { file, line, column } = definitionInfo.definedAt;
|
|
57
|
+
err.stack =
|
|
58
|
+
error.stack +
|
|
59
|
+
`\n--- Procedure "${name}" defined at ---\n at ${file}:${line}:${column}`;
|
|
60
|
+
}
|
|
61
|
+
else if (error.stack) {
|
|
62
|
+
err.stack = error.stack;
|
|
63
|
+
}
|
|
64
|
+
throw err;
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
procedures.set(name, registeredProcedure);
|
|
69
|
+
builder?.onCreate?.(registeredProcedure);
|
|
70
|
+
const info = {
|
|
71
|
+
name,
|
|
72
|
+
...registeredProcedure.config,
|
|
73
|
+
};
|
|
74
|
+
// return so can be called directly (ie: int/unit tests)
|
|
75
|
+
return {
|
|
76
|
+
[name]: registeredProcedure.handler,
|
|
77
|
+
procedure: registeredProcedure.handler,
|
|
78
|
+
info,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|