1
- import { warning } from '@actions/core' ;
2
- import { $ , file } from 'bun' ;
1
+ import { info , warning } from '@actions/core' ;
2
+ import type { PackageJson , PackumentVersion } from '@npm/types' ;
3
+ import { $ , file , write } from 'bun' ;
3
4
4
5
const nonNodePackages = new Set ( [ '@discordjs/proxy-container' ] ) ;
5
6
@@ -25,11 +26,24 @@ export interface ReleaseEntry {
25
26
version : string ;
26
27
}
27
28
28
- async function getReleaseEntries ( ) {
29
+ async function fetchDevVersion ( pkg : string ) {
30
+ try {
31
+ const res = await fetch ( `https://registry.npmjs.org/${ pkg } /dev` ) ;
32
+ if ( ! res . ok ) return null ;
33
+ const packument = ( await res . json ( ) ) as PackumentVersion ;
34
+ return packument . version ;
35
+ } catch {
36
+ return null ;
37
+ }
38
+ }
39
+
40
+ async function getReleaseEntries ( dev : boolean , dry : boolean ) {
29
41
const releaseEntries : ReleaseEntry [ ] = [ ] ;
30
42
const packageList : pnpmTree [ ] =
31
43
await $ `pnpm list --recursive --only-projects --filter {packages/\*} --prod --json` . json ( ) ;
32
44
45
+ const commitHash = ( await $ `git rev-parse --short HEAD` . text ( ) ) . trim ( ) ;
46
+
33
47
for ( const pkg of packageList ) {
34
48
// Don't release private packages ever (npm will error anyways)
35
49
if ( pkg . private ) continue ;
@@ -42,35 +56,61 @@ async function getReleaseEntries() {
42
56
version : pkg . version ,
43
57
} ;
44
58
45
- try {
46
- // Find and parse changelog to post in github release
47
- const changelogFile = await file ( `${ pkg . path } /CHANGELOG.md` ) . text ( ) ;
48
-
49
- let changelogLines : string [ ] = [ ] ;
50
- let foundChangelog = false ;
59
+ if ( dev ) {
60
+ const devVersion = await fetchDevVersion ( pkg . name ) ;
61
+ if ( devVersion ?. endsWith ( commitHash ) ) {
62
+ // Write the currently released dev version so when pnpm publish runs on dependents they depend on the dev versions
63
+ if ( dry ) {
64
+ info ( `[DRY] ${ pkg . name } @${ devVersion } already released. Editing package.json version.` ) ;
65
+ } else {
66
+ const pkgJson = ( await file ( `${ pkg . path } /package.json` ) . json ( ) ) as PackageJson ;
67
+ pkgJson . version = devVersion ;
68
+ await write ( `${ pkg . path } /package.json` , JSON . stringify ( pkgJson , null , '\t' ) ) ;
69
+ }
51
70
52
- for ( const line of changelogFile . split ( '\n' ) ) {
53
- if ( line . startsWith ( '# [' ) ) {
54
- if ( foundChangelog ) {
55
- if ( changelogLines . at ( - 1 ) === '' ) {
56
- changelogLines = changelogLines . slice ( 2 , - 1 ) ;
71
+ release . version = devVersion ;
72
+ } else if ( dry ) {
73
+ info ( `[DRY] Bumping ${ pkg . name } via git-cliff.` ) ;
74
+ release . version = `${ pkg . version } .DRY-dev.${ Math . round ( Date . now ( ) / 1_000 ) } -${ commitHash } ` ;
75
+ } else {
76
+ await $ `pnpm --filter=${ pkg . name } run release --preid "dev.${ Math . round ( Date . now ( ) / 1_000 ) } -${ commitHash } "` ;
77
+ // Read again instead of parsing the output to be sure we're matching when checking against npm
78
+ const pkgJson = ( await file ( `${ pkg . path } /package.json` ) . json ( ) ) as PackageJson ;
79
+ release . version = pkgJson . version ;
80
+ }
81
+ }
82
+ // Only need changelog for releases published to github
83
+ else {
84
+ try {
85
+ // Find and parse changelog to post in github release
86
+ const changelogFile = await file ( `${ pkg . path } /CHANGELOG.md` ) . text ( ) ;
87
+
88
+ let changelogLines : string [ ] = [ ] ;
89
+ let foundChangelog = false ;
90
+
91
+ for ( const line of changelogFile . split ( '\n' ) ) {
92
+ if ( line . startsWith ( '# [' ) ) {
93
+ if ( foundChangelog ) {
94
+ if ( changelogLines . at ( - 1 ) === '' ) {
95
+ changelogLines = changelogLines . slice ( 2 , - 1 ) ;
96
+ }
97
+
98
+ break ;
57
99
}
58
100
59
- break ;
101
+ foundChangelog = true ;
60
102
}
61
103
62
- foundChangelog = true ;
104
+ if ( foundChangelog ) {
105
+ changelogLines . push ( line ) ;
106
+ }
63
107
}
64
108
65
- if ( foundChangelog ) {
66
- changelogLines . push ( line ) ;
67
- }
109
+ release . changelog = changelogLines . join ( '\n' ) ;
110
+ } catch ( error ) {
111
+ // Probably just no changelog file but log just in case
112
+ warning ( `Error parsing changelog for ${ pkg . name } , will use auto generated: ${ error } ` ) ;
68
113
}
69
-
70
- release . changelog = changelogLines . join ( '\n' ) ;
71
- } catch ( error ) {
72
- // Probably just no changelog file but log just in case
73
- warning ( `Error parsing changelog for ${ pkg . name } , will use auto generated: ${ error } ` ) ;
74
114
}
75
115
76
116
if ( pkg . dependencies ) {
@@ -83,8 +123,8 @@ async function getReleaseEntries() {
83
123
return releaseEntries ;
84
124
}
85
125
86
- export async function generateReleaseTree ( packageName ?: string , exclude ?: string [ ] ) {
87
- let releaseEntries = await getReleaseEntries ( ) ;
126
+ export async function generateReleaseTree ( dev : boolean , dry : boolean , packageName ?: string , exclude ?: string [ ] ) {
127
+ let releaseEntries = await getReleaseEntries ( dev , dry ) ;
88
128
// Try to early return if the package doesn't have deps
89
129
if ( packageName ) {
90
130
const releaseEntry = releaseEntries . find ( ( entry ) => entry . name === packageName ) ;
0 commit comments