-
Notifications
You must be signed in to change notification settings - Fork 0
/
watch.js
81 lines (74 loc) · 2.14 KB
/
watch.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* eslint-disable import/no-extraneous-dependencies, no-console */
const chokidar = require('chokidar')
const spawn = require('cross-spawn')
const chalk = require('chalk')
const { singletonObj } = require('@livelybone/singleton')
const express = require('express')
const path = require('path')
const port = process.env.PORT || 3000
const watcher = chokidar.watch('src')
const debounceTimer = {
js: null,
css: null,
serve: null,
}
function serve() {
return singletonObj(
'serve',
() =>
new Promise(res => {
const app = express()
app.use('/examples', express.static(path.resolve('./examples')))
app.use('/lib', express.static(path.resolve('./lib')))
app.listen(port, e => {
if (e) {
console.log(chalk.red(e))
process.exit(1)
}
res()
})
}),
).then(() => {
debounceTimer.serve = setTimeout(() => {
console.log(
`\r\nThe example of your component is listening on ${port}...\r\n`,
)
console.log(
chalk.cyan(
` Open http://127.0.0.1:${port}/examples/test.html in your browser`,
),
'\r\n',
)
}, 200)
})
}
function spawnConsole(resource, ls) {
ls.stdout.on('data', data => {
if (debounceTimer.serve) clearTimeout(debounceTimer.serve)
console.log(`${data}`.replace(/[\r\n]/g, ''))
})
ls.stderr.on('data', data => {
if (debounceTimer.serve) clearTimeout(debounceTimer.serve)
console.log(`${data}`.replace(/[\r\n]/g, ''))
})
ls.on('close', code => {
if (+code === 0) {
console.log('\r')
console.log(chalk.cyan(`>>> ${resource} building successful`), '\r\n')
serve()
}
})
}
function build(cmd = 'build:js') {
const resource = cmd.replace('build:', '')
if (debounceTimer[resource]) clearTimeout(debounceTimer[resource])
debounceTimer[resource] = setTimeout(() => {
console.log(chalk.cyan(`>>> Building for ${resource}...`), '\r\n')
spawnConsole(resource, spawn('npm', ['run', cmd]))
}, 1000)
}
watcher.on('all', (event, filename) => {
const isCss = /.s?css$/
if (isCss.test(filename)) build('build:css')
else build()
})