Files
vercel__workflow/.github/scripts/check-release-major.test.js
Peter Wielander 32e83e8091 Prevent peer dependency-only major bumps (backport #2437) (#2447)
Backport of #2437 to the stable (v4) release line.

- Add publish-time release-major guard (.github/scripts/check-release-major.js)
  run in release.yml before install, gated on RELEASE_VERSION: 4.
- Realign @workflow/nest from 0.0.10 to 4.0.11 so the v4 stable line has no
  out-of-line package majors (nest skipped straight to 5.0.0-beta on main and
  had no 4.x version). Required for the guard to pass on stable.

The .changeset/config.json onlyUpdatePeerDependentsWhenOutOfRange option from
#2437 was already present on stable.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 10:34:29 -07:00

116 lines
2.8 KiB
JavaScript

const assert = require('node:assert');
const { test } = require('node:test');
const {
findPackagesOutsideReleaseMajor,
isIgnoredPackage,
parseArgs,
parseMajor,
renderMarkdownSummary,
} = require('./check-release-major.js');
test('parseMajor reads stable and prerelease versions', () => {
assert.strictEqual(parseMajor('4.5.0'), 4);
assert.strictEqual(parseMajor('5.0.0-beta.17'), 5);
assert.strictEqual(parseMajor('not-semver'), null);
});
test('isIgnoredPackage supports exact names and wildcard patterns', () => {
assert.strictEqual(
isIgnoredPackage('@workflow/docs-typecheck', [
'@workflow/docs-typecheck',
'@workflow/example-*',
]),
true
);
assert.strictEqual(
isIgnoredPackage('@workflow/example-nextjs', ['@workflow/example-*']),
true
);
assert.strictEqual(
isIgnoredPackage('@workflow/ai', ['@workflow/example-*']),
false
);
});
test('findPackagesOutsideReleaseMajor flags packages outside the configured release version', () => {
const packages = [
{
name: '@workflow/ai',
path: 'packages/ai/package.json',
version: '7.0.0',
},
{
name: '@workflow/core',
path: 'packages/core/package.json',
version: '5.0.0',
},
{
name: 'workflow',
path: 'packages/workflow/package.json',
version: '5.0.0-beta.17',
},
{
name: '@workflow/internal',
path: 'packages/internal/package.json',
private: true,
version: '7.0.0',
},
{
name: '@workflow/example-nextjs',
path: 'packages/example-nextjs/package.json',
version: '7.0.0',
},
];
assert.deepStrictEqual(
findPackagesOutsideReleaseMajor({
ignorePatterns: ['@workflow/example-*'],
packages,
releaseVersion: 5,
}),
[
{
name: '@workflow/ai',
path: 'packages/ai/package.json',
version: '7.0.0',
},
]
);
});
test('renderMarkdownSummary names the configured release version when blocked', () => {
const summary = renderMarkdownSummary({
releaseVersion: 5,
mismatches: [
{
name: '@workflow/ai',
path: 'packages/ai/package.json',
version: '7.0.0',
},
],
});
assert.match(summary, /release major `5`/);
assert.match(summary, /@workflow\/ai/);
assert.match(summary, /Failing/);
});
test('parseArgs reads release version from argv or environment', () => {
assert.deepStrictEqual(parseArgs(['5']), {
releaseVersion: 5,
});
const oldReleaseVersion = process.env.RELEASE_VERSION;
process.env.RELEASE_VERSION = '4';
assert.deepStrictEqual(parseArgs([]), {
releaseVersion: 4,
});
if (oldReleaseVersion === undefined) {
delete process.env.RELEASE_VERSION;
} else {
process.env.RELEASE_VERSION = oldReleaseVersion;
}
});