@@ -3,7 +3,8 @@ const yargs_parser = require("yargs-parser");
33const path = require ( "path" ) ;
44const chalk = require ( "chalk" ) ;
55const langsList = require ( "./countries.json" ) ;
6- const prompts = require ( "prompts" ) ;
6+ const inquirer = require ( "inquirer" ) ;
7+ const fuzzy = require ( "fuzzy" ) ;
78const ora = require ( "ora" ) ;
89const { extract } = require ( "pacote" ) ;
910const glob = require ( "fast-glob" ) ;
@@ -13,7 +14,11 @@ const packageName = "html5-boilerplate";
1314const tempDir = os . tmpdir ( ) + `/${ packageName } -staging` ;
1415const elapsed = require ( "elapsed-time-logger" ) ;
1516const compareVersions = require ( "compare-versions" ) ;
16-
17+ let spinner ;
18+ inquirer . registerPrompt (
19+ "autocomplete" ,
20+ require ( "inquirer-autocomplete-prompt" )
21+ ) ;
1722module . exports = async ( argvs ) => {
1823 const argv = yargs_parser ( argvs , {
1924 alias : { release : [ "r" ] , yes : [ "y" ] } ,
@@ -26,7 +31,7 @@ module.exports = async (argvs) => {
2631 console . log ( chalk . red ( "Aborted" ) ) ;
2732 return ;
2833 }
29- let spinner = ora (
34+ spinner = ora (
3035 `Downloading ${ packageName } version '${ version } ' to ${ targetDir } `
3136 ) . start ( ) ;
3237 await fs . ensureDir ( tempDir ) ;
@@ -38,24 +43,20 @@ module.exports = async (argvs) => {
3843 ) ;
3944 await fs . copy ( tempDir + "/dist" , targetDir ) ;
4045 const timerDownloaded = timer . get ( ) ;
41- spinner . stop ( ) ;
4246 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!`
4649 ) ;
4750 return ;
4851 } catch ( err ) {
49- spinner . stop ( ) ;
5052 if ( err . code === "ETARGET" ) {
5153 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`
5355 ) ;
54- console . log ( msg + err . versions . reverse ( ) . join ( " | " ) ) ;
56+ spinner . fail ( msg + err . versions . reverse ( ) . join ( " | " ) ) ;
5557 throw err . code ;
5658 }
57- console . error ( err ) ;
58- console . log ( chalk . red ( "✖ Unexpected error" ) ) ;
59+ spinner . fail ( "✖ Unexpected error" ) ;
5960 throw new Error ( err ) ;
6061 } finally {
6162 await fs . remove ( tempDir ) ;
@@ -64,7 +65,7 @@ module.exports = async (argvs) => {
6465} ;
6566
6667const checkFolder = async ( targetDir , argv ) => {
67- const folderExists = await fs . exists ( targetDir ) ;
68+ const folderExists = await fs . pathExists ( targetDir ) ;
6869 if ( ! folderExists ) {
6970 return true ;
7071 }
@@ -73,11 +74,11 @@ const checkFolder = async (targetDir, argv) => {
7374 }
7475 const folderFiles = await fs . readdir ( targetDir ) ;
7576 if ( folderFiles . length !== - 1 ) {
76- const { override } = await prompts ( {
77+ const { override } = await inquirer . prompt ( {
7778 type : "confirm" ,
7879 name : "override" ,
7980 message : `${ targetDir } is not an empty folder, proceed?` ,
80- initial : true ,
81+ default : true ,
8182 } ) ;
8283 return override ;
8384 }
@@ -96,41 +97,44 @@ const onLoad = async (targetDir, version, argv) => {
9697 if ( skipPrompts ) {
9798 return ;
9899 }
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 = [ ] ;
104102 /* 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 ) ;
119108 }
120- lang = langChoice || "" ;
109+ langListOut . splice ( 1 , 0 , "Enter custom" ) ;
121110 }
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+ {
127128 type : "confirm" ,
128129 name : "removeJquery" ,
129130 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 ;
134138 try {
135139 const indexFile = targetDir + "/index.html" ;
136140 const sourceHTML = await fs . readFile ( indexFile , "utf-8" ) ;
@@ -145,6 +149,7 @@ const onLoad = async (targetDir, version, argv) => {
145149 ) ;
146150 }
147151 await fs . writeFile ( indexFile , resultHTML ) ;
152+ return ;
148153 } catch ( err ) {
149154 /* istanbul ignore next */
150155 throw new Error ( err ) ;
0 commit comments