-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathindex.js
104 lines (86 loc) · 2.84 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
'use strict';
var through = require('through');
var innersource = require('innersource');
var detective = require('detective');
var generator = require('inline-source-map');
var combine = require('combine-source-map');
var EOL = require('os').EOL;
var newlineRegex = new RegExp(EOL, 'g');
var prepend = innersource(addRequire).replace(newlineRegex, '');
var postpend = innersource(addModule).replace(newlineRegex, '');
module.exports = function(filename) {
var buffer = '';
return through(function(chunk) {
buffer += chunk.toString();
},
function() {
var nodeModuleRequires = getNodeModuleRequires(buffer);
var totalPrelude = prepend + nodeModuleRequires;
var offset = totalPrelude.split('\n').length - 0;
var partial = totalPrelude + combine.removeComments(buffer) + ';';
var complete = partial + postpend;
var map = combine.create().addFile({ sourceFile: filename, source: buffer}, {line: offset});
this.queue( complete + '\n' + map.comment());
this.queue(null);
});
};
function addModule(){
var global = (function(){ return this; }).call(null);
if(typeof __filename !== 'undefined'){
var moduleName = __filename.slice(0, __filename.lastIndexOf('.')).replace(/\\/g, '/');
global.require[moduleName] = module.exports;
}
}
function addRequire(){
var global = (function(){ return this; }).call(null);
if(!global.require){
global.require = function require(key){
return global.require[key.replace(/\\/g, '/')];
};
(function(){
var require = global.require;
var ret = global.require;
Object.defineProperty(global, 'require', {
get: function(){
return ret;
},
set: function(newRequire){
ret = function(key){
key = key.replace(/\\/g, '/');
if(require[key]){
return require[key];
}else if(require[key + '/index']){
return require[key + '/index'];
}else{
var temp = ret;
var module;
ret = newRequire;
try {
module = newRequire(key);
}
catch(e){
ret = temp;
throw e;
}
ret = temp;
return module;
}
};
for(var key in require){
ret[key] = require[key];
}
}
});
})();
}
}
function getNodeModuleRequires(source){
var requires = detective(source);
requires = requires.filter(function(require){
return require[0] !== '.';
});
return requires.map(function(require){
require = require.replace(/\\/g, '/');
return ";var global = (function(){ return this; }).call(null);global.require['"+require+"'] = require('"+require+"');";
}).join('');
}