UNPKG

2.42 kBJavaScriptView Raw
1const defaultOptions = {
2 v: { default: true },
3 verbose: { default: false },
4 'bundle': { default: true },
5 'no-bundle': { default: true },
6 'transpile': { default: true },
7 'no-transpile': { default: true },
8 'minify': { default: true },
9 'no-minify': { default: true },
10 'hash': { default: true },
11 'no-hash': { default: true },
12 'legacy': { default: true },
13 'no-legacy': { default: true },
14 'port': { default: true },
15 'preset-build': { default: true },
16 // type: { default: 'static', available: ['static', 'express'] },
17}
18const defaultOptionsPlain = Object.keys(defaultOptions).reduce((flat, k) => { flat[k] = defaultOptions[k].default; return flat }, {})
19
20const MODES = ['dev', 'build', 'init']
21const USAGE = `usage: webo [mode] [entry] [options]\n\n available modes: ${MODES}\n entry: static root path or express.js entry\n available options: ${Object.keys(defaultOptionsPlain)}`
22
23const commandLineArgs = ' ' + process.argv.splice(2).join(' ')
24let [ commandLineMain, ...commandLineArgsOptions ] = commandLineArgs.split(' -')
25commandLineMain = commandLineMain.trim()
26commandLineArgsOptions = commandLineArgsOptions.map(o => '-' + o)
27// console.log({ commandLineArgs, commandLineMain, commandLineArgsOptions })
28
29let [ mode, entry ] = commandLineMain.split(' ')
30entry = entry && entry.replace(/\\/g, '/')
31
32const options = parseUserOptions(commandLineArgsOptions, defaultOptions)
33if (!options.v && !MODES.includes(mode)) { console.log(USAGE); process.exit(1) }
34
35
36module.exports = { mode, entry, options }
37
38
39
40
41
42
43function parseUserOptions(commandLineOptions, defaultOptions) {
44 const userOptions = commandLineOptions.reduce(({flat, lastProp}, arg) => {
45 if (arg.startsWith('-')) {
46 lastProp = arg.replace(/^-/, '').replace(/^-/, '')
47 flat[lastProp] = true
48 } else {
49 flat[lastProp] = arg
50 }
51 return { flat, lastProp }
52 }, { flat: {}, lastProp: null }).flat
53 const invalidOption = Object.keys(userOptions).find(k => !Object.keys(defaultOptions).includes(k) || (defaultOptions[k].available && !defaultOptions[k].available.includes(userOptions[k])))
54 if (invalidOption) {
55 console.log(defaultOptions[invalidOption] ? `invalid option value for ${invalidOption}. Valid values : ${defaultOptions[invalidOption].available.join(', ')}` : `invalid option ${invalidOption}`)
56 process.exit(1)
57 }
58 return userOptions
59}