@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,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finalize: resolve every registered route against its graph once, and compile what it runs.
|
|
3
|
+
* A route runs `chain → scopes covering it → route middleware`; its error keys, boundary, error
|
|
4
|
+
* factory and meta come from that chain and the app it was registered on. Re-runs whenever a
|
|
5
|
+
* registration moved the graph's epoch.
|
|
6
|
+
*/
|
|
7
|
+
import { REQUEST } from "../context/context.js";
|
|
8
|
+
import { withInput } from "../input/input.js";
|
|
9
|
+
import { compileResponseHeaders } from "../response/response-headers.js";
|
|
10
|
+
import { compileOutput, outputValidationOn, withOutput } from "../validation/validate-output.js";
|
|
11
|
+
import { collectMiddlewareMeta, compileChain, } from "../middleware/middleware.js";
|
|
12
|
+
import { assertTreeCurrent, delegatedRecords } from "./delegate.js";
|
|
13
|
+
import { commonPrefix } from "./middleware-chain.js";
|
|
14
|
+
import { canonical, expandOptional, isStaticPattern, variantsCoverage, splitRouteId, } from "./pattern.js";
|
|
15
|
+
import { assertNothingDiscarded, chainErrorKeys } from "./register.js";
|
|
16
|
+
import { assertSettingsAgree } from "./settings.js";
|
|
17
|
+
import { answering, firing, tapsFor } from "./tap.js";
|
|
18
|
+
import { dict } from "./tree.js";
|
|
19
|
+
const EMPTY_META = /* @__PURE__ */ Object.freeze({});
|
|
20
|
+
/** Route meta: what the middleware contributes, overlaid by everything stated explicitly. */
|
|
21
|
+
function routeMeta(chain, explicit) {
|
|
22
|
+
const contributed = collectMiddlewareMeta([chain]);
|
|
23
|
+
if (contributed === null)
|
|
24
|
+
return explicit === null ? null : Object.freeze({ ...explicit });
|
|
25
|
+
return Object.freeze(explicit === null ? contributed : { ...contributed, ...explicit });
|
|
26
|
+
}
|
|
27
|
+
/** The keys a route may throw: the app's defaults, its chain's, its own and its boundary. */
|
|
28
|
+
function declaredKeys(src, chain, own, boundaryKey) {
|
|
29
|
+
const declared = new Set([...src.defaultErrorKeys, ...chainErrorKeys(chain), ...own]);
|
|
30
|
+
if (boundaryKey !== null)
|
|
31
|
+
declared.add(boundaryKey);
|
|
32
|
+
return declared;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* ctx.errors: a frozen copy, so a handler never reaches a factory itself. An open route (nothing
|
|
36
|
+
* declared) gets every key of the app's factory; a declared key comes from the factory the route
|
|
37
|
+
* named, else the app's.
|
|
38
|
+
*/
|
|
39
|
+
function ctxErrors(factory, named, declared) {
|
|
40
|
+
if (factory === null && named === null)
|
|
41
|
+
return null;
|
|
42
|
+
const subset = Object.create(null);
|
|
43
|
+
if (declared === null)
|
|
44
|
+
return Object.freeze(Object.assign(subset, factory));
|
|
45
|
+
for (const key of declared) {
|
|
46
|
+
const from = named !== null && Object.hasOwn(named, key) ? named : factory;
|
|
47
|
+
if (from !== null && Object.hasOwn(from, key))
|
|
48
|
+
subset[key] = from[key];
|
|
49
|
+
}
|
|
50
|
+
return Object.freeze(subset);
|
|
51
|
+
}
|
|
52
|
+
/** The error keys, boundary and factory a chain resolves to under `src`'s defaults. */
|
|
53
|
+
function resolveErrors(src, chain, route) {
|
|
54
|
+
const boundaryKey = route?.rb ?? src.defaultBoundaryKey;
|
|
55
|
+
const keys = declaredKeys(src, chain, route?.dk ?? new Set(), boundaryKey);
|
|
56
|
+
const declared = keys.size > 0 ? keys : null;
|
|
57
|
+
const errors = ctxErrors(src.errorFactory, route?.ef ?? null, declared);
|
|
58
|
+
return { errors, policy: { boundaryKey, declared, factory: src.errorFactory } };
|
|
59
|
+
}
|
|
60
|
+
/** The scoped middleware a pattern runs: whole where the scope covers it, behind the path check where it covers part. */
|
|
61
|
+
export function scopesFor(g, variants) {
|
|
62
|
+
const out = [];
|
|
63
|
+
for (const entry of g.scoped) {
|
|
64
|
+
const coverage = variantsCoverage(variants, entry.segs);
|
|
65
|
+
if (coverage === "all")
|
|
66
|
+
out.push(entry.mw);
|
|
67
|
+
else if (coverage === "some")
|
|
68
|
+
out.push(entry.guard);
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/** The runtime's `process`, where there is one (Node, Bun); Workers have none. */
|
|
73
|
+
function globalProcess() {
|
|
74
|
+
return globalThis.process;
|
|
75
|
+
}
|
|
76
|
+
/** The request's trace: an app with telemetry traces every request it serves, and only its chains are wrapped. */
|
|
77
|
+
function traceOf(ctx) {
|
|
78
|
+
return ctx[REQUEST].trace;
|
|
79
|
+
}
|
|
80
|
+
/** `mw` inside a `middleware.<name>` span on a traced request. */
|
|
81
|
+
function tracedMiddleware(mw) {
|
|
82
|
+
const name = `middleware.${mw.name || "anonymous"}`;
|
|
83
|
+
return (ctx, next) => traceOf(ctx).within(name, () => mw(ctx, next));
|
|
84
|
+
}
|
|
85
|
+
/** The route handler inside an `http.handler` span, active for the app's own instrumentation. */
|
|
86
|
+
function tracedHandler(handler) {
|
|
87
|
+
return (ctx) => {
|
|
88
|
+
const trace = traceOf(ctx);
|
|
89
|
+
return trace.within("http.handler", (span) => trace.run(span, () => handler(ctx)));
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function planRoute(g, r, variants, hooks) {
|
|
93
|
+
const src = r.own.errorFactory === null ? g.settings : r.own;
|
|
94
|
+
const chain = [...r.cm, ...scopesFor(g, variants), ...r.rm];
|
|
95
|
+
const { errors, policy } = resolveErrors(src, chain, r);
|
|
96
|
+
const meta = routeMeta(chain, r.xm);
|
|
97
|
+
r.mt = meta;
|
|
98
|
+
/* only a route with taps pays for them: the handler marks its answer, the chain fires after */
|
|
99
|
+
const taps = tapsFor(g.settings, r.own);
|
|
100
|
+
const traced = g.settings.telemetry !== null;
|
|
101
|
+
const run = traced ? chain.map(tracedMiddleware) : chain;
|
|
102
|
+
/* only a route with .input() pays for it: the step runs between the middleware and the handler */
|
|
103
|
+
const input = r.in === null ? r.fn : withInput(r.in, r.fn);
|
|
104
|
+
/* only a route with .output() in an app checking answers pays for the check */
|
|
105
|
+
const checked = r.out !== null && outputValidationOn(g.settings.outputValidation, globalProcess());
|
|
106
|
+
const fn = checked
|
|
107
|
+
? withOutput(compileOutput(r.out, compileResponseHeaders(r.out.headers)), input)
|
|
108
|
+
: input;
|
|
109
|
+
const handler = traced ? tracedHandler(taps === null ? fn : answering(fn)) : taps === null ? fn : answering(fn);
|
|
110
|
+
const compiled = compileChain(run, handler, hooks.convert);
|
|
111
|
+
return {
|
|
112
|
+
cv: r.cv,
|
|
113
|
+
mw: chain,
|
|
114
|
+
pf: null,
|
|
115
|
+
pfChain: run,
|
|
116
|
+
policy,
|
|
117
|
+
route: { errors, id: r.id, meta: meta ?? EMPTY_META, pattern: r.rp },
|
|
118
|
+
run: taps === null ? compiled : firing(compiled, taps),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 404 and 405 run through the same pipeline as a route: the middleware every route starts with
|
|
123
|
+
* (with no routes: every handle that served a request), then every scope behind its path check.
|
|
124
|
+
* So an app-wide logger or CORS policy covers unknown paths, and a scope's guard answers before
|
|
125
|
+
* "not found" leaks what exists under it.
|
|
126
|
+
*/
|
|
127
|
+
function planMiss(g, hooks) {
|
|
128
|
+
const chains = [...g.records.values()].map((r) => r.cm);
|
|
129
|
+
const prefix = commonPrefix(chains.length > 0 ? chains : [...g.served]);
|
|
130
|
+
const chain = [...prefix, ...g.scoped.map((entry) => entry.guard)];
|
|
131
|
+
const { errors, policy } = resolveErrors(g.settings, chain, null);
|
|
132
|
+
const meta = routeMeta(chain, null);
|
|
133
|
+
const run = g.settings.telemetry === null ? chain : chain.map(tracedMiddleware);
|
|
134
|
+
return {
|
|
135
|
+
cv: null,
|
|
136
|
+
mw: chain,
|
|
137
|
+
pf: null,
|
|
138
|
+
pfChain: run,
|
|
139
|
+
policy,
|
|
140
|
+
route: { errors, id: "", meta: meta ?? EMPTY_META, pattern: "" },
|
|
141
|
+
run: compileChain(run, hooks.miss, hooks.convert),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/** The graph's final table, recompiled only when a registration moved its epoch. */
|
|
145
|
+
export function finalize(g, hooks) {
|
|
146
|
+
if (g.final !== null && g.final.epoch === g.epoch)
|
|
147
|
+
return g.final;
|
|
148
|
+
assertNothingDiscarded(g);
|
|
149
|
+
assertSettingsAgree(g.settings);
|
|
150
|
+
assertTreeCurrent(g);
|
|
151
|
+
const plans = new Map();
|
|
152
|
+
const statics = dict();
|
|
153
|
+
let ws = false;
|
|
154
|
+
for (const [id, r] of [...g.records, ...delegatedRecords(g)]) {
|
|
155
|
+
const variants = expandOptional(r.sg);
|
|
156
|
+
const plan = planRoute(g, r, variants, hooks);
|
|
157
|
+
plans.set(id, plan);
|
|
158
|
+
const { method } = splitRouteId(id);
|
|
159
|
+
if (method === "WS")
|
|
160
|
+
ws = true;
|
|
161
|
+
for (const variant of variants) {
|
|
162
|
+
if (isStaticPattern(variant))
|
|
163
|
+
(statics[method] ??= dict())[canonical(variant)] = plan;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const miss = planMiss(g, hooks);
|
|
167
|
+
g.final = { epoch: g.epoch, miss, notFound: miss.pfChain.length === 0 ? hooks.notFound : null, plans, statics, ws };
|
|
168
|
+
return g.final;
|
|
169
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { GRAPH, type HoneyGraph } from "./register.ts";
|
|
2
|
+
import { type RouteTree } from "./tree.ts";
|
|
3
|
+
type App = {
|
|
4
|
+
readonly [GRAPH]: HoneyGraph;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* The tree a gateway serves: `source` (its services' merged routes) with the gateway's own routes
|
|
8
|
+
* as further leaves. Its root wildcards stay out, as the catch-all the services' routes delegate
|
|
9
|
+
* to, and so do the routes it serves about itself (serveOpenApi, serveManifest). An own route that is also a service route throws, unless `source` is the gateway's own snapshot.
|
|
10
|
+
*/
|
|
11
|
+
export declare function gatewayTree(app: App, source: RouteTree): RouteTree;
|
|
12
|
+
/**
|
|
13
|
+
* Give `app`'s routes the input and output declarations `source` holds for them where they
|
|
14
|
+
* declare none: a gateway documents each service route by the service's schemas. Its own stay.
|
|
15
|
+
* A gateway serving its generated tree holds its services' routes as loaded leaves, without a
|
|
16
|
+
* record (bit 19 h2): those leaves take the schemas the same way.
|
|
17
|
+
*/
|
|
18
|
+
export declare function overlaySchemas(app: App, source: RouteTree): void;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate time, for a gateway: the tree it serves (its services' routes and its own) and the
|
|
3
|
+
* schemas it documents its services' routes with. Pure: the gateway serves the result through
|
|
4
|
+
* `routeTree()` like any generated tree.
|
|
5
|
+
*/
|
|
6
|
+
import { expandOptional, parsePattern, splitRouteId } from "./pattern.js";
|
|
7
|
+
import { GRAPH, isServed } from "./register.js";
|
|
8
|
+
import { snapshotRouteTree } from "./route-tree.js";
|
|
9
|
+
import { assertTreeFormat, cloneTree, dict, insertLeaf, ROUTE_TREE_VERSION, } from "./tree.js";
|
|
10
|
+
/** An entry as a generated file carries it: data only, no live record. */
|
|
11
|
+
function dataOf({ h: _live, ...data }) {
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
const isRootWildcard = (id) => {
|
|
15
|
+
const segments = parsePattern(splitRouteId(id).pattern);
|
|
16
|
+
return segments.length === 1 && segments[0]?.k === "wildcard";
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The tree a gateway serves: `source` (its services' merged routes) with the gateway's own routes
|
|
20
|
+
* as further leaves. Its root wildcards stay out, as the catch-all the services' routes delegate
|
|
21
|
+
* to, and so do the routes it serves about itself (serveOpenApi, serveManifest). An own route that is also a service route throws, unless `source` is the gateway's own snapshot.
|
|
22
|
+
*/
|
|
23
|
+
export function gatewayTree(app, source) {
|
|
24
|
+
assertTreeFormat(source);
|
|
25
|
+
const g = app[GRAPH];
|
|
26
|
+
const routes = dict();
|
|
27
|
+
for (const [id, entry] of Object.entries(source.routes))
|
|
28
|
+
routes[id] = dataOf(entry);
|
|
29
|
+
/* a route the app serves about itself stays out, as in its snapshot: each app serving the tree mounts its own */
|
|
30
|
+
const own = [...g.records].filter(([id, r]) => !isRootWildcard(id) && !isServed(r)).map(([id]) => id);
|
|
31
|
+
const shadowed = own.filter((id) => Object.hasOwn(routes, id));
|
|
32
|
+
const served = (id) => g.records.has(id) || g.catchAll.has(id);
|
|
33
|
+
const self = own.length > 0 && shadowed.length === own.length && Object.keys(routes).every(served);
|
|
34
|
+
if (shadowed.length > 0 && !self) {
|
|
35
|
+
throw new Error(`Gateway routes are also downstream routes in the merged tree: ${shadowed.join(", ")}`);
|
|
36
|
+
}
|
|
37
|
+
const root = cloneTree(source.root);
|
|
38
|
+
if (!self) {
|
|
39
|
+
const snapshot = snapshotRouteTree(g);
|
|
40
|
+
for (const id of own) {
|
|
41
|
+
const { method } = splitRouteId(id);
|
|
42
|
+
for (const variant of expandOptional(g.records.get(id).sg))
|
|
43
|
+
insertLeaf(root, variant, method, id);
|
|
44
|
+
routes[id] = dataOf(snapshot.routes[id]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { meta: { ...source.meta }, root, routes, v: ROUTE_TREE_VERSION };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Give `app`'s routes the input and output declarations `source` holds for them where they
|
|
51
|
+
* declare none: a gateway documents each service route by the service's schemas. Its own stay.
|
|
52
|
+
* A gateway serving its generated tree holds its services' routes as loaded leaves, without a
|
|
53
|
+
* record (bit 19 h2): those leaves take the schemas the same way.
|
|
54
|
+
*/
|
|
55
|
+
export function overlaySchemas(app, source) {
|
|
56
|
+
const g = app[GRAPH];
|
|
57
|
+
const leaves = dict();
|
|
58
|
+
for (const [id, entry] of Object.entries(source.routes)) {
|
|
59
|
+
const target = g.records.get(id);
|
|
60
|
+
const leaf = g.loaded?.[id];
|
|
61
|
+
if (target !== undefined)
|
|
62
|
+
g.records.set(id, { ...target, ...schemasOf(target, entry) });
|
|
63
|
+
else if (leaf !== undefined)
|
|
64
|
+
leaves[id] = { ...leaf, ...schemasOf(leaf, entry) };
|
|
65
|
+
}
|
|
66
|
+
if (g.loaded !== null && Object.keys(leaves).length > 0)
|
|
67
|
+
g.loaded = Object.assign(dict(), g.loaded, leaves);
|
|
68
|
+
g.epoch++;
|
|
69
|
+
}
|
|
70
|
+
/** `target`'s own schemas, else what `entry` declares, else its live record's. */
|
|
71
|
+
function schemasOf(target, entry) {
|
|
72
|
+
const live = entry.h;
|
|
73
|
+
return { iv: target.iv ?? entry.iv ?? live?.iv ?? null, out: target.out ?? entry.out ?? live?.out ?? null };
|
|
74
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codegen-time check: mutations that declare no `invalidate`.
|
|
3
|
+
*
|
|
4
|
+
* A correctness signal, not a documentation one: `x-invalidate` drives generated SDK behavior (the
|
|
5
|
+
* Rust and Go clients expand it into an invalidation post-flight, the Python client reads it), so a
|
|
6
|
+
* mutation with no `invalidate` produces clients that refresh nothing after the call.
|
|
7
|
+
*
|
|
8
|
+
* It warns and never blocks by default: plenty of mutations correctly invalidate nothing (login,
|
|
9
|
+
* logout, webhook receipt) and plenty of honey users never generate an SDK. A rule that fails the
|
|
10
|
+
* build teaches people to paste the shortest token that makes it pass. This module only decides;
|
|
11
|
+
* the OpenAPI emitter throws or logs the report.
|
|
12
|
+
*/
|
|
13
|
+
/** How a missing `invalidate` is reported. Default `"warn"`. */
|
|
14
|
+
export type InvalidateCheckLevel = "error" | "off" | "warn";
|
|
15
|
+
export type InvalidateCheckConfig = {
|
|
16
|
+
/**
|
|
17
|
+
* Operation extension naming the entity an operation touches, e.g. `"x-entity"`. A mutation and
|
|
18
|
+
* a read carrying the same value is a sharper signal than path shape. honey does not own the
|
|
19
|
+
* key's name; the app says which one it uses.
|
|
20
|
+
*/
|
|
21
|
+
entityKey?: string;
|
|
22
|
+
level?: InvalidateCheckLevel;
|
|
23
|
+
} | InvalidateCheckLevel;
|
|
24
|
+
export type InvalidateCheckOperation = {
|
|
25
|
+
/** lowercased HTTP method */
|
|
26
|
+
method: string;
|
|
27
|
+
/** route meta as authored, to tell "absent" from a deliberate "nothing" */
|
|
28
|
+
meta: Record<string, unknown> | null;
|
|
29
|
+
/** the emitted operation object */
|
|
30
|
+
operation: Record<string, unknown>;
|
|
31
|
+
/** OpenAPI-style path */
|
|
32
|
+
path: string;
|
|
33
|
+
};
|
|
34
|
+
export type InvalidateFinding = {
|
|
35
|
+
/** read operations that make this mutation look like an oversight */
|
|
36
|
+
affects: string[];
|
|
37
|
+
method: string;
|
|
38
|
+
path: string;
|
|
39
|
+
};
|
|
40
|
+
/** The level an `invalidate` config reports at. */
|
|
41
|
+
export declare function invalidateLevel(config: InvalidateCheckConfig | undefined): InvalidateCheckLevel;
|
|
42
|
+
/** Mutations with no `invalidate` that the document suggests should have one. */
|
|
43
|
+
export declare function findMissingInvalidate(operations: readonly InvalidateCheckOperation[], entityKey: string | undefined): InvalidateFinding[];
|
|
44
|
+
/**
|
|
45
|
+
* The report for mutations with no `invalidate`, or `null` when the check is off or finds nothing.
|
|
46
|
+
* One summary, never one line per operation: a warning that fires 53 times gets filtered out of
|
|
47
|
+
* the log; one that fires once and lists 10 gets read.
|
|
48
|
+
*/
|
|
49
|
+
export declare function missingInvalidateReport(operations: readonly InvalidateCheckOperation[], config: InvalidateCheckConfig | undefined): string | null;
|
|
50
|
+
/**
|
|
51
|
+
* `invalidate` selectors that name no route. A selector is `"<METHOD> <pattern>"`, exactly as the
|
|
52
|
+
* generated `RouteSelector` union spells it; anything else invalidates nothing at runtime.
|
|
53
|
+
*/
|
|
54
|
+
export declare function findInvalidSelectors(operations: readonly InvalidateCheckOperation[], inventory: ReadonlySet<string>): Array<{
|
|
55
|
+
method: string;
|
|
56
|
+
path: string;
|
|
57
|
+
selector: unknown;
|
|
58
|
+
}>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codegen-time check: mutations that declare no `invalidate`.
|
|
3
|
+
*
|
|
4
|
+
* A correctness signal, not a documentation one: `x-invalidate` drives generated SDK behavior (the
|
|
5
|
+
* Rust and Go clients expand it into an invalidation post-flight, the Python client reads it), so a
|
|
6
|
+
* mutation with no `invalidate` produces clients that refresh nothing after the call.
|
|
7
|
+
*
|
|
8
|
+
* It warns and never blocks by default: plenty of mutations correctly invalidate nothing (login,
|
|
9
|
+
* logout, webhook receipt) and plenty of honey users never generate an SDK. A rule that fails the
|
|
10
|
+
* build teaches people to paste the shortest token that makes it pass. This module only decides;
|
|
11
|
+
* the OpenAPI emitter throws or logs the report.
|
|
12
|
+
*/
|
|
13
|
+
const MUTATION_METHODS = ["delete", "patch", "post", "put"];
|
|
14
|
+
const MAX_LISTED = 20;
|
|
15
|
+
function resolveConfig(config) {
|
|
16
|
+
if (config === undefined)
|
|
17
|
+
return { level: "warn" };
|
|
18
|
+
if (typeof config === "string")
|
|
19
|
+
return { level: config };
|
|
20
|
+
return { entityKey: config.entityKey, level: config.level ?? "warn" };
|
|
21
|
+
}
|
|
22
|
+
/** The level an `invalidate` config reports at. */
|
|
23
|
+
export function invalidateLevel(config) {
|
|
24
|
+
return resolveConfig(config).level;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Did the author record a decision? `null` and `[]` both say "this mutation refreshes nothing";
|
|
28
|
+
* absent says nothing at all, which is what this check looks for.
|
|
29
|
+
*/
|
|
30
|
+
function declaredNothing(meta) {
|
|
31
|
+
if (meta === null || !Object.hasOwn(meta, "invalidate"))
|
|
32
|
+
return false;
|
|
33
|
+
const value = meta.invalidate;
|
|
34
|
+
return value === null || (Array.isArray(value) && value.length === 0);
|
|
35
|
+
}
|
|
36
|
+
const nonEmpty = (value) => Array.isArray(value) && value.length > 0;
|
|
37
|
+
/** Declared in the meta, or emitted: a profile that leaves `x-invalidate` out must not make every mutation look undeclared. */
|
|
38
|
+
function alreadyInvalidates(entry) {
|
|
39
|
+
return nonEmpty(entry.meta?.invalidate) || nonEmpty(entry.operation["x-invalidate"]);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Paths a mutation plausibly affects: its own, and its collection when it targets an item.
|
|
43
|
+
* `DELETE /tables/{id}` affects `GET /tables/{id}` and `GET /tables`.
|
|
44
|
+
*/
|
|
45
|
+
function pathFamily(path) {
|
|
46
|
+
const segments = path.split("/");
|
|
47
|
+
const last = segments.at(-1);
|
|
48
|
+
const item = last.startsWith("{") && last.endsWith("}") && segments.length > 2;
|
|
49
|
+
return item ? [path, segments.slice(0, -1).join("/")] : [path];
|
|
50
|
+
}
|
|
51
|
+
function entityOf(entry, entityKey) {
|
|
52
|
+
const entity = entityKey === undefined ? undefined : entry.operation[entityKey];
|
|
53
|
+
return entity === undefined || entity === null ? null : JSON.stringify(entity);
|
|
54
|
+
}
|
|
55
|
+
function readIndex(operations, entityKey) {
|
|
56
|
+
const paths = new Set();
|
|
57
|
+
const byEntity = new Map();
|
|
58
|
+
for (const entry of operations.filter((o) => o.method === "get")) {
|
|
59
|
+
paths.add(entry.path);
|
|
60
|
+
const entity = entityOf(entry, entityKey);
|
|
61
|
+
if (entity !== null)
|
|
62
|
+
byEntity.set(entity, [...(byEntity.get(entity) ?? []), `GET ${entry.path}`]);
|
|
63
|
+
}
|
|
64
|
+
return { byEntity, paths };
|
|
65
|
+
}
|
|
66
|
+
/** Mutations with no `invalidate` that the document suggests should have one. */
|
|
67
|
+
export function findMissingInvalidate(operations, entityKey) {
|
|
68
|
+
const reads = readIndex(operations, entityKey);
|
|
69
|
+
const undeclared = operations.filter((e) => MUTATION_METHODS.includes(e.method) && !alreadyInvalidates(e) && !declaredNothing(e.meta));
|
|
70
|
+
return undeclared.flatMap((entry) => {
|
|
71
|
+
const entity = entityOf(entry, entityKey);
|
|
72
|
+
/* the same entity read elsewhere is sharper than path shape; with no tagged reader, path shape still speaks */
|
|
73
|
+
const byEntity = entity === null ? [] : (reads.byEntity.get(entity) ?? []);
|
|
74
|
+
const affects = byEntity.length > 0
|
|
75
|
+
? byEntity
|
|
76
|
+
: pathFamily(entry.path)
|
|
77
|
+
.filter((p) => reads.paths.has(p))
|
|
78
|
+
.map((p) => `GET ${p}`);
|
|
79
|
+
return affects.length === 0 ? [] : [{ affects, method: entry.method.toUpperCase(), path: entry.path }];
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The report for mutations with no `invalidate`, or `null` when the check is off or finds nothing.
|
|
84
|
+
* One summary, never one line per operation: a warning that fires 53 times gets filtered out of
|
|
85
|
+
* the log; one that fires once and lists 10 gets read.
|
|
86
|
+
*/
|
|
87
|
+
export function missingInvalidateReport(operations, config) {
|
|
88
|
+
const { entityKey, level } = resolveConfig(config);
|
|
89
|
+
if (level === "off")
|
|
90
|
+
return null;
|
|
91
|
+
const findings = findMissingInvalidate(operations, entityKey);
|
|
92
|
+
if (findings.length === 0)
|
|
93
|
+
return null;
|
|
94
|
+
const width = Math.max(...findings.map((f) => f.method.length));
|
|
95
|
+
const shown = findings
|
|
96
|
+
.slice(0, MAX_LISTED)
|
|
97
|
+
.map((f) => ` ${f.method.padEnd(width)} ${f.path} → ${f.affects.join(", ")}`);
|
|
98
|
+
const more = findings.length > shown.length ? `\n … and ${findings.length - shown.length} more` : "";
|
|
99
|
+
return (`[honey:invalidate] ${findings.length} mutation(s) declare no \`invalidate\`, but the document has ` +
|
|
100
|
+
"read routes they plausibly affect.\nGenerated SDK clients refresh nothing after these calls.\n" +
|
|
101
|
+
`${shown.join("\n")}${more}\n` +
|
|
102
|
+
"Declare the routes each one refreshes, or `invalidate: null` to record that it refreshes nothing.");
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* `invalidate` selectors that name no route. A selector is `"<METHOD> <pattern>"`, exactly as the
|
|
106
|
+
* generated `RouteSelector` union spells it; anything else invalidates nothing at runtime.
|
|
107
|
+
*/
|
|
108
|
+
export function findInvalidSelectors(operations, inventory) {
|
|
109
|
+
const out = [];
|
|
110
|
+
const seen = new Set();
|
|
111
|
+
for (const entry of operations) {
|
|
112
|
+
const declared = entry.meta?.invalidate;
|
|
113
|
+
if (!Array.isArray(declared))
|
|
114
|
+
continue;
|
|
115
|
+
for (const selector of declared) {
|
|
116
|
+
const key = `${entry.method} ${entry.path} ${String(selector)}`;
|
|
117
|
+
if ((typeof selector === "string" && inventory.has(selector)) || seen.has(key))
|
|
118
|
+
continue;
|
|
119
|
+
seen.add(key);
|
|
120
|
+
out.push({ method: entry.method.toUpperCase(), path: entry.path, selector });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request matching over the route tree. Depth-first in precedence order (static, then param, then
|
|
3
|
+
* wildcard), retrying the next branch on a dead end and on a method miss. A trie node sits at one
|
|
4
|
+
* depth, so each node is visited at most once per request: the walk is linear in the route set,
|
|
5
|
+
* and recursion depth is bounded by the deepest registered route, not by the request path.
|
|
6
|
+
*/
|
|
7
|
+
import type { RouteId } from "./pattern.ts";
|
|
8
|
+
import { type TreeNode } from "./tree.ts";
|
|
9
|
+
import type { HttpMethod } from "./types.ts";
|
|
10
|
+
export type MatchResult = {
|
|
11
|
+
allowed: HttpMethod[];
|
|
12
|
+
matched: false;
|
|
13
|
+
} | {
|
|
14
|
+
id: RouteId;
|
|
15
|
+
matched: true;
|
|
16
|
+
params: Record<string, string>;
|
|
17
|
+
} | null;
|
|
18
|
+
export declare function matchRoute(root: TreeNode, method: HttpMethod | string, path: string): MatchResult;
|
|
19
|
+
export declare function matchWsRoute(root: TreeNode, path: string): {
|
|
20
|
+
id: RouteId;
|
|
21
|
+
params: Record<string, string>;
|
|
22
|
+
} | null;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { dict } from "./tree.js";
|
|
2
|
+
function decode(s) {
|
|
3
|
+
if (!s.includes("%"))
|
|
4
|
+
return s;
|
|
5
|
+
try {
|
|
6
|
+
return decodeURIComponent(s);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
/* a malformed escape is client data: the param keeps it as written */
|
|
10
|
+
return s;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** The exact method, then GET for HEAD, then ALL. */
|
|
14
|
+
function pickMethod(m, method) {
|
|
15
|
+
return m[method] ?? (method === "HEAD" ? m.GET : undefined) ?? m.ALL;
|
|
16
|
+
}
|
|
17
|
+
function addAllowed(st, m) {
|
|
18
|
+
st.allowed ??= new Set();
|
|
19
|
+
/* a map holding ALL never misses (pickMethod falls back to it), so every key here is a method */
|
|
20
|
+
for (const k in m)
|
|
21
|
+
st.allowed.add(k);
|
|
22
|
+
}
|
|
23
|
+
/** A wildcard's leaf for the method, capturing `rest`; on a method miss its methods join Allow. */
|
|
24
|
+
function wildcardHit(node, rest, st) {
|
|
25
|
+
if (node.w === null)
|
|
26
|
+
return undefined;
|
|
27
|
+
const id = pickMethod(node.w.m, st.method);
|
|
28
|
+
if (id === undefined) {
|
|
29
|
+
addAllowed(st, node.w.m);
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
st.names.push(node.w.n);
|
|
33
|
+
st.values.push(rest);
|
|
34
|
+
return id;
|
|
35
|
+
}
|
|
36
|
+
function skipSlashes(path, pos) {
|
|
37
|
+
let at = pos;
|
|
38
|
+
while (path.charCodeAt(at) === 47)
|
|
39
|
+
at++;
|
|
40
|
+
return at;
|
|
41
|
+
}
|
|
42
|
+
/** The leaf at the end of the path: this node's methods, else an empty wildcard below it. */
|
|
43
|
+
function endOfPath(node, st) {
|
|
44
|
+
if (node.m !== null) {
|
|
45
|
+
const id = pickMethod(node.m, st.method);
|
|
46
|
+
if (id !== undefined)
|
|
47
|
+
return id;
|
|
48
|
+
addAllowed(st, node.m);
|
|
49
|
+
}
|
|
50
|
+
return wildcardHit(node, "", st);
|
|
51
|
+
}
|
|
52
|
+
/** Try the param branch with `seg` bound; unbind it again on a dead end. */
|
|
53
|
+
function tryParam(node, seg, end, st) {
|
|
54
|
+
if (node.d === null)
|
|
55
|
+
return undefined;
|
|
56
|
+
const depth = st.names.length;
|
|
57
|
+
st.names.push(node.d.n);
|
|
58
|
+
st.values.push(decode(seg));
|
|
59
|
+
const id = st.walk(node.d.c, end, st);
|
|
60
|
+
if (id !== undefined)
|
|
61
|
+
return id;
|
|
62
|
+
st.names.length = depth;
|
|
63
|
+
st.values.length = depth;
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
function walk(node, from, st) {
|
|
67
|
+
const pos = skipSlashes(st.path, from);
|
|
68
|
+
if (pos >= st.path.length)
|
|
69
|
+
return endOfPath(node, st);
|
|
70
|
+
const slash = st.path.indexOf("/", pos);
|
|
71
|
+
const end = slash === -1 ? st.path.length : slash;
|
|
72
|
+
const seg = st.path.substring(pos, end);
|
|
73
|
+
const staticChild = node.s[seg];
|
|
74
|
+
const viaStatic = staticChild === undefined ? undefined : walk(staticChild, end, st);
|
|
75
|
+
return viaStatic ?? tryParam(node, seg, end, st) ?? wildcardHit(node, decode(st.path.substring(pos)), st);
|
|
76
|
+
}
|
|
77
|
+
function paramsOf(st) {
|
|
78
|
+
const params = dict();
|
|
79
|
+
st.names.forEach((name, i) => {
|
|
80
|
+
params[name] = st.values[i];
|
|
81
|
+
});
|
|
82
|
+
return params;
|
|
83
|
+
}
|
|
84
|
+
export function matchRoute(root, method, path) {
|
|
85
|
+
const st = { allowed: null, method, names: [], path, values: [], walk };
|
|
86
|
+
const id = walk(root, 0, st);
|
|
87
|
+
if (id !== undefined)
|
|
88
|
+
return { id, matched: true, params: paramsOf(st) };
|
|
89
|
+
if (st.allowed !== null)
|
|
90
|
+
return { allowed: [...st.allowed], matched: false };
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
function walkWs(node, from, st) {
|
|
94
|
+
const pos = skipSlashes(st.path, from);
|
|
95
|
+
if (pos >= st.path.length)
|
|
96
|
+
return node.ws ?? undefined;
|
|
97
|
+
const slash = st.path.indexOf("/", pos);
|
|
98
|
+
const end = slash === -1 ? st.path.length : slash;
|
|
99
|
+
const seg = st.path.substring(pos, end);
|
|
100
|
+
const staticChild = node.s[seg];
|
|
101
|
+
const viaStatic = staticChild === undefined ? undefined : walkWs(staticChild, end, st);
|
|
102
|
+
return viaStatic ?? tryParam(node, seg, end, st);
|
|
103
|
+
}
|
|
104
|
+
export function matchWsRoute(root, path) {
|
|
105
|
+
const st = { allowed: null, method: "WS", names: [], path, values: [], walk: walkWs };
|
|
106
|
+
const id = walkWs(root, 0, st);
|
|
107
|
+
return id === undefined ? null : { id, params: paramsOf(st) };
|
|
108
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatch-side middleware helpers, run once at finalize: the request-path guard behind a scoped
|
|
3
|
+
* `use()`, and what 404/405 run (the run of middleware every route starts with). Tracing wraps
|
|
4
|
+
* middleware in telemetry/request-trace.ts.
|
|
5
|
+
*/
|
|
6
|
+
import type { RuntimeMiddleware } from "../middleware/middleware.ts";
|
|
7
|
+
import { type Segment } from "./pattern.ts";
|
|
8
|
+
/** The error keys a middleware declares (`defineMiddleware`). */
|
|
9
|
+
export declare function errorsOf(mw: RuntimeMiddleware): readonly string[] | undefined;
|
|
10
|
+
/** The factory a middleware's error keys come from (`defineMiddleware`). */
|
|
11
|
+
export declare function errorFactoryOf(mw: RuntimeMiddleware): Readonly<Record<string, unknown>> | undefined;
|
|
12
|
+
/** A scoped middleware behind a request-path check: it runs only when the path is inside the scope. */
|
|
13
|
+
export declare function scopeGuard(segs: readonly Segment[], mw: RuntimeMiddleware): RuntimeMiddleware;
|
|
14
|
+
/** The longest run of middleware every chain starts with: what 404 and 405 run. */
|
|
15
|
+
export declare function commonPrefix(chains: ReadonlyArray<readonly RuntimeMiddleware[]>): RuntimeMiddleware[];
|
|
16
|
+
export declare function describeMw(mw: RuntimeMiddleware): string;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { pathInScope } from "./pattern.js";
|
|
2
|
+
/** The error keys a middleware declares (`defineMiddleware`). */
|
|
3
|
+
export function errorsOf(mw) {
|
|
4
|
+
return mw.errors;
|
|
5
|
+
}
|
|
6
|
+
/** The factory a middleware's error keys come from (`defineMiddleware`). */
|
|
7
|
+
export function errorFactoryOf(mw) {
|
|
8
|
+
return mw.errorFactory;
|
|
9
|
+
}
|
|
10
|
+
/** A scoped middleware behind a request-path check: it runs only when the path is inside the scope. */
|
|
11
|
+
export function scopeGuard(segs, mw) {
|
|
12
|
+
const guard = (ctx, next) => (pathInScope(ctx.path, segs) ? mw(ctx, next) : next());
|
|
13
|
+
Object.defineProperty(guard, "name", { configurable: true, value: mw.name });
|
|
14
|
+
const errors = errorsOf(mw);
|
|
15
|
+
const factory = errorFactoryOf(mw);
|
|
16
|
+
const meta = mw.meta;
|
|
17
|
+
if (errors)
|
|
18
|
+
Object.defineProperty(guard, "errors", { value: errors });
|
|
19
|
+
if (factory)
|
|
20
|
+
Object.defineProperty(guard, "errorFactory", { value: factory });
|
|
21
|
+
if (meta)
|
|
22
|
+
Object.defineProperty(guard, "meta", { value: meta });
|
|
23
|
+
return guard;
|
|
24
|
+
}
|
|
25
|
+
/** The longest run of middleware every chain starts with: what 404 and 405 run. */
|
|
26
|
+
export function commonPrefix(chains) {
|
|
27
|
+
const [first, ...rest] = chains;
|
|
28
|
+
if (first === undefined)
|
|
29
|
+
return [];
|
|
30
|
+
let n = first.length;
|
|
31
|
+
for (const chain of rest) {
|
|
32
|
+
let i = 0;
|
|
33
|
+
while (i < n && i < chain.length && chain[i] === first[i])
|
|
34
|
+
i++;
|
|
35
|
+
n = i;
|
|
36
|
+
}
|
|
37
|
+
return first.slice(0, n);
|
|
38
|
+
}
|
|
39
|
+
export function describeMw(mw) {
|
|
40
|
+
return mw.name ? `"${mw.name}"` : "an anonymous middleware";
|
|
41
|
+
}
|