22
22
* For background, see https://github.com/firebase/firebase-js-sdk/issues/4235
23
23
*/
24
24
25
- import { writeFileSync } from 'fs' ;
25
+ import { writeFileSync , existsSync } from 'fs' ;
26
+ import { join } from 'path' ;
26
27
import { projectRoot } from '../utils' ;
27
28
import { exec } from 'child-process-promise' ;
28
29
29
- const CONTENT = `
30
+ const APP_CHANGESET_CONTENT = `
30
31
---
31
32
'@firebase/app': patch
32
33
---
33
34
34
35
Update SDK_VERSION.
35
36
` ;
36
37
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
+ } ;
38
68
39
69
async function addChangeSet ( ) {
40
70
// check if a few firebase version is being released
41
71
try {
42
72
// The way actions/checkout works, there is no local `main` branch, but it
43
73
// 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 ;
45
77
// only add a changeset for @firebase /app if
46
78
// 1. we are publishing a new firebase version. and
47
79
// 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
+ ) {
51
123
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
+ ) ;
55
131
} else if ( firebaseAppRelease ) {
56
132
console . log (
57
133
'Skip creating a patch changeset for @firebase/app because it is already part of the release'
@@ -61,6 +137,23 @@ async function addChangeSet() {
61
137
'Skip creating a patch changeset for @firebase/app because firebase is not being released'
62
138
) ;
63
139
}
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
+ }
64
157
} catch ( e ) {
65
158
// log the error, the exit without creating a changeset
66
159
console . log ( 'error:' , e ) ;
0 commit comments