@lovrozagar/honey 0.6.8 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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 +776 -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 +562 -424
- 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/type-emitter.ts
CHANGED
|
@@ -3,21 +3,70 @@ import type { StandardSchemaLike } from "./types.ts"
|
|
|
3
3
|
const SAFE_KEY_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/
|
|
4
4
|
const LAZY_ALIAS_CAP = 64
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
/** A property key in a type literal: bare when it is an identifier, a string literal otherwise. */
|
|
7
|
+
export function quoteKey(key: string): string {
|
|
8
|
+
return SAFE_KEY_RE.test(key) ? key : JSON.stringify(key)
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
/**
|
|
11
|
-
function
|
|
12
|
-
|
|
11
|
+
/** A TypeScript literal type for a runtime value; anything without one widens to its type. */
|
|
12
|
+
export function literalType(value: unknown): string {
|
|
13
|
+
if (value === null) return "null"
|
|
14
|
+
if (value === undefined) return "undefined"
|
|
15
|
+
if (typeof value === "string") return JSON.stringify(value)
|
|
16
|
+
if (typeof value === "boolean") return String(value)
|
|
17
|
+
if (typeof value === "bigint") return `${value}n`
|
|
18
|
+
if (typeof value === "number") return Number.isFinite(value) ? String(value) : "number"
|
|
19
|
+
if (typeof value === "symbol") return "symbol"
|
|
20
|
+
return "unknown"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Does `type` contain `token` outside every bracket and string? `A | B` does; `{ a: A | B }`
|
|
25
|
+
* and `Array<A | B>` do not. Used to parenthesize only where precedence needs it.
|
|
26
|
+
*/
|
|
27
|
+
function hasTopLevel(type: string, token: "|" | "&" | "=>"): boolean {
|
|
28
|
+
let depth = 0
|
|
29
|
+
let quote: string | null = null
|
|
30
|
+
for (let i = 0; i < type.length; i++) {
|
|
31
|
+
const c = type[i]
|
|
32
|
+
if (quote !== null) {
|
|
33
|
+
if (c === "\\") i++
|
|
34
|
+
else if (c === quote) quote = null
|
|
35
|
+
continue
|
|
36
|
+
}
|
|
37
|
+
if (c === '"' || c === "'" || c === "`") quote = c
|
|
38
|
+
else if (c === "(" || c === "{" || c === "[" || c === "<") depth++
|
|
39
|
+
else if (c === ")" || c === "}" || c === "]" || (c === ">" && type[i - 1] !== "=")) depth--
|
|
40
|
+
else if (depth === 0 && type.startsWith(token, i)) return true
|
|
41
|
+
}
|
|
42
|
+
return false
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Wrap element type in parens when union, intersection or function binds looser than `[]` */
|
|
46
|
+
export function arrayOf(el: string): string {
|
|
47
|
+
return hasTopLevel(el, "|") || hasTopLevel(el, "&") || hasTopLevel(el, "=>") ? `(${el})[]` : `${el}[]`
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function unionOf(parts: string[]): string {
|
|
51
|
+
const unique = [...new Set(parts)]
|
|
52
|
+
if (unique.length === 0) return "never"
|
|
53
|
+
return unique.map((p) => (hasTopLevel(p, "=>") ? `(${p})` : p)).join(" | ")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** `(A | B) & C`, never `A | B & C` — `&` binds tighter than `|`. */
|
|
57
|
+
export function intersectionOf(parts: string[]): string {
|
|
58
|
+
return parts.map((p) => (hasTopLevel(p, "|") || hasTopLevel(p, "=>") ? `(${p})` : p)).join(" & ")
|
|
13
59
|
}
|
|
14
60
|
|
|
15
61
|
/**
|
|
16
|
-
* Collects named aliases for recursive `z.lazy
|
|
17
|
-
* can hoist `type _LazyN = …`
|
|
62
|
+
* Collects named aliases for recursive schemas — `z.lazy`, and Zod 4 getter recursion
|
|
63
|
+
* (`get children() { return z.array(Node) }`) — so `generateTypes` can hoist `type _LazyN = …`
|
|
64
|
+
* before `Routes`.
|
|
18
65
|
*/
|
|
19
66
|
export type TypeEmitState = {
|
|
20
67
|
aliases: Map<string, string>
|
|
68
|
+
/** Schemas being emitted right now; re-entering one is recursion and gets a name */
|
|
69
|
+
inProgress: Map<object, { name: string | null }>
|
|
21
70
|
lazyNames: WeakMap<object, string>
|
|
22
71
|
nextId: number
|
|
23
72
|
reserved: Set<string>
|
|
@@ -26,6 +75,7 @@ export type TypeEmitState = {
|
|
|
26
75
|
export function createTypeEmitState(): TypeEmitState {
|
|
27
76
|
return {
|
|
28
77
|
aliases: new Map(),
|
|
78
|
+
inProgress: new Map(),
|
|
29
79
|
lazyNames: new WeakMap(),
|
|
30
80
|
nextId: 0,
|
|
31
81
|
reserved: new Set(),
|
|
@@ -43,7 +93,7 @@ export function createTypeEmitState(): TypeEmitState {
|
|
|
43
93
|
export function emitSchemaType(schema: StandardSchemaLike, state?: TypeEmitState): string {
|
|
44
94
|
const vendor = schema["~standard"].vendor
|
|
45
95
|
if (vendor === "zod") return emitZod(schema, state ?? createTypeEmitState())
|
|
46
|
-
if (vendor === "valibot") return emitValibot(schema)
|
|
96
|
+
if (vendor === "valibot") return emitValibot(schema, 0)
|
|
47
97
|
if (vendor === "arktype") return emitArkType(schema)
|
|
48
98
|
if (vendor === "yup") return emitYup(schema)
|
|
49
99
|
if (vendor === "effect") return emitEffect(schema)
|
|
@@ -62,7 +112,9 @@ function zodIsOptional(def: Record<string, unknown>): boolean {
|
|
|
62
112
|
t === "ZodDefault" ||
|
|
63
113
|
t === "default" ||
|
|
64
114
|
t === "ZodCatch" ||
|
|
65
|
-
t === "catch"
|
|
115
|
+
t === "catch" ||
|
|
116
|
+
t === "ZodReadonly" ||
|
|
117
|
+
t === "readonly"
|
|
66
118
|
) {
|
|
67
119
|
const inner = def.innerType as unknown
|
|
68
120
|
if (inner) return zodIsOptional(zodDef(inner))
|
|
@@ -129,7 +181,46 @@ function typeRefersToReserved(typeStr: string, state: TypeEmitState): boolean {
|
|
|
129
181
|
return false
|
|
130
182
|
}
|
|
131
183
|
|
|
184
|
+
/** Values of a TS enum object, without the reverse mappings numeric enums carry (`{ A: 0, "0": "A" }`). */
|
|
185
|
+
function enumValues(entries: Record<string, unknown>): unknown[] {
|
|
186
|
+
return Object.keys(entries)
|
|
187
|
+
.filter((k) => typeof entries[entries[k] as string] !== "number")
|
|
188
|
+
.map((k) => entries[k])
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Recursion guard for schemas that refer to themselves without `z.lazy` (Zod 4 getters). The
|
|
193
|
+
* first visit emits the body; a visit while the body is still being emitted names the schema,
|
|
194
|
+
* and the finished body becomes that alias.
|
|
195
|
+
*/
|
|
132
196
|
function emitZod(schema: unknown, state: TypeEmitState): string {
|
|
197
|
+
if (schema === null || typeof schema !== "object") return emitZodNode(schema, state)
|
|
198
|
+
/* a z.lazy names itself before emitting its body */
|
|
199
|
+
const known = state.lazyNames.get(schema)
|
|
200
|
+
if (known !== undefined) return known
|
|
201
|
+
const active = state.inProgress.get(schema)
|
|
202
|
+
if (active !== undefined) {
|
|
203
|
+
if (active.name === null) {
|
|
204
|
+
if (state.nextId >= LAZY_ALIAS_CAP) return "unknown"
|
|
205
|
+
active.name = `_Lazy${state.nextId++}`
|
|
206
|
+
state.reserved.add(active.name)
|
|
207
|
+
}
|
|
208
|
+
return active.name
|
|
209
|
+
}
|
|
210
|
+
const entry: { name: string | null } = { name: null }
|
|
211
|
+
state.inProgress.set(schema, entry)
|
|
212
|
+
try {
|
|
213
|
+
const body = emitZodNode(schema, state)
|
|
214
|
+
if (entry.name === null) return body
|
|
215
|
+
state.aliases.set(entry.name, body)
|
|
216
|
+
state.lazyNames.set(schema, entry.name)
|
|
217
|
+
return entry.name
|
|
218
|
+
} finally {
|
|
219
|
+
state.inProgress.delete(schema)
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function emitZodNode(schema: unknown, state: TypeEmitState): string {
|
|
133
224
|
const stamped = zodTsTypeMeta(schema)
|
|
134
225
|
if (stamped) return stamped
|
|
135
226
|
|
|
@@ -140,19 +231,27 @@ function emitZod(schema: unknown, state: TypeEmitState): string {
|
|
|
140
231
|
switch (typeName) {
|
|
141
232
|
case "ZodString":
|
|
142
233
|
case "string":
|
|
234
|
+
case "template_literal":
|
|
143
235
|
return "string"
|
|
144
236
|
case "ZodNumber":
|
|
145
237
|
case "number":
|
|
238
|
+
case "nan":
|
|
146
239
|
return "number"
|
|
147
240
|
case "ZodBoolean":
|
|
148
241
|
case "boolean":
|
|
242
|
+
case "success":
|
|
149
243
|
return "boolean"
|
|
150
244
|
case "ZodBigInt":
|
|
151
245
|
case "bigint":
|
|
152
246
|
return "bigint"
|
|
247
|
+
case "ZodSymbol":
|
|
248
|
+
case "symbol":
|
|
249
|
+
return "symbol"
|
|
153
250
|
case "ZodDate":
|
|
154
251
|
case "date":
|
|
155
252
|
return "Date"
|
|
253
|
+
case "file":
|
|
254
|
+
return "File"
|
|
156
255
|
case "ZodUndefined":
|
|
157
256
|
case "undefined":
|
|
158
257
|
return "undefined"
|
|
@@ -166,30 +265,23 @@ function emitZod(schema: unknown, state: TypeEmitState): string {
|
|
|
166
265
|
case "ZodUnknown":
|
|
167
266
|
case "any":
|
|
168
267
|
case "unknown":
|
|
268
|
+
case "custom":
|
|
169
269
|
return "unknown"
|
|
170
270
|
case "ZodNever":
|
|
171
271
|
case "never":
|
|
172
272
|
return "never"
|
|
173
273
|
case "ZodLiteral":
|
|
174
274
|
case "literal": {
|
|
175
|
-
/* v4:
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
const values = def.values as unknown[]
|
|
179
|
-
if (values.length === 1) {
|
|
180
|
-
const v0 = values[0]
|
|
181
|
-
return typeof v0 === "string" ? `"${v0}"` : String(v0)
|
|
182
|
-
}
|
|
183
|
-
return values.map((v0) => (typeof v0 === "string" ? `"${v0}"` : String(v0))).join(" | ")
|
|
275
|
+
/* v4: values array, v3: single value */
|
|
276
|
+
const values = Array.isArray(def.values) ? (def.values as unknown[]) : [def.value]
|
|
277
|
+
return unionOf(values.map(literalType))
|
|
184
278
|
}
|
|
185
279
|
case "ZodEnum":
|
|
186
280
|
case "enum": {
|
|
187
|
-
/* v4:
|
|
281
|
+
/* v4: entries record, v3: values array */
|
|
188
282
|
const vals = (def.values ?? def.entries) as unknown
|
|
189
|
-
|
|
190
|
-
return
|
|
191
|
-
.map((v0) => `"${v0}"`)
|
|
192
|
-
.join(" | ")
|
|
283
|
+
const list = Array.isArray(vals) ? vals : enumValues(vals as Record<string, unknown>)
|
|
284
|
+
return unionOf(list.map(literalType))
|
|
193
285
|
}
|
|
194
286
|
case "ZodObject":
|
|
195
287
|
case "object": {
|
|
@@ -210,28 +302,46 @@ function emitZod(schema: unknown, state: TypeEmitState): string {
|
|
|
210
302
|
return arrayOf(emitZod((def.type ?? def.element) as unknown, state))
|
|
211
303
|
case "array":
|
|
212
304
|
return arrayOf(emitZod(def.element as unknown, state))
|
|
305
|
+
case "ZodSet":
|
|
306
|
+
case "set":
|
|
307
|
+
return `Set<${emitZod(def.valueType as unknown, state)}>`
|
|
308
|
+
case "ZodMap":
|
|
309
|
+
case "map":
|
|
310
|
+
return `Map<${emitZod(def.keyType as unknown, state)}, ${emitZod(def.valueType as unknown, state)}>`
|
|
311
|
+
case "ZodPromise":
|
|
312
|
+
case "promise":
|
|
313
|
+
return `Promise<${emitZod(def.innerType as unknown, state)}>`
|
|
314
|
+
case "ZodFunction":
|
|
315
|
+
case "function":
|
|
316
|
+
return "(...args: never[]) => unknown"
|
|
213
317
|
case "ZodOptional":
|
|
214
318
|
case "optional":
|
|
215
|
-
return
|
|
319
|
+
return unionOf([emitZod(def.innerType as unknown, state), "undefined"])
|
|
320
|
+
case "nonoptional":
|
|
321
|
+
return `Exclude<${emitZod(def.innerType as unknown, state)}, undefined>`
|
|
216
322
|
case "ZodNullable":
|
|
217
323
|
case "nullable":
|
|
218
|
-
return
|
|
324
|
+
return unionOf([emitZod(def.innerType as unknown, state), "null"])
|
|
219
325
|
case "ZodUnion":
|
|
220
326
|
case "ZodDiscriminatedUnion":
|
|
221
327
|
case "union":
|
|
222
|
-
return (def.options as unknown[]).map((o) => emitZod(o, state))
|
|
328
|
+
return unionOf((def.options as unknown[]).map((o) => emitZod(o, state)))
|
|
223
329
|
case "ZodIntersection":
|
|
224
330
|
case "intersection":
|
|
225
|
-
return
|
|
331
|
+
return intersectionOf([emitZod(def.left as unknown, state), emitZod(def.right as unknown, state)])
|
|
226
332
|
case "ZodRecord":
|
|
227
333
|
case "record":
|
|
228
334
|
return emitZodRecord(emitZod(def.keyType as unknown, state), emitZod(def.valueType as unknown, state), state)
|
|
229
335
|
case "ZodTuple":
|
|
230
|
-
case "tuple":
|
|
231
|
-
|
|
336
|
+
case "tuple": {
|
|
337
|
+
const items = (def.items as unknown[]).map((i) => emitZod(i, state))
|
|
338
|
+
if (def.rest) items.push(`...${arrayOf(emitZod(def.rest as unknown, state))}`)
|
|
339
|
+
return `[${items.join(", ")}]`
|
|
340
|
+
}
|
|
232
341
|
case "ZodDefault":
|
|
233
342
|
case "ZodCatch":
|
|
234
343
|
case "default":
|
|
344
|
+
case "prefault":
|
|
235
345
|
case "catch":
|
|
236
346
|
return emitZod(def.innerType as unknown, state)
|
|
237
347
|
case "ZodReadonly":
|
|
@@ -246,6 +356,7 @@ function emitZod(schema: unknown, state: TypeEmitState): string {
|
|
|
246
356
|
case "lazy":
|
|
247
357
|
return emitZodLazy(schema, def, state)
|
|
248
358
|
default:
|
|
359
|
+
/* a transform's output is whatever the function returns — the schema cannot say */
|
|
249
360
|
return "unknown"
|
|
250
361
|
}
|
|
251
362
|
}
|
|
@@ -280,22 +391,35 @@ function emitZodLazy(schema: unknown, def: Record<string, unknown>, state: TypeE
|
|
|
280
391
|
|
|
281
392
|
/* ---- Valibot emitter ---- */
|
|
282
393
|
|
|
283
|
-
|
|
394
|
+
const VALIBOT_OPTIONAL = new Set(["exact_optional", "nullish", "optional", "undefinedable"])
|
|
395
|
+
/** Lazy schemas can recurse without end; past this depth a node is `unknown`. */
|
|
396
|
+
const VALIBOT_MAX_DEPTH = 32
|
|
397
|
+
|
|
398
|
+
function emitValibot(schema: unknown, depth: number): string {
|
|
399
|
+
if (depth > VALIBOT_MAX_DEPTH) return "unknown"
|
|
284
400
|
const s = schema as Record<string, unknown>
|
|
285
401
|
const type = s.type as string | undefined
|
|
286
402
|
if (!type) return "unknown"
|
|
403
|
+
const walk = (child: unknown): string => emitValibot(child, depth + 1)
|
|
287
404
|
|
|
288
405
|
switch (type) {
|
|
289
406
|
case "string":
|
|
290
407
|
return "string"
|
|
291
408
|
case "number":
|
|
409
|
+
case "nan":
|
|
292
410
|
return "number"
|
|
293
411
|
case "boolean":
|
|
294
412
|
return "boolean"
|
|
295
413
|
case "bigint":
|
|
296
414
|
return "bigint"
|
|
415
|
+
case "symbol":
|
|
416
|
+
return "symbol"
|
|
297
417
|
case "date":
|
|
298
418
|
return "Date"
|
|
419
|
+
case "file":
|
|
420
|
+
return "File"
|
|
421
|
+
case "blob":
|
|
422
|
+
return "Blob"
|
|
299
423
|
case "undefined":
|
|
300
424
|
return "undefined"
|
|
301
425
|
case "null":
|
|
@@ -307,48 +431,68 @@ function emitValibot(schema: unknown): string {
|
|
|
307
431
|
return "unknown"
|
|
308
432
|
case "never":
|
|
309
433
|
return "never"
|
|
310
|
-
case "literal":
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
case "
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
case "picklist": {
|
|
321
|
-
const options = s.options as unknown[]
|
|
322
|
-
return options.map((val) => (typeof val === "string" ? `"${val}"` : String(val))).join(" | ")
|
|
323
|
-
}
|
|
324
|
-
case "object": {
|
|
434
|
+
case "literal":
|
|
435
|
+
return literalType(s.literal)
|
|
436
|
+
case "enum":
|
|
437
|
+
return unionOf(enumValues(s.enum as Record<string, unknown>).map(literalType))
|
|
438
|
+
case "picklist":
|
|
439
|
+
return unionOf((s.options as unknown[]).map(literalType))
|
|
440
|
+
case "object":
|
|
441
|
+
case "strict_object":
|
|
442
|
+
case "loose_object":
|
|
443
|
+
case "object_with_rest": {
|
|
325
444
|
const entries = s.entries as Record<string, unknown>
|
|
326
445
|
const keys = Object.keys(entries)
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
.
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
446
|
+
const fields = keys.map((k) => {
|
|
447
|
+
const propType = (entries[k] as Record<string, unknown>).type as string | undefined
|
|
448
|
+
const isOpt = propType !== undefined && VALIBOT_OPTIONAL.has(propType)
|
|
449
|
+
return `${quoteKey(k)}${isOpt ? "?" : ""}: ${walk(entries[k])}`
|
|
450
|
+
})
|
|
451
|
+
if (type === "loose_object") fields.push("[key: string]: unknown")
|
|
452
|
+
if (type === "object_with_rest") fields.push(`[key: string]: ${unionOf([walk(s.rest), "unknown"])}`)
|
|
453
|
+
if (fields.length === 0) return "{}"
|
|
454
|
+
return `{ ${fields.join("; ")} }`
|
|
335
455
|
}
|
|
336
456
|
case "array":
|
|
337
|
-
return arrayOf(
|
|
457
|
+
return arrayOf(walk(s.item))
|
|
458
|
+
case "set":
|
|
459
|
+
return `Set<${walk(s.value)}>`
|
|
460
|
+
case "map":
|
|
461
|
+
return `Map<${walk(s.key)}, ${walk(s.value)}>`
|
|
338
462
|
case "optional":
|
|
339
|
-
|
|
463
|
+
case "exact_optional":
|
|
464
|
+
case "undefinedable":
|
|
465
|
+
return unionOf([walk(s.wrapped), "undefined"])
|
|
340
466
|
case "nullable":
|
|
341
|
-
return
|
|
467
|
+
return unionOf([walk(s.wrapped), "null"])
|
|
342
468
|
case "nullish":
|
|
343
|
-
return
|
|
469
|
+
return unionOf([walk(s.wrapped), "null", "undefined"])
|
|
470
|
+
case "non_optional":
|
|
471
|
+
return `Exclude<${walk(s.wrapped)}, undefined>`
|
|
472
|
+
case "non_nullable":
|
|
473
|
+
return `Exclude<${walk(s.wrapped)}, null>`
|
|
474
|
+
case "non_nullish":
|
|
475
|
+
return `NonNullable<${walk(s.wrapped)}>`
|
|
344
476
|
case "union":
|
|
345
|
-
|
|
477
|
+
case "variant":
|
|
478
|
+
return unionOf((s.options as unknown[]).map(walk))
|
|
346
479
|
case "intersect":
|
|
347
|
-
return (s.options as unknown[]).map(
|
|
480
|
+
return intersectionOf((s.options as unknown[]).map(walk))
|
|
348
481
|
case "record":
|
|
349
|
-
return `Record<${
|
|
482
|
+
return `Record<${walk(s.key)}, ${walk(s.value)}>`
|
|
350
483
|
case "tuple":
|
|
351
|
-
|
|
484
|
+
case "strict_tuple":
|
|
485
|
+
case "loose_tuple":
|
|
486
|
+
case "tuple_with_rest": {
|
|
487
|
+
const items = (s.items as unknown[]).map(walk)
|
|
488
|
+
if (type === "tuple_with_rest") items.push(`...${arrayOf(walk(s.rest))}`)
|
|
489
|
+
if (type === "loose_tuple") items.push("...unknown[]")
|
|
490
|
+
return `[${items.join(", ")}]`
|
|
491
|
+
}
|
|
492
|
+
case "lazy": {
|
|
493
|
+
const getter = s.getter as ((input: unknown) => unknown) | undefined
|
|
494
|
+
return typeof getter === "function" ? walk(getter(undefined)) : "unknown"
|
|
495
|
+
}
|
|
352
496
|
default:
|
|
353
497
|
return "unknown"
|
|
354
498
|
}
|
|
@@ -382,17 +526,16 @@ function emitArkJson(node: unknown): string {
|
|
|
382
526
|
if (Array.isArray(node)) {
|
|
383
527
|
if (node.length === 0) return "never"
|
|
384
528
|
if (isBooleanUnion(node)) return "boolean"
|
|
385
|
-
return node.map((n) => emitArkJson(n))
|
|
529
|
+
return unionOf(node.map((n) => emitArkJson(n)))
|
|
386
530
|
}
|
|
387
531
|
|
|
388
532
|
const obj = node as Record<string, unknown>
|
|
389
533
|
|
|
390
534
|
if ("unit" in obj) {
|
|
391
535
|
const val = obj.unit
|
|
392
|
-
if (val === null) return "null"
|
|
393
536
|
/* arktype serializes undefined as the string "undefined" in JSON */
|
|
394
537
|
if (val === "undefined") return "undefined"
|
|
395
|
-
return
|
|
538
|
+
return literalType(val)
|
|
396
539
|
}
|
|
397
540
|
|
|
398
541
|
if ("sequence" in obj) {
|
|
@@ -486,9 +629,8 @@ function emitYup(schema: unknown): string {
|
|
|
486
629
|
}
|
|
487
630
|
|
|
488
631
|
function emitYupDesc(desc: YupDesc): string {
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
return base
|
|
632
|
+
const base = emitYupBase(desc)
|
|
633
|
+
return desc.nullable ? unionOf([base, "null"]) : base
|
|
492
634
|
}
|
|
493
635
|
|
|
494
636
|
function emitYupBase(desc: YupDesc): string {
|
|
@@ -522,9 +664,7 @@ function emitYupBase(desc: YupDesc): string {
|
|
|
522
664
|
return `[${desc.innerType.map((i) => emitYupDesc(i)).join(", ")}]`
|
|
523
665
|
}
|
|
524
666
|
case "mixed": {
|
|
525
|
-
if (desc.oneOf && desc.oneOf.length > 0)
|
|
526
|
-
return desc.oneOf.map((val) => (typeof val === "string" ? `"${val}"` : String(val))).join(" | ")
|
|
527
|
-
}
|
|
667
|
+
if (desc.oneOf && desc.oneOf.length > 0) return unionOf(desc.oneOf.map(literalType))
|
|
528
668
|
return "unknown"
|
|
529
669
|
}
|
|
530
670
|
case "lazy":
|
|
@@ -543,7 +683,7 @@ type EffectAST = {
|
|
|
543
683
|
literal?: unknown
|
|
544
684
|
propertySignatures?: Array<{
|
|
545
685
|
isOptional: boolean
|
|
546
|
-
name: string
|
|
686
|
+
name: string | symbol
|
|
547
687
|
type: EffectAST
|
|
548
688
|
}>
|
|
549
689
|
rest?: Array<{ type: EffectAST }>
|
|
@@ -580,13 +720,10 @@ function emitEffectAst(ast: EffectAST): string {
|
|
|
580
720
|
return "never"
|
|
581
721
|
case "ObjectKeyword":
|
|
582
722
|
return "object"
|
|
583
|
-
case "Literal":
|
|
584
|
-
|
|
585
|
-
if (val === null) return "null"
|
|
586
|
-
return typeof val === "string" ? `"${val}"` : String(val)
|
|
587
|
-
}
|
|
723
|
+
case "Literal":
|
|
724
|
+
return literalType(ast.literal)
|
|
588
725
|
case "Union":
|
|
589
|
-
return (ast.types ?? []).map((t) => emitEffectAst(t))
|
|
726
|
+
return unionOf((ast.types ?? []).map((t) => emitEffectAst(t)))
|
|
590
727
|
case "TypeLiteral": {
|
|
591
728
|
const props = ast.propertySignatures ?? []
|
|
592
729
|
const idxSigs = ast.indexSignatures ?? []
|
|
@@ -594,23 +731,24 @@ function emitEffectAst(ast: EffectAST): string {
|
|
|
594
731
|
if (props.length === 0 && idxSigs.length === 1) {
|
|
595
732
|
return `Record<${emitEffectAst(idxSigs[0].parameter)}, ${emitEffectAst(idxSigs[0].type)}>`
|
|
596
733
|
}
|
|
597
|
-
const parts = props
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
734
|
+
const parts = props
|
|
735
|
+
.filter((p) => typeof p.name === "string")
|
|
736
|
+
.map((p) => {
|
|
737
|
+
const opt = p.isOptional ? "?" : ""
|
|
738
|
+
return `${quoteKey(p.name as string)}${opt}: ${emitEffectAst(p.type)}`
|
|
739
|
+
})
|
|
601
740
|
return `{ ${parts.join("; ")} }`
|
|
602
741
|
}
|
|
603
742
|
case "TupleType": {
|
|
604
743
|
const elems = ast.elements ?? []
|
|
605
|
-
const rest = ast.rest
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
744
|
+
const rest = ast.rest ?? []
|
|
745
|
+
const items = elems.map((e) => `${emitEffectAst(e.type)}${e.isOptional ? "?" : ""}`)
|
|
746
|
+
if (rest.length > 0) {
|
|
747
|
+
if (items.length === 0 && rest.length === 1) return arrayOf(emitEffectAst(rest[0].type))
|
|
748
|
+
items.push(`...${arrayOf(emitEffectAst(rest[0].type))}`)
|
|
749
|
+
for (const tail of rest.slice(1)) items.push(emitEffectAst(tail.type))
|
|
611
750
|
}
|
|
612
|
-
|
|
613
|
-
return `[${elems.map((e) => emitEffectAst(e.type)).join(", ")}]`
|
|
751
|
+
return `[${items.join(", ")}]`
|
|
614
752
|
}
|
|
615
753
|
case "Declaration":
|
|
616
754
|
return "unknown"
|