chore: release packages - #174
Open
btravers wants to merge 1 commit into
Open
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
This is an automated Changesets release PR to publish the @unthrown/* fixed version group at 5.1.0, including a minor release of @unthrown/oxlint adding the new no-unused-matcher rule (enabled in the recommended preset).
Changes:
- Bump package versions from
5.0.0→5.1.0across the fixed release group. - Update package changelogs for
5.1.0(notably@unthrown/oxlintwith the new rule notes). - Remove the applied changeset file after generating changelogs.
Reviewed changes
Copilot reviewed 15 out of 15 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/vitest/package.json | Version bump to 5.1.0. |
| packages/vitest/CHANGELOG.md | Add 5.1.0 section header. |
| packages/standard-schema/package.json | Version bump to 5.1.0. |
| packages/standard-schema/CHANGELOG.md | Add 5.1.0 patch entry referencing unthrown@5.1.0. |
| packages/oxlint/package.json | Version bump to 5.1.0. |
| packages/oxlint/CHANGELOG.md | Document the no-unused-matcher rule release notes for 5.1.0. |
| packages/neverthrow/package.json | Version bump to 5.1.0. |
| packages/neverthrow/CHANGELOG.md | Add 5.1.0 patch entry referencing unthrown@5.1.0. |
| packages/effect/package.json | Version bump to 5.1.0. |
| packages/effect/CHANGELOG.md | Add 5.1.0 patch entry referencing unthrown@5.1.0. |
| packages/core/package.json | Version bump to 5.1.0. |
| packages/core/CHANGELOG.md | Add 5.1.0 section header. |
| packages/boxed/package.json | Version bump to 5.1.0. |
| packages/boxed/CHANGELOG.md | Add 5.1.0 patch entry referencing unthrown@5.1.0. |
| .changeset/seven-rules-no-unused-matcher.md | Remove the consumed changeset after release generation. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
btravers
force-pushed
the
changeset-release/main
branch
2 times, most recently
from
July 31, 2026 22:37
4244701 to
42689a3
Compare
btravers
force-pushed
the
changeset-release/main
branch
from
July 31, 2026 23:02
42689a3 to
4a36859
Compare
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 was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
unthrown@5.1.0
Minor Changes
5ead919: Close a boundary hole where an
asyncfunction's rejection escapedqualification, stop
toBeErrTaggedcounting a message as payload, and name thevalue in
NonExhaustiveError.fromThrowable/fromSafeThrowablenow reject anasyncfn. These wrap asynchronous function, so they only ever see a synchronous
throw: an asyncfnrejects long after the boundary has returned, and its rejection could neverreach
qualify. It used to produceOk(<Promise>)— un-triaged — and therejection then floated as an unhandled rejection, which terminates the process on
Node by default:
The orphaned rejection is adopted and silenced, so it cannot float. Reach for
fromPromise/fromSafePromisefor async work.This is caught at runtime rather than by the type system — the one thenable ban
in the library that is not a compile error. Putting
NotThenableonfn's returnalso makes generic functions unassignable, so
fromSafeThrowable(structuredClone)would stop compiling with
Tcollapsed tounknown; the phantom rest-tuple guardfromPromiseuses fares worse. The success type is therefore slightly over-stated(
Result<Promise<T>, E>is spellable but never inhabited) — the mirror ofrecoverErrCases'sneverunder-stating the error channel.toBeErrTagged's exact-payload form now ignores every reserved key. Thedocumented way to set a
TaggedError's message is a subclass field —override message = "…"— which lands as an own enumerable property, so itleaked into the payload and failed an exact assertion on the very pattern the
library prescribes:
The matcher now skips
_tag,name,messageandstack— exactly the keysTaggedErrorInstanceomits and the constructor types?: never, so none of themcan legitimately be payload. Assertions using
expect.objectContainingareunaffected (they were already tolerant of the extra key).
NonExhaustiveErrornow names the value it could not match.JSON.stringifyreturns
undefined— it does not throw — for a function, a symbol, orundefined, so theString(input)fallback never fired and the message read"no pattern matched the value undefined" for exactly the rogue inputs this error
exists to describe. It now falls back correctly (
… the value function rogueFn() {}).@unthrown/oxlint@5.1.0
Minor Changes
829b9d3: Add the
no-unused-matcherrule (Add an @unthrown/oxlint rule: no-unused-matcher (…Cases callbacks that ignore the injected matcher) #171) — and enable it in therecommendedpreset.
A
…Casescallback (the five error combinators, andmatch'serrCaseshandler) that never uses the matcher it was handed sources its exhaustiveness
from a builder bound to some other value. The type checker cannot see it —
the
ExhaustiveMatchconstraint is structural, andnoUnusedParametersneverfires because the parameter is not unused, it is simply never declared — and
the runtime runs the borrowed builder against whatever value it closed over:
the wrong branch is chosen silently (a plausible wrong value, with the Err
channel typing as fully handled), or nothing matches and the modeled error
becomes a Defect.
The rule reports a callback whose matcher parameter is absent (
() => …) ornever read, and — separately, to catch a trivial
void matcherreferencefronting for a foreign builder — any second unthrown / ts-pattern
match(...)built in the callback's own body. Branch handlers (nested functions) stay free
to match their payload. There is no escape hatch: a
…Casescallback thatdoes not use its matcher is never what you meant.
Enabling the rule in
recommendedcan surface new lint errors in an existingcodebase; each one is a real bug of the shape above.
@unthrown/prisma@0.2.0
Minor Changes
ab7194f: Make
Edomain outcomes only: infrastructure failures become defects, and fixan unsound error channel on
tryCreate/tryUpsert.Enow carries only what you would actually branch on. Three P-codesdescribe a domain outcome and stay modeled —
UniqueConstraintViolation(P2002,409),
ForeignKeyViolation(P2003, 400),RecordNotFound(P2025/P2018, 404).Everything infrastructural is now a defect: a dropped connection, a pool
timeout, a deadlock, an unmapped P-code, a malformed query, a client that could
not start, an engine panic.
Nobody writes domain logic for a severed TCP connection — you log it and return a
500, which is exactly what
match'sdefectarm already does. Modelling thosefailures only forced every call site to carry an arm that duplicated its own
defectarm:A defect is not a crash: it flows through the pipeline untouched and is folded at
the edge like any other unmodeled failure.
Consequences:
DriverErrorclass is removed. Nothing routes to it any more; theoriginal Prisma error reaches your
defectarm unwrapped, with itscode,metaand stack intact.tryFindManyisAsyncResult<User[], never>. Absence is stillnull.InvalidCursor, the one carve-out. A cursor is an opaquestring from a client, so a
parseCursorthat rejects it — or a query Prismarefuses to validate — is anticipated input you answer with a 400. A throw out
of
getCursor, which reads rows you just fetched, is a bug and stays a defect.recoverDefectrather than a tag match — one place in a codebase, versus anarm at every call site.
tryCreateandtryUpsertnow carryRecordNotFound. A nestedconnectpointing at a record that does not exist raises P2025, even though neither
operation has a row of its own to miss:
Their unions previously excluded it, so the runtime produced an error the type
said was impossible. An exhaustive
mapErrCasesover the declared union then hadno arm for the value that arrived, the matcher threw
NonExhaustiveError, andthe throw-to-defect net turned a modeled database failure into a
Defect. P2018— the same failure from the to-many side of a nested write — now maps to
RecordNotFoundtoo. The batch mutations (tryCreateMany/tryUpdateManyandtheir
*AndReturntwins) accept no nested writes, so they remain free of it.withCursor'safterandbeforeare now mutually exclusive. Passing bothtype-checked and silently ignored
after.Breaking, shipped as a minor:
qualifyPrismaErrortakes the injecteddefecthelper as a second argument (it is a
qualify, so passing it to a boundary isunchanged — only direct invocation needs updating), the
DriverErrorclass isgone, and every error union changed. Each of those is a compile error at the call
site rather than a silent behaviour change — which is the point.
Patch Changes
@unthrown/vitest@5.1.0
Minor Changes
5ead919: Close a boundary hole where an
asyncfunction's rejection escapedqualification, stop
toBeErrTaggedcounting a message as payload, and name thevalue in
NonExhaustiveError.fromThrowable/fromSafeThrowablenow reject anasyncfn. These wrap asynchronous function, so they only ever see a synchronous
throw: an asyncfnrejects long after the boundary has returned, and its rejection could neverreach
qualify. It used to produceOk(<Promise>)— un-triaged — and therejection then floated as an unhandled rejection, which terminates the process on
Node by default:
The orphaned rejection is adopted and silenced, so it cannot float. Reach for
fromPromise/fromSafePromisefor async work.This is caught at runtime rather than by the type system — the one thenable ban
in the library that is not a compile error. Putting
NotThenableonfn's returnalso makes generic functions unassignable, so
fromSafeThrowable(structuredClone)would stop compiling with
Tcollapsed tounknown; the phantom rest-tuple guardfromPromiseuses fares worse. The success type is therefore slightly over-stated(
Result<Promise<T>, E>is spellable but never inhabited) — the mirror ofrecoverErrCases'sneverunder-stating the error channel.toBeErrTagged's exact-payload form now ignores every reserved key. Thedocumented way to set a
TaggedError's message is a subclass field —override message = "…"— which lands as an own enumerable property, so itleaked into the payload and failed an exact assertion on the very pattern the
library prescribes:
The matcher now skips
_tag,name,messageandstack— exactly the keysTaggedErrorInstanceomits and the constructor types?: never, so none of themcan legitimately be payload. Assertions using
expect.objectContainingareunaffected (they were already tolerant of the extra key).
NonExhaustiveErrornow names the value it could not match.JSON.stringifyreturns
undefined— it does not throw — for a function, a symbol, orundefined, so theString(input)fallback never fired and the message read"no pattern matched the value undefined" for exactly the rogue inputs this error
exists to describe. It now falls back correctly (
… the value function rogueFn() {}).@unthrown/boxed@5.1.0
Patch Changes
@unthrown/effect@5.1.0
Patch Changes
@unthrown/neverthrow@5.1.0
Patch Changes
@unthrown/standard-schema@5.1.0
Patch Changes