@@ -4,6 +4,70 @@ import { access, readFile, writeFile } from 'node:fs/promises';
44import path from 'node:path' ;
55import { $ } from 'bun' ;
66
7+ function normalizeVersion ( version : string ) : string {
8+ return version . trim ( ) . replace ( / ^ r e f s \/ t a g s \/ / , '' ) . replace ( / ^ v / , '' ) ;
9+ }
10+
11+ function getVersionFromEnvironment ( ) : string | null {
12+ const candidates = [
13+ process . env . RELEASE_VERSION ,
14+ process . env . CI_COMMIT_TAG ,
15+ process . env . GITHUB_REF_TYPE === 'tag' ? process . env . GITHUB_REF_NAME : null ,
16+ process . env . GITHUB_REF ?. startsWith ( 'refs/tags/' )
17+ ? process . env . GITHUB_REF
18+ : null ,
19+ ] ;
20+
21+ for ( const candidate of candidates ) {
22+ if ( candidate ?. trim ( ) ) {
23+ return normalizeVersion ( candidate ) ;
24+ }
25+ }
26+
27+ return null ;
28+ }
29+
30+ function getShellErrorMessage ( error : unknown ) : string {
31+ if (
32+ typeof error === 'object' &&
33+ error !== null &&
34+ 'stderr' in error &&
35+ typeof error . stderr === 'string' &&
36+ error . stderr . trim ( )
37+ ) {
38+ return error . stderr . trim ( ) ;
39+ }
40+
41+ if ( error instanceof Error && error . message . trim ( ) ) {
42+ return error . message . trim ( ) ;
43+ }
44+
45+ return 'Unknown git error' ;
46+ }
47+
48+ async function getVersionFromGit ( ) : Promise < string > {
49+ try {
50+ return normalizeVersion ( await $ `git describe --tags --always` . text ( ) ) ;
51+ } catch ( error ) {
52+ const message = getShellErrorMessage ( error ) ;
53+
54+ if ( message . includes ( 'detected dubious ownership' ) ) {
55+ throw new Error (
56+ 'Git refused to read repository metadata because this checkout is not marked as safe. Configure safe.directory in CI or provide RELEASE_VERSION/GITHUB_REF_NAME.' ,
57+ { cause : error } ,
58+ ) ;
59+ }
60+
61+ throw new Error ( `Unable to resolve publish version from git: ${ message } ` , {
62+ cause : error ,
63+ } ) ;
64+ }
65+ }
66+
67+ async function resolveVersion ( ) : Promise < string > {
68+ return getVersionFromEnvironment ( ) ?? ( await getVersionFromGit ( ) ) ;
69+ }
70+
771async function modifyPackageJson ( {
872 version,
973} : {
@@ -35,17 +99,15 @@ async function modifyPackageJson({
3599}
36100
37101async function main ( ) : Promise < void > {
38- const version = ( await $ `git describe --tags --always` . text ( ) )
39- . replace ( 'v' , '' )
40- . trim ( ) ;
41102 try {
103+ const version = await resolveVersion ( ) ;
104+ console . log ( `Using publish version ${ version } ` ) ;
42105 await modifyPackageJson ( { version } ) ;
43106 console . log ( '✅ Prepublish script completed successfully' ) ;
44107 } catch ( error ) {
45108 console . error ( '❌ Prepublish script failed:' , error ) ;
46109 process . exit ( 1 ) ;
47110 }
48-
49111}
50112
51113main ( ) ;
0 commit comments