diff --git a/CHANGES.md b/CHANGES.md index e664af06e..9f6543c5b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,17 @@ Version 2.0.32 To be released. +### @fedify/cfworkers + + - Fixed npm refusing to install `@fedify/cfworkers` alongside + `@cloudflare/workers-types` 5.x, which recent versions of Wrangler + require, unless `--legacy-peer-deps` or an override was used. The peer + dependency on `@cloudflare/workers-types` now accepts both 4.x and 5.x, + so you can drop such workarounds. [[#1255], [#1260]] + +[#1255]: https://github.com/fedify-dev/fedify/issues/1255 +[#1260]: https://github.com/fedify-dev/fedify/pull/1260 + Version 2.0.31 -------------- diff --git a/changes.d/cfworkers/workers-types-v5.md b/changes.d/cfworkers/workers-types-v5.md new file mode 100644 index 000000000..a1a35b2f4 --- /dev/null +++ b/changes.d/cfworkers/workers-types-v5.md @@ -0,0 +1,10 @@ +--- +links: + '#1255': https://github.com/fedify-dev/fedify/issues/1255 + '#1260': https://github.com/fedify-dev/fedify/pull/1260 +--- + - Fixed npm refusing to install `@fedify/cfworkers` alongside + `@cloudflare/workers-types` 5.x, which recent versions of Wrangler + require, unless `--legacy-peer-deps` or an override was used. The peer + dependency on `@cloudflare/workers-types` now accepts both 4.x and 5.x, + so you can drop such workarounds. [[#1255], [#1260]] diff --git a/deno.lock b/deno.lock index c1a87db33..9b282795c 100644 --- a/deno.lock +++ b/deno.lock @@ -155,6 +155,7 @@ "npm:preact@^10.28.2": "10.29.7_preact-render-to-string@6.6.6", "npm:preact@^10.29.1": "10.29.7_preact-render-to-string@6.6.6", "npm:rollup@^4.50.0": "4.60.0", + "npm:semver@^7.7.2": "7.7.4", "npm:shiki@^1.6.4": "1.29.2", "npm:smol-toml@^1.6.0": "1.6.1", "npm:srvx@~0.8.7": "0.8.16", @@ -3594,6 +3595,7 @@ "natural-compare", "optionator" ], + "deprecated": true, "bin": true }, "esm-env@1.2.2": { @@ -5985,6 +5987,7 @@ "packageJson": { "dependencies": [ "npm:@cloudflare/vitest-pool-workers@~0.8.31", + "npm:semver@^7.7.2", "npm:vitest@3.2", "npm:wrangler@^4.21.1" ] diff --git a/packages/cfworkers/package.json b/packages/cfworkers/package.json index 4520ebd75..e03bc2ff7 100644 --- a/packages/cfworkers/package.json +++ b/packages/cfworkers/package.json @@ -52,10 +52,12 @@ ], "peerDependencies": { "@fedify/fedify": "workspace:^", - "@cloudflare/workers-types": "catalog:" + "@cloudflare/workers-types": "^4.20250906.0 || ^5.0.0" }, "devDependencies": { "@cloudflare/vitest-pool-workers": "^0.8.31", + "@cloudflare/workers-types": "catalog:", + "semver": "^7.7.2", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "~3.2.0", @@ -67,6 +69,6 @@ "prepack": "pnpm build", "prepublish": "pnpm build", "pretest": "pnpm build", - "test": "tsc -p test/typecheck/tsconfig.json --noEmit && vitest run" + "test": "tsc -p test/typecheck/tsconfig.json --noEmit && node --test test/peer-dependencies.check.mjs && vitest run" } } diff --git a/packages/cfworkers/test/peer-dependencies.check.mjs b/packages/cfworkers/test/peer-dependencies.check.mjs new file mode 100644 index 000000000..b6e2a50a3 --- /dev/null +++ b/packages/cfworkers/test/peer-dependencies.check.mjs @@ -0,0 +1,56 @@ +// Checks the published peer dependency range on `@cloudflare/workers-types`. +// npm refuses to install packages whose peer ranges do not overlap, so the +// range has to accept every major version users can reasonably install +// alongside current Wrangler releases. See also: +// https://github.com/fedify-dev/fedify/issues/1255 +import { ok } from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { test } from "node:test"; +import semver from "semver"; + +const PACKAGE_NAME = "@cloudflare/workers-types"; + +async function getPeerRange() { + const manifest = JSON.parse( + await readFile(new URL("../package.json", import.meta.url), "utf-8"), + ); + const range = manifest.peerDependencies[PACKAGE_NAME]; + if (range !== "catalog:") return range; + // pnpm replaces `catalog:` with the range from the default catalog when + // the package is published, so resolve it the same way: + const workspace = await readFile( + new URL("../../../pnpm-workspace.yaml", import.meta.url), + "utf-8", + ); + const pattern = new RegExp( + `^\\s+["']?${PACKAGE_NAME.replaceAll("/", "\\/")}["']?:\\s*(.+?)\\s*$`, + "m", + ); + const match = workspace.match(pattern); + ok(match != null, `${PACKAGE_NAME} is not found in the pnpm catalog.`); + return match[1].replace(/^(["'])(.*)\1$/, "$2"); +} + +test(`peer dependency on ${PACKAGE_NAME}`, async () => { + const range = await getPeerRange(); + ok(semver.validRange(range) != null, `Invalid range: ${range}`); + for ( + const version of [ + "4.20250906.0", // The minimum version that we support. + "4.20260702.1", // The last v4 release. + "5.20260703.1", // The first v5 release. + "5.20261006.1", + ] + ) { + ok( + semver.satisfies(version, range), + `${PACKAGE_NAME}@${version} should satisfy ${range}.`, + ); + } + for (const version of ["4.20250905.0", "6.0.0"]) { + ok( + !semver.satisfies(version, range), + `${PACKAGE_NAME}@${version} should not satisfy ${range}.`, + ); + } +}); diff --git a/packages/cfworkers/test/typecheck/workers-types.ts b/packages/cfworkers/test/typecheck/workers-types.ts new file mode 100644 index 000000000..32c0b6297 --- /dev/null +++ b/packages/cfworkers/test/typecheck/workers-types.ts @@ -0,0 +1,16 @@ +import type { KVNamespace, Queue } from "@cloudflare/workers-types"; +import type { KvStore, MessageQueue } from "@fedify/fedify/federation"; +import { WorkersKvStore, WorkersMessageQueue } from "../../dist/mod.js"; + +// Checks that the public API accepts the KV and Queue bindings declared by +// `@cloudflare/workers-types` itself, in addition to the `wrangler types` +// declarations covered by wrangler-generated-kv.ts. + +declare const kv: KVNamespace; +declare const queue: Queue; + +export const store: KvStore = new WorkersKvStore(kv); +export const mq: MessageQueue = new WorkersMessageQueue(queue); +export const orderedMq: MessageQueue = new WorkersMessageQueue(queue, { + orderingKv: kv, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ca0f995c..b4986aaf0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -335,7 +335,7 @@ importers: version: 1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(lightningcss@1.30.1)(postcss@8.5.6)(search-insights@2.17.3)(typescript@6.0.3) vitepress-plugin-group-icons: specifier: ^1.3.5 - version: 1.6.1(markdown-it@14.1.0)(vite@7.1.3(@types/node@22.19.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.1)) + version: 1.6.1(markdown-it@14.3.0)(vite@7.1.3(@types/node@22.19.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.1)) vitepress-plugin-llms: specifier: ^1.1.0 version: 1.6.0 @@ -727,9 +727,6 @@ importers: packages/cfworkers: dependencies: - '@cloudflare/workers-types': - specifier: 'catalog:' - version: 4.20251221.0 '@fedify/fedify': specifier: workspace:^ version: link:../fedify @@ -737,6 +734,12 @@ importers: '@cloudflare/vitest-pool-workers': specifier: ^0.8.31 version: 0.8.71(@cloudflare/workers-types@4.20251221.0)(@vitest/runner@3.2.4)(@vitest/snapshot@3.2.4)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.1)) + '@cloudflare/workers-types': + specifier: 'catalog:' + version: 4.20251221.0 + semver: + specifier: ^7.7.2 + version: 7.7.4 tsdown: specifier: 'catalog:' version: 0.21.6(typescript@6.0.3) @@ -8628,11 +8631,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -10051,7 +10049,7 @@ snapshots: cjs-module-lexer: 1.4.3 devalue: 5.6.1 miniflare: 4.20250906.0 - semver: 7.7.2 + semver: 7.7.4 vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.1) wrangler: 4.35.0(@cloudflare/workers-types@4.20251221.0) zod: 3.22.3 @@ -11682,7 +11680,7 @@ snapshots: '@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 forwarded-parse: 2.1.2 - semver: 7.7.2 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -11848,7 +11846,7 @@ snapshots: '@types/shimmer': 1.2.0 import-in-the-middle: 1.14.2 require-in-the-middle: 7.5.2 - semver: 7.7.2 + semver: 7.7.4 shimmer: 1.2.1 transitivePeerDependencies: - supports-color @@ -13170,7 +13168,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.4 ts-api-utils: 1.4.3(typescript@6.0.3) optionalDependencies: typescript: 6.0.3 @@ -13187,7 +13185,7 @@ snapshots: fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.4 ts-api-utils: 2.1.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -13203,7 +13201,7 @@ snapshots: fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.4 ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: @@ -13219,7 +13217,7 @@ snapshots: fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.4 ts-api-utils: 2.1.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -13233,7 +13231,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.50.0 debug: 4.4.1 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.1.0(typescript@6.0.3) typescript: 6.0.3 @@ -15030,7 +15028,7 @@ snapshots: postcss: 8.5.6 postcss-load-config: 3.1.4(postcss@8.5.6) postcss-safe-parser: 7.0.1(postcss@8.5.6) - semver: 7.7.2 + semver: 7.7.4 svelte-eslint-parser: 1.3.1(svelte@5.38.3) optionalDependencies: svelte: 5.38.3 @@ -15793,7 +15791,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.4 is-callable@1.2.7: {} @@ -17576,8 +17574,6 @@ snapshots: semver@6.3.1: {} - semver@7.7.2: {} - semver@7.7.4: {} send@0.19.0: @@ -17639,7 +17635,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.0.4 - semver: 7.7.2 + semver: 7.7.4 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -18568,12 +18564,12 @@ snapshots: optionalDependencies: vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.1) - vitepress-plugin-group-icons@1.6.1(markdown-it@14.1.0)(vite@7.1.3(@types/node@22.19.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.1)): + vitepress-plugin-group-icons@1.6.1(markdown-it@14.3.0)(vite@7.1.3(@types/node@22.19.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.1)): dependencies: '@iconify-json/logos': 1.2.4 '@iconify-json/vscode-icons': 1.2.23 '@iconify/utils': 2.3.0 - markdown-it: 14.1.0 + markdown-it: 14.3.0 vite: 7.1.3(@types/node@22.19.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color