33import fs from "node:fs" ;
44import path from "node:path" ;
55import rimraf from "rimraf" ;
6- import semver from "semver" ;
76import createEsmUtils from "esm-utils" ;
7+ import {
8+ getEntries ,
9+ replaceVersions ,
10+ changelogUnreleasedDirPath ,
11+ changelogUnreleasedDirs ,
12+ printEntries ,
13+ } from "./utils/changelog.mjs" ;
814
915const { __dirname, require } = createEsmUtils ( import . meta) ;
10- const changelogUnreleasedDir = path . join ( __dirname , "../changelog_unreleased" ) ;
1116const blogDir = path . join ( __dirname , "../website/blog" ) ;
1217const introTemplateFile = path . join (
13- changelogUnreleasedDir ,
18+ changelogUnreleasedDirPath ,
1419 "BLOG_POST_INTRO_TEMPLATE.md"
1520) ;
16- const introFile = path . join ( changelogUnreleasedDir , "blog-post-intro.md" ) ;
21+ const introFile = path . join ( changelogUnreleasedDirPath , "blog-post-intro.md" ) ;
1722if ( ! fs . existsSync ( introFile ) ) {
1823 fs . copyFileSync ( introTemplateFile , introFile ) ;
1924}
@@ -50,46 +55,15 @@ const categoriesByDir = new Map(
5055 categories . map ( ( category ) => [ category . dir , category ] )
5156) ;
5257
53- const dirs = fs
54- . readdirSync ( changelogUnreleasedDir , { withFileTypes : true } )
55- . filter ( ( entry ) => entry . isDirectory ( ) ) ;
56-
57- for ( const dir of dirs ) {
58- const dirPath = path . join ( changelogUnreleasedDir , dir . name ) ;
58+ for ( const dir of changelogUnreleasedDirs ) {
59+ const dirPath = path . join ( changelogUnreleasedDirPath , dir . name ) ;
5960 const category = categoriesByDir . get ( dir . name ) ;
6061
6162 if ( ! category ) {
6263 throw new Error ( "Unknown category: " + dir . name ) ;
6364 }
6465
65- category . entries = fs
66- . readdirSync ( dirPath )
67- . filter ( ( fileName ) => / ^ \d + \. m d $ / . test ( fileName ) )
68- . map ( ( fileName ) => {
69- const [ title , ...rest ] = fs
70- . readFileSync ( path . join ( dirPath , fileName ) , "utf8" )
71- . trim ( )
72- . split ( "\n" ) ;
73-
74- const improvement = title . match ( / \[ I M P R O V E M E N T ( : ( \d + ) ) ? ] / ) ;
75-
76- const section = title . includes ( "[HIGHLIGHT]" )
77- ? "highlight"
78- : title . includes ( "[BREAKING]" )
79- ? "breaking"
80- : improvement
81- ? "improvement"
82- : undefined ;
83-
84- const order =
85- section === "improvement" && improvement [ 2 ] !== undefined
86- ? Number ( improvement [ 2 ] )
87- : undefined ;
88-
89- const content = [ processTitle ( title ) , ...rest ] . join ( "\n" ) ;
90-
91- return { fileName, section, order, content } ;
92- } ) ;
66+ category . entries = getEntries ( dirPath ) ;
9367}
9468
9569rimraf . sync ( postGlob ) ;
@@ -100,54 +74,35 @@ fs.writeFileSync(
10074 [
10175 fs . readFileSync ( introFile , "utf8" ) . trim ( ) ,
10276 "<!--truncate-->" ,
103- ...printEntries ( {
77+ ...printEntriesWithTitle ( {
10478 title : "Highlights" ,
10579 filter : ( entry ) => entry . section === "highlight" ,
10680 } ) ,
107- ...printEntries ( {
81+ ...printEntriesWithTitle ( {
10882 title : "Breaking Changes" ,
10983 filter : ( entry ) => entry . section === "breaking" ,
11084 } ) ,
111- ...printEntries ( {
85+ ...printEntriesWithTitle ( {
11286 title : "Formatting Improvements" ,
11387 filter : ( entry ) => entry . section === "improvement" ,
11488 } ) ,
115- ...printEntries ( {
89+ ...printEntriesWithTitle ( {
11690 title : "Other Changes" ,
11791 filter : ( entry ) => ! entry . section ,
11892 } ) ,
119- ] . join ( "\n\n" ) + "\n"
93+ ] . join ( "\n\n" ) + "\n" ,
94+ previousVersion ,
95+ version
12096 )
12197) ;
12298
123- function processTitle ( title ) {
124- return title
125- . replace ( / \[ ( B R E A K I N G | H I G H L I G H T | I M P R O V E M E N T ( : \d + ) ? ) ] / g, "" )
126- . replace ( / \s + / g, " " )
127- . replace ( / ^ # { 4 } [ a - z ] / , ( s ) => s . toUpperCase ( ) )
128- . replace ( / (?< ! [ [ ` ] ) @ ( [ \w - ] + ) / g, "[@$1](https://github.com/$1)" )
129- . replace (
130- / (?< ! [ [ ` ] ) # ( \d { 4 , } ) / g,
131- "[#$1](https://github.com/prettier/prettier/pull/$1)"
132- ) ;
133- }
134-
135- function printEntries ( { title, filter } ) {
99+ function printEntriesWithTitle ( { title, filter } ) {
136100 const result = [ ] ;
137101
138102 for ( const { entries = [ ] , title } of categories ) {
139103 const filteredEntries = entries . filter ( filter ) ;
140104 if ( filteredEntries . length > 0 ) {
141- filteredEntries . sort ( ( a , b ) => {
142- if ( a . order !== undefined ) {
143- return b . order === undefined ? 1 : a . order - b . order ;
144- }
145- return a . fileName . localeCompare ( b . fileName , "en" , { numeric : true } ) ;
146- } ) ;
147- result . push (
148- "### " + title ,
149- ...filteredEntries . map ( ( entry ) => entry . content )
150- ) ;
105+ result . push ( "###" + title , ...printEntries ( filteredEntries ) ) ;
151106 }
152107 }
153108
@@ -157,13 +112,3 @@ function printEntries({ title, filter }) {
157112
158113 return result ;
159114}
160-
161- function formatVersion ( version ) {
162- return `${ semver . major ( version ) } .${ semver . minor ( version ) } ` ;
163- }
164-
165- function replaceVersions ( data ) {
166- return data
167- . replace ( / p r e t t i e r s t a b l e / gi, `Prettier ${ formatVersion ( previousVersion ) } ` )
168- . replace ( / p r e t t i e r m a i n / gi, `Prettier ${ formatVersion ( version ) } ` ) ;
169- }
0 commit comments