1- "use strict" ;
2- const yargs_parser = require ( "yargs-parser" ) ;
1+ const yargsParser = require ( "yargs-parser" ) ;
32const path = require ( "path" ) ;
43const chalk = require ( "chalk" ) ;
5- const langsList = require ( "./countries.json" ) ;
64const inquirer = require ( "inquirer" ) ;
75const fuzzy = require ( "fuzzy" ) ;
86const ora = require ( "ora" ) ;
97const { extract } = require ( "pacote" ) ;
108const glob = require ( "fast-glob" ) ;
119const fs = require ( "fs-extra" ) ;
1210const os = require ( "os" ) ;
11+
1312const packageName = "html5-boilerplate" ;
14- const tempDir = os . tmpdir ( ) + ` /${ packageName } -staging`;
13+ const tempDir = ` ${ os . tmpdir ( ) } /${ packageName } -staging`;
1514const elapsed = require ( "elapsed-time-logger" ) ;
1615const compareVersions = require ( "compare-versions" ) ;
16+ const langsList = require ( "./countries.json" ) ;
17+
1718let spinner ;
1819inquirer . registerPrompt (
1920 "autocomplete" ,
2021 require ( "inquirer-autocomplete-prompt" )
2122) ;
22- module . exports = async ( argvs ) => {
23- const argv = yargs_parser ( argvs , {
24- alias : { release : [ "r" ] , yes : [ "y" ] } ,
25- } ) ;
26- const timer = elapsed . start ( ) ;
27- const version = ( argv [ "release" ] || "latest" ) . toString ( ) ;
28- const targetDir = path . resolve ( argv [ "_" ] [ 0 ] || "./" ) ;
29- const override = await checkFolder ( targetDir , argv ) ;
30- if ( ! override ) {
31- console . log ( chalk . red ( "Aborted" ) ) ;
32- return ;
33- }
34- spinner = ora (
35- `Downloading ${ packageName } version '${ version } ' to ${ targetDir } `
36- ) . start ( ) ;
37- await fs . ensureDir ( tempDir ) ;
38- try {
39- const { from : nameWithVersion } = await extract (
40- packageName + "@" + version ,
41- tempDir ,
42- { }
43- ) ;
44- await fs . copy ( tempDir + "/dist" , targetDir ) ;
45- const timerDownloaded = timer . get ( ) ;
46- await onLoad ( targetDir , version , argv ) ;
47- spinner . succeed (
48- ` ${ nameWithVersion } copied to ${ targetDir } in ${ timerDownloaded } . Have fun!`
49- ) ;
50- return ;
51- } catch ( err ) {
52- if ( err . code === "ETARGET" ) {
53- const msg = chalk . red (
54- `version '${ err . wanted } ' not found in npm registry\navailable versions:\n`
55- ) ;
56- spinner . fail ( msg + err . versions . reverse ( ) . join ( " | " ) ) ;
57- throw err . code ;
58- }
59- spinner . fail ( "✖ Unexpected error" ) ;
60- throw new Error ( err ) ;
61- } finally {
62- await fs . remove ( tempDir ) ;
63- }
64- } ;
6523
6624const checkFolder = async ( targetDir , argv ) => {
6725 const folderExists = await fs . pathExists ( targetDir ) ;
68- if ( ! folderExists ) {
69- return true ;
70- }
71- if ( argv [ "yes" ] === true ) {
26+ if ( ! folderExists || argv . yes === true ) {
7227 return true ;
7328 }
7429 const folderFiles = await fs . readdir ( targetDir ) ;
@@ -81,17 +36,23 @@ const checkFolder = async (targetDir, argv) => {
8136 } ) ;
8237 return override ;
8338 }
39+ return true ;
8440} ;
8541
8642const onLoad = async ( targetDir , version , argv ) => {
8743 // see https://github.com/mrmlnc/fast-glob#how-to-write-patterns-on-windows
8844 const npmIgnoreFiles = await glob (
8945 `${ targetDir . replace ( / \\ / g, "/" ) } /**/.npmignore`
9046 ) ;
91- for ( const npmIgnore of npmIgnoreFiles ) {
92- await fs . rename ( npmIgnore , npmIgnore . replace ( / \. n p m i g n o r e $ / , ".gitignore" ) ) ;
93- }
94- const skipPrompts = argv [ "yes" ] === true ;
47+ await Promise . all (
48+ npmIgnoreFiles . map ( ( fileName ) => {
49+ return fs . rename (
50+ fileName ,
51+ fileName . replace ( / \. n p m i g n o r e $ / , ".gitignore" )
52+ ) ;
53+ } )
54+ ) ;
55+ const skipPrompts = argv . yes === true ;
9556
9657 if ( skipPrompts ) {
9758 return ;
@@ -100,11 +61,11 @@ const onLoad = async (targetDir, version, argv) => {
10061 const langListOut = [ ] ;
10162 /* istanbul ignore if */
10263 if ( ! argv . lang ) {
103- for ( const { title, value } of langsList ) {
64+ langsList . forEach ( ( { title, value } ) => {
10465 const text = `${ title } (${ value } )` ;
10566 langListMap [ text ] = value ;
10667 langListOut . push ( text ) ;
107- }
68+ } ) ;
10869 langListOut . splice ( 1 , 0 , "Enter custom" ) ;
10970 }
11071 spinner . stop ( ) ;
@@ -121,6 +82,7 @@ const onLoad = async (targetDir, version, argv) => {
12182 type : "input" ,
12283 name : "customLang" ,
12384 message : "Enter custom language code" ,
85+ // eslint-disable-next-line
12486 when : ( { langChoice } ) => ! argv . lang && langChoice === langListOut [ 1 ] ,
12587 } ,
12688 {
@@ -135,10 +97,10 @@ const onLoad = async (targetDir, version, argv) => {
13597 const lang = argv . lang || langListMap [ langChoice ] || customLang || "" ;
13698 const removeJqueryFlag = removeJquery !== undefined ? removeJquery : false ;
13799 try {
138- const indexFile = targetDir + " /index.html" ;
100+ const indexFile = ` ${ targetDir } /index.html` ;
139101 const sourceHTML = await fs . readFile ( indexFile , "utf-8" ) ;
140102 let resultHTML = sourceHTML . replace (
141- / ( < h t m l .* l a n g = ) \ "( [ ^ " ] * ) \ "/ gi,
103+ / ( < h t m l .* l a n g = ) " ( [ ^ " ] * ) " / gi,
142104 `$1"${ lang } "`
143105 ) ;
144106 if ( removeJqueryFlag ) {
@@ -154,3 +116,47 @@ const onLoad = async (targetDir, version, argv) => {
154116 throw new Error ( err ) ;
155117 }
156118} ;
119+
120+ module . exports = async ( argvs ) => {
121+ const argv = yargsParser ( argvs , {
122+ alias : { release : [ "r" ] , yes : [ "y" ] } ,
123+ } ) ;
124+ const timer = elapsed . start ( ) ;
125+ const version = ( argv . release || "latest" ) . toString ( ) ;
126+ const targetDir = path . resolve ( argv . _ [ 0 ] || "./" ) ;
127+ const override = await checkFolder ( targetDir , argv ) ;
128+ if ( ! override ) {
129+ console . log ( chalk . red ( "Aborted" ) ) ;
130+ return ;
131+ }
132+ spinner = ora (
133+ `Downloading ${ packageName } version '${ version } ' to ${ targetDir } `
134+ ) . start ( ) ;
135+ await fs . ensureDir ( tempDir ) ;
136+ try {
137+ const { from : nameWithVersion } = await extract (
138+ `${ packageName } @${ version } ` ,
139+ tempDir ,
140+ { }
141+ ) ;
142+ await fs . copy ( `${ tempDir } /dist` , targetDir ) ;
143+ const timerDownloaded = timer . get ( ) ;
144+ await onLoad ( targetDir , version , argv ) ;
145+ spinner . succeed (
146+ ` ${ nameWithVersion } copied to ${ targetDir } in ${ timerDownloaded } . Have fun!`
147+ ) ;
148+ return ;
149+ } catch ( err ) {
150+ if ( err . code === "ETARGET" ) {
151+ const msg = chalk . red (
152+ `version '${ err . wanted } ' not found in npm registry\navailable versions:\n`
153+ ) ;
154+ spinner . fail ( msg + err . versions . reverse ( ) . join ( " | " ) ) ;
155+ throw err . code ;
156+ }
157+ spinner . fail ( "✖ Unexpected error" ) ;
158+ throw new Error ( err ) ;
159+ } finally {
160+ await fs . remove ( tempDir ) ;
161+ }
162+ } ;
0 commit comments