UNPKG

@knapsack-pro/jest

Version:

Knapsack Pro Jest splits Jest tests across CI nodes and makes sure that tests will run in optimal time on each CI node.

48 lines (47 loc) 2.06 kB
#!/usr/bin/env node import { KnapsackProCore, KnapsackProLogger, } from '@knapsack-pro/core'; import { v4 as uuidv4 } from 'uuid'; import { EnvConfig } from './env-config.js'; import { TestFilesFinder } from './test-files-finder.js'; import { JestCLI } from './jest-cli.js'; const jestImport = await import('jest'); const jest = jestImport.default ?? jestImport; const clientName = '@knapsack-pro/jest'; const clientVersion = '9.0.0-rc.1'; const jestCLIOptions = JestCLI.argvToOptions(); const knapsackProLogger = new KnapsackProLogger(); knapsackProLogger.debug(`Jest CLI options:\n${KnapsackProLogger.objectInspect(jestCLIOptions)}`); EnvConfig.loadEnvironmentVariables(); const projectPath = process.cwd(); const testFilesToExecute = () => TestFilesFinder.allTestFiles(); const knapsackPro = new KnapsackProCore(clientName, clientVersion, testFilesToExecute); const onSuccess = async (queueTestFiles) => { const testFilePaths = queueTestFiles.map((testFile) => testFile.path); const jestCLICoverage = EnvConfig.coverageDirectory ? { coverageDirectory: `${EnvConfig.coverageDirectory}/${uuidv4()}` } : {}; const { results: { success: isTestSuiteGreen, testResults }, } = await jest.runCLI({ ...jestCLIOptions, ...jestCLICoverage, runTestsByPath: true, _: testFilePaths, $0: 'jest', }, [projectPath]); const recordedTestFiles = testResults.map(({ testFilePath, perfStats: { start, end }, }) => { const path = process.platform === 'win32' ? testFilePath.replace(`${projectPath}\\`, '').replace(/\\/g, '/') : testFilePath.replace(`${projectPath}/`, ''); const timeExecutionMiliseconds = end - start; const timeExecution = timeExecutionMiliseconds > 0 ? timeExecutionMiliseconds / 1000 : 0.0; return { path, time_execution: timeExecution, }; }); return { recordedTestFiles, isTestSuiteGreen, }; }; const onError = () => { }; knapsackPro.runQueueMode(onSuccess, onError);