UNPKG

8.19 kBJavaScriptView Raw
1'use strict';
2
3function _crypto() {
4 const data = require('crypto');
5
6 _crypto = function () {
7 return data;
8 };
9
10 return data;
11}
12
13function fs() {
14 const data = _interopRequireWildcard(require('fs'));
15
16 fs = function () {
17 return data;
18 };
19
20 return data;
21}
22
23function path() {
24 const data = _interopRequireWildcard(require('path'));
25
26 path = function () {
27 return data;
28 };
29
30 return data;
31}
32
33function _core() {
34 const data = require('@babel/core');
35
36 _core = function () {
37 return data;
38 };
39
40 return data;
41}
42
43var _loadBabelConfig = require('./loadBabelConfig');
44
45function _chalk() {
46 const data = _interopRequireDefault(require('chalk'));
47
48 _chalk = function () {
49 return data;
50 };
51
52 return data;
53}
54
55function _slash() {
56 const data = _interopRequireDefault(require('slash'));
57
58 _slash = function () {
59 return data;
60 };
61
62 return data;
63}
64
65function _interopRequireDefault(obj) {
66 return obj && obj.__esModule ? obj : {default: obj};
67}
68
69function _getRequireWildcardCache() {
70 if (typeof WeakMap !== 'function') return null;
71 var cache = new WeakMap();
72 _getRequireWildcardCache = function () {
73 return cache;
74 };
75 return cache;
76}
77
78function _interopRequireWildcard(obj) {
79 if (obj && obj.__esModule) {
80 return obj;
81 }
82 if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
83 return {default: obj};
84 }
85 var cache = _getRequireWildcardCache();
86 if (cache && cache.has(obj)) {
87 return cache.get(obj);
88 }
89 var newObj = {};
90 var hasPropertyDescriptor =
91 Object.defineProperty && Object.getOwnPropertyDescriptor;
92 for (var key in obj) {
93 if (Object.prototype.hasOwnProperty.call(obj, key)) {
94 var desc = hasPropertyDescriptor
95 ? Object.getOwnPropertyDescriptor(obj, key)
96 : null;
97 if (desc && (desc.get || desc.set)) {
98 Object.defineProperty(newObj, key, desc);
99 } else {
100 newObj[key] = obj[key];
101 }
102 }
103 }
104 newObj.default = obj;
105 if (cache) {
106 cache.set(obj, newObj);
107 }
108 return newObj;
109}
110
111function ownKeys(object, enumerableOnly) {
112 var keys = Object.keys(object);
113 if (Object.getOwnPropertySymbols) {
114 var symbols = Object.getOwnPropertySymbols(object);
115 if (enumerableOnly)
116 symbols = symbols.filter(function (sym) {
117 return Object.getOwnPropertyDescriptor(object, sym).enumerable;
118 });
119 keys.push.apply(keys, symbols);
120 }
121 return keys;
122}
123
124function _objectSpread(target) {
125 for (var i = 1; i < arguments.length; i++) {
126 var source = arguments[i] != null ? arguments[i] : {};
127 if (i % 2) {
128 ownKeys(Object(source), true).forEach(function (key) {
129 _defineProperty(target, key, source[key]);
130 });
131 } else if (Object.getOwnPropertyDescriptors) {
132 Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
133 } else {
134 ownKeys(Object(source)).forEach(function (key) {
135 Object.defineProperty(
136 target,
137 key,
138 Object.getOwnPropertyDescriptor(source, key)
139 );
140 });
141 }
142 }
143 return target;
144}
145
146function _defineProperty(obj, key, value) {
147 if (key in obj) {
148 Object.defineProperty(obj, key, {
149 value: value,
150 enumerable: true,
151 configurable: true,
152 writable: true
153 });
154 } else {
155 obj[key] = value;
156 }
157 return obj;
158}
159
160const THIS_FILE = fs().readFileSync(__filename);
161
162const jestPresetPath = require.resolve('babel-preset-jest');
163
164const babelIstanbulPlugin = require.resolve('babel-plugin-istanbul'); // Narrow down the types
165
166const createTransformer = (inputOptions = {}) => {
167 var _inputOptions$plugins, _inputOptions$presets;
168
169 const options = _objectSpread({}, inputOptions, {
170 caller: _objectSpread(
171 {
172 name: 'babel-jest',
173 supportsDynamicImport: false,
174 supportsStaticESM: false
175 },
176 inputOptions.caller
177 ),
178 compact: false,
179 plugins:
180 (_inputOptions$plugins = inputOptions.plugins) !== null &&
181 _inputOptions$plugins !== void 0
182 ? _inputOptions$plugins
183 : [],
184 presets: ((_inputOptions$presets = inputOptions.presets) !== null &&
185 _inputOptions$presets !== void 0
186 ? _inputOptions$presets
187 : []
188 ).concat(jestPresetPath),
189 sourceMaps: 'both'
190 });
191
192 function loadBabelConfig(cwd, filename, transformOptions) {
193 var _transformOptions$sup, _transformOptions$sup2;
194
195 // `cwd` first to allow incoming options to override it
196 const babelConfig = (0, _loadBabelConfig.loadPartialConfig)(
197 _objectSpread(
198 {
199 cwd
200 },
201 options,
202 {
203 caller: _objectSpread({}, options.caller, {
204 supportsDynamicImport:
205 (_transformOptions$sup =
206 transformOptions === null || transformOptions === void 0
207 ? void 0
208 : transformOptions.supportsDynamicImport) !== null &&
209 _transformOptions$sup !== void 0
210 ? _transformOptions$sup
211 : options.caller.supportsDynamicImport,
212 supportsStaticESM:
213 (_transformOptions$sup2 =
214 transformOptions === null || transformOptions === void 0
215 ? void 0
216 : transformOptions.supportsStaticESM) !== null &&
217 _transformOptions$sup2 !== void 0
218 ? _transformOptions$sup2
219 : options.caller.supportsStaticESM
220 }),
221 filename
222 }
223 )
224 );
225
226 if (!babelConfig) {
227 throw new Error(
228 `babel-jest: Babel ignores ${_chalk().default.bold(
229 (0, _slash().default)(path().relative(cwd, filename))
230 )} - make sure to include the file in Jest's ${_chalk().default.bold(
231 'transformIgnorePatterns'
232 )} as well.`
233 );
234 }
235
236 return babelConfig;
237 }
238
239 return {
240 canInstrument: true,
241
242 getCacheKey(fileData, filename, configString, cacheKeyOptions) {
243 const {config, instrument, rootDir} = cacheKeyOptions;
244 const babelOptions = loadBabelConfig(
245 config.cwd,
246 filename,
247 cacheKeyOptions
248 );
249 const configPath = [
250 babelOptions.config || '',
251 babelOptions.babelrc || ''
252 ];
253 return (0, _crypto().createHash)('md5')
254 .update(THIS_FILE)
255 .update('\0', 'utf8')
256 .update(JSON.stringify(babelOptions.options))
257 .update('\0', 'utf8')
258 .update(fileData)
259 .update('\0', 'utf8')
260 .update(path().relative(rootDir, filename))
261 .update('\0', 'utf8')
262 .update(configString)
263 .update('\0', 'utf8')
264 .update(configPath.join(''))
265 .update('\0', 'utf8')
266 .update(instrument ? 'instrument' : '')
267 .update('\0', 'utf8')
268 .update(process.env.NODE_ENV || '')
269 .update('\0', 'utf8')
270 .update(process.env.BABEL_ENV || '')
271 .digest('hex');
272 },
273
274 process(src, filename, config, transformOptions) {
275 const babelOptions = _objectSpread(
276 {},
277 loadBabelConfig(config.cwd, filename, transformOptions).options
278 );
279
280 if (
281 transformOptions === null || transformOptions === void 0
282 ? void 0
283 : transformOptions.instrument
284 ) {
285 babelOptions.auxiliaryCommentBefore = ' istanbul ignore next '; // Copied from jest-runtime transform.js
286
287 babelOptions.plugins = (babelOptions.plugins || []).concat([
288 [
289 babelIstanbulPlugin,
290 {
291 // files outside `cwd` will not be instrumented
292 cwd: config.rootDir,
293 exclude: []
294 }
295 ]
296 ]);
297 }
298
299 const transformResult = (0, _core().transformSync)(src, babelOptions);
300
301 if (transformResult) {
302 const {code, map} = transformResult;
303
304 if (typeof code === 'string') {
305 return {
306 code,
307 map
308 };
309 }
310 }
311
312 return src;
313 }
314 };
315};
316
317const transformer = _objectSpread({}, createTransformer(), {
318 // Assigned here so only the exported transformer has `createTransformer`,
319 // instead of all created transformers by the function
320 createTransformer
321});
322
323module.exports = transformer;