From 971c3434c16a90202b8e76ea13a914c3805c6dbe Mon Sep 17 00:00:00 2001 From: Marco Pasqualetti Date: Tue, 11 Aug 2026 21:50:29 +0200 Subject: [PATCH 1/6] Handle new `tool` structure from `changesets@3` --- get-changed-packages.ts | 91 ++++++--- index.ts | 5 +- package.json | 10 +- pnpm-lock.yaml | 413 ++++++++++------------------------------ pnpm-workspace.yaml | 2 + test/index.test.ts | 119 ++++++++++++ 6 files changed, 291 insertions(+), 349 deletions(-) diff --git a/get-changed-packages.ts b/get-changed-packages.ts index dff58c2..5969f99 100644 --- a/get-changed-packages.ts +++ b/get-changed-packages.ts @@ -1,14 +1,15 @@ import nodePath from "path"; -import assembleReleasePlan from "@changesets/assemble-release-plan"; -import { parse as parseConfig } from "@changesets/config"; -import parseChangeset from "@changesets/parse"; +import { assembleReleasePlan } from "@changesets/assemble-release-plan"; +import { validateConfig } from "@changesets/config"; +import { parseChangesetFile } from "@changesets/parse"; import type { NewChangeset, + Package, + Packages, PreState, WrittenConfig, PackageJSON as ChangesetPackageJSON, } from "@changesets/types"; -import type { Packages, Tool } from "@manypkg/get-packages"; import jsYaml from "js-yaml"; import micromatch from "micromatch"; import type { ProbotOctokit } from "probot"; @@ -23,6 +24,14 @@ interface PnpmWorkspace { packages: ReadonlyArray; } +type ToolType = Packages["tool"]["type"]; + +/** + * `@changesets/config` reports validation issues instead of throwing, + * so we wrap them to be able to surface them in the PR comment. + */ +export class ConfigValidationError extends Error {} + // TODO: it might be possible to remove this if improvements to `Array.isArray` ever land // related thread: github.com/microsoft/TypeScript/issues/36554 function isArray( @@ -127,7 +136,7 @@ export const getChangedPackages = async ({ changesetPromises.push( fetchTextFile(item.path).then((text) => ({ - ...parseChangeset(text), + ...parseChangesetFile(text), id, })), ); @@ -135,7 +144,7 @@ export const getChangedPackages = async ({ } let tool: | { - tool: Tool; + type: ToolType; globs: ReadonlyArray; } | undefined; @@ -146,7 +155,7 @@ export const getChangedPackages = async ({ if (pnpmWorkspace.packages) { tool = { - tool: "pnpm", + type: "pnpm", globs: pnpmWorkspace.packages, }; } @@ -156,18 +165,18 @@ export const getChangedPackages = async ({ if (rootPackageJsonContent.workspaces) { if (isArray(rootPackageJsonContent.workspaces)) { tool = { - tool: "yarn", + type: "yarn", globs: rootPackageJsonContent.workspaces, }; } else { tool = { - tool: "yarn", + type: "yarn", globs: rootPackageJsonContent.workspaces.packages, }; } } else if (rootPackageJsonContent.bolt && rootPackageJsonContent.bolt.workspaces) { tool = { - tool: "bolt", + type: "bolt", globs: rootPackageJsonContent.bolt.workspaces, }; } @@ -175,12 +184,15 @@ export const getChangedPackages = async ({ const rootPackageJsonContent = await rootPackageJsonContentsPromise; + const rootPackage: Package = { + dir: "/", + packageJson: rootPackageJsonContent, + }; + const packages: Packages = { - root: { - dir: "/", - packageJson: rootPackageJsonContent, - }, - tool: tool ? tool.tool : "root", + rootDir: "/", + rootPackage, + tool: { type: tool ? tool.type : "root" }, packages: [], }; @@ -195,26 +207,59 @@ export const getChangedPackages = async ({ packages.packages = await Promise.all(matches.map((dir) => getPackage(dir))); } else { - packages.packages.push(packages.root); + packages.packages.push(rootPackage); } if (hasErrored) { throw new Error("an error occurred when fetching files"); } + const rawConfig = await rawConfigPromise; + + const configResult = validateConfig( + { + ...rawConfig, + // `@changesets/config@4` defaults `privatePackages.version` to `false`, + // while previous versions defaulted it to `true`. + // Repositories that don't opt in explicitly would silently stop seeing their private packages reported, + // so the previous default is restored here. + privatePackages: + typeof rawConfig.privatePackages === "object" + ? { version: true, ...rawConfig.privatePackages } + : (rawConfig.privatePackages ?? { version: true }), + }, + packages, + ); + + for (const warning of configResult.warnings) { + console.warn(warning); + } + + if (configResult.errors) { + throw new ConfigValidationError( + "Some errors occurred when validating the changesets config:\n" + + configResult.errors.join("\n"), + ); + } + const releasePlan = assembleReleasePlan( await Promise.all(changesetPromises), packages, - parseConfig(await rawConfigPromise, packages), + configResult.config, await preStatePromise, ); - return { - changedPackages: (packages.tool === "root" + const containsChangedFile = (pkg: Package) => + changedFiles.some((changedFile) => changedFile.startsWith(`${pkg.dir}/`)); + + // A root-only project has a single package covering the whole repository, + // so there is no directory to narrow the changed files down to. + const changedPackages = + packages.tool.type === "root" ? packages.packages - : packages.packages.filter((pkg) => - changedFiles.some((changedFile) => changedFile.startsWith(`${pkg.dir}/`)), - ) - ).map((pkg) => pkg.packageJson.name), + : packages.packages.filter(containsChangedFile); + + return { + changedPackages: changedPackages.map((pkg) => pkg.packageJson.name), releasePlan, }; }; diff --git a/index.ts b/index.ts index 4b72cff..112880e 100644 --- a/index.ts +++ b/index.ts @@ -1,11 +1,10 @@ -import { ValidationError } from "@changesets/errors"; import type { ReleasePlan, ComprehensiveRelease, VersionType } from "@changesets/types"; import type { EmitterWebhookEvent } from "@octokit/webhooks"; import { captureException } from "@sentry/node"; import { humanId } from "human-id"; import markdownTable from "markdown-table"; import type { Probot, Context } from "probot"; -import { getChangedPackages } from "./get-changed-packages.ts"; +import { ConfigValidationError, getChangedPackages } from "./get-changed-packages.ts"; import { isChangeset } from "./is-changeset.ts"; const getReleasePlanMessage = (releasePlan: ReleasePlan | null) => { @@ -163,7 +162,7 @@ export default (app: Probot) => { }) ).data.token, }).catch((err) => { - if (err instanceof ValidationError) { + if (err instanceof ConfigValidationError) { errFromFetchingChangedFiles = `
💥 An error occurred when fetching the changed packages and changesets in this PR\n\n\`\`\`\n${err.message}\n\`\`\`\n\n
\n`; } else { console.error(err); diff --git a/package.json b/package.json index 9c47aac..4eb2696 100644 --- a/package.json +++ b/package.json @@ -18,12 +18,10 @@ "test": "vitest" }, "dependencies": { - "@changesets/assemble-release-plan": "^6.0.2", - "@changesets/config": "^3.0.1", - "@changesets/errors": "^0.2.0", - "@changesets/parse": "^0.4.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", + "@changesets/assemble-release-plan": "^7.0.0", + "@changesets/config": "^4.0.0", + "@changesets/parse": "^1.0.0", + "@changesets/types": "^7.0.0", "@octokit/webhooks": "^9.8.4", "@sentry/node": "^6.0.0", "@types/js-yaml": "^3.12.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7d6aaa..3dd6cbe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,23 +10,17 @@ importers: .: dependencies: '@changesets/assemble-release-plan': - specifier: ^6.0.2 - version: 6.0.10 + specifier: ^7.0.0 + version: 7.0.0 '@changesets/config': - specifier: ^3.0.1 - version: 3.1.4 - '@changesets/errors': - specifier: ^0.2.0 - version: 0.2.0 + specifier: ^4.0.0 + version: 4.0.0 '@changesets/parse': - specifier: ^0.4.0 - version: 0.4.3 + specifier: ^1.0.0 + version: 1.0.0 '@changesets/types': - specifier: ^6.0.0 - version: 6.1.0 - '@manypkg/get-packages': - specifier: ^1.1.3 - version: 1.1.3 + specifier: ^7.0.0 + version: 7.0.0 '@octokit/webhooks': specifier: ^9.8.4 version: 9.26.3 @@ -81,43 +75,40 @@ importers: version: 0.19.0 vite: specifier: ^8.0.3 - version: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) + version: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.9.0) vitest: specifier: ^4.1.2 version: 4.1.5(@types/node@25.6.2)(msw@2.14.5)(vite@8.0.11) packages: - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@changesets/assemble-release-plan@6.0.10': - resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} - - '@changesets/config@3.1.4': - resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} + '@changesets/assemble-release-plan@7.0.0': + resolution: {integrity: sha512-oEW8BxdA604kGGtDSCiHr5w9Tv4UWe9I2k61IBNZzCOE1kbYaJj4v+lFQNgcEZFkUc2pV/+hASErGDvpJOZCTg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + '@changesets/config@4.0.0': + resolution: {integrity: sha512-mw95/YrkOuhZZxfnVAA4bSXOFUi+KlhzOBTM8C4x777NhUU6HWIl9Z+K+nME+E4PVsv5NQVQwTfiHihAS1A/ow==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-dependents-graph@2.1.4': - resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} + '@changesets/errors@1.0.0': + resolution: {integrity: sha512-ElN/mEzn6zmETgjwf5MclCMa9ef59sAR0lfO8VSYIsiRvbC2FbLB/92EoYw10Sl0kGixxHFiJZUSv7dA+YpR8g==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + '@changesets/get-dependents-graph@3.0.0': + resolution: {integrity: sha512-ji/t5wFA1zREKXRUePE6Qi+Qu2UgxCeSSGQrphezwvQZrp49B7sJ+8+wvM0tA7zPeSxYKCojDy3WWgrl+s+awg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/parse@0.4.3': - resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + '@changesets/parse@1.0.0': + resolution: {integrity: sha512-P0iaMb9p9CRYZiTgAllEIF9AUMQHIy1G72tKlcIqJp61icZSsKQNiOPdxAMZG8m/DvZwt/oz5xEbTpike//dWg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + '@changesets/should-skip-package@1.0.0': + resolution: {integrity: sha512-pwqoJmbONn1XgXmZXPEExgAaT+HdZLjALFTDgIm+PnS5KeO2nLtzA2/Q+4aMFY14kFMuXKG30MObhvDzWgzDgg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - - '@changesets/types@6.1.0': - resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + '@changesets/types@7.0.0': + resolution: {integrity: sha512-c5GoiQyt3pxiXjrWSNoP8/GRf4kG+VnKzovx1OQM8dYYALlSwgedmkPmJ+ZqGxqwg9D3Bkj85Uo4KLd5BN3A0w==} + engines: {node: ^22.11 || ^24 || >=26} '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -172,11 +163,17 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + '@manypkg/find-root@3.1.0': + resolution: {integrity: sha512-BcSqCyKhBVZ5YkSzOiheMCV41kqAFptW6xGqYSTjkVTl9XQpr+pqHhwgGCOHQtjDCv7Is6EFyA14Sm5GVbVABA==} + engines: {node: '>=20.0.0'} + + '@manypkg/get-packages@3.1.0': + resolution: {integrity: sha512-0TbBVyvPrP7xGYBI/cP8UP+yl/z+HtbTttAD7FMAJgn/kXOTwh5/60TsqP9ZYY710forNfyV0N8P/IE/ujGZJg==} + engines: {node: '>=20.0.0'} - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@manypkg/tools@2.1.2': + resolution: {integrity: sha512-6QEf6yqFbETdwGITKq57aYoPfX/3K8XFNwsAlx0C1M7o8cb79sv1M3w+tWuWvIcSbNqrLF7OD7YpZMVVz335hQ==} + engines: {node: '>=20.0.0'} '@mswjs/interceptors@0.41.8': resolution: {integrity: sha512-pRLMNKTSGRoLq+KnEB/7OY5vijw1XmcheAAOiv6pj7W1FG32kAGqj1C/RK/cqxRGr1Fh+zBi8sDur8kj3EQv6A==} @@ -188,18 +185,6 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - '@octokit/auth-app@4.0.13': resolution: {integrity: sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg==} engines: {node: '>= 14'} @@ -1052,9 +1037,6 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@25.6.2': resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} @@ -1159,10 +1141,6 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1329,10 +1307,6 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dotenv@8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} @@ -1414,16 +1388,9 @@ packages: resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} - extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - fast-copy@4.0.3: resolution: {integrity: sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-redact@3.5.0: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} @@ -1443,9 +1410,6 @@ packages: fast-wrap-ansi@0.2.0: resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fd-package-json@2.0.0: resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} @@ -1470,10 +1434,6 @@ packages: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - flatstr@1.0.12: resolution: {integrity: sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==} @@ -1490,14 +1450,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1524,19 +1476,11 @@ packages: get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1587,10 +1531,6 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -1620,18 +1560,10 @@ packages: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} @@ -1647,6 +1579,9 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + jmespath@0.15.0: resolution: {integrity: sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w==} engines: {node: '>= 0.6.0'} @@ -1666,9 +1601,6 @@ packages: json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonwebtoken@9.0.3: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} @@ -1776,10 +1708,6 @@ packages: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -1838,10 +1766,6 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -1975,10 +1899,6 @@ packages: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -1999,10 +1919,6 @@ packages: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -2012,10 +1928,6 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -2095,9 +2007,6 @@ packages: resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -2109,10 +2018,6 @@ packages: resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -2144,10 +2049,6 @@ packages: rettime@0.11.11: resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -2156,9 +2057,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -2173,6 +2071,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.2: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} @@ -2210,10 +2113,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - smol-toml@1.6.1: resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} engines: {node: '>= 18'} @@ -2378,10 +2277,6 @@ packages: universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -2531,6 +2426,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -2544,56 +2444,39 @@ packages: snapshots: - '@babel/runtime@7.29.2': {} - - '@changesets/assemble-release-plan@6.0.10': + '@changesets/assemble-release-plan@7.0.0': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.4 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.7.4 - - '@changesets/config@3.1.4': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.4 - '@changesets/logger': 0.1.1 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 + '@changesets/errors': 1.0.0 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + semver: 7.8.5 - '@changesets/errors@0.2.0': + '@changesets/config@4.0.0': dependencies: - extendable-error: 0.1.7 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + picomatch: 4.0.4 - '@changesets/get-dependents-graph@2.1.4': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.7.4 + '@changesets/errors@1.0.0': {} - '@changesets/logger@0.1.1': + '@changesets/get-dependents-graph@3.0.0': dependencies: - picocolors: 1.1.1 + '@changesets/types': 7.0.0 + semver: 7.8.5 - '@changesets/parse@0.4.3': + '@changesets/parse@1.0.0': dependencies: - '@changesets/types': 6.1.0 - js-yaml: 4.1.1 + '@changesets/types': 7.0.0 + yaml: 2.9.0 - '@changesets/should-skip-package@0.1.2': + '@changesets/should-skip-package@1.0.0': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@changesets/types': 7.0.0 - '@changesets/types@4.1.0': {} - - '@changesets/types@6.1.0': {} + '@changesets/types@7.0.0': {} '@emnapi/core@1.10.0': dependencies: @@ -2644,21 +2527,20 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} - '@manypkg/find-root@1.1.0': + '@manypkg/find-root@3.1.0': + dependencies: + '@manypkg/tools': 2.1.2 + + '@manypkg/get-packages@3.1.0': dependencies: - '@babel/runtime': 7.29.2 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 + '@manypkg/find-root': 3.1.0 + '@manypkg/tools': 2.1.2 - '@manypkg/get-packages@1.1.3': + '@manypkg/tools@2.1.2': dependencies: - '@babel/runtime': 7.29.2 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 + jju: 1.4.0 + tinyglobby: 0.2.16 + yaml: 2.9.0 '@mswjs/interceptors@0.41.8': dependencies: @@ -2676,18 +2558,6 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - '@octokit/auth-app@4.0.13': dependencies: '@octokit/auth-oauth-app': 5.0.6 @@ -3360,8 +3230,6 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@12.20.55': {} - '@types/node@25.6.2': dependencies: undici-types: 7.19.2 @@ -3426,7 +3294,7 @@ snapshots: magic-string: 0.30.21 optionalDependencies: msw: 2.14.5(@types/node@25.6.2)(typescript@6.0.3) - vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) + vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.5': dependencies: @@ -3493,8 +3361,6 @@ snapshots: array-flatten@1.1.1: {} - array-union@2.1.0: {} - assertion-error@2.0.1: {} atomic-sleep@1.0.0: {} @@ -3624,10 +3490,6 @@ snapshots: detect-libc@2.1.2: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dotenv@8.6.0: {} dunder-proto@1.0.1: @@ -3724,18 +3586,8 @@ snapshots: transitivePeerDependencies: - supports-color - extendable-error@0.1.7: {} - fast-copy@4.0.3: {} - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-redact@3.5.0: {} fast-safe-stringify@2.1.1: {} @@ -3754,10 +3606,6 @@ snapshots: dependencies: fast-string-width: 3.0.2 - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - fd-package-json@2.0.0: dependencies: walk-up-path: 4.0.0 @@ -3786,11 +3634,6 @@ snapshots: dependencies: locate-path: 3.0.0 - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - flatstr@1.0.12: {} formatly@0.3.0: @@ -3801,18 +3644,6 @@ snapshots: fresh@0.5.2: {} - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -3844,10 +3675,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob@8.1.0: dependencies: fs.realpath: 1.0.0 @@ -3856,15 +3683,6 @@ snapshots: minimatch: 5.1.9 once: 1.4.0 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -3916,8 +3734,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ignore@5.3.2: {} - immediate@3.0.6: {} indent-string@4.0.0: {} @@ -3953,14 +3769,8 @@ snapshots: dependencies: hasown: 2.0.3 - is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - is-node-process@1.2.0: {} is-number@7.0.0: {} @@ -3969,6 +3779,8 @@ snapshots: jiti@2.7.0: {} + jju@1.4.0: {} + jmespath@0.15.0: {} joycon@3.1.1: {} @@ -3984,10 +3796,6 @@ snapshots: json-parse-better-errors@1.0.2: {} - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - jsonwebtoken@9.0.3: dependencies: jws: 4.0.1 @@ -4104,10 +3912,6 @@ snapshots: p-locate: 3.0.0 path-exists: 3.0.0 - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - lodash.defaults@4.2.0: {} lodash.flatten@4.4.0: {} @@ -4150,8 +3954,6 @@ snapshots: merge-descriptors@1.0.3: {} - merge2@1.4.1: {} - methods@1.1.2: {} micromatch@4.0.8: @@ -4357,10 +4159,6 @@ snapshots: dependencies: p-limit: 2.3.0 - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - p-map@2.1.0: {} p-try@2.2.0: {} @@ -4374,16 +4172,12 @@ snapshots: path-exists@3.0.0: {} - path-exists@4.0.0: {} - path-parse@1.0.7: {} path-to-regexp@0.1.13: {} path-to-regexp@6.3.0: {} - path-type@4.0.0: {} - pathe@2.0.3: {} picocolors@1.1.1: {} @@ -4523,8 +4317,6 @@ snapshots: dependencies: side-channel: 1.1.0 - queue-microtask@1.2.3: {} - quick-format-unescaped@4.0.4: {} range-parser@1.2.1: {} @@ -4536,13 +4328,6 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - read-yaml-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.2 - pify: 4.0.1 - strip-bom: 3.0.0 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -4570,8 +4355,6 @@ snapshots: rettime@0.11.11: {} - reusify@1.1.0: {} - rfdc@1.4.1: {} rolldown@1.0.0-rc.18: @@ -4595,10 +4378,6 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - safe-buffer@5.2.1: {} safer-buffer@2.1.2: {} @@ -4607,6 +4386,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.5: {} + send@0.19.2: dependencies: debug: 2.6.9 @@ -4670,8 +4451,6 @@ snapshots: signal-exit@4.1.0: {} - slash@3.0.0: {} - smol-toml@1.6.1: {} sonic-boom@1.4.1: @@ -4800,8 +4579,6 @@ snapshots: universal-user-agent@6.0.1: {} - universalify@0.1.2: {} - unpipe@1.0.0: {} until-async@3.0.2: {} @@ -4818,7 +4595,7 @@ snapshots: vary@1.1.2: {} - vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4): + vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -4829,7 +4606,7 @@ snapshots: '@types/node': 25.6.2 fsevents: 2.3.3 jiti: 2.7.0 - yaml: 2.8.4 + yaml: 2.9.0 vitest@4.1.5(@types/node@25.6.2)(msw@2.14.5)(vite@8.0.11): dependencies: @@ -4851,7 +4628,7 @@ snapshots: tinyexec: 1.1.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) + vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.6.2 @@ -4888,6 +4665,8 @@ snapshots: yaml@2.8.4: {} + yaml@2.9.0: {} + yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c761d99..1652e66 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,6 +13,8 @@ blockExoticSubdeps: true dedupePeers: true dedupePeerDependents: true minimumReleaseAge: 10080 +minimumReleaseAgeExclude: + - "@changesets/*" shellEmulator: true trustPolicy: no-downgrade - "probot@12.4.0" diff --git a/test/index.test.ts b/test/index.test.ts index 25794f5..0070616 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -812,6 +812,125 @@ add feature `); }); + it("shows release details for private packages when the config doesn't opt in", async ({ + expect, + task, + }) => { + const probot = setupProbot(task.id); + const { requests } = usePrState(server, { + files: { + ...baseFiles, + ".changeset/abc123.md": [ + { + status: "added", + }, + `--- +"pkg-private": patch +--- + +add feature +`, + ], + "packages/private/package.json": JSON.stringify({ + name: "pkg-private", + version: "1.0.0", + private: true, + }), + }, + comments: [], + }); + + await probot.receive({ + name: "pull_request", + payload: pullRequestOpen, + } as never); + + const commentRequests = requests.filter((request) => request.path.includes("/comments")); + + expect(commentRequests).toMatchInlineSnapshot(` + [ + { + "body": { + "body": "### 🦋 Changeset detected + + Latest commit: c4d7edfd758bd44f7d4264fb55f6033f56d79540 + + **The changes in this PR will be included in the next version bump.** + +
This PR includes changesets to release 1 package + + | Name | Type | + | ----------- | ----- | + | pkg-private | Patch | + +
+ + Not sure what this means? [Click here to learn what changesets are](https://changesets.dev/faq). + + [Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/changesets/bot/new/test?filename=.changeset/.md&value=---%0A%0A---%0A%0Athing%0A) + + ", + }, + "method": "POST", + "path": "/repos/changesets/bot/issues/2/comments", + }, + ] + `); + }); + + it("reports changesets config validation errors in the comment", async ({ expect, task }) => { + const probot = setupProbot(task.id); + const { requests } = usePrState(server, { + files: { + ".changeset/config.json": JSON.stringify({ access: "kinda-public" }), + "package.json": JSON.stringify({ + name: "root-package", + }), + "src/index.ts": [{ status: "added" }, "export {};"], + }, + comments: [], + }); + + await probot.receive({ + name: "pull_request", + payload: pullRequestOpen, + } as never); + + const commentRequests = requests.filter((request) => request.path.includes("/comments")); + + expect(commentRequests).toMatchInlineSnapshot(` + [ + { + "body": { + "body": "### ⚠️ No Changeset found + + Latest commit: c4d7edfd758bd44f7d4264fb55f6033f56d79540 + + Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. **If these changes should result in a version bump, you need to add a changeset.** + + + + [Click here to learn what changesets are, and how to add one](https://changesets.dev/faq). + + [Click here if you're a maintainer who wants to add a changeset to this PR](https://github.com/changesets/bot/new/test?filename=.changeset/.md&value=---%0A%22%40fake-scope%2Ffake-pkg%22%3A%20patch%0A---%0A%0Athing%0A) + +
💥 An error occurred when fetching the changed packages and changesets in this PR + + \`\`\` + Some errors occurred when validating the changesets config: + access: Invalid type: Expected ("public" | "restricted") but received "kinda-public" + \`\`\` + +
+ ", + }, + "method": "POST", + "path": "/repos/changesets/bot/issues/2/comments", + }, + ] + `); + }); + it("shouldn't add a comment to a release pull request", async ({ expect, task }) => { const probot = setupProbot(task.id); const { requests } = usePrState(server, { From f9123cd5060de86930c8acc177767b312ae1956d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Mon, 31 Aug 2026 15:54:17 +0200 Subject: [PATCH 2/6] Report malformed changeset errors --- get-changed-packages.ts | 25 +++++++++++++++---------- index.ts | 4 ++-- test/index.test.ts | 30 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/get-changed-packages.ts b/get-changed-packages.ts index 5969f99..007cc55 100644 --- a/get-changed-packages.ts +++ b/get-changed-packages.ts @@ -26,11 +26,8 @@ interface PnpmWorkspace { type ToolType = Packages["tool"]["type"]; -/** - * `@changesets/config` reports validation issues instead of throwing, - * so we wrap them to be able to surface them in the PR comment. - */ -export class ConfigValidationError extends Error {} +/** Expected validation failures that should be surfaced in the PR comment. */ +export class UserValidationError extends Error {} // TODO: it might be possible to remove this if improvements to `Array.isArray` ever land // related thread: github.com/microsoft/TypeScript/issues/36554 @@ -135,10 +132,18 @@ export const getChangedPackages = async ({ const id = res[1]; changesetPromises.push( - fetchTextFile(item.path).then((text) => ({ - ...parseChangesetFile(text), - id, - })), + fetchTextFile(item.path).then((text) => { + try { + return { + ...parseChangesetFile(text), + id, + }; + } catch (error) { + throw new UserValidationError(Error.isError(error) ? error.message : String(error), { + cause: error, + }); + } + }), ); } } @@ -235,7 +240,7 @@ export const getChangedPackages = async ({ } if (configResult.errors) { - throw new ConfigValidationError( + throw new UserValidationError( "Some errors occurred when validating the changesets config:\n" + configResult.errors.join("\n"), ); diff --git a/index.ts b/index.ts index 112880e..dabb9ef 100644 --- a/index.ts +++ b/index.ts @@ -4,7 +4,7 @@ import { captureException } from "@sentry/node"; import { humanId } from "human-id"; import markdownTable from "markdown-table"; import type { Probot, Context } from "probot"; -import { ConfigValidationError, getChangedPackages } from "./get-changed-packages.ts"; +import { getChangedPackages, UserValidationError } from "./get-changed-packages.ts"; import { isChangeset } from "./is-changeset.ts"; const getReleasePlanMessage = (releasePlan: ReleasePlan | null) => { @@ -162,7 +162,7 @@ export default (app: Probot) => { }) ).data.token, }).catch((err) => { - if (err instanceof ConfigValidationError) { + if (err instanceof UserValidationError) { errFromFetchingChangedFiles = `
💥 An error occurred when fetching the changed packages and changesets in this PR\n\n\`\`\`\n${err.message}\n\`\`\`\n\n
\n`; } else { console.error(err); diff --git a/test/index.test.ts b/test/index.test.ts index 0070616..ba2af22 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -931,6 +931,36 @@ add feature `); }); + it("reports malformed changeset errors in the comment", async ({ expect, task }) => { + const probot = setupProbot(task.id); + const { requests } = usePrState(server, { + files: { + ...baseFiles, + ".changeset/malformed.md": [{ status: "added" }, "not a valid changeset"], + }, + comments: [], + }); + + await probot.receive({ + name: "pull_request", + payload: pullRequestOpen, + } as never); + + const commentRequests = requests.filter((request) => request.path.includes("/comments")); + + assert.equal(commentRequests.length, 1); + const commentBody = commentRequests[0].body; + assert.ok( + commentBody && + typeof commentBody === "object" && + "body" in commentBody && + typeof commentBody.body === "string", + ); + expect(commentBody.body).toContain( + "could not parse changeset - missing or invalid frontmatter.", + ); + }); + it("shouldn't add a comment to a release pull request", async ({ expect, task }) => { const probot = setupProbot(task.id); const { requests } = usePrState(server, { From 5a147e1b841fecff5fbc294e8245065330ac409f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 1 Sep 2026 11:31:00 +0200 Subject: [PATCH 3/6] Respect the project Changesets version --- get-changed-packages.ts | 72 ++++++++++++++++++++++++++++++++++------- package.json | 2 ++ pnpm-lock.yaml | 23 +++++++------ test/index.test.ts | 9 ++++-- 4 files changed, 84 insertions(+), 22 deletions(-) diff --git a/get-changed-packages.ts b/get-changed-packages.ts index 007cc55..385e9ca 100644 --- a/get-changed-packages.ts +++ b/get-changed-packages.ts @@ -13,6 +13,7 @@ import type { import jsYaml from "js-yaml"; import micromatch from "micromatch"; import type { ProbotOctokit } from "probot"; +import { subset, validRange } from "semver"; import { isChangeset } from "./is-changeset.ts"; interface PackageJSON extends ChangesetPackageJSON { @@ -29,6 +30,65 @@ type ToolType = Packages["tool"]["type"]; /** Expected validation failures that should be surfaced in the PR comment. */ export class UserValidationError extends Error {} +const changesetsV2Range = ">=2.0.0 <3.0.0"; + +function usesChangesetsV2(packageJson: PackageJSON) { + const declaredVersion = + packageJson.devDependencies?.["@changesets/cli"] ?? + packageJson.dependencies?.["@changesets/cli"]; + if (declaredVersion === undefined) { + return false; + } + + const range = validRange(declaredVersion); + return range !== null && subset(range, changesetsV2Range); +} + +function getReleasePlanConfig( + rawConfig: WrittenConfig & { prettier?: unknown }, + useChangesetsV2Defaults: boolean, +): WrittenConfig { + // The bot only calculates a release plan, so options used exclusively for formatting, + // writing files, Git comparisons, publishing, and snapshots are intentionally ignored. + const { + access: _access, + baseBranch: _baseBranch, + changedFilePatterns: _changedFilePatterns, + changelog: _changelog, + commit: _commit, + format: _format, + prettier: _prettier, + snapshot: _snapshot, + ...releasePlanConfig + } = rawConfig; + + if (!useChangesetsV2Defaults) { + return releasePlanConfig; + } + + const privatePackages = rawConfig.privatePackages; + if (privatePackages === undefined) { + return { ...releasePlanConfig, privatePackages: { version: true } }; + } + if (privatePackages === true) { + throw new UserValidationError( + "The `privatePackages` option can only be `false` or an object when using Changesets v2.", + ); + } + if ( + typeof privatePackages === "object" && + privatePackages !== null && + !Array.isArray(privatePackages) && + privatePackages.version === undefined + ) { + return { + ...releasePlanConfig, + privatePackages: { version: true, ...privatePackages }, + }; + } + return releasePlanConfig; +} + // TODO: it might be possible to remove this if improvements to `Array.isArray` ever land // related thread: github.com/microsoft/TypeScript/issues/36554 function isArray( @@ -221,17 +281,7 @@ export const getChangedPackages = async ({ const rawConfig = await rawConfigPromise; const configResult = validateConfig( - { - ...rawConfig, - // `@changesets/config@4` defaults `privatePackages.version` to `false`, - // while previous versions defaulted it to `true`. - // Repositories that don't opt in explicitly would silently stop seeing their private packages reported, - // so the previous default is restored here. - privatePackages: - typeof rawConfig.privatePackages === "object" - ? { version: true, ...rawConfig.privatePackages } - : (rawConfig.privatePackages ?? { version: true }), - }, + getReleasePlanConfig(rawConfig, usesChangesetsV2(rootPackageJsonContent)), packages, ); diff --git a/package.json b/package.json index 4eb2696..108bebe 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,11 @@ "markdown-table": "^2.0.0", "micromatch": "^4.0.2", "probot": "^12.2.4", + "semver": "^7.8.5", "typescript": "^6.0.2" }, "devDependencies": { + "@types/semver": "^7.8.0", "knip": "^6.11.0", "msw": "^2.12.14", "oxfmt": "^0.42.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3dd6cbe..e330aa0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,10 +54,16 @@ importers: probot: specifier: ^12.2.4 version: 12.4.0 + semver: + specifier: ^7.8.5 + version: 7.8.5 typescript: specifier: ^6.0.2 version: 6.0.3 devDependencies: + '@types/semver': + specifier: ^7.8.0 + version: 7.8.0 knip: specifier: ^6.11.0 version: 6.12.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) @@ -291,6 +297,7 @@ packages: '@octokit/webhooks-types@5.8.0': resolution: {integrity: sha512-8adktjIb76A7viIdayQSFuBEwOzwhDC+9yxZpKNHjfzrlostHCw0/N7JWpWMObfElwvJMk2fY2l1noENCk9wmw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@octokit/webhooks@9.26.3': resolution: {integrity: sha512-DLGk+gzeVq5oK89Bo601txYmyrelMQ7Fi5EnjHE0Xs8CWicy2xkmnJMKptKJrBJpstqbd/9oeDFi/Zj2pudBDQ==} @@ -1060,6 +1067,9 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/semver@7.8.0': + resolution: {integrity: sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==} + '@types/send@0.17.6': resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} @@ -2066,11 +2076,6 @@ packages: secure-json-parse@4.1.0: resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -3257,6 +3262,8 @@ snapshots: '@types/range-parser@1.2.7': {} + '@types/semver@7.8.0': {} + '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 @@ -3807,7 +3814,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.4 + semver: 7.8.5 jwa@2.0.1: dependencies: @@ -4288,7 +4295,7 @@ snapshots: pino-http: 5.8.0 pkg-conf: 3.1.0 resolve: 1.22.12 - semver: 7.7.4 + semver: 7.8.5 update-dotenv: 1.1.1(dotenv@8.6.0) uuid: 8.3.2 transitivePeerDependencies: @@ -4384,8 +4391,6 @@ snapshots: secure-json-parse@4.1.0: {} - semver@7.7.4: {} - semver@7.8.5: {} send@0.19.2: diff --git a/test/index.test.ts b/test/index.test.ts index ba2af22..c3f8895 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -820,6 +820,11 @@ add feature const { requests } = usePrState(server, { files: { ...baseFiles, + "package.json": JSON.stringify({ + name: "test", + workspaces: ["packages/*"], + devDependencies: { "@changesets/cli": "^2.29.0" }, + }), ".changeset/abc123.md": [ { status: "added", @@ -882,7 +887,7 @@ add feature const probot = setupProbot(task.id); const { requests } = usePrState(server, { files: { - ".changeset/config.json": JSON.stringify({ access: "kinda-public" }), + ".changeset/config.json": JSON.stringify({ ignore: "pkg-a" }), "package.json": JSON.stringify({ name: "root-package", }), @@ -918,7 +923,7 @@ add feature \`\`\` Some errors occurred when validating the changesets config: - access: Invalid type: Expected ("public" | "restricted") but received "kinda-public" + ignore: Invalid type: Expected Array but received "pkg-a" \`\`\` From 0616b9bdeed07491508a9f17f26388cc790aede9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 1 Sep 2026 11:50:46 +0200 Subject: [PATCH 4/6] Clean up Changesets compatibility handling --- get-changed-packages.ts | 29 +++++++---------------------- is-changesets-v2-range.ts | 13 +++++++++++++ pnpm-workspace.yaml | 2 -- 3 files changed, 20 insertions(+), 24 deletions(-) create mode 100644 is-changesets-v2-range.ts diff --git a/get-changed-packages.ts b/get-changed-packages.ts index 385e9ca..d4c6147 100644 --- a/get-changed-packages.ts +++ b/get-changed-packages.ts @@ -13,8 +13,8 @@ import type { import jsYaml from "js-yaml"; import micromatch from "micromatch"; import type { ProbotOctokit } from "probot"; -import { subset, validRange } from "semver"; import { isChangeset } from "./is-changeset.ts"; +import { isChangesetsV2Range } from "./is-changesets-v2-range.ts"; interface PackageJSON extends ChangesetPackageJSON { workspaces?: ReadonlyArray | { packages: ReadonlyArray }; @@ -30,23 +30,9 @@ type ToolType = Packages["tool"]["type"]; /** Expected validation failures that should be surfaced in the PR comment. */ export class UserValidationError extends Error {} -const changesetsV2Range = ">=2.0.0 <3.0.0"; - -function usesChangesetsV2(packageJson: PackageJSON) { - const declaredVersion = - packageJson.devDependencies?.["@changesets/cli"] ?? - packageJson.dependencies?.["@changesets/cli"]; - if (declaredVersion === undefined) { - return false; - } - - const range = validRange(declaredVersion); - return range !== null && subset(range, changesetsV2Range); -} - function getReleasePlanConfig( rawConfig: WrittenConfig & { prettier?: unknown }, - useChangesetsV2Defaults: boolean, + rootPackageJsonContent: PackageJSON, ): WrittenConfig { // The bot only calculates a release plan, so options used exclusively for formatting, // writing files, Git comparisons, publishing, and snapshots are intentionally ignored. @@ -62,7 +48,10 @@ function getReleasePlanConfig( ...releasePlanConfig } = rawConfig; - if (!useChangesetsV2Defaults) { + const declaredChangesetsVersion = + rootPackageJsonContent.devDependencies?.["@changesets/cli"] ?? + rootPackageJsonContent.dependencies?.["@changesets/cli"]; + if (!isChangesetsV2Range(declaredChangesetsVersion)) { return releasePlanConfig; } @@ -281,14 +270,10 @@ export const getChangedPackages = async ({ const rawConfig = await rawConfigPromise; const configResult = validateConfig( - getReleasePlanConfig(rawConfig, usesChangesetsV2(rootPackageJsonContent)), + getReleasePlanConfig(rawConfig, rootPackageJsonContent), packages, ); - for (const warning of configResult.warnings) { - console.warn(warning); - } - if (configResult.errors) { throw new UserValidationError( "Some errors occurred when validating the changesets config:\n" + diff --git a/is-changesets-v2-range.ts b/is-changesets-v2-range.ts new file mode 100644 index 0000000..8a52df5 --- /dev/null +++ b/is-changesets-v2-range.ts @@ -0,0 +1,13 @@ +import subset from "semver/ranges/subset.js"; +import validRange from "semver/ranges/valid.js"; + +const changesetsV2Range = ">=2.0.0 <3.0.0"; + +export function isChangesetsV2Range(declaredVersion: string | undefined) { + if (declaredVersion === undefined) { + return false; + } + + const range = validRange(declaredVersion); + return range !== null && subset(range, changesetsV2Range); +} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1652e66..c761d99 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,8 +13,6 @@ blockExoticSubdeps: true dedupePeers: true dedupePeerDependents: true minimumReleaseAge: 10080 -minimumReleaseAgeExclude: - - "@changesets/*" shellEmulator: true trustPolicy: no-downgrade - "probot@12.4.0" From 5e7334a60f0e28bccd7061633f1c5522e0c492d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 1 Sep 2026 12:08:38 +0200 Subject: [PATCH 5/6] Simplify Changesets version handling --- get-changed-packages.ts | 27 +++++++++++++++++++++------ is-changesets-v2-range.ts | 13 ------------- 2 files changed, 21 insertions(+), 19 deletions(-) delete mode 100644 is-changesets-v2-range.ts diff --git a/get-changed-packages.ts b/get-changed-packages.ts index d4c6147..af95151 100644 --- a/get-changed-packages.ts +++ b/get-changed-packages.ts @@ -13,8 +13,8 @@ import type { import jsYaml from "js-yaml"; import micromatch from "micromatch"; import type { ProbotOctokit } from "probot"; +import subset from "semver/ranges/subset.js"; import { isChangeset } from "./is-changeset.ts"; -import { isChangesetsV2Range } from "./is-changesets-v2-range.ts"; interface PackageJSON extends ChangesetPackageJSON { workspaces?: ReadonlyArray | { packages: ReadonlyArray }; @@ -30,6 +30,20 @@ type ToolType = Packages["tool"]["type"]; /** Expected validation failures that should be surfaced in the PR comment. */ export class UserValidationError extends Error {} +const changesetsV2Range = ">=2.0.0 <3.0.0"; + +function isChangesetsV2Range(declaredVersion: string | undefined) { + if (declaredVersion === undefined) { + return false; + } + + try { + return subset(declaredVersion, changesetsV2Range); + } catch { + return false; + } +} + function getReleasePlanConfig( rawConfig: WrittenConfig & { prettier?: unknown }, rootPackageJsonContent: PackageJSON, @@ -64,11 +78,13 @@ function getReleasePlanConfig( "The `privatePackages` option can only be `false` or an object when using Changesets v2.", ); } + // Changesets v2 defaulted an omitted `version` to `true` even inside the object form. + // Only adapt that valid shape; invalid values must pass through to `validateConfig`. if ( typeof privatePackages === "object" && privatePackages !== null && !Array.isArray(privatePackages) && - privatePackages.version === undefined + !("version" in privatePackages) ) { return { ...releasePlanConfig, @@ -288,15 +304,14 @@ export const getChangedPackages = async ({ await preStatePromise, ); - const containsChangedFile = (pkg: Package) => - changedFiles.some((changedFile) => changedFile.startsWith(`${pkg.dir}/`)); - // A root-only project has a single package covering the whole repository, // so there is no directory to narrow the changed files down to. const changedPackages = packages.tool.type === "root" ? packages.packages - : packages.packages.filter(containsChangedFile); + : packages.packages.filter((pkg) => + changedFiles.some((changedFile) => changedFile.startsWith(`${pkg.dir}/`)), + ); return { changedPackages: changedPackages.map((pkg) => pkg.packageJson.name), diff --git a/is-changesets-v2-range.ts b/is-changesets-v2-range.ts deleted file mode 100644 index 8a52df5..0000000 --- a/is-changesets-v2-range.ts +++ /dev/null @@ -1,13 +0,0 @@ -import subset from "semver/ranges/subset.js"; -import validRange from "semver/ranges/valid.js"; - -const changesetsV2Range = ">=2.0.0 <3.0.0"; - -export function isChangesetsV2Range(declaredVersion: string | undefined) { - if (declaredVersion === undefined) { - return false; - } - - const range = validRange(declaredVersion); - return range !== null && subset(range, changesetsV2Range); -} From 169a49307ce41910e3e7938056f629c00fc8b203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 1 Sep 2026 12:09:39 +0200 Subject: [PATCH 6/6] Check for omitted private package config --- get-changed-packages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get-changed-packages.ts b/get-changed-packages.ts index af95151..4665cd7 100644 --- a/get-changed-packages.ts +++ b/get-changed-packages.ts @@ -70,7 +70,7 @@ function getReleasePlanConfig( } const privatePackages = rawConfig.privatePackages; - if (privatePackages === undefined) { + if (!("privatePackages" in rawConfig)) { return { ...releasePlanConfig, privatePackages: { version: true } }; } if (privatePackages === true) {