/** * 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. * */ import exit from 'exit'; import { SerializableError, TestResult } from '@jest/test-result'; import { Config } from '@jest/types'; import HasteMap from 'jest-haste-map'; import { separateMessageFromStack } from 'jest-message-util'; import Resolver from 'jest-resolve'; import Runtime from 'jest-runtime'; import runTest from './runTest'; import { ErrorWithCode, SerializableResolver, WorkerData } from './types'; const resolvers = new Map(); const formatError = (error: string | ErrorWithCode): SerializableError => { if (typeof error === 'string') { const {message, stack} = separateMessageFromStack(error); return { message, stack, type: 'Error' }; } return { code: error.code || undefined, message: error.message, stack: error.stack, type: 'Error' }; }; const getResolver = (config: Config.ProjectConfig) => { const resolver = resolvers.get(config.name); if (!resolver) { throw new Error('Cannot find resolver for: ' + config.name); } return resolver; }; export function setup(setupData: { serializableResolvers: Array; }): void { // Module maps that will be needed for the test runs are passed. for (const { config, serializableModuleMap, } of setupData.serializableResolvers) { const moduleMap = HasteMap.ModuleMap.fromJSON(serializableModuleMap); resolvers.set(config.name, Runtime.createResolver(config, moduleMap)); } } export async function worker(props: WorkerData): Promise { try { return await runTest( props.test, props.globalConfig, props.config, getResolver(props.config), props.context && { ...props.context, changedFiles: props.context.changedFiles && new Set(props.context.changedFiles), sourcesRelatedToTestsInChangedFiles: props.context.sourcesRelatedToTestsInChangedFiles && new Set(props.context.sourcesRelatedToTestsInChangedFiles) } ); } catch (error) { throw formatError(error); } } // Make sure uncaught errors are logged before we exit. process.on('uncaughtException', err => { console.error(err.stack); exit(1); });