UNPKG

2.08 kBPlain TextView Raw
1import path from 'path';
2import fs from 'fs';
3
4import { StrykerOptions } from '@stryker-mutator/api/core';
5import { Logger } from '@stryker-mutator/api/logging';
6import { commonTokens, tokens } from '@stryker-mutator/api/plugin';
7import { Disposable } from 'typed-inject';
8
9import { fileUtils } from './file-utils.js';
10import { objectUtils } from './object-utils.js';
11
12export class TemporaryDirectory implements Disposable {
13 private readonly temporaryDirectory: string;
14 private isInitialized = false;
15 public removeDuringDisposal: boolean;
16
17 public static readonly inject = tokens(commonTokens.logger, commonTokens.options);
18 constructor(private readonly log: Logger, options: StrykerOptions) {
19 this.temporaryDirectory = path.resolve(options.tempDirName);
20 this.removeDuringDisposal = options.cleanTempDir;
21 }
22
23 public async initialize(): Promise<void> {
24 this.log.debug('Using temp directory "%s"', this.temporaryDirectory);
25 await fs.promises.mkdir(this.temporaryDirectory, { recursive: true });
26 this.isInitialized = true;
27 }
28
29 public getRandomDirectory(prefix: string): string {
30 return path.resolve(this.temporaryDirectory, `${prefix}${objectUtils.random()}`);
31 }
32
33 /**
34 * Creates a new random directory with the specified prefix.
35 * @returns The path to the directory.
36 */
37 public async createDirectory(name: string): Promise<void> {
38 if (!this.isInitialized) {
39 throw new Error('initialize() was not called!');
40 }
41 await fs.promises.mkdir(path.resolve(this.temporaryDirectory, name), { recursive: true });
42 }
43
44 /**
45 * Deletes the Stryker-temp directory
46 */
47 public async dispose(): Promise<void> {
48 if (!this.isInitialized) {
49 throw new Error('initialize() was not called!');
50 }
51 if (this.removeDuringDisposal) {
52 this.log.debug('Deleting stryker temp directory %s', this.temporaryDirectory);
53 try {
54 await fileUtils.deleteDir(this.temporaryDirectory);
55 } catch (e) {
56 this.log.info(`Failed to delete stryker temp directory ${this.temporaryDirectory}`);
57 }
58 }
59 }
60}