From 971c3434c16a90202b8e76ea13a914c3805c6dbe Mon Sep 17 00:00:00 2001 From: Marco Pasqualetti Date: Tue, 11 Aug 2026 21:50:29 +0200 Subject: [PATCH 1/2] 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/2] 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, {