Skip to content

Commit deb917b

Browse files
authored
Adds a "firebase" changeset to release PR as needed (#8770)
1 parent 4e6a5c6 commit deb917b

File tree

2 files changed

+107
-11
lines changed

2 files changed

+107
-11
lines changed

Diff for: .gitignore

+4-1
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,7 @@ docs/
100100

101101
# vertexai test data
102102
vertexai-sdk-test-data
103-
mocks-lookup.ts
103+
mocks-lookup.ts
104+
105+
# temp changeset output
106+
changeset-temp.json

Diff for: scripts/ci/add_changeset.ts

+103-10
Original file line numberDiff line numberDiff line change
@@ -22,36 +22,112 @@
2222
* For background, see https://github.com/firebase/firebase-js-sdk/issues/4235
2323
*/
2424

25-
import { writeFileSync } from 'fs';
25+
import { writeFileSync, existsSync } from 'fs';
26+
import { join } from 'path';
2627
import { projectRoot } from '../utils';
2728
import { exec } from 'child-process-promise';
2829

29-
const CONTENT = `
30+
const APP_CHANGESET_CONTENT = `
3031
---
3132
'@firebase/app': patch
3233
---
3334
3435
Update SDK_VERSION.
3536
`;
3637

37-
const FILE_PATH = `${projectRoot}/.changeset/bump-sdk-version.md`;
38+
function firebaseChangesetContent(type: ReleaseType, maxProducts: string[]) {
39+
return `
40+
---
41+
'firebase': ${type}
42+
---
43+
44+
Update root "firebase" package as a "${type}" release due to bumps in:
45+
${maxProducts.join('\n')}.
46+
`;
47+
}
48+
49+
const CHANGESET_DIR_PATH = `${projectRoot}/.changeset/`;
50+
51+
interface ChangesetEntry {
52+
releases: Array<{
53+
name: string;
54+
type: ReleaseType;
55+
}>;
56+
summary: string;
57+
id: string;
58+
}
59+
60+
type ReleaseType = 'none' | 'patch' | 'minor' | 'major';
61+
62+
const releaseTypeValues: Record<ReleaseType, number> = {
63+
'none': 0,
64+
'patch': 1,
65+
'minor': 2,
66+
'major': 3
67+
};
3868

3969
async function addChangeSet() {
4070
// check if a few firebase version is being released
4171
try {
4272
// The way actions/checkout works, there is no local `main` branch, but it
4373
// has access to the remote origin/main.
44-
const { stdout } = await exec('yarn changeset status');
74+
await exec(`yarn changeset status --output changeset-temp.json`);
75+
const changesets: ChangesetEntry[] =
76+
require(`${projectRoot}/changeset-temp.json`).changesets;
4577
// only add a changeset for @firebase/app if
4678
// 1. we are publishing a new firebase version. and
4779
// 2. @firebase/app is not already being published
48-
const firebaseRelease = stdout.includes('- firebase\n');
49-
const firebaseAppRelease = stdout.includes('- @firebase/app\n');
50-
if (firebaseRelease && !firebaseAppRelease) {
80+
let firebaseRelease: ReleaseType = 'none';
81+
let firebaseAppRelease: ReleaseType = 'none';
82+
let maxProductRelease: ReleaseType = 'none';
83+
let maxProducts: string[] = [];
84+
for (const changeset of changesets) {
85+
for (const release of changeset.releases) {
86+
// Track any 'firebase' release
87+
if (
88+
release.name === 'firebase' &&
89+
releaseTypeValues[release.type] > releaseTypeValues[firebaseRelease]
90+
) {
91+
firebaseRelease = release.type;
92+
}
93+
// Track any '@firebase/app' release
94+
if (
95+
release.name === '@firebase/app' &&
96+
releaseTypeValues[release.type] >
97+
releaseTypeValues[firebaseAppRelease]
98+
) {
99+
firebaseAppRelease = release.type;
100+
}
101+
// Track any minor or greater release that isn't 'firebase'
102+
if (
103+
release.name !== 'firebase' &&
104+
releaseTypeValues[release.type] >=
105+
releaseTypeValues[maxProductRelease]
106+
) {
107+
if (
108+
releaseTypeValues[release.type] ===
109+
releaseTypeValues[maxProductRelease]
110+
) {
111+
maxProducts.push(release.name);
112+
} else {
113+
maxProducts = [release.name];
114+
}
115+
maxProductRelease = release.type;
116+
}
117+
}
118+
}
119+
if (
120+
releaseTypeValues[firebaseRelease] > 0 &&
121+
releaseTypeValues[firebaseAppRelease] === 0
122+
) {
51123
console.log('Creating a patch changeset for @firebase/app');
52-
writeFileSync(FILE_PATH, CONTENT, {
53-
encoding: 'utf-8'
54-
});
124+
writeFileSync(
125+
join(CHANGESET_DIR_PATH, 'bump-sdk-version.md'),
126+
APP_CHANGESET_CONTENT,
127+
{
128+
encoding: 'utf-8'
129+
}
130+
);
55131
} else if (firebaseAppRelease) {
56132
console.log(
57133
'Skip creating a patch changeset for @firebase/app because it is already part of the release'
@@ -61,6 +137,23 @@ async function addChangeSet() {
61137
'Skip creating a patch changeset for @firebase/app because firebase is not being released'
62138
);
63139
}
140+
if (
141+
releaseTypeValues[maxProductRelease] > releaseTypeValues['patch'] &&
142+
releaseTypeValues[maxProductRelease] > releaseTypeValues[firebaseRelease]
143+
) {
144+
console.log(
145+
`Creating a ${maxProductRelease} changeset for firebase due to ${maxProducts.join(
146+
', '
147+
)}`
148+
);
149+
writeFileSync(
150+
join(CHANGESET_DIR_PATH, 'bump-root-package.md'),
151+
firebaseChangesetContent(maxProductRelease, maxProducts),
152+
{
153+
encoding: 'utf-8'
154+
}
155+
);
156+
}
64157
} catch (e) {
65158
// log the error, the exit without creating a changeset
66159
console.log('error:', e);

0 commit comments

Comments
 (0)