440 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			440 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, '__esModule', { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.readConfig = readConfig; | ||
|  | exports.readConfigs = readConfigs; | ||
|  | Object.defineProperty(exports, 'getTestEnvironment', { | ||
|  |   enumerable: true, | ||
|  |   get: function get() { | ||
|  |     return _utils.getTestEnvironment; | ||
|  |   } | ||
|  | }); | ||
|  | Object.defineProperty(exports, 'isJSONString', { | ||
|  |   enumerable: true, | ||
|  |   get: function get() { | ||
|  |     return _utils.isJSONString; | ||
|  |   } | ||
|  | }); | ||
|  | Object.defineProperty(exports, 'replaceRootDirInPath', { | ||
|  |   enumerable: true, | ||
|  |   get: function get() { | ||
|  |     return _utils.replaceRootDirInPath; | ||
|  |   } | ||
|  | }); | ||
|  | Object.defineProperty(exports, 'normalize', { | ||
|  |   enumerable: true, | ||
|  |   get: function get() { | ||
|  |     return _normalize2.default; | ||
|  |   } | ||
|  | }); | ||
|  | Object.defineProperty(exports, 'deprecationEntries', { | ||
|  |   enumerable: true, | ||
|  |   get: function get() { | ||
|  |     return _Deprecated.default; | ||
|  |   } | ||
|  | }); | ||
|  | Object.defineProperty(exports, 'defaults', { | ||
|  |   enumerable: true, | ||
|  |   get: function get() { | ||
|  |     return _Defaults.default; | ||
|  |   } | ||
|  | }); | ||
|  | Object.defineProperty(exports, 'descriptions', { | ||
|  |   enumerable: true, | ||
|  |   get: function get() { | ||
|  |     return _Descriptions.default; | ||
|  |   } | ||
|  | }); | ||
|  | 
 | ||
|  | function _fs() { | ||
|  |   const data = _interopRequireDefault(require('fs')); | ||
|  | 
 | ||
|  |   _fs = function _fs() { | ||
|  |     return data; | ||
|  |   }; | ||
|  | 
 | ||
|  |   return data; | ||
|  | } | ||
|  | 
 | ||
|  | function _path() { | ||
|  |   const data = _interopRequireDefault(require('path')); | ||
|  | 
 | ||
|  |   _path = function _path() { | ||
|  |     return data; | ||
|  |   }; | ||
|  | 
 | ||
|  |   return data; | ||
|  | } | ||
|  | 
 | ||
|  | function _chalk() { | ||
|  |   const data = _interopRequireDefault(require('chalk')); | ||
|  | 
 | ||
|  |   _chalk = function _chalk() { | ||
|  |     return data; | ||
|  |   }; | ||
|  | 
 | ||
|  |   return data; | ||
|  | } | ||
|  | 
 | ||
|  | var _utils = require('./utils'); | ||
|  | 
 | ||
|  | var _normalize2 = _interopRequireDefault(require('./normalize')); | ||
|  | 
 | ||
|  | var _resolveConfigPath = _interopRequireDefault(require('./resolveConfigPath')); | ||
|  | 
 | ||
|  | var _readConfigFileAndSetRootDir = _interopRequireDefault( | ||
|  |   require('./readConfigFileAndSetRootDir') | ||
|  | ); | ||
|  | 
 | ||
|  | var _Deprecated = _interopRequireDefault(require('./Deprecated')); | ||
|  | 
 | ||
|  | var _Defaults = _interopRequireDefault(require('./Defaults')); | ||
|  | 
 | ||
|  | var _Descriptions = _interopRequireDefault(require('./Descriptions')); | ||
|  | 
 | ||
|  | function _interopRequireDefault(obj) { | ||
|  |   return obj && obj.__esModule ? obj : {default: obj}; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * 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. | ||
|  |  */ | ||
|  | function readConfig( | ||
|  |   argv, | ||
|  |   packageRootOrConfig, // Whether it needs to look into `--config` arg passed to CLI.
 | ||
|  |   // It only used to read initial config. If the initial config contains
 | ||
|  |   // `project` property, we don't want to read `--config` value and rather
 | ||
|  |   skipArgvConfigOption, | ||
|  |   parentConfigPath, | ||
|  |   projectIndex = Infinity | ||
|  | ) { | ||
|  |   let rawOptions; | ||
|  |   let configPath = null; | ||
|  | 
 | ||
|  |   if (typeof packageRootOrConfig !== 'string') { | ||
|  |     if (parentConfigPath) { | ||
|  |       const parentConfigDirname = _path().default.dirname(parentConfigPath); | ||
|  | 
 | ||
|  |       rawOptions = packageRootOrConfig; | ||
|  |       rawOptions.rootDir = rawOptions.rootDir | ||
|  |         ? (0, _utils.replaceRootDirInPath)( | ||
|  |             parentConfigDirname, | ||
|  |             rawOptions.rootDir | ||
|  |           ) | ||
|  |         : parentConfigDirname; | ||
|  |     } else { | ||
|  |       throw new Error( | ||
|  |         'Jest: Cannot use configuration as an object without a file path.' | ||
|  |       ); | ||
|  |     } | ||
|  |   } else if ((0, _utils.isJSONString)(argv.config)) { | ||
|  |     // A JSON string was passed to `--config` argument and we can parse it
 | ||
|  |     // and use as is.
 | ||
|  |     let config; | ||
|  | 
 | ||
|  |     try { | ||
|  |       config = JSON.parse(argv.config); | ||
|  |     } catch (e) { | ||
|  |       throw new Error( | ||
|  |         'There was an error while parsing the `--config` argument as a JSON string.' | ||
|  |       ); | ||
|  |     } // NOTE: we might need to resolve this dir to an absolute path in the future
 | ||
|  | 
 | ||
|  |     config.rootDir = config.rootDir || packageRootOrConfig; | ||
|  |     rawOptions = config; // A string passed to `--config`, which is either a direct path to the config
 | ||
|  |     // or a path to directory containing `package.json` or `jest.config.js`
 | ||
|  |   } else if (!skipArgvConfigOption && typeof argv.config == 'string') { | ||
|  |     configPath = (0, _resolveConfigPath.default)(argv.config, process.cwd()); | ||
|  |     rawOptions = (0, _readConfigFileAndSetRootDir.default)(configPath); | ||
|  |   } else { | ||
|  |     // Otherwise just try to find config in the current rootDir.
 | ||
|  |     configPath = (0, _resolveConfigPath.default)( | ||
|  |       packageRootOrConfig, | ||
|  |       process.cwd() | ||
|  |     ); | ||
|  |     rawOptions = (0, _readConfigFileAndSetRootDir.default)(configPath); | ||
|  |   } | ||
|  | 
 | ||
|  |   const _normalize = (0, _normalize2.default)( | ||
|  |       rawOptions, | ||
|  |       argv, | ||
|  |       configPath, | ||
|  |       projectIndex | ||
|  |     ), | ||
|  |     options = _normalize.options, | ||
|  |     hasDeprecationWarnings = _normalize.hasDeprecationWarnings; | ||
|  | 
 | ||
|  |   const _groupOptions = groupOptions(options), | ||
|  |     globalConfig = _groupOptions.globalConfig, | ||
|  |     projectConfig = _groupOptions.projectConfig; | ||
|  | 
 | ||
|  |   return { | ||
|  |     configPath, | ||
|  |     globalConfig, | ||
|  |     hasDeprecationWarnings, | ||
|  |     projectConfig | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | const groupOptions = options => ({ | ||
|  |   globalConfig: Object.freeze({ | ||
|  |     bail: options.bail, | ||
|  |     changedFilesWithAncestor: options.changedFilesWithAncestor, | ||
|  |     changedSince: options.changedSince, | ||
|  |     collectCoverage: options.collectCoverage, | ||
|  |     collectCoverageFrom: options.collectCoverageFrom, | ||
|  |     collectCoverageOnlyFrom: options.collectCoverageOnlyFrom, | ||
|  |     coverageDirectory: options.coverageDirectory, | ||
|  |     coverageReporters: options.coverageReporters, | ||
|  |     coverageThreshold: options.coverageThreshold, | ||
|  |     detectLeaks: options.detectLeaks, | ||
|  |     detectOpenHandles: options.detectOpenHandles, | ||
|  |     enabledTestsMap: options.enabledTestsMap, | ||
|  |     errorOnDeprecated: options.errorOnDeprecated, | ||
|  |     expand: options.expand, | ||
|  |     extraGlobals: options.extraGlobals, | ||
|  |     filter: options.filter, | ||
|  |     findRelatedTests: options.findRelatedTests, | ||
|  |     forceExit: options.forceExit, | ||
|  |     globalSetup: options.globalSetup, | ||
|  |     globalTeardown: options.globalTeardown, | ||
|  |     json: options.json, | ||
|  |     lastCommit: options.lastCommit, | ||
|  |     listTests: options.listTests, | ||
|  |     logHeapUsage: options.logHeapUsage, | ||
|  |     maxConcurrency: options.maxConcurrency, | ||
|  |     maxWorkers: options.maxWorkers, | ||
|  |     noSCM: undefined, | ||
|  |     noStackTrace: options.noStackTrace, | ||
|  |     nonFlagArgs: options.nonFlagArgs, | ||
|  |     notify: options.notify, | ||
|  |     notifyMode: options.notifyMode, | ||
|  |     onlyChanged: options.onlyChanged, | ||
|  |     onlyFailures: options.onlyFailures, | ||
|  |     outputFile: options.outputFile, | ||
|  |     passWithNoTests: options.passWithNoTests, | ||
|  |     projects: options.projects, | ||
|  |     replname: options.replname, | ||
|  |     reporters: options.reporters, | ||
|  |     rootDir: options.rootDir, | ||
|  |     runTestsByPath: options.runTestsByPath, | ||
|  |     silent: options.silent, | ||
|  |     skipFilter: options.skipFilter, | ||
|  |     testFailureExitCode: options.testFailureExitCode, | ||
|  |     testNamePattern: options.testNamePattern, | ||
|  |     testPathPattern: options.testPathPattern, | ||
|  |     testResultsProcessor: options.testResultsProcessor, | ||
|  |     testSequencer: options.testSequencer, | ||
|  |     updateSnapshot: options.updateSnapshot, | ||
|  |     useStderr: options.useStderr, | ||
|  |     verbose: options.verbose, | ||
|  |     watch: options.watch, | ||
|  |     watchAll: options.watchAll, | ||
|  |     watchPlugins: options.watchPlugins, | ||
|  |     watchman: options.watchman | ||
|  |   }), | ||
|  |   projectConfig: Object.freeze({ | ||
|  |     automock: options.automock, | ||
|  |     browser: options.browser, | ||
|  |     cache: options.cache, | ||
|  |     cacheDirectory: options.cacheDirectory, | ||
|  |     clearMocks: options.clearMocks, | ||
|  |     coveragePathIgnorePatterns: options.coveragePathIgnorePatterns, | ||
|  |     cwd: options.cwd, | ||
|  |     dependencyExtractor: options.dependencyExtractor, | ||
|  |     detectLeaks: options.detectLeaks, | ||
|  |     detectOpenHandles: options.detectOpenHandles, | ||
|  |     displayName: options.displayName, | ||
|  |     errorOnDeprecated: options.errorOnDeprecated, | ||
|  |     extraGlobals: options.extraGlobals, | ||
|  |     filter: options.filter, | ||
|  |     forceCoverageMatch: options.forceCoverageMatch, | ||
|  |     globalSetup: options.globalSetup, | ||
|  |     globalTeardown: options.globalTeardown, | ||
|  |     globals: options.globals, | ||
|  |     haste: options.haste, | ||
|  |     moduleDirectories: options.moduleDirectories, | ||
|  |     moduleFileExtensions: options.moduleFileExtensions, | ||
|  |     moduleLoader: options.moduleLoader, | ||
|  |     moduleNameMapper: options.moduleNameMapper, | ||
|  |     modulePathIgnorePatterns: options.modulePathIgnorePatterns, | ||
|  |     modulePaths: options.modulePaths, | ||
|  |     name: options.name, | ||
|  |     prettierPath: options.prettierPath, | ||
|  |     resetMocks: options.resetMocks, | ||
|  |     resetModules: options.resetModules, | ||
|  |     resolver: options.resolver, | ||
|  |     restoreMocks: options.restoreMocks, | ||
|  |     rootDir: options.rootDir, | ||
|  |     roots: options.roots, | ||
|  |     runner: options.runner, | ||
|  |     setupFiles: options.setupFiles, | ||
|  |     setupFilesAfterEnv: options.setupFilesAfterEnv, | ||
|  |     skipFilter: options.skipFilter, | ||
|  |     skipNodeResolution: options.skipNodeResolution, | ||
|  |     snapshotResolver: options.snapshotResolver, | ||
|  |     snapshotSerializers: options.snapshotSerializers, | ||
|  |     testEnvironment: options.testEnvironment, | ||
|  |     testEnvironmentOptions: options.testEnvironmentOptions, | ||
|  |     testLocationInResults: options.testLocationInResults, | ||
|  |     testMatch: options.testMatch, | ||
|  |     testPathIgnorePatterns: options.testPathIgnorePatterns, | ||
|  |     testRegex: options.testRegex, | ||
|  |     testRunner: options.testRunner, | ||
|  |     testURL: options.testURL, | ||
|  |     timers: options.timers, | ||
|  |     transform: options.transform, | ||
|  |     transformIgnorePatterns: options.transformIgnorePatterns, | ||
|  |     unmockedModulePathPatterns: options.unmockedModulePathPatterns, | ||
|  |     watchPathIgnorePatterns: options.watchPathIgnorePatterns | ||
|  |   }) | ||
|  | }); | ||
|  | 
 | ||
|  | const ensureNoDuplicateConfigs = (parsedConfigs, projects) => { | ||
|  |   if (projects.length <= 1) { | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   const configPathMap = new Map(); | ||
|  |   var _iteratorNormalCompletion = true; | ||
|  |   var _didIteratorError = false; | ||
|  |   var _iteratorError = undefined; | ||
|  | 
 | ||
|  |   try { | ||
|  |     for ( | ||
|  |       var _iterator = parsedConfigs[Symbol.iterator](), _step; | ||
|  |       !(_iteratorNormalCompletion = (_step = _iterator.next()).done); | ||
|  |       _iteratorNormalCompletion = true | ||
|  |     ) { | ||
|  |       const config = _step.value; | ||
|  |       const configPath = config.configPath; | ||
|  | 
 | ||
|  |       if (configPathMap.has(configPath)) { | ||
|  |         const message = `Whoops! Two projects resolved to the same config path: ${_chalk().default.bold( | ||
|  |           String(configPath) | ||
|  |         )}: | ||
|  | 
 | ||
|  |   Project 1: ${_chalk().default.bold( | ||
|  |     projects[parsedConfigs.findIndex(x => x === config)] | ||
|  |   )} | ||
|  |   Project 2: ${_chalk().default.bold( | ||
|  |     projects[parsedConfigs.findIndex(x => x === configPathMap.get(configPath))] | ||
|  |   )} | ||
|  | 
 | ||
|  | This usually means that your ${_chalk().default.bold( | ||
|  |           '"projects"' | ||
|  |         )} config includes a directory that doesn't have any configuration recognizable by Jest. Please fix it. | ||
|  | `;
 | ||
|  |         throw new Error(message); | ||
|  |       } | ||
|  | 
 | ||
|  |       if (configPath !== null) { | ||
|  |         configPathMap.set(configPath, config); | ||
|  |       } | ||
|  |     } | ||
|  |   } catch (err) { | ||
|  |     _didIteratorError = true; | ||
|  |     _iteratorError = err; | ||
|  |   } finally { | ||
|  |     try { | ||
|  |       if (!_iteratorNormalCompletion && _iterator.return != null) { | ||
|  |         _iterator.return(); | ||
|  |       } | ||
|  |     } finally { | ||
|  |       if (_didIteratorError) { | ||
|  |         throw _iteratorError; | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | }; // Possible scenarios:
 | ||
|  | //  1. jest --config config.json
 | ||
|  | //  2. jest --projects p1 p2
 | ||
|  | //  3. jest --projects p1 p2 --config config.json
 | ||
|  | //  4. jest --projects p1
 | ||
|  | //  5. jest
 | ||
|  | //
 | ||
|  | // If no projects are specified, process.cwd() will be used as the default
 | ||
|  | // (and only) project.
 | ||
|  | 
 | ||
|  | function readConfigs(argv, projectPaths) { | ||
|  |   let globalConfig; | ||
|  |   let hasDeprecationWarnings; | ||
|  |   let configs = []; | ||
|  |   let projects = projectPaths; | ||
|  |   let configPath; | ||
|  | 
 | ||
|  |   if (projectPaths.length === 1) { | ||
|  |     const parsedConfig = readConfig(argv, projects[0]); | ||
|  |     configPath = parsedConfig.configPath; | ||
|  | 
 | ||
|  |     if (parsedConfig.globalConfig.projects) { | ||
|  |       // If this was a single project, and its config has `projects`
 | ||
|  |       // settings, use that value instead.
 | ||
|  |       projects = parsedConfig.globalConfig.projects; | ||
|  |     } | ||
|  | 
 | ||
|  |     hasDeprecationWarnings = parsedConfig.hasDeprecationWarnings; | ||
|  |     globalConfig = parsedConfig.globalConfig; | ||
|  |     configs = [parsedConfig.projectConfig]; | ||
|  | 
 | ||
|  |     if (globalConfig.projects && globalConfig.projects.length) { | ||
|  |       // Even though we had one project in CLI args, there might be more
 | ||
|  |       // projects defined in the config.
 | ||
|  |       projects = globalConfig.projects; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   if ( | ||
|  |     projects.length > 1 || | ||
|  |     (projects.length && typeof projects[0] === 'object') | ||
|  |   ) { | ||
|  |     const parsedConfigs = projects | ||
|  |       .filter(root => { | ||
|  |         // Ignore globbed files that cannot be `require`d.
 | ||
|  |         if ( | ||
|  |           typeof root === 'string' && | ||
|  |           _fs().default.existsSync(root) && | ||
|  |           !_fs() | ||
|  |             .default.lstatSync(root) | ||
|  |             .isDirectory() && | ||
|  |           !root.endsWith('.js') && | ||
|  |           !root.endsWith('.json') | ||
|  |         ) { | ||
|  |           return false; | ||
|  |         } | ||
|  | 
 | ||
|  |         return true; | ||
|  |       }) | ||
|  |       .map((root, projectIndex) => | ||
|  |         readConfig(argv, root, true, configPath, projectIndex) | ||
|  |       ); | ||
|  |     ensureNoDuplicateConfigs(parsedConfigs, projects); | ||
|  |     configs = parsedConfigs.map(({projectConfig}) => projectConfig); | ||
|  | 
 | ||
|  |     if (!hasDeprecationWarnings) { | ||
|  |       hasDeprecationWarnings = parsedConfigs.some( | ||
|  |         ({hasDeprecationWarnings}) => !!hasDeprecationWarnings | ||
|  |       ); | ||
|  |     } // If no config was passed initially, use the one from the first project
 | ||
|  | 
 | ||
|  |     if (!globalConfig) { | ||
|  |       globalConfig = parsedConfigs[0].globalConfig; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   if (!globalConfig || !configs.length) { | ||
|  |     throw new Error('jest: No configuration found for any project.'); | ||
|  |   } | ||
|  | 
 | ||
|  |   return { | ||
|  |     configs, | ||
|  |     globalConfig, | ||
|  |     hasDeprecationWarnings: !!hasDeprecationWarnings | ||
|  |   }; | ||
|  | } |