@@ -4,10 +4,52 @@ import { PUBLISHABLE_PACKAGE_ORDER } from "./workspace-tooling.js";
44
55const STABLE_VERSION = / ^ ( 0 | [ 1 - 9 ] \d * ) \. ( 0 | [ 1 - 9 ] \d * ) \. ( 0 | [ 1 - 9 ] \d * ) $ / ;
66const REPOSITORY_ROOT = resolve ( import . meta. dir , ".." ) ;
7+ const PACKAGE_SIZE_HISTORY_PREFIX = "automation/package-size-history-" ;
8+ const REQUIRED_PACKAGE_SIZE_HISTORY_FILES = new Set ( [
9+ "docs/src/content/docs/guides/performance-resources.md" ,
10+ "scripts/size-history.json" ,
11+ ] ) ;
12+ const ALLOWED_PACKAGE_SIZE_HISTORY_FILES = new Set ( [
13+ ...REQUIRED_PACKAGE_SIZE_HISTORY_FILES ,
14+ "docs/src/generated/docs-contract.json" ,
15+ ] ) ;
716
817export function releaseVersionFromHeadRef ( headRef : string | undefined ) : string | undefined {
918 return headRef !== undefined && STABLE_VERSION . test ( headRef ) ? headRef : undefined ;
1019}
20+ export function packageSizeHistoryVersionFromHeadRef (
21+ headRef : string | undefined ,
22+ ) : string | undefined {
23+ if ( headRef === undefined || ! headRef . startsWith ( PACKAGE_SIZE_HISTORY_PREFIX ) ) return undefined ;
24+ const version = headRef . slice ( PACKAGE_SIZE_HISTORY_PREFIX . length ) ;
25+ return STABLE_VERSION . test ( version ) ? version : undefined ;
26+ }
27+ export function isGeneratedPackageSizeHistoryChange ( paths : readonly string [ ] ) : boolean {
28+ const uniquePaths = new Set ( paths ) ;
29+ return (
30+ uniquePaths . size === paths . length &&
31+ [ ...REQUIRED_PACKAGE_SIZE_HISTORY_FILES ] . every ( ( path ) => uniquePaths . has ( path ) ) &&
32+ paths . every ( ( path ) => ALLOWED_PACKAGE_SIZE_HISTORY_FILES . has ( path ) )
33+ ) ;
34+ }
35+
36+ async function changedFilesSinceDevelop ( ) : Promise < string [ ] > {
37+ const child = Bun . spawn ( [ "git" , "diff" , "--name-only" , "origin/develop...HEAD" ] , {
38+ cwd : REPOSITORY_ROOT ,
39+ stdout : "pipe" ,
40+ stderr : "pipe" ,
41+ } ) ;
42+ const [ stdout , stderr , exitCode ] = await Promise . all ( [
43+ new Response ( child . stdout ) . text ( ) ,
44+ new Response ( child . stderr ) . text ( ) ,
45+ child . exited ,
46+ ] ) ;
47+ if ( exitCode !== 0 ) throw new Error ( `Unable to inspect package size history diff: ${ stderr } ` ) ;
48+ return stdout
49+ . split ( "\n" )
50+ . map ( ( path ) => path . trim ( ) )
51+ . filter ( ( path ) => path . length > 0 ) ;
52+ }
1153
1254export function validateReleasePackageVersions ( version : string , root = REPOSITORY_ROOT ) : void {
1355 for ( const name of PUBLISHABLE_PACKAGE_ORDER ) {
@@ -30,6 +72,19 @@ async function main(): Promise<void> {
3072 console . log ( `Release package versions match branch ${ releaseVersion } ` ) ;
3173 return ;
3274 }
75+ const packageSizeHistoryVersion = packageSizeHistoryVersionFromHeadRef (
76+ process . env . GITHUB_HEAD_REF ,
77+ ) ;
78+ if ( packageSizeHistoryVersion !== undefined ) {
79+ validateReleasePackageVersions ( packageSizeHistoryVersion ) ;
80+ if ( isGeneratedPackageSizeHistoryChange ( await changedFilesSinceDevelop ( ) ) ) {
81+ console . log ( `Package size history versions match branch ${ packageSizeHistoryVersion } ` ) ;
82+ return ;
83+ }
84+ console . log (
85+ "Package size history branch contains non-generated changes; requiring a changeset" ,
86+ ) ;
87+ }
3388 const child = Bun . spawn ( [ "bun" , "run" , "changeset:status" , "--" , "--since=origin/develop" ] , {
3489 cwd : REPOSITORY_ROOT ,
3590 stdin : "inherit" ,
0 commit comments