1
- "use strict" ;
2
- const yargs_parser = require ( "yargs-parser" ) ;
1
+ const yargsParser = require ( "yargs-parser" ) ;
3
2
const path = require ( "path" ) ;
4
3
const chalk = require ( "chalk" ) ;
5
- const langsList = require ( "./countries.json" ) ;
6
4
const inquirer = require ( "inquirer" ) ;
7
5
const fuzzy = require ( "fuzzy" ) ;
8
6
const ora = require ( "ora" ) ;
9
7
const { extract } = require ( "pacote" ) ;
10
8
const glob = require ( "fast-glob" ) ;
11
9
const fs = require ( "fs-extra" ) ;
12
10
const os = require ( "os" ) ;
11
+
13
12
const packageName = "html5-boilerplate" ;
14
- const tempDir = os . tmpdir ( ) + ` /${ packageName } -staging`;
13
+ const tempDir = ` ${ os . tmpdir ( ) } /${ packageName } -staging`;
15
14
const elapsed = require ( "elapsed-time-logger" ) ;
16
15
const compareVersions = require ( "compare-versions" ) ;
16
+ const langsList = require ( "./countries.json" ) ;
17
+
17
18
let spinner ;
18
19
inquirer . registerPrompt (
19
20
"autocomplete" ,
20
21
require ( "inquirer-autocomplete-prompt" )
21
22
) ;
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
- } ;
65
23
66
24
const checkFolder = async ( targetDir , argv ) => {
67
25
const folderExists = await fs . pathExists ( targetDir ) ;
68
- if ( ! folderExists ) {
69
- return true ;
70
- }
71
- if ( argv [ "yes" ] === true ) {
26
+ if ( ! folderExists || argv . yes === true ) {
72
27
return true ;
73
28
}
74
29
const folderFiles = await fs . readdir ( targetDir ) ;
@@ -81,17 +36,23 @@ const checkFolder = async (targetDir, argv) => {
81
36
} ) ;
82
37
return override ;
83
38
}
39
+ return true ;
84
40
} ;
85
41
86
42
const onLoad = async ( targetDir , version , argv ) => {
87
43
// see https://github.com/mrmlnc/fast-glob#how-to-write-patterns-on-windows
88
44
const npmIgnoreFiles = await glob (
89
45
`${ targetDir . replace ( / \\ / g, "/" ) } /**/.npmignore`
90
46
) ;
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 ;
95
56
96
57
if ( skipPrompts ) {
97
58
return ;
@@ -100,11 +61,11 @@ const onLoad = async (targetDir, version, argv) => {
100
61
const langListOut = [ ] ;
101
62
/* istanbul ignore if */
102
63
if ( ! argv . lang ) {
103
- for ( const { title, value } of langsList ) {
64
+ langsList . forEach ( ( { title, value } ) => {
104
65
const text = `${ title } (${ value } )` ;
105
66
langListMap [ text ] = value ;
106
67
langListOut . push ( text ) ;
107
- }
68
+ } ) ;
108
69
langListOut . splice ( 1 , 0 , "Enter custom" ) ;
109
70
}
110
71
spinner . stop ( ) ;
@@ -121,6 +82,7 @@ const onLoad = async (targetDir, version, argv) => {
121
82
type : "input" ,
122
83
name : "customLang" ,
123
84
message : "Enter custom language code" ,
85
+ // eslint-disable-next-line
124
86
when : ( { langChoice } ) => ! argv . lang && langChoice === langListOut [ 1 ] ,
125
87
} ,
126
88
{
@@ -135,10 +97,10 @@ const onLoad = async (targetDir, version, argv) => {
135
97
const lang = argv . lang || langListMap [ langChoice ] || customLang || "" ;
136
98
const removeJqueryFlag = removeJquery !== undefined ? removeJquery : false ;
137
99
try {
138
- const indexFile = targetDir + " /index.html" ;
100
+ const indexFile = ` ${ targetDir } /index.html` ;
139
101
const sourceHTML = await fs . readFile ( indexFile , "utf-8" ) ;
140
102
let resultHTML = sourceHTML . replace (
141
- / ( < h t m l .* l a n g = ) \ "( [ ^ " ] * ) \ "/ gi,
103
+ / ( < h t m l .* l a n g = ) " ( [ ^ " ] * ) " / gi,
142
104
`$1"${ lang } "`
143
105
) ;
144
106
if ( removeJqueryFlag ) {
@@ -154,3 +116,47 @@ const onLoad = async (targetDir, version, argv) => {
154
116
throw new Error ( err ) ;
155
117
}
156
118
} ;
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