1
+ import fetch from 'node-fetch' ;
1
2
import fs from 'fs' ;
2
- import https from 'node:https' ;
3
3
4
- // 生成 Markdown 內容並更新 README.md 檔案
5
4
function generateMarkdown ( { beforeMarker, afterMarker, content } ) {
6
5
let readme = fs . readFileSync ( 'README.md' , 'utf8' ) ;
7
6
let before = readme . substring ( 0 , readme . indexOf ( beforeMarker ) + beforeMarker . length ) ;
8
7
let after = readme . substring ( readme . indexOf ( afterMarker ) ) ;
9
-
10
8
fs . writeFileSync ( 'README.md' , `${ before } \n${ content } \n${ after } ` ) ;
11
9
}
12
10
13
- // 根據資產名稱和下載 URL 生成對應的 shell 命令
14
11
function generateShellCommand ( asset ) {
15
12
if ( asset . name . includes ( 'win-x64' ) ) {
16
13
return `powershell.exe -Command "Invoke-WebRequest -Uri ${ asset . browser_download_url } -OutFile ${ asset . name } ; Start-Process ${ asset . name } -Wait; Remove-Item ${ asset . name } -Force"` ;
@@ -19,7 +16,6 @@ function generateShellCommand(asset) {
19
16
}
20
17
}
21
18
22
- // 根據資產名稱選擇對應的標記
23
19
function selectMarkers ( asset ) {
24
20
if ( asset . name . includes ( 'env-setup-win-x64' ) ) {
25
21
return { beforeMarker : '<!-- WINDOWS_LINK_X64_START -->' , afterMarker : '<!-- WINDOWS_LINK_X64_END -->' } ;
@@ -32,60 +28,42 @@ function selectMarkers(asset) {
32
28
}
33
29
}
34
30
35
- const MAX_RETRIES = 10 ; // 最大重試次數
36
- const RETRY_DELAY = 5000 ; // 重試間隔時間,單位毫秒
37
-
38
- function fetchReleaseData ( retryCount = 0 ) {
39
- const url = `https://api.github.com/repos/DinosauriaLab/npm-env-setup/releases/latest` ;
40
- const options = {
41
- headers : {
42
- 'User-Agent' : 'node.js' ,
43
- } ,
44
- } ;
31
+ const MAX_RETRIES = 10 ;
32
+ const RETRY_DELAY = 5000 ;
45
33
46
- https
47
- . get ( url , options , ( res ) => {
48
- let data = '' ;
49
- res . on ( 'data' , ( chunk ) => {
50
- data += chunk ;
51
- } ) ;
52
- res . on ( 'end' , ( ) => {
53
- try {
54
- const release = JSON . parse ( data ) ;
55
- console . log ( `Latest release: ${ release . name } ` ) ;
56
- release . assets . forEach ( ( asset ) => {
57
- console . log ( `Download URL: ${ asset . browser_download_url } ` ) ;
58
- console . log ( `Asset name: ${ asset . name } ` ) ;
59
- const shellCommand = generateShellCommand ( asset ) ;
60
- const { beforeMarker, afterMarker } = selectMarkers ( asset ) ;
61
- if ( beforeMarker && afterMarker ) {
62
- generateMarkdown ( {
63
- beforeMarker,
64
- afterMarker,
65
- content : '```shell\n' + shellCommand + '\n```' ,
66
- } ) ;
67
- }
68
- } ) ;
69
- } catch ( error ) {
70
- console . error ( 'Error parsing response: ' , error . message ) ;
71
- retryOrFail ( retryCount ) ;
72
- }
73
- } ) ;
74
- } )
75
- . on ( 'error' , ( err ) => {
76
- console . error ( 'HTTPS request failed: ' , err . message ) ;
77
- retryOrFail ( retryCount ) ;
34
+ async function fetchReleaseData ( retryCount = 0 ) {
35
+ const url = `https://api.github.com/repos/leoli0605/npm-env-setup/releases/latest` ;
36
+ try {
37
+ const response = await fetch ( url , {
38
+ headers : {
39
+ 'User-Agent' : 'node.js' ,
40
+ } ,
78
41
} ) ;
79
- }
80
-
81
- function retryOrFail ( retryCount ) {
82
- if ( retryCount < MAX_RETRIES ) {
83
- console . log ( `Retry ${ retryCount + 1 } /${ MAX_RETRIES } after ${ RETRY_DELAY } ms...` ) ;
84
- setTimeout ( ( ) => fetchReleaseData ( retryCount + 1 ) , RETRY_DELAY ) ;
85
- } else {
86
- console . log ( 'Max retries reached. Giving up.' ) ;
42
+ if ( ! response . ok ) throw new Error ( `HTTP error! status: ${ response . status } ` ) ;
43
+ const release = await response . json ( ) ;
44
+ console . log ( `Latest release: ${ release . name } ` ) ;
45
+ release . assets . forEach ( ( asset ) => {
46
+ console . log ( `Download URL: ${ asset . browser_download_url } ` ) ;
47
+ console . log ( `Asset name: ${ asset . name } ` ) ;
48
+ const shellCommand = generateShellCommand ( asset ) ;
49
+ const { beforeMarker, afterMarker } = selectMarkers ( asset ) ;
50
+ if ( beforeMarker && afterMarker ) {
51
+ generateMarkdown ( {
52
+ beforeMarker,
53
+ afterMarker,
54
+ content : '```shell\n' + shellCommand + '\n```' ,
55
+ } ) ;
56
+ }
57
+ } ) ;
58
+ } catch ( error ) {
59
+ console . error ( 'Error fetching release data: ' , error . message ) ;
60
+ if ( retryCount < MAX_RETRIES ) {
61
+ console . log ( `Retry ${ retryCount + 1 } /${ MAX_RETRIES } after ${ RETRY_DELAY } ms...` ) ;
62
+ setTimeout ( ( ) => fetchReleaseData ( retryCount + 1 ) , RETRY_DELAY ) ;
63
+ } else {
64
+ console . log ( 'Max retries reached. Giving up.' ) ;
65
+ }
87
66
}
88
67
}
89
68
90
- // 初始調用
91
69
fetchReleaseData ( ) ;
0 commit comments