chore(deps): update dependency effect to v4.0.0-rc.117 - #12
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
August 12, 2026 09:06
c4eea85 to
c442a36
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
August 13, 2026 17:05
c442a36 to
877de1d
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
August 15, 2026 05:39
877de1d to
e0c032d
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
August 17, 2026 15:13
e0c032d to
6319e4c
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
August 19, 2026 02:48
6319e4c to
3482e2f
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
3 times, most recently
from
August 22, 2026 02:46
02b78b7 to
a8118f0
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
August 25, 2026 15:45
a8118f0 to
69ba461
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
August 30, 2026 02:04
69ba461 to
1d59b03
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
September 15, 2026 00:49
1d59b03 to
17e1be4
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
September 16, 2026 21:12
17e1be4 to
3b1b123
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
2 times, most recently
from
September 22, 2026 22:43
1350624 to
c1e0ed6
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
September 24, 2026 03:26
c1e0ed6 to
9e76bfd
Compare
renovate
Bot
force-pushed
the
renovate/effect-4.x
branch
from
September 26, 2026 11:31
9e76bfd to
03fe44e
Compare
|
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



This PR contains the following updates:
4.0.0-beta.103→4.0.0-rc.117Release Notes
Effect-TS/effect (effect)
v4.0.0-rc.117Compare Source
Patch Changes
#8331
9953c92Thanks @tim-smart! - Bound local sends that wait for an unregistered cluster entity type. These sends now fail with anEntity type ... not registereddefect at the shared runner registration deadline. Once that startup deadline has elapsed, sends to not-yet-registered dynamic entity types fail immediately.#8319
c6e8b20Thanks @fubhy! - ExtendNetAddress.toCanonicalto accept internet addresses. IPv4-mapped IPv6 addresses become IPv4 while retaining the port. Other addresses retain their identity and IPv6 scope metadata.#8317
8d40572Thanks @tim-smart! - Fix cluster workflows stalling after request resets.#8323
1b21e0dThanks @fubhy! - Add validated multicast address refinements for IP and MAC addresses.#8310
3b155e3Thanks @williamrobertson13! - Fix memory leaks inPool.makeWithTTLwith the usage strategy by releasing retired resources and consumed acquisition errors from the TTL queue.#8326
895d944Thanks @lloydrichards! - Normalize identified MCP output schemas to object roots across protocol versions.Support identified object schemas in MCP elicitation requests.
#8318
705fb68Thanks @fubhy! - AddQueue.shutdownUnsafeto synchronously discard buffered messages and settle pending queue operations from callbacks. BothQueue.shutdownandQueue.shutdownUnsafereturnfalsewhen the queue has already been shut down or completed; previously,Queue.shutdownalways returnedtrue.#8325
87912c0Thanks @fubhy! - AddNetAddress.formatNativeHostandNetAddress.formatMulticastInterfacewith explicit platform and scope ID map parameters for native socket APIs.#8308
106af64Thanks @tristanz! - Release savepoints after nested transactions succeed or successfully roll back in PostgreSQL, PGlite, MySQL, libSQL, and the Node, Bun, React Native, and WASM SQLite clients. This frees PostgreSQL transaction locks before the outer transaction completes.Custom SQL clients can opt in through the new
releaseSavepointoption. Clients that omit it are unchanged.#8323
1b21e0dThanks @fubhy! - Add generic branded NetAddress classifications and named validating schemas.Singleton address constants retain their base-family types; guards expose
classifications on demand. Operations that derive new address bits return only
the IPv4 or IPv6 family until callers revalidate the classification.
#8305
3d59ae6Thanks @tim-smart! - Makecriteriaoptional forDecision.probability. When supplied,criteriastill requires descriptions for bothfalseandtrue.Decision.Probability.criteriais now optional, so consumers reading outcome descriptions (for example,decision.criteria.true) must first guard againstundefined.#8329
89c9a39Thanks @tim-smart! - Warn when conflicting cluster workflow definitions reuse a tag.v4.0.0-rc.116Compare Source
Patch Changes
c19c63fThanks @gcanti! - Add experimental JIT and AOT schema compilers that work through the existingSchemaParserAPIs and share a decoder registry. Enable JIT globally witheffect/unstable/schema/SchemaJITCompiler/enable, selectively withSchemaJITCompiler.enable(ast), or install generated AOT decoders withoutrequiring dynamic function construction. The new
effect/unstable/schema/SchemaAOTCompiler/Buildentrypoint discovers directSchema exports from explicit module loaders and writes a self-installing AOT
module through Effect's
FileSystemandPathservices. Compiled decoders canprovide optional synchronous
decodeandmakeoperations; normalSchemaParsercalls consume them transparently and retaindecodeEffectandmakeEffectas the detailed fallbacks. AOT targets declare the operations toprepare, so generated modules contain only those operation families and use
the interpreter if an omitted operation is later called.
Breaking changes
SchemaGetter.Getteris now a tagged union that distinguishes synchronous,optional, and effectful transformations. Getter values now expose only
pipe.Use the dual
SchemaGetter.map,SchemaGetter.compose, andSchemaGetter.runfunctions instead of the former methods. Keeping these operations standalone
lets bundlers remove composition code when an application does not use it.
The public
Getterconstructor is removed. UseSchemaGetter.transformOptionalEffectinstead ofnew SchemaGetter.Getter.SchemaGetter.onSomeandSchemaGetter.onNoneare also removed. UsetransformEffectfor an effectful transformation of present values andtransformOptionalEffectwhen the transformation handles missing values.Transformation#composeis replaced by the dual standalone functionSchemaTransformation.composeTransformation. Replacefirst.compose(second)with
SchemaTransformation.composeTransformation(first, second)orSchemaTransformation.composeTransformation(second)(first).SchemaTransformation.makeis renamed toSchemaTransformation.makeTransformation.SchemaTransformation.Transformationand
SchemaTransformation.Middlewarenow implementPipeable, so both valuescan be passed through standalone combinators with
.pipe(...).SchemaAST.Context.constructorDefaultnow stores the constructor-defaultEffectdirectly instead of wrapping it in aSchemaAST.Link. Constructordefaults apply only during construction, so the direct representation avoids
giving them encoding semantics and lets construction reuse already-completed
synchronous Effects. Code that constructs or inspects
SchemaAST.Contextshould pass or read the default
Effectdirectly.#8287
8cb0a4fThanks @tim-smart! - AddDecisionandDecisionModeltoeffect/unstable/aifor batched classification, rating, and probability estimates over schema-encoded input.#8221
8f420bbThanks @gcanti! - AddArbitrary.array(item, { minLength, maxLength })for variable-length arrays of custom Arbitraries. Shrinking removes blocks of commands while preserving the remaining values and their order, and also simplifies individual elements.Schema-derived arrays now also try removing prefixes and interior blocks. Shrinking composed values and Schema objects preserves child candidates that were previously lost when exploring another branch.
Shrunk results and replay paths may change from earlier native releases. Re-run affected properties to obtain new replay tokens, and preserve important failing inputs as regression tests.
#8233
1393080Thanks @gold-beyond! - AddCrypto.randomULIDto generate ULIDs from the currentClocktimestamp and cryptographically secure random bytes.#8256
ccae354Thanks @tim-smart! - Align theEffectandStreamAPIs and fix several Stream type signatures.Effect.orElseSucceednow passes the error to the fallback function, matchingStream.orElseSucceed.Effect.isEffectnarrows toEffect<unknown, unknown, unknown>instead ofany.Stream.bind,Stream.bindEffectandStream.letallow re-binding an existing field and produce the same record type as theirEffectcounterparts.Stream.Success,Stream.ErrorandStream.Servicesare unconstrained and distributive like theEffectversions.Stream.partitionreturns[passes, fails]and takes acapacityoption, matchingStream.partitionQueueandStream.partitionEffect. Its default capacity remains 16.Stream.mapBothtakesonElement/onError, matchingStream.tapBoth.Stream.scanandStream.scanEffecttake a lazy initial state.Stream.catchTagsrejects unknown tag keys likeEffect.catchTags.Stream.runIntoPubSub(error type was dropped),Stream.cross(swapped type parameter names) andStream.mapAccumArray(onHaltreturn type).Stream.as,Stream.tapDefect,Stream.tapErrorTagandStream.unwrapReason.Types.Concurrencyalias, and JSDoc categories were consolidated across both modules.#8235
553c403Thanks @tim-smart! - Retain durable deferred completions received before a workflow owner's first local run so replay can complete while the deferred reply is still being persisted.Keep pending completions in a cache keyed weakly by cluster activation. Handler rebuilds retain completions, and overlapping activations cannot clear each other's results. Results can be collected once their activation scope becomes unreachable; closing a scope alone does not guarantee collection.
Release RPC stream and queue consumers when their request write fiber is interrupted.
#8243
45b5103Thanks @tim-smart! - Fix lost durable deferred wake-ups when a ClusterWorkflowEngine execution suspends before its run reply is persisted. Deferred completions now wait for the current run reply before resuming, so discarded executions can replay without relying on caller retries.#8254
77a5612Thanks @tim-smart! - Fix file response content types: honor thecontentTypeoption and preserve explicit headers, including MIME types set byHttpStaticServer. The defaultHttpPlatform.layernow infers missing content types from file extensions.Web file responses on the default, Node, and Deno platforms prefer explicit content types, then nonempty
File.type, then the file extension.Removed the unused
contentLengthoption fromHttpServerResponse.file; lengths are calculated from the file and requested range.#8229
1076170Thanks @tim-smart! - Fix a deadlock in the memory workflow engine when a durable deferred is completed from a finalizer in the workflow awaiting it, includingDurableDeferred.intoinsideDurableDeferred.raceAll.#8206
f110af1Thanks @tim-smart! - Fix multipart file streams hanging on body read errors and preserve error causes when persisting files.#8284
0045152Thanks @tim-smart! -HttpServerResponse.toWebnow keeps a rawResponse's headers andSet-Cookievalues when the body is omitted (HEAD, or status 204, 205 or 304). Bodyless outer statuses keep the outer status and status text; HEAD keeps the rawResponse's. Outer cookies are appended to nativeSet-Cookieheaders instead of replacing them.#8202
51d4a2fThanks @xia-chao! - FixRcRef.maketo treatidleTimeToLive: 0likeDuration.zeroand"0 millis"instead of an omitted option.#8298
4d4c4e8Thanks @gcanti! - FixSchema.Redactedto wrap the transformed result of its inner schema during decoding and encoding.#8227
ccfe152Thanks @tim-smart! - Release non-persisted, interruptibleRunnerServerhandlers and mailbox slots when callers disconnect.Preserve dynamic
WithTransactionannotations during replay and re-delivery.#8261
d30a0c8Thanks @nikhilsnayak! - Add HTTPQUERYsupport to clients, routers, HttpApi endpoints, and AI request metadata. Configure CORS support throughallowedMethods; defaults are unchanged.OpenAPI 3.1 output represents
QUERYthroughx-oai-additionalOperations, which requires consumer support for that extension. The OpenAPI generator accepts the extension and the native OpenAPI 3.2queryfield.#8255
84fe64aThanks @tim-smart! - Preserve literal suffixes such as:waitin/operations/:id:waitacrossHttpApiClient,HttpApiBuilder, and OpenAPI paths.Server routes without a params schema keep their existing matching for
RouteContextconsumers. Schemas whose keys cannot be enumerated keep the existing fallback.#8228
49e4b37Thanks @lloydrichards! - Support prompt titles inMcpServer.promptandMcpServer.registerPrompt.#8228
49e4b37Thanks @lloydrichards! - Add aninstructionsoption to MCP servers for initialization and discovery responses.#7265
a2c4154Thanks @lloydrichards! - Add server support for MCP protocol version 2026-07-28 through 2026_07_28#8272
23a58c0Thanks @fubhy! - AddNetAddress.formatHostandNetAddress.inetAddressFromHostStringfor socket APIs that accept numeric hosts and ports separately, preserving IPv6 scope IDs. AddNetAddress.scopeIdsFromInterfacesto build a scope map for resolving named IPv6 zones from supplied network interface entries without performing operating-system lookups.#8293
feef90cThanks @gcanti! - TreatNeveras an uninhabited branch duringArbitrary.schemaderivation. Schemas with another finite generation path, including optional properties, unions, and empty collections, no longer fail derivation.#8212
755e863Thanks @IMax153! - RestrictByteSize.Inputstrings to canonical non-negative integers with recognized units, rejecting malformed literals at compile time. Parse external strings and fractional quantities withByteSize.fromStringorByteSize.fromStringUnsafebefore passing them to APIs acceptingByteSize.Input.#8228
49e4b37Thanks @lloydrichards! - HonorTool.Strictin MCP input schemas and argument validation. Strict dynamic tools require Effect schemas; raw JSON Schema is rejected at registration.Support identified input schemas for non-strict tools. Invalid arguments use
InvalidParamson protocols before 2025-11-25 andisError: trueresults on newer protocols.Distinguish validation failures from declared handler failures. Declared failures return
isError: truewithoutstructuredContent: error mode usesError.messageor schema-encoded text, and return mode uses the encoded payload. Declared failures do not produce internal-error diagnostics.Log and report internal failures, including defects and encoding errors, while keeping client messages generic.
Allow
Toolkit.handleto acceptSchemaAST.ParseOptionsfor parameter decoding. Expose theToolkit.FailureOrigincause annotation and sharedTool.FailureOrigintype, with the same origin available inTool.HandlerResult.failureOriginon returned failures.#8269
9ad9891Thanks @tim-smart! - AddHttpApi.ParseOptionsto configure server and client codecs at the API, group, or endpoint level.Sse.decodeSchemaandChannelSchema.decodeaccept parse options, andSchema.Causeencodes reasons to their wire fields.SSE decoding omits absent IDs, including with default options. Use
Schema.optional(Schema.String)instead ofSchema.UndefinedOr(Schema.String)for IDs. WithonExcessProperty: "error", declareevent(default:"message") and anyid, including inherited IDs.HttpApiSchema.StreamSsedata-mode types and OpenAPI schemas now makeidoptional.#8296
0beded0Thanks @gcanti! - Improve Schema-derived BigInt and BigDecimal arbitraries with wider magnitude, precision, and exponent coverage and numeric boundary shrinking.Cover intermediate magnitudes up to large one-sided BigInt bounds, handle BigDecimal bounds with widely different scales, and refine decimal counterexamples between simple values.
#8260
2940742Thanks @xia-chao! - Fix repeatedtext,json,arrayBuffer, andurlParamsBodyreads inHttpServerResponse.toClientResponsefor raw WebResponsebodies, preserving the original response for serving.#8270
63c1566Thanks @tim-smart! - Fix YAML indentless sequences, multiline scalar folding, and comments. Reject unsupported compact nested sequences (- - value) and document streams.Previously accepted values such as
description: Use when: deployanddescription: Deploy:now throwSyntaxError: YAML forbids colons followed by whitespace or end-of-value in plain scalars. Quote these values, for exampledescription: "Use when: deploy".v4.0.0-rc.115Compare Source
Patch Changes
#8196
657254bThanks @gcanti! - Optimize schema initialization while preserving custom constructor options.#8190
f9ef0e9Thanks @javascript-unsafe! - Omit response bodies for statuses 204, 205, and 304 inHttpServerResponse.toWeband the Bun/Deno HTTP adapters, preventing invalid Web responses and hung requests. Cancel omitted rawReadableStreambodies, and finalize request resources without starting omitted Effect streams.#8187
4f73f9eThanks @tim-smart! - Parameterize persistence lookup keys in both SQL backing stores'getManyqueries.v4.0.0-rc.114Compare Source
Patch Changes
#8177
3ff4952Thanks @tim-smart! - AllowEffect.cachedWithTTLto compute the TTL from each completedExit, so successes and failures can use different cache durations.#8164
6d55555Thanks @sam-goodwin! - Keep Node and Bun file stats usable when optional numeric metadata exceeds the safe integer range by returningOption.none()for those fields.#8162
716e0c0Thanks @tim-smart! - Fix published declarations referencing symbols stripped as@internal, which broke consumers compiling withskipLibCheck: false.Effectable.d.tsnow uses the publicEffect.TypeId,Match.d.tsno longer aliases an internalContextualtype,Schema.d.tsships theAnnotationSchemaConstraintalias it references, and the CLI'stoFlagDochelper is marked internal so it no longer leaksParam.getParamMetadata.#8160
d4e4ad5Thanks @gcanti! - FixSchemaRepresentation.toCodeDocumentgenerating invalid TypeScript for optional tuple elements containing unions or nested readonly tuples. Optional element types are now parenthesized, for examplereadonly [(string | number)?]instead ofreadonly [string | number?]. Generated runtime schemas are unchanged.#8158
b1988f4Thanks @gcanti! - FixSchemaRepresentation.toCodeDocumentdropping Struct fields named__proto__from generated schemas. These fields now use computed keys, such asSchema.Struct({ ["__proto__"]: Schema.String }), so the generated schema validates them correctly.#8169
482b7d7Thanks @gcanti! - ImproveSchemaRepresentation.fromJsonSchemaDocumentandfromJsonSchemaMultiDocument:Import
{ not: {} }asSchema.Never(#8137).Import closed records with one
patternPropertiesentry,additionalProperties: false, and no declared or required properties whenpatterns: "apply"is enabled. These were previously rejected.{ "type": "object", "patternProperties": { "^a": { "type": "number" } }, "additionalProperties": false }Reject open patterned objects with
patterns: "apply"instead of generating incompatible TypeScript index signatures.{ "type": "object", "patternProperties": { "^a": { "type": "number" } }, "additionalProperties": true }Import now explains that the generated TypeScript index signatures would give incorrect types to unmatched keys, and reports the source path. The same applies when
additionalPropertiesis omitted or{}. Patterns can still be combined with a closed object inallOfwhen the result has a finite set of keys. Usepatterns: "ignore"only if you intend to discard the pattern and its value constraints.Reject references inside a subschema with its own
$idinstead of potentially resolving against the wrong definitions. Resolve or flatten these references before importing. A$idon the document root remains supported.{ "$id": "https://example.com/root", "$defs": { "Value": { "type": "string" } }, "type": "object", "properties": { "child": { "$id": "child", "$defs": { "Value": { "type": "number" } }, "$ref": "#/$defs/Value" } } }Here
childrefers to the nested numericValue, not the root stringValue. Import now reports that references inside a subschema with its own$idare unsupported instead of incorrectly using the root definition.Explain import failures using JSON Schema keyword names, the reason for rejection, and the source path. Reference errors distinguish missing definitions, unsupported reference formats, and circular aliases. Pattern errors explain how to opt in for trusted schemas or explicitly discard the constraints.
#8162
716e0c0Thanks @tim-smart! - RenameSchema.Annotations.ToArbitrary.ConstrainttoSchema.Annotations.ToArbitrary.FilterConstraint.Code that refers to the previous type name should update its type annotations to use
FilterConstraint.#8181
9941e6dThanks @Ishkirat-Singh! - Makemessageoptional forPrompt.SelectandPrompt.MultiSelect. When omitted, prompts display only the choices and submission shows a tick followed by the selected titles.Prompt.AutoCompletestill requires a message.v4.0.0-rc.113Compare Source
Patch Changes
#7738
49e3901Thanks @kitlangton! - Retain completed tool approval results in non-streaming responses so Chat records them and does not replay approved tools on later turns.#7483
b945dedThanks @tim-smart! - Align runtime type IDs with their module paths. Effect markers now omit legacy grouping prefixes and theunstablepath segment, while OpenTelemetry spans use theOtelTracermodule path. Custom implementations that copy these marker strings must adopt the corrected IDs.#8014
d6422f4Thanks @kitlangton! - FixEffect.allto retain errors and required services from every branch of a union of record inputs.#8095
5a80204Thanks @gcanti! - FixArbitrary.schemato respect applicable index signatures when generating and shrinking object properties, including fixed fields inSchema.StructWithRestand overlapping records.Combine compatible string, number, and bigint constraints during generation so cases such as a
Stringfield constrained by aNonEmptyStringrecord remain productive at size zero. Other intersections are validated and may exhaust the discard budget.#7796
53511efThanks @kitlangton! - FixSchema.ArrayEnsureto preserve array-valued element branches and outer-array encoding cardinality.#8067
79ae49fThanks @purwasadr! - FixAtomRpc.queryreturningneverfor RPCs whose middleware declares servicerequires. The return-type conditional now infers all sixRpctype parameters, matchingmutationand every utility inRpc.#7463
0d083baThanks @tim-smart! - Remove themimeruntime dependency. The neweffect/unstable/http/Mimemodule provides top-level lookup functionsbacked by a vendored standard MIME registry.
#7477
be0f822Thanks @candrewlee14! - Allow sockets to use browser, Bun, and Node WebSocket implementations without consumer casts. Platform constructorsnow support typed opening-handshake headers where available.
#7587
debe8fdThanks @kitlangton! - FixCache.invalidateWhenandScopedCache.invalidateWhendeleting a replacement entry while waiting for an earlier lookup.#7585
a8588f9Thanks @kitlangton! - Fix interruption ofCache.refreshfor a missing key removing a newer value written byCache.set.#7596
f17eb0aThanks @kitlangton! - FixCache.refreshandScopedCache.refreshexceeding capacity when an existing key is evicted while its refresh is in progress. Publishing the refreshed entry now evicts older entries as needed, releasing their resources inScopedCache.#7595
f30cbfeThanks @kitlangton! - FixCache.refreshfor an initially missing key deleting a newer cached value when the refresh completes with zero time to live.#7614
78cc9c0Thanks @kitlangton! - PreventCachefrom retaining synchronously interrupted lookups.#7563
ccbdbd5Thanks @alvarosevilla95! - Respect custom HTTP header redaction when recording server span attributes.#7254
a63dcbfThanks @gcanti! - Add the experimental Schema-firsteffect/unstable/arbitrary/Arbitrarymodule for native generation withoutfast-check.
Arbitrary.schemaderives an opaque arbitrary from the decoded SchemaType,Arbitrary.sampleEffectprovides interruptible sampling with typed exhaustion, and
Arbitrary.checkEffectreturns structured property results.The initial implementation supports bounded discards, shrinking, replay, and recursive and mutually recursive Schemas.
SampleErrorandExhaustedinclude the effective seed so discarded runs remain reproducible even when the caller didnot provide one.
Arbitrary.isArbitraryidentifies values through the module's nominal protocol. Numeric constraintsretain
NaNwhen it is accepted by their supportedOrder.Numberbounds. Union derivation validatesoneOfexclusivity and isolates lazy cross-member shrinking from unrelated random generation. Object derivation keeps
optional-property selection constructive when candidate fields have different recursive costs.
Struct, Record, JSON-object, and record-shaped
Arbitrary.alloutputs periodically use a null prototype as an edgecase, preserving that prototype throughout shrinking and replay without perturbing structural PRNG choices. The change
adds 0.01–0.03 KB gzip to representative Arbitrary fixtures and leaves production-only bundle sentinels unchanged.
Add
Arbitrary.map,Arbitrary.flatMap,Arbitrary.filter,Arbitrary.filterMap, andArbitrary.allfor composingderived Arbitraries without exposing a second catalog of primitive constructors. Filtering remains bounded and
promotes valid shrink descendants through rejected nodes.
maxShrinksbounds every inspected shrink candidate,including candidates rejected before property evaluation, while retaining the best shrunk input found when the
budget is exhausted.
flatMapprovides deterministic dependent generation, source-first shrinking, post-source PRNGcheckpoints, and one shared residual recursion budget.
allcombines tuples, iterables, and records with a sharedbudget, randomized internal generation order, stable output shape, and independent member shrinking. Arbitrary values
implement
Pipeablefor composition with data-last combinators.Add the experimental Schema
arbitraryConstraintandtoCodecArbitraryannotations and theirSchema.Annotations.ToArbitrarytypes. Declarations can provide a Schema Link optimized for generation, while filterscan contribute native semantic constraints. The callback receives decoded type parameters and normalized constraints.
The compiler owns efficient representations for common built-ins, including JSON, RegExp, URL, Date, byte arrays,
ReadonlyMap, and ReadonlySet. Effect-specific HashMap, HashSet, Chunk, Graph, BigDecimal, and date-time declarations keep
local generation Links, while declarations with productive canonical codecs require no arbitrary-specific annotation.
Schema.isUniqueKeyprovides key-based Map uniqueness for explicit array representations.The same ownership policy applies to formatter and equivalence derivation: implementations for common declarations
live in their compiler, while domain-specific and dynamically constructed declarations retain local annotations.
Declarations whose intrinsic
Equalimplementation already matches their Schema equivalence need no annotation orcompiler special case. This keeps unused common callbacks out of production Schema bundles.
Against the previous layout,
schema-toArbitrarydecreases from 36.68 KB to 33.24 KB gzip andarbitrary-combinatorsdecreases from 37.16 KB to 33.70 KB.schema-toFormatterincreases from 18.92 KB to 19.49 KBand
schema-toEquivalenceincreases from 19.05 KB to 19.39 KB because callers that explicitly derive these capabilitiesnow retain the common declaration handlers. Generic production fixtures remain unchanged; an equivalence-specific
production fixture using common declarations decreases from 20.75 KB to 20.48 KB, while declarations whose intrinsic
equality is sufficient decrease from 23.42 KB to 23.34 KB. An Arbitrary-specific production fixture using common
declarations decreases from 20.35 KB to 19.61 KB, while one using the locally annotated BigDecimal and date-time
declarations increases from 18.34 KB to 23.01 KB.
The complete 31-scenario native Arbitrary comparison reports no statistically classified runtime regression; the five
moved BigDecimal and date-time scenarios remain within measurement noise.
Add
SchemaGetter.forbiddenEncoding, a reusable getter for the encode side of decode-only Schema transformations.Remove the fast-check bridge from the
effectpackage, includingSchema.toArbitraryandeffect/testing/FastCheck. Replace the legacySchema.Annotations.ToArbitrarycallback contract with the nativeSchema-first types. The
effectpackage no longer depends on fast-check.Migrate
TestSchema.Asserts.verifyLosslessTransformationandTestSchema.Asserts.arbitrary().verifyGenerationto thenative runner. Both methods now accept native check options directly, bound unsuccessful generation, and include the
shrunk input and replay token in property failures.
Use the Arbitrary runner for all
@effect/vitestproperty tests. Property inputs may combine Schemas and Arbitraries,and are composed directly with
Arbitrary.all; check options are available througharbitrary. Raw fast-checkarbitraries and the
fastCheckoptions object are no longer supported. As with the previous fast-check adapter, thrownexceptions, defects, and typed failures from a property are shrinkable falsifications; Effect interruption remains an
interruption.
Optimize constructive regular-expression generation by caching feasible lengths on the compiled pattern, computing
sequence-suffix feasibility once, and precomputing character-class metadata. Seeded generation, shrinking, and replay
remain unchanged.
Optimize
BigDecimal.OrderandBigDecimal.Equivalencewith a shared hybrid comparator. Ordinary scale differencesuse cached, bounded coefficient alignment, while large differences are compared without materializing their decimal
zeroes.
BigDecimal.makenow rejects scales that are not safe integers.Before its removal, the materialized fast-check bridge fixture
schema-toArbitrary-materialized-fast-check.tsmeasured 79.00 KB minified and gzipped.Representative runtime measurements against corresponding hand-written fast-check 4.9.0 arbitraries are shown below.
Values are median latency on Node 24.12.0 and Apple M3; lower is better. Both implementations validate the
same output domains, although their generation distributions are not identical. Native speedup is fast-check latency
divided by Native latency, so higher is better.
Uint8ArraysamplesBigDecimalsamplesDateTime.UtcsamplesfilterMapsamplesalltuple samplesallrecord samplesflatMapsamplesflatMapfailure and shrinkingflatMapshrink pathTestSchema, 100 generationsCold recursive derivation is not included because the native fixture constructs and compiles a Schema, while the
fast-check fixture constructs a hand-written arbitrary; it is not a like-for-like warm-generator comparison.
Add a guide for the native module and a migration guide from the fast-check bridge published in
effect@4.0.0-rc.109.#7822
b845b18Thanks @tim-smart! - AddStream.catchDefectandChannel.catchDefectfor recovering from defects without catching typed failures or interruptions.#7657
381b794Thanks @kitlangton! - RemoveChannel.runDone; useChannel.runDrainto consume all output and return the completion value.#7989
4ffcaf4Thanks @kitlangton! - Preserve astral Unicode escapes and following arguments inChildProcess.makeandChildProcess.prefixtemplate literals.#8018
ba2fd82Thanks @tim-smart! - Wait for Node child process groups to exit during scoped release andkill.After signalling a process group, both operations now wait for its leader and descendants. Without
forceKillAfter, the wait is limited to one second and never escalates. WithforceKillAfter, the group receivesSIGKILLat the deadline, followed by a final wait of up to one second. Native timers keep escalation working under aTestClock, and cleanup no longer depends on stdio closing.exitCodeandisRunningremain tied to the leader's exit, and a leader that already exited successfully still leaves its group untouched. Process group checks count zombies, so cleanup may wait for the full bound under a non-reaping PID 1.#7617
02be94cThanks @kitlangton! - FixChunkconcatenation to preserve sliced elements.#7453
115d8c2Thanks @gcanti! - Rename the built-inConfigconstructors to PascalCase and renameConfig.mapOrFailtoConfig.mapEffect.Config.ArrayandConfig.Recordnow construct configs directly, with overloads for pathless options or a path followed by options, while their specialized schemas and the other built-in schemas are kept internal.This is a breaking naming cleanup for the Effect 4 release candidate. It makes casing consistently identify typed config constructors, aligns effectful mapping with the rest of the library, and prevents implementation schemas from expanding the public
Configinterface.#8020
1452635Thanks @kitlangton! - EnsureEffect.acquireUseReleasereleases an acquired resource andEffect.useSpanends its span when the use callback throws before returning an effect. The thrown exception remains a defect, but no longer skips cleanup.#8087
77f85feThanks @tim-smart! - usenewinstantiation for streams#7802
a3f2b31Thanks @kitlangton! - Preserve flags and nested commands when completing a CLI subcommand through its alias.#7804
310f8d3Thanks @kitlangton! - Include inherited shared flags in descendant CLI completions.#8086
291d616Thanks @MaxFreedomPollard! - Allow=in values parsed byPrimitive.keyValuePair,Flag.keyValuePair, andParam.keyValuePairineffect/unstable/cli.#7687
48dbbb2Thanks @kitlangton! - Allow optional alternative CLI flags.#8121
b43bfd6Thanks @tim-smart! - Rename CLI constructors to PascalCase, aligning scalar names withSchemaandConfig. This is a breaking change; parsing behavior is unchanged.In
Primitive,Param,Flag, andArgument, capitalize existing constructor names, with these exceptions:integerIntfloatFinitenoneNeverchoiceLiteralsPrimitive.choicebecomesPrimitive.Choice;choiceWithValuebecomesChoiceWithValuewhere available.In
Prompt, capitalize control constructors excepttext→String,integer→Int, andfloat→Number. Rename public typesIntegerOptions→IntOptionsandFloatOptions→NumberOptions. SharedTextOptionsis unchanged.Prompt.Numberretains its existing parser, without a finite-number restriction.In
GlobalFlag, renameaction→Actionandsetting→Setting. Factories and combinators, includingCommand.makeandPrompt.succeed, keep their names.Update public
_tagmatches and completion descriptors:Primitive:"Integer"→"Int","Float"→"Finite","None"→"Never".Completions.FlagTypeandCompletions.ArgumentType:"Integer"→"Int","Float"→"Finite".Sentinels still always fail; their internal parameter name is now
"__never__". Help labels and completion scripts are unchanged.#7685
1c89c78Thanks @kitlangton! - Fix defaulted variadic arguments when omitted.#8059
9bbe1a5Thanks @kitlangton! - Fix CLI wizard handling of negative numbers and other flag values beginning with-.#7489
dd99ab0Thanks @tim-smart! - Cluster no longer retains fiber ids for every local teardown.Transient persisted interrupts are now classified from live teardown
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.