UNPKG

3.22 kBJavaScriptView Raw
1const { argv } = require('yargs')
2const { exit } = require('shelljs')
3const fs = require('fs')
4const path = require('path')
5const c = require('chalk')
6const emoji = require('node-emoji')
7const filesize = require('filesize')
8const gzip = require('gzip-size')
9const logUpdate = require('log-update')
10const PrettyError = require('pretty-error')
11
12const pe = new PrettyError()
13
14const symbols = require('./symbols')
15const filenameReplace = require('./filename-replace')
16
17const ROOT_PATH = argv.cwd
18const HAS_GZIP = argv.compress
19
20const placeholder = text => c.gray(`${text}:`)
21const getFilesize = file => filesize(fs.statSync(file).size)
22
23const getGZipFilesize = file =>
24 filesize(gzip.sync(fs.readFileSync(file, 'utf-8')))
25
26const 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
44exports.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
54exports.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
80exports.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}