-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbuild.js
142 lines (130 loc) · 4.39 KB
/
build.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
var browserify = require('browserify');
var bpack = require('browserify/node_modules/browser-pack');
var glob = require('glob');
var path = require('path');
var fs = require('fs');
var _ = require('lodash-node');
var through = require('through2');
var unary = require('fn-unary');
var concat = require('concat-stream');
var factor = require('factor-bundle');
var cacheify = function (b, opts) {
if (!opts) opts = {};
var cache = b._options.cache;
var pkgcache = b._options.packageCache;
b.on('dep', function (dep) {
if (typeof dep.id === 'string') {
cache[dep.id] = dep;
}
});
return b;
}
var args = {
basedir: __dirname, cache: {}, packageCache: {}, fullPaths: true
};
var b = cacheify(browserify(args));
var gpaths = glob.sync('node_modules/assets/js/main/**/*.js', {
cwd: __dirname
})
.concat(glob.sync('node_modules/ccc/*/js/main/**/*.js', {
cwd: __dirname
}));
console.log(gpaths);
var rpaths = gpaths.map(function (f) {
return path.join(__dirname, f);
});
b.require(rpaths);
var dpaths = gpaths.map(function (f) {
return path.join('dist', f.substring('node_modules/'.length));
});
console.log(dpaths);
function isAbsolutePath(file) {
var regexp = process.platform === 'win32' ?
/^\w:/ :
/^\//;
return regexp.test(file);
}
var relativePath = unary(path.relative.bind(path, path.join(args.basedir, 'node_modules')));
function replacePipeline(pipeline) {
pipeline.get('pack')
.splice(0, 1, through.obj(function (row, enc, next) {
if (isAbsolutePath(row.id)) {
row.id = relativePath(row.file);
}
row.deps = _.transform(row.deps, function (result,
value, key) {
result[key] = relativePath(value);
}, {});
this.push(row);
next();
}), bpack(_.assign({}, args, {
raw: true,
hasExports: true,
//hasExports: false,
//prelude: 'S.prelude(' + JSON.stringify(req.path) + ')'
})));
}
function factorBundle(opts) {
var b = browserify(rpaths, _.assign({}, args, { debug: true }));
replacePipeline(b.pipeline);
b.on('factor.pipeline', function (file, pipeline) {
replacePipeline(pipeline);
})
b.plugin('factor-bundle', opts);
return b;
}
var DevNull = require('dev-null');
function toDevNull() {
return DevNull();
}
b.bundle(function () {
console.log(arguments);
//console.log(args.cache);
factorBundle({
outputs: dpaths.map(toDevNull),
threshold: function(row, groups) {
console.log('bundle common/global.js threshold');
console.log(relativePath(row.id), groups.map(relativePath));
var onlyRequiredByAccountComponent = groups.map(relativePath).every(function(dep){
return dep.match(/^@?ccc\/account\//);
})
console.log(onlyRequiredByAccountComponent);
//console.log(row.id, groups);
return this._defaultThreshold(row, groups) && !onlyRequiredByAccountComponent;
}
}).bundle(function (err, str) {
if (err) {
console.log(err);
return;
}
fs.writeFileSync('dist/assets/js/common/global.js', str);
factorBundle({
outputs: dpaths.map(toDevNull),
threshold: function(row, groups) {
console.log('bundle common/account.js threshold');
console.log(relativePath(row.id), groups.map(relativePath));
var onlyRequiredByAccountComponent = groups.map(relativePath).every(function(dep){
return dep.match(/^@?ccc\/account\//);
})
console.log(onlyRequiredByAccountComponent);
//console.log(row.id, groups);
return this._defaultThreshold(row, groups) && onlyRequiredByAccountComponent;
}
}).bundle(function (err, str) {
if (err) {
console.log(err);
return;
}
fs.writeFileSync('dist/assets/js/common/account.js', str);
factorBundle({
outputs: dpaths
}).bundle().pipe(toDevNull());
})
})
function write (name) {
return concat(function (body) {
console.log('// ----- ' + name + ' -----');
console.log(body.toString('utf8'));
});
}
});