diff --git a/.changeset/bump-unthrown-beta-7.md b/.changeset/bump-unthrown-beta-7.md new file mode 100644 index 0000000..4512fd8 --- /dev/null +++ b/.changeset/bump-unthrown-beta-7.md @@ -0,0 +1,20 @@ +--- +"@temporal-contract/contract": patch +"@temporal-contract/client": patch +"@temporal-contract/worker": patch +--- + +Bump `unthrown` to `5.0.0-beta.7` and raise the peer range to `^5.0.0-beta.7`. + +Two changes come with it, neither requiring code changes here: + +- **`returnType()` on the built-in matcher** — pins a match's output type so + every branch is checked against it, instead of the result being the union of + the branch returns. Available on all five `*ErrCases` combinators, `match`'s + `errCases` handler, and standalone `match(value)`. +- **`tapErrCases` no longer silently drops a `defect(…)` branch.** Such a branch + now produces a `Defect` whose cause is an `AggregateError` of the branch's + cause and the observed error, matching what a `throw` in the same position + already did. Only a breaking change for code that relied on the value being + discarded — this package's single `tapErrCases` call site logs and does not + use the `defect` marker. diff --git a/docs/explanation/why-temporal-contract.md b/docs/explanation/why-temporal-contract.md index 0843264..0a7685d 100644 --- a/docs/explanation/why-temporal-contract.md +++ b/docs/explanation/why-temporal-contract.md @@ -112,8 +112,8 @@ or charges wrongly, and leaves a failed execution to explain. ## Failures as values Temporal's failure model is strings: an `ApplicationFailure` with a `type` that -retry policies match on. Effective for retries, weak for branching. `if -(error.type === "CARD_DECLINED")` is a stringly-typed conditional with a typo +retry policies match on. Effective for retries, weak for branching. A check like +`error.type === "CARD_DECLINED"` is a stringly-typed conditional with a typo waiting to happen, and no payload beyond a message. A contract can declare its failures: diff --git a/docs/how-to/install.md b/docs/how-to/install.md index 38747e1..21cc04b 100644 --- a/docs/how-to/install.md +++ b/docs/how-to/install.md @@ -56,7 +56,7 @@ types. Your code and the library must resolve to the _same_ copy. | Peer | Required by | Range | | ---------------------- | ------------------------ | --------------- | -| `unthrown` | contract, worker, client | `^5.0.0-beta.6` | +| `unthrown` | contract, worker, client | `^5.0.0-beta.7` | | `@temporalio/common` | worker, client | `^1` | | `@temporalio/worker` | worker, testing | `^1` | | `@temporalio/workflow` | worker | `^1` | diff --git a/docs/how-to/upgrade-to-v8.md b/docs/how-to/upgrade-to-v8.md index b1c88e9..55351b6 100644 --- a/docs/how-to/upgrade-to-v8.md +++ b/docs/how-to/upgrade-to-v8.md @@ -10,8 +10,9 @@ Version 8 has two breaking changes: Both are mechanical. Budget an afternoon for a medium codebase. ::: warning 8.0 is currently a prerelease -The 8.0 line is published under the `beta` tag. `npm install -@temporal-contract/contract` still resolves 7.x. Install explicitly: +The 8.0 line is published under the `beta` tag, so a plain +`npm install @temporal-contract/contract` still resolves 7.x. Install +explicitly: ```bash pnpm add @temporal-contract/contract@beta @temporal-contract/worker@beta \ @@ -31,7 +32,7 @@ pnpm add @temporal-contract/contract@beta \ @temporal-contract/worker@beta \ @temporal-contract/client@beta pnpm add -D @temporal-contract/testing@beta -pnpm add unthrown@^5.0.0-beta.6 +pnpm add unthrown@^5.0.0-beta.7 ``` If an intermediate beta had you install `ts-pattern` as a peer, remove it — @@ -222,7 +223,7 @@ const retryOnce: ClientInterceptor = (args, next) => ## Checklist - [ ] All four `@temporal-contract/*` packages on the same 8.0 version -- [ ] `unthrown` resolves to `^5.0.0-beta.6` +- [ ] `unthrown` resolves to `^5.0.0-beta.7` - [ ] `ts-pattern` removed if it was added for beta.5 - [ ] `mapErr` / `flatMapErr` / `tapErr` / `recoverErr` → `*Cases` - [ ] `match({ err })` → `match({ errCases })` diff --git a/packages/client/package.json b/packages/client/package.json index 126ec39..a1b3e28 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -77,7 +77,7 @@ "peerDependencies": { "@temporalio/client": "^1", "@temporalio/common": "^1", - "unthrown": "^5.0.0-beta.6" + "unthrown": "^5.0.0-beta.7" }, "engines": { "node": ">=22.19.0" diff --git a/packages/contract/package.json b/packages/contract/package.json index 3a4c311..ca5c434 100644 --- a/packages/contract/package.json +++ b/packages/contract/package.json @@ -87,7 +87,7 @@ "vitest": "catalog:" }, "peerDependencies": { - "unthrown": "^5.0.0-beta.6" + "unthrown": "^5.0.0-beta.7" }, "peerDependenciesMeta": { "unthrown": { diff --git a/packages/worker/package.json b/packages/worker/package.json index 7a03138..f8ad5ee 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -96,7 +96,7 @@ "@temporalio/common": "^1", "@temporalio/worker": "^1", "@temporalio/workflow": "^1", - "unthrown": "^5.0.0-beta.6" + "unthrown": "^5.0.0-beta.7" }, "engines": { "node": ">=22.19.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6aa7c9a..4ccfa82 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,8 +52,8 @@ catalogs: specifier: 26.1.1 version: 26.1.1 '@unthrown/vitest': - specifier: 5.0.0-beta.6 - version: 5.0.0-beta.6 + specifier: 5.0.0-beta.7 + version: 5.0.0-beta.7 '@vitest/coverage-v8': specifier: 4.1.10 version: 4.1.10 @@ -100,8 +100,8 @@ catalogs: specifier: 6.0.3 version: 6.0.3 unthrown: - specifier: 5.0.0-beta.6 - version: 5.0.0-beta.6 + specifier: 5.0.0-beta.7 + version: 5.0.0-beta.7 valibot: specifier: 1.4.2 version: 1.4.2 @@ -211,7 +211,7 @@ importers: version: 13.1.3 unthrown: specifier: 'catalog:' - version: 5.0.0-beta.6 + version: 5.0.0-beta.7 zod: specifier: 'catalog:' version: 4.4.3 @@ -273,7 +273,7 @@ importers: version: 13.1.3 unthrown: specifier: 'catalog:' - version: 5.0.0-beta.6 + version: 5.0.0-beta.7 zod: specifier: 'catalog:' version: 4.4.3 @@ -295,7 +295,7 @@ importers: version: 26.1.1 '@unthrown/vitest': specifier: 'catalog:' - version: 5.0.0-beta.6(unthrown@5.0.0-beta.6)(vitest@4.1.10) + version: 5.0.0-beta.7(unthrown@5.0.0-beta.7)(vitest@4.1.10) '@vitest/coverage-v8': specifier: 'catalog:' version: 4.1.10(vitest@4.1.10) @@ -344,7 +344,7 @@ importers: version: 26.1.1 '@unthrown/vitest': specifier: 'catalog:' - version: 5.0.0-beta.6(unthrown@5.0.0-beta.6)(vitest@4.1.10) + version: 5.0.0-beta.7(unthrown@5.0.0-beta.7)(vitest@4.1.10) '@vitest/coverage-v8': specifier: 'catalog:' version: 4.1.10(vitest@4.1.10) @@ -362,7 +362,7 @@ importers: version: 6.0.3 unthrown: specifier: 'catalog:' - version: 5.0.0-beta.6 + version: 5.0.0-beta.7 vitest: specifier: 'catalog:' version: 4.1.10(@types/node@26.1.1)(@vitest/coverage-v8@4.1.10)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0) @@ -390,7 +390,7 @@ importers: version: 26.1.1 '@unthrown/vitest': specifier: 'catalog:' - version: 5.0.0-beta.6(unthrown@5.0.0-beta.6)(vitest@4.1.10) + version: 5.0.0-beta.7(unthrown@5.0.0-beta.7)(vitest@4.1.10) '@vitest/coverage-v8': specifier: 'catalog:' version: 4.1.10(vitest@4.1.10) @@ -411,7 +411,7 @@ importers: version: 6.0.3 unthrown: specifier: 'catalog:' - version: 5.0.0-beta.6 + version: 5.0.0-beta.7 valibot: specifier: 'catalog:' version: 1.4.2(typescript@6.0.3) @@ -500,7 +500,7 @@ importers: version: 26.1.1 '@unthrown/vitest': specifier: 'catalog:' - version: 5.0.0-beta.6(unthrown@5.0.0-beta.6)(vitest@4.1.10) + version: 5.0.0-beta.7(unthrown@5.0.0-beta.7)(vitest@4.1.10) '@vitest/coverage-v8': specifier: 'catalog:' version: 4.1.10(vitest@4.1.10) @@ -518,7 +518,7 @@ importers: version: 6.0.3 unthrown: specifier: 'catalog:' - version: 5.0.0-beta.6 + version: 5.0.0-beta.7 vitest: specifier: 'catalog:' version: 4.1.10(@types/node@26.1.1)(@vitest/coverage-v8@4.1.10)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0) @@ -2520,11 +2520,11 @@ packages: '@ungap/structured-clone@1.3.1': resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} - '@unthrown/vitest@5.0.0-beta.6': - resolution: {integrity: sha512-FOByiJWRrqYYjP4Jtc1yz2KbR+R/Ra4xgKUJ3hbo5UzGxl4ngIEaYWA0WhQB4oNAgr9B0c7ZR6PC+D2dBlyYCQ==} + '@unthrown/vitest@5.0.0-beta.7': + resolution: {integrity: sha512-CXT3DwFc8b9Vj/NSF/0Tc7xlDi5syK9+2vVYWSf0U2lmt/Om2z7olP21e67mnvXVmdzEQ8+1RNSGSqRwCtPUOg==} engines: {node: '>=20'} peerDependencies: - unthrown: ^5.0.0-beta.6 + unthrown: ^5.0.0-beta.7 vitest: ^4 '@upsetjs/venn.js@2.0.0': @@ -4796,8 +4796,8 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - unthrown@5.0.0-beta.6: - resolution: {integrity: sha512-9100slIHO94qvPtCT9ISBpEXGOU8QN2amMtLCNBy6cVtGJQe7fwZHkSHsjPuNeqQGO/2MLFqRBJwSimAnceloA==} + unthrown@5.0.0-beta.7: + resolution: {integrity: sha512-/eLkvTAg21BwtCQydLLok2lWYTn0CwvU/QSxJ7ugacszL3GOjZEh/rvimAjlz5B7D47u3A55ZLykX06Zyp9TCg==} engines: {node: '>=20'} update-browserslist-db@1.2.3: @@ -6810,9 +6810,9 @@ snapshots: '@ungap/structured-clone@1.3.1': {} - '@unthrown/vitest@5.0.0-beta.6(unthrown@5.0.0-beta.6)(vitest@4.1.10)': + '@unthrown/vitest@5.0.0-beta.7(unthrown@5.0.0-beta.7)(vitest@4.1.10)': dependencies: - unthrown: 5.0.0-beta.6 + unthrown: 5.0.0-beta.7 vitest: 4.1.10(@types/node@26.1.1)(@vitest/coverage-v8@4.1.10)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0) '@upsetjs/venn.js@2.0.0': @@ -9201,7 +9201,7 @@ snapshots: universalify@0.1.2: {} - unthrown@5.0.0-beta.6: {} + unthrown@5.0.0-beta.7: {} update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 112b55b..c9199f8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -25,7 +25,7 @@ catalog: "@temporalio/worker": 1.20.3 "@temporalio/workflow": 1.20.3 "@types/node": 26.1.1 - "@unthrown/vitest": 5.0.0-beta.6 + "@unthrown/vitest": 5.0.0-beta.7 "@vitest/coverage-v8": 4.1.10 arktype: 2.2.3 knip: 6.27.0 @@ -41,7 +41,7 @@ catalog: typedoc: 0.28.20 typedoc-plugin-markdown: 4.12.0 typescript: 6.0.3 - unthrown: 5.0.0-beta.6 + unthrown: 5.0.0-beta.7 valibot: 1.4.2 vitest: 4.1.10 zod: 4.4.3