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