-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
119 lines (104 loc) · 2.87 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
113
114
115
116
117
118
119
module.exports = function () {
'use strict';
var map = require('map-stream')
, path = require('path')
, fs = require('fs')
, tplF = require('micro-tpl');
function wrap(string, name) {
var modules = []
, moduleMap = {};
string.replace(/require\(('|")(.*?)\1\)/g, function (match, quz, module) {
if (!(module in moduleMap)) {
moduleMap[module] = true;
modules.push("'" + module + "'");
}
});
return "define('" + name + "', [" + modules.join(', ') + "], function (require, exports, module) {\n\r" + string + "});";
}
function getMods(base, p, string, mods) {
var res = [];
string.replace(/require\(('|")(.*?)\1\)/g, function (match, quz, mod) {
// relative path
if (mod.indexOf('.') === 0) {
var ap = path.join(p, mod) + '.js'
if (!(ap in mods)) {
if (path.relative(base, ap).indexOf('.') !== 0) {
mods[ap] = true;
res.push({
p: mod,
ap: ap
});
}
}
}
});
return res;
}
function tpl(tmpl) {
return "return module.exports = " + tplF(tmpl) + ";";
}
function readFile(path, cb) {
var res;
try {
if (~path.indexOf('tpl.js')) {
res = fs.readFileSync(path.replace(/\.js/, '.html'), { encoding: 'utf8' });
cb(null, tpl(res));
} else {
res = fs.readFileSync(path, { encoding: 'utf8' });
cb(null, res);
}
} catch(e) {
cb(e);
}
}
function make(file, cb) {
var string = String(file.contents)
, mods = {}
, res = [];
res.push(wrap(string, './' + path.basename(file.path, '.js')));
pack(path.dirname(file.path), path.dirname(file.path), string, function () {
file.contents = new Buffer(res.join(''));
cb(file);
});
function pack(base, datum, string, cb) {
var modList = getMods(base, datum, string, mods)
, i = modList.length
, name;
if (i) {
modList.forEach(function (mod) {
readFile(mod.ap, function (err, data) {
if (err) throw err;
name = './' + path.relative(base, mod.ap).replace(/\\/g, '/').replace(/\.js$/, '');
res.unshift(wrap(data, name));
pack(base, path.dirname(mod.ap), data, function () {
if (--i === 0) {
cb();
}
});
});
});
} else {
cb();
}
}
}
function dmd() {
var stream = map(function (file, fn) {
if (file.isNull()) {
return fn(null, file);
}
if (file.isBuffer()) {
var self = this;
make(file, function (file) {
fn(null, file);
});
return;
}
if (file.isStream()) {
return fn(new Error('Streams are not supported!'));
}
});
return stream;
}
return dmd;
}();