You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
6.0 KiB

2 years ago
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.default = init;
function path() {
const data = _interopRequireWildcard(require('path'));
path = function () {
return data;
};
return data;
}
function _chalk() {
const data = _interopRequireDefault(require('chalk'));
_chalk = function () {
return data;
};
return data;
}
function fs() {
const data = _interopRequireWildcard(require('graceful-fs'));
fs = function () {
return data;
};
return data;
}
function _prompts() {
const data = _interopRequireDefault(require('prompts'));
_prompts = function () {
return data;
};
return data;
}
function _jestConfig() {
const data = require('jest-config');
_jestConfig = function () {
return data;
};
return data;
}
function _jestUtil() {
const data = require('jest-util');
_jestUtil = function () {
return data;
};
return data;
}
var _errors = require('./errors');
var _generateConfigFile = _interopRequireDefault(
require('./generateConfigFile')
);
var _modifyPackageJson = _interopRequireDefault(require('./modifyPackageJson'));
var _questions = _interopRequireWildcard(require('./questions'));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {default: obj};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== 'function') return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function (nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
return {default: obj};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor =
Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key in obj) {
if (key !== 'default' && 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;
}
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const {
JEST_CONFIG_BASE_NAME,
JEST_CONFIG_EXT_MJS,
JEST_CONFIG_EXT_JS,
JEST_CONFIG_EXT_TS,
JEST_CONFIG_EXT_ORDER,
PACKAGE_JSON
} = _jestConfig().constants;
const getConfigFilename = ext => JEST_CONFIG_BASE_NAME + ext;
async function init(rootDir = (0, _jestUtil().tryRealpath)(process.cwd())) {
// prerequisite checks
const projectPackageJsonPath = path().join(rootDir, PACKAGE_JSON);
if (!fs().existsSync(projectPackageJsonPath)) {
throw new _errors.NotFoundPackageJsonError(rootDir);
}
const questions = _questions.default.slice(0);
let hasJestProperty = false;
let projectPackageJson;
try {
projectPackageJson = JSON.parse(
fs().readFileSync(projectPackageJsonPath, 'utf-8')
);
} catch {
throw new _errors.MalformedPackageJsonError(projectPackageJsonPath);
}
if (projectPackageJson.jest) {
hasJestProperty = true;
}
const existingJestConfigExt = JEST_CONFIG_EXT_ORDER.find(ext =>
fs().existsSync(path().join(rootDir, getConfigFilename(ext)))
);
if (hasJestProperty || existingJestConfigExt) {
const result = await (0, _prompts().default)({
initial: true,
message:
'It seems that you already have a jest configuration, do you want to override it?',
name: 'continue',
type: 'confirm'
});
if (!result.continue) {
console.log();
console.log('Aborting...');
return;
}
} // Add test script installation only if needed
if (
!projectPackageJson.scripts ||
projectPackageJson.scripts.test !== 'jest'
) {
questions.unshift(_questions.testScriptQuestion);
} // Start the init process
console.log();
console.log(
_chalk().default.underline(
'The following questions will help Jest to create a suitable configuration for your project\n'
)
);
let promptAborted = false; // @ts-expect-error: Return type cannot be object - faulty typings
const results = await (0, _prompts().default)(questions, {
onCancel: () => {
promptAborted = true;
}
});
if (promptAborted) {
console.log();
console.log('Aborting...');
return;
} // Determine if Jest should use JS or TS for the config file
const jestConfigFileExt = results.useTypescript
? JEST_CONFIG_EXT_TS
: projectPackageJson.type === 'module'
? JEST_CONFIG_EXT_MJS
: JEST_CONFIG_EXT_JS; // Determine Jest config path
const jestConfigPath = existingJestConfigExt
? getConfigFilename(existingJestConfigExt)
: path().join(rootDir, getConfigFilename(jestConfigFileExt));
const shouldModifyScripts = results.scripts;
if (shouldModifyScripts || hasJestProperty) {
const modifiedPackageJson = (0, _modifyPackageJson.default)({
projectPackageJson,
shouldModifyScripts
});
fs().writeFileSync(projectPackageJsonPath, modifiedPackageJson);
console.log('');
console.log(
` Modified ${_chalk().default.cyan(projectPackageJsonPath)}`
);
}
const generatedConfig = (0, _generateConfigFile.default)(
results,
projectPackageJson.type === 'module' ||
jestConfigPath.endsWith(JEST_CONFIG_EXT_MJS)
);
fs().writeFileSync(jestConfigPath, generatedConfig);
console.log('');
console.log(
`📝 Configuration file created at ${_chalk().default.cyan(jestConfigPath)}`
);
}