-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpack.js
94 lines (84 loc) · 2.42 KB
/
pack.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
82
83
84
85
86
87
88
89
90
91
92
93
94
const MemoryFS = require('memory-fs')
const webpack = require('webpack')
const {resolve} = require('path')
const {
readFileSync,
createWriteStream,
readdirSync,
outputFileSync,
removeSync,
} = require('fs-extra')
const JSZip = require('jszip')
const babel = require('babel-core')
const WebSocketServer = require('ws').Server
const pkg = require('./package.json')
const webpackConfig = require('./webpack.config')
const manifest = require('./manifest')
const config = webpackConfig(process.argv[2])
const DEV = process.argv[2] === 'development'
const assets = readdirSync(resolve(__dirname, './assets'))
.reduce((tree, file) => {
tree[`assets/${file}`] = readFileSync(resolve(__dirname, `assets/${file}`))
return tree
}, {})
const scripts = readdirSync(resolve(__dirname, './src'))
.filter(file => /[^\.test]\.js$/.test(file))
.reduce((tree, file) => {
config.entry[file.slice(0, -3)] = ['babel-polyfill', `./${file}`]
return tree
}, {})
const fs = new MemoryFS()
const compiler = webpack(config)
let server
let sockets = []
compiler.outputFileSystem = fs
function finishedCompiling(err, stats) {
console.log(stats.toString({colors: true}))
const src = fs.readdirSync(resolve(__dirname, 'dist'))
.reduce((tree, file) => {
tree[file] = fs.readFileSync(resolve(__dirname, `dist/${file}`))
return tree
}, {})
const files = Object.assign({
'manifest.json': readFileSync(resolve(__dirname, 'manifest.json'))
}, assets, src)
if (DEV) {
removeSync(resolve(__dirname, 'unpacked'))
for (let file in files) {
outputFileSync(resolve(__dirname, 'unpacked', file), files[file])
}
sockets.forEach(socket => socket.send('reload'))
} else {
const filename = `${pkg.name}.zip`
const zip = new JSZip()
for (let file in files) {
zip.file(file, files[file])
}
removeSync(filename)
zip
.generateNodeStream({streamFiles: true})
.pipe(createWriteStream(filename))
.on('finish', () => {
console.log(`${filename} written.`)
})
}
}
if (DEV) {
server = new WebSocketServer({port: 34343})
server.on('connection', ws => {
sockets = [
...sockets,
ws
]
ws.on('close', () => {
const index = sockets.indexOf(ws)
sockets = [
...sockets.slice(0, index),
...sockets.slice(index + 1)
]
})
})
compiler.watch({}, finishedCompiling)
} else {
compiler.run(finishedCompiling)
}