@@ -3,7 +3,8 @@ const yargs_parser = require("yargs-parser");
3
3
const path = require ( "path" ) ;
4
4
const chalk = require ( "chalk" ) ;
5
5
const langsList = require ( "./countries.json" ) ;
6
- const prompts = require ( "prompts" ) ;
6
+ const inquirer = require ( "inquirer" ) ;
7
+ const fuzzy = require ( "fuzzy" ) ;
7
8
const ora = require ( "ora" ) ;
8
9
const { extract } = require ( "pacote" ) ;
9
10
const glob = require ( "fast-glob" ) ;
@@ -13,7 +14,11 @@ const packageName = "html5-boilerplate";
13
14
const tempDir = os . tmpdir ( ) + `/${ packageName } -staging` ;
14
15
const elapsed = require ( "elapsed-time-logger" ) ;
15
16
const compareVersions = require ( "compare-versions" ) ;
16
-
17
+ let spinner ;
18
+ inquirer . registerPrompt (
19
+ "autocomplete" ,
20
+ require ( "inquirer-autocomplete-prompt" )
21
+ ) ;
17
22
module . exports = async ( argvs ) => {
18
23
const argv = yargs_parser ( argvs , {
19
24
alias : { release : [ "r" ] , yes : [ "y" ] } ,
@@ -26,7 +31,7 @@ module.exports = async (argvs) => {
26
31
console . log ( chalk . red ( "Aborted" ) ) ;
27
32
return ;
28
33
}
29
- let spinner = ora (
34
+ spinner = ora (
30
35
`Downloading ${ packageName } version '${ version } ' to ${ targetDir } `
31
36
) . start ( ) ;
32
37
await fs . ensureDir ( tempDir ) ;
@@ -38,24 +43,20 @@ module.exports = async (argvs) => {
38
43
) ;
39
44
await fs . copy ( tempDir + "/dist" , targetDir ) ;
40
45
const timerDownloaded = timer . get ( ) ;
41
- spinner . stop ( ) ;
42
46
await onLoad ( targetDir , version , argv ) ;
43
- console . log (
44
- chalk . green ( "✔" ) +
45
- ` ${ nameWithVersion } copied to ${ targetDir } in ${ timerDownloaded } . Have fun!`
47
+ spinner . succeed (
48
+ ` ${ nameWithVersion } copied to ${ targetDir } in ${ timerDownloaded } . Have fun!`
46
49
) ;
47
50
return ;
48
51
} catch ( err ) {
49
- spinner . stop ( ) ;
50
52
if ( err . code === "ETARGET" ) {
51
53
const msg = chalk . red (
52
- `✖ version '${ err . wanted } ' not found in npm registry\navailable versions:\n`
54
+ `version '${ err . wanted } ' not found in npm registry\navailable versions:\n`
53
55
) ;
54
- console . log ( msg + err . versions . reverse ( ) . join ( " | " ) ) ;
56
+ spinner . fail ( msg + err . versions . reverse ( ) . join ( " | " ) ) ;
55
57
throw err . code ;
56
58
}
57
- console . error ( err ) ;
58
- console . log ( chalk . red ( "✖ Unexpected error" ) ) ;
59
+ spinner . fail ( "✖ Unexpected error" ) ;
59
60
throw new Error ( err ) ;
60
61
} finally {
61
62
await fs . remove ( tempDir ) ;
@@ -64,7 +65,7 @@ module.exports = async (argvs) => {
64
65
} ;
65
66
66
67
const checkFolder = async ( targetDir , argv ) => {
67
- const folderExists = await fs . exists ( targetDir ) ;
68
+ const folderExists = await fs . pathExists ( targetDir ) ;
68
69
if ( ! folderExists ) {
69
70
return true ;
70
71
}
@@ -73,11 +74,11 @@ const checkFolder = async (targetDir, argv) => {
73
74
}
74
75
const folderFiles = await fs . readdir ( targetDir ) ;
75
76
if ( folderFiles . length !== - 1 ) {
76
- const { override } = await prompts ( {
77
+ const { override } = await inquirer . prompt ( {
77
78
type : "confirm" ,
78
79
name : "override" ,
79
80
message : `${ targetDir } is not an empty folder, proceed?` ,
80
- initial : true ,
81
+ default : true ,
81
82
} ) ;
82
83
return override ;
83
84
}
@@ -96,41 +97,44 @@ const onLoad = async (targetDir, version, argv) => {
96
97
if ( skipPrompts ) {
97
98
return ;
98
99
}
99
- let langListOut = langsList . map ( ( v ) => {
100
- return { title : `${ v . title } (${ v . value } )` , value : v . value } ;
101
- } ) ;
102
- langListOut . splice ( 1 , 0 , { title : "Enter custom" , value : "custom" } ) ;
103
- let lang = argv . lang ;
100
+ const langListMap = { } ;
101
+ const langListOut = [ ] ;
104
102
/* istanbul ignore if */
105
- if ( ! lang ) {
106
- let langChoice = await prompts ( {
107
- type : "select" ,
108
- name : "langChoice" ,
109
- message : "Select language" ,
110
- choices : langListOut ,
111
- } ) ;
112
- if ( langChoice === "custom" ) {
113
- let customLang = await prompts ( {
114
- type : "text" ,
115
- name : "customLang" ,
116
- message : "Enter custom language code" ,
117
- } ) ;
118
- langChoice = customLang ;
103
+ if ( ! argv . lang ) {
104
+ for ( const { title, value } of langsList ) {
105
+ const text = `${ title } (${ value } )` ;
106
+ langListMap [ text ] = value ;
107
+ langListOut . push ( text ) ;
119
108
}
120
- lang = langChoice || "" ;
109
+ langListOut . splice ( 1 , 0 , "Enter custom" ) ;
121
110
}
122
- const isJqueryIncluded =
123
- version !== "latest" && compareVersions ( version , "8.0.0" ) ; // jQuery removed in >= v8
124
- let removeJqueryFlag = false ;
125
- if ( isJqueryIncluded ) {
126
- let { removeJquery } = await prompts ( {
111
+ spinner . stop ( ) ;
112
+ const { langChoice, customLang, removeJquery } = await inquirer . prompt ( [
113
+ {
114
+ type : "autocomplete" ,
115
+ name : "langChoice" ,
116
+ message : "Select language" ,
117
+ when : ! argv . lang ,
118
+ source : async ( answers , input = "" ) =>
119
+ fuzzy . filter ( input , langListOut ) . map ( ( { original } ) => original ) ,
120
+ } ,
121
+ {
122
+ type : "input" ,
123
+ name : "customLang" ,
124
+ message : "Enter custom language code" ,
125
+ when : ( { langChoice } ) => ! argv . lang && langChoice === langListOut [ 1 ] ,
126
+ } ,
127
+ {
127
128
type : "confirm" ,
128
129
name : "removeJquery" ,
129
130
message : "Remove jQuery?" ,
130
- initial : true ,
131
- } ) ;
132
- removeJqueryFlag = removeJquery ;
133
- }
131
+ when : version !== "latest" && compareVersions ( version , "8.0.0" ) ,
132
+ default : true ,
133
+ } ,
134
+ ] ) ;
135
+ spinner . start ( ) ;
136
+ const lang = argv . lang || langListMap [ langChoice ] || customLang || "" ;
137
+ const removeJqueryFlag = removeJquery !== undefined ? removeJquery : false ;
134
138
try {
135
139
const indexFile = targetDir + "/index.html" ;
136
140
const sourceHTML = await fs . readFile ( indexFile , "utf-8" ) ;
@@ -145,6 +149,7 @@ const onLoad = async (targetDir, version, argv) => {
145
149
) ;
146
150
}
147
151
await fs . writeFile ( indexFile , resultHTML ) ;
152
+ return ;
148
153
} catch ( err ) {
149
154
/* istanbul ignore next */
150
155
throw new Error ( err ) ;
0 commit comments