UNPKG

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