UNPKG

6.58 kBJavaScriptView Raw
1"use strict";
2var __assign = (this && this.__assign) || function () {
3 __assign = Object.assign || function(t) {
4 for (var s, i = 1, n = arguments.length; i < n; i++) {
5 s = arguments[i];
6 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7 t[p] = s[p];
8 }
9 return t;
10 };
11 return __assign.apply(this, arguments);
12};
13var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14 if (k2 === undefined) k2 = k;
15 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
16}) : (function(o, m, k, k2) {
17 if (k2 === undefined) k2 = k;
18 o[k2] = m[k];
19}));
20var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21 Object.defineProperty(o, "default", { enumerable: true, value: v });
22}) : function(o, v) {
23 o["default"] = v;
24});
25var __importStar = (this && this.__importStar) || function (mod) {
26 if (mod && mod.__esModule) return mod;
27 var result = {};
28 if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29 __setModuleDefault(result, mod);
30 return result;
31};
32var __importDefault = (this && this.__importDefault) || function (mod) {
33 return (mod && mod.__esModule) ? mod : { "default": mod };
34};
35Object.defineProperty(exports, "__esModule", { value: true });
36exports.revert = void 0;
37var swc = __importStar(require("@swc/core"));
38var fs_1 = __importDefault(require("fs"));
39var lodash_clonedeep_1 = __importDefault(require("lodash.clonedeep"));
40var util_1 = require("./util");
41var path_1 = __importDefault(require("path"));
42var pirates_1 = require("pirates");
43var source_map_support_1 = __importDefault(require("source-map-support"));
44var maps = {};
45var transformOpts = {};
46var piratesRevert = null;
47function installSourceMapSupport() {
48 source_map_support_1.default.install({
49 handleUncaughtExceptions: false,
50 environment: "node",
51 retrieveSourceMap: function (source) {
52 var map = maps && maps[source];
53 if (map) {
54 return {
55 url: null,
56 map: map
57 };
58 }
59 else {
60 return null;
61 }
62 }
63 });
64}
65function mtime(filename) {
66 return +fs_1.default.statSync(filename).mtime;
67}
68function compile(code, filename) {
69 // merge in base options and resolve all the plugins and presets relative to this file
70 var opts = __assign(__assign({ sourceRoot: path_1.default.dirname(filename) + path_1.default.sep }, lodash_clonedeep_1.default(transformOpts)), { filename: filename });
71 if (typeof code !== "string") {
72 code = code.toString();
73 }
74 delete opts.only;
75 delete opts.ignore;
76 var output = swc.transformSync(code, __assign(__assign({}, opts), { sourceMaps: opts.sourceMaps === undefined ? true : opts.sourceMaps }));
77 if (output.map) {
78 if (Object.keys(maps).length === 0) {
79 installSourceMapSupport();
80 }
81 maps[filename] = output.map;
82 }
83 return output.code;
84}
85var compiling = false;
86function compileHook(code, filename) {
87 if (compiling)
88 return code;
89 try {
90 compiling = true;
91 return compile(code, filename);
92 }
93 finally {
94 compiling = false;
95 }
96}
97function hookExtensions(exts) {
98 if (piratesRevert)
99 piratesRevert();
100 piratesRevert = pirates_1.addHook(compileHook, { exts: exts, ignoreNodeModules: false, matcher: matcher });
101}
102function revert() {
103 if (piratesRevert)
104 piratesRevert();
105}
106exports.revert = revert;
107function register(opts) {
108 if (opts === void 0) { opts = {}; }
109 // Clone to avoid mutating the arguments object with the 'delete's below.
110 opts = __assign({}, opts);
111 hookExtensions(opts.extensions || swc.DEFAULT_EXTENSIONS);
112 delete opts.extensions;
113 transformOpts = __assign(__assign({}, opts), { caller: __assign({ name: "@swc/register" }, (opts.caller || {})) });
114 var _a = transformOpts.cwd, cwd = _a === void 0 ? "." : _a;
115 // Ensure that the working directory is resolved up front so that
116 // things don't break if it changes later.
117 cwd = transformOpts.cwd = path_1.default.resolve(cwd);
118 if (transformOpts.ignore === undefined && transformOpts.only === undefined) {
119 transformOpts.only = [
120 // Only compile things inside the current working directory.
121 new RegExp("^" + util_1.escapeRegExp(cwd), "i")
122 ];
123 transformOpts.ignore = [
124 // Ignore any node_modules inside the current working directory.
125 new RegExp("^" +
126 util_1.escapeRegExp(cwd) +
127 "(?:" +
128 path_1.default.sep +
129 ".*)?" +
130 util_1.escapeRegExp(path_1.default.sep + "node_modules" + path_1.default.sep), "i")
131 ];
132 }
133}
134exports.default = register;
135/**
136 * https://github.com/babel/babel/blob/7acc68a86b70c6aadfef28e10e83d0adb2523807/packages/babel-core/src/config/config-chain.ts
137 *
138 * Tests if a filename should be ignored based on "ignore" and "only" options.
139 */
140function matcher(filename, dirname) {
141 if (!dirname) {
142 dirname = transformOpts.cwd || path_1.default.dirname(filename);
143 }
144 return shouldCompile(transformOpts.ignore, transformOpts.only, filename, dirname);
145}
146function shouldCompile(ignore, only, filename, dirname) {
147 if (ignore && matchPattern(ignore, dirname, filename)) {
148 return false;
149 }
150 if (only && !matchPattern(only, dirname, filename)) {
151 return false;
152 }
153 return true;
154}
155/**
156 * https://github.com/babel/babel/blob/7acc68a86b70c6aadfef28e10e83d0adb2523807/packages/babel-core/src/config/config-chain.ts
157 *
158 * Returns result of calling function with filename if pattern is a function.
159 * Otherwise returns result of matching pattern Regex with filename.
160 */
161function matchPattern(patterns, dirname, pathToTest) {
162 return patterns.some(function (pattern) {
163 if (typeof pattern === "function") {
164 return Boolean(pattern(pathToTest, { dirname: dirname }));
165 }
166 if (typeof pathToTest !== "string") {
167 throw new Error("Configuration contains string/RegExp file pattern, but no filename was provided.");
168 }
169 if (typeof pattern === "string") {
170 pattern = util_1.pathPatternToRegex(pattern, dirname);
171 }
172 return pattern.test(path_1.default.resolve(dirname, pathToTest));
173 });
174}