1
- import { dirname , sep , resolve as pathResolve } from "node:path" ;
1
+ import { dirname , resolve as pathResolve , sep } from "node:path" ;
2
2
import { fileURLToPath } from "node:url" ;
3
3
4
- import { Command , Option } from "commander" ;
5
4
import { spawn } from "node:child_process" ;
6
5
import { existsSync } from "node:fs" ;
7
- import { readdir , readFile , cp , rm , mkdir , writeFile } from "node:fs/promises" ;
6
+ import { cp , mkdir , readdir , readFile , rm , writeFile } from "node:fs/promises" ;
7
+
8
+ import { Command , Option } from "commander" ;
9
+
8
10
import { Logger } from "./log.js" ;
9
11
10
12
const __filename = fileURLToPath ( import . meta. url ) ;
11
13
const __dirname = dirname ( __filename ) ;
12
14
13
15
const logger = new Logger ( ) ;
14
16
logger . time ( "create-hexo" ) ;
17
+
15
18
const STARTER = "hexo-starter" ;
16
19
const STARTER_DIR = pathResolve ( __dirname , `../${ STARTER } /` ) ;
17
20
const RM_FILES = [ ".git" , ".github" ] ;
@@ -20,50 +23,34 @@ const ADD_FILES = ["scripts/.gitkeep", "source/_drafts/.gitkeep"];
20
23
type PM = "pnpm" | "npm" | "yarn" | "bun" ;
21
24
22
25
interface InitOptions {
23
- blogName : string ;
24
- blogPath : string ;
26
+ siteName : string ;
27
+ sitePath : string ;
25
28
packageManager : PM | "auto" ;
26
29
force : boolean ;
27
30
}
28
31
29
32
let packageJson : any ;
30
33
let starterVersion : string ;
31
34
let initOptions : InitOptions = {
32
- blogName : "hexo-site" ,
33
- blogPath : "./" ,
35
+ siteName : "hexo-site" ,
36
+ sitePath : "./" ,
34
37
packageManager : "npm" ,
35
38
force : false ,
36
39
} ;
37
40
38
41
const main = async ( ) => {
39
42
[ packageJson , starterVersion ] = await pre ( ) ;
40
43
41
- init ( ) ;
44
+ parseArgs ( ) ;
42
45
43
- checkInfo ( ) ;
46
+ printInfo ( ) ;
44
47
45
48
initOptions . force
46
49
? logger . warn ( "Running in force mode. It's dangerous!" )
47
- : await checkPath ( initOptions . blogPath ) ;
50
+ : await checkPath ( initOptions . sitePath ) ;
48
51
49
52
logger . group ( `Copying \`${ STARTER } \`` ) ;
50
- const [ voidd , pm ] = await Promise . all ( [
51
- cp ( STARTER_DIR , initOptions . blogPath , {
52
- force : initOptions . force ,
53
- recursive : true ,
54
- } )
55
- . then ( ( ) => {
56
- logger . log ( `Copied \`${ STARTER } \` to "${ initOptions . blogPath } "` ) ;
57
- } )
58
- . catch ( ( err ) => {
59
- logger . error ( "Copy failed: " , err ) ;
60
- process . exit ( 1 ) ;
61
- } )
62
- . finally ( ( ) => {
63
- logger . groupEnd ( ) ;
64
- } ) ,
65
- checkPackageManager ( ) ,
66
- ] ) ;
53
+ const [ _ , pm ] = await Promise . all ( [ copyStarter ( ) , checkPackageManager ( ) ] ) ;
67
54
logger . groupEnd ( ) ;
68
55
69
56
logger . group ( `Installing packages via \`${ pm } \`` ) ;
@@ -96,16 +83,17 @@ const pre = () => {
96
83
logger . groupEnd ( ) ;
97
84
return Promise . all ( [ packageJson , starterVersion ] ) ;
98
85
} ;
99
- const init = ( ) => {
86
+
87
+ const parseArgs = ( ) => {
100
88
const program = new Command ( packageJson . name )
101
- . argument ( "[blog_directory ]" , "the folder that you want to load Hexo" )
102
- . usage ( `[blog_directory ]` )
103
- . action ( ( blog_directory : string ) => {
104
- const path = blog_directory
105
- ? ( initOptions . blogPath = pathResolve ( blog_directory ) )
106
- : pathResolve ( initOptions . blogPath ) ;
107
- initOptions . blogPath = path ;
108
- initOptions . blogName = path . split ( sep ) . reverse ( ) [ 0 ] ;
89
+ . argument ( "[site_directory ]" , "the folder that you want to load Hexo" )
90
+ . usage ( `[site_directory ]` )
91
+ . action ( ( site_directory : string ) => {
92
+ const path = site_directory
93
+ ? ( initOptions . sitePath = pathResolve ( site_directory ) )
94
+ : pathResolve ( initOptions . sitePath ) ;
95
+ initOptions . sitePath = path ;
96
+ initOptions . siteName = path . split ( sep ) . reverse ( ) [ 0 ] ;
109
97
} )
110
98
. addOption (
111
99
new Option (
@@ -132,14 +120,14 @@ const init = () => {
132
120
133
121
const printUsage = ( ) => {
134
122
logger . group ( "Usage: " ) ;
135
- logger . l ( " npm init hexo [blog_directory ]" , "\n" ) ;
136
- logger . l ( ` pnpm create hexo [blog_directory ]` , "\n" ) ;
137
- logger . l ( " yarn create hexo [blog_directory ]" , "\n" ) ;
138
- logger . l ( " bun create hexo [blog_directory ]" , "\n" ) ;
123
+ logger . l ( " npm init hexo [site_directory ]" , "\n" ) ;
124
+ logger . l ( ` pnpm create hexo [site_directory ]` , "\n" ) ;
125
+ logger . l ( " yarn create hexo [site_directory ]" , "\n" ) ;
126
+ logger . l ( " bun create hexo [site_directory ]" , "\n" ) ;
139
127
logger . groupEnd ( ) ;
140
128
} ;
141
129
142
- const checkInfo = ( ) => {
130
+ const printInfo = ( ) => {
143
131
logger . group ( "Env Info" ) ;
144
132
logger . log ( "runtime path: " , process . argv [ 0 ] ) ;
145
133
logger . log ( "runtime version: " , process . versions . node ) ;
@@ -151,6 +139,23 @@ const checkInfo = () => {
151
139
logger . groupEnd ( ) ;
152
140
} ;
153
141
142
+ const copyStarter = ( ) => {
143
+ return cp ( STARTER_DIR , initOptions . sitePath , {
144
+ force : initOptions . force ,
145
+ recursive : true ,
146
+ } )
147
+ . then ( ( ) => {
148
+ logger . log ( `Copied \`${ STARTER } \` to "${ initOptions . sitePath } "` ) ;
149
+ } )
150
+ . catch ( ( err ) => {
151
+ logger . error ( "Copy failed: " , err ) ;
152
+ process . exit ( 1 ) ;
153
+ } )
154
+ . finally ( ( ) => {
155
+ logger . groupEnd ( ) ;
156
+ } ) ;
157
+ } ;
158
+
154
159
const checkPath = ( path : string ) => {
155
160
return readdir ( path )
156
161
. then ( ( files ) => {
@@ -160,11 +165,11 @@ const checkPath = (path: string) => {
160
165
) ;
161
166
process . exit ( 1 ) ;
162
167
} else {
163
- logger . info ( `Your hexo blog will be initialized in "${ path } "` ) ;
168
+ logger . info ( `Your hexo site will be initialized in "${ path } "` ) ;
164
169
}
165
170
} )
166
171
. catch ( ( err ) => {
167
- logger . info ( `Your hexo blog will be initialized in "${ path } "` ) ;
172
+ logger . info ( `Your hexo site will be initialized in "${ path } "` ) ;
168
173
} ) ;
169
174
} ;
170
175
@@ -196,7 +201,7 @@ const checkPackageManager = (): Promise<PM> => {
196
201
const installPackage = ( pm : string ) => {
197
202
return new Promise ( ( resolve , reject ) => {
198
203
const child = spawn ( pm , [ "install" ] , {
199
- cwd : initOptions . blogPath ,
204
+ cwd : initOptions . sitePath ,
200
205
shell : true ,
201
206
} ) ;
202
207
child . stdout ?. setEncoding ( "utf8" ) ;
@@ -224,11 +229,11 @@ const installPackage = (pm: string) => {
224
229
} ;
225
230
226
231
const post = ( ) => {
227
- const ls : any [ ] = [ ] ;
232
+ const ls : Array < Promise < unknown > > = [ ] ;
228
233
229
234
RM_FILES . forEach ( ( item ) => {
230
235
ls . push (
231
- rm ( pathResolve ( initOptions . blogPath , item ) , {
236
+ rm ( pathResolve ( initOptions . sitePath , item ) , {
232
237
force : true ,
233
238
recursive : true ,
234
239
} )
@@ -242,7 +247,7 @@ const post = () => {
242
247
} ) ;
243
248
244
249
ADD_FILES . forEach ( ( item ) => {
245
- const file = pathResolve ( initOptions . blogPath , item ) ;
250
+ const file = pathResolve ( initOptions . sitePath , item ) ;
246
251
const dir = dirname ( file ) ;
247
252
248
253
ls . push (
@@ -263,8 +268,9 @@ const post = () => {
263
268
264
269
return Promise . all ( ls ) ;
265
270
} ;
271
+
266
272
const end = async ( ) => {
267
- logger . group ( "Finshed !" ) ;
273
+ logger . group ( "Finished !" ) ;
268
274
logger . info ( "Enjoy yourself!" , "\n" ) ;
269
275
logger . groupEnd ( ) ;
270
276
logger . timeEnd ( "create-hexo" ) ;
0 commit comments