normalize.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', {
  3. value: true
  4. });
  5. exports.default = normalize;
  6. var _crypto;
  7. function _load_crypto() {
  8. return (_crypto = _interopRequireDefault(require('crypto')));
  9. }
  10. var _glob;
  11. function _load_glob() {
  12. return (_glob = _interopRequireDefault(require('glob')));
  13. }
  14. var _path;
  15. function _load_path() {
  16. return (_path = _interopRequireDefault(require('path')));
  17. }
  18. var _jestValidate;
  19. function _load_jestValidate() {
  20. return (_jestValidate = require('jest-validate'));
  21. }
  22. var _validatePattern;
  23. function _load_validatePattern() {
  24. return (_validatePattern = _interopRequireDefault(
  25. require('./validatePattern')
  26. ));
  27. }
  28. var _jestUtil;
  29. function _load_jestUtil() {
  30. return (_jestUtil = require('jest-util'));
  31. }
  32. var _chalk;
  33. function _load_chalk() {
  34. return (_chalk = _interopRequireDefault(require('chalk')));
  35. }
  36. var _getMaxWorkers;
  37. function _load_getMaxWorkers() {
  38. return (_getMaxWorkers = _interopRequireDefault(require('./getMaxWorkers')));
  39. }
  40. var _micromatch;
  41. function _load_micromatch() {
  42. return (_micromatch = _interopRequireDefault(require('micromatch')));
  43. }
  44. var _jestResolve;
  45. function _load_jestResolve() {
  46. return (_jestResolve = _interopRequireDefault(require('jest-resolve')));
  47. }
  48. var _jestRegexUtil;
  49. function _load_jestRegexUtil() {
  50. return (_jestRegexUtil = require('jest-regex-util'));
  51. }
  52. var _utils;
  53. function _load_utils() {
  54. return (_utils = require('./utils'));
  55. }
  56. var _constants;
  57. function _load_constants() {
  58. return (_constants = require('./constants'));
  59. }
  60. var _ReporterValidationErrors;
  61. function _load_ReporterValidationErrors() {
  62. return (_ReporterValidationErrors = require('./ReporterValidationErrors'));
  63. }
  64. var _Defaults;
  65. function _load_Defaults() {
  66. return (_Defaults = _interopRequireDefault(require('./Defaults')));
  67. }
  68. var _Deprecated;
  69. function _load_Deprecated() {
  70. return (_Deprecated = _interopRequireDefault(require('./Deprecated')));
  71. }
  72. var _setFromArgv;
  73. function _load_setFromArgv() {
  74. return (_setFromArgv = _interopRequireDefault(require('./setFromArgv')));
  75. }
  76. var _ValidConfig;
  77. function _load_ValidConfig() {
  78. return (_ValidConfig = _interopRequireDefault(require('./ValidConfig')));
  79. }
  80. function _interopRequireDefault(obj) {
  81. return obj && obj.__esModule ? obj : {default: obj};
  82. }
  83. function _toConsumableArray(arr) {
  84. if (Array.isArray(arr)) {
  85. for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++)
  86. arr2[i] = arr[i];
  87. return arr2;
  88. } else {
  89. return Array.from(arr);
  90. }
  91. }
  92. /**
  93. * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
  94. *
  95. * This source code is licensed under the MIT license found in the
  96. * LICENSE file in the root directory of this source tree.
  97. *
  98. *
  99. */
  100. const ERROR = `${(_utils || _load_utils()).BULLET}Validation Error`;
  101. const PRESET_EXTENSIONS = ['.json', '.js'];
  102. const PRESET_NAME = 'jest-preset';
  103. const createConfigError = message =>
  104. new (_jestValidate || _load_jestValidate()).ValidationError(
  105. ERROR,
  106. message,
  107. (_utils || _load_utils()).DOCUMENTATION_NOTE
  108. );
  109. const mergeOptionWithPreset = (options, preset, optionName) => {
  110. if (options[optionName] && preset[optionName]) {
  111. options[optionName] = Object.assign(
  112. {},
  113. options[optionName],
  114. preset[optionName],
  115. options[optionName]
  116. );
  117. }
  118. };
  119. const setupPreset = (options, optionsPreset) => {
  120. let preset;
  121. const presetPath = (0, (_utils || _load_utils()).replaceRootDirInPath)(
  122. options.rootDir,
  123. optionsPreset
  124. );
  125. const presetModule = (
  126. _jestResolve || _load_jestResolve()
  127. ).default.findNodeModule(
  128. presetPath.startsWith('.')
  129. ? presetPath
  130. : (_path || _load_path()).default.join(presetPath, PRESET_NAME),
  131. {
  132. basedir: options.rootDir,
  133. extensions: PRESET_EXTENSIONS
  134. }
  135. );
  136. try {
  137. // Force re-evaluation to support multiple projects
  138. try {
  139. if (presetModule) {
  140. delete require.cache[require.resolve(presetModule)];
  141. }
  142. } catch (e) {}
  143. // $FlowFixMe
  144. preset = require(presetModule);
  145. } catch (error) {
  146. if (error instanceof SyntaxError) {
  147. throw createConfigError(
  148. ` Preset ${(_chalk || _load_chalk()).default.bold(
  149. presetPath
  150. )} is invalid:\n ${error.message}`
  151. );
  152. }
  153. const preset = (_jestResolve || _load_jestResolve()).default.findNodeModule(
  154. presetPath,
  155. {
  156. basedir: options.rootDir
  157. }
  158. );
  159. if (preset) {
  160. throw createConfigError(
  161. ` Module ${(_chalk || _load_chalk()).default.bold(
  162. presetPath
  163. )} should have "jest-preset.js" or "jest-preset.json" file at the root.`
  164. );
  165. }
  166. throw createConfigError(
  167. ` Preset ${(_chalk || _load_chalk()).default.bold(
  168. presetPath
  169. )} not found.`
  170. );
  171. }
  172. if (options.setupFiles) {
  173. options.setupFiles = (preset.setupFiles || []).concat(options.setupFiles);
  174. }
  175. if (options.modulePathIgnorePatterns && preset.modulePathIgnorePatterns) {
  176. options.modulePathIgnorePatterns = preset.modulePathIgnorePatterns.concat(
  177. options.modulePathIgnorePatterns
  178. );
  179. }
  180. mergeOptionWithPreset(options, preset, 'moduleNameMapper');
  181. mergeOptionWithPreset(options, preset, 'transform');
  182. return Object.assign({}, preset, options);
  183. };
  184. const setupBabelJest = options => {
  185. const transform = options.transform;
  186. let babelJest;
  187. if (transform) {
  188. const customJSPattern = Object.keys(transform).find(pattern => {
  189. const regex = new RegExp(pattern);
  190. return regex.test('a.js') || regex.test('a.jsx');
  191. });
  192. if (customJSPattern) {
  193. const customJSTransformer = transform[customJSPattern];
  194. if (customJSTransformer === 'babel-jest') {
  195. babelJest = require.resolve('babel-jest');
  196. transform[customJSPattern] = babelJest;
  197. } else if (customJSTransformer.includes('babel-jest')) {
  198. babelJest = customJSTransformer;
  199. }
  200. }
  201. } else {
  202. babelJest = require.resolve('babel-jest');
  203. options.transform = {
  204. [(_constants || _load_constants()).DEFAULT_JS_PATTERN]: babelJest
  205. };
  206. }
  207. return babelJest;
  208. };
  209. const normalizeCollectCoverageOnlyFrom = (options, key) => {
  210. const collectCoverageOnlyFrom = Array.isArray(options[key])
  211. ? options[key] // passed from argv
  212. : Object.keys(options[key]); // passed from options
  213. return collectCoverageOnlyFrom.reduce((map, filePath) => {
  214. filePath = (_path || _load_path()).default.resolve(
  215. options.rootDir,
  216. (0, (_utils || _load_utils()).replaceRootDirInPath)(
  217. options.rootDir,
  218. filePath
  219. )
  220. );
  221. map[filePath] = true;
  222. return map;
  223. }, Object.create(null));
  224. };
  225. const normalizeCollectCoverageFrom = (options, key) => {
  226. let value;
  227. if (!options[key]) {
  228. value = [];
  229. }
  230. if (!Array.isArray(options[key])) {
  231. try {
  232. value = JSON.parse(options[key]);
  233. } catch (e) {}
  234. Array.isArray(value) || (value = [options[key]]);
  235. } else {
  236. value = options[key];
  237. }
  238. if (value) {
  239. value = value.map(filePath =>
  240. filePath.replace(/^(!?)(<rootDir>\/)(.*)/, '$1$3')
  241. );
  242. }
  243. return value;
  244. };
  245. const normalizeUnmockedModulePathPatterns = (
  246. options,
  247. key
  248. // _replaceRootDirTags is specifically well-suited for substituting
  249. // <rootDir> in paths (it deals with properly interpreting relative path
  250. // separators, etc).
  251. //
  252. // For patterns, direct global substitution is far more ideal, so we
  253. // special case substitutions for patterns here.
  254. ) =>
  255. options[key].map(pattern =>
  256. (0, (_jestRegexUtil || _load_jestRegexUtil()).replacePathSepForRegex)(
  257. pattern.replace(/<rootDir>/g, options.rootDir)
  258. )
  259. );
  260. const normalizePreprocessor = options => {
  261. if (options.scriptPreprocessor && options.transform) {
  262. throw createConfigError(` Options: ${(
  263. _chalk || _load_chalk()
  264. ).default.bold('scriptPreprocessor')} and ${(
  265. _chalk || _load_chalk()
  266. ).default.bold('transform')} cannot be used together.
  267. Please change your configuration to only use ${(
  268. _chalk || _load_chalk()
  269. ).default.bold('transform')}.`);
  270. }
  271. if (options.preprocessorIgnorePatterns && options.transformIgnorePatterns) {
  272. throw createConfigError(` Options ${(_chalk || _load_chalk()).default.bold(
  273. 'preprocessorIgnorePatterns'
  274. )} and ${(_chalk || _load_chalk()).default.bold(
  275. 'transformIgnorePatterns'
  276. )} cannot be used together.
  277. Please change your configuration to only use ${(
  278. _chalk || _load_chalk()
  279. ).default.bold('transformIgnorePatterns')}.`);
  280. }
  281. if (options.scriptPreprocessor) {
  282. options.transform = {
  283. '.*': options.scriptPreprocessor
  284. };
  285. }
  286. if (options.preprocessorIgnorePatterns) {
  287. options.transformIgnorePatterns = options.preprocessorIgnorePatterns;
  288. }
  289. delete options.scriptPreprocessor;
  290. delete options.preprocessorIgnorePatterns;
  291. return options;
  292. };
  293. const normalizeMissingOptions = options => {
  294. if (!options.name) {
  295. options.name = (_crypto || _load_crypto()).default
  296. .createHash('md5')
  297. .update(options.rootDir)
  298. .digest('hex');
  299. }
  300. if (!options.setupFiles) {
  301. options.setupFiles = [];
  302. }
  303. return options;
  304. };
  305. const normalizeRootDir = options => {
  306. // Assert that there *is* a rootDir
  307. if (!options.hasOwnProperty('rootDir')) {
  308. throw createConfigError(
  309. ` Configuration option ${(_chalk || _load_chalk()).default.bold(
  310. 'rootDir'
  311. )} must be specified.`
  312. );
  313. }
  314. options.rootDir = (_path || _load_path()).default.normalize(options.rootDir);
  315. return options;
  316. };
  317. const normalizeReporters = (options, basedir) => {
  318. const reporters = options.reporters;
  319. if (!reporters || !Array.isArray(reporters)) {
  320. return options;
  321. }
  322. (0,
  323. (_ReporterValidationErrors || _load_ReporterValidationErrors())
  324. .validateReporters)(reporters);
  325. options.reporters = reporters.map(reporterConfig => {
  326. const normalizedReporterConfig =
  327. typeof reporterConfig === 'string' // if reporter config is a string, we wrap it in an array
  328. ? // and pass an empty object for options argument, to normalize
  329. // the shape.
  330. [reporterConfig, {}]
  331. : reporterConfig;
  332. const reporterPath = (0, (_utils || _load_utils()).replaceRootDirInPath)(
  333. options.rootDir,
  334. normalizedReporterConfig[0]
  335. );
  336. if (
  337. reporterPath !== (_constants || _load_constants()).DEFAULT_REPORTER_LABEL
  338. ) {
  339. const reporter = (
  340. _jestResolve || _load_jestResolve()
  341. ).default.findNodeModule(reporterPath, {
  342. basedir: options.rootDir
  343. });
  344. if (!reporter) {
  345. throw new Error(
  346. `Could not resolve a module for a custom reporter.\n` +
  347. ` Module name: ${reporterPath}`
  348. );
  349. }
  350. normalizedReporterConfig[0] = reporter;
  351. }
  352. return normalizedReporterConfig;
  353. });
  354. return options;
  355. };
  356. const buildTestPathPattern = argv => {
  357. const patterns = [];
  358. if (argv._) {
  359. patterns.push.apply(patterns, _toConsumableArray(argv._));
  360. }
  361. if (argv.testPathPattern) {
  362. patterns.push.apply(patterns, _toConsumableArray(argv.testPathPattern));
  363. }
  364. const replacePosixSep = pattern => {
  365. if ((_path || _load_path()).default.sep === '/') {
  366. return pattern;
  367. }
  368. return pattern.replace(/\//g, '\\\\');
  369. };
  370. const testPathPattern = patterns.map(replacePosixSep).join('|');
  371. if (
  372. (0, (_validatePattern || _load_validatePattern()).default)(testPathPattern)
  373. ) {
  374. return testPathPattern;
  375. } else {
  376. showTestPathPatternError(testPathPattern);
  377. return '';
  378. }
  379. };
  380. const showTestPathPatternError = testPathPattern => {
  381. (0, (_jestUtil || _load_jestUtil()).clearLine)(process.stdout);
  382. console.log(
  383. (_chalk || _load_chalk()).default.red(
  384. ` Invalid testPattern ${testPathPattern} supplied. ` +
  385. `Running all tests instead.`
  386. )
  387. );
  388. };
  389. function normalize(options, argv) {
  390. var _validate = (0, (_jestValidate || _load_jestValidate()).validate)(
  391. options,
  392. {
  393. comment: (_utils || _load_utils()).DOCUMENTATION_NOTE,
  394. deprecatedConfig: (_Deprecated || _load_Deprecated()).default,
  395. exampleConfig: (_ValidConfig || _load_ValidConfig()).default,
  396. recursiveBlacklist: [
  397. 'collectCoverageOnlyFrom',
  398. // 'coverageThreshold' allows to use 'global' and glob strings on the same
  399. // level, there's currently no way we can deal with such config
  400. 'coverageThreshold',
  401. 'globals',
  402. 'moduleNameMapper',
  403. 'testEnvironmentOptions',
  404. 'transform'
  405. ]
  406. }
  407. );
  408. const hasDeprecationWarnings = _validate.hasDeprecationWarnings;
  409. options = normalizePreprocessor(
  410. normalizeReporters(
  411. normalizeMissingOptions(
  412. normalizeRootDir(
  413. (0, (_setFromArgv || _load_setFromArgv()).default)(options, argv)
  414. )
  415. )
  416. )
  417. );
  418. if (options.preset) {
  419. options = setupPreset(options, options.preset);
  420. }
  421. if (options.testEnvironment) {
  422. options.testEnvironment = (0, (_utils || _load_utils()).getTestEnvironment)(
  423. options
  424. );
  425. }
  426. if (!options.roots && options.testPathDirs) {
  427. options.roots = options.testPathDirs;
  428. delete options.testPathDirs;
  429. }
  430. if (!options.roots) {
  431. options.roots = [options.rootDir];
  432. }
  433. if (!options.testRunner || options.testRunner === 'jasmine2') {
  434. options.testRunner = require.resolve('jest-jasmine2');
  435. }
  436. if (!options.coverageDirectory) {
  437. options.coverageDirectory = (_path || _load_path()).default.resolve(
  438. options.rootDir,
  439. 'coverage'
  440. );
  441. }
  442. const babelJest = setupBabelJest(options);
  443. const newOptions = Object.assign({}, (_Defaults || _load_Defaults()).default);
  444. // Cast back to exact type
  445. options = options;
  446. if (options.resolver) {
  447. newOptions.resolver = (0, (_utils || _load_utils()).resolve)(null, {
  448. filePath: options.resolver,
  449. key: 'resolver',
  450. rootDir: options.rootDir
  451. });
  452. }
  453. Object.keys(options).reduce((newOptions, key) => {
  454. // The resolver has been resolved separately; skip it
  455. if (key === 'resolver') {
  456. return newOptions;
  457. }
  458. let value;
  459. switch (key) {
  460. case 'collectCoverageOnlyFrom':
  461. value = normalizeCollectCoverageOnlyFrom(options, key);
  462. break;
  463. case 'setupFiles':
  464. case 'snapshotSerializers':
  465. value =
  466. options[key] &&
  467. options[key].map(filePath =>
  468. (0, (_utils || _load_utils()).resolve)(newOptions.resolver, {
  469. filePath: filePath,
  470. key: key,
  471. rootDir: options.rootDir
  472. })
  473. );
  474. break;
  475. case 'modulePaths':
  476. case 'roots':
  477. value =
  478. options[key] &&
  479. options[key].map(filePath =>
  480. (_path || _load_path()).default.resolve(
  481. options.rootDir,
  482. (0, (_utils || _load_utils()).replaceRootDirInPath)(
  483. options.rootDir,
  484. filePath
  485. )
  486. )
  487. );
  488. break;
  489. case 'collectCoverageFrom':
  490. value = normalizeCollectCoverageFrom(options, key);
  491. break;
  492. case 'cacheDirectory':
  493. case 'coverageDirectory':
  494. value =
  495. options[key] &&
  496. (_path || _load_path()).default.resolve(
  497. options.rootDir,
  498. (0, (_utils || _load_utils()).replaceRootDirInPath)(
  499. options.rootDir,
  500. options[key]
  501. )
  502. );
  503. break;
  504. case 'globalSetup':
  505. case 'globalTeardown':
  506. case 'moduleLoader':
  507. case 'runner':
  508. case 'setupTestFrameworkScriptFile':
  509. case 'testResultsProcessor':
  510. case 'testRunner':
  511. case 'filter':
  512. value =
  513. options[key] &&
  514. (0, (_utils || _load_utils()).resolve)(newOptions.resolver, {
  515. filePath: options[key],
  516. key: key,
  517. rootDir: options.rootDir
  518. });
  519. break;
  520. case 'prettierPath':
  521. // We only want this to throw if "prettierPath" is explicitly passed
  522. // from config or CLI, and the requested path isn't found. Otherwise we
  523. // set it to null and throw an error lazily when it is used.
  524. value =
  525. options[key] &&
  526. (0, (_utils || _load_utils()).resolve)(newOptions.resolver, {
  527. filePath: options[key],
  528. key: key,
  529. optional:
  530. options[key] === (_Defaults || _load_Defaults()).default[key],
  531. rootDir: options.rootDir
  532. });
  533. break;
  534. case 'moduleNameMapper':
  535. const moduleNameMapper = options[key];
  536. value =
  537. moduleNameMapper &&
  538. Object.keys(moduleNameMapper).map(regex => {
  539. const item = moduleNameMapper && moduleNameMapper[regex];
  540. return (
  541. item && [
  542. regex,
  543. (0, (_utils || _load_utils())._replaceRootDirTags)(
  544. options.rootDir,
  545. item
  546. )
  547. ]
  548. );
  549. });
  550. break;
  551. case 'transform':
  552. const transform = options[key];
  553. value =
  554. transform &&
  555. Object.keys(transform).map(regex => [
  556. regex,
  557. (0, (_utils || _load_utils()).resolve)(newOptions.resolver, {
  558. filePath: transform[regex],
  559. key: key,
  560. rootDir: options.rootDir
  561. })
  562. ]);
  563. break;
  564. case 'coveragePathIgnorePatterns':
  565. case 'modulePathIgnorePatterns':
  566. case 'testPathIgnorePatterns':
  567. case 'transformIgnorePatterns':
  568. case 'watchPathIgnorePatterns':
  569. case 'unmockedModulePathPatterns':
  570. value = normalizeUnmockedModulePathPatterns(options, key);
  571. break;
  572. case 'haste':
  573. value = Object.assign({}, options[key]);
  574. if (value.hasteImplModulePath != null) {
  575. value.hasteImplModulePath = (0, (_utils || _load_utils()).resolve)(
  576. newOptions.resolver,
  577. {
  578. filePath: (0, (_utils || _load_utils()).replaceRootDirInPath)(
  579. options.rootDir,
  580. value.hasteImplModulePath
  581. ),
  582. key: 'haste.hasteImplModulePath',
  583. rootDir: options.rootDir
  584. }
  585. );
  586. }
  587. break;
  588. case 'projects':
  589. value = (options[key] || [])
  590. .map(
  591. project =>
  592. typeof project === 'string'
  593. ? (0, (_utils || _load_utils())._replaceRootDirTags)(
  594. options.rootDir,
  595. project
  596. )
  597. : project
  598. )
  599. .reduce((projects, project) => {
  600. // Project can be specified as globs. If a glob matches any files,
  601. // We expand it to these paths. If not, we keep the original path
  602. // for the future resolution.
  603. const globMatches =
  604. typeof project === 'string'
  605. ? (_glob || _load_glob()).default.sync(project)
  606. : [];
  607. return projects.concat(globMatches.length ? globMatches : project);
  608. }, []);
  609. break;
  610. case 'moduleDirectories':
  611. case 'testMatch':
  612. value = (0, (_utils || _load_utils())._replaceRootDirTags)(
  613. (0, (_utils || _load_utils()).escapeGlobCharacters)(options.rootDir),
  614. options[key]
  615. );
  616. break;
  617. case 'testRegex':
  618. value =
  619. options[key] &&
  620. (0, (_jestRegexUtil || _load_jestRegexUtil()).replacePathSepForRegex)(
  621. options[key]
  622. );
  623. break;
  624. case 'automock':
  625. case 'bail':
  626. case 'browser':
  627. case 'cache':
  628. case 'changedSince':
  629. case 'changedFilesWithAncestor':
  630. case 'clearMocks':
  631. case 'collectCoverage':
  632. case 'coverageReporters':
  633. case 'coverageThreshold':
  634. case 'detectLeaks':
  635. case 'detectOpenHandles':
  636. case 'displayName':
  637. case 'errorOnDeprecated':
  638. case 'expand':
  639. case 'globals':
  640. case 'findRelatedTests':
  641. case 'forceCoverageMatch':
  642. case 'forceExit':
  643. case 'lastCommit':
  644. case 'listTests':
  645. case 'logHeapUsage':
  646. case 'mapCoverage':
  647. case 'moduleFileExtensions':
  648. case 'name':
  649. case 'noStackTrace':
  650. case 'notify':
  651. case 'notifyMode':
  652. case 'onlyChanged':
  653. case 'outputFile':
  654. case 'passWithNoTests':
  655. case 'replname':
  656. case 'reporters':
  657. case 'resetMocks':
  658. case 'resetModules':
  659. case 'restoreMocks':
  660. case 'rootDir':
  661. case 'runTestsByPath':
  662. case 'silent':
  663. case 'skipFilter':
  664. case 'skipNodeResolution':
  665. case 'testEnvironment':
  666. case 'testEnvironmentOptions':
  667. case 'testFailureExitCode':
  668. case 'testLocationInResults':
  669. case 'testNamePattern':
  670. case 'testURL':
  671. case 'timers':
  672. case 'useStderr':
  673. case 'verbose':
  674. case 'watch':
  675. case 'watchAll':
  676. case 'watchman':
  677. value = options[key];
  678. break;
  679. case 'watchPlugins':
  680. value = (options[key] || []).map(watchPlugin => {
  681. if (typeof watchPlugin === 'string') {
  682. return {
  683. config: {},
  684. path: (0, (_utils || _load_utils()).resolve)(
  685. newOptions.resolver,
  686. {
  687. filePath: watchPlugin,
  688. key: key,
  689. rootDir: options.rootDir
  690. }
  691. )
  692. };
  693. } else {
  694. return {
  695. config: watchPlugin[1] || {},
  696. path: (0, (_utils || _load_utils()).resolve)(
  697. newOptions.resolver,
  698. {
  699. filePath: watchPlugin[0],
  700. key: key,
  701. rootDir: options.rootDir
  702. }
  703. )
  704. };
  705. }
  706. });
  707. break;
  708. }
  709. newOptions[key] = value;
  710. return newOptions;
  711. }, newOptions);
  712. newOptions.nonFlagArgs = argv._;
  713. newOptions.testPathPattern = buildTestPathPattern(argv);
  714. newOptions.json = argv.json;
  715. newOptions.testFailureExitCode = parseInt(newOptions.testFailureExitCode, 10);
  716. for (const key of [
  717. 'lastCommit',
  718. 'changedFilesWithAncestor',
  719. 'changedSince'
  720. ]) {
  721. if (newOptions[key]) {
  722. newOptions.onlyChanged = true;
  723. }
  724. }
  725. if (argv.all) {
  726. newOptions.onlyChanged = false;
  727. } else if (newOptions.testPathPattern) {
  728. // When passing a test path pattern we don't want to only monitor changed
  729. // files unless `--watch` is also passed.
  730. newOptions.onlyChanged = newOptions.watch;
  731. }
  732. newOptions.updateSnapshot =
  733. argv.ci && !argv.updateSnapshot
  734. ? 'none'
  735. : argv.updateSnapshot
  736. ? 'all'
  737. : 'new';
  738. newOptions.maxWorkers = (0,
  739. (_getMaxWorkers || _load_getMaxWorkers()).default)(argv);
  740. if (babelJest) {
  741. const regeneratorRuntimePath = (
  742. _jestResolve || _load_jestResolve()
  743. ).default.findNodeModule('regenerator-runtime/runtime', {
  744. basedir: options.rootDir,
  745. resolver: newOptions.resolver
  746. });
  747. if (regeneratorRuntimePath) {
  748. newOptions.setupFiles.unshift(regeneratorRuntimePath);
  749. }
  750. }
  751. if (options.testRegex && options.testMatch) {
  752. throw createConfigError(
  753. ` Configuration options ${(_chalk || _load_chalk()).default.bold(
  754. 'testMatch'
  755. )} and` +
  756. ` ${(_chalk || _load_chalk()).default.bold(
  757. 'testRegex'
  758. )} cannot be used together.`
  759. );
  760. }
  761. if (options.testRegex && !options.testMatch) {
  762. // Prevent the default testMatch conflicting with any explicitly
  763. // configured `testRegex` value
  764. newOptions.testMatch = [];
  765. }
  766. // If argv.json is set, coverageReporters shouldn't print a text report.
  767. if (argv.json) {
  768. newOptions.coverageReporters = (newOptions.coverageReporters || []).filter(
  769. reporter => reporter !== 'text'
  770. );
  771. }
  772. // If collectCoverage is enabled while using --findRelatedTests we need to
  773. // avoid having false negatives in the generated coverage report.
  774. // The following: `--findRelatedTests '/rootDir/file1.js' --coverage`
  775. // Is transformed to: `--findRelatedTests '/rootDir/file1.js' --coverage --collectCoverageFrom 'file1.js'`
  776. // where arguments to `--collectCoverageFrom` should be globs (or relative
  777. // paths to the rootDir)
  778. if (newOptions.collectCoverage && argv.findRelatedTests) {
  779. let collectCoverageFrom = argv._.map(filename => {
  780. filename = (0, (_utils || _load_utils()).replaceRootDirInPath)(
  781. options.rootDir,
  782. filename
  783. );
  784. return (_path || _load_path()).default.isAbsolute(filename)
  785. ? (_path || _load_path()).default.relative(options.rootDir, filename)
  786. : filename;
  787. });
  788. // Don't override existing collectCoverageFrom options
  789. if (newOptions.collectCoverageFrom) {
  790. collectCoverageFrom = collectCoverageFrom.reduce((patterns, filename) => {
  791. if (
  792. !(0, (_micromatch || _load_micromatch()).default)(
  793. [
  794. (_path || _load_path()).default.relative(
  795. options.rootDir,
  796. filename
  797. )
  798. ],
  799. newOptions.collectCoverageFrom
  800. ).length
  801. ) {
  802. return patterns;
  803. }
  804. return [].concat(_toConsumableArray(patterns), [filename]);
  805. }, newOptions.collectCoverageFrom);
  806. }
  807. newOptions.collectCoverageFrom = collectCoverageFrom;
  808. }
  809. return {
  810. hasDeprecationWarnings: hasDeprecationWarnings,
  811. options: newOptions
  812. };
  813. }