1 | const { argv } = require('yargs')
|
2 | const { exit } = require('shelljs')
|
3 | const fs = require('fs')
|
4 | const path = require('path')
|
5 | const c = require('chalk')
|
6 | const emoji = require('node-emoji')
|
7 | const filesize = require('filesize')
|
8 | const gzip = require('gzip-size')
|
9 | const logUpdate = require('log-update')
|
10 | const PrettyError = require('pretty-error')
|
11 |
|
12 | const pe = new PrettyError()
|
13 |
|
14 | const symbols = require('./symbols')
|
15 | const filenameReplace = require('./filename-replace')
|
16 |
|
17 | const ROOT_PATH = argv.cwd
|
18 | const HAS_GZIP = argv.compress
|
19 |
|
20 | const placeholder = text => c.gray(`${text}:`)
|
21 | const getFilesize = file => filesize(fs.statSync(file).size)
|
22 |
|
23 | const getGZipFilesize = file =>
|
24 | filesize(gzip.sync(fs.readFileSync(file, 'utf-8')))
|
25 |
|
26 | const logWarning = ({ loc, frame, message }) => {
|
27 | console.log('')
|
28 | console.warn(c.yellow.bold(`---------- WARNING ----------`))
|
29 |
|
30 | if (loc) {
|
31 | const line = c.cyan.bold(`(${loc.line}:${loc.column})`)
|
32 | console.warn(`${loc.file} ${line}`)
|
33 | console.warn(`${c.yellow(message)}`)
|
34 | if (frame) {
|
35 | console.warn('')
|
36 | console.warn(`${c.gray(frame)}`)
|
37 | }
|
38 | } else {
|
39 | console.warn(`${c.yellow(message)}`)
|
40 | console.log('')
|
41 | }
|
42 | }
|
43 |
|
44 | exports.compiling = relative => {
|
45 | const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
|
46 | let i = 0
|
47 |
|
48 | return setInterval(() => {
|
49 | const frame = frames[(i = ++i % frames.length)]
|
50 | logUpdate(`${c.dim(frame)} Compiling ${c.cyan.bold(relative)}...`)
|
51 | }, 80)
|
52 | }
|
53 |
|
54 | exports.success = ({ dest, input, output, warning }) => {
|
55 | const file = filenameReplace(ROOT_PATH, input, output.filename)
|
56 | const outputFile = path.join(dest, file)
|
57 |
|
58 | const successTitle = `${symbols.success} ${c.green.bold(
|
59 | 'Successfully compiled:'
|
60 | )}`
|
61 | const warningTitle = `${symbols.warning} ${c.yellow.bold(
|
62 | 'Compiled with warnings:'
|
63 | )}`
|
64 | const title = warning ? warningTitle : successTitle
|
65 | const size = `${placeholder('size')} ${getFilesize(outputFile)}`
|
66 | const gzip = HAS_GZIP
|
67 | ? ` | ${placeholder('gzip')} ${getGZipFilesize(outputFile)}`
|
68 | : ''
|
69 | const sizes = c.gray.dim(`(${size}${gzip})`)
|
70 |
|
71 | const msg = `${title} ${c.cyan(
|
72 | path.relative(ROOT_PATH, outputFile)
|
73 | )} ${sizes}`
|
74 |
|
75 | logUpdate(msg)
|
76 | if (warning) logWarning(warning)
|
77 | logUpdate.done()
|
78 | }
|
79 |
|
80 | exports.watch = context => ev => {
|
81 | const file = ev.input && path.relative(context, ev.input)
|
82 | const evType = code => ev.code === code
|
83 |
|
84 | switch (ev.code) {
|
85 | case 'START':
|
86 | logUpdate(`${emoji.get(':mag_right:')} Watching...`)
|
87 | logUpdate.done()
|
88 | break
|
89 | case 'BUNDLE_START':
|
90 | logUpdate(
|
91 | `${c.cyan.bold(symbols.arrow)} ${c.cyan.bold(
|
92 | 'Start compiling:'
|
93 | )} ${file}`
|
94 | )
|
95 | break
|
96 | case 'BUNDLE_END':
|
97 | logUpdate(
|
98 | `${symbols.success} ${c.green.bold('Finished compiling:')} ${file}`
|
99 | )
|
100 | logUpdate.done()
|
101 | break
|
102 | case 'END':
|
103 | logUpdate(`${symbols.success} ${c.green.bold('All completed')}`)
|
104 | logUpdate.done()
|
105 | break
|
106 | case 'FATAL':
|
107 | console.log(pe.render(ev.error))
|
108 | evType('FATAL') && exit(1)
|
109 | break
|
110 | case 'ERROR':
|
111 | console.log(pe.render(ev.error))
|
112 | evType('FATAL') && exit(1)
|
113 | break
|
114 | default:
|
115 | break
|
116 | }
|
117 | }
|