UNPKG

2.33 kBPlain TextView Raw
1import path from 'path';
2import fs from 'fs';
3
4import { tokens, commonTokens } from '@stryker-mutator/api/plugin';
5import { Logger } from '@stryker-mutator/api/logging';
6import { RootHookObject } from 'mocha';
7
8import { MochaOptions } from '../src-generated/mocha-runner-options.js';
9
10import { LibWrapper } from './lib-wrapper.js';
11
12/**
13 * A class that contains polyfills for different versions of mocha.
14 * Tries to mimic the functionality of mocha's latest api.
15 *
16 * Currently supports mocha < 6
17 */
18export class MochaAdapter {
19 public static readonly inject = tokens(commonTokens.logger);
20
21 constructor(private readonly log: Logger) {}
22
23 public create(options: Mocha.MochaOptions): Mocha {
24 return new LibWrapper.Mocha(options);
25 }
26
27 public collectFiles(options: MochaOptions): string[] {
28 const originalProcessExit = process.exit;
29 try {
30 // process.exit unfortunate side effect: https://github.com/mochajs/mocha/blob/07ea8763c663bdd3fe1f8446cdb62dae233f4916/lib/cli/run-helpers.js#L174
31 // eslint-disable-next-line @typescript-eslint/no-empty-function
32 (process as any).exit = () => {};
33 const files = LibWrapper.collectFiles!(options);
34 return files;
35 } finally {
36 process.exit = originalProcessExit;
37 }
38 }
39
40 public async handleRequires(requires: string[]): Promise<RootHookObject | undefined> {
41 this.log.trace('Resolving requires %s', requires);
42 if (LibWrapper.handleRequires) {
43 this.log.trace('Using `handleRequires`');
44 const rawRootHooks = await LibWrapper.handleRequires(requires);
45 if (rawRootHooks) {
46 if (LibWrapper.loadRootHooks) {
47 // `loadRootHooks` made a brief appearance in mocha 8, removed in mocha 8.2
48 return await LibWrapper.loadRootHooks(rawRootHooks);
49 } else {
50 return (rawRootHooks as { rootHooks: RootHookObject }).rootHooks;
51 }
52 }
53 } else {
54 const modulesToRequire = requires.map((moduleName) => {
55 const maybeSetupFileName = path.resolve(moduleName);
56 if (fs.existsSync(maybeSetupFileName)) {
57 return maybeSetupFileName;
58 } else {
59 return moduleName;
60 }
61 });
62 this.log.trace('Requiring %s manually', modulesToRequire);
63 modulesToRequire.forEach(LibWrapper.require);
64 }
65 return undefined;
66 }
67}