@lovrozagar/honey 0.7.3 → 1.0.0-rc.1
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/LICENSE +21 -0
- package/README.md +36 -1969
- package/bin/honey.js +87 -27
- package/dist/adapters/bun/serve.d.ts +18 -0
- package/dist/adapters/bun/serve.js +89 -0
- package/dist/adapters/fetch-request.d.ts +20 -0
- package/dist/adapters/fetch-request.js +29 -0
- package/dist/adapters/node/headers.d.ts +27 -0
- package/dist/adapters/node/headers.js +86 -0
- package/dist/adapters/node/request.d.ts +16 -0
- package/dist/adapters/node/request.js +214 -0
- package/dist/adapters/node/response.d.ts +11 -0
- package/dist/adapters/node/response.js +126 -0
- package/dist/adapters/node/serve.d.ts +39 -0
- package/dist/adapters/node/serve.js +205 -0
- package/dist/adapters/node/url.d.ts +13 -0
- package/dist/adapters/node/url.js +87 -0
- package/dist/adapters/serve.d.ts +36 -0
- package/dist/adapters/serve.js +52 -0
- package/dist/build/artifacts.d.ts +34 -0
- package/dist/build/artifacts.js +123 -0
- package/dist/build/cli-args.d.ts +30 -0
- package/dist/build/cli-args.js +97 -0
- package/dist/build/cli.d.ts +11 -0
- package/dist/build/cli.js +150 -0
- package/dist/build/config.d.ts +102 -0
- package/dist/build/config.js +89 -0
- package/dist/build/generate.d.ts +19 -0
- package/dist/build/generate.js +80 -0
- package/dist/build/glob.d.ts +8 -0
- package/dist/build/glob.js +97 -0
- package/dist/build/index.d.ts +3 -58
- package/dist/build/index.js +3 -173
- package/dist/build/init.d.ts +3 -0
- package/dist/build/init.js +131 -0
- package/dist/build/loaders.d.ts +33 -0
- package/dist/build/loaders.js +105 -0
- package/dist/build/plugin.d.ts +52 -0
- package/dist/build/plugin.js +146 -0
- package/dist/build/source.d.ts +21 -0
- package/dist/build/source.js +100 -0
- package/dist/build/targets.d.ts +59 -0
- package/dist/build/targets.js +107 -0
- package/dist/context/context.d.ts +111 -0
- package/dist/context/context.js +213 -0
- package/dist/context/cookie-sign.d.ts +38 -0
- package/dist/context/cookie-sign.js +113 -0
- package/dist/context/cookie.d.ts +28 -0
- package/dist/context/cookie.js +142 -0
- package/dist/context/peer.d.ts +34 -0
- package/dist/context/peer.js +190 -0
- package/dist/errors/error.d.ts +60 -0
- package/dist/errors/error.js +84 -0
- package/dist/errors/errors.d.ts +45 -0
- package/dist/errors/errors.js +31 -0
- package/dist/errors/on-error.d.ts +10 -0
- package/dist/errors/on-error.js +204 -0
- package/dist/errors/problem-json.d.ts +14 -0
- package/dist/errors/problem-json.js +58 -0
- package/dist/errors/projector.d.ts +50 -0
- package/dist/errors/projector.js +107 -0
- package/dist/i18n/error-i18n.d.ts +26 -0
- package/dist/i18n/error-i18n.js +77 -0
- package/dist/i18n/i18n.d.ts +21 -0
- package/dist/i18n/i18n.js +40 -0
- package/dist/i18n/icu.d.ts +29 -0
- package/dist/i18n/icu.js +170 -0
- package/dist/i18n/index.d.ts +4 -0
- package/dist/i18n/index.js +3 -0
- package/dist/index.d.ts +30 -746
- package/dist/index.js +12 -2364
- package/dist/input/accepts.d.ts +5 -0
- package/dist/input/accepts.js +105 -0
- package/dist/input/binary.d.ts +20 -0
- package/dist/input/binary.js +40 -0
- package/dist/input/body-kind.d.ts +15 -0
- package/dist/input/body-kind.js +47 -0
- package/dist/input/body-limit.d.ts +21 -0
- package/dist/input/body-limit.js +99 -0
- package/dist/input/cookies.d.ts +7 -0
- package/dist/input/cookies.js +8 -0
- package/dist/input/form.d.ts +10 -0
- package/dist/input/form.js +24 -0
- package/dist/input/headers.d.ts +7 -0
- package/dist/input/headers.js +8 -0
- package/dist/input/input.d.ts +91 -0
- package/dist/input/input.js +88 -0
- package/dist/input/json.d.ts +10 -0
- package/dist/input/json.js +22 -0
- package/dist/input/params.d.ts +7 -0
- package/dist/input/params.js +8 -0
- package/dist/input/query.d.ts +10 -0
- package/dist/input/query.js +17 -0
- package/dist/mcp/mount.d.ts +116 -0
- package/dist/mcp/mount.js +45 -0
- package/dist/mcp/oauth.d.ts +14 -0
- package/dist/mcp/oauth.js +88 -0
- package/dist/mcp/uploads.d.ts +36 -0
- package/dist/mcp/uploads.js +171 -0
- package/dist/mcp/url-files.d.ts +32 -0
- package/dist/mcp/url-files.js +75 -0
- package/dist/meta/meta-spec-apply.d.ts +25 -0
- package/dist/meta/meta-spec-apply.js +83 -0
- package/dist/meta/meta-spec-merge.d.ts +103 -0
- package/dist/meta/meta-spec-merge.js +50 -0
- package/dist/meta/meta-spec-validate.d.ts +61 -0
- package/dist/meta/meta-spec-validate.js +166 -0
- package/dist/meta/meta-spec.d.ts +49 -0
- package/dist/meta/meta-spec.js +197 -0
- package/dist/middleware/compress.d.ts +15 -0
- package/dist/middleware/compress.js +93 -0
- package/dist/middleware/cors.d.ts +18 -0
- package/dist/middleware/cors.js +80 -0
- package/dist/middleware/csrf.d.ts +11 -0
- package/dist/middleware/csrf.js +65 -0
- package/dist/middleware/ip-restrict.d.ts +10 -0
- package/dist/middleware/ip-restrict.js +82 -0
- package/dist/middleware/middleware.d.ts +53 -0
- package/dist/middleware/middleware.js +112 -0
- package/dist/middleware/powered-by.d.ts +6 -0
- package/dist/middleware/powered-by.js +13 -0
- package/dist/middleware/rate-limit.d.ts +40 -0
- package/dist/middleware/rate-limit.js +90 -0
- package/dist/middleware/request-id.d.ts +25 -0
- package/dist/middleware/request-id.js +30 -0
- package/dist/middleware/secure-headers.d.ts +18 -0
- package/dist/middleware/secure-headers.js +36 -0
- package/dist/middleware/server-timing.d.ts +8 -0
- package/dist/middleware/server-timing.js +52 -0
- package/dist/middleware/timeout.d.ts +6 -0
- package/dist/middleware/timeout.js +29 -0
- package/dist/observability/curl-logger.d.ts +46 -0
- package/dist/observability/curl-logger.js +175 -0
- package/dist/observability/request-to-curl.d.ts +17 -0
- package/dist/observability/request-to-curl.js +47 -0
- package/dist/openapi/collect.d.ts +56 -18
- package/dist/openapi/collect.js +109 -23
- package/dist/openapi/components.d.ts +9 -0
- package/dist/openapi/components.js +90 -0
- package/dist/openapi/docs-page.d.ts +20 -18
- package/dist/openapi/docs-page.js +28 -46
- package/dist/openapi/document.d.ts +33 -26
- package/dist/openapi/document.js +21 -780
- package/dist/openapi/extract-schemas.d.ts +11 -0
- package/dist/openapi/extract-schemas.js +31 -0
- package/dist/openapi/generate.d.ts +47 -0
- package/dist/openapi/generate.js +180 -0
- package/dist/openapi/manifest.d.ts +41 -0
- package/dist/openapi/manifest.js +49 -0
- package/dist/openapi/output-keys.d.ts +6 -0
- package/dist/openapi/output-keys.js +24 -0
- package/dist/openapi/paths.d.ts +35 -0
- package/dist/openapi/paths.js +175 -0
- package/dist/openapi/register.d.ts +14 -3
- package/dist/openapi/register.js +13 -20
- package/dist/openapi/responses.d.ts +44 -0
- package/dist/openapi/responses.js +159 -0
- package/dist/openapi/scalar.d.ts +4 -14
- package/dist/openapi/scalar.js +5 -7
- package/dist/openapi/security.d.ts +4 -0
- package/dist/openapi/security.js +25 -0
- package/dist/openapi/serve.d.ts +25 -9
- package/dist/openapi/serve.js +108 -29
- package/dist/openapi/servers.d.ts +19 -0
- package/dist/openapi/servers.js +72 -0
- package/dist/openapi/swagger.d.ts +4 -14
- package/dist/openapi/swagger.js +5 -7
- package/dist/openapi/tags.d.ts +20 -0
- package/dist/openapi/tags.js +20 -0
- package/dist/openapi/webhooks.d.ts +19 -0
- package/dist/openapi/webhooks.js +70 -0
- package/dist/openapi/yaml.d.ts +8 -0
- package/dist/openapi/yaml.js +74 -0
- package/dist/proxy/headers.d.ts +30 -0
- package/dist/proxy/headers.js +86 -0
- package/dist/proxy/proxy.d.ts +39 -0
- package/dist/proxy/proxy.js +103 -0
- package/dist/proxy/upstream.d.ts +30 -0
- package/dist/proxy/upstream.js +116 -0
- package/dist/realtime/bus.d.ts +10 -13
- package/dist/realtime/bus.js +48 -93
- package/dist/realtime/invoke-user.d.ts +36 -0
- package/dist/realtime/invoke-user.js +103 -0
- package/dist/realtime/realtime.d.ts +7 -0
- package/dist/realtime/realtime.js +40 -0
- package/dist/realtime/route.d.ts +33 -27
- package/dist/realtime/route.js +27 -43
- package/dist/realtime/server.d.ts +24 -28
- package/dist/realtime/server.js +202 -225
- package/dist/response/binary.d.ts +18 -0
- package/dist/response/binary.js +10 -0
- package/dist/response/builder.d.ts +73 -0
- package/dist/response/builder.js +214 -0
- package/dist/response/cache-control.d.ts +30 -0
- package/dist/response/cache-control.js +74 -0
- package/dist/response/etag.d.ts +15 -0
- package/dist/response/etag.js +83 -0
- package/dist/response/media-type.d.ts +28 -0
- package/dist/response/media-type.js +97 -0
- package/dist/response/out-headers.d.ts +31 -0
- package/dist/response/out-headers.js +130 -0
- package/dist/response/pretty-json.d.ts +10 -0
- package/dist/response/pretty-json.js +44 -0
- package/dist/response/range.d.ts +19 -0
- package/dist/response/range.js +98 -0
- package/dist/response/response-headers.d.ts +11 -0
- package/dist/response/response-headers.js +21 -0
- package/dist/response/response.d.ts +69 -0
- package/dist/response/response.js +208 -0
- package/dist/response/sse.d.ts +41 -0
- package/dist/response/sse.js +73 -0
- package/dist/response/static.d.ts +20 -0
- package/dist/response/static.js +181 -0
- package/dist/response/status.d.ts +5 -0
- package/dist/response/status.js +68 -0
- package/dist/response/with-headers.d.ts +11 -0
- package/dist/response/with-headers.js +47 -0
- package/dist/routing/app-types.d.ts +181 -0
- package/dist/routing/app-types.js +1 -0
- package/dist/routing/app.d.ts +76 -0
- package/dist/routing/app.js +137 -0
- package/dist/routing/codegen-types.d.ts +17 -0
- package/dist/routing/codegen-types.js +1 -0
- package/dist/routing/delegate.d.ts +9 -0
- package/dist/routing/delegate.js +75 -0
- package/dist/routing/dispatch.d.ts +22 -0
- package/dist/routing/dispatch.js +255 -0
- package/dist/routing/finalize.d.ts +47 -0
- package/dist/routing/finalize.js +169 -0
- package/dist/routing/gateway-tree.d.ts +19 -0
- package/dist/routing/gateway-tree.js +74 -0
- package/dist/routing/invalidate-check.d.ts +58 -0
- package/dist/routing/invalidate-check.js +124 -0
- package/dist/routing/match.d.ts +22 -0
- package/dist/routing/match.js +108 -0
- package/dist/routing/middleware-chain.d.ts +16 -0
- package/dist/routing/middleware-chain.js +41 -0
- package/dist/routing/output-types.d.ts +91 -0
- package/dist/routing/output-types.js +1 -0
- package/dist/routing/pattern.d.ts +55 -0
- package/dist/routing/pattern.js +219 -0
- package/dist/routing/record.d.ts +18 -0
- package/dist/routing/record.js +4 -0
- package/dist/routing/register.d.ts +135 -0
- package/dist/routing/register.js +155 -0
- package/dist/routing/request-path.d.ts +30 -0
- package/dist/routing/request-path.js +173 -0
- package/dist/routing/route-builder.d.ts +160 -0
- package/dist/routing/route-builder.js +86 -0
- package/dist/routing/route-tree.d.ts +18 -0
- package/dist/routing/route-tree.js +91 -0
- package/dist/routing/settings-chain.d.ts +75 -0
- package/dist/routing/settings-chain.js +137 -0
- package/dist/routing/settings.d.ts +90 -0
- package/dist/routing/settings.js +44 -0
- package/dist/routing/tap.d.ts +31 -0
- package/dist/routing/tap.js +77 -0
- package/dist/routing/tree-merge.d.ts +7 -0
- package/dist/routing/tree-merge.js +77 -0
- package/dist/routing/tree.d.ts +85 -0
- package/dist/routing/tree.js +196 -0
- package/dist/routing/types.d.ts +20 -0
- package/dist/routing/types.js +1 -0
- package/dist/routing/ws-builder.d.ts +62 -0
- package/dist/routing/ws-builder.js +109 -0
- package/dist/runtime/detect-runtime.d.ts +16 -0
- package/dist/runtime/detect-runtime.js +11 -0
- package/dist/runtime/optional-peer.d.ts +10 -0
- package/dist/runtime/optional-peer.js +19 -0
- package/dist/schema/arktype.d.ts +7 -0
- package/dist/schema/arktype.js +13 -0
- package/dist/schema/canonicalize.d.ts +8 -0
- package/dist/schema/canonicalize.js +19 -0
- package/dist/schema/effect.d.ts +7 -0
- package/dist/schema/effect.js +4 -0
- package/dist/schema/naming.d.ts +31 -0
- package/dist/schema/naming.js +116 -0
- package/dist/schema/sanitize-spec.d.ts +15 -0
- package/dist/schema/sanitize-spec.js +43 -0
- package/dist/schema/slots.d.ts +15 -0
- package/dist/schema/slots.js +179 -0
- package/dist/schema/to-json-schema.d.ts +34 -0
- package/dist/schema/to-json-schema.js +94 -0
- package/dist/schema/valibot.d.ts +4 -0
- package/dist/schema/valibot.js +153 -0
- package/dist/schema/yup.d.ts +3 -0
- package/dist/schema/yup.js +57 -0
- package/dist/schema/zod.d.ts +6 -0
- package/dist/schema/zod.js +192 -0
- package/dist/security/crypto.d.ts +7 -0
- package/dist/security/crypto.js +30 -0
- package/dist/streaming/producer-stream.d.ts +45 -0
- package/dist/streaming/producer-stream.js +251 -0
- package/dist/telemetry/fields.d.ts +43 -0
- package/dist/telemetry/fields.js +64 -0
- package/dist/telemetry/log-format.d.ts +7 -0
- package/dist/telemetry/log-format.js +43 -0
- package/dist/telemetry/logger.d.ts +44 -0
- package/dist/telemetry/logger.js +122 -0
- package/dist/telemetry/otel-subpath.d.ts +7 -0
- package/dist/telemetry/otel-subpath.js +5 -0
- package/dist/telemetry/otel.d.ts +50 -57
- package/dist/telemetry/otel.js +54 -130
- package/dist/telemetry/request-log.d.ts +22 -0
- package/dist/telemetry/request-log.js +83 -0
- package/dist/telemetry/request-trace.d.ts +123 -0
- package/dist/telemetry/request-trace.js +199 -0
- package/dist/telemetry/span-lifecycle.d.ts +11 -0
- package/dist/telemetry/span-lifecycle.js +114 -0
- package/dist/telemetry/traceparent.d.ts +40 -0
- package/dist/telemetry/traceparent.js +73 -0
- package/dist/testing/testing.d.ts +42 -0
- package/dist/testing/testing.js +101 -0
- package/dist/validation/content-type.d.ts +21 -0
- package/dist/validation/content-type.js +42 -0
- package/dist/validation/standard-schema.d.ts +41 -0
- package/dist/validation/standard-schema.js +5 -0
- package/dist/validation/validate-input.d.ts +45 -0
- package/dist/validation/validate-input.js +174 -0
- package/dist/validation/validate-output.d.ts +34 -0
- package/dist/validation/validate-output.js +107 -0
- package/dist/ws/bun.d.ts +30 -25
- package/dist/ws/bun.js +42 -46
- package/dist/ws/cloudflare.d.ts +6 -75
- package/dist/ws/cloudflare.js +37 -104
- package/dist/ws/contract.d.ts +74 -0
- package/dist/ws/contract.js +83 -0
- package/dist/ws/node.d.ts +12 -21
- package/dist/ws/node.js +103 -151
- package/dist/ws/origin.d.ts +23 -0
- package/dist/ws/origin.js +48 -0
- package/dist/ws/route.d.ts +14 -0
- package/dist/ws/route.js +5 -0
- package/dist/ws/session.d.ts +15 -6
- package/dist/ws/session.js +22 -23
- package/dist/ws/shared.d.ts +23 -33
- package/dist/ws/shared.js +53 -39
- package/package.json +169 -251
- package/dist/accepts.d.ts +0 -12
- package/dist/accepts.d.ts.map +0 -1
- package/dist/accepts.js +0 -126
- package/dist/accepts.js.map +0 -1
- package/dist/body-kind.d.ts +0 -26
- package/dist/body-kind.d.ts.map +0 -1
- package/dist/body-kind.js +0 -70
- package/dist/body-kind.js.map +0 -1
- package/dist/body-limit.d.ts +0 -26
- package/dist/body-limit.d.ts.map +0 -1
- package/dist/body-limit.js +0 -126
- package/dist/body-limit.js.map +0 -1
- package/dist/build/index.d.ts.map +0 -1
- package/dist/build/index.js.map +0 -1
- package/dist/cli-args.d.ts +0 -33
- package/dist/cli-args.d.ts.map +0 -1
- package/dist/cli-args.js +0 -102
- package/dist/cli-args.js.map +0 -1
- package/dist/cli-go/auth.go +0 -26
- package/dist/cli-go/config.go +0 -192
- package/dist/cli-go/errors.go +0 -75
- package/dist/cli-go/multipart.go +0 -79
- package/dist/cli-go/output.go +0 -163
- package/dist/cli-go/root.go +0 -30
- package/dist/cli-go/stream.go +0 -88
- package/dist/cli-go/version.go +0 -5
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -209
- package/dist/cli.js.map +0 -1
- package/dist/client/defaults.d.ts +0 -12
- package/dist/client/defaults.d.ts.map +0 -1
- package/dist/client/defaults.js +0 -48
- package/dist/client/defaults.js.map +0 -1
- package/dist/client/error.d.ts +0 -49
- package/dist/client/error.d.ts.map +0 -1
- package/dist/client/error.js +0 -71
- package/dist/client/error.js.map +0 -1
- package/dist/client/http.d.ts +0 -155
- package/dist/client/http.d.ts.map +0 -1
- package/dist/client/http.js +0 -571
- package/dist/client/http.js.map +0 -1
- package/dist/client/index.d.ts +0 -23
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -95
- package/dist/client/index.js.map +0 -1
- package/dist/client/path.d.ts +0 -26
- package/dist/client/path.d.ts.map +0 -1
- package/dist/client/path.js +0 -163
- package/dist/client/path.js.map +0 -1
- package/dist/client/redirect-policy.d.ts +0 -12
- package/dist/client/redirect-policy.d.ts.map +0 -1
- package/dist/client/redirect-policy.js +0 -20
- package/dist/client/redirect-policy.js.map +0 -1
- package/dist/client/sdk.d.ts +0 -70
- package/dist/client/sdk.d.ts.map +0 -1
- package/dist/client/sdk.js +0 -292
- package/dist/client/sdk.js.map +0 -1
- package/dist/client/sse.d.ts +0 -23
- package/dist/client/sse.d.ts.map +0 -1
- package/dist/client/sse.js +0 -129
- package/dist/client/sse.js.map +0 -1
- package/dist/client/types.d.ts +0 -124
- package/dist/client/types.d.ts.map +0 -1
- package/dist/client/types.js +0 -2
- package/dist/client/types.js.map +0 -1
- package/dist/client/ws.d.ts +0 -22
- package/dist/client/ws.d.ts.map +0 -1
- package/dist/client/ws.js +0 -112
- package/dist/client/ws.js.map +0 -1
- package/dist/client-go/errors.go +0 -236
- package/dist/client-go/export.go +0 -44
- package/dist/client-go/invalidation.go +0 -371
- package/dist/client-go/nullable.go +0 -62
- package/dist/client-go/realtime.go +0 -354
- package/dist/client-go/result.go +0 -20
- package/dist/client-go/runtime.go +0 -975
- package/dist/client-go/sse.go +0 -159
- package/dist/client-go/transport.go +0 -495
- package/dist/client-go/ws.go +0 -128
- package/dist/client-info.d.ts +0 -36
- package/dist/client-info.d.ts.map +0 -1
- package/dist/client-info.js +0 -53
- package/dist/client-info.js.map +0 -1
- package/dist/client-mcp/README.md +0 -10
- package/dist/client-mcp/server.ts +0 -221
- package/dist/client-mcp/types.ts +0 -19
- package/dist/client-python/_errors.py +0 -115
- package/dist/client-python/_invalidation.py +0 -494
- package/dist/client-python/_realtime.py +0 -179
- package/dist/client-python/_runtime.py +0 -860
- package/dist/client-python/_sse.py +0 -155
- package/dist/client-python/_transport.py +0 -366
- package/dist/client-python/_ws.py +0 -159
- package/dist/client-python/py.typed +0 -0
- package/dist/client-rust/errors.rs +0 -220
- package/dist/client-rust/invalidation.rs +0 -412
- package/dist/client-rust/invalidation_sync.rs +0 -93
- package/dist/client-rust/nullable.rs +0 -17
- package/dist/client-rust/realtime.rs +0 -702
- package/dist/client-rust/result.rs +0 -22
- package/dist/client-rust/runtime.rs +0 -980
- package/dist/client-rust/runtime_sync.rs +0 -484
- package/dist/client-rust/sse.rs +0 -188
- package/dist/client-rust/ws.rs +0 -167
- package/dist/codegen-go-cli.d.ts +0 -22
- package/dist/codegen-go-cli.d.ts.map +0 -1
- package/dist/codegen-go-cli.js +0 -964
- package/dist/codegen-go-cli.js.map +0 -1
- package/dist/codegen-go.d.ts +0 -41
- package/dist/codegen-go.d.ts.map +0 -1
- package/dist/codegen-go.js +0 -872
- package/dist/codegen-go.js.map +0 -1
- package/dist/codegen-hash.d.ts +0 -3
- package/dist/codegen-hash.d.ts.map +0 -1
- package/dist/codegen-hash.js +0 -9
- package/dist/codegen-hash.js.map +0 -1
- package/dist/codegen-ir.d.ts +0 -190
- package/dist/codegen-ir.d.ts.map +0 -1
- package/dist/codegen-ir.js +0 -661
- package/dist/codegen-ir.js.map +0 -1
- package/dist/codegen-lang.d.ts +0 -65
- package/dist/codegen-lang.d.ts.map +0 -1
- package/dist/codegen-lang.js +0 -526
- package/dist/codegen-lang.js.map +0 -1
- package/dist/codegen-load.d.ts +0 -31
- package/dist/codegen-load.d.ts.map +0 -1
- package/dist/codegen-load.js +0 -138
- package/dist/codegen-load.js.map +0 -1
- package/dist/codegen-loaders.d.ts +0 -12
- package/dist/codegen-loaders.d.ts.map +0 -1
- package/dist/codegen-loaders.js +0 -55
- package/dist/codegen-loaders.js.map +0 -1
- package/dist/codegen-mcp.d.ts +0 -13
- package/dist/codegen-mcp.d.ts.map +0 -1
- package/dist/codegen-mcp.js +0 -368
- package/dist/codegen-mcp.js.map +0 -1
- package/dist/codegen-python.d.ts +0 -33
- package/dist/codegen-python.d.ts.map +0 -1
- package/dist/codegen-python.js +0 -828
- package/dist/codegen-python.js.map +0 -1
- package/dist/codegen-route-tree-intern.d.ts +0 -40
- package/dist/codegen-route-tree-intern.d.ts.map +0 -1
- package/dist/codegen-route-tree-intern.js +0 -221
- package/dist/codegen-route-tree-intern.js.map +0 -1
- package/dist/codegen-rust.d.ts +0 -18
- package/dist/codegen-rust.d.ts.map +0 -1
- package/dist/codegen-rust.js +0 -1293
- package/dist/codegen-rust.js.map +0 -1
- package/dist/codegen-sanitize.d.ts +0 -3
- package/dist/codegen-sanitize.d.ts.map +0 -1
- package/dist/codegen-sanitize.js +0 -56
- package/dist/codegen-sanitize.js.map +0 -1
- package/dist/codegen-schema-naming.d.ts +0 -27
- package/dist/codegen-schema-naming.d.ts.map +0 -1
- package/dist/codegen-schema-naming.js +0 -150
- package/dist/codegen-schema-naming.js.map +0 -1
- package/dist/codegen-sdk-model.d.ts +0 -71
- package/dist/codegen-sdk-model.d.ts.map +0 -1
- package/dist/codegen-sdk-model.js +0 -179
- package/dist/codegen-sdk-model.js.map +0 -1
- package/dist/codegen.d.ts +0 -187
- package/dist/codegen.d.ts.map +0 -1
- package/dist/codegen.js +0 -4619
- package/dist/codegen.js.map +0 -1
- package/dist/context.d.ts +0 -86
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -242
- package/dist/context.js.map +0 -1
- package/dist/cookie-sign.d.ts +0 -17
- package/dist/cookie-sign.d.ts.map +0 -1
- package/dist/cookie-sign.js +0 -104
- package/dist/cookie-sign.js.map +0 -1
- package/dist/cookie.d.ts +0 -24
- package/dist/cookie.d.ts.map +0 -1
- package/dist/cookie.js +0 -138
- package/dist/cookie.js.map +0 -1
- package/dist/cors.d.ts +0 -14
- package/dist/cors.d.ts.map +0 -1
- package/dist/cors.js +0 -87
- package/dist/cors.js.map +0 -1
- package/dist/crypto.d.ts +0 -7
- package/dist/crypto.d.ts.map +0 -1
- package/dist/crypto.js +0 -38
- package/dist/crypto.js.map +0 -1
- package/dist/csrf.d.ts +0 -28
- package/dist/csrf.d.ts.map +0 -1
- package/dist/csrf.js +0 -79
- package/dist/csrf.js.map +0 -1
- package/dist/curl-logger.d.ts +0 -44
- package/dist/curl-logger.d.ts.map +0 -1
- package/dist/curl-logger.js +0 -199
- package/dist/curl-logger.js.map +0 -1
- package/dist/detect-runtime.d.ts +0 -16
- package/dist/detect-runtime.d.ts.map +0 -1
- package/dist/detect-runtime.js +0 -13
- package/dist/detect-runtime.js.map +0 -1
- package/dist/dict.d.ts +0 -11
- package/dist/dict.d.ts.map +0 -1
- package/dist/dict.js +0 -13
- package/dist/dict.js.map +0 -1
- package/dist/error.d.ts +0 -21
- package/dist/error.d.ts.map +0 -1
- package/dist/error.js +0 -44
- package/dist/error.js.map +0 -1
- package/dist/errors.d.ts +0 -40
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -39
- package/dist/errors.js.map +0 -1
- package/dist/etag.d.ts +0 -11
- package/dist/etag.d.ts.map +0 -1
- package/dist/etag.js +0 -82
- package/dist/etag.js.map +0 -1
- package/dist/feature-detect.d.ts +0 -25
- package/dist/feature-detect.d.ts.map +0 -1
- package/dist/feature-detect.js +0 -144
- package/dist/feature-detect.js.map +0 -1
- package/dist/feature-load.d.ts +0 -3
- package/dist/feature-load.d.ts.map +0 -1
- package/dist/feature-load.js +0 -36
- package/dist/feature-load.js.map +0 -1
- package/dist/feature-slots.d.ts +0 -44
- package/dist/feature-slots.d.ts.map +0 -1
- package/dist/feature-slots.js +0 -48
- package/dist/feature-slots.js.map +0 -1
- package/dist/fetch-request.d.ts +0 -10
- package/dist/fetch-request.d.ts.map +0 -1
- package/dist/fetch-request.js +0 -13
- package/dist/fetch-request.js.map +0 -1
- package/dist/gen-process.d.ts +0 -15
- package/dist/gen-process.d.ts.map +0 -1
- package/dist/gen-process.js +0 -43
- package/dist/gen-process.js.map +0 -1
- package/dist/gen-write.d.ts +0 -19
- package/dist/gen-write.d.ts.map +0 -1
- package/dist/gen-write.js +0 -120
- package/dist/gen-write.js.map +0 -1
- package/dist/glob.d.ts +0 -21
- package/dist/glob.d.ts.map +0 -1
- package/dist/glob.js +0 -115
- package/dist/glob.js.map +0 -1
- package/dist/go-type-emitter.d.ts +0 -47
- package/dist/go-type-emitter.d.ts.map +0 -1
- package/dist/go-type-emitter.js +0 -594
- package/dist/go-type-emitter.js.map +0 -1
- package/dist/honey-response.d.ts +0 -82
- package/dist/honey-response.d.ts.map +0 -1
- package/dist/honey-response.js +0 -338
- package/dist/honey-response.js.map +0 -1
- package/dist/i18n-slot.d.ts +0 -15
- package/dist/i18n-slot.d.ts.map +0 -1
- package/dist/i18n-slot.js +0 -14
- package/dist/i18n-slot.js.map +0 -1
- package/dist/i18n.d.ts +0 -29
- package/dist/i18n.d.ts.map +0 -1
- package/dist/i18n.js +0 -250
- package/dist/i18n.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init.d.ts +0 -5
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -140
- package/dist/init.js.map +0 -1
- package/dist/input.d.ts +0 -6
- package/dist/input.d.ts.map +0 -1
- package/dist/input.js +0 -4
- package/dist/input.js.map +0 -1
- package/dist/invalidate-check.d.ts +0 -61
- package/dist/invalidate-check.d.ts.map +0 -1
- package/dist/invalidate-check.js +0 -163
- package/dist/invalidate-check.js.map +0 -1
- package/dist/invoke-user.d.ts +0 -35
- package/dist/invoke-user.d.ts.map +0 -1
- package/dist/invoke-user.js +0 -73
- package/dist/invoke-user.js.map +0 -1
- package/dist/ip-restrict.d.ts +0 -24
- package/dist/ip-restrict.d.ts.map +0 -1
- package/dist/ip-restrict.js +0 -60
- package/dist/ip-restrict.js.map +0 -1
- package/dist/ip.d.ts +0 -39
- package/dist/ip.d.ts.map +0 -1
- package/dist/ip.js +0 -209
- package/dist/ip.js.map +0 -1
- package/dist/logger.d.ts +0 -45
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -113
- package/dist/logger.js.map +0 -1
- package/dist/media-type.d.ts +0 -30
- package/dist/media-type.d.ts.map +0 -1
- package/dist/media-type.js +0 -97
- package/dist/media-type.js.map +0 -1
- package/dist/meta-spec-merge.d.ts +0 -32
- package/dist/meta-spec-merge.d.ts.map +0 -1
- package/dist/meta-spec-merge.js +0 -68
- package/dist/meta-spec-merge.js.map +0 -1
- package/dist/meta-spec.d.ts +0 -94
- package/dist/meta-spec.d.ts.map +0 -1
- package/dist/meta-spec.js +0 -535
- package/dist/meta-spec.js.map +0 -1
- package/dist/middleware.d.ts +0 -77
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js +0 -253
- package/dist/middleware.js.map +0 -1
- package/dist/node-request.d.ts +0 -104
- package/dist/node-request.d.ts.map +0 -1
- package/dist/node-request.js +0 -407
- package/dist/node-request.js.map +0 -1
- package/dist/node.d.ts +0 -30
- package/dist/node.d.ts.map +0 -1
- package/dist/node.js +0 -396
- package/dist/node.js.map +0 -1
- package/dist/openapi/collect.d.ts.map +0 -1
- package/dist/openapi/collect.js.map +0 -1
- package/dist/openapi/docs-page.d.ts.map +0 -1
- package/dist/openapi/docs-page.js.map +0 -1
- package/dist/openapi/document.d.ts.map +0 -1
- package/dist/openapi/document.js.map +0 -1
- package/dist/openapi/json-schema-slot.d.ts +0 -12
- package/dist/openapi/json-schema-slot.d.ts.map +0 -1
- package/dist/openapi/json-schema-slot.js +0 -38
- package/dist/openapi/json-schema-slot.js.map +0 -1
- package/dist/openapi/register.d.ts.map +0 -1
- package/dist/openapi/register.js.map +0 -1
- package/dist/openapi/scalar.d.ts.map +0 -1
- package/dist/openapi/scalar.js.map +0 -1
- package/dist/openapi/serve.d.ts.map +0 -1
- package/dist/openapi/serve.js.map +0 -1
- package/dist/openapi/spec-factory.d.ts +0 -65
- package/dist/openapi/spec-factory.d.ts.map +0 -1
- package/dist/openapi/spec-factory.js +0 -52
- package/dist/openapi/spec-factory.js.map +0 -1
- package/dist/openapi/spec.d.ts +0 -29
- package/dist/openapi/spec.d.ts.map +0 -1
- package/dist/openapi/spec.js +0 -50
- package/dist/openapi/spec.js.map +0 -1
- package/dist/openapi/swagger.d.ts.map +0 -1
- package/dist/openapi/swagger.js.map +0 -1
- package/dist/pattern.d.ts +0 -71
- package/dist/pattern.d.ts.map +0 -1
- package/dist/pattern.js +0 -239
- package/dist/pattern.js.map +0 -1
- package/dist/peer.d.ts +0 -17
- package/dist/peer.d.ts.map +0 -1
- package/dist/peer.js +0 -50
- package/dist/peer.js.map +0 -1
- package/dist/plugin.d.ts +0 -228
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -666
- package/dist/plugin.js.map +0 -1
- package/dist/powered-by.d.ts +0 -7
- package/dist/powered-by.d.ts.map +0 -1
- package/dist/powered-by.js +0 -11
- package/dist/powered-by.js.map +0 -1
- package/dist/pretty-json.d.ts +0 -10
- package/dist/pretty-json.d.ts.map +0 -1
- package/dist/pretty-json.js +0 -47
- package/dist/pretty-json.js.map +0 -1
- package/dist/producer-stream.d.ts +0 -47
- package/dist/producer-stream.d.ts.map +0 -1
- package/dist/producer-stream.js +0 -267
- package/dist/producer-stream.js.map +0 -1
- package/dist/proxy.d.ts +0 -90
- package/dist/proxy.d.ts.map +0 -1
- package/dist/proxy.js +0 -274
- package/dist/proxy.js.map +0 -1
- package/dist/python-type-emitter.d.ts +0 -24
- package/dist/python-type-emitter.d.ts.map +0 -1
- package/dist/python-type-emitter.js +0 -157
- package/dist/python-type-emitter.js.map +0 -1
- package/dist/realtime/bus.d.ts.map +0 -1
- package/dist/realtime/bus.js.map +0 -1
- package/dist/realtime/register.d.ts +0 -3
- package/dist/realtime/register.d.ts.map +0 -1
- package/dist/realtime/register.js +0 -10
- package/dist/realtime/register.js.map +0 -1
- package/dist/realtime/route.d.ts.map +0 -1
- package/dist/realtime/route.js.map +0 -1
- package/dist/realtime/server.d.ts.map +0 -1
- package/dist/realtime/server.js.map +0 -1
- package/dist/request-id.d.ts +0 -19
- package/dist/request-id.d.ts.map +0 -1
- package/dist/request-id.js +0 -16
- package/dist/request-id.js.map +0 -1
- package/dist/request-limits.d.ts +0 -3
- package/dist/request-limits.d.ts.map +0 -1
- package/dist/request-limits.js +0 -3
- package/dist/request-limits.js.map +0 -1
- package/dist/request-path.d.ts +0 -33
- package/dist/request-path.d.ts.map +0 -1
- package/dist/request-path.js +0 -178
- package/dist/request-path.js.map +0 -1
- package/dist/request-to-curl.d.ts +0 -15
- package/dist/request-to-curl.d.ts.map +0 -1
- package/dist/request-to-curl.js +0 -48
- package/dist/request-to-curl.js.map +0 -1
- package/dist/response.d.ts +0 -86
- package/dist/response.d.ts.map +0 -1
- package/dist/response.js +0 -313
- package/dist/response.js.map +0 -1
- package/dist/rust-type-emitter.d.ts +0 -44
- package/dist/rust-type-emitter.d.ts.map +0 -1
- package/dist/rust-type-emitter.js +0 -463
- package/dist/rust-type-emitter.js.map +0 -1
- package/dist/secure-headers.d.ts +0 -16
- package/dist/secure-headers.d.ts.map +0 -1
- package/dist/secure-headers.js +0 -53
- package/dist/secure-headers.js.map +0 -1
- package/dist/serve-register.d.ts +0 -6
- package/dist/serve-register.d.ts.map +0 -1
- package/dist/serve-register.js +0 -9
- package/dist/serve-register.js.map +0 -1
- package/dist/serve-slot.d.ts +0 -9
- package/dist/serve-slot.d.ts.map +0 -1
- package/dist/serve-slot.js +0 -52
- package/dist/serve-slot.js.map +0 -1
- package/dist/serve.d.ts +0 -38
- package/dist/serve.d.ts.map +0 -1
- package/dist/serve.js +0 -157
- package/dist/serve.js.map +0 -1
- package/dist/server-timing.d.ts +0 -9
- package/dist/server-timing.d.ts.map +0 -1
- package/dist/server-timing.js +0 -51
- package/dist/server-timing.js.map +0 -1
- package/dist/static.d.ts +0 -21
- package/dist/static.d.ts.map +0 -1
- package/dist/static.js +0 -102
- package/dist/static.js.map +0 -1
- package/dist/telemetry/otel.d.ts.map +0 -1
- package/dist/telemetry/otel.js.map +0 -1
- package/dist/testing.d.ts +0 -36
- package/dist/testing.d.ts.map +0 -1
- package/dist/testing.js +0 -124
- package/dist/testing.js.map +0 -1
- package/dist/timeout.d.ts +0 -13
- package/dist/timeout.d.ts.map +0 -1
- package/dist/timeout.js +0 -36
- package/dist/timeout.js.map +0 -1
- package/dist/tree.d.ts +0 -197
- package/dist/tree.d.ts.map +0 -1
- package/dist/tree.js +0 -437
- package/dist/tree.js.map +0 -1
- package/dist/trust.d.ts +0 -21
- package/dist/trust.d.ts.map +0 -1
- package/dist/trust.js +0 -100
- package/dist/trust.js.map +0 -1
- package/dist/ts-type-emitter.d.ts +0 -8
- package/dist/ts-type-emitter.d.ts.map +0 -1
- package/dist/ts-type-emitter.js +0 -150
- package/dist/ts-type-emitter.js.map +0 -1
- package/dist/type-emitter.d.ts +0 -36
- package/dist/type-emitter.d.ts.map +0 -1
- package/dist/type-emitter.js +0 -729
- package/dist/type-emitter.js.map +0 -1
- package/dist/type-extractor.d.ts +0 -43
- package/dist/type-extractor.d.ts.map +0 -1
- package/dist/type-extractor.js +0 -819
- package/dist/type-extractor.js.map +0 -1
- package/dist/types.d.ts +0 -467
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -96
- package/dist/types.js.map +0 -1
- package/dist/validation.d.ts +0 -31
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -335
- package/dist/validation.js.map +0 -1
- package/dist/with-headers.d.ts +0 -15
- package/dist/with-headers.d.ts.map +0 -1
- package/dist/with-headers.js +0 -45
- package/dist/with-headers.js.map +0 -1
- package/dist/ws/bun.d.ts.map +0 -1
- package/dist/ws/bun.js.map +0 -1
- package/dist/ws/cloudflare.d.ts.map +0 -1
- package/dist/ws/cloudflare.js.map +0 -1
- package/dist/ws/deno.d.ts +0 -13
- package/dist/ws/deno.d.ts.map +0 -1
- package/dist/ws/deno.js +0 -133
- package/dist/ws/deno.js.map +0 -1
- package/dist/ws/node.d.ts.map +0 -1
- package/dist/ws/node.js.map +0 -1
- package/dist/ws/session.d.ts.map +0 -1
- package/dist/ws/session.js.map +0 -1
- package/dist/ws/shared.d.ts.map +0 -1
- package/dist/ws/shared.js.map +0 -1
- package/dist/ws-origin.d.ts +0 -20
- package/dist/ws-origin.d.ts.map +0 -1
- package/dist/ws-origin.js +0 -41
- package/dist/ws-origin.js.map +0 -1
- package/dist/yaml.d.ts +0 -18
- package/dist/yaml.d.ts.map +0 -1
- package/dist/yaml.js +0 -101
- package/dist/yaml.js.map +0 -1
- package/docs/api-ref/go.md +0 -399
- package/docs/api-ref/python.md +0 -399
- package/docs/api-ref/rust.md +0 -399
- package/docs/api-ref/typescript.md +0 -399
- package/docs/invalidate-spec.md +0 -333
- package/docs/meta-spec.md +0 -555
- package/docs/packaging.md +0 -104
- package/docs/regression-matrix/README.md +0 -32
- package/docs/regression-matrix/review.md +0 -44
- package/docs/regression-matrix/ws1-3.md +0 -97
- package/docs/regression-matrix/ws4-8.md +0 -107
- package/docs/regression-matrix/ws9-12.md +0 -266
- package/docs/sdk.md +0 -798
- package/src/accepts.ts +0 -136
- package/src/body-kind.ts +0 -67
- package/src/body-limit.ts +0 -152
- package/src/build/index.ts +0 -217
- package/src/cli-args.ts +0 -123
- package/src/cli-go/auth.go +0 -26
- package/src/cli-go/config.go +0 -192
- package/src/cli-go/errors.go +0 -75
- package/src/cli-go/multipart.go +0 -79
- package/src/cli-go/output.go +0 -163
- package/src/cli-go/root.go +0 -30
- package/src/cli-go/stream.go +0 -88
- package/src/cli-go/version.go +0 -5
- package/src/cli.ts +0 -209
- package/src/client/defaults.ts +0 -47
- package/src/client/error.ts +0 -82
- package/src/client/http.ts +0 -737
- package/src/client/index.ts +0 -157
- package/src/client/path.ts +0 -169
- package/src/client/redirect-policy.ts +0 -19
- package/src/client/sdk.ts +0 -351
- package/src/client/sse.ts +0 -128
- package/src/client/types.ts +0 -206
- package/src/client/ws.ts +0 -149
- package/src/client-go/errors.go +0 -236
- package/src/client-go/export.go +0 -44
- package/src/client-go/invalidation.go +0 -371
- package/src/client-go/nullable.go +0 -62
- package/src/client-go/realtime.go +0 -354
- package/src/client-go/result.go +0 -20
- package/src/client-go/runtime.go +0 -975
- package/src/client-go/sse.go +0 -159
- package/src/client-go/transport.go +0 -495
- package/src/client-go/ws.go +0 -128
- package/src/client-info.ts +0 -79
- package/src/client-mcp/README.md +0 -10
- package/src/client-mcp/server.ts +0 -221
- package/src/client-mcp/types.ts +0 -19
- package/src/client-python/_errors.py +0 -115
- package/src/client-python/_invalidation.py +0 -494
- package/src/client-python/_realtime.py +0 -179
- package/src/client-python/_runtime.py +0 -860
- package/src/client-python/_sse.py +0 -155
- package/src/client-python/_transport.py +0 -366
- package/src/client-python/_ws.py +0 -159
- package/src/client-python/py.typed +0 -0
- package/src/client-rust/errors.rs +0 -220
- package/src/client-rust/invalidation.rs +0 -412
- package/src/client-rust/invalidation_sync.rs +0 -93
- package/src/client-rust/nullable.rs +0 -17
- package/src/client-rust/realtime.rs +0 -702
- package/src/client-rust/result.rs +0 -22
- package/src/client-rust/runtime.rs +0 -980
- package/src/client-rust/runtime_sync.rs +0 -484
- package/src/client-rust/sse.rs +0 -188
- package/src/client-rust/ws.rs +0 -167
- package/src/codegen-go-cli.ts +0 -1066
- package/src/codegen-go.ts +0 -970
- package/src/codegen-hash.ts +0 -8
- package/src/codegen-ir.ts +0 -812
- package/src/codegen-lang.ts +0 -517
- package/src/codegen-load.ts +0 -150
- package/src/codegen-loaders.ts +0 -50
- package/src/codegen-mcp.ts +0 -445
- package/src/codegen-python.ts +0 -916
- package/src/codegen-route-tree-intern.ts +0 -198
- package/src/codegen-rust.ts +0 -1402
- package/src/codegen-sanitize.ts +0 -57
- package/src/codegen-schema-naming.ts +0 -165
- package/src/codegen-sdk-model.ts +0 -228
- package/src/codegen.ts +0 -5089
- package/src/context.ts +0 -325
- package/src/cookie-sign.ts +0 -119
- package/src/cookie.ts +0 -143
- package/src/cors.ts +0 -95
- package/src/crypto.ts +0 -38
- package/src/csrf.ts +0 -86
- package/src/curl-logger.ts +0 -258
- package/src/detect-runtime.ts +0 -17
- package/src/dict.ts +0 -12
- package/src/error.ts +0 -55
- package/src/errors.ts +0 -85
- package/src/etag.ts +0 -97
- package/src/feature-detect.ts +0 -147
- package/src/feature-load.ts +0 -23
- package/src/feature-slots.ts +0 -70
- package/src/fetch-request.ts +0 -13
- package/src/gen-process.ts +0 -42
- package/src/gen-write.ts +0 -127
- package/src/glob.ts +0 -109
- package/src/go-type-emitter.ts +0 -660
- package/src/honey-response.ts +0 -379
- package/src/i18n-slot.ts +0 -30
- package/src/i18n.ts +0 -300
- package/src/index.ts +0 -3829
- package/src/init.ts +0 -161
- package/src/input.ts +0 -8
- package/src/invalidate-check.ts +0 -205
- package/src/invoke-user.ts +0 -95
- package/src/ip-restrict.ts +0 -79
- package/src/ip.ts +0 -194
- package/src/logger.ts +0 -178
- package/src/media-type.ts +0 -104
- package/src/meta-spec-merge.ts +0 -80
- package/src/meta-spec.ts +0 -718
- package/src/middleware.ts +0 -331
- package/src/node-request.ts +0 -431
- package/src/node.ts +0 -454
- package/src/openapi/collect.ts +0 -50
- package/src/openapi/docs-page.ts +0 -89
- package/src/openapi/document.ts +0 -902
- package/src/openapi/json-schema-slot.ts +0 -53
- package/src/openapi/register.ts +0 -23
- package/src/openapi/scalar.ts +0 -34
- package/src/openapi/serve.ts +0 -39
- package/src/openapi/spec-factory.ts +0 -100
- package/src/openapi/spec.ts +0 -74
- package/src/openapi/swagger.ts +0 -35
- package/src/pattern.ts +0 -245
- package/src/peer.ts +0 -53
- package/src/plugin.ts +0 -864
- package/src/powered-by.ts +0 -18
- package/src/pretty-json.ts +0 -56
- package/src/producer-stream.ts +0 -296
- package/src/proxy.ts +0 -370
- package/src/python-type-emitter.ts +0 -181
- package/src/realtime/bus.ts +0 -140
- package/src/realtime/register.ts +0 -13
- package/src/realtime/route.ts +0 -153
- package/src/realtime/server.ts +0 -298
- package/src/request-id.ts +0 -32
- package/src/request-limits.ts +0 -2
- package/src/request-path.ts +0 -165
- package/src/request-to-curl.ts +0 -52
- package/src/response.ts +0 -411
- package/src/rust-type-emitter.ts +0 -548
- package/src/secure-headers.ts +0 -74
- package/src/serve-register.ts +0 -12
- package/src/serve-slot.ts +0 -58
- package/src/serve.ts +0 -220
- package/src/server-timing.ts +0 -71
- package/src/static.ts +0 -112
- package/src/telemetry/otel.ts +0 -156
- package/src/testing.ts +0 -167
- package/src/timeout.ts +0 -45
- package/src/tree.ts +0 -558
- package/src/trust.ts +0 -117
- package/src/ts-type-emitter.ts +0 -168
- package/src/type-emitter.ts +0 -760
- package/src/type-extractor.ts +0 -855
- package/src/types.ts +0 -756
- package/src/validation.ts +0 -413
- package/src/with-headers.ts +0 -45
- package/src/ws/bun.ts +0 -120
- package/src/ws/cloudflare.ts +0 -192
- package/src/ws/deno.ts +0 -188
- package/src/ws/node.ts +0 -240
- package/src/ws/session.ts +0 -73
- package/src/ws/shared.ts +0 -140
- package/src/ws-origin.ts +0 -53
- package/src/yaml.ts +0 -103
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The supported type the request's Accept header prefers, as `supported` spells it; `null` when
|
|
3
|
+
* the client accepts none of them. No Accept header, or one with no usable range, takes the first.
|
|
4
|
+
*/
|
|
5
|
+
export declare function accepts<const T extends string>(req: Request, supported: readonly T[]): T | null;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content negotiation over the Accept header (RFC 9110 §12.5.1): which of the types a handler can
|
|
3
|
+
* answer with the client prefers. Each supported type takes the weight of the most specific range
|
|
4
|
+
* that matches it, so `text/html;q=0, *\/*` excludes `text/html`; equal weights go to the server's
|
|
5
|
+
* order. A plain function: nothing is registered, nothing is cached.
|
|
6
|
+
*/
|
|
7
|
+
import { parseMediaType } from "../response/media-type.js";
|
|
8
|
+
/* RFC 9110 §12.4.2 qvalue, lenient on the digit count and a missing leading zero */
|
|
9
|
+
const QVALUE = /^(?:0(?:\.\d*)?|1(?:\.0*)?|\.\d+)$/;
|
|
10
|
+
/** A weight, or 0 for one out of range or malformed: such a range is unusable, never q=1. */
|
|
11
|
+
function weight(raw) {
|
|
12
|
+
return QVALUE.test(raw) ? Number(raw) : 0;
|
|
13
|
+
}
|
|
14
|
+
function unquote(value) {
|
|
15
|
+
return value.length >= 2 && value.startsWith('"') && value.endsWith('"') ? value.slice(1, -1) : value;
|
|
16
|
+
}
|
|
17
|
+
/** One comma-separated part of the header, or `null` when it is no media range (`*\/html` included). */
|
|
18
|
+
function parseRange(part) {
|
|
19
|
+
const segments = part.split(";");
|
|
20
|
+
const head = segments[0].trim().toLowerCase();
|
|
21
|
+
const slash = head.indexOf("/");
|
|
22
|
+
if (slash <= 0 || slash === head.length - 1)
|
|
23
|
+
return null;
|
|
24
|
+
const type = head.slice(0, slash);
|
|
25
|
+
const subtype = head.slice(slash + 1);
|
|
26
|
+
if (type === "*" && subtype !== "*")
|
|
27
|
+
return null;
|
|
28
|
+
const params = new Map();
|
|
29
|
+
let q = 1;
|
|
30
|
+
for (const segment of segments.slice(1)) {
|
|
31
|
+
const eq = segment.indexOf("=");
|
|
32
|
+
if (eq === -1)
|
|
33
|
+
continue;
|
|
34
|
+
const name = segment.slice(0, eq).trim().toLowerCase();
|
|
35
|
+
const value = segment.slice(eq + 1).trim();
|
|
36
|
+
/* what follows q is an accept extension, never a media-type parameter */
|
|
37
|
+
if (name === "q") {
|
|
38
|
+
q = weight(value);
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
params.set(name, unquote(value));
|
|
42
|
+
}
|
|
43
|
+
return { params, q, subtype, type };
|
|
44
|
+
}
|
|
45
|
+
function parseAccept(header) {
|
|
46
|
+
const ranges = [];
|
|
47
|
+
for (const part of header.split(",")) {
|
|
48
|
+
const range = part.trim().length === 0 ? null : parseRange(part);
|
|
49
|
+
if (range !== null)
|
|
50
|
+
ranges.push(range);
|
|
51
|
+
}
|
|
52
|
+
return ranges;
|
|
53
|
+
}
|
|
54
|
+
/** How specifically `range` matches the supported type: 0 not at all, higher the more specific. */
|
|
55
|
+
function specificity(range, type, subtype, params) {
|
|
56
|
+
if (range.type === "*")
|
|
57
|
+
return 1;
|
|
58
|
+
if (range.type !== type)
|
|
59
|
+
return 0;
|
|
60
|
+
if (range.subtype === "*")
|
|
61
|
+
return 2;
|
|
62
|
+
if (range.subtype !== subtype)
|
|
63
|
+
return 0;
|
|
64
|
+
for (const [name, value] of range.params) {
|
|
65
|
+
if (params[name] !== value)
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
return 3 + range.params.size;
|
|
69
|
+
}
|
|
70
|
+
/** The weight the client gives `supported`: that of its most specific matching range, or -1 for none. */
|
|
71
|
+
function weightOf(ranges, supported) {
|
|
72
|
+
const media = parseMediaType(supported);
|
|
73
|
+
if (media === null)
|
|
74
|
+
return -1;
|
|
75
|
+
let best = 0;
|
|
76
|
+
let q = -1;
|
|
77
|
+
for (const range of ranges) {
|
|
78
|
+
const spec = specificity(range, media.type, media.subtype, media.params);
|
|
79
|
+
if (spec > best) {
|
|
80
|
+
best = spec;
|
|
81
|
+
q = range.q;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return q;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The supported type the request's Accept header prefers, as `supported` spells it; `null` when
|
|
88
|
+
* the client accepts none of them. No Accept header, or one with no usable range, takes the first.
|
|
89
|
+
*/
|
|
90
|
+
export function accepts(req, supported) {
|
|
91
|
+
const header = req.headers.get("accept");
|
|
92
|
+
const ranges = header === null ? [] : parseAccept(header);
|
|
93
|
+
if (ranges.length === 0)
|
|
94
|
+
return supported[0] ?? null;
|
|
95
|
+
let match = null;
|
|
96
|
+
let top = 0;
|
|
97
|
+
for (const type of supported) {
|
|
98
|
+
const q = weightOf(ranges, type);
|
|
99
|
+
if (q > top) {
|
|
100
|
+
top = q;
|
|
101
|
+
match = type;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return match;
|
|
105
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** The media types a route takes as a binary body: one, or a list; each `type/subtype` or `type/*`. */
|
|
2
|
+
export type BinaryTypes = `${string}/${string}` | readonly `${string}/${string}`[];
|
|
3
|
+
/** The body as ctx.input.binary carries it. */
|
|
4
|
+
export type BinaryBody<T extends string = string> = {
|
|
5
|
+
readonly bytes: Uint8Array<ArrayBuffer>;
|
|
6
|
+
readonly type: T;
|
|
7
|
+
};
|
|
8
|
+
/** One declared type: an exact essence, or a `type/*` range. */
|
|
9
|
+
type Range = {
|
|
10
|
+
readonly essence: string;
|
|
11
|
+
} | {
|
|
12
|
+
readonly type: string;
|
|
13
|
+
};
|
|
14
|
+
/** The declared types as ranges; one that is no media type or range throws, naming the route. */
|
|
15
|
+
export declare function binaryRanges(declared: BinaryTypes, method: string, path: string): readonly Range[];
|
|
16
|
+
/** The request's essence when a declared range takes it; anything else, none included, is a 415. */
|
|
17
|
+
export declare function binaryType(ranges: readonly Range[], contentType: string | null): string;
|
|
18
|
+
/** The body read once as bytes, with the media type it was sent as. */
|
|
19
|
+
export declare function binaryInput(req: Request, type: string): Promise<BinaryBody>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A raw body as `.input({ binary })` declares it (A1): bytes of a declared media type, an upload
|
|
3
|
+
* of an image or a file. The declared types are exact essences or `type/*` ranges; a request
|
|
4
|
+
* whose media type matches none answers 415 before its body is read, and the one that matched is
|
|
5
|
+
* handed on beside the bytes. Size is bodyLimit's or the server's cap, not a knob of its own.
|
|
6
|
+
*/
|
|
7
|
+
import { EK, HoneyError } from "../errors/error.js";
|
|
8
|
+
import { parseMediaType } from "../response/media-type.js";
|
|
9
|
+
/** A declared type as a range, or `null` when it is neither `type/subtype` nor `type/*` (no parameters). */
|
|
10
|
+
function rangeOf(declared) {
|
|
11
|
+
const text = declared.trim().toLowerCase();
|
|
12
|
+
if (text.includes(";"))
|
|
13
|
+
return null;
|
|
14
|
+
if (text.endsWith("/*")) {
|
|
15
|
+
const mt = parseMediaType(`${text.slice(0, -2)}/x`);
|
|
16
|
+
return mt === null || mt.type === "*" ? null : { type: mt.type };
|
|
17
|
+
}
|
|
18
|
+
const mt = parseMediaType(text);
|
|
19
|
+
return mt === null || mt.type === "*" ? null : { essence: mt.essence };
|
|
20
|
+
}
|
|
21
|
+
/** The declared types as ranges; one that is no media type or range throws, naming the route. */
|
|
22
|
+
export function binaryRanges(declared, method, path) {
|
|
23
|
+
return (typeof declared === "string" ? [declared] : declared).map((type) => {
|
|
24
|
+
const range = rangeOf(type);
|
|
25
|
+
if (range !== null)
|
|
26
|
+
return range;
|
|
27
|
+
throw new Error(`${method} ${path} declares binary type ${JSON.stringify(type)}: a binary type is type/subtype or type/*.`);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/** The request's essence when a declared range takes it; anything else, none included, is a 415. */
|
|
31
|
+
export function binaryType(ranges, contentType) {
|
|
32
|
+
const mt = parseMediaType(contentType);
|
|
33
|
+
if (mt !== null && ranges.some((r) => ("essence" in r ? r.essence === mt.essence : r.type === mt.type)))
|
|
34
|
+
return mt.essence;
|
|
35
|
+
throw new HoneyError({ errorKey: EK.unsupported_media_type, status: "unsupported_media_type" });
|
|
36
|
+
}
|
|
37
|
+
/** The body read once as bytes, with the media type it was sent as. */
|
|
38
|
+
export async function binaryInput(req, type) {
|
|
39
|
+
return { bytes: new Uint8Array(await req.arrayBuffer()), type };
|
|
40
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `buffered`: the whole body is in memory, or its length is declared, so reading it is bounded.
|
|
3
|
+
* `stream`: anything else that has a body; a middleware must never buffer it. `empty`: no body.
|
|
4
|
+
*/
|
|
5
|
+
export type BodyKind = "buffered" | "empty" | "stream";
|
|
6
|
+
/** `response`'s body kind; its content type is never consulted (SSE and NDJSON carry one). */
|
|
7
|
+
export declare function bodyKind(response: Response): BodyKind;
|
|
8
|
+
/** Cancel `response`'s body, unread, unless it is one honey kept: an answer about to go out without it. */
|
|
9
|
+
export declare function discardBody(response: Response): void;
|
|
10
|
+
/**
|
|
11
|
+
* The answer to a HEAD request: GET's status and headers, no body. A body honey built keeps its
|
|
12
|
+
* length in `content-length`, so HEAD states what GET would send; any other body is cancelled
|
|
13
|
+
* unread, so a producer never starts (or stops if it already did).
|
|
14
|
+
*/
|
|
15
|
+
export declare function headResponse(response: Response): Response;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What body an answer carries, decided without reading it, and the answer to a HEAD request.
|
|
3
|
+
* Honey tags its answers at creation: a buffered one by its raw body, a produced stream (sse,
|
|
4
|
+
* stream, generate) by its tag. Neither ever reads `.body` off a buffered HoneyResponse, which on
|
|
5
|
+
* Node would build a stream for it.
|
|
6
|
+
*/
|
|
7
|
+
import { isHoneyResponse, isProducedStream, rawBodyOf, replaceResponse } from "../response/builder.js";
|
|
8
|
+
/** `response`'s body kind; its content type is never consulted (SSE and NDJSON carry one). */
|
|
9
|
+
export function bodyKind(response) {
|
|
10
|
+
if (rawBodyOf(response) !== null)
|
|
11
|
+
return "buffered";
|
|
12
|
+
if (isProducedStream(response))
|
|
13
|
+
return "stream";
|
|
14
|
+
/* a HoneyResponse without a raw body hands out its stream, or null, without building one */
|
|
15
|
+
if (response.body === null)
|
|
16
|
+
return "empty";
|
|
17
|
+
if (isHoneyResponse(response))
|
|
18
|
+
return "stream";
|
|
19
|
+
const length = response.headers.get("content-length");
|
|
20
|
+
return length !== null && /^\d+$/.test(length.trim()) ? "buffered" : "stream";
|
|
21
|
+
}
|
|
22
|
+
// per-process-constant: text-codec
|
|
23
|
+
const encoder = /* @__PURE__ */ new TextEncoder();
|
|
24
|
+
function noop() { }
|
|
25
|
+
/** Cancel `response`'s body, unread, unless it is one honey kept: an answer about to go out without it. */
|
|
26
|
+
export function discardBody(response) {
|
|
27
|
+
if (rawBodyOf(response) !== null)
|
|
28
|
+
return;
|
|
29
|
+
const body = response.body;
|
|
30
|
+
/* the body is never sent: a cancel failing changes nothing the client sees */
|
|
31
|
+
if (body !== null && !body.locked)
|
|
32
|
+
body.cancel().catch(noop);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The answer to a HEAD request: GET's status and headers, no body. A body honey built keeps its
|
|
36
|
+
* length in `content-length`, so HEAD states what GET would send; any other body is cancelled
|
|
37
|
+
* unread, so a producer never starts (or stops if it already did).
|
|
38
|
+
*/
|
|
39
|
+
export function headResponse(response) {
|
|
40
|
+
const raw = rawBodyOf(response);
|
|
41
|
+
const headers = new Headers(response.headers);
|
|
42
|
+
discardBody(response);
|
|
43
|
+
if (raw !== null && !headers.has("content-length")) {
|
|
44
|
+
headers.set("content-length", String(typeof raw === "string" ? encoder.encode(raw).byteLength : raw.byteLength));
|
|
45
|
+
}
|
|
46
|
+
return replaceResponse(response, { body: null, headers });
|
|
47
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "../middleware/middleware.ts";
|
|
2
|
+
export type BodyLimitOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Limits by media type, read from the request's parsed media type: an essence key
|
|
5
|
+
* (`"application/json"`) takes that type alone, a family key ending in `/` (`"multipart/"`)
|
|
6
|
+
* every subtype of its type. An essence key wins over its family.
|
|
7
|
+
*/
|
|
8
|
+
limits?: Readonly<Record<string, number>>;
|
|
9
|
+
/** The cap for a body no `limits` key matches, in bytes. */
|
|
10
|
+
maxSize: number;
|
|
11
|
+
/**
|
|
12
|
+
* Take a declared Content-Length within the cap at its word and count nothing. HTTP/1.1 and
|
|
13
|
+
* HTTP/2 framing keep a body to its declared length, but only where the transport enforces
|
|
14
|
+
* it; by default every byte is counted. A body with no declared length is always counted.
|
|
15
|
+
*/
|
|
16
|
+
trustContentLength?: boolean;
|
|
17
|
+
};
|
|
18
|
+
/** Limit the request body to `options.maxSize` bytes, or to the `limits` entry for its media type. */
|
|
19
|
+
export declare function bodyLimit(options: BodyLimitOptions): MiddlewareFn<{
|
|
20
|
+
req: Request;
|
|
21
|
+
}, {}, "content_too_large">;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `bodyLimit(options)`: a cap on the request body, in bytes. A declared Content-Length over the
|
|
3
|
+
* cap answers 413 before anything is read; otherwise the body is counted as it is read, whatever
|
|
4
|
+
* the length claims, and the read that passes the cap fails with 413. Every method that carries a
|
|
5
|
+
* body is limited, extension methods too; a request with no body and no declared length is not.
|
|
6
|
+
*/
|
|
7
|
+
import { withBody } from "../adapters/fetch-request.js";
|
|
8
|
+
import { EK, HoneyError } from "../errors/error.js";
|
|
9
|
+
import { namedMiddleware } from "../middleware/middleware.js";
|
|
10
|
+
import { replaceRequest } from "../context/context.js";
|
|
11
|
+
import { parseMediaType } from "../response/media-type.js";
|
|
12
|
+
/* after an overflow the rest is read and dropped, so the client sees the 413 rather than a reset,
|
|
13
|
+
* but no further than this: past it the body is cancelled, so an endless one cannot hold the socket */
|
|
14
|
+
const DRAIN_LIMIT = 1_048_576;
|
|
15
|
+
function tooLarge() {
|
|
16
|
+
return new HoneyError({ errorKey: EK.content_too_large, status: "content_too_large" });
|
|
17
|
+
}
|
|
18
|
+
/** The cap for `contentType` under `limits`: its essence's key, else its family's; `maxSize` when none. */
|
|
19
|
+
function capFor(limits, maxSize, contentType) {
|
|
20
|
+
const mt = parseMediaType(contentType);
|
|
21
|
+
if (mt === null)
|
|
22
|
+
return maxSize;
|
|
23
|
+
return limits[mt.essence] ?? limits[`${mt.type}/`] ?? maxSize;
|
|
24
|
+
}
|
|
25
|
+
/** A declared length, or `null` when it is absent or not a whole number of bytes. */
|
|
26
|
+
function declaredLength(header) {
|
|
27
|
+
if (header === null || !/^\d+$/.test(header.trim()))
|
|
28
|
+
return null;
|
|
29
|
+
return Number(header);
|
|
30
|
+
}
|
|
31
|
+
/** Read and drop what is left after an overflow, up to DRAIN_LIMIT, then cancel the rest. */
|
|
32
|
+
async function drain(reader) {
|
|
33
|
+
let drained = 0;
|
|
34
|
+
try {
|
|
35
|
+
for (;;) {
|
|
36
|
+
const { done, value } = await reader.read();
|
|
37
|
+
if (done)
|
|
38
|
+
return;
|
|
39
|
+
drained += value.byteLength;
|
|
40
|
+
if (drained > DRAIN_LIMIT)
|
|
41
|
+
return void (await reader.cancel());
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* the body failed or was already done: nothing left to drop */
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* `body` counted against `cap`: the read that passes it errors with 413 and the rest is drained.
|
|
50
|
+
* Drained, not cancelled, so a FormData body still being encoded (undici) is left to finish.
|
|
51
|
+
*/
|
|
52
|
+
function counted(body, cap) {
|
|
53
|
+
const reader = body.getReader();
|
|
54
|
+
let received = 0;
|
|
55
|
+
return new ReadableStream({
|
|
56
|
+
cancel() {
|
|
57
|
+
void drain(reader);
|
|
58
|
+
},
|
|
59
|
+
async pull(controller) {
|
|
60
|
+
let result;
|
|
61
|
+
try {
|
|
62
|
+
result = await reader.read();
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
return controller.error(error);
|
|
66
|
+
}
|
|
67
|
+
if (result.done)
|
|
68
|
+
return controller.close();
|
|
69
|
+
received += result.value.byteLength;
|
|
70
|
+
if (received <= cap)
|
|
71
|
+
return controller.enqueue(result.value);
|
|
72
|
+
controller.error(tooLarge());
|
|
73
|
+
void drain(reader);
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/** Limit the request body to `options.maxSize` bytes, or to the `limits` entry for its media type. */
|
|
78
|
+
export function bodyLimit(options) {
|
|
79
|
+
const { maxSize, trustContentLength = false } = options;
|
|
80
|
+
/* keys lowercased once, on a record with no prototype: a media type never finds a prototype member */
|
|
81
|
+
const limits = Object.create(null);
|
|
82
|
+
for (const [key, cap] of Object.entries(options.limits ?? {}))
|
|
83
|
+
limits[key.trim().toLowerCase()] = cap;
|
|
84
|
+
const mw = (ctx, next) => {
|
|
85
|
+
const req = ctx.req;
|
|
86
|
+
const declared = declaredLength(req.headers.get("content-length"));
|
|
87
|
+
const body = req.body;
|
|
88
|
+
if (body === null && declared === null)
|
|
89
|
+
return next();
|
|
90
|
+
const cap = capFor(limits, maxSize, req.headers.get("content-type"));
|
|
91
|
+
if (declared !== null && declared > cap)
|
|
92
|
+
throw tooLarge();
|
|
93
|
+
if (body === null || (trustContentLength && declared !== null))
|
|
94
|
+
return next();
|
|
95
|
+
replaceRequest(ctx, withBody(req, counted(body, cap)));
|
|
96
|
+
return next();
|
|
97
|
+
};
|
|
98
|
+
return namedMiddleware("bodyLimit", mw);
|
|
99
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** The cookies as `.input({ cookies })` declares them. */
|
|
2
|
+
import type { StandardSchemaLike } from "../validation/standard-schema.ts";
|
|
3
|
+
/**
|
|
4
|
+
* The cookies (ctx.cookies: the first of a repeated name, as RFC 6265 sends the most specific one
|
|
5
|
+
* first) validated by `schema`. Without a schema (a `readableStream()` entry) they pass as they are.
|
|
6
|
+
*/
|
|
7
|
+
export declare function cookiesInput(schema: StandardSchemaLike | null, cookies: Record<string, string>): unknown;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { runSchema } from "../validation/validate-input.js";
|
|
2
|
+
/**
|
|
3
|
+
* The cookies (ctx.cookies: the first of a repeated name, as RFC 6265 sends the most specific one
|
|
4
|
+
* first) validated by `schema`. Without a schema (a `readableStream()` entry) they pass as they are.
|
|
5
|
+
*/
|
|
6
|
+
export function cookiesInput(schema, cookies) {
|
|
7
|
+
return schema === null ? cookies : runSchema(schema, cookies, "cookies");
|
|
8
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** A form body as `.input({ form })` declares it. */
|
|
2
|
+
import type { BodyParser } from "../response/media-type.ts";
|
|
3
|
+
import type { StandardSchemaLike } from "../validation/standard-schema.ts";
|
|
4
|
+
import { type Shape } from "../validation/validate-input.ts";
|
|
5
|
+
/**
|
|
6
|
+
* The body read once as an urlencoded or multipart form and validated by `schema`. Repeated keys
|
|
7
|
+
* follow `shape` (the schema's, computed once per route; the query's policy), and `__proto__`,
|
|
8
|
+
* `constructor` and `prototype` never reach it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formInput(schema: StandardSchemaLike, req: Request, parser: Exclude<BodyParser, "json">, shape?: Shape | null): Promise<unknown>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { runSchema, shapedRecord, shapeOf } from "../validation/validate-input.js";
|
|
2
|
+
import { malformedBody } from "./json.js";
|
|
3
|
+
/** The multipart body's fields and files; a body that is not multipart is a 400 `malformed_body`. */
|
|
4
|
+
async function parts(req) {
|
|
5
|
+
/* read the bytes first: an error while reading passes through, only parsing them is the client's */
|
|
6
|
+
const bytes = await req.arrayBuffer();
|
|
7
|
+
/* the multipart parser was chosen from this header, so it is present: it carries the boundary */
|
|
8
|
+
const contentType = req.headers.get("content-type");
|
|
9
|
+
try {
|
|
10
|
+
return await new Response(bytes, { headers: { "content-type": contentType } }).formData();
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
throw malformedBody("multipart", error);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The body read once as an urlencoded or multipart form and validated by `schema`. Repeated keys
|
|
18
|
+
* follow `shape` (the schema's, computed once per route; the query's policy), and `__proto__`,
|
|
19
|
+
* `constructor` and `prototype` never reach it.
|
|
20
|
+
*/
|
|
21
|
+
export async function formInput(schema, req, parser, shape = shapeOf(schema)) {
|
|
22
|
+
const entries = parser === "urlencoded" ? new URLSearchParams(await req.text()) : await parts(req);
|
|
23
|
+
return runSchema(schema, shapedRecord(entries, shape), "form");
|
|
24
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** The request headers as `.input({ headers })` declares them. */
|
|
2
|
+
import type { StandardSchemaLike } from "../validation/standard-schema.ts";
|
|
3
|
+
/**
|
|
4
|
+
* The request headers (ctx.headers: lowercased names, repeated values joined as Fetch joins them)
|
|
5
|
+
* validated by `schema`. Without a schema (a `readableStream()` entry) they pass as they are.
|
|
6
|
+
*/
|
|
7
|
+
export declare function headersInput(schema: StandardSchemaLike | null, headers: Record<string, string>): unknown;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { runSchema } from "../validation/validate-input.js";
|
|
2
|
+
/**
|
|
3
|
+
* The request headers (ctx.headers: lowercased names, repeated values joined as Fetch joins them)
|
|
4
|
+
* validated by `schema`. Without a schema (a `readableStream()` entry) they pass as they are.
|
|
5
|
+
*/
|
|
6
|
+
export function headersInput(schema, headers) {
|
|
7
|
+
return schema === null ? headers : runSchema(schema, headers, "headers");
|
|
8
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.input()`: what a route declares about the request it takes, compiled once into one step that
|
|
3
|
+
* runs after the route's middleware and before its handler. Sources are read in order (params,
|
|
4
|
+
* search, headers, cookies, then the body), and the first that fails answers. The step stays
|
|
5
|
+
* synchronous until a validator or the body has to wait (F6): a route with only sync validators
|
|
6
|
+
* and no body schema answers without a microtask, and only the route that declares one pays.
|
|
7
|
+
*/
|
|
8
|
+
import type { MaybePromise } from "../middleware/middleware.ts";
|
|
9
|
+
import { type BinaryBody, type BinaryTypes } from "./binary.ts";
|
|
10
|
+
import type { InferInput, InferOutput, StandardSchemaLike } from "../validation/standard-schema.ts";
|
|
11
|
+
/**
|
|
12
|
+
* A source whose schema documents the shape (for the client and docs) but is not run: a body is
|
|
13
|
+
* left unread for the handler to stream from `ctx.req`, a non-body source passes as parsed.
|
|
14
|
+
*/
|
|
15
|
+
export type ReadableStreamSchema<S> = {
|
|
16
|
+
readonly _tag: "readableStream";
|
|
17
|
+
readonly schema: S;
|
|
18
|
+
};
|
|
19
|
+
/** Hand the source on unvalidated: see {@link ReadableStreamSchema}. */
|
|
20
|
+
export declare function readableStream<S extends StandardSchemaLike>(schema: S): ReadableStreamSchema<S>;
|
|
21
|
+
/** A source's schema, or its `readableStream()` wrapper. */
|
|
22
|
+
export type InputEntry = StandardSchemaLike | ReadableStreamSchema<StandardSchemaLike>;
|
|
23
|
+
/** The non-body sources: all a WebSocket route may declare, since an upgrade has no body. */
|
|
24
|
+
export type NonBodyInput = {
|
|
25
|
+
readonly cookies?: InputEntry;
|
|
26
|
+
readonly headers?: InputEntry;
|
|
27
|
+
readonly params?: InputEntry;
|
|
28
|
+
readonly search?: InputEntry;
|
|
29
|
+
};
|
|
30
|
+
/** What `.input()` takes: json, form and binary are exclusive, as a request carries one body. */
|
|
31
|
+
export type InputSchemas = (NonBodyInput & {
|
|
32
|
+
readonly binary?: never;
|
|
33
|
+
readonly form?: InputEntry;
|
|
34
|
+
readonly json?: never;
|
|
35
|
+
}) | (NonBodyInput & {
|
|
36
|
+
readonly binary?: never;
|
|
37
|
+
readonly form?: never;
|
|
38
|
+
readonly json?: InputEntry;
|
|
39
|
+
}) | (NonBodyInput & {
|
|
40
|
+
readonly binary?: BinaryTypes;
|
|
41
|
+
readonly form?: never;
|
|
42
|
+
readonly json?: never;
|
|
43
|
+
});
|
|
44
|
+
/** The media type ctx.input.binary names: a declared essence, or any subtype of a `type/*` range. */
|
|
45
|
+
type BinaryTypeOf<T> = (T extends readonly (infer U)[] ? U : T) extends infer E ? E extends `${infer Type}/*` ? `${Type}/${string}` : E : never;
|
|
46
|
+
/** What an unvalidated non-body source carries: the record as parsed. */
|
|
47
|
+
type RawSource<K> = K extends "search" ? Record<string, string | string[]> : Record<string, string>;
|
|
48
|
+
/** One source on ctx.input: the schema's output, or the raw record a `readableStream()` entry passes. */
|
|
49
|
+
type SourceValue<K, E> = K extends "binary" ? BinaryBody<Extract<BinaryTypeOf<E>, string>> : E extends ReadableStreamSchema<unknown> ? RawSource<K> : InferOutput<E>;
|
|
50
|
+
/** The keys ctx.input carries: every declared source except a body left unread. */
|
|
51
|
+
type InputKey<T> = {
|
|
52
|
+
[K in keyof T]-?: [NonNullable<T[K]>] extends [never] ? never : K extends "form" | "json" ? NonNullable<T[K]> extends ReadableStreamSchema<unknown> ? never : K : K;
|
|
53
|
+
}[keyof T];
|
|
54
|
+
/** ctx.input for a declaration: each source as validated, typed by its schema. */
|
|
55
|
+
export type InferInputMap<T> = {
|
|
56
|
+
readonly [K in InputKey<T>]: SourceValue<K, NonNullable<T[K]>>;
|
|
57
|
+
};
|
|
58
|
+
/** One source as a client sends it: the schema's input type, a `readableStream()` entry by the schema it wraps. */
|
|
59
|
+
type RequestValue<K, E> = K extends "binary" ? BinaryBody<Extract<BinaryTypeOf<E>, string>> : InferInput<E extends ReadableStreamSchema<infer S> ? S : E>;
|
|
60
|
+
/** The keys a client sends: every declared source, a body left unread included. */
|
|
61
|
+
type RequestKey<T> = {
|
|
62
|
+
[K in keyof T]-?: [NonNullable<T[K]>] extends [never] ? never : K;
|
|
63
|
+
}[keyof T];
|
|
64
|
+
/** What a client sends for a declaration (the route record's `request`): `readableStream()` entries unwrapped. */
|
|
65
|
+
export type InferRequestMap<T> = {
|
|
66
|
+
readonly [K in RequestKey<T>]: RequestValue<K, NonNullable<T[K]>>;
|
|
67
|
+
};
|
|
68
|
+
/** What `.input()` records at the type level: the handler's ctx.input and the client's request. */
|
|
69
|
+
export type InputTypes<T> = {
|
|
70
|
+
input: InferInputMap<T>;
|
|
71
|
+
request: InferRequestMap<T>;
|
|
72
|
+
};
|
|
73
|
+
/** What the input step reads off a request context. */
|
|
74
|
+
type InputCtx = {
|
|
75
|
+
readonly cookies: Record<string, string>;
|
|
76
|
+
readonly headers: Record<string, string>;
|
|
77
|
+
input?: unknown;
|
|
78
|
+
readonly params: Record<string, string>;
|
|
79
|
+
readonly req: Request;
|
|
80
|
+
readonly searchAll: Record<string, string[]>;
|
|
81
|
+
};
|
|
82
|
+
/** The compiled step: sets ctx.input, or a promise of having set it when something had to wait. */
|
|
83
|
+
export type InputStep = (ctx: InputCtx) => Promise<void> | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Compile `schemas` for a route at `path` reached by `methods`. A body schema on a route only GET
|
|
86
|
+
* or HEAD reach, or json and form together, throws here, at registration.
|
|
87
|
+
*/
|
|
88
|
+
export declare function compileInput(schemas: InputSchemas, methods: readonly string[], path: string): InputStep;
|
|
89
|
+
/** `handler` behind `step`: the handler runs once ctx.input is set, synchronously when the step was. */
|
|
90
|
+
export declare function withInput(step: InputStep, handler: (ctx: object) => MaybePromise<Response>): (ctx: object) => MaybePromise<Response>;
|
|
91
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { assertBodySchemaAllowed, assertRequestContentType } from "../validation/content-type.js";
|
|
2
|
+
import { binaryInput, binaryRanges, binaryType } from "./binary.js";
|
|
3
|
+
import { shapeOf } from "../validation/validate-input.js";
|
|
4
|
+
import { cookiesInput } from "./cookies.js";
|
|
5
|
+
import { formInput } from "./form.js";
|
|
6
|
+
import { headersInput } from "./headers.js";
|
|
7
|
+
import { jsonInput } from "./json.js";
|
|
8
|
+
import { paramsInput } from "./params.js";
|
|
9
|
+
import { searchInput } from "./query.js";
|
|
10
|
+
/** Hand the source on unvalidated: see {@link ReadableStreamSchema}. */
|
|
11
|
+
export function readableStream(schema) {
|
|
12
|
+
return { _tag: "readableStream", schema };
|
|
13
|
+
}
|
|
14
|
+
function compile(entry) {
|
|
15
|
+
if (entry === undefined)
|
|
16
|
+
return null;
|
|
17
|
+
const schema = "_tag" in entry ? null : entry;
|
|
18
|
+
return { schema, shape: schema === null ? null : shapeOf(schema) };
|
|
19
|
+
}
|
|
20
|
+
/** A body left unread for the handler: no ctx.input key. */
|
|
21
|
+
const UNREAD = /* @__PURE__ */ Symbol("honey.unread");
|
|
22
|
+
/** The body source, read once, or UNREAD for a `readableStream()` body. */
|
|
23
|
+
function readBody(body, ctx, parser) {
|
|
24
|
+
if (body.schema === null)
|
|
25
|
+
return UNREAD;
|
|
26
|
+
return parser === "json" ? jsonInput(body.schema, ctx.req) : formInput(body.schema, ctx.req, parser, body.shape);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Compile `schemas` for a route at `path` reached by `methods`. A body schema on a route only GET
|
|
30
|
+
* or HEAD reach, or json and form together, throws here, at registration.
|
|
31
|
+
*/
|
|
32
|
+
export function compileInput(schemas, methods, path) {
|
|
33
|
+
assertBodySchemaAllowed(schemas, methods, path);
|
|
34
|
+
const params = compile(schemas.params);
|
|
35
|
+
const search = compile(schemas.search);
|
|
36
|
+
const headers = compile(schemas.headers);
|
|
37
|
+
const cookies = compile(schemas.cookies);
|
|
38
|
+
const json = compile(schemas.json);
|
|
39
|
+
const form = compile(schemas.form);
|
|
40
|
+
const reads = [];
|
|
41
|
+
if (params !== null)
|
|
42
|
+
reads.push(["params", (ctx) => paramsInput(params.schema, ctx.params)]);
|
|
43
|
+
if (search !== null)
|
|
44
|
+
reads.push(["search", (ctx) => searchInput(search.schema, ctx.searchAll, search.shape)]);
|
|
45
|
+
if (headers !== null)
|
|
46
|
+
reads.push(["headers", (ctx) => headersInput(headers.schema, ctx.headers)]);
|
|
47
|
+
if (cookies !== null)
|
|
48
|
+
reads.push(["cookies", (ctx) => cookiesInput(cookies.schema, ctx.cookies)]);
|
|
49
|
+
const body = json ?? form;
|
|
50
|
+
if (schemas.binary !== undefined) {
|
|
51
|
+
const ranges = binaryRanges(schemas.binary, methods[0], path);
|
|
52
|
+
reads.push(["binary", (ctx) => binaryInput(ctx.req, binaryType(ranges, ctx.req.headers.get("content-type")))]);
|
|
53
|
+
}
|
|
54
|
+
else if (body !== null) {
|
|
55
|
+
reads.push([
|
|
56
|
+
json !== null ? "json" : "form",
|
|
57
|
+
(ctx) => readBody(body, ctx, assertRequestContentType(schemas, ctx.req.headers.get("content-type"))),
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
return (ctx) => run(reads, 0, ctx, {});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Run `reads` from `from`: synchronously while each answers at once, then after each that has to
|
|
64
|
+
* wait. ctx.input is set once every source passed, so code after a failed step never sees a part.
|
|
65
|
+
*/
|
|
66
|
+
function run(reads, from, ctx, input) {
|
|
67
|
+
for (let i = from; i < reads.length; i++) {
|
|
68
|
+
const [key, read] = reads[i];
|
|
69
|
+
const value = read(ctx);
|
|
70
|
+
if (value instanceof Promise) {
|
|
71
|
+
return value.then((settled) => {
|
|
72
|
+
input[key] = settled;
|
|
73
|
+
return run(reads, i + 1, ctx, input);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (value !== UNREAD)
|
|
77
|
+
input[key] = value;
|
|
78
|
+
}
|
|
79
|
+
ctx.input = input;
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
/** `handler` behind `step`: the handler runs once ctx.input is set, synchronously when the step was. */
|
|
83
|
+
export function withInput(step, handler) {
|
|
84
|
+
return (ctx) => {
|
|
85
|
+
const pending = step(ctx);
|
|
86
|
+
return pending === undefined ? handler(ctx) : pending.then(() => handler(ctx));
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** A JSON body as `.input({ json })` declares it. */
|
|
2
|
+
import { HoneyError } from "../errors/error.ts";
|
|
3
|
+
import type { StandardSchemaLike } from "../validation/standard-schema.ts";
|
|
4
|
+
/** A body the declared parser cannot read: the client's mistake, a 400, never a 500. */
|
|
5
|
+
export declare function malformedBody(format: "json" | "multipart", cause: unknown): HoneyError;
|
|
6
|
+
/**
|
|
7
|
+
* The body read once as JSON and validated by `schema`. An empty or unparseable body is a 400
|
|
8
|
+
* `malformed_body`; an error while reading it (a size limit, a client abort) passes through.
|
|
9
|
+
*/
|
|
10
|
+
export declare function jsonInput(schema: StandardSchemaLike, req: Request): Promise<unknown>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** A JSON body as `.input({ json })` declares it. */
|
|
2
|
+
import { EK, HoneyError } from "../errors/error.js";
|
|
3
|
+
import { runSchema } from "../validation/validate-input.js";
|
|
4
|
+
/** A body the declared parser cannot read: the client's mistake, a 400, never a 500. */
|
|
5
|
+
export function malformedBody(format, cause) {
|
|
6
|
+
return new HoneyError({ cause, errorKey: EK.malformed_body, status: "bad_request", vars: { format } });
|
|
7
|
+
}
|
|
8
|
+
function parse(text) {
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(text);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
throw malformedBody("json", error);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The body read once as JSON and validated by `schema`. An empty or unparseable body is a 400
|
|
18
|
+
* `malformed_body`; an error while reading it (a size limit, a client abort) passes through.
|
|
19
|
+
*/
|
|
20
|
+
export async function jsonInput(schema, req) {
|
|
21
|
+
return runSchema(schema, parse(await req.text()), "json");
|
|
22
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** The route's params as `.input({ params })` declares them. */
|
|
2
|
+
import type { StandardSchemaLike } from "../validation/standard-schema.ts";
|
|
3
|
+
/**
|
|
4
|
+
* `params` validated by `schema`: what the schema produced, a promise of it only for an async
|
|
5
|
+
* validator. Without a schema (a `readableStream()` entry) the params pass as they are.
|
|
6
|
+
*/
|
|
7
|
+
export declare function paramsInput(schema: StandardSchemaLike | null, params: Record<string, string>): unknown;
|