1 | const 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 |
|
17 | }
|
18 | const defaultOptionsPlain = Object.keys(defaultOptions).reduce((flat, k) => { flat[k] = defaultOptions[k].default; return flat }, {})
|
19 |
|
20 | const MODES = ['dev', 'build', 'init']
|
21 | const 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 |
|
23 | const commandLineArgs = ' ' + process.argv.splice(2).join(' ')
|
24 | let [ commandLineMain, ...commandLineArgsOptions ] = commandLineArgs.split(' -')
|
25 | commandLineMain = commandLineMain.trim()
|
26 | commandLineArgsOptions = commandLineArgsOptions.map(o => '-' + o)
|
27 |
|
28 |
|
29 | let [ mode, entry ] = commandLineMain.split(' ')
|
30 | entry = entry && entry.replace(/\\/g, '/')
|
31 |
|
32 | const options = parseUserOptions(commandLineArgsOptions, defaultOptions)
|
33 | if (!options.v && !MODES.includes(mode)) { console.log(USAGE); process.exit(1) }
|
34 |
|
35 |
|
36 | module.exports = { mode, entry, options }
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 | function 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 | }
|