ts-procedures 8.6.0 → 9.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 +166 -101
- package/agent_config/claude-code/.claude-plugin/plugin.json +1 -1
- package/agent_config/claude-code/agents/ts-procedures-architect.md +11 -10
- package/agent_config/claude-code/skills/ts-procedures/SKILL.md +25 -12
- package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +10 -12
- package/agent_config/claude-code/skills/ts-procedures/api-reference.md +141 -45
- package/agent_config/claude-code/skills/ts-procedures/checklist.md +7 -6
- package/agent_config/claude-code/skills/ts-procedures/patterns.md +45 -6
- package/agent_config/claude-code/skills/ts-procedures/templates/client.md +1 -1
- package/agent_config/claude-code/skills/ts-procedures/templates/hono.md +1 -1
- package/agent_config/copilot/copilot-instructions.md +50 -33
- package/agent_config/cursor/cursorrules +50 -33
- package/build/adapters/astro/astro-context.js.map +1 -0
- package/build/adapters/astro/create-handler.js.map +1 -0
- package/build/adapters/astro/index.js.map +1 -0
- package/build/{implementations/http → adapters}/astro/index.test.js +1 -1
- package/build/adapters/astro/index.test.js.map +1 -0
- package/build/adapters/astro/rewrite-request.js.map +1 -0
- package/build/adapters/hono/envelope-parity.test.js +98 -0
- package/build/adapters/hono/envelope-parity.test.js.map +1 -0
- package/build/{implementations/http → adapters}/hono/handlers/http-stream.d.ts +1 -1
- package/build/adapters/hono/handlers/http-stream.js +55 -0
- package/build/adapters/hono/handlers/http-stream.js.map +1 -0
- package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.js +1 -1
- package/build/adapters/hono/handlers/http-stream.test.js.map +1 -0
- package/build/{implementations/http → adapters}/hono/handlers/http.d.ts +1 -1
- package/build/adapters/hono/handlers/http.js +50 -0
- package/build/adapters/hono/handlers/http.js.map +1 -0
- package/build/{implementations/http → adapters}/hono/handlers/http.test.js +1 -1
- package/build/adapters/hono/handlers/http.test.js.map +1 -0
- package/build/{implementations/http → adapters}/hono/handlers/rpc.d.ts +2 -2
- package/build/adapters/hono/handlers/rpc.js +23 -0
- package/build/adapters/hono/handlers/rpc.js.map +1 -0
- package/build/{implementations/http → adapters}/hono/handlers/rpc.test.js +1 -1
- package/build/adapters/hono/handlers/rpc.test.js.map +1 -0
- package/build/adapters/hono/handlers/stream.d.ts +12 -0
- package/build/adapters/hono/handlers/stream.js +89 -0
- package/build/adapters/hono/handlers/stream.js.map +1 -0
- package/build/{implementations/http → adapters}/hono/handlers/stream.test.js +3 -2
- package/build/adapters/hono/handlers/stream.test.js.map +1 -0
- package/build/{implementations/http → adapters}/hono/index.d.ts +24 -12
- package/build/{implementations/http → adapters}/hono/index.js +19 -8
- package/build/adapters/hono/index.js.map +1 -0
- package/build/{implementations/http → adapters}/hono/index.test.js +2 -4
- package/build/adapters/hono/index.test.js.map +1 -0
- package/build/{implementations/http → adapters/hono}/on-request-error.test.js +2 -2
- package/build/adapters/hono/on-request-error.test.js.map +1 -0
- package/build/adapters/hono/request.d.ts +7 -0
- package/build/adapters/hono/request.js +22 -0
- package/build/adapters/hono/request.js.map +1 -0
- package/build/{implementations/http → adapters/hono}/route-errors.test.js +4 -4
- package/build/adapters/hono/route-errors.test.js.map +1 -0
- package/build/adapters/hono/types.d.ts +55 -0
- package/build/adapters/hono/types.js +19 -0
- package/build/adapters/hono/types.js.map +1 -0
- package/build/client/freeze.test.js +39 -0
- package/build/client/freeze.test.js.map +1 -0
- package/build/client/typed-error-dispatch.test.js +2 -2
- package/build/client/typed-error-dispatch.test.js.map +1 -1
- package/build/codegen/__fixtures__/make-envelope.d.ts +1 -1
- package/build/codegen/bin/cli.d.ts +5 -0
- package/build/codegen/bin/cli.js +139 -182
- package/build/codegen/bin/cli.js.map +1 -1
- package/build/codegen/bin/cli.test.js +12 -2
- package/build/codegen/bin/cli.test.js.map +1 -1
- package/build/codegen/bin/flag-specs.d.ts +9 -0
- package/build/codegen/bin/flag-specs.js +33 -31
- package/build/codegen/bin/flag-specs.js.map +1 -1
- package/build/codegen/bin/flag-specs.test.js +14 -1
- package/build/codegen/bin/flag-specs.test.js.map +1 -1
- package/build/codegen/collect-models.d.ts +1 -1
- package/build/codegen/emit/api-route.d.ts +8 -0
- package/build/codegen/emit/api-route.js +156 -0
- package/build/codegen/emit/api-route.js.map +1 -0
- package/build/codegen/emit/context.d.ts +30 -0
- package/build/codegen/emit/context.js +2 -0
- package/build/codegen/emit/context.js.map +1 -0
- package/build/codegen/emit/declarations.d.ts +24 -0
- package/build/codegen/emit/declarations.js +48 -0
- package/build/codegen/emit/declarations.js.map +1 -0
- package/build/codegen/emit/format-types.d.ts +61 -0
- package/build/codegen/emit/format-types.js +188 -0
- package/build/codegen/emit/format-types.js.map +1 -0
- package/build/codegen/emit/http-stream-route.d.ts +7 -0
- package/build/codegen/emit/http-stream-route.js +138 -0
- package/build/codegen/emit/http-stream-route.js.map +1 -0
- package/build/codegen/emit/route-shared.d.ts +35 -0
- package/build/codegen/emit/route-shared.js +88 -0
- package/build/codegen/emit/route-shared.js.map +1 -0
- package/build/codegen/emit/rpc-route.d.ts +7 -0
- package/build/codegen/emit/rpc-route.js +37 -0
- package/build/codegen/emit/rpc-route.js.map +1 -0
- package/build/codegen/emit/scope-file.d.ts +39 -0
- package/build/codegen/emit/scope-file.js +166 -0
- package/build/codegen/emit/scope-file.js.map +1 -0
- package/build/codegen/emit/stream-route.d.ts +7 -0
- package/build/codegen/emit/stream-route.js +62 -0
- package/build/codegen/emit/stream-route.js.map +1 -0
- package/build/codegen/emit-errors.d.ts +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.d.ts +13 -30
- package/build/codegen/emit-scope.js +15 -844
- package/build/codegen/emit-scope.js.map +1 -1
- package/build/codegen/goldens.test.js +69 -0
- package/build/codegen/goldens.test.js.map +1 -0
- package/build/codegen/group-routes.d.ts +1 -1
- package/build/codegen/pipeline.d.ts +1 -1
- package/build/codegen/resolve-envelope.d.ts +1 -1
- package/build/codegen/targets/_shared/error-schemas.d.ts +1 -1
- package/build/codegen/targets/_shared/route-slots.d.ts +1 -1
- package/build/codegen/targets/_shared/target-run.d.ts +1 -1
- package/build/codegen/targets/kotlin/emit-route-kotlin.d.ts +1 -1
- package/build/codegen/targets/swift/emit-route-swift.d.ts +1 -1
- package/build/core/create-http-stream.d.ts +50 -0
- package/build/core/create-http-stream.js +108 -0
- package/build/core/create-http-stream.js.map +1 -0
- package/build/{create-http-stream.test.js → core/create-http-stream.test.js} +1 -1
- package/build/core/create-http-stream.test.js.map +1 -0
- package/build/core/create-http.d.ts +51 -0
- package/build/core/create-http.js +65 -0
- package/build/core/create-http.js.map +1 -0
- package/build/{create-http.test.js → core/create-http.test.js} +13 -4
- package/build/core/create-http.test.js.map +1 -0
- package/build/core/create-stream.d.ts +26 -0
- package/build/core/create-stream.js +80 -0
- package/build/core/create-stream.js.map +1 -0
- package/build/{create-stream.test.js → core/create-stream.test.js} +23 -28
- package/build/core/create-stream.test.js.map +1 -0
- package/build/core/create.d.ts +22 -0
- package/build/core/create.js +71 -0
- package/build/core/create.js.map +1 -0
- package/build/{create.test.js → core/create.test.js} +25 -46
- package/build/core/create.test.js.map +1 -0
- package/build/core/definition-site.d.ts +24 -0
- package/build/{stack-utils.js → core/definition-site.js} +20 -20
- package/build/core/definition-site.js.map +1 -0
- package/build/{stack-utils.test.js → core/definition-site.test.js} +12 -3
- package/build/core/definition-site.test.js.map +1 -0
- package/build/{errors.d.ts → core/errors.d.ts} +19 -8
- package/build/{errors.js → core/errors.js} +21 -26
- package/build/core/errors.js.map +1 -0
- package/build/core/errors.test.js.map +1 -0
- package/build/core/factory-options.test.js +82 -0
- package/build/core/factory-options.test.js.map +1 -0
- package/build/core/http-route.d.ts +13 -0
- package/build/core/http-route.js +54 -0
- package/build/core/http-route.js.map +1 -0
- package/build/core/internal.d.ts +72 -0
- package/build/core/internal.js +128 -0
- package/build/core/internal.js.map +1 -0
- package/build/{migration.test.js → core/migration.test.js} +17 -1
- package/build/core/migration.test.js.map +1 -0
- package/build/core/procedures.d.ts +143 -0
- package/build/core/procedures.js +64 -0
- package/build/core/procedures.js.map +1 -0
- package/build/{index.test.js → core/procedures.test.js} +14 -11
- package/build/core/procedures.test.js.map +1 -0
- package/build/core/types.d.ts +182 -0
- package/build/{schema → core}/types.js.map +1 -1
- package/build/exports.d.ts +31 -11
- package/build/exports.js +23 -8
- package/build/exports.js.map +1 -1
- package/build/schema/adapter.d.ts +35 -0
- package/build/schema/adapter.js +13 -0
- package/build/schema/adapter.js.map +1 -0
- package/build/schema/adapter.test.js +53 -0
- package/build/schema/adapter.test.js.map +1 -0
- package/build/schema/compile.d.ts +37 -0
- package/build/schema/compile.js +38 -0
- package/build/schema/compile.js.map +1 -0
- package/build/schema/compile.test.js +78 -0
- package/build/schema/compile.test.js.map +1 -0
- package/build/schema/compute-schema.d.ts +47 -37
- package/build/schema/compute-schema.js +86 -29
- package/build/schema/compute-schema.js.map +1 -1
- package/build/schema/compute-schema.test.js +158 -40
- package/build/schema/compute-schema.test.js.map +1 -1
- package/build/schema/json-schema.d.ts +17 -0
- package/build/schema/json-schema.js +2 -0
- package/build/schema/json-schema.js.map +1 -0
- package/build/schema/typebox.d.ts +11 -0
- package/build/schema/typebox.js +24 -0
- package/build/schema/typebox.js.map +1 -0
- package/build/schema/typebox.test.js +34 -0
- package/build/schema/typebox.test.js.map +1 -0
- package/build/server/context.d.ts +8 -0
- package/build/server/context.js +7 -0
- package/build/server/context.js.map +1 -0
- package/build/server/context.test.js +16 -0
- package/build/server/context.test.js.map +1 -0
- package/build/{doc-envelope.d.ts → server/doc-envelope.d.ts} +1 -1
- package/build/server/doc-envelope.js.map +1 -0
- package/build/server/doc-envelope.test.d.ts +1 -0
- package/build/server/doc-envelope.test.js.map +1 -0
- package/build/{implementations/http → server}/doc-registry.d.ts +7 -2
- package/build/{implementations/http → server}/doc-registry.js +9 -5
- package/build/server/doc-registry.js.map +1 -0
- package/build/server/doc-registry.test.d.ts +1 -0
- package/build/{implementations/http → server}/doc-registry.test.js +27 -24
- package/build/server/doc-registry.test.js.map +1 -0
- package/build/server/docs/docs.test.d.ts +1 -0
- package/build/server/docs/docs.test.js +237 -0
- package/build/server/docs/docs.test.js.map +1 -0
- package/build/{implementations/http/hono → server}/docs/http-doc.d.ts +2 -2
- package/build/{implementations/http/hono → server}/docs/http-doc.js +1 -1
- package/build/server/docs/http-doc.js.map +1 -0
- package/build/{implementations/http/hono → server}/docs/http-stream-doc.d.ts +2 -2
- package/build/{implementations/http/hono → server}/docs/http-stream-doc.js +1 -1
- package/build/server/docs/http-stream-doc.js.map +1 -0
- package/build/{implementations/http/hono → server}/docs/rpc-doc.d.ts +2 -2
- package/build/{implementations/http/hono → server}/docs/rpc-doc.js +1 -1
- package/build/server/docs/rpc-doc.js.map +1 -0
- package/build/{implementations/http/hono → server}/docs/stream-doc.d.ts +2 -2
- package/build/{implementations/http/hono → server}/docs/stream-doc.js +1 -1
- package/build/server/docs/stream-doc.js.map +1 -0
- package/build/server/errors/dispatch.d.ts +96 -0
- package/build/{implementations/http/error-dispatch.js → server/errors/dispatch.js} +20 -10
- package/build/server/errors/dispatch.js.map +1 -0
- package/build/server/errors/dispatch.test.d.ts +1 -0
- package/build/server/errors/dispatch.test.js +418 -0
- package/build/server/errors/dispatch.test.js.map +1 -0
- package/build/{implementations/http/error-taxonomy.d.ts → server/errors/taxonomy.d.ts} +8 -17
- package/build/{implementations/http/error-taxonomy.js → server/errors/taxonomy.js} +6 -15
- package/build/server/errors/taxonomy.js.map +1 -0
- package/build/server/errors/taxonomy.test.d.ts +1 -0
- package/build/{implementations/http/error-taxonomy.test.js → server/errors/taxonomy.test.js} +45 -39
- package/build/server/errors/taxonomy.test.js.map +1 -0
- package/build/server/index.d.ts +29 -0
- package/build/server/index.js +27 -0
- package/build/server/index.js.map +1 -0
- package/build/server/no-framework-imports.test.d.ts +1 -0
- package/build/server/no-framework-imports.test.js +40 -0
- package/build/server/no-framework-imports.test.js.map +1 -0
- package/build/{implementations/http/hono/path.d.ts → server/paths.d.ts} +2 -3
- package/build/{implementations/http/hono/path.js → server/paths.js} +1 -1
- package/build/server/paths.js.map +1 -0
- package/build/server/paths.test.d.ts +1 -0
- package/build/server/paths.test.js +111 -0
- package/build/server/paths.test.js.map +1 -0
- package/build/server/request/params.d.ts +29 -0
- package/build/server/request/params.js +43 -0
- package/build/server/request/params.js.map +1 -0
- package/build/server/request/params.test.d.ts +1 -0
- package/build/server/request/params.test.js +91 -0
- package/build/server/request/params.test.js.map +1 -0
- package/build/server/request/query.d.ts +9 -0
- package/build/server/request/query.js +22 -0
- package/build/server/request/query.js.map +1 -0
- package/build/server/request/query.test.d.ts +1 -0
- package/build/server/request/query.test.js +60 -0
- package/build/server/request/query.test.js.map +1 -0
- package/build/server/sse.d.ts +70 -0
- package/build/server/sse.js +94 -0
- package/build/server/sse.js.map +1 -0
- package/build/server/sse.test.d.ts +1 -0
- package/build/server/sse.test.js +98 -0
- package/build/server/sse.test.js.map +1 -0
- package/build/{implementations → server}/types.d.ts +17 -15
- package/build/{implementations → server}/types.js.map +1 -1
- package/docs/astro-adapter.md +8 -9
- package/docs/client-and-codegen.md +4 -4
- package/docs/client-error-handling.md +5 -5
- package/docs/codegen-kotlin.md +2 -3
- package/docs/codegen-swift.md +1 -2
- package/docs/core.md +135 -54
- package/docs/http-integrations.md +58 -6
- package/docs/migration-v8-to-v9.md +192 -0
- package/docs/plans/2026-06-09-v9-rewrite.md +130 -0
- package/docs/specs/2026-06-09-v9-rewrite-design.md +221 -0
- package/docs/streaming.md +12 -0
- package/package.json +23 -47
- package/src/{implementations/http → adapters}/astro/index.test.ts +2 -2
- package/src/adapters/hono/__fixtures__/parity-envelope.json +389 -0
- package/src/adapters/hono/envelope-parity.test.ts +126 -0
- package/src/{implementations/http → adapters}/hono/handlers/http-stream.test.ts +1 -1
- package/src/adapters/hono/handlers/http-stream.ts +73 -0
- package/src/{implementations/http → adapters}/hono/handlers/http.test.ts +1 -1
- package/src/adapters/hono/handlers/http.ts +70 -0
- package/src/{implementations/http → adapters}/hono/handlers/rpc.test.ts +2 -2
- package/src/adapters/hono/handlers/rpc.ts +39 -0
- package/src/{implementations/http → adapters}/hono/handlers/stream.test.ts +4 -3
- package/src/{implementations/http → adapters}/hono/handlers/stream.ts +19 -92
- package/src/{implementations/http → adapters}/hono/index.test.ts +14 -16
- package/src/{implementations/http → adapters}/hono/index.ts +35 -30
- package/src/{implementations/http → adapters/hono}/on-request-error.test.ts +3 -3
- package/src/adapters/hono/request.ts +28 -0
- package/src/{implementations/http → adapters/hono}/route-errors.test.ts +5 -5
- package/src/{implementations/http → adapters}/hono/types.ts +43 -20
- package/src/client/freeze.test.ts +41 -0
- package/src/client/typed-error-dispatch.test.ts +3 -3
- package/src/codegen/__fixtures__/make-envelope.ts +1 -1
- package/src/codegen/__fixtures__/models-envelope.json +310 -0
- package/src/codegen/__goldens__/MANIFEST.json +85 -0
- package/src/codegen/__goldens__/kotlin-default--models/Billing.kt +112 -0
- package/src/codegen/__goldens__/kotlin-default--models/BillingReports.kt +26 -0
- package/src/codegen/__goldens__/kotlin-default--models/Orders.kt +88 -0
- package/src/codegen/__goldens__/kotlin-default--users/Users.kt +189 -0
- package/src/codegen/__goldens__/swift-default--models/Billing.swift +97 -0
- package/src/codegen/__goldens__/swift-default--models/BillingReports.swift +20 -0
- package/src/codegen/__goldens__/swift-default--models/Orders.swift +81 -0
- package/src/codegen/__goldens__/swift-default--users/Users.swift +204 -0
- package/src/codegen/__goldens__/ts-default--models/_client.ts +1319 -0
- package/src/codegen/__goldens__/ts-default--models/_errors.ts +90 -0
- package/src/codegen/__goldens__/ts-default--models/_models.ts +10 -0
- package/src/codegen/__goldens__/ts-default--models/_types.ts +502 -0
- package/src/codegen/__goldens__/ts-default--models/billing-reports.ts +29 -0
- package/src/codegen/__goldens__/ts-default--models/billing.ts +67 -0
- package/src/codegen/__goldens__/ts-default--models/index.ts +48 -0
- package/src/codegen/__goldens__/ts-default--models/orders.ts +80 -0
- package/src/codegen/__goldens__/ts-default--users/_client.ts +1319 -0
- package/src/codegen/__goldens__/ts-default--users/_errors.ts +90 -0
- package/src/codegen/__goldens__/ts-default--users/_types.ts +502 -0
- package/src/codegen/__goldens__/ts-default--users/index.ts +38 -0
- package/src/codegen/__goldens__/ts-default--users/users.ts +169 -0
- package/src/codegen/__goldens__/ts-external-runtime--models/_errors.ts +90 -0
- package/src/codegen/__goldens__/ts-external-runtime--models/_models.ts +10 -0
- package/src/codegen/__goldens__/ts-external-runtime--models/billing-reports.ts +29 -0
- package/src/codegen/__goldens__/ts-external-runtime--models/billing.ts +67 -0
- package/src/codegen/__goldens__/ts-external-runtime--models/index.ts +48 -0
- package/src/codegen/__goldens__/ts-external-runtime--models/orders.ts +80 -0
- package/src/codegen/__goldens__/ts-external-runtime--users/_errors.ts +90 -0
- package/src/codegen/__goldens__/ts-external-runtime--users/index.ts +38 -0
- package/src/codegen/__goldens__/ts-external-runtime--users/users.ts +169 -0
- package/src/codegen/__goldens__/ts-flat--models/_client.ts +1319 -0
- package/src/codegen/__goldens__/ts-flat--models/_errors.ts +87 -0
- package/src/codegen/__goldens__/ts-flat--models/_models.ts +10 -0
- package/src/codegen/__goldens__/ts-flat--models/_types.ts +502 -0
- package/src/codegen/__goldens__/ts-flat--models/billing-reports.ts +28 -0
- package/src/codegen/__goldens__/ts-flat--models/billing.ts +51 -0
- package/src/codegen/__goldens__/ts-flat--models/index.ts +42 -0
- package/src/codegen/__goldens__/ts-flat--models/orders.ts +73 -0
- package/src/codegen/__goldens__/ts-flat--users/_client.ts +1319 -0
- package/src/codegen/__goldens__/ts-flat--users/_errors.ts +87 -0
- package/src/codegen/__goldens__/ts-flat--users/_types.ts +502 -0
- package/src/codegen/__goldens__/ts-flat--users/index.ts +34 -0
- package/src/codegen/__goldens__/ts-flat--users/users.ts +126 -0
- package/src/codegen/__goldens__/ts-no-share-models--models/_client.ts +1319 -0
- package/src/codegen/__goldens__/ts-no-share-models--models/_errors.ts +90 -0
- package/src/codegen/__goldens__/ts-no-share-models--models/_types.ts +502 -0
- package/src/codegen/__goldens__/ts-no-share-models--models/billing-reports.ts +29 -0
- package/src/codegen/__goldens__/ts-no-share-models--models/billing.ts +111 -0
- package/src/codegen/__goldens__/ts-no-share-models--models/index.ts +48 -0
- package/src/codegen/__goldens__/ts-no-share-models--models/orders.ts +112 -0
- package/src/codegen/__goldens__/ts-no-share-models--users/_client.ts +1319 -0
- package/src/codegen/__goldens__/ts-no-share-models--users/_errors.ts +90 -0
- package/src/codegen/__goldens__/ts-no-share-models--users/_types.ts +502 -0
- package/src/codegen/__goldens__/ts-no-share-models--users/index.ts +38 -0
- package/src/codegen/__goldens__/ts-no-share-models--users/users.ts +169 -0
- package/src/codegen/__goldens__/ts-shared-models-module--models/_client.ts +1319 -0
- package/src/codegen/__goldens__/ts-shared-models-module--models/_errors.ts +90 -0
- package/src/codegen/__goldens__/ts-shared-models-module--models/_models.ts +7 -0
- package/src/codegen/__goldens__/ts-shared-models-module--models/_types.ts +502 -0
- package/src/codegen/__goldens__/ts-shared-models-module--models/billing-reports.ts +29 -0
- package/src/codegen/__goldens__/ts-shared-models-module--models/billing.ts +67 -0
- package/src/codegen/__goldens__/ts-shared-models-module--models/index.ts +48 -0
- package/src/codegen/__goldens__/ts-shared-models-module--models/orders.ts +80 -0
- package/src/codegen/bin/cli.test.ts +13 -2
- package/src/codegen/bin/cli.ts +181 -144
- package/src/codegen/bin/flag-specs.test.ts +16 -1
- package/src/codegen/bin/flag-specs.ts +43 -31
- package/src/codegen/bundle-size.test.ts +1 -1
- package/src/codegen/collect-models.ts +1 -1
- package/src/codegen/e2e.test.ts +1 -1
- package/src/codegen/emit/api-route.ts +184 -0
- package/src/codegen/emit/context.ts +32 -0
- package/src/codegen/emit/declarations.ts +49 -0
- package/src/codegen/emit/format-types.ts +232 -0
- package/src/codegen/emit/http-stream-route.ts +162 -0
- package/src/codegen/emit/route-shared.ts +102 -0
- package/src/codegen/emit/rpc-route.ts +49 -0
- package/src/codegen/emit/scope-file.ts +226 -0
- package/src/codegen/emit/stream-route.ts +81 -0
- package/src/codegen/emit-errors.integration.test.ts +2 -2
- package/src/codegen/emit-errors.test.ts +1 -1
- package/src/codegen/emit-errors.ts +1 -1
- package/src/codegen/emit-scope.test.ts +2 -2
- package/src/codegen/emit-scope.ts +15 -1048
- package/src/codegen/goldens.test.ts +89 -0
- package/src/codegen/group-routes.test.ts +1 -1
- package/src/codegen/group-routes.ts +1 -1
- package/src/codegen/pipeline.test.ts +1 -1
- package/src/codegen/pipeline.ts +1 -1
- package/src/codegen/resolve-envelope.test.ts +1 -1
- package/src/codegen/resolve-envelope.ts +1 -1
- package/src/codegen/targets/_shared/error-schemas.test.ts +1 -1
- package/src/codegen/targets/_shared/error-schemas.ts +1 -1
- package/src/codegen/targets/_shared/route-slots.test.ts +1 -1
- package/src/codegen/targets/_shared/route-slots.ts +1 -1
- package/src/codegen/targets/_shared/target-run.ts +1 -1
- package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +1 -1
- package/src/codegen/targets/kotlin/emit-route-kotlin.ts +1 -1
- package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +1 -1
- package/src/codegen/targets/swift/access-level.test.ts +1 -1
- package/src/codegen/targets/swift/emit-route-swift.test.ts +1 -1
- package/src/codegen/targets/swift/emit-route-swift.ts +1 -1
- package/src/codegen/targets/swift/emit-scope-swift.test.ts +1 -1
- package/src/codegen/targets/ts/shared-models.test.ts +1 -1
- package/src/{create-http-stream.test.ts → core/create-http-stream.test.ts} +1 -1
- package/src/core/create-http-stream.ts +207 -0
- package/src/{create-http.test.ts → core/create-http.test.ts} +15 -4
- package/src/core/create-http.ts +126 -0
- package/src/{create-stream.test.ts → core/create-stream.test.ts} +28 -31
- package/src/core/create-stream.ts +142 -0
- package/src/{create.test.ts → core/create.test.ts} +25 -57
- package/src/core/create.ts +121 -0
- package/src/{stack-utils.test.ts → core/definition-site.test.ts} +14 -3
- package/src/{stack-utils.ts → core/definition-site.ts} +20 -23
- package/src/{errors.test.ts → core/errors.test.ts} +1 -1
- package/src/{errors.ts → core/errors.ts} +30 -28
- package/src/core/factory-options.test.ts +112 -0
- package/src/core/http-route.ts +73 -0
- package/src/core/internal.ts +203 -0
- package/src/{migration.test.ts → core/migration.test.ts} +23 -1
- package/src/{index.test.ts → core/procedures.test.ts} +13 -11
- package/src/core/procedures.ts +75 -0
- package/src/core/types.ts +195 -0
- package/src/exports.ts +60 -11
- package/src/schema/adapter.test.ts +58 -0
- package/src/schema/adapter.ts +45 -0
- package/src/schema/compile.test.ts +95 -0
- package/src/schema/compile.ts +64 -0
- package/src/schema/compute-schema.test.ts +222 -41
- package/src/schema/compute-schema.ts +145 -71
- package/src/schema/json-schema.ts +21 -0
- package/src/schema/typebox.test.ts +40 -0
- package/src/schema/typebox.ts +27 -0
- package/src/server/context.test.ts +22 -0
- package/src/server/context.ts +18 -0
- package/src/{doc-envelope.test.ts → server/doc-envelope.test.ts} +2 -2
- package/src/{doc-envelope.ts → server/doc-envelope.ts} +1 -1
- package/src/{implementations/http → server}/doc-registry.test.ts +32 -26
- package/src/{implementations/http → server}/doc-registry.ts +11 -7
- package/src/server/docs/docs.test.ts +287 -0
- package/src/{implementations/http/hono → server}/docs/http-doc.ts +3 -3
- package/src/{implementations/http/hono → server}/docs/http-stream-doc.ts +3 -3
- package/src/{implementations/http/hono → server}/docs/rpc-doc.ts +3 -3
- package/src/{implementations/http/hono → server}/docs/stream-doc.ts +3 -3
- package/src/server/errors/dispatch.test.ts +450 -0
- package/src/server/errors/dispatch.ts +189 -0
- package/src/{implementations/http/error-taxonomy.test.ts → server/errors/taxonomy.test.ts} +45 -39
- package/src/{implementations/http/error-taxonomy.ts → server/errors/taxonomy.ts} +8 -17
- package/src/server/index.ts +29 -0
- package/src/server/no-framework-imports.test.ts +43 -0
- package/src/server/paths.test.ts +141 -0
- package/src/{implementations/http/hono/path.ts → server/paths.ts} +2 -13
- package/src/server/request/params.test.ts +143 -0
- package/src/server/request/params.ts +68 -0
- package/src/server/request/query.test.ts +70 -0
- package/src/server/request/query.ts +24 -0
- package/src/server/sse.test.ts +113 -0
- package/src/server/sse.ts +117 -0
- package/src/{implementations → server}/types.ts +17 -16
- package/build/create-http-stream.d.ts +0 -58
- package/build/create-http-stream.js +0 -122
- package/build/create-http-stream.js.map +0 -1
- package/build/create-http-stream.test.js.map +0 -1
- package/build/create-http.d.ts +0 -49
- package/build/create-http.js +0 -108
- package/build/create-http.js.map +0 -1
- package/build/create-http.test.js.map +0 -1
- package/build/create-stream.d.ts +0 -35
- package/build/create-stream.js +0 -123
- package/build/create-stream.js.map +0 -1
- package/build/create-stream.test.js.map +0 -1
- package/build/create.d.ts +0 -28
- package/build/create.js +0 -82
- package/build/create.js.map +0 -1
- package/build/create.test.js.map +0 -1
- package/build/doc-envelope.js.map +0 -1
- package/build/doc-envelope.test.js.map +0 -1
- package/build/errors.js.map +0 -1
- package/build/errors.test.js.map +0 -1
- package/build/implementations/http/astro/astro-context.js.map +0 -1
- package/build/implementations/http/astro/create-handler.js.map +0 -1
- package/build/implementations/http/astro/index.js.map +0 -1
- package/build/implementations/http/astro/index.test.js.map +0 -1
- package/build/implementations/http/astro/rewrite-request.js.map +0 -1
- package/build/implementations/http/doc-registry.js.map +0 -1
- package/build/implementations/http/doc-registry.test.js.map +0 -1
- package/build/implementations/http/error-dispatch.d.ts +0 -76
- package/build/implementations/http/error-dispatch.js.map +0 -1
- package/build/implementations/http/error-dispatch.test.js +0 -254
- package/build/implementations/http/error-dispatch.test.js.map +0 -1
- package/build/implementations/http/error-taxonomy.js.map +0 -1
- package/build/implementations/http/error-taxonomy.test.js.map +0 -1
- package/build/implementations/http/hono/docs/http-doc.js.map +0 -1
- package/build/implementations/http/hono/docs/http-stream-doc.js.map +0 -1
- package/build/implementations/http/hono/docs/rpc-doc.js.map +0 -1
- package/build/implementations/http/hono/docs/stream-doc.js.map +0 -1
- package/build/implementations/http/hono/handlers/http-stream.js +0 -123
- package/build/implementations/http/hono/handlers/http-stream.js.map +0 -1
- package/build/implementations/http/hono/handlers/http-stream.test.js.map +0 -1
- package/build/implementations/http/hono/handlers/http.js +0 -110
- package/build/implementations/http/hono/handlers/http.js.map +0 -1
- package/build/implementations/http/hono/handlers/http.test.js.map +0 -1
- package/build/implementations/http/hono/handlers/rpc.js +0 -32
- package/build/implementations/http/hono/handlers/rpc.js.map +0 -1
- package/build/implementations/http/hono/handlers/rpc.test.js.map +0 -1
- package/build/implementations/http/hono/handlers/stream.d.ts +0 -23
- package/build/implementations/http/hono/handlers/stream.js +0 -147
- package/build/implementations/http/hono/handlers/stream.js.map +0 -1
- package/build/implementations/http/hono/handlers/stream.test.js.map +0 -1
- package/build/implementations/http/hono/index.js.map +0 -1
- package/build/implementations/http/hono/index.test.js.map +0 -1
- package/build/implementations/http/hono/path.js.map +0 -1
- package/build/implementations/http/hono/path.test.js +0 -83
- package/build/implementations/http/hono/path.test.js.map +0 -1
- package/build/implementations/http/hono/types.d.ts +0 -51
- package/build/implementations/http/hono/types.js.map +0 -1
- package/build/implementations/http/on-request-error.test.js.map +0 -1
- package/build/implementations/http/route-errors.test.js.map +0 -1
- package/build/index.d.ts +0 -175
- package/build/index.js +0 -47
- package/build/index.js.map +0 -1
- package/build/index.test.js.map +0 -1
- package/build/migration.test.js.map +0 -1
- package/build/schema/extract-json-schema.d.ts +0 -2
- package/build/schema/extract-json-schema.js +0 -12
- package/build/schema/extract-json-schema.js.map +0 -1
- package/build/schema/extract-json-schema.test.js +0 -23
- package/build/schema/extract-json-schema.test.js.map +0 -1
- package/build/schema/parser.d.ts +0 -36
- package/build/schema/parser.js +0 -210
- package/build/schema/parser.js.map +0 -1
- package/build/schema/parser.test.js +0 -120
- package/build/schema/parser.test.js.map +0 -1
- package/build/schema/resolve-schema-lib.d.ts +0 -12
- package/build/schema/resolve-schema-lib.js +0 -11
- package/build/schema/resolve-schema-lib.js.map +0 -1
- package/build/schema/resolve-schema-lib.test.js +0 -17
- package/build/schema/resolve-schema-lib.test.js.map +0 -1
- package/build/schema/types.d.ts +0 -8
- package/build/schema/types.js +0 -2
- package/build/stack-utils.d.ts +0 -25
- package/build/stack-utils.js.map +0 -1
- package/build/stack-utils.test.js.map +0 -1
- package/build/types.d.ts +0 -142
- package/build/types.js +0 -2
- package/build/types.js.map +0 -1
- package/docs/decisions/2026-06-02-monorepo-split-evaluation.md +0 -80
- package/docs/handoffs/2026-06-08-dx-round2-declines.md +0 -45
- package/docs/handoffs/ajsc-named-type-collision.md +0 -134
- package/docs/handoffs/ajsc-named-type-support.md +0 -181
- package/docs/handoffs/shared-models-auto-resolve-response.md +0 -181
- package/docs/npm-workspaces-migration-plan.md +0 -611
- package/docs/superpowers/plans/2026-04-24-doc-registry-simplification.md +0 -886
- package/docs/superpowers/plans/2026-04-24-kotlin-codegen-target.md +0 -1265
- package/docs/superpowers/plans/2026-04-25-ajsc-v7-kotlin-polish.md +0 -1993
- package/docs/superpowers/plans/2026-04-29-safe-result-api.md +0 -2293
- package/docs/superpowers/plans/2026-05-07-astro-adapter.md +0 -1391
- package/docs/superpowers/plans/2026-05-08-create-http.md +0 -3355
- package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +0 -3365
- package/docs/superpowers/plans/2026-06-05-dx-feedback-round.md +0 -1292
- package/docs/superpowers/plans/2026-06-06-shared-models-convention-and-diagnostics.md +0 -659
- package/docs/superpowers/plans/2026-06-08-codegen-dx-surfacing.md +0 -428
- package/docs/superpowers/specs/2026-04-24-kotlin-swift-codegen-design.md +0 -401
- package/docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md +0 -314
- package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +0 -264
- package/docs/superpowers/specs/2026-04-29-safe-result-api-design.md +0 -324
- package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +0 -252
- package/docs/superpowers/specs/2026-05-08-create-http-design.md +0 -409
- package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +0 -411
- package/docs/superpowers/specs/2026-06-05-dx-feedback-round-design.md +0 -285
- package/docs/superpowers/specs/2026-06-08-dx-feedback-round-2-design.md +0 -376
- package/src/create-http-stream.ts +0 -191
- package/src/create-http.ts +0 -210
- package/src/create-stream.ts +0 -228
- package/src/create.ts +0 -172
- package/src/implementations/http/README.md +0 -390
- package/src/implementations/http/error-dispatch.test.ts +0 -283
- package/src/implementations/http/error-dispatch.ts +0 -176
- package/src/implementations/http/hono/handlers/http-stream.ts +0 -152
- package/src/implementations/http/hono/handlers/http.ts +0 -145
- package/src/implementations/http/hono/handlers/rpc.ts +0 -54
- package/src/implementations/http/hono/path.test.ts +0 -96
- package/src/index.ts +0 -101
- package/src/schema/extract-json-schema.test.ts +0 -25
- package/src/schema/extract-json-schema.ts +0 -15
- package/src/schema/parser.test.ts +0 -182
- package/src/schema/parser.ts +0 -265
- package/src/schema/resolve-schema-lib.test.ts +0 -19
- package/src/schema/resolve-schema-lib.ts +0 -29
- package/src/schema/types.ts +0 -20
- package/src/types.ts +0 -133
- /package/build/{implementations/http → adapters}/astro/astro-context.d.ts +0 -0
- /package/build/{implementations/http → adapters}/astro/astro-context.js +0 -0
- /package/build/{implementations/http → adapters}/astro/create-handler.d.ts +0 -0
- /package/build/{implementations/http → adapters}/astro/create-handler.js +0 -0
- /package/build/{implementations/http → adapters}/astro/index.d.ts +0 -0
- /package/build/{implementations/http → adapters}/astro/index.js +0 -0
- /package/build/{implementations/http → adapters}/astro/index.test.d.ts +0 -0
- /package/build/{implementations/http → adapters}/astro/rewrite-request.d.ts +0 -0
- /package/build/{implementations/http → adapters}/astro/rewrite-request.js +0 -0
- /package/build/{create-http-stream.test.d.ts → adapters/hono/envelope-parity.test.d.ts} +0 -0
- /package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.d.ts +0 -0
- /package/build/{implementations/http → adapters}/hono/handlers/http.test.d.ts +0 -0
- /package/build/{implementations/http → adapters}/hono/handlers/rpc.test.d.ts +0 -0
- /package/build/{implementations/http → adapters}/hono/handlers/stream.test.d.ts +0 -0
- /package/build/{implementations/http → adapters}/hono/index.test.d.ts +0 -0
- /package/build/{implementations/http → adapters/hono}/on-request-error.test.d.ts +0 -0
- /package/build/{implementations/http → adapters/hono}/route-errors.test.d.ts +0 -0
- /package/build/{create-http.test.d.ts → client/freeze.test.d.ts} +0 -0
- /package/build/{create-stream.test.d.ts → codegen/goldens.test.d.ts} +0 -0
- /package/build/{create.test.d.ts → core/create-http-stream.test.d.ts} +0 -0
- /package/build/{doc-envelope.test.d.ts → core/create-http.test.d.ts} +0 -0
- /package/build/{errors.test.d.ts → core/create-stream.test.d.ts} +0 -0
- /package/build/{implementations/http/doc-registry.test.d.ts → core/create.test.d.ts} +0 -0
- /package/build/{implementations/http/error-dispatch.test.d.ts → core/definition-site.test.d.ts} +0 -0
- /package/build/{implementations/http/error-taxonomy.test.d.ts → core/errors.test.d.ts} +0 -0
- /package/build/{errors.test.js → core/errors.test.js} +0 -0
- /package/build/{implementations/http/hono/path.test.d.ts → core/factory-options.test.d.ts} +0 -0
- /package/build/{migration.test.d.ts → core/migration.test.d.ts} +0 -0
- /package/build/{index.test.d.ts → core/procedures.test.d.ts} +0 -0
- /package/build/{implementations/http/hono → core}/types.js +0 -0
- /package/build/schema/{extract-json-schema.test.d.ts → adapter.test.d.ts} +0 -0
- /package/build/schema/{parser.test.d.ts → compile.test.d.ts} +0 -0
- /package/build/schema/{resolve-schema-lib.test.d.ts → typebox.test.d.ts} +0 -0
- /package/build/{stack-utils.test.d.ts → server/context.test.d.ts} +0 -0
- /package/build/{doc-envelope.js → server/doc-envelope.js} +0 -0
- /package/build/{doc-envelope.test.js → server/doc-envelope.test.js} +0 -0
- /package/build/{implementations → server}/types.js +0 -0
- /package/src/{implementations/http → adapters}/astro/README.md +0 -0
- /package/src/{implementations/http → adapters}/astro/astro-context.ts +0 -0
- /package/src/{implementations/http → adapters}/astro/create-handler.ts +0 -0
- /package/src/{implementations/http → adapters}/astro/index.ts +0 -0
- /package/src/{implementations/http → adapters}/astro/rewrite-request.ts +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Auto-generated by ts-procedures-codegen (v8.6.0) — do not edit
|
|
2
|
+
// Source hash: cb5f789247045d83e6eb2611821116bb
|
|
3
|
+
|
|
4
|
+
export namespace ApiErrors {
|
|
5
|
+
/** Base class for every generated error in this service. Catch with `instanceof`. */
|
|
6
|
+
export class ApiProcedureError<TBody = unknown> extends Error {
|
|
7
|
+
readonly status: number
|
|
8
|
+
readonly procedureName: string
|
|
9
|
+
readonly scope: string
|
|
10
|
+
readonly body: TBody
|
|
11
|
+
constructor(args: {
|
|
12
|
+
name: string
|
|
13
|
+
message: string
|
|
14
|
+
status: number
|
|
15
|
+
procedureName: string
|
|
16
|
+
scope: string
|
|
17
|
+
body: TBody
|
|
18
|
+
}) {
|
|
19
|
+
super(args.message)
|
|
20
|
+
this.name = args.name
|
|
21
|
+
this.status = args.status
|
|
22
|
+
this.procedureName = args.procedureName
|
|
23
|
+
this.scope = args.scope
|
|
24
|
+
this.body = args.body
|
|
25
|
+
Object.setPrototypeOf(this, new.target.prototype)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Response body for NotFound. */
|
|
30
|
+
export type NotFoundBody = { name: "NotFound"; message: string; }
|
|
31
|
+
|
|
32
|
+
/** Resource not found (HTTP 404) */
|
|
33
|
+
export class NotFound extends ApiProcedureError<NotFoundBody> {
|
|
34
|
+
static readonly errorName = 'NotFound' as const
|
|
35
|
+
static readonly statusCode = 404
|
|
36
|
+
static fromResponse(
|
|
37
|
+
body: NotFoundBody,
|
|
38
|
+
meta: { status: number; procedureName: string; scope: string }
|
|
39
|
+
): NotFound {
|
|
40
|
+
const message =
|
|
41
|
+
body && typeof (body as { message?: unknown }).message === 'string'
|
|
42
|
+
? (body as { message: string }).message
|
|
43
|
+
: 'NotFound'
|
|
44
|
+
return new NotFound({
|
|
45
|
+
name: 'NotFound',
|
|
46
|
+
message,
|
|
47
|
+
status: meta.status,
|
|
48
|
+
procedureName: meta.procedureName,
|
|
49
|
+
scope: meta.scope,
|
|
50
|
+
body,
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Response body for OrderRejected. */
|
|
56
|
+
export type OrderRejectedBody = { name: "OrderRejected"; message: string; reason: "out-of-stock" | "fraud" | "limit"; }
|
|
57
|
+
|
|
58
|
+
/** The order could not be accepted (HTTP 422) */
|
|
59
|
+
export class OrderRejected extends ApiProcedureError<OrderRejectedBody> {
|
|
60
|
+
static readonly errorName = 'OrderRejected' as const
|
|
61
|
+
static readonly statusCode = 422
|
|
62
|
+
static fromResponse(
|
|
63
|
+
body: OrderRejectedBody,
|
|
64
|
+
meta: { status: number; procedureName: string; scope: string }
|
|
65
|
+
): OrderRejected {
|
|
66
|
+
const message =
|
|
67
|
+
body && typeof (body as { message?: unknown }).message === 'string'
|
|
68
|
+
? (body as { message: string }).message
|
|
69
|
+
: 'OrderRejected'
|
|
70
|
+
return new OrderRejected({
|
|
71
|
+
name: 'OrderRejected',
|
|
72
|
+
message,
|
|
73
|
+
status: meta.status,
|
|
74
|
+
procedureName: meta.procedureName,
|
|
75
|
+
scope: meta.scope,
|
|
76
|
+
body,
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Union of every generated error in this service. */
|
|
82
|
+
export type ApiProcedureErrorUnion = NotFound | OrderRejected
|
|
83
|
+
|
|
84
|
+
/** Runtime registry consumed by the client to dispatch by `body.name`. */
|
|
85
|
+
export const ApiErrorRegistry = {
|
|
86
|
+
NotFound,
|
|
87
|
+
OrderRejected,
|
|
88
|
+
} as const
|
|
89
|
+
|
|
90
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Auto-generated by ts-procedures-codegen (v8.6.0) — do not edit
|
|
2
|
+
// Source hash: cb5f789247045d83e6eb2611821116bb
|
|
3
|
+
|
|
4
|
+
export type Customer = { id: string; name: string; balance: Money; }
|
|
5
|
+
|
|
6
|
+
export type Money = { amount: number; currency: string; }
|
|
7
|
+
|
|
8
|
+
export type OrderEvent = { orderId: string; status: "created" | "paid" | "shipped"; total: Money; }
|
|
9
|
+
|
|
10
|
+
export type Invoice = { id: string; total: Money; customer: Customer; }
|
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
// Auto-generated by ts-procedures-codegen (v8.6.0) — do not edit
|
|
2
|
+
// Source hash: cb5f789247045d83e6eb2611821116bb
|
|
3
|
+
|
|
4
|
+
export class ClientHttpError extends Error {
|
|
5
|
+
readonly name = 'ClientHttpError'
|
|
6
|
+
readonly status: number
|
|
7
|
+
readonly headers: Record<string, string>
|
|
8
|
+
readonly body: unknown
|
|
9
|
+
readonly procedureName: string
|
|
10
|
+
readonly scope: string
|
|
11
|
+
|
|
12
|
+
constructor(opts: {
|
|
13
|
+
status: number
|
|
14
|
+
headers: Record<string, string>
|
|
15
|
+
body: unknown
|
|
16
|
+
procedureName: string
|
|
17
|
+
scope: string
|
|
18
|
+
cause?: unknown
|
|
19
|
+
}) {
|
|
20
|
+
super(
|
|
21
|
+
`${opts.procedureName} (${opts.scope}) failed with status ${opts.status}`,
|
|
22
|
+
{ cause: opts.cause }
|
|
23
|
+
)
|
|
24
|
+
this.status = opts.status
|
|
25
|
+
this.headers = opts.headers
|
|
26
|
+
this.body = opts.body
|
|
27
|
+
this.procedureName = opts.procedureName
|
|
28
|
+
this.scope = opts.scope
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** @deprecated Renamed to `ClientHttpError`. The alias is retained for one minor release after the 7.0.0 major bump and will be removed in a subsequent minor (e.g. 7.1.0). Migrate to `ClientHttpError` now. */
|
|
33
|
+
|
|
34
|
+
export const ClientRequestError = ClientHttpError
|
|
35
|
+
/** @deprecated Renamed to `ClientHttpError`. The alias is retained for one minor release after the 7.0.0 major bump and will be removed in a subsequent minor (e.g. 7.1.0). Migrate to `ClientHttpError` now. */
|
|
36
|
+
// eslint-disable-next-line no-redeclare
|
|
37
|
+
export type ClientRequestError = ClientHttpError
|
|
38
|
+
|
|
39
|
+
export class ClientPathParamError extends Error {
|
|
40
|
+
readonly name = 'ClientPathParamError'
|
|
41
|
+
|
|
42
|
+
constructor(param: string, path: string, procedureName: string, cause?: unknown) {
|
|
43
|
+
super(`Missing path parameter "${param}" in "${path}" for procedure ${procedureName}`, { cause })
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export class ClientStreamError extends Error {
|
|
48
|
+
readonly name = 'ClientStreamError'
|
|
49
|
+
readonly procedureName: string
|
|
50
|
+
readonly scope: string
|
|
51
|
+
|
|
52
|
+
constructor(message: string, procedureName: string, scope: string, cause?: unknown) {
|
|
53
|
+
super(message, { cause })
|
|
54
|
+
this.procedureName = procedureName
|
|
55
|
+
this.scope = scope
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export class ClientNetworkError extends Error {
|
|
60
|
+
readonly name = 'ClientNetworkError'
|
|
61
|
+
readonly procedureName: string
|
|
62
|
+
readonly scope: string
|
|
63
|
+
|
|
64
|
+
constructor(opts: { procedureName: string; scope: string; cause?: unknown; message?: string }) {
|
|
65
|
+
super(opts.message ?? `${opts.procedureName} (${opts.scope}) failed: network error`, { cause: opts.cause })
|
|
66
|
+
this.procedureName = opts.procedureName
|
|
67
|
+
this.scope = opts.scope
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export class ClientTimeoutError extends Error {
|
|
72
|
+
readonly name = 'ClientTimeoutError'
|
|
73
|
+
readonly procedureName: string
|
|
74
|
+
readonly scope: string
|
|
75
|
+
readonly timeoutMs: number
|
|
76
|
+
|
|
77
|
+
constructor(opts: { procedureName: string; scope: string; timeoutMs: number; cause?: unknown }) {
|
|
78
|
+
super(`${opts.procedureName} (${opts.scope}) timed out after ${opts.timeoutMs}ms`, { cause: opts.cause })
|
|
79
|
+
this.procedureName = opts.procedureName
|
|
80
|
+
this.scope = opts.scope
|
|
81
|
+
this.timeoutMs = opts.timeoutMs
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export class ClientAbortError extends Error {
|
|
86
|
+
readonly name = 'ClientAbortError'
|
|
87
|
+
readonly procedureName: string
|
|
88
|
+
readonly scope: string
|
|
89
|
+
readonly reason: unknown
|
|
90
|
+
|
|
91
|
+
constructor(opts: { procedureName: string; scope: string; reason?: unknown; cause?: unknown }) {
|
|
92
|
+
super(`${opts.procedureName} (${opts.scope}) aborted`, { cause: opts.cause })
|
|
93
|
+
this.procedureName = opts.procedureName
|
|
94
|
+
this.scope = opts.scope
|
|
95
|
+
this.reason = opts.reason
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export class ClientParseError extends Error {
|
|
100
|
+
readonly name = 'ClientParseError'
|
|
101
|
+
readonly procedureName: string
|
|
102
|
+
readonly scope: string
|
|
103
|
+
|
|
104
|
+
constructor(opts: { procedureName: string; scope: string; cause?: unknown; message?: string }) {
|
|
105
|
+
super(opts.message ?? `${opts.procedureName} (${opts.scope}) response could not be parsed`, { cause: opts.cause })
|
|
106
|
+
this.procedureName = opts.procedureName
|
|
107
|
+
this.scope = opts.scope
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ── Request Metadata ─────────────────────────────────────
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Per-request metadata visible to adapters and hooks. Defined as an empty
|
|
115
|
+
* interface so consumers can augment it via TypeScript declaration merging
|
|
116
|
+
* to get end-to-end type safety for their own metadata fields.
|
|
117
|
+
*
|
|
118
|
+
* @example With a non-self-contained client:
|
|
119
|
+
* ```ts
|
|
120
|
+
* declare module 'ts-procedures/client' {
|
|
121
|
+
* interface RequestMeta {
|
|
122
|
+
* traceId?: string
|
|
123
|
+
* priority?: 'high' | 'low'
|
|
124
|
+
* }
|
|
125
|
+
* }
|
|
126
|
+
* ```
|
|
127
|
+
*
|
|
128
|
+
* @example With a self-contained (code-generated) client:
|
|
129
|
+
* ```ts
|
|
130
|
+
* declare module './generated/_types' {
|
|
131
|
+
* interface RequestMeta {
|
|
132
|
+
* traceId?: string
|
|
133
|
+
* }
|
|
134
|
+
* }
|
|
135
|
+
* ```
|
|
136
|
+
*
|
|
137
|
+
* After augmentation, `request.meta.traceId` is typed everywhere — per-call
|
|
138
|
+
* options, hooks, and adapters.
|
|
139
|
+
*/
|
|
140
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
141
|
+
export interface RequestMeta {}
|
|
142
|
+
|
|
143
|
+
// ── Error Classifier ─────────────────────────────────────
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Classification context — supplies provenance the classifier needs that's
|
|
147
|
+
* not derivable from the raw error itself.
|
|
148
|
+
*
|
|
149
|
+
* `timeoutSignal` and `userSignal` let the classifier distinguish a timeout
|
|
150
|
+
* abort from a user-initiated abort when an `AbortError` lands.
|
|
151
|
+
*/
|
|
152
|
+
export interface ClassifyErrorContext {
|
|
153
|
+
procedureName: string
|
|
154
|
+
scope: string
|
|
155
|
+
timeoutSignal?: AbortSignal
|
|
156
|
+
userSignal?: AbortSignal
|
|
157
|
+
timeoutMs?: number
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* The output shape of a successful classification. Contract: `error` is
|
|
162
|
+
* always an `Error` subclass (the framework class). Non-`Error` values fall
|
|
163
|
+
* through to `null` (handled by `executeCall` as `kind: 'unknown'`).
|
|
164
|
+
*/
|
|
165
|
+
export interface ClassifiedError {
|
|
166
|
+
kind: string
|
|
167
|
+
error: Error
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Adapter-provided classifier — runs before `defaultClassifyError`. Return
|
|
172
|
+
* `null` to fall through to the default. Adapter authors should compose with
|
|
173
|
+
* the default explicitly:
|
|
174
|
+
*
|
|
175
|
+
* classifyError: (e, ctx) => myClassify(e, ctx) ?? defaultClassifyError(e, ctx)
|
|
176
|
+
*/
|
|
177
|
+
export type ErrorClassifier = (
|
|
178
|
+
raw: unknown,
|
|
179
|
+
ctx: ClassifyErrorContext,
|
|
180
|
+
) => ClassifiedError | null
|
|
181
|
+
|
|
182
|
+
// ── Adapter ──────────────────────────────────────────────
|
|
183
|
+
|
|
184
|
+
export interface ClientAdapter {
|
|
185
|
+
request(config: AdapterRequest): Promise<AdapterResponse>
|
|
186
|
+
stream(config: AdapterRequest): Promise<AdapterStreamResponse>
|
|
187
|
+
/** Optional adapter-level error classifier — composes with `defaultClassifyError`. */
|
|
188
|
+
classifyError?: ErrorClassifier
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface AdapterRequest {
|
|
192
|
+
url: string
|
|
193
|
+
method: string
|
|
194
|
+
headers?: Record<string, string>
|
|
195
|
+
body?: unknown
|
|
196
|
+
signal?: AbortSignal
|
|
197
|
+
/**
|
|
198
|
+
* Per-request metadata. Augment `RequestMeta` via declaration merging to
|
|
199
|
+
* type your own fields. See {@link RequestMeta}.
|
|
200
|
+
*/
|
|
201
|
+
meta?: RequestMeta
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export interface AdapterResponse {
|
|
205
|
+
status: number
|
|
206
|
+
headers: Record<string, string>
|
|
207
|
+
body: unknown
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export interface AdapterStreamResponse {
|
|
211
|
+
status: number
|
|
212
|
+
/**
|
|
213
|
+
* Platform `Headers` object populated by the adapter. Passed through to
|
|
214
|
+
* `TypedStream.headers` when the route declares `res.headers`.
|
|
215
|
+
*/
|
|
216
|
+
headers: Headers
|
|
217
|
+
body: AsyncIterable<unknown>
|
|
218
|
+
/**
|
|
219
|
+
* Populated when `status` is non-2xx — the parsed response body. Surfaced so
|
|
220
|
+
* `executeStream` can dispatch typed errors via the error registry instead
|
|
221
|
+
* of always falling back to `ClientHttpError` with `body: null`.
|
|
222
|
+
*/
|
|
223
|
+
errorBody?: unknown
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ── Hooks ────────────────────────────────────────────────
|
|
227
|
+
|
|
228
|
+
export interface ClientHooks {
|
|
229
|
+
onBeforeRequest?(context: BeforeRequestContext): BeforeRequestContext | Promise<BeforeRequestContext>
|
|
230
|
+
onAfterResponse?(context: AfterResponseContext): void | Promise<void>
|
|
231
|
+
onError?(context: ErrorContext): void | Promise<void>
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export interface BeforeRequestContext {
|
|
235
|
+
procedureName: string
|
|
236
|
+
scope: string
|
|
237
|
+
request: AdapterRequest
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export interface AfterResponseContext {
|
|
241
|
+
procedureName: string
|
|
242
|
+
scope: string
|
|
243
|
+
request: AdapterRequest
|
|
244
|
+
response: AdapterResponse
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export interface ErrorContext {
|
|
248
|
+
procedureName: string
|
|
249
|
+
scope: string
|
|
250
|
+
request: AdapterRequest
|
|
251
|
+
error: unknown
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// ── Descriptors ──────────────────────────────────────────
|
|
255
|
+
|
|
256
|
+
export interface CallDescriptor {
|
|
257
|
+
name: string
|
|
258
|
+
scope: string
|
|
259
|
+
path: string
|
|
260
|
+
method: string
|
|
261
|
+
kind: 'rpc' | 'api' | 'stream' | 'http-stream'
|
|
262
|
+
params: unknown
|
|
263
|
+
/**
|
|
264
|
+
* Set by codegen when the route declares `schema.res.headers`. Drives
|
|
265
|
+
* whether `executeCall` returns bare body (`undefined`/false) or a
|
|
266
|
+
* `{ body, headers }` envelope (`true`). Mirrors the `HttpReturn<TRes>`
|
|
267
|
+
* conditional return shape on the server side.
|
|
268
|
+
*/
|
|
269
|
+
responseHeadersDeclared?: boolean
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export interface StreamDescriptor extends CallDescriptor {
|
|
273
|
+
kind: 'stream' | 'http-stream'
|
|
274
|
+
streamMode: 'sse' | 'text'
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// ── TypedStream ──────────────────────────────────────────
|
|
278
|
+
|
|
279
|
+
export interface TypedStream<TYield, TReturn = void> extends AsyncIterable<TYield> {
|
|
280
|
+
/**
|
|
281
|
+
* Resolves when the stream completes with the final return value.
|
|
282
|
+
* Rejects if the stream errors before completing.
|
|
283
|
+
* Note: iteration must begin (via for-await) for this promise to settle,
|
|
284
|
+
* since resolution depends on the async generator running to completion.
|
|
285
|
+
*/
|
|
286
|
+
result: Promise<TReturn>
|
|
287
|
+
/**
|
|
288
|
+
* Platform `Headers` from the initial stream response. Populated only when
|
|
289
|
+
* the route declares `res.headers` (i.e. `responseHeadersDeclared: true` on
|
|
290
|
+
* the descriptor). Undefined otherwise — consumers without declared response
|
|
291
|
+
* headers should not rely on this field.
|
|
292
|
+
*/
|
|
293
|
+
headers?: Headers
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// ── Request Options ──────────────────────────────────────
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Request-level configuration that can be set as client-level defaults
|
|
300
|
+
* (via `CreateClientConfig.defaults`) or per-call (via `ProcedureCallOptions`).
|
|
301
|
+
*
|
|
302
|
+
* - `signal`: AbortSignal for cancellation. When both a default and per-call
|
|
303
|
+
* signal are provided, they're combined — whichever aborts first wins.
|
|
304
|
+
* - `timeout`: Timeout in milliseconds. Combined with `signal` the same way.
|
|
305
|
+
* A per-call `timeout: 0` disables an inherited default timeout.
|
|
306
|
+
* - `headers`: Extra headers merged into the request, as a static record OR a
|
|
307
|
+
* (possibly async) function evaluated per request. Per-call keys win over
|
|
308
|
+
* default keys. Use the function form for values that change between calls
|
|
309
|
+
* (e.g. a rotating bearer token) so they don't go stale. Still subject to
|
|
310
|
+
* further mutation by `onBeforeRequest` hooks.
|
|
311
|
+
* - `basePath`: Override the base path for this call. Per-call > default > config.
|
|
312
|
+
* - `meta`: Per-request metadata typed via the {@link RequestMeta} interface.
|
|
313
|
+
* Merged shallowly (per-call keys win over default keys).
|
|
314
|
+
*/
|
|
315
|
+
/**
|
|
316
|
+
* Request headers as a static record OR a (possibly async) function evaluated
|
|
317
|
+
* per request. Use the function form for values that change between calls — e.g.
|
|
318
|
+
* a rotating bearer token: `headers: () => ({ Authorization: `Bearer ${session.token}` })`.
|
|
319
|
+
* A static record captured at construction goes stale; a function is re-evaluated each call.
|
|
320
|
+
*
|
|
321
|
+
* Named `ClientHeadersInit` (not `HeadersInit`) to avoid shadowing the DOM lib's
|
|
322
|
+
* global `HeadersInit`, which has a different shape.
|
|
323
|
+
*/
|
|
324
|
+
export type ClientHeadersInit =
|
|
325
|
+
| Record<string, string>
|
|
326
|
+
| (() => Record<string, string> | Promise<Record<string, string>>)
|
|
327
|
+
|
|
328
|
+
export interface ProcedureCallDefaults {
|
|
329
|
+
signal?: AbortSignal
|
|
330
|
+
timeout?: number
|
|
331
|
+
headers?: ClientHeadersInit
|
|
332
|
+
basePath?: string
|
|
333
|
+
meta?: RequestMeta
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Per-call options. Extends both `ProcedureCallDefaults` (request config) and
|
|
338
|
+
* `ClientHooks` (hooks), so a single options bag covers both concerns.
|
|
339
|
+
*/
|
|
340
|
+
export interface ProcedureCallOptions extends ProcedureCallDefaults, ClientHooks {}
|
|
341
|
+
|
|
342
|
+
// ── Error Registry ───────────────────────────────────────
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Metadata attached to a typed error at construction. Supplies the transport
|
|
346
|
+
* context (status, procedure, scope) that isn't part of the response body.
|
|
347
|
+
*/
|
|
348
|
+
export interface ErrorResponseMeta {
|
|
349
|
+
status: number
|
|
350
|
+
procedureName: string
|
|
351
|
+
scope: string
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* A factory for a typed error class — constructed from the response body plus
|
|
356
|
+
* transport metadata. Generated error classes expose this as a static method.
|
|
357
|
+
*/
|
|
358
|
+
export interface ErrorFactory {
|
|
359
|
+
fromResponse(body: unknown, meta: ErrorResponseMeta): Error
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Maps `body.name` values (taxonomy keys) to error class factories. When the
|
|
364
|
+
* client sees a non-2xx response whose body has a `name` matching a registry
|
|
365
|
+
* entry, it throws the typed error instead of a generic `ClientHttpError`.
|
|
366
|
+
*/
|
|
367
|
+
export type ErrorRegistry = Record<string, ErrorFactory>
|
|
368
|
+
|
|
369
|
+
// ── Client Instance ──────────────────────────────────────
|
|
370
|
+
|
|
371
|
+
export interface ClientInstance {
|
|
372
|
+
basePath: string
|
|
373
|
+
adapter: ClientAdapter
|
|
374
|
+
hooks: ClientHooks
|
|
375
|
+
defaults: ProcedureCallDefaults
|
|
376
|
+
/** Optional registry for runtime dispatch of typed errors by `body.name`. */
|
|
377
|
+
errorRegistry?: ErrorRegistry
|
|
378
|
+
call<TResponse>(descriptor: CallDescriptor, options?: ProcedureCallOptions): Promise<TResponse>
|
|
379
|
+
safeCall<TResponse, ETyped = never>(
|
|
380
|
+
descriptor: CallDescriptor,
|
|
381
|
+
options?: ProcedureCallOptions,
|
|
382
|
+
): Promise<Result<TResponse, ETyped>>
|
|
383
|
+
stream<TYield, TReturn>(descriptor: StreamDescriptor, options?: ProcedureCallOptions): TypedStream<TYield, TReturn>
|
|
384
|
+
/**
|
|
385
|
+
* Wires a callable with a `.safe` sibling for routes without declared typed errors.
|
|
386
|
+
* Used by codegen to produce a compact one-line callable per route.
|
|
387
|
+
*
|
|
388
|
+
* The returned function's `.name` is set to `descriptor.name` for nicer stack traces.
|
|
389
|
+
*/
|
|
390
|
+
bindCallable<TParams, TResponse>(
|
|
391
|
+
descriptor: Omit<CallDescriptor, 'params'>,
|
|
392
|
+
): {
|
|
393
|
+
(params: TParams, options?: ProcedureCallOptions): Promise<TResponse>
|
|
394
|
+
safe(params: TParams, options?: ProcedureCallOptions): Promise<ResultNoTyped<TResponse>>
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Wires a callable with a `.safe` sibling for routes with declared typed errors.
|
|
398
|
+
* The `.safe` form returns `Result<TResponse, ETyped>` where `ETyped` is the
|
|
399
|
+
* union of route-declared error classes.
|
|
400
|
+
*
|
|
401
|
+
* The returned function's `.name` is set to `descriptor.name` for nicer stack traces.
|
|
402
|
+
*/
|
|
403
|
+
bindCallableTyped<TParams, TResponse, ETyped>(
|
|
404
|
+
descriptor: Omit<CallDescriptor, 'params'>,
|
|
405
|
+
): {
|
|
406
|
+
(params: TParams, options?: ProcedureCallOptions): Promise<TResponse>
|
|
407
|
+
safe(params: TParams, options?: ProcedureCallOptions): Promise<Result<TResponse, ETyped>>
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// ── createClient Config ──────────────────────────────────
|
|
412
|
+
|
|
413
|
+
export interface CreateClientConfig<TScopes> {
|
|
414
|
+
adapter: ClientAdapter
|
|
415
|
+
basePath: string
|
|
416
|
+
scopes: (client: ClientInstance) => TScopes
|
|
417
|
+
hooks?: ClientHooks
|
|
418
|
+
/**
|
|
419
|
+
* Default request options applied to every call. Per-call options override
|
|
420
|
+
* these (except `signal`, which combines via AbortSignal.any — whichever
|
|
421
|
+
* fires first cancels the request).
|
|
422
|
+
*/
|
|
423
|
+
defaults?: ProcedureCallDefaults
|
|
424
|
+
/**
|
|
425
|
+
* Optional error-dispatch registry. When a non-2xx response body has a
|
|
426
|
+
* `name` field matching a registry key, the client throws the typed error
|
|
427
|
+
* constructed via that entry's `fromResponse`. When absent or when no key
|
|
428
|
+
* matches, falls back to `ClientHttpError` (transport error shape).
|
|
429
|
+
*/
|
|
430
|
+
errorRegistry?: ErrorRegistry
|
|
431
|
+
/**
|
|
432
|
+
* Returns the current bearer token, re-evaluated per request (so a rotating
|
|
433
|
+
* token never goes stale). Wired internally to the `Authorization: Bearer
|
|
434
|
+
* <token>` header — a `null`/`undefined` token omits the header entirely.
|
|
435
|
+
*
|
|
436
|
+
* This is sugar over a function-valued `defaults.headers`; it composes with
|
|
437
|
+
* `defaults.headers` (both are applied, auth last) and is still subject to
|
|
438
|
+
* per-call `headers` and `onBeforeRequest`, which run after and can override.
|
|
439
|
+
*
|
|
440
|
+
* @example
|
|
441
|
+
* ```ts
|
|
442
|
+
* createClient({ adapter, basePath, auth: () => session.token, scopes })
|
|
443
|
+
* ```
|
|
444
|
+
*/
|
|
445
|
+
auth?: () => string | null | undefined | Promise<string | null | undefined>
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// ── Result Types ─────────────────────────────────────────
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Augmentable map of `kind` discriminant → error class for the framework's
|
|
453
|
+
* non-typed failure categories. Mirrors the `RequestMeta` augmentation
|
|
454
|
+
* pattern: extend via TypeScript declaration merging.
|
|
455
|
+
*
|
|
456
|
+
* @example
|
|
457
|
+
* ```ts
|
|
458
|
+
* declare module 'ts-procedures/client' {
|
|
459
|
+
* interface ClientErrorMap {
|
|
460
|
+
* rateLimited: MyRateLimitError
|
|
461
|
+
* paymentRequired: MyPaymentError
|
|
462
|
+
* }
|
|
463
|
+
* }
|
|
464
|
+
* ```
|
|
465
|
+
*
|
|
466
|
+
* **`'typed'` is reserved** — it's the discriminant used by `Result` for
|
|
467
|
+
* route-declared errors and is not part of `ClientErrorMap`. Attempting to
|
|
468
|
+
* register it produces a TS error about overlapping discriminants.
|
|
469
|
+
*/
|
|
470
|
+
export interface ClientErrorMap {
|
|
471
|
+
http: ClientHttpError
|
|
472
|
+
network: ClientNetworkError
|
|
473
|
+
timeout: ClientTimeoutError
|
|
474
|
+
aborted: ClientAbortError
|
|
475
|
+
parse: ClientParseError
|
|
476
|
+
usage: ClientPathParamError
|
|
477
|
+
unknown: unknown
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/** Distributed union of every framework failure kind. */
|
|
481
|
+
export type FrameworkFailure = {
|
|
482
|
+
[K in keyof ClientErrorMap]: { ok: false; kind: K; error: ClientErrorMap[K] }
|
|
483
|
+
}[keyof ClientErrorMap]
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Discriminated result type for the `.safe()` form. `kind: 'typed'` carries
|
|
487
|
+
* route-declared errors (registry-dispatched); other kinds carry framework
|
|
488
|
+
* failures. Use `ResultNoTyped<T>` for routes without declared errors.
|
|
489
|
+
*/
|
|
490
|
+
export type Result<T, ETyped> =
|
|
491
|
+
| { ok: true; value: T }
|
|
492
|
+
| { ok: false; kind: 'typed'; error: ETyped }
|
|
493
|
+
| FrameworkFailure
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* `Result` for routes that don't declare typed errors. Omits the `'typed'`
|
|
497
|
+
* arm entirely so IDE hovers stay clean (TS doesn't collapse `never`-payload
|
|
498
|
+
* arms in tooltip output).
|
|
499
|
+
*/
|
|
500
|
+
export type ResultNoTyped<T> =
|
|
501
|
+
| { ok: true; value: T }
|
|
502
|
+
| FrameworkFailure
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Auto-generated by ts-procedures-codegen (v8.6.0) — do not edit
|
|
2
|
+
// Source hash: cb5f789247045d83e6eb2611821116bb
|
|
3
|
+
import type { ClientInstance, ProcedureCallOptions } from './_types'
|
|
4
|
+
|
|
5
|
+
export namespace BillingReports {
|
|
6
|
+
export namespace GenerateReport {
|
|
7
|
+
export type Params = { month: string; }
|
|
8
|
+
export type Response = { url: string; }
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Binds every callable in this scope to a configured client. */
|
|
12
|
+
export function bindScope(client: ClientInstance) {
|
|
13
|
+
return {
|
|
14
|
+
/**
|
|
15
|
+
* POST /billing-reports/generate-report/1
|
|
16
|
+
*
|
|
17
|
+
* @param options Optional per-call {@link ProcedureCallOptions} —
|
|
18
|
+
* `signal` (cancel on dispose), `timeout`, `headers`, `basePath`.
|
|
19
|
+
*/
|
|
20
|
+
GenerateReport: client.bindCallable<BillingReports.GenerateReport.Params, BillingReports.GenerateReport.Response>({
|
|
21
|
+
name: 'GenerateReport',
|
|
22
|
+
scope: 'billing-reports',
|
|
23
|
+
path: '/billing-reports/generate-report/1',
|
|
24
|
+
method: 'post',
|
|
25
|
+
kind: 'rpc',
|
|
26
|
+
}),
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Auto-generated by ts-procedures-codegen (v8.6.0) — do not edit
|
|
2
|
+
// Source hash: cb5f789247045d83e6eb2611821116bb
|
|
3
|
+
import type { ClientInstance, ProcedureCallOptions } from './_types'
|
|
4
|
+
import type { ApiErrors } from './_errors'
|
|
5
|
+
import type { Invoice } from './_models'
|
|
6
|
+
|
|
7
|
+
export namespace Billing {
|
|
8
|
+
export namespace GetInvoice {
|
|
9
|
+
export namespace Req {
|
|
10
|
+
export type PathParams = { id: string; }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type Req = { pathParams: Req.PathParams }
|
|
14
|
+
|
|
15
|
+
export namespace Response {
|
|
16
|
+
export type Body = Invoice
|
|
17
|
+
}
|
|
18
|
+
export type Errors = ApiErrors.NotFound
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export namespace ListInvoices {
|
|
22
|
+
export namespace Req {
|
|
23
|
+
export type Query = { status?: "open" | "paid"; limit?: number; }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type Req = { query: Req.Query }
|
|
27
|
+
|
|
28
|
+
export namespace Response {
|
|
29
|
+
export type Body = { items: Array<Invoice>; }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Binds every callable in this scope to a configured client. */
|
|
34
|
+
export function bindScope(client: ClientInstance) {
|
|
35
|
+
return {
|
|
36
|
+
/**
|
|
37
|
+
* GET /billing/invoices/:id
|
|
38
|
+
*
|
|
39
|
+
* @param options Optional per-call {@link ProcedureCallOptions} —
|
|
40
|
+
* `signal` (cancel on dispose), `timeout`, `headers`, `basePath`.
|
|
41
|
+
* @throws Declared typed errors: {@link Billing.GetInvoice.Errors}. Narrow with
|
|
42
|
+
* `instanceof` on the throwing path, or call `.safe()` for a `Result`.
|
|
43
|
+
*/
|
|
44
|
+
GetInvoice: client.bindCallableTyped<Billing.GetInvoice.Req, Billing.GetInvoice.Response.Body, Billing.GetInvoice.Errors>({
|
|
45
|
+
name: 'GetInvoice',
|
|
46
|
+
scope: 'billing',
|
|
47
|
+
path: '/billing/invoices/:id',
|
|
48
|
+
method: 'GET',
|
|
49
|
+
kind: 'api',
|
|
50
|
+
}),
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* GET /billing/invoices
|
|
54
|
+
*
|
|
55
|
+
* @param options Optional per-call {@link ProcedureCallOptions} —
|
|
56
|
+
* `signal` (cancel on dispose), `timeout`, `headers`, `basePath`.
|
|
57
|
+
*/
|
|
58
|
+
ListInvoices: client.bindCallable<Billing.ListInvoices.Req, Billing.ListInvoices.Response.Body>({
|
|
59
|
+
name: 'ListInvoices',
|
|
60
|
+
scope: 'billing',
|
|
61
|
+
path: '/billing/invoices',
|
|
62
|
+
method: 'GET',
|
|
63
|
+
kind: 'api',
|
|
64
|
+
}),
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|