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
|
"use strict";
var Module = require("module"),
fs = require("fs"),
babelCore = require("babel-core"),
coffee;
// caching original wrapper
var moduleWrapper0 = Module.wrapper[0],
moduleWrapper1 = Module.wrapper[1],
originalExtensions = {},
nodeRequire,
currentModule;
function load(targetModule, isTransform) {
nodeRequire = targetModule.require;
targetModule.require = requireProxy;
currentModule = targetModule;
registerExtensions();
targetModule.load(targetModule.id);
// This is only necessary if nothing has been required within the module
reset();
}
function compile(targetModule, src, filename) {
nodeRequire = targetModule.require;
targetModule.require = requireProxy;
targetModule.filename = filename;
currentModule = targetModule;
var convertedSrc = babelCore.transform(stripBOM(src), {
plugins: ["transform-es2015-constants"]
});
targetModule._compile(convertedSrc.code, filename);
reset();
}
function reset() {
Module.wrapper[0] = moduleWrapper0;
Module.wrapper[1] = moduleWrapper1;
restoreExtensions();
}
function inject(prelude, appendix) {
Module.wrapper[0] = moduleWrapper0 + prelude;
Module.wrapper[1] = appendix + moduleWrapper1;
}
/**
* Proxies the first require call in order to draw back all changes to the Module.wrapper.
* Thus our changes don't influence other modules
*
* @param {!String} path
*/
function requireProxy(path) {
reset();
currentModule.require = nodeRequire;
return nodeRequire.call(currentModule, path); // node's require only works when "this" points to the module
}
function registerExtensions() {
var originalCoffeeExtension = require.extensions[".coffee"];
if (originalCoffeeExtension) {
originalExtensions.coffee = originalCoffeeExtension;
}
require.extensions[".coffee"] = coffeeExtension;
}
function restoreExtensions() {
if ("coffee" in originalExtensions) {
require.extensions[".coffee"] = originalExtensions.coffee;
}
}
function coffeeExtension(module, filename) {
var content = stripBOM(fs.readFileSync(filename, "utf8"));
content = coffee.compile(content, {
filename: filename,
bare: true
});
module._compile(content, filename);
}
/**
* @see https://github.com/joyent/node/blob/master/lib/module.js
*/
function stripBOM(content) {
// Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
// because the buffer-to-string conversion in `fs.readFileSync()`
// translates it to FEFF, the UTF-16 BOM.
if (content.charCodeAt(0) === 0xFEFF) {
content = content.slice(1);
}
return content;
}
try {
coffee = require("coffee-script");
} catch (err) {
// We are not able to provide coffee-script support, but that's ok as long as the user doesn't want it.
}
exports.load = load;
exports.compile = compile;
exports.inject = inject;
|