From 3e15838eb85a6061b8b5bf115ab78bf34d4e58f6 Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Thu, 6 Feb 2025 12:57:19 -0800 Subject: [PATCH 1/2] adds a changeset to release PR as needed --- .gitignore | 5 +- scripts/ci/add_changeset.ts | 111 ++++++++++++++++++++++++++++++++---- 2 files changed, 105 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 1a6a719d18d..5aaf5c0b5be 100644 --- a/.gitignore +++ b/.gitignore @@ -100,4 +100,7 @@ docs/ # vertexai test data vertexai-sdk-test-data -mocks-lookup.ts \ No newline at end of file +mocks-lookup.ts + +# temp changeset output +changeset-temp.json \ No newline at end of file diff --git a/scripts/ci/add_changeset.ts b/scripts/ci/add_changeset.ts index 2279e2c0e60..a9d76d3343d 100644 --- a/scripts/ci/add_changeset.ts +++ b/scripts/ci/add_changeset.ts @@ -22,11 +22,12 @@ * For background, see https://github.com/firebase/firebase-js-sdk/issues/4235 */ -import { writeFileSync } from 'fs'; +import { writeFileSync, existsSync } from 'fs'; +import { join } from 'path'; import { projectRoot } from '../utils'; import { exec } from 'child-process-promise'; -const CONTENT = ` +const APP_CHANGESET_CONTENT = ` --- '@firebase/app': patch --- @@ -34,24 +35,99 @@ const CONTENT = ` Update SDK_VERSION. `; -const FILE_PATH = `${projectRoot}/.changeset/bump-sdk-version.md`; +function firebaseChangesetContent(type: ReleaseType, maxProducts: string[]) { + return ` +--- +'firebase': ${type} +--- + +Update root "firebase" package as a "${type}" release due to bumps in: +${maxProducts.join('\n')}. +`; +} + +const CHANGESET_DIR_PATH = `${projectRoot}/.changeset/`; + +interface ChangesetEntry { + releases: Array<{ + name: string; + type: ReleaseType; + }>; + summary: string; + id: string; +} + +type ReleaseType = 'none' | 'patch' | 'minor' | 'major'; + +const releaseTypeValues: Record = { + 'none': 0, + 'patch': 1, + 'minor': 2, + 'major': 3 +}; async function addChangeSet() { // check if a few firebase version is being released try { // The way actions/checkout works, there is no local `main` branch, but it // has access to the remote origin/main. - const { stdout } = await exec('yarn changeset status'); + await exec(`yarn changeset status --output changeset-temp.json`); + const changesets: ChangesetEntry[] = + require(`${projectRoot}/changeset-temp.json`).changesets; // only add a changeset for @firebase/app if // 1. we are publishing a new firebase version. and // 2. @firebase/app is not already being published - const firebaseRelease = stdout.includes('- firebase\n'); - const firebaseAppRelease = stdout.includes('- @firebase/app\n'); - if (firebaseRelease && !firebaseAppRelease) { + let firebaseRelease: ReleaseType = 'none'; + let firebaseAppRelease: ReleaseType = 'none'; + let maxProductRelease: ReleaseType = 'none'; + let maxProducts: string[] = []; + for (const changeset of changesets) { + for (const release of changeset.releases) { + // Track any 'firebase' release + if ( + release.name === 'firebase' && + releaseTypeValues[release.type] > releaseTypeValues[firebaseRelease] + ) { + firebaseRelease = release.type; + } + // Track any '@firebase/app' release + if ( + release.name === '@firebase/app' && + releaseTypeValues[release.type] > + releaseTypeValues[firebaseAppRelease] + ) { + firebaseAppRelease = release.type; + } + // Track any minor or greater release that isn't 'firebase' + if ( + release.name !== 'firebase' && + releaseTypeValues[release.type] >= + releaseTypeValues[maxProductRelease] + ) { + if ( + releaseTypeValues[release.type] === + releaseTypeValues[maxProductRelease] + ) { + maxProducts.push(release.name); + } else { + maxProducts = [release.name]; + } + maxProductRelease = release.type; + } + } + } + if ( + releaseTypeValues[firebaseRelease] > 0 && + releaseTypeValues[firebaseAppRelease] === 0 + ) { console.log('Creating a patch changeset for @firebase/app'); - writeFileSync(FILE_PATH, CONTENT, { - encoding: 'utf-8' - }); + writeFileSync( + join(CHANGESET_DIR_PATH, 'bump-sdk-version.md'), + APP_CHANGESET_CONTENT, + { + encoding: 'utf-8' + } + ); } else if (firebaseAppRelease) { console.log( 'Skip creating a patch changeset for @firebase/app because it is already part of the release' @@ -61,6 +137,21 @@ async function addChangeSet() { 'Skip creating a patch changeset for @firebase/app because firebase is not being released' ); } + if ( + releaseTypeValues[maxProductRelease] > releaseTypeValues['patch'] && + releaseTypeValues[maxProductRelease] > releaseTypeValues[firebaseRelease] + ) { + console.log( + `Creating a ${maxProductRelease} changeset for firebase due to ${maxProducts.join(', ')}` + ); + writeFileSync( + join(CHANGESET_DIR_PATH, 'bump-root-package.md'), + firebaseChangesetContent(maxProductRelease, maxProducts), + { + encoding: 'utf-8' + } + ); + } } catch (e) { // log the error, the exit without creating a changeset console.log('error:', e); From 987a350ab4ba02e0ccfd222b8093f0c7e687c1ec Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Mon, 10 Feb 2025 10:29:14 -0800 Subject: [PATCH 2/2] format --- scripts/ci/add_changeset.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/ci/add_changeset.ts b/scripts/ci/add_changeset.ts index a9d76d3343d..63003d7868e 100644 --- a/scripts/ci/add_changeset.ts +++ b/scripts/ci/add_changeset.ts @@ -142,7 +142,9 @@ async function addChangeSet() { releaseTypeValues[maxProductRelease] > releaseTypeValues[firebaseRelease] ) { console.log( - `Creating a ${maxProductRelease} changeset for firebase due to ${maxProducts.join(', ')}` + `Creating a ${maxProductRelease} changeset for firebase due to ${maxProducts.join( + ', ' + )}` ); writeFileSync( join(CHANGESET_DIR_PATH, 'bump-root-package.md'),