1
1
#!/usr/bin/env node
2
2
'use strict'
3
-
4
- const util = require ( 'util' ) ;
3
+ const argv = require ( 'yargs-parser' ) ( process . argv . slice ( 2 ) , { alias :{ release : [ 'r' ] } } )
5
4
const path = require ( "path" ) ;
6
5
const chalk = require ( 'chalk' ) ;
7
6
const ora = require ( "ora" ) ;
8
- const unzipper = require ( 'unzipper' ) ;
9
- const request_original = require ( 'request' ) ; //TODO: maybe use got or smth else as request is deprecated
10
- const request = util . promisify ( request_original ) ;
7
+ const pacote = require ( 'pacote' ) ;
8
+ const fs = require ( "fs-extra" ) ;
9
+ const os = require ( 'os' ) ;
10
+ const packageName = 'html5-boilerplate' ;
11
11
12
- const args = process . argv . slice ( 2 ) ;
12
+ const extract = async ( tempDir , version = '' ) => {
13
+ return new Promise ( ( resolve , reject ) => {
14
+ pacote . extract ( packageName + '@' + version , tempDir , { } )
15
+ . then ( res => resolve ( res ) )
16
+ . catch ( err => {
17
+ reject ( err ) ;
18
+ } ) ;
19
+ } ) ;
20
+ }
13
21
14
22
( async ( ) => {
15
- const spinner = ora ( 'Fetching latest release version' ) . start ( ) ;
16
-
17
- const { error, response, body} = await request ( {
18
- url :'https://api.github.com/repos/h5bp/html5-boilerplate/releases/latest' ,
19
- headers : {
20
- 'User-Agent' : 'request'
23
+ const version = argv [ 'release' ] ;
24
+ const targetDir = path . resolve ( argv [ '_' ] [ 0 ] || './' ) ;
25
+ const spinner = ora ( `Downloading ${ packageName } ${ version ? 'version ' + version : 'latest version' } to ${ targetDir } ` ) . start ( ) ;
26
+ const tempDir = os . tmpdir ( ) + `/${ packageName } -staging` ;
27
+ await fs . ensureDir ( tempDir ) ;
28
+ try {
29
+ const { from : nameWithVersion } = await extract ( tempDir , version ) ; //{from, resolved, integrity}
30
+ spinner . text = `${ nameWithVersion } copied to ${ targetDir } . Have fun!` ;
31
+ } catch ( err ) {
32
+ if ( err . code === 'ETARGET' && err . type === 'tag' ) {
33
+ console . log ( chalk . red ( `version '${ err . wanted } ' not found in npm registry\navaialable versions:` ) ) ;
34
+ console . log ( err . versions . reverse ( ) . join ( ' | ' ) ) ;
35
+ } else {
36
+ console . log ( err ) ;
21
37
}
22
- } ) ;
23
- if ( error ) {
24
- Promise . reject ( "smth wrong TODO: error message" ) ;
25
- }
26
- const data = JSON . parse ( body ) ;
27
- const version = data . name ;
28
- const zipURL = data . assets [ 0 ] . browser_download_url ;
29
- if ( ! zipURL ) {
30
- Promise . reject ( 'Unexpected error: zipURL not defined' )
38
+ process . exit ( 0 ) ;
31
39
}
32
- const extractPath = path . normalize ( args [ 0 ] || '' ) ;
33
- spinner . text = `Copying html5-boilerplate ${ version } to ${ extractPath } ` ;
34
- await unzipper . Open . url ( request_original , zipURL ) . then ( d => d . extract ( { path : path . resolve ( extractPath ) } ) ) ;
35
- spinner . text = `html5-boilerplate copied ${ version } to ${ extractPath } . Have fun!` ;
40
+ await fs . copy ( tempDir + '/dist' , targetDir ) ;
41
+ await fs . remove ( tempDir ) ;
36
42
spinner . succeed ( ) ;
43
+ return ;
37
44
} ) ( ) ;
0 commit comments