@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/cli-go/errors.go
CHANGED
|
@@ -7,14 +7,28 @@ import (
|
|
|
7
7
|
"net"
|
|
8
8
|
)
|
|
9
9
|
|
|
10
|
+
// UsageError marks bad flags, bad config and invalid input; it maps to exit 4.
|
|
11
|
+
type UsageError struct{ Err error }
|
|
12
|
+
|
|
13
|
+
func (e *UsageError) Error() string { return e.Err.Error() }
|
|
14
|
+
func (e *UsageError) Unwrap() error { return e.Err }
|
|
15
|
+
|
|
16
|
+
// Usage wraps err as a UsageError.
|
|
17
|
+
func Usage(err error) error {
|
|
18
|
+
if err == nil {
|
|
19
|
+
return nil
|
|
20
|
+
}
|
|
21
|
+
return &UsageError{Err: err}
|
|
22
|
+
}
|
|
23
|
+
|
|
10
24
|
// ExitFor maps a CLI-level error to a process exit code.
|
|
11
25
|
//
|
|
12
26
|
// Codes:
|
|
13
27
|
//
|
|
14
28
|
// 0 success
|
|
15
|
-
// 1 4xx client error
|
|
16
|
-
// 2 5xx server error
|
|
17
|
-
// 3 network / transport failure or
|
|
29
|
+
// 1 4xx client error
|
|
30
|
+
// 2 5xx server error
|
|
31
|
+
// 3 network / transport failure or timeout
|
|
18
32
|
// 4 bad flags / bad config / missing api key
|
|
19
33
|
// 5 3xx unexpected redirect
|
|
20
34
|
func ExitFor(err error) int {
|
|
@@ -24,20 +38,24 @@ func ExitFor(err error) int {
|
|
|
24
38
|
if errors.Is(err, ErrMissingAPIKey) {
|
|
25
39
|
return 4
|
|
26
40
|
}
|
|
41
|
+
var usage *UsageError
|
|
42
|
+
if errors.As(err, &usage) {
|
|
43
|
+
return 4
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* SDK errors expose Status() (APIError) */
|
|
47
|
+
var apiErr interface{ Status() int }
|
|
48
|
+
if errors.As(err, &apiErr) {
|
|
49
|
+
return exitForStatus(apiErr.Status())
|
|
50
|
+
}
|
|
51
|
+
|
|
27
52
|
if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) {
|
|
28
53
|
return 3
|
|
29
54
|
}
|
|
30
|
-
|
|
31
55
|
var netErr net.Error
|
|
32
56
|
if errors.As(err, &netErr) {
|
|
33
57
|
return 3
|
|
34
58
|
}
|
|
35
|
-
|
|
36
|
-
var apiErr interface{ StatusCode() int }
|
|
37
|
-
if errors.As(err, &apiErr) {
|
|
38
|
-
return exitForStatus(apiErr.StatusCode())
|
|
39
|
-
}
|
|
40
|
-
|
|
41
59
|
return 3
|
|
42
60
|
}
|
|
43
61
|
|
package/src/cli-go/multipart.go
CHANGED
|
@@ -2,54 +2,78 @@
|
|
|
2
2
|
package cli
|
|
3
3
|
|
|
4
4
|
import (
|
|
5
|
-
"bytes"
|
|
6
5
|
"fmt"
|
|
7
6
|
"io"
|
|
8
7
|
"mime/multipart"
|
|
9
8
|
"os"
|
|
10
9
|
"path/filepath"
|
|
10
|
+
"sort"
|
|
11
11
|
)
|
|
12
12
|
|
|
13
|
-
// BuildMultipart
|
|
13
|
+
// BuildMultipart streams a multipart/form-data body: files are read as the
|
|
14
|
+
// request is sent, not buffered in memory.
|
|
14
15
|
//
|
|
15
|
-
// fields are written as plain form fields
|
|
16
|
-
//
|
|
16
|
+
// fields are written as plain form fields; files are keyed by form-field-name →
|
|
17
|
+
// file path. Every file is opened up front so a bad path fails before sending.
|
|
17
18
|
//
|
|
18
19
|
// Returns the body reader, the Content-Type header value (including boundary),
|
|
19
20
|
// and any error.
|
|
20
21
|
func BuildMultipart(fields map[string]string, files map[string]string) (io.Reader, string, error) {
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
fieldNames := sortedNames(fields)
|
|
23
|
+
fileNames := sortedNames(files)
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
for name, path := range files {
|
|
25
|
+
opened := make(map[string]*os.File, len(files))
|
|
26
|
+
for _, name := range fileNames {
|
|
27
|
+
path := files[name]
|
|
31
28
|
if path == "" {
|
|
29
|
+
closeAll(opened)
|
|
32
30
|
return nil, "", fmt.Errorf("missing file path for field %q", name)
|
|
33
31
|
}
|
|
34
|
-
|
|
32
|
+
f, err := os.Open(path)
|
|
35
33
|
if err != nil {
|
|
36
|
-
|
|
34
|
+
closeAll(opened)
|
|
35
|
+
return nil, "", Usage(fmt.Errorf("open file %s: %w", path, err))
|
|
37
36
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
opened[name] = f
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
pr, pw := io.Pipe()
|
|
41
|
+
writer := multipart.NewWriter(pw)
|
|
42
|
+
go func() {
|
|
43
|
+
defer closeAll(opened)
|
|
44
|
+
for _, name := range fieldNames {
|
|
45
|
+
if err := writer.WriteField(name, fields[name]); err != nil {
|
|
46
|
+
pw.CloseWithError(fmt.Errorf("write field %q: %w", name, err))
|
|
47
|
+
return
|
|
48
|
+
}
|
|
42
49
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
for _, name := range fileNames {
|
|
51
|
+
part, err := writer.CreateFormFile(name, filepath.Base(files[name]))
|
|
52
|
+
if err != nil {
|
|
53
|
+
pw.CloseWithError(fmt.Errorf("create form file %q: %w", name, err))
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
if _, err := io.Copy(part, opened[name]); err != nil {
|
|
57
|
+
pw.CloseWithError(fmt.Errorf("copy file %s: %w", files[name], err))
|
|
58
|
+
return
|
|
59
|
+
}
|
|
46
60
|
}
|
|
47
|
-
|
|
48
|
-
}
|
|
61
|
+
pw.CloseWithError(writer.Close())
|
|
62
|
+
}()
|
|
63
|
+
return pr, writer.FormDataContentType(), nil
|
|
64
|
+
}
|
|
49
65
|
|
|
50
|
-
|
|
51
|
-
|
|
66
|
+
func sortedNames(m map[string]string) []string {
|
|
67
|
+
names := make([]string, 0, len(m))
|
|
68
|
+
for k := range m {
|
|
69
|
+
names = append(names, k)
|
|
52
70
|
}
|
|
71
|
+
sort.Strings(names)
|
|
72
|
+
return names
|
|
73
|
+
}
|
|
53
74
|
|
|
54
|
-
|
|
75
|
+
func closeAll(files map[string]*os.File) {
|
|
76
|
+
for _, f := range files {
|
|
77
|
+
f.Close()
|
|
78
|
+
}
|
|
55
79
|
}
|
package/src/cli-go/output.go
CHANGED
|
@@ -2,16 +2,66 @@
|
|
|
2
2
|
package cli
|
|
3
3
|
|
|
4
4
|
import (
|
|
5
|
+
"bytes"
|
|
5
6
|
"encoding/json"
|
|
6
7
|
"fmt"
|
|
7
8
|
"io"
|
|
8
9
|
"sort"
|
|
9
10
|
"strings"
|
|
10
11
|
"text/tabwriter"
|
|
12
|
+
"unicode"
|
|
11
13
|
|
|
12
14
|
"sigs.k8s.io/yaml"
|
|
13
15
|
)
|
|
14
16
|
|
|
17
|
+
// DecodeJSON decodes a response body keeping numbers exact (json.Number), so a
|
|
18
|
+
// 64-bit id is printed as sent instead of as a rounded float.
|
|
19
|
+
func DecodeJSON(body []byte) (any, error) {
|
|
20
|
+
if len(body) == 0 {
|
|
21
|
+
return nil, nil
|
|
22
|
+
}
|
|
23
|
+
dec := json.NewDecoder(bytes.NewReader(body))
|
|
24
|
+
dec.UseNumber()
|
|
25
|
+
var out any
|
|
26
|
+
if err := dec.Decode(&out); err != nil {
|
|
27
|
+
return nil, err
|
|
28
|
+
}
|
|
29
|
+
return out, nil
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Sanitize drops control characters (ESC, CR, tabs, …) so server-controlled
|
|
33
|
+
// text cannot drive the terminal or break table layout.
|
|
34
|
+
func Sanitize(s string) string {
|
|
35
|
+
return strings.Map(func(r rune) rune {
|
|
36
|
+
if r == '\n' {
|
|
37
|
+
return ' '
|
|
38
|
+
}
|
|
39
|
+
if unicode.IsControl(r) {
|
|
40
|
+
return -1
|
|
41
|
+
}
|
|
42
|
+
return r
|
|
43
|
+
}, s)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func cell(v any) string {
|
|
47
|
+
switch t := v.(type) {
|
|
48
|
+
case nil:
|
|
49
|
+
return ""
|
|
50
|
+
case string:
|
|
51
|
+
return Sanitize(t)
|
|
52
|
+
case json.Number:
|
|
53
|
+
return t.String()
|
|
54
|
+
case map[string]any, []any:
|
|
55
|
+
enc, err := json.Marshal(t)
|
|
56
|
+
if err != nil {
|
|
57
|
+
return Sanitize(fmt.Sprint(t))
|
|
58
|
+
}
|
|
59
|
+
return Sanitize(string(enc))
|
|
60
|
+
default:
|
|
61
|
+
return Sanitize(fmt.Sprint(t))
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
15
65
|
// Emit writes data to w in the requested mode.
|
|
16
66
|
//
|
|
17
67
|
// Supported modes: json (pretty, 2-space indent), ndjson, yaml, table.
|
|
@@ -67,11 +117,15 @@ func printTable(data any, w io.Writer) error {
|
|
|
67
117
|
}
|
|
68
118
|
keys := collectKeys(rows)
|
|
69
119
|
tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0)
|
|
70
|
-
|
|
120
|
+
header := make([]string, len(keys))
|
|
121
|
+
for i, k := range keys {
|
|
122
|
+
header[i] = Sanitize(k)
|
|
123
|
+
}
|
|
124
|
+
fmt.Fprintln(tw, strings.Join(header, "\t"))
|
|
71
125
|
for _, row := range rows {
|
|
72
126
|
cols := make([]string, len(keys))
|
|
73
127
|
for i, k := range keys {
|
|
74
|
-
cols[i] =
|
|
128
|
+
cols[i] = cell(row[k])
|
|
75
129
|
}
|
|
76
130
|
fmt.Fprintln(tw, strings.Join(cols, "\t"))
|
|
77
131
|
}
|
|
@@ -84,11 +138,11 @@ func printTable(data any, w io.Writer) error {
|
|
|
84
138
|
sort.Strings(keys)
|
|
85
139
|
tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0)
|
|
86
140
|
for _, k := range keys {
|
|
87
|
-
fmt.Fprintf(tw, "%s\t%
|
|
141
|
+
fmt.Fprintf(tw, "%s\t%s\n", Sanitize(k), cell(v[k]))
|
|
88
142
|
}
|
|
89
143
|
return tw.Flush()
|
|
90
144
|
default:
|
|
91
|
-
_, err := fmt.Fprintln(w, data)
|
|
145
|
+
_, err := fmt.Fprintln(w, cell(data))
|
|
92
146
|
return err
|
|
93
147
|
}
|
|
94
148
|
}
|
package/src/cli-go/root.go
CHANGED
|
@@ -20,7 +20,7 @@ func NewRoot(binaryName, version string) *cobra.Command {
|
|
|
20
20
|
Use: binaryName,
|
|
21
21
|
Version: version,
|
|
22
22
|
}
|
|
23
|
-
root.PersistentFlags().String("api-key", "", "API key (overrides env + config file)")
|
|
23
|
+
root.PersistentFlags().String("api-key", "", "API key (overrides env + config file; visible to other local users in the process list, prefer the env var)")
|
|
24
24
|
root.PersistentFlags().String("base-url", "", "Override API base URL")
|
|
25
25
|
root.PersistentFlags().String("output", "json", "Output mode: json|ndjson|yaml|table")
|
|
26
26
|
root.PersistentFlags().Bool("verbose", false, "Print request metadata to stderr")
|
package/src/cli-go/version.go
CHANGED
package/src/cli.ts
CHANGED
|
@@ -1,82 +1,14 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
import { existsSync, statSync, watch } from "node:fs"
|
|
3
3
|
import { dirname, resolve } from "node:path"
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
app?: string
|
|
13
|
-
cli?: boolean
|
|
14
|
-
cliBinaryName?: string
|
|
15
|
-
cliConfigName?: string
|
|
16
|
-
cliDefaultBaseUrl?: string
|
|
17
|
-
cliEnvPrefix?: string
|
|
18
|
-
cliModulePath?: string
|
|
19
|
-
cliOut?: string
|
|
20
|
-
cliSdkModulePath?: string
|
|
21
|
-
config?: string
|
|
22
|
-
manifest?: boolean
|
|
23
|
-
mergeTree?: string
|
|
24
|
-
sdk?: boolean
|
|
25
|
-
tree?: boolean
|
|
26
|
-
types?: boolean
|
|
27
|
-
watch?: boolean
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const BOOLEAN_FLAGS = new Set(["cli", "manifest", "sdk", "tree", "types", "watch"])
|
|
31
|
-
|
|
32
|
-
function parseArgs(args: string[]): CliFlags {
|
|
33
|
-
const parsed: Record<string, string> = {}
|
|
34
|
-
for (let i = 0; i < args.length; i++) {
|
|
35
|
-
const arg = args[i]
|
|
36
|
-
if (!arg.startsWith("--")) continue
|
|
37
|
-
const key = arg.slice(2)
|
|
38
|
-
if (BOOLEAN_FLAGS.has(key)) {
|
|
39
|
-
parsed[key] = "true"
|
|
40
|
-
} else if (i + 1 < args.length) {
|
|
41
|
-
parsed[key] = args[i + 1]
|
|
42
|
-
i++
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return {
|
|
47
|
-
app: parsed.app,
|
|
48
|
-
cli: parsed.cli !== undefined,
|
|
49
|
-
cliBinaryName: parsed["cli-binary-name"],
|
|
50
|
-
cliConfigName: parsed["cli-config-name"],
|
|
51
|
-
cliDefaultBaseUrl: parsed["cli-default-base-url"],
|
|
52
|
-
cliEnvPrefix: parsed["cli-env-prefix"],
|
|
53
|
-
cliModulePath: parsed["cli-module-path"],
|
|
54
|
-
cliOut: parsed["cli-out"],
|
|
55
|
-
cliSdkModulePath: parsed["cli-sdk-module-path"],
|
|
56
|
-
config: parsed.config,
|
|
57
|
-
manifest: parsed.manifest !== undefined,
|
|
58
|
-
mergeTree: parsed["merge-tree"],
|
|
59
|
-
sdk: parsed.sdk !== undefined,
|
|
60
|
-
tree: parsed.tree !== undefined,
|
|
61
|
-
types: parsed.types !== undefined,
|
|
62
|
-
watch: parsed.watch !== undefined,
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async function loadConfigFromVite(configPath: string): Promise<HoneyVitePluginConfig | undefined> {
|
|
67
|
-
if (!existsSync(configPath)) return undefined
|
|
68
|
-
|
|
69
|
-
const { createJiti } = await import("jiti")
|
|
70
|
-
const jiti = createJiti(configPath, { fsCache: false, interopDefault: true, moduleCache: false })
|
|
71
|
-
|
|
72
|
-
/* importing the config executes honey() which stashes config */
|
|
73
|
-
await jiti.import(configPath)
|
|
74
|
-
|
|
75
|
-
/* read stashed config from the same module graph */
|
|
76
|
-
const pluginMod = (await jiti.import("@lovrozagar/honey/plugin")) as Record<string, unknown>
|
|
77
|
-
const getter = pluginMod.getLastHoneyConfig as typeof getLastHoneyConfig | undefined
|
|
78
|
-
return getter?.()
|
|
79
|
-
}
|
|
4
|
+
import { createModuleLoader, findViteConfig, loadHoneyPluginConfigs, type ModuleLoader } from "./codegen-load.ts"
|
|
5
|
+
import { runCli } from "./gen-process.ts"
|
|
6
|
+
import { type CliFlags, parseGenerateArgs, parseInitFlags, USAGE, UsageError } from "./cli-args.ts"
|
|
7
|
+
import { runInit } from "./init.ts"
|
|
8
|
+
import type { HoneyGoCliConfig, HoneyVitePluginConfig, ResolvedHoneyConfig } from "./plugin.ts"
|
|
9
|
+
import { generateAndWrite, generatedOutputs, isGeneratedOutput, resolveHoneyConfig } from "./plugin.ts"
|
|
10
|
+
import { WATCH_IGNORE_RE } from "./glob.ts"
|
|
11
|
+
import { setCodegenProcess } from "./serve-slot.ts"
|
|
80
12
|
|
|
81
13
|
function applyCodegenFlags(target: HoneyVitePluginConfig, flags: CliFlags): void {
|
|
82
14
|
if (!target.codegen) target.codegen = {}
|
|
@@ -90,17 +22,10 @@ function applyCodegenFlags(target: HoneyVitePluginConfig, flags: CliFlags): void
|
|
|
90
22
|
if (cliOverride) cg.cli = cliOverride
|
|
91
23
|
}
|
|
92
24
|
|
|
93
|
-
function mergeCliOverrides(base: HoneyVitePluginConfig, flags: CliFlags): HoneyVitePluginConfig {
|
|
94
|
-
const merged = { ...base }
|
|
95
|
-
if (flags.app) merged.app = flags.app
|
|
96
|
-
applyCodegenFlags(merged, flags)
|
|
97
|
-
return merged
|
|
98
|
-
}
|
|
99
|
-
|
|
100
25
|
function buildCliConfigFromFlags(flags: CliFlags): HoneyGoCliConfig | undefined {
|
|
101
26
|
if (!flags.cli && !flags.cliOut && !flags.cliBinaryName) return undefined
|
|
102
27
|
if (!flags.cliOut || !flags.cliBinaryName) {
|
|
103
|
-
throw new
|
|
28
|
+
throw new UsageError("--cli requires --cli-out and --cli-binary-name")
|
|
104
29
|
}
|
|
105
30
|
return {
|
|
106
31
|
binaryName: flags.cliBinaryName,
|
|
@@ -113,91 +38,172 @@ function buildCliConfigFromFlags(flags: CliFlags): HoneyGoCliConfig | undefined
|
|
|
113
38
|
}
|
|
114
39
|
}
|
|
115
40
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
41
|
+
/** Picks one honey() config: `--plugin` by index, else the only one, else the one whose app is `--app`. */
|
|
42
|
+
function selectPluginConfig(
|
|
43
|
+
configs: HoneyVitePluginConfig[],
|
|
44
|
+
flags: CliFlags,
|
|
45
|
+
configPath: string,
|
|
46
|
+
): HoneyVitePluginConfig | undefined {
|
|
47
|
+
if (flags.plugin !== undefined) {
|
|
48
|
+
const picked = configs[flags.plugin]
|
|
49
|
+
if (!picked) {
|
|
50
|
+
throw new UsageError(`--plugin ${flags.plugin}: ${configPath} has ${configs.length} honey() plugin(s)`)
|
|
51
|
+
}
|
|
52
|
+
return picked
|
|
53
|
+
}
|
|
54
|
+
if (configs.length <= 1) return configs[0]
|
|
55
|
+
const byApp = flags.app ? configs.filter((c) => c.app && resolve(c.app) === resolve(flags.app as string)) : []
|
|
56
|
+
if (byApp.length === 1) return byApp[0]
|
|
57
|
+
const apps = configs.map((c, i) => ` ${i}: ${c.app ?? "(no app)"}`).join("\n")
|
|
58
|
+
throw new UsageError(`${configPath} has ${configs.length} honey() plugins; pick one with --plugin <n>:\n${apps}`)
|
|
121
59
|
}
|
|
122
60
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const command = args[0]
|
|
128
|
-
|
|
129
|
-
if (command === "init") {
|
|
130
|
-
runInit(process.cwd(), parseInitFlags(args.slice(1)))
|
|
131
|
-
return
|
|
61
|
+
async function resolveConfig(cwd: string, flags: CliFlags, load: ModuleLoader): Promise<ResolvedHoneyConfig> {
|
|
62
|
+
const configPath = flags.config ? resolve(cwd, flags.config) : findViteConfig(cwd)
|
|
63
|
+
if (flags.config && !existsSync(configPath as string)) {
|
|
64
|
+
throw new UsageError(`config file not found: ${flags.config}`)
|
|
132
65
|
}
|
|
133
66
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
process.
|
|
67
|
+
let raw: HoneyVitePluginConfig | undefined
|
|
68
|
+
if (configPath) {
|
|
69
|
+
const command = process.env.HONEY_VITE_COMMAND === "serve" ? "serve" : "build"
|
|
70
|
+
const mode = process.env.HONEY_VITE_MODE ?? (command === "serve" ? "development" : "production")
|
|
71
|
+
const configs = await loadHoneyPluginConfigs(configPath, load, { command, mode })
|
|
72
|
+
if (configs.length === 0 && (flags.config || flags.plugin !== undefined || !flags.app)) {
|
|
73
|
+
throw new UsageError(`no honey() plugin found in ${configPath}; add honey() to it or pass --app`)
|
|
74
|
+
}
|
|
75
|
+
const picked = selectPluginConfig(configs, flags, configPath)
|
|
76
|
+
if (picked) raw = { ...picked, codegen: { ...picked.codegen } }
|
|
137
77
|
}
|
|
138
78
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const configPath = resolve(cwd, flags.config ?? "vite.config.ts")
|
|
144
|
-
let rawConfig: HoneyVitePluginConfig | undefined
|
|
145
|
-
|
|
146
|
-
const viteConfig = await loadConfigFromVite(configPath)
|
|
147
|
-
if (viteConfig) {
|
|
148
|
-
rawConfig = mergeCliOverrides(viteConfig, flags)
|
|
79
|
+
if (raw) {
|
|
80
|
+
if (flags.app) raw.app = flags.app
|
|
81
|
+
} else if (flags.app) {
|
|
82
|
+
raw = { app: flags.app }
|
|
149
83
|
} else {
|
|
150
|
-
|
|
84
|
+
throw new UsageError("No config found. Provide a vite.config.ts with honey() or use --app.")
|
|
151
85
|
}
|
|
86
|
+
applyCodegenFlags(raw, flags)
|
|
87
|
+
return resolveHoneyConfig(raw)
|
|
88
|
+
}
|
|
152
89
|
|
|
153
|
-
|
|
154
|
-
|
|
90
|
+
/** One generation in this process, then exit: whatever the app left running must not keep it alive. */
|
|
91
|
+
async function generateOnce(cwd: string, flags: CliFlags): Promise<never> {
|
|
92
|
+
setCodegenProcess(true)
|
|
93
|
+
const load = await createModuleLoader({ fresh: false, from: resolve(cwd, "index.ts") })
|
|
94
|
+
const resolved = await resolveConfig(cwd, flags, load)
|
|
95
|
+
try {
|
|
96
|
+
await generateAndWrite(resolved, cwd, { load })
|
|
97
|
+
} catch (err) {
|
|
98
|
+
console.error("honey: generation failed", err)
|
|
155
99
|
process.exit(1)
|
|
156
100
|
}
|
|
101
|
+
console.log("honey: generated")
|
|
102
|
+
process.exit(0)
|
|
103
|
+
}
|
|
157
104
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
105
|
+
/** Watch mode: every generation runs in a fresh child process, so edits to any imported file are seen. */
|
|
106
|
+
async function watchAndGenerate(cwd: string, flags: CliFlags, args: string[]): Promise<void> {
|
|
107
|
+
setCodegenProcess(true)
|
|
108
|
+
const load = await createModuleLoader({ fresh: true, from: resolve(cwd, "index.ts") })
|
|
109
|
+
const resolved = await resolveConfig(cwd, flags, load)
|
|
110
|
+
if (!resolved.app) throw new UsageError("--watch requires --app or a honey() config with app")
|
|
111
|
+
setCodegenProcess(false)
|
|
112
|
+
|
|
113
|
+
const childArgs = ["generate", ...args.filter((a) => a !== "--watch" && a !== "--watch=true")]
|
|
114
|
+
const outputs = generatedOutputs(resolved, cwd)
|
|
115
|
+
/* a generation creating the directory an output lives in is not an edit */
|
|
116
|
+
const outputParents = new Set(outputs.files.map((file) => dirname(file)))
|
|
117
|
+
|
|
118
|
+
let running = false
|
|
119
|
+
let pending = false
|
|
120
|
+
const generate = async (): Promise<void> => {
|
|
121
|
+
if (running) {
|
|
122
|
+
pending = true
|
|
123
|
+
return
|
|
124
|
+
}
|
|
125
|
+
running = true
|
|
161
126
|
try {
|
|
162
|
-
await
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
127
|
+
await runCli(childArgs, { cwd })
|
|
128
|
+
} catch {
|
|
129
|
+
/* the child already printed why */
|
|
130
|
+
} finally {
|
|
131
|
+
running = false
|
|
132
|
+
}
|
|
133
|
+
if (pending) {
|
|
134
|
+
pending = false
|
|
135
|
+
await generate()
|
|
167
136
|
}
|
|
168
137
|
}
|
|
169
138
|
|
|
139
|
+
let debounce: ReturnType<typeof setTimeout> | undefined
|
|
140
|
+
const schedule = (): void => {
|
|
141
|
+
clearTimeout(debounce)
|
|
142
|
+
debounce = setTimeout(() => void generate(), 100)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* Arm the watcher and read the poll baseline before saying so and before the first generation:
|
|
146
|
+
* an edit made after "watching" or while the first generation runs queues a rerun instead of
|
|
147
|
+
* landing in the gap before the watcher exists. */
|
|
148
|
+
const appAbs = resolve(cwd, resolved.app)
|
|
149
|
+
const srcDir = dirname(appAbs)
|
|
150
|
+
watch(srcDir, { recursive: true }, (_event, filename) => {
|
|
151
|
+
if (!filename) return
|
|
152
|
+
const abs = resolve(srcDir, String(filename))
|
|
153
|
+
if (WATCH_IGNORE_RE.test(abs) || isGeneratedOutput(abs, outputs) || outputParents.has(abs)) return
|
|
154
|
+
schedule()
|
|
155
|
+
})
|
|
156
|
+
/* recursive fs.watch misses replace-by-rename saves on some platforms; poll the entry too */
|
|
157
|
+
let lastMtime = mtimeOf(appAbs)
|
|
158
|
+
setInterval(() => {
|
|
159
|
+
const mtime = mtimeOf(appAbs)
|
|
160
|
+
if (mtime === lastMtime) return
|
|
161
|
+
lastMtime = mtime
|
|
162
|
+
schedule()
|
|
163
|
+
}, 250)
|
|
164
|
+
console.log(`honey: watching ${srcDir}`)
|
|
165
|
+
|
|
170
166
|
await generate()
|
|
167
|
+
}
|
|
171
168
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const srcDir = dirname(appAbs)
|
|
176
|
-
let debounceTimer: ReturnType<typeof setTimeout> | undefined
|
|
177
|
-
let lastMtime = existsSync(appAbs) ? statSync(appAbs).mtimeMs : 0
|
|
169
|
+
function mtimeOf(path: string): number {
|
|
170
|
+
return existsSync(path) ? statSync(path).mtimeMs : 0
|
|
171
|
+
}
|
|
178
172
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
173
|
+
async function main(): Promise<void> {
|
|
174
|
+
const args = process.argv.slice(2)
|
|
175
|
+
const command = args[0]
|
|
183
176
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
schedule()
|
|
188
|
-
})
|
|
189
|
-
watch(appAbs, schedule)
|
|
190
|
-
setInterval(() => {
|
|
191
|
-
if (!existsSync(appAbs)) return
|
|
192
|
-
const mtime = statSync(appAbs).mtimeMs
|
|
193
|
-
if (mtime === lastMtime) return
|
|
194
|
-
lastMtime = mtime
|
|
195
|
-
schedule()
|
|
196
|
-
}, 250)
|
|
177
|
+
if (command === "-h" || command === "--help") {
|
|
178
|
+
console.log(USAGE)
|
|
179
|
+
return
|
|
197
180
|
}
|
|
181
|
+
|
|
182
|
+
if (command === "init") {
|
|
183
|
+
runInit(process.cwd(), parseInitFlags(args.slice(1)))
|
|
184
|
+
return
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (command !== "generate") {
|
|
188
|
+
throw new UsageError(command ? `unknown command: ${command}` : "missing command")
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const rest = args.slice(1)
|
|
192
|
+
const flags = parseGenerateArgs(rest)
|
|
193
|
+
if (flags.help) {
|
|
194
|
+
console.log(USAGE)
|
|
195
|
+
return
|
|
196
|
+
}
|
|
197
|
+
const cwd = process.cwd()
|
|
198
|
+
if (flags.watch) await watchAndGenerate(cwd, flags, rest)
|
|
199
|
+
else await generateOnce(cwd, flags)
|
|
198
200
|
}
|
|
199
201
|
|
|
200
|
-
main().catch((err) => {
|
|
201
|
-
|
|
202
|
+
main().catch((err: unknown) => {
|
|
203
|
+
if (err instanceof UsageError) {
|
|
204
|
+
console.error(`honey: ${err.message}\n\n${USAGE}`)
|
|
205
|
+
} else {
|
|
206
|
+
console.error(err)
|
|
207
|
+
}
|
|
202
208
|
process.exit(1)
|
|
203
209
|
})
|