'use strict'; function _crypto() { const data = require('crypto'); _crypto = function () { return data; }; return data; } function fs() { const data = _interopRequireWildcard(require('fs')); fs = function () { return data; }; return data; } function path() { const data = _interopRequireWildcard(require('path')); path = function () { return data; }; return data; } function _core() { const data = require('@babel/core'); _core = function () { return data; }; return data; } var _loadBabelConfig = require('./loadBabelConfig'); function _chalk() { const data = _interopRequireDefault(require('chalk')); _chalk = function () { return data; }; return data; } function _slash() { const data = _interopRequireDefault(require('slash')); _slash = function () { return data; }; return data; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : {default: obj}; } function _getRequireWildcardCache() { if (typeof WeakMap !== 'function') return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _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; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty( target, key, Object.getOwnPropertyDescriptor(source, key) ); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const THIS_FILE = fs().readFileSync(__filename); const jestPresetPath = require.resolve('babel-preset-jest'); const babelIstanbulPlugin = require.resolve('babel-plugin-istanbul'); // Narrow down the types const createTransformer = (inputOptions = {}) => { var _inputOptions$plugins, _inputOptions$presets; const options = _objectSpread({}, inputOptions, { caller: _objectSpread( { name: 'babel-jest', supportsDynamicImport: false, supportsStaticESM: false }, inputOptions.caller ), compact: false, plugins: (_inputOptions$plugins = inputOptions.plugins) !== null && _inputOptions$plugins !== void 0 ? _inputOptions$plugins : [], presets: ((_inputOptions$presets = inputOptions.presets) !== null && _inputOptions$presets !== void 0 ? _inputOptions$presets : [] ).concat(jestPresetPath), sourceMaps: 'both' }); function loadBabelConfig(cwd, filename, transformOptions) { var _transformOptions$sup, _transformOptions$sup2; // `cwd` first to allow incoming options to override it const babelConfig = (0, _loadBabelConfig.loadPartialConfig)( _objectSpread( { cwd }, options, { caller: _objectSpread({}, options.caller, { supportsDynamicImport: (_transformOptions$sup = transformOptions === null || transformOptions === void 0 ? void 0 : transformOptions.supportsDynamicImport) !== null && _transformOptions$sup !== void 0 ? _transformOptions$sup : options.caller.supportsDynamicImport, supportsStaticESM: (_transformOptions$sup2 = transformOptions === null || transformOptions === void 0 ? void 0 : transformOptions.supportsStaticESM) !== null && _transformOptions$sup2 !== void 0 ? _transformOptions$sup2 : options.caller.supportsStaticESM }), filename } ) ); if (!babelConfig) { throw new Error( `babel-jest: Babel ignores ${_chalk().default.bold( (0, _slash().default)(path().relative(cwd, filename)) )} - make sure to include the file in Jest's ${_chalk().default.bold( 'transformIgnorePatterns' )} as well.` ); } return babelConfig; } return { canInstrument: true, getCacheKey(fileData, filename, configString, cacheKeyOptions) { const {config, instrument, rootDir} = cacheKeyOptions; const babelOptions = loadBabelConfig( config.cwd, filename, cacheKeyOptions ); const configPath = [ babelOptions.config || '', babelOptions.babelrc || '' ]; return (0, _crypto().createHash)('md5') .update(THIS_FILE) .update('\0', 'utf8') .update(JSON.stringify(babelOptions.options)) .update('\0', 'utf8') .update(fileData) .update('\0', 'utf8') .update(path().relative(rootDir, filename)) .update('\0', 'utf8') .update(configString) .update('\0', 'utf8') .update(configPath.join('')) .update('\0', 'utf8') .update(instrument ? 'instrument' : '') .update('\0', 'utf8') .update(process.env.NODE_ENV || '') .update('\0', 'utf8') .update(process.env.BABEL_ENV || '') .digest('hex'); }, process(src, filename, config, transformOptions) { const babelOptions = _objectSpread( {}, loadBabelConfig(config.cwd, filename, transformOptions).options ); if ( transformOptions === null || transformOptions === void 0 ? void 0 : transformOptions.instrument ) { babelOptions.auxiliaryCommentBefore = ' istanbul ignore next '; // Copied from jest-runtime transform.js babelOptions.plugins = (babelOptions.plugins || []).concat([ [ babelIstanbulPlugin, { // files outside `cwd` will not be instrumented cwd: config.rootDir, exclude: [] } ] ]); } const transformResult = (0, _core().transformSync)(src, babelOptions); if (transformResult) { const {code, map} = transformResult; if (typeof code === 'string') { return { code, map }; } } return src; } }; }; const transformer = _objectSpread({}, createTransformer(), { // Assigned here so only the exported transformer has `createTransformer`, // instead of all created transformers by the function createTransformer }); module.exports = transformer;