-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathindex.js
112 lines (103 loc) · 2.95 KB
/
index.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
var fs = require('fs')
var path = require('path')
var crypto = require('crypto')
var through = require('through2')
module.exports = function webpackStats (b, opts) {
var stats = null
var startTime
var chunkId
function init () {
stats = {
errors: [],
warnings: [],
version: '1.0.0',
publicPath: '',
assets: [],
entrypoints: {},
chunks: [],
modules: []
}
startTime = Date.now()
chunkId = 0
}
var statsFileName = opts.o || 'stats.json'
var mainBundleName = 'bundle.js'
if (b.argv) mainBundleName = b.argv.o || b.argv.outfile || mainBundleName
b.on('reset', addHooks)
b.on('split.pipeline', function (pipeline, row, name) { addChunk(name, pipeline) })
b.on('factor.pipeline', addChunk)
addHooks()
function addHooks () {
init()
addChunk(mainBundleName, b.pipeline)
b.pipeline.get('wrap').on('end', function () {
fs.writeFile(statsFileName, JSON.stringify(stats, null, 2), function () {})
})
}
function addChunk (name, pipeline) {
var totalSize = 0
var chunk = {
id: chunkId++,
rendered: true,
initial: true,
entry: true,
extraAsync: false,
size: 0,
names: [ name.replace(/\.[a-z]*$/, '') ],
files: [],
hash: '',
modules: [],
}
var hash = crypto.createHash('md5')
pipeline.get('pack').unshift(through.obj(onmodule, onmodulesend))
pipeline.get('wrap').push(through(ondata, onchunkend))
function onmodule (row, enc, cb) {
var relative = !row.file
? '(generated)/' + row.id
: path.relative(b._options.basedir || process.cwd(), row.file)
var match = /^(\.\.\/)+(.*?)\/browserify\/(lib|node_modules)\//.exec(relative)
if (match) {
relative = '(browserify)/' + match[3] + '/' + relative.slice(match[0].length)
}
if (!relative.includes('(browserify') && !relative.includes('node_modules/')) {
chunk.files.push(relative)
}
if (!/^\.\.?\//.test(relative) && !relative.startsWith('(browserify)') && !path.isAbsolute(relative)) {
relative = './' + relative
}
var module = {
id: row.id,
identifier: row.file,
name: relative,
chunks: [chunk.id],
chunkNames: chunk.names,
source: row.source,
size: Math.max(1, row.source.length)
}
chunk.modules.push(module)
stats.modules.push(module)
cb(null, row)
}
function onmodulesend (done) {
chunk.size = chunk.modules.reduce(function (s, r) { return s + r.size }, 0)
done()
}
function ondata (chunk, enc, cb) {
hash.update(chunk)
totalSize += chunk.length
cb(null, chunk)
}
function onchunkend (done) {
chunk.hash = hash.digest('hex')
stats.chunks.push(chunk)
stats.assets.push({
name: name,
size: totalSize,
chunks: [chunk.id],
chunkNames: chunk.names,
emitted: true
})
done()
}
}
}