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' ;
2627import { projectRoot } from '../utils' ;
2728import { exec } from 'child-process-promise' ;
2829
29- const CONTENT = `
30+ const APP_CHANGESET_CONTENT = `
3031---
3132'@firebase/app': patch
3233---
3334
3435Update 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
3969async 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,21 @@ 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+ writeFileSync (
148+ join ( CHANGESET_DIR_PATH , 'bump-root-package.md' ) ,
149+ firebaseChangesetContent ( maxProductRelease , maxProducts ) ,
150+ {
151+ encoding : 'utf-8'
152+ }
153+ ) ;
154+ }
64155 } catch ( e ) {
65156 // log the error, the exit without creating a changeset
66157 console . log ( 'error:' , e ) ;
0 commit comments