@lovrozagar/honey 0.7.2 → 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 -744
- package/dist/index.js +12 -2363
- 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 -776
- 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 -193
- 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 -893
- 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 -554
- 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,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* metaSpec: the generate-time policy that turns route meta and route schemas into OpenAPI
|
|
3
|
+
* operation fields. Never consulted at request time; what it finds goes to the diagnostics,
|
|
4
|
+
* which the caller throws or reports.
|
|
5
|
+
*/
|
|
6
|
+
import { resolvedStrictness, } from "./meta-spec-merge.js";
|
|
7
|
+
import { checkTargetKey } from "./meta-spec-validate.js";
|
|
8
|
+
export const DEFAULT_PROFILE = "default";
|
|
9
|
+
const isName = (value) => typeof value === "string" && value !== "";
|
|
10
|
+
const isGroup = (value) => Array.isArray(value) && value.every(isName);
|
|
11
|
+
/** `{ scheme: scopes[] }`: scheme names mapped to lists of scope names. */
|
|
12
|
+
function isRequirement(entry) {
|
|
13
|
+
if (entry === null || typeof entry !== "object" || Array.isArray(entry))
|
|
14
|
+
return false;
|
|
15
|
+
return Object.entries(entry).every(([scheme, scopes]) => scheme !== "" && Array.isArray(scopes) && scopes.every((scope) => typeof scope === "string"));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Security shorthand → OpenAPI requirements: a name, alternative names, groups of names, or
|
|
19
|
+
* requirement objects; `[]` is explicitly public. Anything else throws: a guess would document
|
|
20
|
+
* a protected route as public.
|
|
21
|
+
*/
|
|
22
|
+
export function normalizeSecurity(raw) {
|
|
23
|
+
if (typeof raw === "string") {
|
|
24
|
+
if (raw === "")
|
|
25
|
+
throw new TypeError("security: a scheme name cannot be empty");
|
|
26
|
+
return [{ [raw]: [] }];
|
|
27
|
+
}
|
|
28
|
+
if (!Array.isArray(raw))
|
|
29
|
+
throw new TypeError(`security: expected a scheme name or an array, got ${raw === null ? "null" : typeof raw}`);
|
|
30
|
+
if (raw.every(isName))
|
|
31
|
+
return raw.map((scheme) => ({ [scheme]: [] }));
|
|
32
|
+
if (raw.every(isGroup))
|
|
33
|
+
return raw.map((group) => Object.fromEntries(group.map((scheme) => [scheme, []])));
|
|
34
|
+
if (raw.every(isRequirement))
|
|
35
|
+
return raw;
|
|
36
|
+
throw new TypeError("security: entries must all be scheme names, all groups of scheme names, or all { scheme: scopes[] } requirement objects — mixed or malformed entries are refused");
|
|
37
|
+
}
|
|
38
|
+
/** The scheme names a security list refers to, once each. */
|
|
39
|
+
export function securitySchemeNames(security) {
|
|
40
|
+
if (!Array.isArray(security))
|
|
41
|
+
return [];
|
|
42
|
+
return [
|
|
43
|
+
...new Set(security.flatMap((requirement) => (requirement instanceof Object ? Object.keys(requirement) : []))),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
/** Where a schema entry without `from` looks, in order. */
|
|
47
|
+
const SOURCES = [
|
|
48
|
+
"output",
|
|
49
|
+
"input.json",
|
|
50
|
+
"input.search",
|
|
51
|
+
"input.form",
|
|
52
|
+
"input.headers",
|
|
53
|
+
"input.cookies",
|
|
54
|
+
];
|
|
55
|
+
/** Meta keys that never reach a document, policy or none. */
|
|
56
|
+
const HIDDEN = ["internal", "extensions"];
|
|
57
|
+
const UNREAD = { from: SOURCES, match: null, profiles: null, schema: null, search: "root", version: null };
|
|
58
|
+
const truthy = (key) => (value) => value ? { [key]: value } : undefined;
|
|
59
|
+
function builtin(key, target, produce, ws) {
|
|
60
|
+
return { ...UNREAD, http: true, keys: [target], produce, rank: 2, read: key, sourceKey: key, ws };
|
|
61
|
+
}
|
|
62
|
+
const invalidate = (value) => Array.isArray(value) && value.length > 0 ? { "x-invalidate": [...new Set(value)] } : undefined;
|
|
63
|
+
/** The eight mappings every app has, in their emit order. */
|
|
64
|
+
function builtins() {
|
|
65
|
+
return [
|
|
66
|
+
builtin("summary", "summary", truthy("summary"), true),
|
|
67
|
+
builtin("description", "description", truthy("description"), true),
|
|
68
|
+
builtin("tags", "tags", (value) => (value ? { tags: typeof value === "string" ? [value] : value } : undefined), true),
|
|
69
|
+
builtin("deprecated", "deprecated", truthy("deprecated"), false),
|
|
70
|
+
builtin("operationId", "operationId", truthy("operationId"), true),
|
|
71
|
+
builtin("security", "security", (value) => (value ? { security: normalizeSecurity(value) } : undefined), false),
|
|
72
|
+
builtin("invalidate", "x-invalidate", invalidate, false),
|
|
73
|
+
builtin("mcp", "x-mcp", (value) => (value === true ? { "x-mcp": true } : undefined), false),
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
function compileEntry(key, entry, rank, diagnostics) {
|
|
77
|
+
const where = `${rank === 1 ? "schema" : "meta"}."${key}"`;
|
|
78
|
+
if (entry === false)
|
|
79
|
+
return null;
|
|
80
|
+
if (typeof entry === "string") {
|
|
81
|
+
if (!checkTargetKey(entry, where, diagnostics))
|
|
82
|
+
return null;
|
|
83
|
+
const produce = (value) => (value === undefined ? undefined : { [entry]: value });
|
|
84
|
+
return { ...UNREAD, http: true, keys: [entry], produce, rank, read: key, sourceKey: key, ws: true };
|
|
85
|
+
}
|
|
86
|
+
const read = entry;
|
|
87
|
+
const base = {
|
|
88
|
+
from: read.from ?? SOURCES,
|
|
89
|
+
http: entry.on !== "ws",
|
|
90
|
+
match: read.match ?? null,
|
|
91
|
+
profiles: entry.profiles ?? null,
|
|
92
|
+
rank,
|
|
93
|
+
read: read.read ?? key,
|
|
94
|
+
schema: entry.schema ?? null,
|
|
95
|
+
search: read.search ?? "root",
|
|
96
|
+
sourceKey: key,
|
|
97
|
+
version: read.version ?? null,
|
|
98
|
+
ws: entry.on !== "http",
|
|
99
|
+
};
|
|
100
|
+
if ("expand" in entry) {
|
|
101
|
+
const expand = entry.expand;
|
|
102
|
+
const produce = (value, ctx) => {
|
|
103
|
+
const out = expand(value, ctx);
|
|
104
|
+
if (out === undefined)
|
|
105
|
+
return undefined;
|
|
106
|
+
const kept = Object.entries(out).filter(([target, produced]) => produced !== undefined && checkTargetKey(target, `${where} (expand)`, diagnostics));
|
|
107
|
+
return kept.length > 0 ? Object.fromEntries(kept) : undefined;
|
|
108
|
+
};
|
|
109
|
+
return { ...base, keys: [], produce };
|
|
110
|
+
}
|
|
111
|
+
if (!checkTargetKey(entry.key, where, diagnostics))
|
|
112
|
+
return null;
|
|
113
|
+
const { key: target } = entry;
|
|
114
|
+
const map = entry.map;
|
|
115
|
+
const produce = (value, ctx) => {
|
|
116
|
+
const mapped = map === undefined ? value : map(value, ctx);
|
|
117
|
+
return mapped === undefined ? undefined : { [target]: mapped };
|
|
118
|
+
};
|
|
119
|
+
return { ...base, keys: [target], produce };
|
|
120
|
+
}
|
|
121
|
+
/** Whether two entries ever write to one operation: their targets and profiles overlap. */
|
|
122
|
+
function overlap(a, b) {
|
|
123
|
+
if (!((a.http && b.http) || (a.ws && b.ws)))
|
|
124
|
+
return false;
|
|
125
|
+
return a.profiles === null || b.profiles === null || a.profiles.some((name) => b.profiles?.includes(name));
|
|
126
|
+
}
|
|
127
|
+
function detectDuplicates(entries, diagnostics) {
|
|
128
|
+
const byKey = new Map();
|
|
129
|
+
for (const entry of entries) {
|
|
130
|
+
for (const key of entry.keys) {
|
|
131
|
+
const prior = byKey.get(`${entry.rank} ${key}`) ?? [];
|
|
132
|
+
const clash = prior.find((other) => other.sourceKey !== entry.sourceKey && overlap(other, entry));
|
|
133
|
+
if (clash === undefined)
|
|
134
|
+
byKey.set(`${entry.rank} ${key}`, [...prior, entry]);
|
|
135
|
+
else {
|
|
136
|
+
const both = `"${clash.sourceKey}" and "${entry.sourceKey}"`;
|
|
137
|
+
diagnostics.add("DUPLICATE_TARGET", "error", `${both} both write operation key "${key}" at the same precedence`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const CONFLICT = {
|
|
143
|
+
hidden: "a mounted sub-app hides this key, so it is hidden here too — hiding wins over a parent entry, because a leak is worse than a missing tag",
|
|
144
|
+
parent: "a mounted sub-app declares a different entry; this app's entry wins for this document. The sub-app's own document still uses its own entry",
|
|
145
|
+
};
|
|
146
|
+
/** `config` ready to apply: built-ins (an app entry takes its slot), app entries, then schema entries. */
|
|
147
|
+
export function compileMetaSpec(config, diagnostics) {
|
|
148
|
+
const overrides = config?.meta ?? {};
|
|
149
|
+
const known = new Set(HIDDEN);
|
|
150
|
+
const compile = (key, entry, rank) => compileEntry(key, entry, rank, diagnostics);
|
|
151
|
+
const meta = [
|
|
152
|
+
...builtins().map((entry) => Object.hasOwn(overrides, entry.sourceKey) ? compile(entry.sourceKey, overrides[entry.sourceKey], 2) : entry),
|
|
153
|
+
...Object.entries(overrides)
|
|
154
|
+
.filter(([key]) => !builtins().some((entry) => entry.sourceKey === key))
|
|
155
|
+
.map(([key, entry]) => compile(key, entry, 2)),
|
|
156
|
+
];
|
|
157
|
+
for (const key of [...builtins().map(({ sourceKey }) => sourceKey), ...Object.keys(overrides)])
|
|
158
|
+
known.add(key);
|
|
159
|
+
const schema = Object.entries(config?.schema ?? {}).map(([key, entry]) => compile(key, entry, 1));
|
|
160
|
+
const entries = [...meta, ...schema].filter((entry) => entry !== null);
|
|
161
|
+
detectDuplicates(entries, diagnostics);
|
|
162
|
+
for (const { key, resolution, section } of config?.conflicts ?? []) {
|
|
163
|
+
diagnostics.add("SUBAPP_ENTRY_CONFLICT", "warn", `${section}."${key}": ${CONFLICT[resolution]}`);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
entries,
|
|
167
|
+
known,
|
|
168
|
+
needsSchemas: schema.length > 0,
|
|
169
|
+
profiles: config?.profiles ?? {},
|
|
170
|
+
strict: resolvedStrictness(config),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/** The meta keys a published manifest may carry: built-ins and keys with an entry, never a hidden one. */
|
|
174
|
+
export function publishableMetaKeys(config) {
|
|
175
|
+
const allowed = new Set(builtins().map(({ sourceKey }) => sourceKey));
|
|
176
|
+
for (const [key, entry] of Object.entries(config?.meta ?? {})) {
|
|
177
|
+
if (entry === false)
|
|
178
|
+
allowed.delete(key);
|
|
179
|
+
else
|
|
180
|
+
allowed.add(key);
|
|
181
|
+
}
|
|
182
|
+
return (key) => allowed.has(key) && !HIDDEN.includes(key);
|
|
183
|
+
}
|
|
184
|
+
/** The filter of the document's profile: `exclude` drops keys, `include` allowlists `x-` keys. */
|
|
185
|
+
export function resolveProfile(spec, profile, diagnostics) {
|
|
186
|
+
const name = profile ?? DEFAULT_PROFILE;
|
|
187
|
+
const declared = Object.hasOwn(spec.profiles, name) ? spec.profiles[name] : undefined;
|
|
188
|
+
if (declared === undefined) {
|
|
189
|
+
if (name !== DEFAULT_PROFILE) {
|
|
190
|
+
diagnostics.add("UNKNOWN_PROFILE", "error", `document requests profile "${name}", which is not declared in metaSpec.profiles`);
|
|
191
|
+
}
|
|
192
|
+
return { filter: () => true, name };
|
|
193
|
+
}
|
|
194
|
+
const { exclude = [], include } = declared;
|
|
195
|
+
const filter = (key) => !exclude.includes(key) && (include === undefined || !key.startsWith("x-") || include.includes(key));
|
|
196
|
+
return { filter, name };
|
|
197
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "./middleware.ts";
|
|
2
|
+
export type CompressOptions = {
|
|
3
|
+
/** Compress answers to credentialed requests and answers that set a cookie. Default `false` (BREACH). */
|
|
4
|
+
credentialed?: boolean;
|
|
5
|
+
/** The smallest body compressed, in bytes (characters, for a text body). Default 1024. */
|
|
6
|
+
threshold?: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Whether an `Accept-Encoding` value takes `coding`: by name, else through `*`, at a q-value above 0
|
|
10
|
+
* (a malformed one is 0). Shared with staticFiles' precompressed siblings.
|
|
11
|
+
*/
|
|
12
|
+
export declare function acceptsCoding(accept: string | null, coding: string): boolean;
|
|
13
|
+
export declare function compress(options?: CompressOptions): MiddlewareFn<{
|
|
14
|
+
readonly req: Request;
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `compress()`: gzip a buffered answer when the client's `Accept-Encoding` takes gzip (q-values
|
|
3
|
+
* honored, `*` included). The edge may already compress (Cloudflare does); this is for the origin
|
|
4
|
+
* that answers directly. No brotli here (b3): `CompressionStream` runs it at quality 11 with no
|
|
5
|
+
* knob, ~55× gzip's time for a dynamic answer; brotli is served as a precompressed static sibling.
|
|
6
|
+
*
|
|
7
|
+
* It encodes only the raw body the answer was built from, never reading or cloning its stream, so
|
|
8
|
+
* a produced stream (sse, stream, generate) or a foreign response is passed through as it is. It
|
|
9
|
+
* leaves alone: an empty, partial or 304 answer; one already encoded; `Cache-Control:
|
|
10
|
+
* no-transform`; a type that does not compress; a body under `threshold`.
|
|
11
|
+
*
|
|
12
|
+
* BREACH: compressed length leaks a secret in a body that also reflects attacker input. By default
|
|
13
|
+
* an answer to a credentialed request (a `Cookie` or `Authorization`) or one that sets a cookie is
|
|
14
|
+
* not compressed; `credentialed: true` opts in.
|
|
15
|
+
*/
|
|
16
|
+
import { isHoneyResponse, rawBodyOf, replaceResponse, withRawBody } from "../response/builder.js";
|
|
17
|
+
import { addVary, withHeaders } from "../response/with-headers.js";
|
|
18
|
+
import { namedMiddleware } from "./middleware.js";
|
|
19
|
+
/* text, JSON, XML, JavaScript and SVG compress; images, archives and media are compressed already */
|
|
20
|
+
const COMPRESSIBLE = /^(?:text\/|application\/(?:json|javascript|xml|[\w.-]+\+(?:json|xml))$|image\/svg\+xml$)/;
|
|
21
|
+
const NO_TRANSFORM = /(?:^|,)\s*no-transform\s*(?:,|$)/i;
|
|
22
|
+
function essenceOf(contentType) {
|
|
23
|
+
const text = contentType ?? "";
|
|
24
|
+
const semi = text.indexOf(";");
|
|
25
|
+
return (semi === -1 ? text : text.slice(0, semi)).trim().toLowerCase();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Whether an `Accept-Encoding` value takes `coding`: by name, else through `*`, at a q-value above 0
|
|
29
|
+
* (a malformed one is 0). Shared with staticFiles' precompressed siblings.
|
|
30
|
+
*/
|
|
31
|
+
export function acceptsCoding(accept, coding) {
|
|
32
|
+
if (accept === null)
|
|
33
|
+
return false;
|
|
34
|
+
let any = 0;
|
|
35
|
+
for (const item of accept.split(",")) {
|
|
36
|
+
const [name, ...params] = item.split(";");
|
|
37
|
+
const weight = params.map((param) => param.trim()).find((param) => param.startsWith("q="));
|
|
38
|
+
const value = weight === undefined ? 1 : Number(weight.slice(2));
|
|
39
|
+
const q = Number.isFinite(value) ? value : 0;
|
|
40
|
+
const listed = name.trim().toLowerCase();
|
|
41
|
+
if (listed === coding)
|
|
42
|
+
return q > 0;
|
|
43
|
+
if (listed === "*")
|
|
44
|
+
any = q;
|
|
45
|
+
}
|
|
46
|
+
return any > 0;
|
|
47
|
+
}
|
|
48
|
+
function compressible(response, threshold, raw) {
|
|
49
|
+
/* the size first: most answers are small JSON, and it costs no header lookup */
|
|
50
|
+
if ((typeof raw === "string" ? raw.length : raw.byteLength) < threshold)
|
|
51
|
+
return false;
|
|
52
|
+
const status = response.status;
|
|
53
|
+
if (status < 200 || status === 204 || status === 206 || status === 304)
|
|
54
|
+
return false;
|
|
55
|
+
const headers = response.headers;
|
|
56
|
+
if (headers.has("content-encoding") || headers.has("content-range"))
|
|
57
|
+
return false;
|
|
58
|
+
if (NO_TRANSFORM.test(headers.get("cache-control") ?? ""))
|
|
59
|
+
return false;
|
|
60
|
+
return COMPRESSIBLE.test(essenceOf(headers.get("content-type")));
|
|
61
|
+
}
|
|
62
|
+
async function gzip(raw) {
|
|
63
|
+
const stream = new Blob([raw]).stream().pipeThrough(new CompressionStream("gzip"));
|
|
64
|
+
return new Uint8Array(await new Response(stream).arrayBuffer());
|
|
65
|
+
}
|
|
66
|
+
export function compress(options = {}) {
|
|
67
|
+
const { credentialed = false, threshold = 1024 } = options;
|
|
68
|
+
if (!(Number.isFinite(threshold) && threshold >= 0)) {
|
|
69
|
+
throw new TypeError("compress: threshold must be a finite number of bytes, 0 or more");
|
|
70
|
+
}
|
|
71
|
+
return namedMiddleware("compress", async (ctx, next) => {
|
|
72
|
+
const response = await next();
|
|
73
|
+
const raw = rawBodyOf(response);
|
|
74
|
+
/* no raw body: a produced stream or a foreign response, never buffered here */
|
|
75
|
+
if (raw === null || !compressible(response, threshold, raw))
|
|
76
|
+
return response;
|
|
77
|
+
const req = ctx.req;
|
|
78
|
+
const secret = !credentialed &&
|
|
79
|
+
(req.headers.has("cookie") || req.headers.has("authorization") || response.headers.has("set-cookie"));
|
|
80
|
+
if (secret || !acceptsCoding(req.headers.get("accept-encoding"), "gzip")) {
|
|
81
|
+
return withHeaders(response, (headers) => addVary(headers, "accept-encoding"));
|
|
82
|
+
}
|
|
83
|
+
const bytes = await gzip(raw);
|
|
84
|
+
const encoded = replaceResponse(response, { body: bytes });
|
|
85
|
+
if (!isHoneyResponse(encoded))
|
|
86
|
+
withRawBody(encoded, bytes);
|
|
87
|
+
return withHeaders(encoded, (headers) => {
|
|
88
|
+
headers.set("content-encoding", "gzip");
|
|
89
|
+
headers.delete("content-length");
|
|
90
|
+
addVary(headers, "accept-encoding");
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "./middleware.ts";
|
|
2
|
+
export type CORSOptions = {
|
|
3
|
+
/** Requires an explicit `origin`: a string, a list or a predicate. With `"*"` or none, cors() throws. */
|
|
4
|
+
credentials?: boolean;
|
|
5
|
+
/** Response headers a browser script may read. */
|
|
6
|
+
exposeHeaders?: string[];
|
|
7
|
+
/** Request headers a preflight allows; unset, the requested ones are echoed. */
|
|
8
|
+
headers?: string[];
|
|
9
|
+
/** Seconds a browser may cache a preflight. Default 86400. */
|
|
10
|
+
maxAge?: number;
|
|
11
|
+
/** Methods a preflight allows. Default GET, HEAD, PUT, PATCH, POST, DELETE. */
|
|
12
|
+
methods?: string[];
|
|
13
|
+
/** Default `"*"`. */
|
|
14
|
+
origin?: "*" | ((origin: string) => boolean) | string | readonly string[];
|
|
15
|
+
};
|
|
16
|
+
export declare function cors(options?: CORSOptions): MiddlewareFn<{
|
|
17
|
+
req: Request;
|
|
18
|
+
}>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cors(options)`: Cross-Origin Resource Sharing. A preflight from an allowed origin is answered
|
|
3
|
+
* here with 204; any other answer gets the allow-origin it earns. The opaque origin `null` is never
|
|
4
|
+
* reflected, and credentials need an explicit origin. Headers are written through `withHeaders`,
|
|
5
|
+
* so a buffered response keeps its plain header map.
|
|
6
|
+
*/
|
|
7
|
+
import { addVary, withHeaders } from "../response/with-headers.js";
|
|
8
|
+
import { namedMiddleware } from "./middleware.js";
|
|
9
|
+
const DEFAULT_METHODS = ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"];
|
|
10
|
+
const DEFAULT_MAX_AGE = 86_400;
|
|
11
|
+
/**
|
|
12
|
+
* The `Access-Control-Allow-Origin` value `origin` earns, or `null`. The opaque origin `null`
|
|
13
|
+
* (sandboxed frames, `file:`, some redirects) is never reflected: any page can produce it.
|
|
14
|
+
*/
|
|
15
|
+
function allowedOrigin(origin, policy) {
|
|
16
|
+
if (policy === undefined || policy === "*")
|
|
17
|
+
return "*";
|
|
18
|
+
if (origin === "null")
|
|
19
|
+
return null;
|
|
20
|
+
if (typeof policy === "string")
|
|
21
|
+
return policy === origin ? origin : null;
|
|
22
|
+
if (typeof policy === "function")
|
|
23
|
+
return policy(origin) ? origin : null;
|
|
24
|
+
return policy.includes(origin) ? origin : null;
|
|
25
|
+
}
|
|
26
|
+
const joined = (list) => list !== undefined && list.length > 0 ? list.join(", ") : null;
|
|
27
|
+
export function cors(options = {}) {
|
|
28
|
+
const { credentials = false, origin } = options;
|
|
29
|
+
if (credentials && (origin === undefined || origin === "*")) {
|
|
30
|
+
throw new TypeError("cors: `credentials: true` needs an explicit `origin` (a string, a list or a predicate). A wildcard would let every site make credentialed requests and read the answer.");
|
|
31
|
+
}
|
|
32
|
+
/* the answer depends on the request's Origin unless the policy is a plain wildcard: say so to caches */
|
|
33
|
+
const varies = !(origin === undefined || origin === "*");
|
|
34
|
+
const methods = (options.methods ?? DEFAULT_METHODS).join(", ");
|
|
35
|
+
const allowHeaders = joined(options.headers);
|
|
36
|
+
const exposeHeaders = joined(options.exposeHeaders);
|
|
37
|
+
const maxAge = String(options.maxAge ?? DEFAULT_MAX_AGE);
|
|
38
|
+
const answerPreflight = (req, allowed) => {
|
|
39
|
+
const headers = new Headers({
|
|
40
|
+
"access-control-allow-methods": methods,
|
|
41
|
+
"access-control-allow-origin": allowed,
|
|
42
|
+
"access-control-max-age": maxAge,
|
|
43
|
+
});
|
|
44
|
+
if (allowHeaders !== null)
|
|
45
|
+
headers.set("access-control-allow-headers", allowHeaders);
|
|
46
|
+
else {
|
|
47
|
+
const requested = req.headers.get("access-control-request-headers");
|
|
48
|
+
if (requested)
|
|
49
|
+
headers.set("access-control-allow-headers", requested);
|
|
50
|
+
addVary(headers, "Access-Control-Request-Headers");
|
|
51
|
+
}
|
|
52
|
+
if (credentials)
|
|
53
|
+
headers.set("access-control-allow-credentials", "true");
|
|
54
|
+
if (varies)
|
|
55
|
+
addVary(headers, "Origin");
|
|
56
|
+
return new Response(null, { headers, status: 204 });
|
|
57
|
+
};
|
|
58
|
+
return namedMiddleware("cors", async (ctx, next) => {
|
|
59
|
+
const req = ctx.req;
|
|
60
|
+
const requestOrigin = req.headers.get("origin");
|
|
61
|
+
const allowed = requestOrigin === null ? null : allowedOrigin(requestOrigin, origin);
|
|
62
|
+
if (allowed !== null && req.method === "OPTIONS" && req.headers.has("access-control-request-method")) {
|
|
63
|
+
return answerPreflight(req, allowed);
|
|
64
|
+
}
|
|
65
|
+
const response = await next();
|
|
66
|
+
if (allowed === null && !varies)
|
|
67
|
+
return response;
|
|
68
|
+
return withHeaders(response, (headers) => {
|
|
69
|
+
if (varies)
|
|
70
|
+
addVary(headers, "Origin");
|
|
71
|
+
if (allowed === null)
|
|
72
|
+
return;
|
|
73
|
+
headers.set("access-control-allow-origin", allowed);
|
|
74
|
+
if (credentials)
|
|
75
|
+
headers.set("access-control-allow-credentials", "true");
|
|
76
|
+
if (exposeHeaders !== null)
|
|
77
|
+
headers.set("access-control-expose-headers", exposeHeaders);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "./middleware.ts";
|
|
2
|
+
export type CSRFOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Cross-origin callers allowed to make unsafe requests, matched exactly against the full `Origin`
|
|
5
|
+
* (`https://app.example.com`). Same-origin requests never need listing.
|
|
6
|
+
*/
|
|
7
|
+
origin?: ((origin: string) => boolean) | string | readonly string[];
|
|
8
|
+
};
|
|
9
|
+
export declare function csrf(options?: CSRFOptions): MiddlewareFn<{
|
|
10
|
+
req: Request;
|
|
11
|
+
}, {}, "forbidden">;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `csrf(options)`: refuse cross-origin unsafe requests, whatever their content type, as Go's
|
|
3
|
+
* `http.CrossOriginProtection` does.
|
|
4
|
+
*
|
|
5
|
+
* 1. `GET`, `HEAD` and `OPTIONS` pass.
|
|
6
|
+
* 2. With `Sec-Fetch-Site` (every current browser sends it): `same-origin` and `none`
|
|
7
|
+
* (user-initiated) pass; `same-site` and `cross-site` pass only for an allow-listed `Origin`. A
|
|
8
|
+
* sibling subdomain is same-site, not trusted.
|
|
9
|
+
* 3. Without it: no `Origin` passes (curl, a server); an `Origin` on the request's own host passes;
|
|
10
|
+
* an allow-listed one passes; anything else, the opaque `null` included, does not.
|
|
11
|
+
*
|
|
12
|
+
* A refusal is a 403 `forbidden`, declared on the middleware.
|
|
13
|
+
*/
|
|
14
|
+
import { HoneyError } from "../errors/error.js";
|
|
15
|
+
import { namedMiddleware } from "./middleware.js";
|
|
16
|
+
function isSafe(method) {
|
|
17
|
+
return method === "GET" || method === "HEAD" || method === "OPTIONS";
|
|
18
|
+
}
|
|
19
|
+
function allowListed(origin, allow) {
|
|
20
|
+
if (allow === undefined)
|
|
21
|
+
return false;
|
|
22
|
+
if (typeof allow === "string")
|
|
23
|
+
return allow === origin;
|
|
24
|
+
if (typeof allow === "function")
|
|
25
|
+
return allow(origin);
|
|
26
|
+
return allow.includes(origin);
|
|
27
|
+
}
|
|
28
|
+
/** `origin`'s host as a URL spells it, or `null` for the opaque origin or one that is no URL. */
|
|
29
|
+
function hostOf(origin) {
|
|
30
|
+
if (origin === "null")
|
|
31
|
+
return null;
|
|
32
|
+
try {
|
|
33
|
+
return new URL(origin).host;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
/* not a URL: an Origin no host matches, which the caller refuses */
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function forbidden() {
|
|
41
|
+
throw new HoneyError({ errorKey: "forbidden", status: "forbidden" });
|
|
42
|
+
}
|
|
43
|
+
export function csrf(options = {}) {
|
|
44
|
+
const allow = options.origin;
|
|
45
|
+
const mw = (ctx, next) => {
|
|
46
|
+
const req = ctx.req;
|
|
47
|
+
if (isSafe(req.method))
|
|
48
|
+
return next();
|
|
49
|
+
const origin = req.headers.get("origin");
|
|
50
|
+
const site = req.headers.get("sec-fetch-site");
|
|
51
|
+
if (site !== null) {
|
|
52
|
+
if (site === "same-origin" || site === "none")
|
|
53
|
+
return next();
|
|
54
|
+
return origin !== null && allowListed(origin, allow) ? next() : forbidden();
|
|
55
|
+
}
|
|
56
|
+
if (origin === null)
|
|
57
|
+
return next();
|
|
58
|
+
/* the request URL is the canonical one the adapter built: its host is the one the client addressed */
|
|
59
|
+
if (hostOf(origin) === new URL(req.url).host)
|
|
60
|
+
return next();
|
|
61
|
+
return allowListed(origin, allow) ? next() : forbidden();
|
|
62
|
+
};
|
|
63
|
+
mw.errors = ["forbidden"];
|
|
64
|
+
return namedMiddleware("csrf", mw);
|
|
65
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "./middleware.ts";
|
|
2
|
+
export type IpRestrictOptions = {
|
|
3
|
+
/** Addresses and CIDR ranges admitted; with it, every other peer is refused. */
|
|
4
|
+
allowList?: readonly string[];
|
|
5
|
+
/** Addresses and CIDR ranges refused, checked before `allowList`. */
|
|
6
|
+
denyList?: readonly string[];
|
|
7
|
+
};
|
|
8
|
+
export declare function ipRestrict(options: IpRestrictOptions): MiddlewareFn<{
|
|
9
|
+
readonly ip: string | null;
|
|
10
|
+
}, {}, "forbidden">;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ipRestrict({ allowList, denyList })`: admit or refuse a request by `ctx.ip`, the platform peer
|
|
3
|
+
* (H23): no forwarding header can stand in for it, so behind a self-hosted proxy restrict at the
|
|
4
|
+
* proxy. Rules are addresses or CIDR ranges, IPv4 or IPv6, compared as numbers, so every spelling
|
|
5
|
+
* of one address (IPv4-mapped, zero-compressed, any case) is one address.
|
|
6
|
+
*
|
|
7
|
+
* The deny list is checked first; with an allow list, everything else is refused. Fails closed: no
|
|
8
|
+
* reported peer is 403 under either list.
|
|
9
|
+
*/
|
|
10
|
+
import { parseIpv4, parseIpv6 } from "../context/peer.js";
|
|
11
|
+
import { HoneyError } from "../errors/error.js";
|
|
12
|
+
import { namedMiddleware } from "./middleware.js";
|
|
13
|
+
const PREFIX_LENGTH = /^\d{1,3}$/;
|
|
14
|
+
function v4Range(n, prefix) {
|
|
15
|
+
/* a shift by 32 is a shift by 0 in JS: /0 is spelled out */
|
|
16
|
+
const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;
|
|
17
|
+
return { base: (n & mask) >>> 0, mask, v: 4 };
|
|
18
|
+
}
|
|
19
|
+
/** An address or CIDR rule, strict: no brackets, zone or port, a prefix that fits the family. */
|
|
20
|
+
function parseRule(rule) {
|
|
21
|
+
const slash = rule.indexOf("/");
|
|
22
|
+
const text = slash === -1 ? rule : rule.slice(0, slash);
|
|
23
|
+
const bits = slash === -1 ? null : rule.slice(slash + 1);
|
|
24
|
+
if (bits !== null && !PREFIX_LENGTH.test(bits))
|
|
25
|
+
return null;
|
|
26
|
+
if (!text.includes(":")) {
|
|
27
|
+
const n = parseIpv4(text);
|
|
28
|
+
const prefix = bits === null ? 32 : Number(bits);
|
|
29
|
+
return n === null || prefix > 32 ? null : v4Range(n, prefix);
|
|
30
|
+
}
|
|
31
|
+
const n = parseIpv6(text);
|
|
32
|
+
const prefix = bits === null ? 128 : Number(bits);
|
|
33
|
+
if (n === null || prefix > 128)
|
|
34
|
+
return null;
|
|
35
|
+
/* `::ffff:a.b.c.d/96` or longer is the IPv4 range it maps, which is how ctx.ip spells those peers */
|
|
36
|
+
if (n >> 32n === 0xffffn && prefix >= 96)
|
|
37
|
+
return v4Range(Number(n & 0xffffffffn), prefix - 96);
|
|
38
|
+
const mask = ((1n << BigInt(prefix)) - 1n) << BigInt(128 - prefix);
|
|
39
|
+
return { base: n & mask, mask, v: 6 };
|
|
40
|
+
}
|
|
41
|
+
function rulesOf(list, name) {
|
|
42
|
+
return (list ?? []).map((rule) => {
|
|
43
|
+
const range = parseRule(rule);
|
|
44
|
+
if (range === null) {
|
|
45
|
+
throw new TypeError(`ipRestrict: ${name} entry ${JSON.stringify(rule)} is not an IP address or CIDR range`);
|
|
46
|
+
}
|
|
47
|
+
return range;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** ctx.ip is canonical (dotted IPv4 or RFC 5952 IPv6), so it always parses. */
|
|
51
|
+
function addressOf(ip) {
|
|
52
|
+
return ip.includes(":") ? { n: parseIpv6(ip), v: 6 } : { n: parseIpv4(ip), v: 4 };
|
|
53
|
+
}
|
|
54
|
+
function inRange(addr, range) {
|
|
55
|
+
if (addr.v === 4)
|
|
56
|
+
return range.v === 4 && (addr.n & range.mask) >>> 0 === range.base;
|
|
57
|
+
return range.v === 6 && (addr.n & range.mask) === range.base;
|
|
58
|
+
}
|
|
59
|
+
function forbidden() {
|
|
60
|
+
throw new HoneyError({ errorKey: "forbidden", status: "forbidden" });
|
|
61
|
+
}
|
|
62
|
+
export function ipRestrict(options) {
|
|
63
|
+
if (options.allowList?.length === 0) {
|
|
64
|
+
throw new TypeError("ipRestrict: `allowList: []` would refuse every request; remove the middleware or list addresses");
|
|
65
|
+
}
|
|
66
|
+
const deny = rulesOf(options.denyList, "denyList");
|
|
67
|
+
const allow = rulesOf(options.allowList, "allowList");
|
|
68
|
+
if (deny.length === 0 && allow.length === 0)
|
|
69
|
+
throw new TypeError("ipRestrict: pass a non-empty `allowList` or `denyList`");
|
|
70
|
+
const mw = (ctx, next) => {
|
|
71
|
+
if (ctx.ip === null)
|
|
72
|
+
return forbidden();
|
|
73
|
+
const addr = addressOf(ctx.ip);
|
|
74
|
+
if (deny.some((range) => inRange(addr, range)))
|
|
75
|
+
return forbidden();
|
|
76
|
+
if (allow.length > 0 && !allow.some((range) => inRange(addr, range)))
|
|
77
|
+
return forbidden();
|
|
78
|
+
return next();
|
|
79
|
+
};
|
|
80
|
+
mw.errors = ["forbidden"];
|
|
81
|
+
return namedMiddleware("ipRestrict", mw);
|
|
82
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export type MaybePromise<T> = Promise<T> | T;
|
|
2
|
+
/** A Response carrying, at the type level only, the context a middleware added. */
|
|
3
|
+
export type MiddlewareResult<TAdds = {}> = Response & {
|
|
4
|
+
readonly __adds?: TAdds;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Run the rest of the chain, optionally adding to the context. Answers synchronously when
|
|
8
|
+
* everything downstream did: `await` it, never `.then` it.
|
|
9
|
+
*/
|
|
10
|
+
export type NextFn = {
|
|
11
|
+
<T>(additions: T): MaybePromise<MiddlewareResult<T>>;
|
|
12
|
+
(): MaybePromise<MiddlewareResult<{}>>;
|
|
13
|
+
};
|
|
14
|
+
export type MiddlewareFn<TCtx = {}, TAdds = {}, TErrors extends string = string> = ((ctx: TCtx, next: NextFn) => MaybePromise<MiddlewareResult<TAdds>>) & {
|
|
15
|
+
errors?: readonly TErrors[];
|
|
16
|
+
/** Meta this middleware contributes to every route that mounts it. */
|
|
17
|
+
meta?: Readonly<Record<string, unknown>>;
|
|
18
|
+
};
|
|
19
|
+
/** A stored middleware, generics erased. */
|
|
20
|
+
export type RuntimeMiddleware = (ctx: Record<string, unknown>, next: (additions?: Record<string, unknown>) => MaybePromise<Response>) => MaybePromise<Response>;
|
|
21
|
+
/**
|
|
22
|
+
* Stamp a stable name on a middleware closure. `Function.prototype.name` is inferred by whatever
|
|
23
|
+
* transpiled the module, and transpilers disagree about a closure returned from a factory; a
|
|
24
|
+
* shipped middleware names itself so generated artifacts are deterministic.
|
|
25
|
+
*/
|
|
26
|
+
export declare function namedMiddleware<T extends object>(name: string, fn: T): T;
|
|
27
|
+
/** A middleware whose error keys are constrained to a factory; `.use()` accumulates them. */
|
|
28
|
+
export declare function defineMiddleware<TReqs, TAdds, TFactory extends Record<string, (...args: never[]) => unknown>, TKeys extends keyof TFactory & string>(opts: {
|
|
29
|
+
errors?: [TFactory, ...TKeys[]];
|
|
30
|
+
fn: MiddlewareFn<TReqs, TAdds>;
|
|
31
|
+
meta?: Record<string, unknown>;
|
|
32
|
+
}): MiddlewareFn<TReqs, TAdds, TKeys>;
|
|
33
|
+
/** The additions a middleware's return type carries; distributes over unions. */
|
|
34
|
+
type ExtractAdds<T> = Awaited<T> extends MiddlewareResult<infer A> ? A : never;
|
|
35
|
+
/**
|
|
36
|
+
* A middleware: annotate `ctx` for what it requires; what it adds is inferred from `next({...})`.
|
|
37
|
+
* createMiddleware((ctx: { env: { DB: D1Database } }, next) => next({ db }))
|
|
38
|
+
*/
|
|
39
|
+
export declare function createMiddleware<TReqs = {}, TRet extends MaybePromise<Response> = MaybePromise<MiddlewareResult<{}>>>(fn: (ctx: TReqs, next: NextFn) => TRet, opts?: {
|
|
40
|
+
meta?: Record<string, unknown>;
|
|
41
|
+
}): MiddlewareFn<TReqs, ExtractAdds<TRet>>;
|
|
42
|
+
/** Merge the meta a chain contributes, in run order (later wins). Resolved once at finalize. */
|
|
43
|
+
export declare function collectMiddlewareMeta(groups: ReadonlyArray<ReadonlyArray<RuntimeMiddleware>>): Record<string, unknown> | null;
|
|
44
|
+
/** Turns a value thrown inside a chain into the Response that stands in for it. Must not throw. */
|
|
45
|
+
export type ChainErrorConverter = (thrown: unknown, ctx: object) => MaybePromise<Response>;
|
|
46
|
+
export type CompiledChain = (ctx: object) => MaybePromise<Response>;
|
|
47
|
+
/**
|
|
48
|
+
* Compile a middleware chain and a handler into one function, once. Whatever the handler or a
|
|
49
|
+
* middleware throws or rejects with becomes a Response at that layer, so the middleware around it
|
|
50
|
+
* always gets a Response from `next()` and its post-`next()` code runs on errors too.
|
|
51
|
+
*/
|
|
52
|
+
export declare function compileChain(middlewares: readonly RuntimeMiddleware[], handler: (ctx: object) => MaybePromise<Response>, convert: ChainErrorConverter): CompiledChain;
|
|
53
|
+
export {};
|