@craco/craco
Version:
Create React App Configuration Override, an easy and comprehensible configuration layer for create-react-app.
87 lines (86 loc) • 4.06 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeJestConfig = void 0;
var path_1 = __importDefault(require("path"));
var logger_1 = require("../../logger");
var paths_1 = require("../../paths");
var utils_1 = require("../../utils");
var plugins_1 = require("../plugins");
var BABEL_TRANSFORM_ENTRY_KEY = '^.+\\.(js|jsx|mjs|cjs|ts|tsx)$';
function overrideBabelTransform(jestConfig, cracoConfig, transformKey) {
// The cracoConfig needs to be available within the jest-babel-transform in order to honor its settings.
// This approach is based on https://github.com/facebook/jest/issues/1468#issuecomment-384825178
jestConfig.globals = jestConfig.globals || {};
jestConfig.globals._cracoConfig = cracoConfig;
if (!jestConfig.transform) {
jestConfig.transform = {};
}
jestConfig.transform[transformKey] = require.resolve('./jest-babel-transform');
(0, logger_1.log)('Overrided Jest Babel transformer.');
}
function configureBabel(jestConfig, cracoConfig) {
var _a, _b;
var _c = (_b = (_a = cracoConfig.jest) === null || _a === void 0 ? void 0 : _a.babel) !== null && _b !== void 0 ? _b : {}, addPresets = _c.addPresets, addPlugins = _c.addPlugins;
if (addPresets || addPlugins) {
if (cracoConfig.babel) {
var _d = cracoConfig.babel, presets = _d.presets, plugins = _d.plugins;
if ((0, utils_1.isArray)(presets) || (0, utils_1.isArray)(plugins)) {
if (!jestConfig.transform) {
jestConfig.transform = {};
}
if (jestConfig.transform[BABEL_TRANSFORM_ENTRY_KEY]) {
overrideBabelTransform(jestConfig, cracoConfig, BABEL_TRANSFORM_ENTRY_KEY);
}
else {
throw new Error("craco: Cannot find Jest transform entry for Babel ".concat(BABEL_TRANSFORM_ENTRY_KEY, "."));
}
}
}
}
}
function giveTotalControl(jestConfig, configureJest, context) {
if ((0, utils_1.isFunction)(configureJest)) {
jestConfig = configureJest(jestConfig, context);
if (!jestConfig) {
throw new Error("craco: 'jest.configure' function didn't returned a Jest config object.");
}
}
else {
// TODO: ensure is otherwise a plain object, if not, log an error.
jestConfig = (0, utils_1.deepMergeWithArray)({}, jestConfig, configureJest);
}
(0, logger_1.log)("Merged Jest config with 'jest.configure'.");
return jestConfig;
}
function mergeJestConfig(cracoConfig, craJestConfigProvider, context) {
var customResolve = function (relativePath) {
var _a;
return require.resolve(path_1.default.join((_a = cracoConfig.reactScriptsVersion) !== null && _a !== void 0 ? _a : 'react-scripts', relativePath), { paths: [paths_1.projectRoot] });
};
var jestConfig = craJestConfigProvider(customResolve, paths_1.projectRoot, false);
if (cracoConfig.jest) {
configureBabel(jestConfig, cracoConfig);
var jestContext = __assign(__assign({}, context), { resolve: customResolve, rootDir: paths_1.projectRoot });
if (cracoConfig.jest.configure) {
jestConfig = giveTotalControl(jestConfig, cracoConfig.jest.configure, jestContext);
}
jestConfig = (0, plugins_1.applyJestConfigPlugins)(cracoConfig, jestConfig, jestContext);
(0, logger_1.log)('Merged Jest config.');
}
return jestConfig;
}
exports.mergeJestConfig = mergeJestConfig;