Skip to content

Commit 48993d4

Browse files
authored
Allow artifact verifier to accept covering root peer ranges (#95)
Merge criteria satisfied: full GitHub check list green (unit-tests, e2e-tests, verify-artifacts, claude-review, Greptile, Cursor Bugbot, CodeRabbit; Claude workflow skipped), mergeStateStatus CLEAN / mergeable MERGEABLE, and all review threads resolved or explicitly triaged. Local evidence: yarn install --frozen-lockfile, yarn verify:artifacts, yarn build, git diff --check. This restores main health after the #77 artifact gate exposed the #86 runtime/root-peer policy mismatch; no publish, tag, release, or registry mutation was run.
1 parent 888d8ef commit 48993d4

1 file changed

Lines changed: 43 additions & 3 deletions

File tree

scripts/verify-release.sh

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,46 @@ function assertEqual(actual, expected, label) {
247247
}
248248
}
249249
250-
assertEqual(rootPackage.peerDependencies?.react, expectedPeerRange, 'root peerDependencies.react');
251-
assertEqual(rootPackage.peerDependencies?.['react-dom'], expectedPeerRange, 'root peerDependencies.react-dom');
250+
function parseVersion(version, label) {
251+
const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(version);
252+
if (!match) {
253+
throw new Error(`${label} expected X.Y.Z, got ${version}`);
254+
}
255+
256+
return {
257+
major: Number(match[1]),
258+
minor: Number(match[2]),
259+
patch: Number(match[3]),
260+
};
261+
}
262+
263+
function compareVersions(a, b) {
264+
return a.major - b.major || a.minor - b.minor || a.patch - b.patch;
265+
}
266+
267+
function assertCaretRangeIncludesVersion(range, version, label) {
268+
const match = /^\^(\d+\.\d+\.\d+)$/.exec(range || '');
269+
if (!match) {
270+
throw new Error(`${label} expected a caret X.Y.Z range that includes ${version}, got ${range}`);
271+
}
272+
273+
const minimum = parseVersion(match[1], label);
274+
const target = parseVersion(version, 'runtime version');
275+
if (minimum.major !== target.major || compareVersions(minimum, target) > 0) {
276+
throw new Error(`${label} ${range} does not include vendored runtime ${version}`);
277+
}
278+
}
279+
280+
assertCaretRangeIncludesVersion(
281+
rootPackage.peerDependencies?.react,
282+
runtimeVersion,
283+
'root peerDependencies.react'
284+
);
285+
assertCaretRangeIncludesVersion(
286+
rootPackage.peerDependencies?.['react-dom'],
287+
runtimeVersion,
288+
'root peerDependencies.react-dom'
289+
);
252290
assertEqual(runtimePackage.peerDependencies?.react, expectedPeerRange, 'runtime peerDependencies.react');
253291
assertEqual(runtimePackage.peerDependencies?.['react-dom'], expectedPeerRange, 'runtime peerDependencies.react-dom');
254292
@@ -266,7 +304,9 @@ for (const marker of [`version: "${runtimeVersion}"`, `reconcilerVersion: "${run
266304
}
267305
}
268306
269-
console.log(` - Runtime version ${runtimeVersion} matches peer policy ${expectedPeerRange}`);
307+
console.log(
308+
` - Runtime version ${runtimeVersion} is included by root peers and matches runtime peer policy ${expectedPeerRange}`
309+
);
270310
NODE
271311

272312
log "Verifying embedded React runtime version policy"

0 commit comments

Comments
 (0)