UNPKG

@stryker-mutator/mocha-runner

Version:

A plugin to use the mocha test runner in Stryker, the JavaScript mutation testing framework

93 lines (73 loc) 2.71 kB
import path from 'path'; import { createRequire } from 'module'; import { pathToFileURL } from 'url'; import { default as bundledMocha, type RootHookObject } from 'mocha'; import { MochaOptions } from '../src-generated/mocha-runner-options.js'; const resolveMocha = async () => { try { const require = createRequire(path.join(process.cwd(), 'package.json')); const mochaPath = require.resolve('mocha'); const mochaModule = await import(pathToFileURL(mochaPath).href); return { mocha: mochaModule.default ?? bundledMocha, require, mochaRoot: path.dirname(require.resolve('mocha/package.json')), }; } catch { const require = createRequire(import.meta.url); return { mocha: bundledMocha, require, mochaRoot: path.dirname(require.resolve('mocha/package.json')), }; } }; const { mocha, require, mochaRoot } = await resolveMocha(); // https://github.com/mochajs/mocha/blob/master/lib/cli/run-helpers.js#L132 const runHelpers = require(`${mochaRoot}/lib/cli/run-helpers`); let collectFiles: | (( options: MochaOptions, ) => string[] | { files: string[]; unmatchedFiles: string[] }) | undefined; /* * If read, object containing parsed arguments * @since 6.0.0' * @see https://mochajs.org/api/module-lib_cli_options.html#.loadOptions */ type LoadOptions = ( argv?: string[] | string, ) => Record<string, any> | undefined; async function resolveLoadOptions(): Promise<LoadOptions> { try { return require(`${mochaRoot}/lib/cli/options`).loadOptions; } catch { // Since Mocha 12 the cli is distributed as ECMAScript modules const options = await import( pathToFileURL(path.join(mochaRoot, 'lib/cli/options.mjs')).href ); return options.loadOptions; } } const loadOptions = await resolveLoadOptions(); const handleRequires: (requires?: string[]) => Promise<RootHookObject> = runHelpers.handleRequires; const loadRootHooks: ((rootHooks: any) => Promise<any>) | undefined = runHelpers.loadRootHooks; // loadRootHooks is available since mocha v7.2 and removed again in 8.0 collectFiles = runHelpers.handleFiles; if (!collectFiles) { // Might be moved: // https://github.com/mochajs/mocha/commit/15b96afccaf508312445770e3af1c145d90b28c6#diff-39b692a81eb0c9f3614247af744ab4a8 collectFiles = require(`${mochaRoot}/lib/cli/collect-files`); } /** * Wraps Mocha class and require for testability */ export class LibWrapper { public static Mocha = mocha; public static require = require; public static loadOptions = loadOptions; public static collectFiles = collectFiles; public static handleRequires = handleRequires; public static loadRootHooks = loadRootHooks; }