@lovrozagar/honey 0.6.8 → 0.7.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/README.md +514 -192
- package/bin/honey.js +25 -0
- package/dist/accepts.d.ts +7 -1
- package/dist/accepts.d.ts.map +1 -1
- package/dist/accepts.js +126 -0
- package/dist/accepts.js.map +1 -0
- package/dist/body-kind.d.ts +26 -0
- package/dist/body-kind.d.ts.map +1 -0
- package/dist/body-kind.js +70 -0
- package/dist/body-kind.js.map +1 -0
- package/dist/body-limit.d.ts +5 -1
- package/dist/body-limit.d.ts.map +1 -1
- package/dist/body-limit.js +126 -0
- package/dist/body-limit.js.map +1 -0
- package/dist/build/index.d.ts +19 -3
- package/dist/build/index.d.ts.map +1 -1
- package/dist/build/index.js +173 -0
- package/dist/build/index.js.map +1 -0
- package/dist/cli-args.d.ts +33 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +102 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-go/auth.go +26 -0
- package/dist/cli-go/config.go +192 -0
- package/dist/cli-go/errors.go +75 -0
- package/dist/cli-go/multipart.go +79 -0
- package/dist/cli-go/output.go +163 -0
- package/dist/cli-go/root.go +30 -0
- package/dist/cli-go/stream.go +88 -0
- package/dist/cli-go/version.go +5 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +209 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/defaults.js +48 -0
- package/dist/client/defaults.js.map +1 -0
- package/dist/client/error.d.ts +35 -0
- package/dist/client/error.d.ts.map +1 -1
- package/dist/client/error.js +71 -0
- package/dist/client/error.js.map +1 -0
- package/dist/client/http.d.ts +67 -8
- package/dist/client/http.d.ts.map +1 -1
- package/dist/client/http.js +571 -0
- package/dist/client/http.js.map +1 -0
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +95 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/path.d.ts +26 -0
- package/dist/client/path.d.ts.map +1 -0
- package/dist/client/path.js +163 -0
- package/dist/client/path.js.map +1 -0
- package/dist/client/redirect-policy.d.ts +12 -0
- package/dist/client/redirect-policy.d.ts.map +1 -0
- package/dist/client/redirect-policy.js +20 -0
- package/dist/client/redirect-policy.js.map +1 -0
- package/dist/client/sdk.d.ts +36 -0
- package/dist/client/sdk.d.ts.map +1 -1
- package/dist/client/sdk.js +292 -0
- package/dist/client/sdk.js.map +1 -0
- package/dist/client/sse.d.ts +13 -0
- package/dist/client/sse.d.ts.map +1 -1
- package/dist/client/sse.js +129 -0
- package/dist/client/sse.js.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/ws.d.ts +9 -2
- package/dist/client/ws.d.ts.map +1 -1
- package/dist/client/ws.js +112 -0
- package/dist/client/ws.js.map +1 -0
- package/dist/client-go/errors.go +236 -0
- package/dist/client-go/export.go +44 -0
- package/dist/client-go/invalidation.go +371 -0
- package/dist/client-go/nullable.go +62 -0
- package/dist/client-go/realtime.go +354 -0
- package/dist/client-go/result.go +20 -0
- package/dist/client-go/runtime.go +975 -0
- package/dist/client-go/sse.go +159 -0
- package/dist/client-go/transport.go +495 -0
- package/dist/client-go/ws.go +128 -0
- package/dist/client-info.d.ts +36 -0
- package/dist/client-info.d.ts.map +1 -0
- package/dist/client-info.js +53 -0
- package/dist/client-info.js.map +1 -0
- package/dist/client-mcp/README.md +10 -0
- package/dist/client-mcp/server.ts +221 -0
- package/dist/client-mcp/types.ts +19 -0
- package/dist/client-python/_errors.py +115 -0
- package/dist/client-python/_invalidation.py +494 -0
- package/dist/client-python/_realtime.py +179 -0
- package/dist/client-python/_runtime.py +860 -0
- package/dist/client-python/_sse.py +155 -0
- package/dist/client-python/_transport.py +366 -0
- package/dist/client-python/_ws.py +159 -0
- package/dist/client-python/py.typed +0 -0
- package/dist/client-rust/errors.rs +220 -0
- package/dist/client-rust/invalidation.rs +412 -0
- package/dist/client-rust/invalidation_sync.rs +93 -0
- package/dist/client-rust/nullable.rs +17 -0
- package/dist/client-rust/realtime.rs +702 -0
- package/dist/client-rust/result.rs +22 -0
- package/dist/client-rust/runtime.rs +980 -0
- package/dist/client-rust/runtime_sync.rs +484 -0
- package/dist/client-rust/sse.rs +188 -0
- package/dist/client-rust/ws.rs +167 -0
- package/dist/codegen-go-cli.d.ts.map +1 -1
- package/dist/codegen-go-cli.js +964 -0
- package/dist/codegen-go-cli.js.map +1 -0
- package/dist/codegen-go.d.ts +15 -3
- package/dist/codegen-go.d.ts.map +1 -1
- package/dist/codegen-go.js +872 -0
- package/dist/codegen-go.js.map +1 -0
- package/dist/codegen-hash.js +9 -0
- package/dist/codegen-hash.js.map +1 -0
- package/dist/codegen-ir.d.ts +69 -2
- package/dist/codegen-ir.d.ts.map +1 -1
- package/dist/codegen-ir.js +661 -0
- package/dist/codegen-ir.js.map +1 -0
- package/dist/codegen-lang.d.ts +65 -0
- package/dist/codegen-lang.d.ts.map +1 -0
- package/dist/codegen-lang.js +526 -0
- package/dist/codegen-lang.js.map +1 -0
- package/dist/codegen-load.d.ts +31 -0
- package/dist/codegen-load.d.ts.map +1 -0
- package/dist/codegen-load.js +138 -0
- package/dist/codegen-load.js.map +1 -0
- package/dist/codegen-loaders.js +55 -0
- package/dist/codegen-loaders.js.map +1 -0
- package/dist/codegen-mcp.d.ts.map +1 -1
- package/dist/codegen-mcp.js +368 -0
- package/dist/codegen-mcp.js.map +1 -0
- package/dist/codegen-python.d.ts +13 -1
- package/dist/codegen-python.d.ts.map +1 -1
- package/dist/codegen-python.js +828 -0
- package/dist/codegen-python.js.map +1 -0
- package/dist/codegen-route-tree-intern.d.ts +15 -5
- package/dist/codegen-route-tree-intern.d.ts.map +1 -1
- package/dist/codegen-route-tree-intern.js +221 -0
- package/dist/codegen-route-tree-intern.js.map +1 -0
- package/dist/codegen-rust.d.ts.map +1 -1
- package/dist/codegen-rust.js +1293 -0
- package/dist/codegen-rust.js.map +1 -0
- package/dist/codegen-sanitize.d.ts.map +1 -1
- package/dist/codegen-sanitize.js +56 -0
- package/dist/codegen-sanitize.js.map +1 -0
- package/dist/codegen-schema-naming.d.ts +5 -0
- package/dist/codegen-schema-naming.d.ts.map +1 -1
- package/dist/codegen-schema-naming.js +150 -0
- package/dist/codegen-schema-naming.js.map +1 -0
- package/dist/codegen-sdk-model.d.ts +71 -0
- package/dist/codegen-sdk-model.d.ts.map +1 -0
- package/dist/codegen-sdk-model.js +179 -0
- package/dist/codegen-sdk-model.js.map +1 -0
- package/dist/codegen.d.ts +41 -23
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +4610 -0
- package/dist/codegen.js.map +1 -0
- package/dist/context.d.ts +36 -6
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +242 -0
- package/dist/context.js.map +1 -0
- package/dist/cookie-sign.d.ts +16 -2
- package/dist/cookie-sign.d.ts.map +1 -1
- package/dist/cookie-sign.js +104 -0
- package/dist/cookie-sign.js.map +1 -0
- package/dist/cookie.d.ts +12 -0
- package/dist/cookie.d.ts.map +1 -1
- package/dist/cookie.js +138 -0
- package/dist/cookie.js.map +1 -0
- package/dist/cors.d.ts +1 -0
- package/dist/cors.d.ts.map +1 -1
- package/dist/cors.js +87 -0
- package/dist/cors.js.map +1 -0
- package/dist/crypto.d.ts +6 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +38 -0
- package/dist/crypto.js.map +1 -0
- package/dist/csrf.d.ts +19 -0
- package/dist/csrf.d.ts.map +1 -1
- package/dist/csrf.js +79 -0
- package/dist/csrf.js.map +1 -0
- package/dist/curl-logger.d.ts +14 -3
- package/dist/curl-logger.d.ts.map +1 -1
- package/dist/curl-logger.js +199 -0
- package/dist/curl-logger.js.map +1 -0
- package/dist/detect-runtime.js +13 -0
- package/dist/detect-runtime.js.map +1 -0
- package/dist/dict.d.ts +11 -0
- package/dist/dict.d.ts.map +1 -0
- package/dist/dict.js +13 -0
- package/dist/dict.js.map +1 -0
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +44 -0
- package/dist/error.js.map +1 -0
- package/dist/errors.js +39 -0
- package/dist/errors.js.map +1 -0
- package/dist/etag.d.ts +2 -0
- package/dist/etag.d.ts.map +1 -1
- package/dist/etag.js +82 -0
- package/dist/etag.js.map +1 -0
- package/dist/feature-detect.d.ts +25 -0
- package/dist/feature-detect.d.ts.map +1 -0
- package/dist/feature-detect.js +144 -0
- package/dist/feature-detect.js.map +1 -0
- package/dist/feature-load.js +36 -0
- package/dist/feature-load.js.map +1 -0
- package/dist/feature-slots.d.ts +44 -0
- package/dist/feature-slots.d.ts.map +1 -0
- package/dist/feature-slots.js +48 -0
- package/dist/feature-slots.js.map +1 -0
- package/dist/fetch-request.d.ts +10 -0
- package/dist/fetch-request.d.ts.map +1 -0
- package/dist/fetch-request.js +13 -0
- package/dist/fetch-request.js.map +1 -0
- package/dist/gen-process.d.ts +15 -0
- package/dist/gen-process.d.ts.map +1 -0
- package/dist/gen-process.js +43 -0
- package/dist/gen-process.js.map +1 -0
- package/dist/gen-write.d.ts +19 -0
- package/dist/gen-write.d.ts.map +1 -0
- package/dist/gen-write.js +120 -0
- package/dist/gen-write.js.map +1 -0
- package/dist/glob.d.ts +21 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +115 -0
- package/dist/glob.js.map +1 -0
- package/dist/go-type-emitter.d.ts +18 -4
- package/dist/go-type-emitter.d.ts.map +1 -1
- package/dist/go-type-emitter.js +594 -0
- package/dist/go-type-emitter.js.map +1 -0
- package/dist/honey-response.d.ts.map +1 -1
- package/dist/honey-response.js +338 -0
- package/dist/honey-response.js.map +1 -0
- package/dist/i18n-slot.d.ts +8 -0
- package/dist/i18n-slot.d.ts.map +1 -1
- package/dist/i18n-slot.js +14 -0
- package/dist/i18n-slot.js.map +1 -0
- package/dist/i18n.d.ts +3 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +250 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +408 -148
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2324 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +3 -5
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +140 -0
- package/dist/init.js.map +1 -0
- package/dist/input.js +4 -0
- package/dist/input.js.map +1 -0
- package/dist/invalidate-check.d.ts +11 -0
- package/dist/invalidate-check.d.ts.map +1 -1
- package/dist/invalidate-check.js +163 -0
- package/dist/invalidate-check.js.map +1 -0
- package/dist/invoke-user.d.ts +35 -0
- package/dist/invoke-user.d.ts.map +1 -0
- package/dist/invoke-user.js +73 -0
- package/dist/invoke-user.js.map +1 -0
- package/dist/ip-restrict.d.ts +13 -1
- package/dist/ip-restrict.d.ts.map +1 -1
- package/dist/ip-restrict.js +60 -0
- package/dist/ip-restrict.js.map +1 -0
- package/dist/ip.d.ts +39 -0
- package/dist/ip.d.ts.map +1 -0
- package/dist/ip.js +209 -0
- package/dist/ip.js.map +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +113 -0
- package/dist/logger.js.map +1 -0
- package/dist/media-type.d.ts +30 -0
- package/dist/media-type.d.ts.map +1 -0
- package/dist/media-type.js +97 -0
- package/dist/media-type.js.map +1 -0
- package/dist/meta-spec-merge.d.ts +32 -0
- package/dist/meta-spec-merge.d.ts.map +1 -0
- package/dist/meta-spec-merge.js +68 -0
- package/dist/meta-spec-merge.js.map +1 -0
- package/dist/meta-spec.d.ts +16 -3
- package/dist/meta-spec.d.ts.map +1 -1
- package/dist/meta-spec.js +535 -0
- package/dist/meta-spec.js.map +1 -0
- package/dist/middleware.d.ts +23 -6
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +253 -0
- package/dist/middleware.js.map +1 -0
- package/dist/node-request.d.ts +57 -12
- package/dist/node-request.d.ts.map +1 -1
- package/dist/node-request.js +407 -0
- package/dist/node-request.js.map +1 -0
- package/dist/node.d.ts +20 -3
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +396 -0
- package/dist/node.js.map +1 -0
- package/dist/openapi/collect.d.ts +6 -3
- package/dist/openapi/collect.d.ts.map +1 -1
- package/dist/openapi/collect.js +30 -0
- package/dist/openapi/collect.js.map +1 -0
- package/dist/openapi/docs-page.d.ts +42 -0
- package/dist/openapi/docs-page.d.ts.map +1 -0
- package/dist/openapi/docs-page.js +80 -0
- package/dist/openapi/docs-page.js.map +1 -0
- package/dist/openapi/document.d.ts +4 -0
- package/dist/openapi/document.d.ts.map +1 -1
- package/dist/openapi/document.js +785 -0
- package/dist/openapi/document.js.map +1 -0
- package/dist/openapi/json-schema-slot.d.ts +7 -0
- package/dist/openapi/json-schema-slot.d.ts.map +1 -1
- package/dist/openapi/json-schema-slot.js +38 -0
- package/dist/openapi/json-schema-slot.js.map +1 -0
- package/dist/openapi/register.d.ts.map +1 -1
- package/dist/openapi/register.js +20 -0
- package/dist/openapi/register.js.map +1 -0
- package/dist/openapi/scalar.d.ts +3 -1
- package/dist/openapi/scalar.d.ts.map +1 -1
- package/dist/openapi/scalar.js +21 -0
- package/dist/openapi/scalar.js.map +1 -0
- package/dist/openapi/serve.d.ts +9 -0
- package/dist/openapi/serve.d.ts.map +1 -0
- package/dist/openapi/serve.js +36 -0
- package/dist/openapi/serve.js.map +1 -0
- package/dist/openapi/spec-factory.d.ts +30 -1
- package/dist/openapi/spec-factory.d.ts.map +1 -1
- package/dist/openapi/spec-factory.js +52 -0
- package/dist/openapi/spec-factory.js.map +1 -0
- package/dist/openapi/spec.d.ts +14 -5
- package/dist/openapi/spec.d.ts.map +1 -1
- package/dist/openapi/spec.js +50 -0
- package/dist/openapi/spec.js.map +1 -0
- package/dist/openapi/swagger.d.ts +3 -1
- package/dist/openapi/swagger.d.ts.map +1 -1
- package/dist/openapi/swagger.js +22 -0
- package/dist/openapi/swagger.js.map +1 -0
- package/dist/pattern.d.ts +71 -0
- package/dist/pattern.d.ts.map +1 -0
- package/dist/pattern.js +239 -0
- package/dist/pattern.js.map +1 -0
- package/dist/peer.d.ts +17 -0
- package/dist/peer.d.ts.map +1 -0
- package/dist/peer.js +50 -0
- package/dist/peer.js.map +1 -0
- package/dist/plugin.d.ts +67 -16
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +649 -0
- package/dist/plugin.js.map +1 -0
- package/dist/powered-by.d.ts.map +1 -1
- package/dist/powered-by.js +11 -0
- package/dist/powered-by.js.map +1 -0
- package/dist/pretty-json.d.ts.map +1 -1
- package/dist/pretty-json.js +47 -0
- package/dist/pretty-json.js.map +1 -0
- package/dist/producer-stream.d.ts +47 -0
- package/dist/producer-stream.d.ts.map +1 -0
- package/dist/producer-stream.js +267 -0
- package/dist/producer-stream.js.map +1 -0
- package/dist/proxy.d.ts +47 -8
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +274 -0
- package/dist/proxy.js.map +1 -0
- package/dist/python-type-emitter.d.ts +14 -1
- package/dist/python-type-emitter.d.ts.map +1 -1
- package/dist/python-type-emitter.js +157 -0
- package/dist/python-type-emitter.js.map +1 -0
- package/dist/realtime/bus.d.ts +17 -1
- package/dist/realtime/bus.d.ts.map +1 -1
- package/dist/realtime/bus.js +112 -0
- package/dist/realtime/bus.js.map +1 -0
- package/dist/realtime/register.d.ts +3 -0
- package/dist/realtime/register.d.ts.map +1 -0
- package/dist/realtime/register.js +10 -0
- package/dist/realtime/register.js.map +1 -0
- package/dist/realtime/route.d.ts +65 -26
- package/dist/realtime/route.d.ts.map +1 -1
- package/dist/realtime/route.js +72 -0
- package/dist/realtime/route.js.map +1 -0
- package/dist/realtime/server.d.ts +43 -0
- package/dist/realtime/server.d.ts.map +1 -0
- package/dist/realtime/server.js +255 -0
- package/dist/realtime/server.js.map +1 -0
- package/dist/request-id.d.ts +7 -0
- package/dist/request-id.d.ts.map +1 -1
- package/dist/request-id.js +16 -0
- package/dist/request-id.js.map +1 -0
- package/dist/request-limits.d.ts +3 -0
- package/dist/request-limits.d.ts.map +1 -0
- package/dist/request-limits.js +3 -0
- package/dist/request-limits.js.map +1 -0
- package/dist/request-path.d.ts +33 -0
- package/dist/request-path.d.ts.map +1 -0
- package/dist/request-path.js +178 -0
- package/dist/request-path.js.map +1 -0
- package/dist/request-to-curl.d.ts +7 -1
- package/dist/request-to-curl.d.ts.map +1 -1
- package/dist/request-to-curl.js +48 -0
- package/dist/request-to-curl.js.map +1 -0
- package/dist/response.d.ts +25 -2
- package/dist/response.d.ts.map +1 -1
- package/dist/response.js +313 -0
- package/dist/response.js.map +1 -0
- package/dist/rust-type-emitter.d.ts +14 -2
- package/dist/rust-type-emitter.d.ts.map +1 -1
- package/dist/rust-type-emitter.js +463 -0
- package/dist/rust-type-emitter.js.map +1 -0
- package/dist/secure-headers.d.ts.map +1 -1
- package/dist/secure-headers.js +53 -0
- package/dist/secure-headers.js.map +1 -0
- package/dist/serve-register.d.ts +4 -0
- package/dist/serve-register.d.ts.map +1 -1
- package/dist/serve-register.js +9 -0
- package/dist/serve-register.js.map +1 -0
- package/dist/serve-slot.d.ts +3 -0
- package/dist/serve-slot.d.ts.map +1 -1
- package/dist/serve-slot.js +52 -0
- package/dist/serve-slot.js.map +1 -0
- package/dist/serve.d.ts +18 -1
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +157 -0
- package/dist/serve.js.map +1 -0
- package/dist/server-timing.d.ts.map +1 -1
- package/dist/server-timing.js +51 -0
- package/dist/server-timing.js.map +1 -0
- package/dist/static.d.ts +9 -0
- package/dist/static.d.ts.map +1 -1
- package/dist/static.js +102 -0
- package/dist/static.js.map +1 -0
- package/dist/telemetry/otel.d.ts +2 -0
- package/dist/telemetry/otel.d.ts.map +1 -1
- package/dist/telemetry/otel.js +135 -0
- package/dist/telemetry/otel.js.map +1 -0
- package/dist/testing.d.ts +12 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +124 -0
- package/dist/testing.js.map +1 -0
- package/dist/timeout.d.ts +6 -0
- package/dist/timeout.d.ts.map +1 -1
- package/dist/timeout.js +36 -0
- package/dist/timeout.js.map +1 -0
- package/dist/tree.d.ts +133 -36
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +437 -0
- package/dist/tree.js.map +1 -0
- package/dist/trust.d.ts +21 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +100 -0
- package/dist/trust.js.map +1 -0
- package/dist/ts-type-emitter.d.ts.map +1 -1
- package/dist/ts-type-emitter.js +150 -0
- package/dist/ts-type-emitter.js.map +1 -0
- package/dist/type-emitter.d.ts +16 -2
- package/dist/type-emitter.d.ts.map +1 -1
- package/dist/type-emitter.js +729 -0
- package/dist/type-emitter.js.map +1 -0
- package/dist/type-extractor.d.ts +8 -4
- package/dist/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor.js +819 -0
- package/dist/type-extractor.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +96 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +14 -2
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +335 -0
- package/dist/validation.js.map +1 -0
- package/dist/with-headers.d.ts +15 -0
- package/dist/with-headers.d.ts.map +1 -0
- package/dist/with-headers.js +45 -0
- package/dist/with-headers.js.map +1 -0
- package/dist/ws/bun.d.ts +11 -5
- package/dist/ws/bun.d.ts.map +1 -1
- package/dist/ws/bun.js +82 -0
- package/dist/ws/bun.js.map +1 -0
- package/dist/ws/cloudflare.d.ts +25 -3
- package/dist/ws/cloudflare.d.ts.map +1 -1
- package/dist/ws/cloudflare.js +117 -0
- package/dist/ws/cloudflare.js.map +1 -0
- package/dist/ws/deno.d.ts +4 -4
- package/dist/ws/deno.d.ts.map +1 -1
- package/dist/ws/deno.js +133 -0
- package/dist/ws/deno.js.map +1 -0
- package/dist/ws/node.d.ts +20 -3
- package/dist/ws/node.d.ts.map +1 -1
- package/dist/ws/node.js +173 -0
- package/dist/ws/node.js.map +1 -0
- package/dist/ws/session.d.ts +11 -0
- package/dist/ws/session.d.ts.map +1 -0
- package/dist/ws/session.js +60 -0
- package/dist/ws/session.js.map +1 -0
- package/dist/ws/shared.d.ts +65 -0
- package/dist/ws/shared.d.ts.map +1 -0
- package/dist/ws/shared.js +103 -0
- package/dist/ws/shared.js.map +1 -0
- package/dist/ws-origin.d.ts +20 -0
- package/dist/ws-origin.d.ts.map +1 -0
- package/dist/ws-origin.js +41 -0
- package/dist/ws-origin.js.map +1 -0
- package/dist/yaml.d.ts +15 -1
- package/dist/yaml.d.ts.map +1 -1
- package/dist/yaml.js +101 -0
- package/dist/yaml.js.map +1 -0
- package/docs/invalidate-spec.md +13 -1
- package/docs/meta-spec.md +36 -12
- package/docs/packaging.md +43 -24
- package/docs/regression-matrix/README.md +32 -0
- package/docs/regression-matrix/review.md +44 -0
- package/docs/regression-matrix/ws1-3.md +97 -0
- package/docs/regression-matrix/ws4-8.md +107 -0
- package/docs/regression-matrix/ws9-12.md +266 -0
- package/docs/sdk.md +102 -52
- package/package.json +183 -52
- package/src/accepts.ts +91 -33
- package/src/body-kind.ts +67 -0
- package/src/body-limit.ts +102 -87
- package/src/build/index.ts +104 -54
- package/src/cli-args.ts +123 -0
- package/src/cli-go/auth.go +12 -1
- package/src/cli-go/config.go +29 -2
- package/src/cli-go/errors.go +28 -10
- package/src/cli-go/multipart.go +51 -27
- package/src/cli-go/output.go +58 -4
- package/src/cli-go/root.go +1 -1
- package/src/cli-go/version.go +2 -2
- package/src/cli.ts +154 -148
- package/src/client/error.ts +56 -1
- package/src/client/http.ts +479 -256
- package/src/client/index.ts +55 -17
- package/src/client/path.ts +169 -0
- package/src/client/redirect-policy.ts +19 -0
- package/src/client/sdk.ts +180 -101
- package/src/client/sse.ts +92 -66
- package/src/client/ws.ts +67 -31
- package/src/client-go/errors.go +41 -12
- package/src/client-go/export.go +44 -0
- package/src/client-go/invalidation.go +52 -54
- package/src/client-go/nullable.go +62 -0
- package/src/client-go/realtime.go +147 -110
- package/src/client-go/runtime.go +646 -88
- package/src/client-go/sse.go +104 -94
- package/src/client-go/transport.go +67 -27
- package/src/client-go/ws.go +49 -25
- package/src/client-info.ts +79 -0
- package/src/client-mcp/server.ts +133 -3
- package/src/client-python/_invalidation.py +207 -291
- package/src/client-python/_realtime.py +63 -40
- package/src/client-python/_runtime.py +501 -119
- package/src/client-python/_sse.py +130 -74
- package/src/client-python/_transport.py +37 -9
- package/src/client-python/_ws.py +50 -22
- package/src/client-rust/errors.rs +21 -1
- package/src/client-rust/invalidation.rs +202 -231
- package/src/client-rust/invalidation_sync.rs +16 -229
- package/src/client-rust/nullable.rs +17 -0
- package/src/client-rust/realtime.rs +217 -217
- package/src/client-rust/runtime.rs +602 -177
- package/src/client-rust/runtime_sync.rs +169 -145
- package/src/client-rust/sse.rs +142 -121
- package/src/client-rust/ws.rs +61 -37
- package/src/codegen-go-cli.ts +607 -728
- package/src/codegen-go.ts +710 -770
- package/src/codegen-ir.ts +381 -75
- package/src/codegen-lang.ts +517 -0
- package/src/codegen-load.ts +150 -0
- package/src/codegen-mcp.ts +207 -108
- package/src/codegen-python.ts +684 -816
- package/src/codegen-route-tree-intern.ts +51 -25
- package/src/codegen-rust.ts +946 -1240
- package/src/codegen-sanitize.ts +0 -4
- package/src/codegen-schema-naming.ts +19 -6
- package/src/codegen-sdk-model.ts +228 -0
- package/src/codegen.ts +1488 -1140
- package/src/context.ts +130 -11
- package/src/cookie-sign.ts +85 -16
- package/src/cookie.ts +66 -11
- package/src/cors.ts +55 -54
- package/src/crypto.ts +27 -5
- package/src/csrf.ts +57 -25
- package/src/curl-logger.ts +155 -114
- package/src/dict.ts +12 -0
- package/src/error.ts +4 -2
- package/src/etag.ts +58 -34
- package/src/feature-detect.ts +147 -0
- package/src/feature-slots.ts +70 -0
- package/src/fetch-request.ts +13 -0
- package/src/gen-process.ts +42 -0
- package/src/gen-write.ts +127 -0
- package/src/glob.ts +109 -0
- package/src/go-type-emitter.ts +406 -155
- package/src/honey-response.ts +36 -9
- package/src/i18n-slot.ts +10 -0
- package/src/i18n.ts +98 -23
- package/src/index.ts +1887 -1756
- package/src/init.ts +40 -28
- package/src/invalidate-check.ts +42 -4
- package/src/invoke-user.ts +95 -0
- package/src/ip-restrict.ts +47 -161
- package/src/ip.ts +194 -0
- package/src/logger.ts +65 -36
- package/src/media-type.ts +104 -0
- package/src/meta-spec-merge.ts +80 -0
- package/src/meta-spec.ts +0 -0
- package/src/middleware.ts +112 -12
- package/src/node-request.ts +242 -52
- package/src/node.ts +318 -75
- package/src/openapi/collect.ts +19 -44
- package/src/openapi/docs-page.ts +89 -0
- package/src/openapi/document.ts +503 -224
- package/src/openapi/json-schema-slot.ts +40 -0
- package/src/openapi/register.ts +7 -2
- package/src/openapi/scalar.ts +11 -10
- package/src/openapi/serve.ts +39 -0
- package/src/openapi/spec-factory.ts +50 -1
- package/src/openapi/spec.ts +53 -30
- package/src/openapi/swagger.ts +12 -11
- package/src/pattern.ts +245 -0
- package/src/peer.ts +53 -0
- package/src/plugin.ts +270 -185
- package/src/powered-by.ts +2 -2
- package/src/pretty-json.ts +25 -9
- package/src/producer-stream.ts +296 -0
- package/src/proxy.ts +253 -55
- package/src/python-type-emitter.ts +68 -56
- package/src/realtime/bus.ts +56 -9
- package/src/realtime/register.ts +13 -0
- package/src/realtime/route.ts +129 -80
- package/src/realtime/server.ts +298 -0
- package/src/request-id.ts +13 -3
- package/src/request-limits.ts +2 -0
- package/src/request-path.ts +165 -0
- package/src/request-to-curl.ts +28 -7
- package/src/response.ts +143 -103
- package/src/rust-type-emitter.ts +265 -170
- package/src/secure-headers.ts +8 -4
- package/src/serve-register.ts +4 -0
- package/src/serve-slot.ts +38 -0
- package/src/serve.ts +113 -25
- package/src/server-timing.ts +11 -7
- package/src/static.ts +85 -32
- package/src/telemetry/otel.ts +29 -7
- package/src/testing.ts +76 -14
- package/src/timeout.ts +15 -7
- package/src/tree.ts +405 -333
- package/src/trust.ts +117 -0
- package/src/ts-type-emitter.ts +18 -12
- package/src/type-emitter.ts +227 -89
- package/src/type-extractor.ts +603 -423
- package/src/types.ts +8 -0
- package/src/validation.ts +221 -96
- package/src/with-headers.ts +45 -0
- package/src/ws/bun.ts +53 -15
- package/src/ws/cloudflare.ts +81 -19
- package/src/ws/deno.ts +124 -36
- package/src/ws/node.ts +173 -79
- package/src/ws/session.ts +73 -0
- package/src/ws/shared.ts +140 -0
- package/src/ws-origin.ts +53 -0
- package/src/yaml.ts +45 -22
- package/dist/client-mcp/server.d.ts +0 -10
- package/dist/client-mcp/server.d.ts.map +0 -1
- package/dist/client-mcp/types.d.ts +0 -16
- package/dist/client-mcp/types.d.ts.map +0 -1
- package/dist/cloudflare/realtime.d.ts +0 -30
- package/dist/cloudflare/realtime.d.ts.map +0 -1
- package/dist/realtime/buffer.d.ts +0 -18
- package/dist/realtime/buffer.d.ts.map +0 -1
- package/dist/realtime/longpoll.d.ts +0 -23
- package/dist/realtime/longpoll.d.ts.map +0 -1
- package/dist/realtime/protocol.d.ts +0 -50
- package/dist/realtime/protocol.d.ts.map +0 -1
- package/dist/realtime/runtime.d.ts +0 -74
- package/dist/realtime/runtime.d.ts.map +0 -1
- package/src/cloudflare/realtime.ts +0 -234
- package/src/realtime/buffer.ts +0 -101
- package/src/realtime/longpoll.ts +0 -148
- package/src/realtime/protocol.ts +0 -128
- package/src/realtime/runtime.ts +0 -427
package/src/rust-type-emitter.ts
CHANGED
|
@@ -1,90 +1,54 @@
|
|
|
1
1
|
/* Rust type emitter — IR-based printer with raw-schema shims for backward compatibility. */
|
|
2
2
|
|
|
3
3
|
import { schemaToIR } from "./codegen-ir.ts"
|
|
4
|
-
import type { IRSchema } from "./codegen-ir.ts"
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"for",
|
|
19
|
-
"if",
|
|
20
|
-
"impl",
|
|
21
|
-
"in",
|
|
22
|
-
"let",
|
|
23
|
-
"loop",
|
|
24
|
-
"match",
|
|
25
|
-
"mod",
|
|
26
|
-
"move",
|
|
27
|
-
"mut",
|
|
28
|
-
"pub",
|
|
29
|
-
"ref",
|
|
30
|
-
"return",
|
|
31
|
-
"self",
|
|
32
|
-
"Self",
|
|
33
|
-
"static",
|
|
34
|
-
"struct",
|
|
35
|
-
"super",
|
|
36
|
-
"trait",
|
|
37
|
-
"true",
|
|
38
|
-
"type",
|
|
39
|
-
"unsafe",
|
|
40
|
-
"use",
|
|
41
|
-
"where",
|
|
42
|
-
"while",
|
|
43
|
-
"async",
|
|
44
|
-
"await",
|
|
45
|
-
"dyn",
|
|
46
|
-
/* reserved / future */
|
|
47
|
-
"abstract",
|
|
48
|
-
"become",
|
|
49
|
-
"box",
|
|
50
|
-
"do",
|
|
51
|
-
"final",
|
|
52
|
-
"macro",
|
|
53
|
-
"override",
|
|
54
|
-
"priv",
|
|
55
|
-
"typeof",
|
|
56
|
-
"unsized",
|
|
57
|
-
"virtual",
|
|
58
|
-
"yield",
|
|
59
|
-
"try",
|
|
60
|
-
])
|
|
4
|
+
import type { IRField, IRSchema } from "./codegen-ir.ts"
|
|
5
|
+
import {
|
|
6
|
+
NameScope,
|
|
7
|
+
RUST_KEYWORDS,
|
|
8
|
+
cmpCodeUnit,
|
|
9
|
+
pascalWords,
|
|
10
|
+
rustPlainSnake,
|
|
11
|
+
rustString,
|
|
12
|
+
rustTypeIdent,
|
|
13
|
+
rustValueIdent,
|
|
14
|
+
snakeWords,
|
|
15
|
+
} from "./codegen-lang.ts"
|
|
16
|
+
|
|
17
|
+
export { RUST_KEYWORDS }
|
|
61
18
|
|
|
62
19
|
export function rustPascal(name: string): string {
|
|
63
|
-
return
|
|
20
|
+
return rustTypeIdent(name)
|
|
64
21
|
}
|
|
65
22
|
|
|
66
23
|
export function rustSnake(name: string): string {
|
|
67
|
-
return name
|
|
68
|
-
.replace(/([a-z0-9])([A-Z])/g, "$1_$2")
|
|
69
|
-
.replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2")
|
|
70
|
-
.replace(/[-\s]+/g, "_")
|
|
71
|
-
.replace(/[^a-zA-Z0-9_]/g, "_")
|
|
72
|
-
.toLowerCase()
|
|
24
|
+
return snakeWords(name) || "value"
|
|
73
25
|
}
|
|
74
26
|
|
|
75
27
|
/** Returns a safe Rust field identifier (snake_case; reserved keywords get `_` suffix). */
|
|
76
28
|
export function rustIdent(name: string): string {
|
|
77
|
-
|
|
78
|
-
if (RUST_KEYWORDS.has(snake)) return `${snake}_`
|
|
79
|
-
return snake
|
|
29
|
+
return rustPlainSnake(name)
|
|
80
30
|
}
|
|
81
31
|
|
|
82
32
|
/** Returns a safe Rust method identifier (snake_case; reserved keywords get `r#` raw-ident prefix). */
|
|
83
33
|
export function rustMethodIdent(name: string): string {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
34
|
+
return rustValueIdent(name)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Crate-level naming shared by every type the SDK emits. */
|
|
38
|
+
export type RustTypeNames = {
|
|
39
|
+
ref: (schemaName: string) => string
|
|
40
|
+
/** Unique crate-level type name; the same key always gets the same name. */
|
|
41
|
+
hoist: (key: string, base: string) => string
|
|
42
|
+
/** Component schemas on a by-value cycle; references to them are boxed. */
|
|
43
|
+
cyclic: Set<string>
|
|
44
|
+
resolve: (schema: IRSchema) => IRSchema
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const DEFAULT_NAMES: RustTypeNames = {
|
|
48
|
+
cyclic: new Set(),
|
|
49
|
+
hoist: (_key, base) => base,
|
|
50
|
+
ref: (name) => rustPascal(name),
|
|
51
|
+
resolve: (s) => s,
|
|
88
52
|
}
|
|
89
53
|
|
|
90
54
|
export type RustRenderUseCtx = {
|
|
@@ -93,28 +57,34 @@ export type RustRenderUseCtx = {
|
|
|
93
57
|
decls: Map<string, string>
|
|
94
58
|
circularRefs?: Set<string>
|
|
95
59
|
depth?: number
|
|
60
|
+
names?: RustTypeNames
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function variantName(raw: string, scope: NameScope): string {
|
|
64
|
+
const base = raw === "" ? "Empty" : rustTypeIdent(raw)
|
|
65
|
+
return scope.claim(base === "Self_" ? "SelfValue" : base)
|
|
96
66
|
}
|
|
97
67
|
|
|
98
68
|
function renderHoistedStringEnum(typeName: string, enumVals: unknown[]): string {
|
|
99
69
|
const l: string[] = []
|
|
100
70
|
l.push(`#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]`)
|
|
101
71
|
l.push(`pub enum ${typeName} {`)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
72
|
+
const scope = new NameScope()
|
|
73
|
+
const variants: string[] = []
|
|
74
|
+
for (const raw of enumVals.filter((v) => v !== null).map(String)) {
|
|
75
|
+
const variant = variantName(raw, scope)
|
|
76
|
+
variants.push(variant)
|
|
77
|
+
if (raw !== variant) l.push(`\t#[serde(rename = ${rustString(raw)})]`)
|
|
107
78
|
l.push(`\t${variant},`)
|
|
108
79
|
}
|
|
109
80
|
l.push(`}`)
|
|
110
81
|
/* Separate impl block so the derive list stays unchanged — derive(Default) would require
|
|
111
82
|
* #[default] on a variant, which breaks callers that assert the exact derive substring. */
|
|
112
|
-
if (
|
|
113
|
-
const firstVariant = rustPascal(String(enumVals[0]))
|
|
83
|
+
if (variants.length > 0) {
|
|
114
84
|
l.push(``)
|
|
115
85
|
l.push(`impl Default for ${typeName} {`)
|
|
116
86
|
l.push(`\tfn default() -> Self {`)
|
|
117
|
-
l.push(`\t\tSelf::${
|
|
87
|
+
l.push(`\t\tSelf::${variants[0]}`)
|
|
118
88
|
l.push(`\t}`)
|
|
119
89
|
l.push(`}`)
|
|
120
90
|
}
|
|
@@ -128,6 +98,7 @@ function renderHoistedIntEnum(typeName: string, enumVals: unknown[]): string {
|
|
|
128
98
|
l.push(`pub enum ${typeName} {`)
|
|
129
99
|
for (const v of enumVals) {
|
|
130
100
|
const n = Number(v)
|
|
101
|
+
if (!Number.isInteger(n)) continue
|
|
131
102
|
const label = n >= 0 ? `L${n}` : `Neg${Math.abs(n)}`
|
|
132
103
|
l.push(`\t${label} = ${n},`)
|
|
133
104
|
}
|
|
@@ -160,23 +131,39 @@ function constBaseType(val: unknown): string {
|
|
|
160
131
|
return "String"
|
|
161
132
|
}
|
|
162
133
|
|
|
134
|
+
function hoist(ctx: RustRenderUseCtx, render: (name: string) => string): string {
|
|
135
|
+
const names = ctx.names ?? DEFAULT_NAMES
|
|
136
|
+
const name = names.hoist(`${ctx.parentName}.${ctx.fieldName}`, hoistEnumName(ctx.parentName, ctx.fieldName))
|
|
137
|
+
if (!ctx.decls.has(name)) {
|
|
138
|
+
/* placeholder prevents infinite recursion on self-referential schemas */
|
|
139
|
+
ctx.decls.set(name, "")
|
|
140
|
+
ctx.decls.set(name, render(name))
|
|
141
|
+
}
|
|
142
|
+
return name
|
|
143
|
+
}
|
|
144
|
+
|
|
163
145
|
/**
|
|
164
146
|
* Render an IR schema as a Rust type expression for a struct field position.
|
|
165
147
|
* Mutates `ctx.decls` when hoisting enums or anonymous structs.
|
|
166
148
|
*/
|
|
167
149
|
export function irRenderUseRust(ir: IRSchema, ctx: RustRenderUseCtx, depth = 0): string {
|
|
168
150
|
if (depth > 12) return "serde_json::Value"
|
|
151
|
+
const names = ctx.names ?? DEFAULT_NAMES
|
|
169
152
|
|
|
170
153
|
switch (ir.kind) {
|
|
171
154
|
case "ref": {
|
|
172
|
-
const rustName =
|
|
173
|
-
if (ctx.circularRefs?.has(rustName)) return `Box<${rustName}>`
|
|
155
|
+
const rustName = names.ref(ir.name)
|
|
156
|
+
if (ctx.circularRefs?.has(rustName) || names.cyclic.has(ir.name)) return `Box<${rustName}>`
|
|
174
157
|
return rustName
|
|
175
158
|
}
|
|
176
159
|
|
|
177
160
|
case "allOf": {
|
|
161
|
+
if (ctx.names && ir.parts.length > 1) {
|
|
162
|
+
return hoist(ctx, (name) => irRenderTopLevelRust(name, ir, ctx.decls, undefined, ctx.names))
|
|
163
|
+
}
|
|
178
164
|
const firstRef = ir.parts.find((p) => p.kind === "ref")
|
|
179
|
-
if (firstRef && firstRef.kind === "ref") return
|
|
165
|
+
if (firstRef && firstRef.kind === "ref") return names.ref(firstRef.name)
|
|
166
|
+
if (ctx.names && ir.parts.length === 1) return irRenderUseRust(ir.parts[0], ctx, depth + 1)
|
|
180
167
|
return "serde_json::Value"
|
|
181
168
|
}
|
|
182
169
|
|
|
@@ -190,21 +177,17 @@ export function irRenderUseRust(ir: IRSchema, ctx: RustRenderUseCtx, depth = 0):
|
|
|
190
177
|
}
|
|
191
178
|
|
|
192
179
|
case "union": {
|
|
180
|
+
if (ctx.names) {
|
|
181
|
+
return hoist(ctx, (name) => irRenderTopLevelRust(name, ir, ctx.decls, undefined, ctx.names))
|
|
182
|
+
}
|
|
193
183
|
/* union at use-position → always serde_json::Value */
|
|
194
184
|
return "serde_json::Value"
|
|
195
185
|
}
|
|
196
186
|
|
|
197
187
|
case "scalar": {
|
|
198
188
|
if (ir.enum) {
|
|
199
|
-
|
|
200
|
-
if (
|
|
201
|
-
if (ir.type === "string") {
|
|
202
|
-
ctx.decls.set(name, renderHoistedStringEnum(name, ir.enum as unknown[]))
|
|
203
|
-
} else {
|
|
204
|
-
ctx.decls.set(name, renderHoistedIntEnum(name, ir.enum as unknown[]))
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return name
|
|
189
|
+
if (ir.type === "string") return hoist(ctx, (name) => renderHoistedStringEnum(name, ir.enum as unknown[]))
|
|
190
|
+
if (ir.type === "integer") return hoist(ctx, (name) => renderHoistedIntEnum(name, ir.enum as unknown[]))
|
|
208
191
|
}
|
|
209
192
|
const prim = primitiveFor(ir.type)
|
|
210
193
|
if (prim) return prim
|
|
@@ -216,8 +199,10 @@ export function irRenderUseRust(ir: IRSchema, ctx: RustRenderUseCtx, depth = 0):
|
|
|
216
199
|
}
|
|
217
200
|
|
|
218
201
|
case "array": {
|
|
219
|
-
const
|
|
220
|
-
|
|
202
|
+
const itemCtx = ctx.names ? { ...ctx, fieldName: `${ctx.fieldName}Item` } : ctx
|
|
203
|
+
const el = irRenderUseRust(ir.items, itemCtx, depth + 1)
|
|
204
|
+
/* a Vec already breaks a recursive cycle */
|
|
205
|
+
return `Vec<${el.startsWith("Box<") ? el.slice(4, -1) : el}>`
|
|
221
206
|
}
|
|
222
207
|
|
|
223
208
|
case "tuple": {
|
|
@@ -230,21 +215,14 @@ export function irRenderUseRust(ir: IRSchema, ctx: RustRenderUseCtx, depth = 0):
|
|
|
230
215
|
|
|
231
216
|
if (fields.length === 0) {
|
|
232
217
|
if (additional !== undefined && additional !== false) {
|
|
233
|
-
const valType = irRenderUseRust(additional, ctx, depth + 1)
|
|
234
|
-
return `HashMap<String, ${valType}>`
|
|
218
|
+
const valType = irRenderUseRust(additional, { ...ctx, fieldName: `${ctx.fieldName}Value` }, depth + 1)
|
|
219
|
+
return `std::collections::HashMap<String, ${valType.startsWith("Box<") ? valType.slice(4, -1) : valType}>`
|
|
235
220
|
}
|
|
236
221
|
if (additional === false) return "serde_json::Value"
|
|
237
|
-
return "HashMap<String, serde_json::Value>"
|
|
222
|
+
return "std::collections::HashMap<String, serde_json::Value>"
|
|
238
223
|
}
|
|
239
224
|
|
|
240
|
-
|
|
241
|
-
if (!ctx.decls.has(hoistedName)) {
|
|
242
|
-
/* placeholder prevents infinite recursion on self-referential schemas */
|
|
243
|
-
ctx.decls.set(hoistedName, "")
|
|
244
|
-
const hoisted = irRenderTopLevelRust(hoistedName, ir, ctx.decls)
|
|
245
|
-
ctx.decls.set(hoistedName, hoisted)
|
|
246
|
-
}
|
|
247
|
-
return hoistedName
|
|
225
|
+
return hoist(ctx, (name) => irRenderTopLevelRust(name, ir, ctx.decls, undefined, ctx.names))
|
|
248
226
|
}
|
|
249
227
|
|
|
250
228
|
case "binary": {
|
|
@@ -257,6 +235,83 @@ export function irRenderUseRust(ir: IRSchema, ctx: RustRenderUseCtx, depth = 0):
|
|
|
257
235
|
}
|
|
258
236
|
}
|
|
259
237
|
|
|
238
|
+
type RustField = {
|
|
239
|
+
ident: string
|
|
240
|
+
key: string
|
|
241
|
+
type: string
|
|
242
|
+
required: boolean
|
|
243
|
+
/** Optional + nullable: `Option<Option<T>>`, absent / null / value. */
|
|
244
|
+
triState: boolean
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function structFields(
|
|
248
|
+
typeName: string,
|
|
249
|
+
fields: IRField[],
|
|
250
|
+
scope: NameScope,
|
|
251
|
+
decls: Map<string, string>,
|
|
252
|
+
circularRefs: Set<string>,
|
|
253
|
+
names: RustTypeNames | undefined,
|
|
254
|
+
): RustField[] {
|
|
255
|
+
return fields
|
|
256
|
+
.slice()
|
|
257
|
+
.sort((a, b) => cmpCodeUnit(a.name, b.name))
|
|
258
|
+
.map((field) => {
|
|
259
|
+
const ft = irRenderUseRust(field.schema, {
|
|
260
|
+
circularRefs,
|
|
261
|
+
decls,
|
|
262
|
+
depth: 1,
|
|
263
|
+
fieldName: field.name,
|
|
264
|
+
names,
|
|
265
|
+
parentName: typeName,
|
|
266
|
+
})
|
|
267
|
+
const triState = !field.required && field.schema.kind === "nullable"
|
|
268
|
+
let type: string
|
|
269
|
+
if (field.required) type = circularRefs.has(ft) && !ft.startsWith("Box<") ? `Box<${ft}>` : ft
|
|
270
|
+
else if (triState) type = `Option<${ft.startsWith("Option<") ? ft : `Option<${ft}>`}>`
|
|
271
|
+
else type = ft.startsWith("Option<") ? ft : `Option<${ft}>`
|
|
272
|
+
return { ident: claimField(field.name, scope), key: field.name, required: field.required, triState, type }
|
|
273
|
+
})
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Field identifier unique in `scope`; a keyword gets a `_` suffix (`type` → `type_`). */
|
|
277
|
+
function claimField(key: string, scope: NameScope): string {
|
|
278
|
+
return scope.claim(rustPlainSnake(key))
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function pushField(l: string[], f: RustField): void {
|
|
282
|
+
const bare = f.ident.startsWith("r#") ? f.ident.slice(2) : f.ident
|
|
283
|
+
if (bare !== f.key) l.push(`\t#[serde(rename = ${rustString(f.key)})]`)
|
|
284
|
+
if (f.triState) {
|
|
285
|
+
l.push(
|
|
286
|
+
`\t#[serde(default, skip_serializing_if = "Option::is_none", deserialize_with = "crate::nullable::deserialize")]`,
|
|
287
|
+
)
|
|
288
|
+
} else if (!f.required) l.push(`\t#[serde(skip_serializing_if = "Option::is_none")]`)
|
|
289
|
+
l.push(`\tpub ${f.ident}: ${f.type},`)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function discriminatorValues(
|
|
293
|
+
variant: IRSchema,
|
|
294
|
+
propertyName: string,
|
|
295
|
+
mapping: Record<string, string> | undefined,
|
|
296
|
+
names: RustTypeNames,
|
|
297
|
+
): string[] {
|
|
298
|
+
if (variant.kind === "ref") {
|
|
299
|
+
const mapped = mapping
|
|
300
|
+
? Object.entries(mapping)
|
|
301
|
+
.filter(([, t]) => t === variant.name)
|
|
302
|
+
.map(([k]) => k)
|
|
303
|
+
: []
|
|
304
|
+
if (mapped.length > 0) return mapped
|
|
305
|
+
}
|
|
306
|
+
const resolved = names.resolve(variant)
|
|
307
|
+
if (resolved.kind === "object") {
|
|
308
|
+
const f = resolved.fields.find((x) => x.name === propertyName)
|
|
309
|
+
if (f?.schema.kind === "const" && typeof f.schema.value === "string") return [f.schema.value]
|
|
310
|
+
if (f?.schema.kind === "scalar" && f.schema.enum) return f.schema.enum.map(String)
|
|
311
|
+
}
|
|
312
|
+
return variant.kind === "ref" ? [variant.name] : []
|
|
313
|
+
}
|
|
314
|
+
|
|
260
315
|
/**
|
|
261
316
|
* `raw` 4th arg is for the const-with-declared-type branch only: IR `const` kind
|
|
262
317
|
* strips the type field; `raw.type` provides the override.
|
|
@@ -266,19 +321,19 @@ export function irRenderTopLevelRust(
|
|
|
266
321
|
ir: IRSchema,
|
|
267
322
|
decls: Map<string, string>,
|
|
268
323
|
raw?: Record<string, unknown>,
|
|
324
|
+
names?: RustTypeNames,
|
|
269
325
|
): string {
|
|
270
|
-
const
|
|
326
|
+
const n = names ?? DEFAULT_NAMES
|
|
327
|
+
const typeName = names ? name : rustPascal(name)
|
|
271
328
|
const circularRefs = new Set([typeName])
|
|
272
329
|
|
|
273
330
|
if (ir.kind === "scalar" && ir.enum) {
|
|
274
|
-
if (ir.type === "string")
|
|
275
|
-
|
|
276
|
-
}
|
|
277
|
-
return renderHoistedIntEnum(typeName, ir.enum as unknown[])
|
|
331
|
+
if (ir.type === "string") return renderHoistedStringEnum(typeName, ir.enum as unknown[])
|
|
332
|
+
if (ir.type === "integer") return renderHoistedIntEnum(typeName, ir.enum as unknown[])
|
|
278
333
|
}
|
|
279
334
|
|
|
280
335
|
if (ir.kind === "const") {
|
|
281
|
-
const rawType = raw?.type as string | undefined
|
|
336
|
+
const rawType = ir.type ?? (raw?.type as string | undefined)
|
|
282
337
|
const base = rawType ? (primitiveFor(rawType) ?? "String") : constBaseType(ir.value)
|
|
283
338
|
return [`#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]`, `pub struct ${typeName}(pub ${base});`].join(
|
|
284
339
|
"\n",
|
|
@@ -289,45 +344,79 @@ export function irRenderTopLevelRust(
|
|
|
289
344
|
const l: string[] = []
|
|
290
345
|
l.push(`#[derive(Debug, Clone, Serialize, Deserialize)]`)
|
|
291
346
|
l.push(`pub struct ${typeName} {`)
|
|
347
|
+
const scope = new NameScope()
|
|
292
348
|
for (const part of ir.parts) {
|
|
293
349
|
if (part.kind === "ref") {
|
|
294
|
-
const refName =
|
|
350
|
+
const refName = n.ref(part.name)
|
|
295
351
|
l.push(`\t#[serde(flatten)]`)
|
|
296
|
-
l.push(`\tpub ${
|
|
352
|
+
l.push(`\tpub ${claimField(refName, scope)}: ${refName},`)
|
|
297
353
|
continue
|
|
298
354
|
}
|
|
299
355
|
if (part.kind !== "object") continue
|
|
300
|
-
const
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
}
|
|
316
|
-
if (
|
|
317
|
-
|
|
356
|
+
for (const f of structFields(typeName, part.fields, scope, decls, circularRefs, names)) pushField(l, f)
|
|
357
|
+
}
|
|
358
|
+
l.push(`}`)
|
|
359
|
+
return l.join("\n")
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if (ir.kind === "union" && ir.discriminator && names) {
|
|
363
|
+
const prop = ir.discriminator.propertyName
|
|
364
|
+
const scope = new NameScope(["Unknown"])
|
|
365
|
+
const variants: Array<{ variant: string; type: string; values: string[] }> = []
|
|
366
|
+
ir.variants.forEach((v, i) => {
|
|
367
|
+
const values = discriminatorValues(v, prop, ir.discriminator?.mapping, n)
|
|
368
|
+
let type: string
|
|
369
|
+
if (v.kind === "ref") type = n.ref(v.name)
|
|
370
|
+
else if (v.kind === "object") {
|
|
371
|
+
type = n.hoist(`${typeName}.variant${i}`, `${typeName}${rustPascal(values[0] ?? `Variant${i}`)}`)
|
|
372
|
+
if (!decls.has(type)) {
|
|
373
|
+
decls.set(type, "")
|
|
374
|
+
decls.set(type, irRenderTopLevelRust(type, v, decls, undefined, names))
|
|
318
375
|
}
|
|
319
|
-
|
|
320
|
-
}
|
|
376
|
+
} else return
|
|
377
|
+
variants.push({ type, values, variant: variantName(values[0] ?? type, scope) })
|
|
378
|
+
})
|
|
379
|
+
const l: string[] = []
|
|
380
|
+
l.push(`/// ${typeName} holds exactly one variant, selected by the ${rustString(prop)} property.`)
|
|
381
|
+
l.push(`/// A tag no variant declares deserializes to \`Unknown\` with the raw payload.`)
|
|
382
|
+
l.push(`#[derive(Debug, Clone)]`)
|
|
383
|
+
l.push(`pub enum ${typeName} {`)
|
|
384
|
+
for (const v of variants) l.push(`\t${v.variant}(${v.type}),`)
|
|
385
|
+
l.push(`\tUnknown(serde_json::Value),`)
|
|
386
|
+
l.push(`}`)
|
|
387
|
+
l.push(``)
|
|
388
|
+
l.push(`impl Serialize for ${typeName} {`)
|
|
389
|
+
l.push(`\tfn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {`)
|
|
390
|
+
l.push(`\t\tmatch self {`)
|
|
391
|
+
for (const v of variants) l.push(`\t\t\t${typeName}::${v.variant}(v) => v.serialize(s),`)
|
|
392
|
+
l.push(`\t\t\t${typeName}::Unknown(v) => v.serialize(s),`)
|
|
393
|
+
l.push(`\t\t}`)
|
|
394
|
+
l.push(`\t}`)
|
|
395
|
+
l.push(`}`)
|
|
396
|
+
l.push(``)
|
|
397
|
+
l.push(`impl<'de> Deserialize<'de> for ${typeName} {`)
|
|
398
|
+
l.push(`\tfn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {`)
|
|
399
|
+
l.push(`\t\tlet v = serde_json::Value::deserialize(d)?;`)
|
|
400
|
+
l.push(`\t\tlet tag = v.get(${rustString(prop)}).and_then(|t| t.as_str()).unwrap_or_default().to_string();`)
|
|
401
|
+
l.push(`\t\tmatch tag.as_str() {`)
|
|
402
|
+
for (const v of variants) {
|
|
403
|
+
if (v.values.length === 0) continue
|
|
404
|
+
l.push(
|
|
405
|
+
`\t\t\t${v.values.map(rustString).join(" | ")} => serde_json::from_value(v).map(${typeName}::${v.variant}).map_err(serde::de::Error::custom),`,
|
|
406
|
+
)
|
|
321
407
|
}
|
|
408
|
+
l.push(`\t\t\t_ => Ok(${typeName}::Unknown(v)),`)
|
|
409
|
+
l.push(`\t\t}`)
|
|
410
|
+
l.push(`\t}`)
|
|
322
411
|
l.push(`}`)
|
|
323
412
|
return l.join("\n")
|
|
324
413
|
}
|
|
325
414
|
|
|
326
415
|
if (ir.kind === "union" && ir.discriminator) {
|
|
327
|
-
|
|
416
|
+
/* legacy shim path (no naming context): serde's internal tagging */
|
|
328
417
|
const l: string[] = []
|
|
329
418
|
l.push(`#[derive(Debug, Clone, Serialize, Deserialize)]`)
|
|
330
|
-
l.push(`#[serde(tag = ${
|
|
419
|
+
l.push(`#[serde(tag = ${rustString(ir.discriminator.propertyName)})]`)
|
|
331
420
|
l.push(`pub enum ${typeName} {`)
|
|
332
421
|
for (const v of ir.variants) {
|
|
333
422
|
if (v.kind === "ref") {
|
|
@@ -342,25 +431,49 @@ export function irRenderTopLevelRust(
|
|
|
342
431
|
}
|
|
343
432
|
|
|
344
433
|
if (ir.kind === "union") {
|
|
434
|
+
const consts = ir.variants.filter(
|
|
435
|
+
(v): v is Extract<IRSchema, { kind: "const" }> => v.kind === "const" && typeof v.value === "string",
|
|
436
|
+
)
|
|
437
|
+
if (names && consts.length > 0 && consts.length === ir.variants.length) {
|
|
438
|
+
return renderHoistedStringEnum(
|
|
439
|
+
typeName,
|
|
440
|
+
consts.map((c) => c.value),
|
|
441
|
+
)
|
|
442
|
+
}
|
|
345
443
|
const l: string[] = []
|
|
346
444
|
l.push(`#[derive(Debug, Clone, Serialize, Deserialize)]`)
|
|
347
445
|
l.push(`#[serde(untagged)]`)
|
|
348
446
|
l.push(`pub enum ${typeName} {`)
|
|
349
|
-
|
|
350
|
-
|
|
447
|
+
const others = names ? ir.variants.filter((v) => !consts.includes(v as never)) : ir.variants
|
|
448
|
+
if (names && consts.length > 0) {
|
|
449
|
+
/* const strings as one string enum, tried first: a unit variant cannot match a string */
|
|
450
|
+
const literal = n.hoist(`${typeName}.literal`, `${typeName}Literal`)
|
|
451
|
+
if (!decls.has(literal))
|
|
452
|
+
decls.set(
|
|
453
|
+
literal,
|
|
454
|
+
renderHoistedStringEnum(
|
|
455
|
+
literal,
|
|
456
|
+
consts.map((c) => c.value),
|
|
457
|
+
),
|
|
458
|
+
)
|
|
459
|
+
l.push(`\tLiteral(${literal}),`)
|
|
460
|
+
}
|
|
461
|
+
for (let i = 0; i < others.length; i++) {
|
|
462
|
+
const v = others[i]
|
|
463
|
+
const index = ir.variants.indexOf(v)
|
|
351
464
|
if (v.kind === "ref") {
|
|
352
|
-
const refName =
|
|
353
|
-
l.push(`\tVariant${
|
|
465
|
+
const refName = n.ref(v.name)
|
|
466
|
+
l.push(`\tVariant${index}(${n.cyclic.has(v.name) ? `Box<${refName}>` : refName}),`)
|
|
354
467
|
} else {
|
|
355
468
|
const inner = irRenderUseRust(v, {
|
|
356
469
|
circularRefs,
|
|
357
470
|
decls,
|
|
358
471
|
depth: 1,
|
|
359
|
-
fieldName: `variant${
|
|
472
|
+
fieldName: `variant${index}`,
|
|
473
|
+
names,
|
|
360
474
|
parentName: typeName,
|
|
361
475
|
})
|
|
362
|
-
|
|
363
|
-
l.push(`\tVariant${i}(${finalType}),`)
|
|
476
|
+
l.push(`\tVariant${index}(${inner}),`)
|
|
364
477
|
}
|
|
365
478
|
}
|
|
366
479
|
l.push(`}`)
|
|
@@ -375,45 +488,23 @@ export function irRenderTopLevelRust(
|
|
|
375
488
|
circularRefs,
|
|
376
489
|
decls,
|
|
377
490
|
fieldName: "Value",
|
|
491
|
+
names,
|
|
378
492
|
parentName: typeName,
|
|
379
493
|
})
|
|
380
|
-
return `pub type ${typeName} = HashMap<String, ${valType}>;`
|
|
494
|
+
return `pub type ${typeName} = std::collections::HashMap<String, ${valType}>;`
|
|
381
495
|
}
|
|
382
496
|
|
|
383
497
|
if (fields.length === 0) {
|
|
384
498
|
if (additional === false) return `#[derive(Debug, Clone, Serialize, Deserialize)]\npub struct ${typeName};`
|
|
385
|
-
return `pub type ${typeName} = HashMap<String, serde_json::Value>;`
|
|
499
|
+
return `pub type ${typeName} = std::collections::HashMap<String, serde_json::Value>;`
|
|
386
500
|
}
|
|
387
501
|
|
|
388
|
-
const
|
|
502
|
+
const scope = new NameScope()
|
|
503
|
+
const extraIdent = additional ? scope.claim("extra") : ""
|
|
389
504
|
const l: string[] = []
|
|
390
505
|
l.push(`#[derive(Debug, Clone, Serialize, Deserialize)]`)
|
|
391
506
|
l.push(`pub struct ${typeName} {`)
|
|
392
|
-
for (const
|
|
393
|
-
const fieldIdent = rustIdent(field.name)
|
|
394
|
-
const ft = irRenderUseRust(field.schema, {
|
|
395
|
-
circularRefs,
|
|
396
|
-
decls,
|
|
397
|
-
depth: 1,
|
|
398
|
-
fieldName: field.name,
|
|
399
|
-
parentName: typeName,
|
|
400
|
-
})
|
|
401
|
-
let finalType: string
|
|
402
|
-
if (field.required) {
|
|
403
|
-
finalType = circularRefs.has(ft) && !ft.startsWith("Box<") ? `Box<${ft}>` : ft
|
|
404
|
-
} else {
|
|
405
|
-
finalType = ft.startsWith("Option<") ? ft : `Option<${ft}>`
|
|
406
|
-
}
|
|
407
|
-
const needsRename = fieldIdent !== field.name
|
|
408
|
-
const needsSkip = !field.required
|
|
409
|
-
if (needsRename) {
|
|
410
|
-
l.push(`\t#[serde(rename = ${JSON.stringify(field.name)})]`)
|
|
411
|
-
}
|
|
412
|
-
if (needsSkip) {
|
|
413
|
-
l.push(`\t#[serde(skip_serializing_if = "Option::is_none")]`)
|
|
414
|
-
}
|
|
415
|
-
l.push(`\tpub ${fieldIdent}: ${finalType},`)
|
|
416
|
-
}
|
|
507
|
+
for (const f of structFields(typeName, fields, scope, decls, circularRefs, names)) pushField(l, f)
|
|
417
508
|
|
|
418
509
|
if (additional) {
|
|
419
510
|
const valType = irRenderUseRust(additional, {
|
|
@@ -421,10 +512,11 @@ export function irRenderTopLevelRust(
|
|
|
421
512
|
decls,
|
|
422
513
|
depth: 1,
|
|
423
514
|
fieldName: "Extra",
|
|
515
|
+
names,
|
|
424
516
|
parentName: typeName,
|
|
425
517
|
})
|
|
426
518
|
l.push(`\t#[serde(flatten)]`)
|
|
427
|
-
l.push(`\tpub
|
|
519
|
+
l.push(`\tpub ${extraIdent}: std::collections::HashMap<String, ${valType}>,`)
|
|
428
520
|
}
|
|
429
521
|
|
|
430
522
|
l.push(`}`)
|
|
@@ -435,6 +527,7 @@ export function irRenderTopLevelRust(
|
|
|
435
527
|
circularRefs,
|
|
436
528
|
decls,
|
|
437
529
|
fieldName: "Value",
|
|
530
|
+
names,
|
|
438
531
|
parentName: typeName,
|
|
439
532
|
})
|
|
440
533
|
return `pub type ${typeName} = ${aliased};`
|
|
@@ -451,3 +544,5 @@ export function renderUseRust(schema: Record<string, unknown> | undefined, ctx:
|
|
|
451
544
|
export function renderTopLevelRust(name: string, schema: Record<string, unknown>, decls: Map<string, string>): string {
|
|
452
545
|
return irRenderTopLevelRust(name, schemaToIR(schema), decls, schema)
|
|
453
546
|
}
|
|
547
|
+
|
|
548
|
+
export { pascalWords }
|
package/src/secure-headers.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { namedMiddleware } from "./middleware.ts"
|
|
2
2
|
import type { MiddlewareFn } from "./middleware.ts"
|
|
3
|
+
import { withHeaders } from "./with-headers.ts"
|
|
3
4
|
|
|
4
5
|
type SecureHeadersOptions = {
|
|
5
6
|
contentSecurityPolicy?: string
|
|
@@ -58,12 +59,15 @@ export function secureHeaders(options?: SecureHeadersOptions): MiddlewareFn<{},
|
|
|
58
59
|
headers.push(["cross-origin-embedder-policy", opts.crossOriginEmbedderPolicy])
|
|
59
60
|
}
|
|
60
61
|
|
|
62
|
+
/* A header the handler already set wins: a route with a stricter CSP or
|
|
63
|
+
* `X-Frame-Options: DENY` must not be loosened by the app-wide default. */
|
|
61
64
|
const mw: MiddlewareFn<{}, {}> = async (_ctx, next) => {
|
|
62
65
|
const response = await next()
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
return withHeaders(response, (out) => {
|
|
67
|
+
for (const [name, value] of headers) {
|
|
68
|
+
if (!out.has(name)) out.set(name, value)
|
|
69
|
+
}
|
|
70
|
+
})
|
|
67
71
|
}
|
|
68
72
|
|
|
69
73
|
return namedMiddleware("secureHeaders", mw)
|
package/src/serve-register.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { startHoneyServer } from "./serve.ts"
|
|
2
2
|
import { registerServeRuntime } from "./serve-slot.ts"
|
|
3
3
|
|
|
4
|
+
export type { HoneyServeOptions, ServeHandle } from "./serve.ts"
|
|
5
|
+
/** Starts a server for `app` on the given runtime. Production build entries call this directly. */
|
|
6
|
+
export { startHoneyServer }
|
|
7
|
+
|
|
4
8
|
export function enableServe(): void {
|
|
5
9
|
registerServeRuntime((app, options) => startHoneyServer(app as never, options))
|
|
6
10
|
}
|