UNPKG

4.42 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.revert = revert;
7exports.default = register;
8
9var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
10
11var _sourceMapSupport = _interopRequireDefault(require("source-map-support"));
12
13var registerCache = _interopRequireWildcard(require("./cache"));
14
15var _escapeRegExp = _interopRequireDefault(require("lodash/escapeRegExp"));
16
17var babel = _interopRequireWildcard(require("@babel/core"));
18
19var _pirates = require("pirates");
20
21var _fs = _interopRequireDefault(require("fs"));
22
23var _path = _interopRequireDefault(require("path"));
24
25function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
26
27function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
28
29function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
30
31const maps = {};
32let transformOpts = {};
33let piratesRevert = null;
34
35function installSourceMapSupport() {
36 _sourceMapSupport.default.install({
37 handleUncaughtExceptions: false,
38 environment: "node",
39
40 retrieveSourceMap(source) {
41 const map = maps && maps[source];
42
43 if (map) {
44 return {
45 url: null,
46 map: map
47 };
48 } else {
49 return null;
50 }
51 }
52
53 });
54}
55
56let cache;
57
58function mtime(filename) {
59 return +_fs.default.statSync(filename).mtime;
60}
61
62function compile(code, filename) {
63 const opts = new babel.OptionManager().init(Object.assign({
64 sourceRoot: _path.default.dirname(filename)
65 }, (0, _cloneDeep.default)(transformOpts), {
66 filename
67 }));
68 if (opts === null) return code;
69 let cacheKey = `${JSON.stringify(opts)}:${babel.version}`;
70 const env = babel.getEnv(false);
71 if (env) cacheKey += `:${env}`;
72 let cached = cache && cache[cacheKey];
73
74 if (!cached || cached.mtime !== mtime(filename)) {
75 cached = babel.transform(code, Object.assign({}, opts, {
76 sourceMaps: opts.sourceMaps === undefined ? "both" : opts.sourceMaps,
77 ast: false
78 }));
79
80 if (cache) {
81 cache[cacheKey] = cached;
82 cached.mtime = mtime(filename);
83 }
84 }
85
86 if (cached.map) {
87 if (Object.keys(maps).length === 0) {
88 installSourceMapSupport();
89 }
90
91 maps[filename] = cached.map;
92 }
93
94 return cached.code;
95}
96
97let compiling = false;
98
99function compileHook(code, filename) {
100 if (compiling) return code;
101
102 try {
103 compiling = true;
104 return compile(code, filename);
105 } finally {
106 compiling = false;
107 }
108}
109
110function hookExtensions(exts) {
111 if (piratesRevert) piratesRevert();
112 piratesRevert = (0, _pirates.addHook)(compileHook, {
113 exts,
114 ignoreNodeModules: false
115 });
116}
117
118function revert() {
119 if (piratesRevert) piratesRevert();
120}
121
122register();
123
124function register(opts = {}) {
125 opts = Object.assign({}, opts);
126 hookExtensions(opts.extensions || babel.DEFAULT_EXTENSIONS);
127
128 if (opts.cache === false && cache) {
129 registerCache.clear();
130 cache = null;
131 } else if (opts.cache !== false && !cache) {
132 registerCache.load();
133 cache = registerCache.get();
134 }
135
136 delete opts.extensions;
137 delete opts.cache;
138 transformOpts = Object.assign({}, opts, {
139 caller: Object.assign({
140 name: "@babel/register"
141 }, opts.caller || {})
142 });
143 let {
144 cwd = "."
145 } = transformOpts;
146 cwd = transformOpts.cwd = _path.default.resolve(cwd);
147
148 if (transformOpts.ignore === undefined && transformOpts.only === undefined) {
149 transformOpts.only = [new RegExp("^" + (0, _escapeRegExp.default)(cwd), "i")];
150 transformOpts.ignore = [new RegExp("^" + (0, _escapeRegExp.default)(cwd) + "(?:" + _path.default.sep + ".*)?" + (0, _escapeRegExp.default)(_path.default.sep + "node_modules" + _path.default.sep), "i")];
151 }
152}
\No newline at end of file