effect 4.0.6 → 4.0.7
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/dist/Arbitrary.d.ts +10 -2
- package/dist/Arbitrary.d.ts.map +1 -1
- package/dist/Arbitrary.js +2 -1
- package/dist/Arbitrary.js.map +1 -1
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +21 -6
- package/dist/Channel.js.map +1 -1
- package/dist/Data.d.ts +54 -235
- package/dist/Data.d.ts.map +1 -1
- package/dist/Data.js.map +1 -1
- package/dist/Effect.d.ts +1 -1
- package/dist/Effect.js +1 -1
- package/dist/Equal.d.ts.map +1 -1
- package/dist/Equal.js +8 -1
- package/dist/Equal.js.map +1 -1
- package/dist/Exit.d.ts +3 -3
- package/dist/Exit.d.ts.map +1 -1
- package/dist/Exit.js.map +1 -1
- package/dist/Formatter.d.ts.map +1 -1
- package/dist/Formatter.js +27 -13
- package/dist/Formatter.js.map +1 -1
- package/dist/Hash.d.ts.map +1 -1
- package/dist/Hash.js +4 -1
- package/dist/Hash.js.map +1 -1
- package/dist/JsonPatch.js +4 -0
- package/dist/JsonPatch.js.map +1 -1
- package/dist/JsonSchema.d.ts.map +1 -1
- package/dist/JsonSchema.js +13 -40
- package/dist/JsonSchema.js.map +1 -1
- package/dist/Metric.d.ts +3 -3
- package/dist/MutableList.d.ts +5 -2
- package/dist/MutableList.d.ts.map +1 -1
- package/dist/MutableList.js +7 -5
- package/dist/MutableList.js.map +1 -1
- package/dist/MutableRef.d.ts.map +1 -1
- package/dist/MutableRef.js +7 -0
- package/dist/MutableRef.js.map +1 -1
- package/dist/PartitionedSemaphore.d.ts +2 -1
- package/dist/PartitionedSemaphore.d.ts.map +1 -1
- package/dist/PartitionedSemaphore.js +22 -12
- package/dist/PartitionedSemaphore.js.map +1 -1
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +77 -27
- package/dist/Pool.js.map +1 -1
- package/dist/PubSub.d.ts.map +1 -1
- package/dist/PubSub.js +5 -6
- package/dist/PubSub.js.map +1 -1
- package/dist/Ref.d.ts.map +1 -1
- package/dist/Ref.js +8 -0
- package/dist/Ref.js.map +1 -1
- package/dist/Schedule.js +1 -1
- package/dist/Schedule.js.map +1 -1
- package/dist/Schema.d.ts +24 -8
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +37 -28
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaAST.d.ts +4 -2
- package/dist/SchemaAST.d.ts.map +1 -1
- package/dist/SchemaAST.js +14 -17
- package/dist/SchemaAST.js.map +1 -1
- package/dist/SchemaParser.d.ts.map +1 -1
- package/dist/SchemaParser.js +48 -22
- package/dist/SchemaParser.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +19 -10
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +23 -13
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +4 -1
- package/dist/SchemaTransformation.d.ts.map +1 -1
- package/dist/SchemaTransformation.js +9 -2
- package/dist/SchemaTransformation.js.map +1 -1
- package/dist/Semaphore.d.ts.map +1 -1
- package/dist/Semaphore.js +54 -35
- package/dist/Semaphore.js.map +1 -1
- package/dist/Sink.d.ts.map +1 -1
- package/dist/Sink.js +7 -2
- package/dist/Sink.js.map +1 -1
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +22 -10
- package/dist/Stream.js.map +1 -1
- package/dist/String.d.ts +3 -0
- package/dist/String.d.ts.map +1 -1
- package/dist/String.js +3 -0
- package/dist/String.js.map +1 -1
- package/dist/Tracer.d.ts +11 -1
- package/dist/Tracer.d.ts.map +1 -1
- package/dist/Tracer.js +6 -1
- package/dist/Tracer.js.map +1 -1
- package/dist/ai/LanguageModel.d.ts.map +1 -1
- package/dist/ai/LanguageModel.js +9 -0
- package/dist/ai/LanguageModel.js.map +1 -1
- package/dist/ai/McpSchema.d.ts +110 -110
- package/dist/ai/McpSchema.d.ts.map +1 -1
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +21 -15
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/Prompt.d.ts +52 -0
- package/dist/ai/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +38 -0
- package/dist/ai/Prompt.js.map +1 -1
- package/dist/ai/Response.d.ts +16 -3
- package/dist/ai/Response.d.ts.map +1 -1
- package/dist/ai/Response.js +4 -0
- package/dist/ai/Response.js.map +1 -1
- package/dist/ai/Tool.d.ts +24 -0
- package/dist/ai/Tool.d.ts.map +1 -1
- package/dist/ai/Tool.js +5 -2
- package/dist/ai/Tool.js.map +1 -1
- package/dist/ai/Toolkit.d.ts.map +1 -1
- package/dist/ai/Toolkit.js +8 -1
- package/dist/ai/Toolkit.js.map +1 -1
- package/dist/cli/Argument.d.ts +15 -0
- package/dist/cli/Argument.d.ts.map +1 -1
- package/dist/cli/Argument.js +5 -0
- package/dist/cli/Argument.js.map +1 -1
- package/dist/cli/CliError.d.ts +78 -0
- package/dist/cli/CliError.d.ts.map +1 -1
- package/dist/cli/CliError.js +65 -3
- package/dist/cli/CliError.js.map +1 -1
- package/dist/cli/CliOutput.d.ts +155 -6
- package/dist/cli/CliOutput.d.ts.map +1 -1
- package/dist/cli/CliOutput.js +62 -6
- package/dist/cli/CliOutput.js.map +1 -1
- package/dist/cli/Command.d.ts +24 -16
- package/dist/cli/Command.d.ts.map +1 -1
- package/dist/cli/Command.js +59 -29
- package/dist/cli/Command.js.map +1 -1
- package/dist/cli/Completions.d.ts +58 -0
- package/dist/cli/Completions.d.ts.map +1 -1
- package/dist/cli/Completions.js +49 -9
- package/dist/cli/Completions.js.map +1 -1
- package/dist/cli/Flag.d.ts +15 -0
- package/dist/cli/Flag.d.ts.map +1 -1
- package/dist/cli/Flag.js +5 -0
- package/dist/cli/Flag.js.map +1 -1
- package/dist/cli/GlobalFlag.d.ts.map +1 -1
- package/dist/cli/GlobalFlag.js +15 -7
- package/dist/cli/GlobalFlag.js.map +1 -1
- package/dist/cli/Param.d.ts +9 -0
- package/dist/cli/Param.d.ts.map +1 -1
- package/dist/cli/Param.js +21 -2
- package/dist/cli/Param.js.map +1 -1
- package/dist/cli/TerminalCapabilities.d.ts +3 -2
- package/dist/cli/TerminalCapabilities.d.ts.map +1 -1
- package/dist/cli/TerminalCapabilities.js +3 -1
- package/dist/cli/TerminalCapabilities.js.map +1 -1
- package/dist/cli/internal/completions/bash.js +73 -27
- package/dist/cli/internal/completions/bash.js.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +45 -10
- package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cluster/MessageStorage.d.ts +23 -45
- package/dist/cluster/MessageStorage.d.ts.map +1 -1
- package/dist/cluster/MessageStorage.js +6 -7
- package/dist/cluster/MessageStorage.js.map +1 -1
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +61 -21
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/ShardingConfig.d.ts +10 -0
- package/dist/cluster/ShardingConfig.d.ts.map +1 -1
- package/dist/cluster/ShardingConfig.js.map +1 -1
- package/dist/cluster/Snowflake.d.ts.map +1 -1
- package/dist/cluster/Snowflake.js +3 -7
- package/dist/cluster/Snowflake.js.map +1 -1
- package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
- package/dist/cluster/SqlRunnerStorage.js +87 -39
- package/dist/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +54 -20
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/devtools/DevToolsClient.d.ts.map +1 -1
- package/dist/devtools/DevToolsClient.js +2 -0
- package/dist/devtools/DevToolsClient.js.map +1 -1
- package/dist/encoding/Base64.js +36 -0
- package/dist/encoding/Base64.js.map +1 -1
- package/dist/encoding/Sse.d.ts.map +1 -1
- package/dist/encoding/Sse.js +3 -3
- package/dist/encoding/Sse.js.map +1 -1
- package/dist/encoding/Toml.d.ts.map +1 -1
- package/dist/encoding/Toml.js +21 -16
- package/dist/encoding/Toml.js.map +1 -1
- package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
- package/dist/eventlog/SqlEventJournal.js +47 -27
- package/dist/eventlog/SqlEventJournal.js.map +1 -1
- package/dist/eventlog/internal/conflicts.d.ts +0 -1
- package/dist/eventlog/internal/conflicts.d.ts.map +1 -1
- package/dist/eventlog/internal/conflicts.js +0 -3
- package/dist/eventlog/internal/conflicts.js.map +1 -1
- package/dist/http/Cookies.d.ts.map +1 -1
- package/dist/http/Cookies.js +10 -9
- package/dist/http/Cookies.js.map +1 -1
- package/dist/http/HttpClient.d.ts +423 -0
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +231 -7
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpClientError.d.ts +8 -1
- package/dist/http/HttpClientError.d.ts.map +1 -1
- package/dist/http/HttpClientError.js +37 -1
- package/dist/http/HttpClientError.js.map +1 -1
- package/dist/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/http/HttpClientRequest.js +1 -1
- package/dist/http/HttpClientRequest.js.map +1 -1
- package/dist/http/HttpMiddleware.d.ts +1 -1
- package/dist/http/HttpMiddleware.d.ts.map +1 -1
- package/dist/http/HttpMiddleware.js +14 -16
- package/dist/http/HttpMiddleware.js.map +1 -1
- package/dist/http/HttpRouter.d.ts.map +1 -1
- package/dist/http/HttpRouter.js +2 -1
- package/dist/http/HttpRouter.js.map +1 -1
- package/dist/http/HttpServerError.js +2 -2
- package/dist/http/HttpServerError.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts +6 -1
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +73 -10
- package/dist/http/HttpServerRequest.js.map +1 -1
- package/dist/http/HttpStaticServer.d.ts.map +1 -1
- package/dist/http/HttpStaticServer.js +48 -21
- package/dist/http/HttpStaticServer.js.map +1 -1
- package/dist/http/MultipartParser/internal/contentType.js +3 -3
- package/dist/http/UrlParams.d.ts +3 -1
- package/dist/http/UrlParams.d.ts.map +1 -1
- package/dist/http/UrlParams.js +4 -2
- package/dist/http/UrlParams.js.map +1 -1
- package/dist/http/internal/compression.js +4 -5
- package/dist/http/internal/compression.js.map +1 -1
- package/dist/http/internal/decompression.js +3 -0
- package/dist/http/internal/decompression.js.map +1 -1
- package/dist/http/internal/httpBody.js +8 -1
- package/dist/http/internal/httpBody.js.map +1 -1
- package/dist/http/internal/urlParams.js +25 -0
- package/dist/http/internal/urlParams.js.map +1 -1
- package/dist/http-api/HttpApi.d.ts +3 -6
- package/dist/http-api/HttpApi.d.ts.map +1 -1
- package/dist/http-api/HttpApi.js +3 -6
- package/dist/http-api/HttpApi.js.map +1 -1
- package/dist/http-api/HttpApiBuilder.d.ts.map +1 -1
- package/dist/http-api/HttpApiBuilder.js +27 -11
- package/dist/http-api/HttpApiBuilder.js.map +1 -1
- package/dist/http-api/HttpApiClient.d.ts +77 -7
- package/dist/http-api/HttpApiClient.d.ts.map +1 -1
- package/dist/http-api/HttpApiClient.js +142 -44
- package/dist/http-api/HttpApiClient.js.map +1 -1
- package/dist/http-api/HttpApiEndpoint.d.ts +24 -7
- package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
- package/dist/http-api/HttpApiEndpoint.js +109 -27
- package/dist/http-api/HttpApiEndpoint.js.map +1 -1
- package/dist/http-api/HttpApiSchema.d.ts +76 -29
- package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
- package/dist/http-api/HttpApiSchema.js +70 -59
- package/dist/http-api/HttpApiSchema.js.map +1 -1
- package/dist/http-api/HttpApiTest.d.ts.map +1 -1
- package/dist/http-api/HttpApiTest.js +3 -2
- package/dist/http-api/HttpApiTest.js.map +1 -1
- package/dist/http-api/OpenApi.d.ts.map +1 -1
- package/dist/http-api/OpenApi.js +25 -16
- package/dist/http-api/OpenApi.js.map +1 -1
- package/dist/http-api/internal/toCodecHttpProperties.d.ts +2 -0
- package/dist/http-api/internal/toCodecHttpProperties.d.ts.map +1 -0
- package/dist/http-api/internal/toCodecHttpProperties.js +38 -0
- package/dist/http-api/internal/toCodecHttpProperties.js.map +1 -0
- package/dist/internal/arbitrary/runner.d.ts.map +1 -1
- package/dist/internal/arbitrary/runner.js +120 -44
- package/dist/internal/arbitrary/runner.js.map +1 -1
- package/dist/internal/core.js +2 -0
- package/dist/internal/core.js.map +1 -1
- package/dist/internal/effect.js +21 -13
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/equal.js +14 -0
- package/dist/internal/equal.js.map +1 -1
- package/dist/internal/jsonSchema.d.ts +2 -0
- package/dist/internal/jsonSchema.d.ts.map +1 -0
- package/dist/internal/jsonSchema.js +28 -0
- package/dist/internal/jsonSchema.js.map +1 -0
- package/dist/internal/matcher.js +1 -1
- package/dist/internal/matcher.js.map +1 -1
- package/dist/internal/schema/compilerRegistry.js +4 -1
- package/dist/internal/schema/compilerRegistry.js.map +1 -1
- package/dist/internal/schema/content.d.ts +2 -0
- package/dist/internal/schema/content.d.ts.map +1 -0
- package/dist/internal/schema/content.js +13 -0
- package/dist/internal/schema/content.js.map +1 -0
- package/dist/internal/schema/fromJsonSchemaDocument.js +173 -185
- package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/fromRepresentation.js +2 -1
- package/dist/internal/schema/fromRepresentation.js.map +1 -1
- package/dist/internal/schema/standardSchema.js +8 -2
- package/dist/internal/schema/standardSchema.js.map +1 -1
- package/dist/internal/schema/toCodeDocument.js +3 -3
- package/dist/internal/schema/toCodeDocument.js.map +1 -1
- package/dist/internal/schema/toCodec.js +21 -24
- package/dist/internal/schema/toCodec.js.map +1 -1
- package/dist/internal/schema/toJsonSchemaDocument.js +205 -140
- package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
- package/dist/internal/schema/toRepresentation.js +107 -129
- package/dist/internal/schema/toRepresentation.js.map +1 -1
- package/dist/internal/sql.d.ts +2 -0
- package/dist/internal/sql.d.ts.map +1 -0
- package/dist/internal/sql.js +13 -0
- package/dist/internal/sql.js.map +1 -0
- package/dist/internal/version.js +1 -1
- package/dist/observability/OtlpProxy.d.ts +154 -0
- package/dist/observability/OtlpProxy.d.ts.map +1 -0
- package/dist/observability/OtlpProxy.js +235 -0
- package/dist/observability/OtlpProxy.js.map +1 -0
- package/dist/observability/OtlpTracer.d.ts.map +1 -1
- package/dist/observability/OtlpTracer.js +4 -0
- package/dist/observability/OtlpTracer.js.map +1 -1
- package/dist/observability/index.d.ts +5 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -1
- package/dist/persistence/CircuitBreaker.d.ts +897 -0
- package/dist/persistence/CircuitBreaker.d.ts.map +1 -0
- package/dist/persistence/CircuitBreaker.js +1165 -0
- package/dist/persistence/CircuitBreaker.js.map +1 -0
- package/dist/persistence/Redis.d.ts +78 -2
- package/dist/persistence/Redis.d.ts.map +1 -1
- package/dist/persistence/Redis.js +62 -7
- package/dist/persistence/Redis.js.map +1 -1
- package/dist/persistence/index.d.ts +5 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +5 -0
- package/dist/persistence/index.js.map +1 -1
- package/dist/process/ChildProcess.d.ts +30 -4
- package/dist/process/ChildProcess.d.ts.map +1 -1
- package/dist/process/ChildProcess.js.map +1 -1
- package/dist/process/ChildProcessSpawner.d.ts +30 -0
- package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
- package/dist/process/ChildProcessSpawner.js +5 -2
- package/dist/process/ChildProcessSpawner.js.map +1 -1
- package/dist/reactivity/AsyncResult.d.ts +1 -1
- package/dist/reactivity/AsyncResult.d.ts.map +1 -1
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +9 -8
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcSerialization.d.ts +14 -0
- package/dist/rpc/RpcSerialization.d.ts.map +1 -1
- package/dist/rpc/RpcSerialization.js +20 -8
- package/dist/rpc/RpcSerialization.js.map +1 -1
- package/dist/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +11 -1
- package/dist/rpc/RpcServer.js.map +1 -1
- package/dist/rpc/RpcTest.d.ts +1 -0
- package/dist/rpc/RpcTest.d.ts.map +1 -1
- package/dist/rpc/RpcTest.js +1 -0
- package/dist/rpc/RpcTest.js.map +1 -1
- package/dist/sql/Migrator.d.ts +2 -1
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +11 -8
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/SqlClient.d.ts +9 -4
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +8 -1
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/SqlResolver.d.ts +4 -0
- package/dist/sql/SqlResolver.d.ts.map +1 -1
- package/dist/sql/SqlResolver.js +18 -4
- package/dist/sql/SqlResolver.js.map +1 -1
- package/dist/sql/Statement.d.ts +7 -0
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +21 -2
- package/dist/sql/Statement.js.map +1 -1
- package/dist/workflow/DurableDeferred.d.ts.map +1 -1
- package/dist/workflow/DurableDeferred.js +21 -2
- package/dist/workflow/DurableDeferred.js.map +1 -1
- package/package.json +1 -1
- package/src/Arbitrary.ts +10 -2
- package/src/Channel.ts +47 -18
- package/src/Data.ts +60 -265
- package/src/Effect.ts +1 -1
- package/src/Equal.ts +8 -1
- package/src/Exit.ts +3 -3
- package/src/Formatter.ts +28 -13
- package/src/Hash.ts +4 -1
- package/src/JsonPatch.ts +4 -0
- package/src/JsonSchema.ts +12 -40
- package/src/Metric.ts +3 -3
- package/src/MutableList.ts +7 -5
- package/src/MutableRef.ts +8 -1
- package/src/PartitionedSemaphore.ts +24 -13
- package/src/Pool.ts +109 -37
- package/src/PubSub.ts +5 -6
- package/src/Ref.ts +8 -0
- package/src/Schedule.ts +1 -1
- package/src/Schema.ts +48 -25
- package/src/SchemaAST.ts +20 -20
- package/src/SchemaParser.ts +51 -18
- package/src/SchemaRepresentation.ts +31 -34
- package/src/SchemaTransformation.ts +9 -2
- package/src/Semaphore.ts +67 -40
- package/src/Sink.ts +15 -2
- package/src/Stream.ts +33 -16
- package/src/String.ts +3 -0
- package/src/Tracer.ts +15 -1
- package/src/ai/LanguageModel.ts +9 -0
- package/src/ai/McpServer.ts +14 -13
- package/src/ai/Prompt.ts +65 -0
- package/src/ai/Response.ts +34 -9
- package/src/ai/Tool.ts +38 -2
- package/src/ai/Toolkit.ts +4 -1
- package/src/cli/Argument.ts +15 -0
- package/src/cli/CliError.ts +90 -3
- package/src/cli/CliOutput.ts +183 -6
- package/src/cli/Command.ts +53 -41
- package/src/cli/Completions.ts +51 -0
- package/src/cli/Flag.ts +15 -0
- package/src/cli/GlobalFlag.ts +6 -7
- package/src/cli/Param.ts +29 -6
- package/src/cli/TerminalCapabilities.ts +6 -3
- package/src/cli/internal/completions/bash.ts +79 -29
- package/src/cluster/ClusterWorkflowEngine.ts +46 -16
- package/src/cluster/MessageStorage.ts +19 -14
- package/src/cluster/Sharding.ts +83 -21
- package/src/cluster/ShardingConfig.ts +5 -0
- package/src/cluster/Snowflake.ts +3 -7
- package/src/cluster/SqlRunnerStorage.ts +110 -47
- package/src/cluster/internal/entityManager.ts +75 -22
- package/src/devtools/DevToolsClient.ts +2 -0
- package/src/encoding/Base64.ts +38 -0
- package/src/encoding/Sse.ts +4 -3
- package/src/encoding/Toml.ts +33 -16
- package/src/eventlog/SqlEventJournal.ts +68 -45
- package/src/eventlog/internal/conflicts.ts +0 -4
- package/src/http/Cookies.ts +10 -11
- package/src/http/HttpClient.ts +547 -7
- package/src/http/HttpClientError.ts +35 -1
- package/src/http/HttpClientRequest.ts +9 -1
- package/src/http/HttpMiddleware.ts +15 -18
- package/src/http/HttpRouter.ts +2 -1
- package/src/http/HttpServerError.ts +2 -2
- package/src/http/HttpServerRequest.ts +102 -16
- package/src/http/HttpStaticServer.ts +51 -22
- package/src/http/MultipartParser/internal/contentType.ts +3 -3
- package/src/http/UrlParams.ts +6 -1
- package/src/http/internal/compression.ts +4 -5
- package/src/http/internal/decompression.ts +6 -0
- package/src/http/internal/httpBody.ts +10 -2
- package/src/http/internal/urlParams.ts +29 -0
- package/src/http-api/HttpApi.ts +3 -6
- package/src/http-api/HttpApiBuilder.ts +45 -15
- package/src/http-api/HttpApiClient.ts +218 -72
- package/src/http-api/HttpApiEndpoint.ts +121 -30
- package/src/http-api/HttpApiSchema.ts +141 -48
- package/src/http-api/HttpApiTest.ts +3 -2
- package/src/http-api/OpenApi.ts +20 -17
- package/src/http-api/internal/toCodecHttpProperties.ts +56 -0
- package/src/internal/arbitrary/runner.ts +133 -36
- package/src/internal/core.ts +2 -0
- package/src/internal/effect.ts +24 -16
- package/src/internal/equal.ts +17 -0
- package/src/internal/jsonSchema.ts +27 -0
- package/src/internal/matcher.ts +1 -1
- package/src/internal/schema/compilerRegistry.ts +6 -1
- package/src/internal/schema/content.ts +18 -0
- package/src/internal/schema/fromJsonSchemaDocument.ts +228 -190
- package/src/internal/schema/fromRepresentation.ts +2 -1
- package/src/internal/schema/standardSchema.ts +2 -2
- package/src/internal/schema/toCodeDocument.ts +4 -4
- package/src/internal/schema/toCodec.ts +26 -22
- package/src/internal/schema/toJsonSchemaDocument.ts +189 -167
- package/src/internal/schema/toRepresentation.ts +122 -140
- package/src/internal/sql.ts +14 -0
- package/src/internal/version.ts +1 -1
- package/src/observability/OtlpProxy.ts +314 -0
- package/src/observability/OtlpTracer.ts +4 -0
- package/src/observability/index.ts +6 -0
- package/src/persistence/CircuitBreaker.ts +1678 -0
- package/src/persistence/Redis.ts +129 -8
- package/src/persistence/index.ts +6 -0
- package/src/process/ChildProcess.ts +30 -4
- package/src/process/ChildProcessSpawner.ts +41 -2
- package/src/reactivity/AsyncResult.ts +1 -1
- package/src/rpc/RpcClient.ts +13 -10
- package/src/rpc/RpcSerialization.ts +32 -9
- package/src/rpc/RpcServer.ts +16 -1
- package/src/rpc/RpcTest.ts +3 -0
- package/src/sql/Migrator.ts +12 -7
- package/src/sql/SqlClient.ts +11 -4
- package/src/sql/SqlResolver.ts +23 -9
- package/src/sql/Statement.ts +30 -2
- package/src/workflow/DurableDeferred.ts +23 -6
|
@@ -26,7 +26,7 @@ function renderEmittableAnnotation(input: unknown): string | undefined {
|
|
|
26
26
|
) return format(input)
|
|
27
27
|
if (typeof input === "symbol") {
|
|
28
28
|
const key = globalThis.Symbol.keyFor(input)
|
|
29
|
-
return key === undefined ? undefined : `Symbol.for(${format(key)})`
|
|
29
|
+
return key === undefined ? undefined : `globalThis.Symbol.for(${format(key)})`
|
|
30
30
|
}
|
|
31
31
|
if (typeof input !== "object") return undefined
|
|
32
32
|
if (Array.isArray(input)) {
|
|
@@ -230,7 +230,7 @@ export function toCodeDocument(
|
|
|
230
230
|
const artifacts: Array<SchemaRepresentation.Artifact> = []
|
|
231
231
|
const sorted = topologicalSort(document.references)
|
|
232
232
|
const sanitizedReferences = new Map<string, string>()
|
|
233
|
-
const uniqueIdentifiers = new Set<string>()
|
|
233
|
+
const uniqueIdentifiers = new Set<string>(["Schema"])
|
|
234
234
|
let compilingRecursiveDefinition = false
|
|
235
235
|
let explicitSuspendDepth = 0
|
|
236
236
|
|
|
@@ -289,8 +289,8 @@ export function toCodeDocument(
|
|
|
289
289
|
identifier,
|
|
290
290
|
code: makeCode(
|
|
291
291
|
key === undefined
|
|
292
|
-
? `Symbol(${description === undefined ? "" : format(description)})`
|
|
293
|
-
: `Symbol.for(${format(key)})`,
|
|
292
|
+
? `globalThis.Symbol(${description === undefined ? "" : format(description)})`
|
|
293
|
+
: `globalThis.Symbol.for(${format(key)})`,
|
|
294
294
|
`typeof ${identifier}`
|
|
295
295
|
)
|
|
296
296
|
})
|
|
@@ -14,20 +14,29 @@ export function toCodecJson<S extends PublicSchema.Constraint>(schema: S): Publi
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
/** @internal */
|
|
17
|
-
export const toCodecJsonAST =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
17
|
+
export const toCodecJsonAST = makeCodecDerivation(toCodecJsonASTStep)
|
|
18
|
+
|
|
19
|
+
function makeCodecDerivation(
|
|
20
|
+
step: (ast: SchemaAST.AST, recur: (ast: SchemaAST.AST) => SchemaAST.AST) => SchemaAST.AST,
|
|
21
|
+
options?: { readonly stopAt?: (link: SchemaAST.Link) => boolean }
|
|
22
|
+
): (ast: SchemaAST.AST) => SchemaAST.AST {
|
|
23
|
+
// Derive each body once, independently of its own context. Child contexts remain part of the body.
|
|
24
|
+
const deriveBody = memoize((owner: SchemaAST.AST) => {
|
|
25
|
+
const body = SchemaAST.replaceContext(owner, undefined)
|
|
26
|
+
const out = step(body, recur)
|
|
27
|
+
return out === body ? null : out
|
|
28
|
+
})
|
|
29
|
+
// Follow existing encodings before sharing bodies: their encoded forms may differ.
|
|
30
|
+
const recur = SchemaAST.applyToSelfOrLastLinkEncodingIdempotent((ast) => {
|
|
31
|
+
const derived = deriveBody(SchemaAST.getContextOwner(ast))
|
|
32
|
+
if (derived === null) return ast
|
|
33
|
+
const out = SchemaAST.replaceContext(derived, ast.context)
|
|
34
|
+
return ast.context === undefined ?
|
|
35
|
+
out :
|
|
36
|
+
SchemaAST.replaceContextLastLink(out, withoutConstructorDefault(ast.context))
|
|
37
|
+
}, options)
|
|
38
|
+
return recur
|
|
39
|
+
}
|
|
31
40
|
|
|
32
41
|
function withoutConstructorDefault(context: SchemaAST.Context): SchemaAST.Context {
|
|
33
42
|
return context.constructorDefault === undefined ?
|
|
@@ -265,15 +274,10 @@ const arrayFromSingleTransformation = new InternalTransformation.Transformation(
|
|
|
265
274
|
const isCodecArrayFromSingleLink = (link: SchemaAST.Link): boolean =>
|
|
266
275
|
link.transformation === arrayFromSingleTransformation
|
|
267
276
|
|
|
268
|
-
const toCodecStringTreeAST =
|
|
269
|
-
|
|
277
|
+
const toCodecStringTreeAST = makeCodecDerivation((ast, recur) =>
|
|
278
|
+
toCodecStringTreeASTStep(ast, recur, (ast) => {
|
|
270
279
|
throw new globalThis.Error("Missing structural codec for StringTree", { cause: ast })
|
|
271
|
-
})
|
|
272
|
-
if (out !== ast && ast.context !== undefined) {
|
|
273
|
-
return SchemaAST.replaceContextLastLink(out, withoutConstructorDefault(ast.context))
|
|
274
|
-
}
|
|
275
|
-
return out
|
|
276
|
-
}, { stopAt: isCodecArrayFromSingleLink })
|
|
280
|
+
}), { stopAt: isCodecArrayFromSingleLink })
|
|
277
281
|
|
|
278
282
|
const toArrayFromSingleInputElement = (ast: SchemaAST.AST): SchemaAST.AST =>
|
|
279
283
|
SchemaAST.isOptional(ast) ? SchemaAST.optionalKey(SchemaAST.unknown) : SchemaAST.unknown
|
|
@@ -194,7 +194,10 @@ function appendJsonSchema(
|
|
|
194
194
|
// cycle is exact unless it can reach `false`.
|
|
195
195
|
type Exactness = boolean | ReadonlyArray<Exactness>
|
|
196
196
|
|
|
197
|
-
type CompiledJsonSchema =
|
|
197
|
+
type CompiledJsonSchema = {
|
|
198
|
+
schema: JsonSchema.JsonSchema
|
|
199
|
+
dependencies: Array<Exactness>
|
|
200
|
+
}
|
|
198
201
|
|
|
199
202
|
function isExact(exactness: Exactness, seen = new Set<ReadonlyArray<Exactness>>()): boolean {
|
|
200
203
|
if (typeof exactness === "boolean") return exactness
|
|
@@ -218,12 +221,13 @@ function compileJsonSchema(
|
|
|
218
221
|
references: SchemaRepresentation.References,
|
|
219
222
|
options: Schema.ToJsonSchemaOptions | undefined
|
|
220
223
|
): JsonSchema.MultiDocument<"draft-2020-12"> {
|
|
224
|
+
const numberKeyPattern = `^(?:${InternalAST.FINITE_PATTERN}|Infinity|-Infinity|NaN)$`
|
|
221
225
|
const compiledDefinitions = new Map<string, CompiledJsonSchema>()
|
|
222
226
|
const definitionAliases = new Map<string, string>()
|
|
223
227
|
const compiledRepresentations = new WeakMap<SchemaRepresentation.Representation, CompiledJsonSchema>()
|
|
224
228
|
const pendingOneOf = new Map<
|
|
225
229
|
ReadonlyArray<JsonSchema.JsonSchema>,
|
|
226
|
-
|
|
230
|
+
{ branches: ReadonlyArray<Exactness>; schemas: Array<JsonSchema.JsonSchema> }
|
|
227
231
|
>()
|
|
228
232
|
const fallbackDefinitions = new Map<string, Array<string>>()
|
|
229
233
|
const referenceKeys = Object.keys(references)
|
|
@@ -234,7 +238,7 @@ function compileJsonSchema(
|
|
|
234
238
|
representations,
|
|
235
239
|
(representation, index) => recur(representation, rootPaths[index], [])
|
|
236
240
|
)
|
|
237
|
-
for (const
|
|
241
|
+
for (const { branches, schemas } of pendingOneOf.values()) {
|
|
238
242
|
if (!isExact(branches)) {
|
|
239
243
|
for (const schema of schemas) {
|
|
240
244
|
if (Array.isArray(schema.oneOf)) {
|
|
@@ -248,9 +252,9 @@ function compileJsonSchema(
|
|
|
248
252
|
const representation = references[key]
|
|
249
253
|
const fallback = getIdentifierFallback(representation)
|
|
250
254
|
if (fallback === undefined) continue
|
|
251
|
-
const schema = compiledDefinitions.get(key)
|
|
255
|
+
const schema = compiledDefinitions.get(key)!.schema
|
|
252
256
|
const candidates = fallbackDefinitions.get(fallback)
|
|
253
|
-
const match = candidates?.find((candidate) => Equal.equals(compiledDefinitions.get(candidate)
|
|
257
|
+
const match = candidates?.find((candidate) => Equal.equals(compiledDefinitions.get(candidate)!.schema, schema))
|
|
254
258
|
if (match === undefined) {
|
|
255
259
|
if (candidates === undefined) fallbackDefinitions.set(fallback, [key])
|
|
256
260
|
else candidates.push(key)
|
|
@@ -262,16 +266,26 @@ function compileJsonSchema(
|
|
|
262
266
|
const definitions: Record<string, JsonSchema.JsonSchema> = {}
|
|
263
267
|
for (const key of referenceKeys) {
|
|
264
268
|
if (!definitionAliases.has(key)) {
|
|
265
|
-
InternalRecord.assignProperty(definitions, key, finalizeJsonSchema(compiledDefinitions.get(key)
|
|
269
|
+
InternalRecord.assignProperty(definitions, key, finalizeJsonSchema(compiledDefinitions.get(key)!.schema))
|
|
266
270
|
}
|
|
267
271
|
}
|
|
268
272
|
return { dialect: "draft-2020-12", schemas, definitions }
|
|
269
273
|
|
|
270
274
|
function registerPendingOneOf(schema: JsonSchema.JsonSchema): JsonSchema.JsonSchema {
|
|
271
|
-
if (Array.isArray(schema.oneOf)) pendingOneOf.get(schema.oneOf)?.
|
|
275
|
+
if (Array.isArray(schema.oneOf)) pendingOneOf.get(schema.oneOf)?.schemas.push(schema)
|
|
272
276
|
return schema
|
|
273
277
|
}
|
|
274
278
|
|
|
279
|
+
function compileAnnotatedMember(
|
|
280
|
+
member: SchemaRepresentation.Element | SchemaRepresentation.PropertySignature,
|
|
281
|
+
path: Path,
|
|
282
|
+
dependencies: Array<Exactness>
|
|
283
|
+
): JsonSchema.JsonSchema {
|
|
284
|
+
const schema = recur(member.type, [...path, "type"], dependencies)
|
|
285
|
+
const annotations = collectJsonSchemaAnnotations(member.annotations, options)
|
|
286
|
+
return annotations === undefined ? schema : registerPendingOneOf(appendJsonSchema(schema, annotations))
|
|
287
|
+
}
|
|
288
|
+
|
|
275
289
|
function compileDefinition(key: string, path: Path): CompiledJsonSchema {
|
|
276
290
|
if (!Object.hasOwn(references, key)) {
|
|
277
291
|
throw errorWithPath(`Invalid reference ${key}`, [...path, "$ref"])
|
|
@@ -280,9 +294,9 @@ function compileJsonSchema(
|
|
|
280
294
|
if (cached !== undefined) return cached
|
|
281
295
|
|
|
282
296
|
// Register the dependency cell before compiling so recursive references share it.
|
|
283
|
-
const result: CompiledJsonSchema =
|
|
297
|
+
const result: CompiledJsonSchema = { schema: {}, dependencies: [] }
|
|
284
298
|
compiledDefinitions.set(key, result)
|
|
285
|
-
result
|
|
299
|
+
result.schema = recur(references[key], ["references", key], result.dependencies)
|
|
286
300
|
return result
|
|
287
301
|
}
|
|
288
302
|
|
|
@@ -373,28 +387,35 @@ function compileJsonSchema(
|
|
|
373
387
|
dependencies: Array<Exactness>
|
|
374
388
|
): JsonSchema.JsonSchema {
|
|
375
389
|
if (representation._tag === "Reference") {
|
|
376
|
-
dependencies.push(compileDefinition(representation.$ref, path)
|
|
390
|
+
dependencies.push(compileDefinition(representation.$ref, path).dependencies)
|
|
377
391
|
return { $ref: formatDefinitionReference(representation.$ref) }
|
|
378
392
|
}
|
|
379
393
|
const cached = compiledRepresentations.get(representation)
|
|
380
394
|
if (cached !== undefined) {
|
|
381
|
-
dependencies.push(cached
|
|
382
|
-
return cached
|
|
395
|
+
dependencies.push(cached.dependencies)
|
|
396
|
+
return cached.schema
|
|
383
397
|
}
|
|
384
398
|
|
|
385
399
|
const local: Array<Exactness> = []
|
|
386
400
|
dependencies.push(local)
|
|
387
|
-
let output =
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
401
|
+
let output = {
|
|
402
|
+
...on(representation, path, local),
|
|
403
|
+
...collectJsonSchemaAnnotations(representation.annotations, options)
|
|
404
|
+
}
|
|
405
|
+
if (representation._tag === "String" && representation.content !== undefined) {
|
|
406
|
+
const content = representation.content
|
|
407
|
+
output.contentMediaType = content.mediaType
|
|
408
|
+
delete output.contentSchema
|
|
409
|
+
if (content.schema !== undefined) {
|
|
410
|
+
output.contentSchema = recur(content.schema, [...path, "content", "schema"], [])
|
|
411
|
+
}
|
|
391
412
|
}
|
|
392
413
|
for (let index = 0; index < representation.checks.length; index++) {
|
|
393
414
|
const type = typeof output.type === "string" && isJsonSchemaType(output.type) ? output.type : undefined
|
|
394
415
|
const check = compileCheck(representation.checks[index], type, [...path, "checks", index], local)
|
|
395
416
|
if (check !== undefined) output = appendJsonSchema(output, ...check)
|
|
396
417
|
}
|
|
397
|
-
compiledRepresentations.set(representation,
|
|
418
|
+
compiledRepresentations.set(representation, { schema: output, dependencies: local })
|
|
398
419
|
return registerPendingOneOf(output)
|
|
399
420
|
}
|
|
400
421
|
|
|
@@ -453,18 +474,17 @@ function compileJsonSchema(
|
|
|
453
474
|
}))
|
|
454
475
|
return types.length === 0 ? { not: {} } : { anyOf: types }
|
|
455
476
|
}
|
|
456
|
-
case "TemplateLiteral":
|
|
457
|
-
|
|
477
|
+
case "TemplateLiteral": {
|
|
478
|
+
const { exact, pattern } = getTemplateLiteralPattern(representation.parts)
|
|
479
|
+
if (!exact) dependencies.push(false)
|
|
480
|
+
return { type: "string", pattern }
|
|
481
|
+
}
|
|
458
482
|
case "Arrays": {
|
|
459
483
|
const out: JsonSchema.JsonSchema = { type: "array" }
|
|
460
484
|
let minItems = representation.elements.length
|
|
461
485
|
const prefixItems = representation.elements.map((element, index) => {
|
|
462
486
|
if (element.isOptional) minItems--
|
|
463
|
-
|
|
464
|
-
const annotations = collectJsonSchemaAnnotations(element.annotations, options)
|
|
465
|
-
return annotations === undefined
|
|
466
|
-
? schema
|
|
467
|
-
: registerPendingOneOf(appendJsonSchema(schema, annotations))
|
|
487
|
+
return compileAnnotatedMember(element, [...path, "elements", index], dependencies)
|
|
468
488
|
})
|
|
469
489
|
if (prefixItems.length > 0) {
|
|
470
490
|
out.prefixItems = prefixItems
|
|
@@ -486,130 +506,15 @@ function compileJsonSchema(
|
|
|
486
506
|
}
|
|
487
507
|
return out
|
|
488
508
|
}
|
|
489
|
-
case "Objects":
|
|
490
|
-
|
|
491
|
-
return { not: { type: "null" } }
|
|
492
|
-
}
|
|
493
|
-
const out: JsonSchema.JsonSchema = { type: "object" }
|
|
494
|
-
const properties: Record<string, JsonSchema.JsonSchema> = {}
|
|
495
|
-
const required: Array<string> = []
|
|
496
|
-
for (let index = 0; index < representation.propertySignatures.length; index++) {
|
|
497
|
-
const property = representation.propertySignatures[index]
|
|
498
|
-
if (typeof property.name !== "string") {
|
|
499
|
-
throw errorWithPath("Objects property names must be strings", [
|
|
500
|
-
...path,
|
|
501
|
-
"propertySignatures",
|
|
502
|
-
index,
|
|
503
|
-
"name"
|
|
504
|
-
])
|
|
505
|
-
}
|
|
506
|
-
const name = property.name
|
|
507
|
-
const schema = recur(property.type, [...path, "propertySignatures", index, "type"], dependencies)
|
|
508
|
-
const annotations = collectJsonSchemaAnnotations(property.annotations, options)
|
|
509
|
-
InternalRecord.assignProperty(
|
|
510
|
-
properties,
|
|
511
|
-
name,
|
|
512
|
-
annotations === undefined
|
|
513
|
-
? schema
|
|
514
|
-
: registerPendingOneOf(appendJsonSchema(schema, annotations))
|
|
515
|
-
)
|
|
516
|
-
if (!property.isOptional) required.push(name)
|
|
517
|
-
}
|
|
518
|
-
if (representation.propertySignatures.length > 0) out.properties = properties
|
|
519
|
-
if (required.length > 0) out.required = required
|
|
520
|
-
const patternProperties: Record<string, JsonSchema.JsonSchema | false> = {}
|
|
521
|
-
const additionalPropertySchemas: Array<JsonSchema.JsonSchema | false> = []
|
|
522
|
-
const indexValueSchemas: Array<JsonSchema.JsonSchema | false> = []
|
|
523
|
-
let hasUnrepresentableIndexPattern = false
|
|
524
|
-
for (let index = 0; index < representation.indexSignatures.length; index++) {
|
|
525
|
-
const signature = representation.indexSignatures[index]
|
|
526
|
-
let type: JsonSchema.JsonSchema | false = recur(
|
|
527
|
-
signature.type,
|
|
528
|
-
[...path, "indexSignatures", index, "type"],
|
|
529
|
-
dependencies
|
|
530
|
-
)
|
|
531
|
-
if (Equal.equals(type, { not: {} })) type = false
|
|
532
|
-
indexValueSchemas.push(type)
|
|
533
|
-
const patterns = getParameterPatterns(
|
|
534
|
-
signature.parameter,
|
|
535
|
-
[...path, "indexSignatures", index, "parameter"],
|
|
536
|
-
new Set()
|
|
537
|
-
)
|
|
538
|
-
if (patterns === undefined) {
|
|
539
|
-
hasUnrepresentableIndexPattern = true
|
|
540
|
-
dependencies.push(false)
|
|
541
|
-
continue
|
|
542
|
-
}
|
|
543
|
-
if (patterns.length === 0) {
|
|
544
|
-
additionalPropertySchemas.push(type)
|
|
545
|
-
} else {
|
|
546
|
-
for (const pattern of patterns) {
|
|
547
|
-
const previous = patternProperties[pattern]
|
|
548
|
-
InternalRecord.assignProperty(
|
|
549
|
-
patternProperties,
|
|
550
|
-
pattern,
|
|
551
|
-
previous === undefined
|
|
552
|
-
? type
|
|
553
|
-
: previous === false || type === false
|
|
554
|
-
? false
|
|
555
|
-
: registerPendingOneOf(appendJsonSchema(previous, type))
|
|
556
|
-
)
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
const hasPatternProperties = Object.keys(patternProperties).length > 0
|
|
561
|
-
if (hasPatternProperties) {
|
|
562
|
-
out.patternProperties = patternProperties
|
|
563
|
-
}
|
|
564
|
-
if (hasUnrepresentableIndexPattern && options?.onExcessProperty === "error") {
|
|
565
|
-
const propertyNames: Array<JsonSchema.JsonSchema> = []
|
|
566
|
-
if (representation.propertySignatures.length > 0) {
|
|
567
|
-
propertyNames.push({ enum: Object.keys(properties) })
|
|
568
|
-
}
|
|
569
|
-
for (let index = 0; index < representation.indexSignatures.length; index++) {
|
|
570
|
-
propertyNames.push(
|
|
571
|
-
getPropertyNameSchema(
|
|
572
|
-
representation.indexSignatures[index].parameter,
|
|
573
|
-
[...path, "indexSignatures", index, "parameter"],
|
|
574
|
-
dependencies,
|
|
575
|
-
new Set()
|
|
576
|
-
)
|
|
577
|
-
)
|
|
578
|
-
}
|
|
579
|
-
out.propertyNames = propertyNames.length === 1 ? propertyNames[0] : { anyOf: propertyNames }
|
|
580
|
-
out.additionalProperties = indexValueSchemas.length === 1
|
|
581
|
-
? indexValueSchemas[0]
|
|
582
|
-
: { anyOf: indexValueSchemas }
|
|
583
|
-
if (additionalPropertySchemas.length > 0) {
|
|
584
|
-
out.allOf = additionalPropertySchemas.map((type) => ({ type: "object", additionalProperties: type }))
|
|
585
|
-
}
|
|
586
|
-
} else if (additionalPropertySchemas.length === 0) {
|
|
587
|
-
out.additionalProperties = hasUnrepresentableIndexPattern || options?.onExcessProperty !== "error"
|
|
588
|
-
} else if (
|
|
589
|
-
additionalPropertySchemas.length === 1 &&
|
|
590
|
-
representation.propertySignatures.length === 0 &&
|
|
591
|
-
!hasPatternProperties
|
|
592
|
-
) {
|
|
593
|
-
out.additionalProperties = additionalPropertySchemas[0]
|
|
594
|
-
} else if (additionalPropertySchemas.length > 0) {
|
|
595
|
-
out.allOf = additionalPropertySchemas.map((type) => ({ type: "object", additionalProperties: type }))
|
|
596
|
-
}
|
|
597
|
-
if (
|
|
598
|
-
typeof out.additionalProperties === "object" &&
|
|
599
|
-
out.additionalProperties !== null &&
|
|
600
|
-
Object.keys(out.additionalProperties).length === 0
|
|
601
|
-
) {
|
|
602
|
-
delete out.additionalProperties
|
|
603
|
-
}
|
|
604
|
-
return out
|
|
605
|
-
}
|
|
509
|
+
case "Objects":
|
|
510
|
+
return compileObjects(representation, path, dependencies)
|
|
606
511
|
case "Union": {
|
|
607
512
|
const branches: Array<Exactness> = []
|
|
608
513
|
const types = representation.types.map((type, index) => recur(type, [...path, "types", index], branches))
|
|
609
514
|
dependencies.push(branches)
|
|
610
515
|
if (types.length === 0) return { not: {} }
|
|
611
516
|
if (representation.options?.mode === "oneOf") {
|
|
612
|
-
pendingOneOf.set(types,
|
|
517
|
+
pendingOneOf.set(types, { branches, schemas: [] })
|
|
613
518
|
return { oneOf: types }
|
|
614
519
|
}
|
|
615
520
|
if (types.length > 1) {
|
|
@@ -626,6 +531,96 @@ function compileJsonSchema(
|
|
|
626
531
|
}
|
|
627
532
|
}
|
|
628
533
|
|
|
534
|
+
function compileObjects(
|
|
535
|
+
representation: SchemaRepresentation.Objects,
|
|
536
|
+
path: Path,
|
|
537
|
+
dependencies: Array<Exactness>
|
|
538
|
+
): JsonSchema.JsonSchema {
|
|
539
|
+
const { indexSignatures, propertySignatures } = representation
|
|
540
|
+
if (propertySignatures.length === 0 && indexSignatures.length === 0) return { not: { type: "null" } }
|
|
541
|
+
|
|
542
|
+
const out: JsonSchema.JsonSchema = { type: "object" }
|
|
543
|
+
const properties: Record<string, JsonSchema.JsonSchema> = {}
|
|
544
|
+
const required: Array<string> = []
|
|
545
|
+
for (const [index, property] of propertySignatures.entries()) {
|
|
546
|
+
const propertyPath = [...path, "propertySignatures", index]
|
|
547
|
+
if (typeof property.name !== "string") {
|
|
548
|
+
throw errorWithPath("Objects property names must be strings", [...propertyPath, "name"])
|
|
549
|
+
}
|
|
550
|
+
InternalRecord.assignProperty(
|
|
551
|
+
properties,
|
|
552
|
+
property.name,
|
|
553
|
+
compileAnnotatedMember(property, propertyPath, dependencies)
|
|
554
|
+
)
|
|
555
|
+
if (!property.isOptional) required.push(property.name)
|
|
556
|
+
}
|
|
557
|
+
if (propertySignatures.length > 0) out.properties = properties
|
|
558
|
+
if (required.length > 0) out.required = required
|
|
559
|
+
|
|
560
|
+
const indexes = indexSignatures.map((signature, index) => {
|
|
561
|
+
const indexPath = [...path, "indexSignatures", index]
|
|
562
|
+
const schema = recur(signature.type, [...indexPath, "type"], dependencies)
|
|
563
|
+
const type: JsonSchema.JsonSchema | false = Equal.equals(schema, { not: {} }) ? false : schema
|
|
564
|
+
const patterns = getParameterPatterns(signature.parameter, [...indexPath, "parameter"], new Set())
|
|
565
|
+
if (patterns === undefined) dependencies.push(false)
|
|
566
|
+
return { type, patterns }
|
|
567
|
+
})
|
|
568
|
+
const patternProperties: Record<string, JsonSchema.JsonSchema | false> = {}
|
|
569
|
+
for (const { patterns, type } of indexes) {
|
|
570
|
+
for (const pattern of patterns ?? []) {
|
|
571
|
+
const previous = patternProperties[pattern]
|
|
572
|
+
InternalRecord.assignProperty(
|
|
573
|
+
patternProperties,
|
|
574
|
+
pattern,
|
|
575
|
+
previous === undefined
|
|
576
|
+
? type
|
|
577
|
+
: previous === false || type === false
|
|
578
|
+
? false
|
|
579
|
+
: registerPendingOneOf(appendJsonSchema(previous, type))
|
|
580
|
+
)
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
const hasPatternProperties = Object.keys(patternProperties).length > 0
|
|
584
|
+
if (hasPatternProperties) out.patternProperties = patternProperties
|
|
585
|
+
|
|
586
|
+
const additionalPropertySchemas = indexes.filter(({ patterns }) => patterns?.length === 0).map(({ type }) => type)
|
|
587
|
+
const hasUnrepresentableIndexPattern = indexes.some(({ patterns }) => patterns === undefined)
|
|
588
|
+
if (hasUnrepresentableIndexPattern && options?.onExcessProperty === "error") {
|
|
589
|
+
const propertyNames: Array<JsonSchema.JsonSchema> = []
|
|
590
|
+
if (propertySignatures.length > 0) propertyNames.push({ enum: Object.keys(properties) })
|
|
591
|
+
for (const [index, signature] of indexSignatures.entries()) {
|
|
592
|
+
propertyNames.push(
|
|
593
|
+
getPropertyNameSchema(
|
|
594
|
+
signature.parameter,
|
|
595
|
+
[...path, "indexSignatures", index, "parameter"],
|
|
596
|
+
dependencies,
|
|
597
|
+
new Set()
|
|
598
|
+
)
|
|
599
|
+
)
|
|
600
|
+
}
|
|
601
|
+
out.propertyNames = propertyNames.length === 1 ? propertyNames[0] : { anyOf: propertyNames }
|
|
602
|
+
const values = indexes.map(({ type }) => type)
|
|
603
|
+
out.additionalProperties = values.length === 1 ? values[0] : { anyOf: values }
|
|
604
|
+
if (additionalPropertySchemas.length > 0) {
|
|
605
|
+
out.allOf = additionalPropertySchemas.map((type) => ({ type: "object", additionalProperties: type }))
|
|
606
|
+
}
|
|
607
|
+
} else if (additionalPropertySchemas.length === 0) {
|
|
608
|
+
out.additionalProperties = hasUnrepresentableIndexPattern || options?.onExcessProperty !== "error"
|
|
609
|
+
} else if (additionalPropertySchemas.length === 1 && propertySignatures.length === 0 && !hasPatternProperties) {
|
|
610
|
+
out.additionalProperties = additionalPropertySchemas[0]
|
|
611
|
+
} else {
|
|
612
|
+
out.allOf = additionalPropertySchemas.map((type) => ({ type: "object", additionalProperties: type }))
|
|
613
|
+
}
|
|
614
|
+
if (
|
|
615
|
+
typeof out.additionalProperties === "object" &&
|
|
616
|
+
out.additionalProperties !== null &&
|
|
617
|
+
Object.keys(out.additionalProperties).length === 0
|
|
618
|
+
) {
|
|
619
|
+
delete out.additionalProperties
|
|
620
|
+
}
|
|
621
|
+
return out
|
|
622
|
+
}
|
|
623
|
+
|
|
629
624
|
function getPropertyNameSchema(
|
|
630
625
|
parameter: SchemaRepresentation.Representation,
|
|
631
626
|
path: Path,
|
|
@@ -634,7 +629,7 @@ function compileJsonSchema(
|
|
|
634
629
|
): JsonSchema.JsonSchema {
|
|
635
630
|
switch (parameter._tag) {
|
|
636
631
|
case "Number":
|
|
637
|
-
return { type: "string", pattern:
|
|
632
|
+
return { type: "string", pattern: numberKeyPattern }
|
|
638
633
|
case "Reference": {
|
|
639
634
|
if (seenReferences.has(parameter.$ref)) return { type: "string" }
|
|
640
635
|
return getPropertyNameSchema(
|
|
@@ -680,8 +675,11 @@ function compileJsonSchema(
|
|
|
680
675
|
? [schema.pattern]
|
|
681
676
|
: undefined
|
|
682
677
|
}
|
|
683
|
-
case "TemplateLiteral":
|
|
684
|
-
|
|
678
|
+
case "TemplateLiteral": {
|
|
679
|
+
if (parameter.checks.length > 0) return undefined
|
|
680
|
+
const { exact, pattern } = getTemplateLiteralPattern(parameter.parts)
|
|
681
|
+
return exact ? [pattern] : undefined
|
|
682
|
+
}
|
|
685
683
|
case "Union": {
|
|
686
684
|
if (parameter.types.length === 0 || parameter.checks.length > 0 || parameter.options?.mode === "oneOf") {
|
|
687
685
|
return undefined
|
|
@@ -696,13 +694,56 @@ function compileJsonSchema(
|
|
|
696
694
|
return patterns
|
|
697
695
|
}
|
|
698
696
|
case "Number":
|
|
699
|
-
return parameter.checks.length === 0
|
|
700
|
-
? [`^(?:${InternalAST.FINITE_PATTERN}|Infinity|-Infinity|NaN)$`]
|
|
701
|
-
: undefined
|
|
697
|
+
return parameter.checks.length === 0 ? [numberKeyPattern] : undefined
|
|
702
698
|
default:
|
|
703
699
|
throw errorWithPath(`Invalid index signature parameter ${parameter._tag}`, path)
|
|
704
700
|
}
|
|
705
701
|
}
|
|
702
|
+
|
|
703
|
+
function getTemplateLiteralPattern(
|
|
704
|
+
parts: ReadonlyArray<SchemaRepresentation.Representation>
|
|
705
|
+
): { pattern: string; exact: boolean } {
|
|
706
|
+
const activeReferences = new Set<string>()
|
|
707
|
+
let exact = true
|
|
708
|
+
const pattern = `^${parts.map(getPartPattern).join("")}$`
|
|
709
|
+
return { pattern, exact }
|
|
710
|
+
|
|
711
|
+
function getPartPattern(part: SchemaRepresentation.Representation): string {
|
|
712
|
+
// A segment check cannot generally be embedded in the enclosing pattern, even when it has a JSON Schema exporter.
|
|
713
|
+
if (part._tag !== "Reference" && part.checks.length > 0) exact = false
|
|
714
|
+
switch (part._tag) {
|
|
715
|
+
case "Reference": {
|
|
716
|
+
if (!Object.hasOwn(references, part.$ref)) {
|
|
717
|
+
throw errorWithPath(`Invalid reference ${part.$ref}`, [])
|
|
718
|
+
}
|
|
719
|
+
if (activeReferences.has(part.$ref)) {
|
|
720
|
+
throw errorWithPath(`Invalid recursive TemplateLiteral part ${part.$ref}`, [])
|
|
721
|
+
}
|
|
722
|
+
activeReferences.add(part.$ref)
|
|
723
|
+
const pattern = getPartPattern(references[part.$ref])
|
|
724
|
+
activeReferences.delete(part.$ref)
|
|
725
|
+
return pattern
|
|
726
|
+
}
|
|
727
|
+
case "Literal":
|
|
728
|
+
return RegEx.escape(globalThis.String(part.literal))
|
|
729
|
+
case "String":
|
|
730
|
+
return InternalAST.STRING_PATTERN
|
|
731
|
+
case "Number":
|
|
732
|
+
return InternalAST.FINITE_PATTERN
|
|
733
|
+
case "BigInt":
|
|
734
|
+
return "-?\\d+"
|
|
735
|
+
case "TemplateLiteral":
|
|
736
|
+
return part.parts.map(getPartPattern).join("")
|
|
737
|
+
case "Union":
|
|
738
|
+
if (part.types.length === 0) return "(?!)"
|
|
739
|
+
// Regex alternatives do not enforce that exactly one branch matches.
|
|
740
|
+
if (part.options?.mode === "oneOf") exact = false
|
|
741
|
+
return `(?:${part.types.map(getPartPattern).join("|")})`
|
|
742
|
+
default:
|
|
743
|
+
throw errorWithPath(`Invalid TemplateLiteral part ${part._tag}`, [])
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
}
|
|
706
747
|
}
|
|
707
748
|
|
|
708
749
|
function isJsonSchemaType(input: string): input is JsonSchema.Type {
|
|
@@ -730,25 +771,6 @@ function compactEnums(
|
|
|
730
771
|
return { type: sharedType, enum: values }
|
|
731
772
|
}
|
|
732
773
|
|
|
733
|
-
function getPartPattern(part: SchemaRepresentation.Representation): string {
|
|
734
|
-
switch (part._tag) {
|
|
735
|
-
case "Literal":
|
|
736
|
-
return RegEx.escape(globalThis.String(part.literal))
|
|
737
|
-
case "String":
|
|
738
|
-
return InternalAST.STRING_PATTERN
|
|
739
|
-
case "Number":
|
|
740
|
-
return InternalAST.FINITE_PATTERN
|
|
741
|
-
case "BigInt":
|
|
742
|
-
return "-?\\d+"
|
|
743
|
-
case "TemplateLiteral":
|
|
744
|
-
return part.parts.map(getPartPattern).join("")
|
|
745
|
-
case "Union":
|
|
746
|
-
return `(?:${part.types.map(getPartPattern).join("|")})`
|
|
747
|
-
default:
|
|
748
|
-
throw errorWithPath(`Invalid TemplateLiteral part ${part._tag}`, [])
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
|
|
752
774
|
/** @internal */
|
|
753
775
|
export function toJsonSchemaDocument(
|
|
754
776
|
document: SchemaRepresentation.Document,
|