@@ -9,21 +9,35 @@ const os = require('os');
99const path = require ( 'path' ) ;
1010
1111// Setup auth
12- fs . writeFileSync ( `${ process . env [ 'HOME' ] } /.npmrc` , `//registry.npmjs.org/:_authToken=${ process . env [ 'NPM_AUTH_TOKEN' ] } ` ) ;
12+ if ( process . env [ 'NPM_AUTH_TOKEN' ] ) {
13+ fs . writeFileSync ( `${ process . env [ 'HOME' ] } /.npmrc` , `//registry.npmjs.org/:_authToken=${ process . env [ 'NPM_AUTH_TOKEN' ] } ` ) ;
14+ }
1315
16+ log ( 'Configuration:' , 'green' )
1417const isDryRun = process . argv . includes ( '--dry' ) ;
1518if ( isDryRun ) {
16- console . log ( 'Publish dry run' ) ;
19+ log ( ' Publish dry run' ) ;
20+ }
21+
22+ const allAddons = process . argv . includes ( '--all-addons' ) ;
23+ if ( allAddons ) {
24+ log ( ' Publish all addons' ) ;
1725}
1826
27+ const repoCommit = getRepoCommit ( ) ;
1928const changedFiles = getChangedFilesInCommit ( 'HEAD' ) ;
2029
21- // Publish xterm if any files were changed outside of the addons directory
22- let isStableRelease = false ;
23- if ( changedFiles . some ( e => e . search ( / ^ a d d o n s \/ / ) === - 1 ) ) {
24- isStableRelease = checkAndPublishPackage ( path . resolve ( __dirname , '..' ) ) ;
25- checkAndPublishPackage ( path . resolve ( __dirname , '../headless' ) ) ;
26- }
30+ // Always publish xterm, technically this isn't needed if
31+ // `changedFiles.some(e => e.search(/^addons\//)`, but it's here for convenience to get the right
32+ // peer dependencies for addons.
33+ const result = checkAndPublishPackage ( path . resolve ( __dirname , '..' ) , repoCommit ) ;
34+ const isStableRelease = result . isStableRelease ;
35+ const peerDependencies = result . nextVersion . includes ( 'beta' ) ? {
36+ '@xterm/xterm' : `^${ result . nextVersion } ` ,
37+ } : undefined ;
38+ checkAndPublishPackage ( path . resolve ( __dirname , '../headless' ) , repoCommit ) ;
39+
40+ // Addon peer dependencies
2741
2842// Publish addons if any files were changed inside of the addon
2943const addonPackageDirs = [
@@ -39,12 +53,11 @@ const addonPackageDirs = [
3953 path . resolve ( __dirname , '../addons/addon-web-links' ) ,
4054 path . resolve ( __dirname , '../addons/addon-webgl' )
4155] ;
42- console . log ( `Checking if addons need to be published` ) ;
56+ log ( `Checking if addons need to be published` , 'green' ) ;
4357for ( const p of addonPackageDirs ) {
4458 const addon = path . basename ( p ) ;
45- if ( changedFiles . some ( e => e . includes ( addon ) ) ) {
46- console . log ( `Try publish ${ addon } ` ) ;
47- checkAndPublishPackage ( p ) ;
59+ if ( allAddons || changedFiles . some ( e => e . includes ( addon ) ) ) {
60+ checkAndPublishPackage ( p , repoCommit , peerDependencies ) ;
4861 }
4962}
5063
@@ -53,7 +66,7 @@ if (isStableRelease) {
5366 updateWebsite ( ) ;
5467}
5568
56- function checkAndPublishPackage ( packageDir ) {
69+ function checkAndPublishPackage ( packageDir , repoCommit , peerDependencies ) {
5770 const packageJson = require ( path . join ( packageDir , 'package.json' ) ) ;
5871
5972 // Determine if this is a stable or beta release
@@ -62,12 +75,29 @@ function checkAndPublishPackage(packageDir) {
6275
6376 // Get the next version
6477 let nextVersion = isStableRelease ? packageJson . version : getNextBetaVersion ( packageJson ) ;
65- console . log ( `Publishing version: ${ nextVersion } ` ) ;
78+ log ( `Publishing version: ${ nextVersion } ` , 'green' ) ;
6679
6780 // Set the version in package.json
6881 const packageJsonFile = path . join ( packageDir , 'package.json' ) ;
6982 packageJson . version = nextVersion ;
70- console . log ( `Set version of ${ packageJsonFile } to ${ nextVersion } ` ) ;
83+
84+ // Set the commit in package.json
85+ if ( repoCommit ) {
86+ packageJson . commit = repoCommit ;
87+ log ( `Set commit of ${ packageJsonFile } to ${ repoCommit } ` ) ;
88+ } else {
89+ throw new Error ( `No commit set` ) ;
90+ }
91+
92+ // Set peer dependencies
93+ if ( peerDependencies ) {
94+ packageJson . peerDependencies = peerDependencies ;
95+ log ( `Set peerDependencies of ${ packageJsonFile } to ${ JSON . stringify ( peerDependencies ) } ` ) ;
96+ } else {
97+ log ( `Skipping peerDependencies` ) ;
98+ }
99+
100+ // Write new package.json
71101 fs . writeFileSync ( packageJsonFile , JSON . stringify ( packageJson , null , 2 ) ) ;
72102
73103 // Publish
@@ -78,19 +108,27 @@ function checkAndPublishPackage(packageDir) {
78108 if ( isDryRun ) {
79109 args . push ( '--dry-run' ) ;
80110 }
81- console . log ( `Spawn: npm ${ args . join ( ' ' ) } ` ) ;
111+ log ( `Spawn: npm ${ args . join ( ' ' ) } ` ) ;
82112 const result = cp . spawnSync ( 'npm' , args , {
83113 cwd : packageDir ,
84114 stdio : 'inherit'
85115 } ) ;
86116 if ( result . status ) {
87- console . error ( `Spawn exited with code ${ result . status } ` ) ;
117+ error ( `Spawn exited with code ${ result . status } ` ) ;
88118 process . exit ( result . status ) ;
89119 }
90120
91- console . groupEnd ( ) ;
121+ return { isStableRelease, nextVersion } ;
122+ }
92123
93- return isStableRelease ;
124+ function getRepoCommit ( ) {
125+ const commitProcess = cp . spawnSync ( 'git' , [ 'log' , '-1' , '--format="%H"' ] ) ;
126+ if ( commitProcess . stdout . length === 0 && commitProcess . stderr ) {
127+ const err = versionsProcess . stderr . toString ( ) ;
128+ throw new Error ( 'Could not get repo commit\n' + err ) ;
129+ }
130+ const output = commitProcess . stdout . toString ( ) . trim ( ) ;
131+ return output . replace ( / ^ " / , '' ) . replace ( / " $ / , '' ) ;
94132}
95133
96134function getNextBetaVersion ( packageJson ) {
@@ -118,7 +156,11 @@ function asArray(value) {
118156}
119157
120158function getPublishedVersions ( packageJson , version , tag ) {
121- const versionsProcess = cp . spawnSync ( os . platform === 'win32' ? 'npm.cmd' : 'npm' , [ 'view' , packageJson . name , 'versions' , '--json' ] ) ;
159+ const versionsProcess = cp . spawnSync (
160+ os . platform === 'win32' ? 'npm.cmd' : 'npm' ,
161+ [ 'view' , packageJson . name , 'versions' , '--json' ] ,
162+ { shell : true }
163+ ) ;
122164 if ( versionsProcess . stdout . length === 0 && versionsProcess . stderr ) {
123165 const err = versionsProcess . stderr . toString ( ) ;
124166 if ( err . indexOf ( '404 Not Found - GET https://registry.npmjs.org/@xterm' ) > 0 ) {
@@ -152,10 +194,29 @@ function getChangedFilesInCommit(commit) {
152194}
153195
154196function updateWebsite ( ) {
155- console . log ( 'Updating website' ) ;
197+ log ( 'Updating website' , 'green ') ;
156198 const cwd = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , 'website-' ) ) ;
157199 const packageJson = require ( path . join ( path . resolve ( __dirname , '..' ) , 'package.json' ) ) ;
158200 if ( ! isDryRun ) {
159201 cp . spawnSync ( 'sh' , [ path . join ( __dirname , 'update-website.sh' ) , packageJson . version ] , { cwd, stdio : [ process . stdin , process . stdout , process . stderr ] } ) ;
160202 }
161203}
204+
205+ /**
206+ * @param {string } message
207+ */
208+ function log ( message , color ) {
209+ let colorSequence = '' ;
210+ switch ( color ) {
211+ case 'green' : {
212+ colorSequence = '\x1b[32m' ;
213+ break ;
214+ }
215+ }
216+ console . info ( [
217+ `[\x1b[2m${ new Date ( ) . toLocaleTimeString ( 'en-GB' ) } \x1b[0m] ` ,
218+ colorSequence ,
219+ message ,
220+ '\x1b[0m' ,
221+ ] . join ( '' ) ) ;
222+ }
0 commit comments