@@ -50,11 +50,11 @@ export async function fetchAndExtractPackage(options: { name: string, dist?: str
50
50
await fsp . mkdir ( tempDir , { recursive : true } )
51
51
52
52
// Get the package tarball URL
53
- const tgzPath = await Promise . any ( [
54
- downloadWithHttp ( name , tempDir , tempFile , retry , logger ) ,
55
- downloadWithNpmHttp ( name , tempDir , tempFile , retry , logger ) ,
56
- downloadWitchPack ( name , tempDir , retry , logger ) ,
57
- ] )
53
+ const tgzPath = await retryAsync ( async ( ) => Promise . any ( [
54
+ downloadWithHttp ( name , path . join ( tempDir , 'http' ) , tempFile , logger ) ,
55
+ downloadWithNpmHttp ( name , path . join ( tempDir , 'npm' ) , tempFile , logger ) ,
56
+ downloadWitchPack ( name , path . join ( tempDir , 'pack' ) , logger ) ,
57
+ ] ) , retry ) as string
58
58
59
59
logger . info ( `${ loggerPrefix } download tgz success!` )
60
60
logger . info ( `${ loggerPrefix } tgzPath: ${ tgzPath } \ntempDir: ${ tempDir } ` )
@@ -114,69 +114,66 @@ async function retryAsync<T>(fn: () => Promise<T>, retries: number): Promise<T>
114
114
}
115
115
}
116
116
117
- export async function downloadWitchPack ( name : string , tempDir : string , retry : number , logger : any ) {
118
- await retryAsync ( ( ) => {
119
- return new Promise ( ( resolve , reject ) => {
120
- const { result, status } = jsShell ( `npm pack ${ name } --pack-destination ${ tempDir } ` )
121
- if ( status !== 0 ) {
122
- logger . error ( result )
123
- reject ( result )
124
- }
125
- else {
126
- resolve ( true )
127
- }
128
- } )
129
- } , retry )
130
- const tarballPattern = `${ name . replace ( '@' , '' ) . replace ( '/' , '-' ) } -.*.tgz`
117
+ export async function downloadWitchPack ( name : string , tempDir : string , logger : any = console ) {
118
+ await fsp . mkdir ( tempDir , { recursive : true } )
119
+ await new Promise ( ( resolve , reject ) => {
120
+ const { result, status } = jsShell ( `npm pack ${ name } --pack-destination ${ tempDir } ` )
121
+ if ( status !== 0 ) {
122
+ logger . error ( result )
123
+ reject ( result )
124
+ }
125
+ else {
126
+ resolve ( true )
127
+ }
128
+ } )
129
+ if ( name . startsWith ( '@' ) )
130
+ name = name . slice ( 1 )
131
+ const tarballPattern = `${ name . replace ( / [ / @ ] / g, '-' ) } .tgz`
131
132
const [ tarballPath ] = await fsp . readdir ( tempDir ) . then ( files => files . filter ( file => file . match ( tarballPattern ) ) )
132
133
return path . join ( tempDir , tarballPath )
133
134
}
134
135
135
- export async function downloadWithNpmHttp ( name : string , tempDir : string , tempFile : string , retry : number , logger : any ) {
136
- const tarballUrl = await retryAsync ( async ( ) => {
137
- return new Promise ( ( resolve , reject ) => {
138
- const { result, status } = jsShell ( `npm view ${ name } dist.tarball` )
139
- if ( status !== 0 ) {
140
- logger . error ( result )
141
- reject ( result )
142
- }
143
- else {
144
- resolve ( result )
145
- }
146
- } )
147
- } , retry )
136
+ export async function downloadWithNpmHttp ( name : string , tempDir : string , tempFile : string , logger : any = console ) {
137
+ await fsp . mkdir ( tempDir , { recursive : true } )
138
+ const tarballUrl = await new Promise ( ( resolve , reject ) => {
139
+ const { result, status } = jsShell ( `npm view ${ name } dist.tarball` )
140
+ if ( status !== 0 ) {
141
+ logger . error ( result )
142
+ reject ( result )
143
+ }
144
+ else {
145
+ resolve ( result )
146
+ }
147
+ } )
148
148
149
149
if ( ! tarballUrl )
150
150
return ''
151
151
const protocol = new URL ( tarballUrl ) . protocol
152
152
const lib = protocol === 'https:' ? https : http
153
- const tgzPath = path . join ( tempDir , `${ tempFile } .tgz` )
153
+ const tgzPath = path . join ( tempDir , `${ tempFile . replace ( / @ \d + \. \d + \. \d + / , '' ) } .tgz` )
154
154
const tgzFile = createWriteStream ( tgzPath )
155
155
156
- await retryAsync ( ( ) => new Promise < void > ( ( resolve , reject ) => {
156
+ return new Promise ( ( resolve , reject ) => {
157
+ tgzFile . on ( 'error' , reject )
157
158
lib . get ( tarballUrl , ( response ) => {
158
159
response . pipe ( tgzFile )
159
160
tgzFile . on ( 'finish' , ( ) => {
160
161
tgzFile . close ( )
161
- resolve ( )
162
+ resolve ( tgzPath )
162
163
} )
163
164
} ) . on ( 'error' , ( error ) => {
164
- fsp . unlink ( tgzPath ) . catch ( ( error ) => {
165
- reject ( error )
166
- } )
167
165
tgzFile . close ( )
168
166
reject ( error )
169
167
} )
170
- } ) , retry )
171
-
172
- return tgzPath
168
+ } )
173
169
}
174
170
175
- export async function downloadWithHttp ( name : string , tempDir : string , tempFile : string , retry : number , logger : any ) {
171
+ export async function downloadWithHttp ( name : string , tempDir : string , tempFile : string , logger : any = console ) {
172
+ await fsp . mkdir ( tempDir , { recursive : true } )
176
173
const tarballUrl = await Promise . any ( [
177
- retryAsync ( ( ) => getTarballUrlFromRegistry ( name ) , retry ) ,
178
- retryAsync ( ( ) => getTarballUrlFromYarn ( name ) , retry ) ,
179
- retryAsync ( ( ) => getTarballUrlFromTencent ( name ) , retry ) ,
174
+ getTarballUrlFromRegistry ( name ) ,
175
+ getTarballUrlFromYarn ( name ) ,
176
+ getTarballUrlFromTencent ( name ) ,
180
177
] ) . catch ( ( error ) => {
181
178
logger . error ( `[fetch-npm]: Failed to fetch tarball URL from all sources: ${ error } ` )
182
179
throw error
@@ -189,22 +186,18 @@ export async function downloadWithHttp(name: string, tempDir: string, tempFile:
189
186
const tgzPath = path . join ( tempDir , `${ tempFile } .tgz` )
190
187
const tgzFile = createWriteStream ( tgzPath )
191
188
192
- await retryAsync ( ( ) => new Promise < void > ( ( resolve , reject ) => {
189
+ return new Promise ( ( resolve , reject ) => {
190
+ tgzFile . on ( 'error' , reject )
193
191
lib . get ( tarballUrl , ( response ) => {
194
192
response . pipe ( tgzFile )
195
193
tgzFile . on ( 'finish' , ( ) => {
196
194
tgzFile . close ( )
197
- resolve ( )
195
+ resolve ( tgzPath )
198
196
} )
199
197
} ) . on ( 'error' , ( error ) => {
200
- fsp . unlink ( tgzPath ) . catch ( ( error ) => {
201
- reject ( error )
202
- } )
203
198
reject ( error )
204
199
} )
205
- } ) , retry )
206
-
207
- return tgzPath
200
+ } )
208
201
}
209
202
210
203
async function getTarballUrlFromRegistry ( name : string ) : Promise < string > {
0 commit comments