@@ -71,7 +71,7 @@ export default class SecurityBlog extends SecurityRelease {
71
71
cli . ok ( `Announcement file created and banner has been updated. Folder: ${ nodejsOrgFolder } ` ) ;
72
72
}
73
73
74
- async createPostRelease ( ) {
74
+ async createPostRelease ( nodejsOrgFolder ) {
75
75
const { cli } = this ;
76
76
const credentials = await auth ( {
77
77
github : true ,
@@ -84,7 +84,7 @@ export default class SecurityBlog extends SecurityRelease {
84
84
checkoutOnSecurityReleaseBranch ( cli , this . repository ) ;
85
85
86
86
// read vulnerabilities JSON file
87
- const content = this . readVulnerabilitiesJSON ( cli ) ;
87
+ const content = this . readVulnerabilitiesJSON ( ) ;
88
88
if ( ! content . releaseDate ) {
89
89
cli . error ( 'Release date is not set in vulnerabilities.json,' +
90
90
' run `git node security --update-date=YYYY/MM/DD` to set the release date.' ) ;
@@ -95,47 +95,54 @@ export default class SecurityBlog extends SecurityRelease {
95
95
const releaseDate = new Date ( content . releaseDate ) ;
96
96
const template = this . getSecurityPostReleaseTemplate ( ) ;
97
97
const data = {
98
- // TODO: read from pre-sec-release
99
- annoucementDate : await this . getAnnouncementDate ( cli ) ,
98
+ annoucementDate : releaseDate . toISOString ( ) ,
100
99
releaseDate : this . formatReleaseDate ( releaseDate ) ,
101
100
affectedVersions : this . getAffectedVersions ( content ) ,
102
101
vulnerabilities : this . getVulnerabilities ( content ) ,
103
102
slug : this . getSlug ( releaseDate ) ,
104
- author : await this . promptAuthor ( cli ) ,
103
+ author : 'The Node.js Project' ,
105
104
dependencyUpdates : content . dependencies
106
105
} ;
107
- const postReleaseContent = await this . buildPostRelease ( template , data , content ) ;
108
106
109
- const pathPreRelease = await this . promptExistingPreRelease ( cli ) ;
110
- // read the existing pre-release announcement
111
- let preReleaseContent = fs . readFileSync ( pathPreRelease , 'utf-8' ) ;
107
+ const pathToBlogPosts = path . resolve ( nodejsOrgFolder , 'apps/site/pages/en/blog/release' ) ;
108
+ const pathToBannerJson = path . resolve ( nodejsOrgFolder , 'apps/site/site.json' ) ;
109
+
110
+ const preReleasePath = path . resolve ( pathToBlogPosts , data . slug + '.md' ) ;
111
+ let preReleaseContent = this . findExistingPreRelease ( preReleasePath ) ;
112
+ if ( ! preReleaseContent ) {
113
+ cli . error ( `Existing pre-release not found! Path: ${ preReleasePath } ` ) ;
114
+ process . exit ( 1 ) ;
115
+ }
116
+
117
+ const postReleaseContent = await this . buildPostRelease ( template , data , content ) ;
112
118
// cut the part before summary
113
119
const preSummary = preReleaseContent . indexOf ( '# Summary' ) ;
114
120
if ( preSummary !== - 1 ) {
115
121
preReleaseContent = preReleaseContent . substring ( preSummary ) ;
116
122
}
117
-
118
123
const updatedContent = postReleaseContent + preReleaseContent ;
119
124
120
- fs . writeFileSync ( pathPreRelease , updatedContent ) ;
121
- cli . ok ( `Post-release announcement file updated at ${ pathPreRelease } ` ) ;
125
+ const endDate = new Date ( data . annoucementDate ) ;
126
+ endDate . setDate ( endDate . getDate ( ) + 7 ) ;
127
+ const month = releaseDate . toLocaleString ( 'en-US' , { month : 'long' } ) ;
128
+ const capitalizedMonth = month [ 0 ] . toUpperCase ( ) + month . slice ( 1 ) ;
129
+
130
+ this . updateWebsiteBanner ( pathToBannerJson , {
131
+ startDate : releaseDate ,
132
+ endDate,
133
+ text : `${ capitalizedMonth } Security Release is available`
134
+ } ) ;
122
135
123
- // if the vulnerabilities.json has been changed, update the file
124
- if ( ! content [ kChanged ] ) return ;
125
- this . updateVulnerabilitiesJSON ( content ) ;
136
+ fs . writeFileSync ( preReleasePath , updatedContent ) ;
137
+ cli . ok ( `Announcement file and banner has been updated. Folder: ${ nodejsOrgFolder } ` ) ;
126
138
}
127
139
128
- async promptExistingPreRelease ( cli ) {
129
- const pathPreRelease = await cli . prompt (
130
- 'Please provide the path of the existing pre-release announcement:' , {
131
- questionType : 'input' ,
132
- defaultAnswer : ''
133
- } ) ;
134
-
135
- if ( ! pathPreRelease || ! fs . existsSync ( path . resolve ( pathPreRelease ) ) ) {
136
- return this . promptExistingPreRelease ( cli ) ;
140
+ findExistingPreRelease ( filepath ) {
141
+ if ( ! fs . existsSync ( filepath ) ) {
142
+ return null ;
137
143
}
138
- return pathPreRelease ;
144
+
145
+ return fs . readFileSync ( filepath , 'utf-8' ) ;
139
146
}
140
147
141
148
promptAuthor ( cli ) {
@@ -146,6 +153,20 @@ export default class SecurityBlog extends SecurityRelease {
146
153
} ) ;
147
154
}
148
155
156
+ updateWebsiteBanner ( siteJsonPath , content ) {
157
+ const siteJson = JSON . parse ( fs . readFileSync ( siteJsonPath ) ) ;
158
+
159
+ const currentValue = siteJson . websiteBanners . index ;
160
+ siteJson . websiteBanners . index = {
161
+ startDate : content . startDate ?? currentValue . startDate ,
162
+ endDate : content . endDate ?? currentValue . endDate ,
163
+ text : content . text ?? currentValue . text ,
164
+ link : content . link ?? currentValue . link ,
165
+ type : content . type ?? currentValue . type
166
+ } ;
167
+ fs . writeFileSync ( siteJsonPath , JSON . stringify ( siteJson , null , 2 ) ) ;
168
+ }
169
+
149
170
formatReleaseDate ( releaseDate ) {
150
171
const options = {
151
172
weekday : 'long' ,
0 commit comments