1- import { getChangelog } from "./shared" ;
21import { readFile , writeFile } from "fs/promises" ;
3- import { resolve } from "path" ;
2+ import { join , resolve } from "path" ;
43import { SemanticVersion } from "@hediet/semver" ;
54import { context } from "@actions/github" ;
65import { exec } from "@actions/exec" ;
6+ import { readFileSync } from "fs" ;
7+ import { Changelog } from "./changelog" ;
78
89const packageJsonPath = resolve ( __dirname , "../package.json" ) ;
910
1011export async function run ( ) : Promise < void > {
1112 const changeLog = getChangelog ( ) ;
1213 const version = changeLog . latestVersion ;
1314
14- const packageJson = await readJsonFile < { version : string } > ( packageJsonPath ) ;
15+ const packageJson = await readJsonFile < { version : string ; preRelease ?: boolean } > ( packageJsonPath ) ;
1516 const stableVersion = SemanticVersion . parse ( packageJson . version ) ;
1617
1718 if ( version . kind !== 'released' || version . version . toString ( ) !== stableVersion . toString ( ) ) {
1819 throw new Error ( "Version in package.json does not match latest version in changelog." ) ;
1920 }
2021
22+ if ( stableVersion . patch !== 0 ) {
23+ throw new Error ( "Patch version must be 0." ) ;
24+ }
25+
2126 const gh = new GitHubClient ( ) ;
2227
28+ const isPreRelease = ! ! packageJson . preRelease ;
29+
2330 const stableTag = `v${ stableVersion } ` ;
24- if ( ! await gh . tagExists ( context . repo , stableTag ) ) {
25- try {
26- await publish ( 'stable' , stableVersion ) ;
27- } catch ( e ) { }
28- //await gh.createTag(context.repo, stableTag, context.sha);
31+ const stableGhTagExists = await gh . tagExists ( context . repo , stableTag ) ;
32+ if ( ! isPreRelease && ! stableGhTagExists ) {
33+ await buildAndPublish ( 'stable' , stableVersion ) ;
34+ await gh . createTag ( context . repo , stableTag , context . sha ) ;
2935 } else {
30- console . log ( `GitHub tag for stable version ${ stableTag } exists, skipping publish.` ) ;
36+ if ( stableGhTagExists ) {
37+ console . log ( `GitHub tag for stable version ${ stableTag } exists, skipping publish.` ) ;
38+ }
39+ if ( isPreRelease ) {
40+ console . log ( "Pre-release version detected, skipping stable" ) ;
41+ }
3142 }
3243
3344 const runNumber = process . env . GITHUB_RUN_NUMBER ;
34- const preReleaseNumber = `${ new Date ( ) . toISOString ( ) . replace ( / [ ^ 0 - 9 ] / g , '' ) } 0${ runNumber } ` ;
45+ const preReleaseNumber = `${ formatDate ( new Date ( ) ) } 0${ Number ( runNumber ) } ` ;
3546 const previewVersion = stableVersion . with ( { patch : Number ( preReleaseNumber ) } ) ;
3647
3748 const previewTag = `v${ previewVersion } ` ;
38- if ( ! await gh . tagExists ( context . repo , previewTag ) ) {
39- try {
40- await publish ( 'preRelease' , previewVersion ) ;
41- } catch ( e ) { }
42- // await gh.createTag(context.repo, previewTag, context.sha);
49+
50+ const previewGhTagExists = await gh . tagExists ( context . repo , previewTag ) ;
51+ if ( ! previewGhTagExists ) {
52+ await buildAndPublish ( 'preRelease' , previewVersion ) ;
53+ await gh . createTag ( context . repo , previewTag , context . sha ) ;
4354 } else {
4455 console . log ( `GitHub tag for preview version ${ previewTag } exists, skipping publish.` ) ;
4556 }
4657}
4758
48- async function publish ( releaseType : 'stable' | 'preRelease' , version : SemanticVersion ) {
59+ async function buildAndPublish ( releaseType : 'stable' | 'preRelease' , version : SemanticVersion ) {
4960 console . log ( `Publishing ${ releaseType } version ${ version } ...` ) ;
5061
5162 const packageJson = await readJsonFile < any > ( packageJsonPath ) ;
@@ -62,11 +73,24 @@ async function publish(releaseType: 'stable' | 'preRelease', version: SemanticVe
6273 "vsce" ,
6374 "publish" ,
6475 "--pat" ,
65- process . env . VSCE_TOKEN ! ,
76+ process . env . VSCE_PAT ! ,
6677 ...( releaseType === 'preRelease' ? [ '--pre-release' ] : [ ] ) ]
6778 ) ;
6879}
6980
81+
82+ function padN ( num : number , n : number ) : string {
83+ return num . toString ( ) . padStart ( n , '0' ) ;
84+ }
85+
86+ function formatDate ( date : Date ) : string {
87+ const year = date . getUTCFullYear ( ) ;
88+ const month = date . getUTCMonth ( ) + 1 ;
89+ const day = date . getUTCDate ( ) ;
90+
91+ return `${ year } ${ padN ( month , 2 ) } ${ padN ( day , 2 ) } ` ;
92+ }
93+
7094interface IRepo {
7195 owner : string ;
7296 repo : string ;
@@ -119,3 +143,11 @@ async function writeJsonFile(path: string, data: unknown): Promise<void> {
119143 const content = JSON . stringify ( data , null , '\t' ) ;
120144 await writeFile ( path , content , 'utf-8' ) ;
121145}
146+
147+ function readTextFileSync ( fileName : string ) : string {
148+ return readFileSync ( fileName , { encoding : "utf-8" } ) ;
149+ }
150+
151+ function getChangelog ( ) : Changelog {
152+ return new Changelog ( readTextFileSync ( join ( __dirname , "../CHANGELOG.md" ) ) ) ;
153+ }
0 commit comments