initial commit of actions
This commit is contained in:
commit
949ece5785
44660 changed files with 12034344 additions and 0 deletions
67
github/codeql-action-v2/node_modules/ava/lib/reporters/beautify-stack.js
generated
vendored
Normal file
67
github/codeql-action-v2/node_modules/ava/lib/reporters/beautify-stack.js
generated
vendored
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
import StackUtils from 'stack-utils';
|
||||
|
||||
const stackUtils = new StackUtils({
|
||||
ignoredPackages: [
|
||||
'@ava/typescript',
|
||||
'ava',
|
||||
'nyc',
|
||||
],
|
||||
internals: [
|
||||
// AVA internals, which ignoredPackages don't ignore when we run our own unit tests.
|
||||
/\/ava\/(?:lib\/|lib\/worker\/)?[\w-]+\.js:\d+:\d+\)?$/,
|
||||
// Only ignore Node.js internals that really are not useful for debugging.
|
||||
...StackUtils.nodeInternals().filter(regexp => !/\(internal/.test(regexp.source)),
|
||||
/\(internal\/process\/task_queues\.js:\d+:\d+\)$/,
|
||||
/\(internal\/modules\/cjs\/.+?\.js:\d+:\d+\)$/,
|
||||
/async Promise\.all \(index/,
|
||||
/new Promise \(<anonymous>\)/,
|
||||
],
|
||||
});
|
||||
|
||||
/*
|
||||
* Given a string value of the format generated for the `stack` property of a
|
||||
* V8 error object, return a string that contains only stack frame information
|
||||
* for frames that have relevance to the consumer.
|
||||
*
|
||||
* For example, given the following string value:
|
||||
*
|
||||
* ```
|
||||
* Error
|
||||
* at inner (/home/ava/ex.js:7:12)
|
||||
* at /home/ava/ex.js:12:5
|
||||
* at outer (/home/ava/ex.js:13:4)
|
||||
* at Object.<anonymous> (/home/ava/ex.js:14:3)
|
||||
* at Module._compile (module.js:570:32)
|
||||
* at Object.Module._extensions..js (module.js:579:10)
|
||||
* at Module.load (module.js:487:32)
|
||||
* at tryModuleLoad (module.js:446:12)
|
||||
* at Function.Module._load (module.js:438:3)
|
||||
* at Module.runMain (module.js:604:10)
|
||||
* ```
|
||||
*
|
||||
* ...this function returns the following string value:
|
||||
*
|
||||
* ```
|
||||
* inner (/home/ava/ex.js:7:12)
|
||||
* /home/ava/ex.js:12:5
|
||||
* outer (/home/ava/ex.js:13:4)
|
||||
* Object.<anonymous> (/home/ava/ex.js:14:3)
|
||||
* Module._compile (module.js:570:32)
|
||||
* Object.Module._extensions..js (module.js:579:10)
|
||||
* Module.load (module.js:487:32)
|
||||
* tryModuleLoad (module.js:446:12)
|
||||
* Function.Module._load (module.js:438:3)
|
||||
* Module.runMain (module.js:604:10)
|
||||
* ```
|
||||
*/
|
||||
export default function beautifyStack(stack) {
|
||||
if (!stack) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return stackUtils.clean(stack)
|
||||
.trim()
|
||||
.split('\n')
|
||||
.map(line => line.trim())
|
||||
.filter(line => line !== '');
|
||||
}
|
||||
42
github/codeql-action-v2/node_modules/ava/lib/reporters/colors.js
generated
vendored
Normal file
42
github/codeql-action-v2/node_modules/ava/lib/reporters/colors.js
generated
vendored
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
import {chalk} from '../chalk.js';
|
||||
|
||||
const colors = {
|
||||
get log() {
|
||||
return chalk.gray;
|
||||
},
|
||||
get title() {
|
||||
return chalk.bold;
|
||||
},
|
||||
get error() {
|
||||
return chalk.red;
|
||||
},
|
||||
get skip() {
|
||||
return chalk.yellow;
|
||||
},
|
||||
get todo() {
|
||||
return chalk.blue;
|
||||
},
|
||||
get pass() {
|
||||
return chalk.green;
|
||||
},
|
||||
get duration() {
|
||||
return chalk.gray.dim;
|
||||
},
|
||||
get errorSource() {
|
||||
return chalk.gray;
|
||||
},
|
||||
get errorStack() {
|
||||
return chalk.gray;
|
||||
},
|
||||
get errorStackInternal() {
|
||||
return chalk.gray.dim;
|
||||
},
|
||||
get stack() {
|
||||
return chalk.red;
|
||||
},
|
||||
get information() {
|
||||
return chalk.magenta;
|
||||
},
|
||||
};
|
||||
|
||||
export default colors;
|
||||
701
github/codeql-action-v2/node_modules/ava/lib/reporters/default.js
generated
vendored
Normal file
701
github/codeql-action-v2/node_modules/ava/lib/reporters/default.js
generated
vendored
Normal file
|
|
@ -0,0 +1,701 @@
|
|||
import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
import stream from 'node:stream';
|
||||
import {fileURLToPath} from 'node:url';
|
||||
|
||||
import figures from 'figures';
|
||||
import indentString from 'indent-string';
|
||||
import plur from 'plur';
|
||||
import prettyMs from 'pretty-ms';
|
||||
import StackUtils from 'stack-utils';
|
||||
|
||||
import {chalk} from '../chalk.js';
|
||||
import codeExcerpt from '../code-excerpt.js';
|
||||
|
||||
import beautifyStack from './beautify-stack.js';
|
||||
import colors from './colors.js';
|
||||
import formatSerializedError from './format-serialized-error.js';
|
||||
import improperUsageMessage from './improper-usage-messages.js';
|
||||
import prefixTitle from './prefix-title.js';
|
||||
|
||||
const nodeInternals = StackUtils.nodeInternals();
|
||||
|
||||
class LineWriter extends stream.Writable {
|
||||
constructor(dest) {
|
||||
super();
|
||||
|
||||
this.dest = dest;
|
||||
this.columns = dest.columns || 80;
|
||||
this.lastLineIsEmpty = false;
|
||||
}
|
||||
|
||||
_write(chunk, _, callback) {
|
||||
this.dest.write(chunk);
|
||||
callback();
|
||||
}
|
||||
|
||||
writeLine(string) {
|
||||
if (string) {
|
||||
this.write(indentString(string, 2) + os.EOL);
|
||||
this.lastLineIsEmpty = false;
|
||||
} else {
|
||||
this.write(os.EOL);
|
||||
this.lastLineIsEmpty = true;
|
||||
}
|
||||
}
|
||||
|
||||
ensureEmptyLine() {
|
||||
if (!this.lastLineIsEmpty) {
|
||||
this.writeLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function manageCorking(stream) {
|
||||
return {
|
||||
decorateWriter(fn) {
|
||||
return function (...args) {
|
||||
stream.cork();
|
||||
try {
|
||||
return fn.apply(this, args);
|
||||
} finally {
|
||||
stream.uncork();
|
||||
}
|
||||
};
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export default class Reporter {
|
||||
constructor({
|
||||
extensions,
|
||||
reportStream,
|
||||
stdStream,
|
||||
projectDir,
|
||||
watching,
|
||||
durationThreshold,
|
||||
}) {
|
||||
this.extensions = extensions;
|
||||
this.reportStream = reportStream;
|
||||
this.stdStream = stdStream;
|
||||
this.watching = watching;
|
||||
this.relativeFile = file => {
|
||||
if (file.startsWith('file://')) {
|
||||
file = fileURLToPath(file);
|
||||
}
|
||||
|
||||
return path.relative(projectDir, file);
|
||||
};
|
||||
|
||||
const {decorateWriter} = manageCorking(this.reportStream);
|
||||
this.consumeStateChange = decorateWriter(this.consumeStateChange);
|
||||
this.endRun = decorateWriter(this.endRun);
|
||||
|
||||
this.durationThreshold = durationThreshold || 100;
|
||||
this.lineWriter = new LineWriter(this.reportStream);
|
||||
|
||||
this.reset();
|
||||
}
|
||||
|
||||
reset() {
|
||||
if (this.removePreviousListener) {
|
||||
this.removePreviousListener();
|
||||
}
|
||||
|
||||
this.prefixTitle = (testFile, title) => title;
|
||||
|
||||
this.runningTestFiles = new Map();
|
||||
this.filesWithMissingAvaImports = new Set();
|
||||
this.filesWithoutDeclaredTests = new Set();
|
||||
this.filesWithoutMatchedLineNumbers = new Set();
|
||||
|
||||
this.failures = [];
|
||||
this.internalErrors = [];
|
||||
this.knownFailures = [];
|
||||
this.lineNumberErrors = [];
|
||||
this.sharedWorkerErrors = [];
|
||||
this.uncaughtExceptions = [];
|
||||
this.unhandledRejections = [];
|
||||
|
||||
this.previousFailures = 0;
|
||||
|
||||
this.failFastEnabled = false;
|
||||
this.lastLineIsEmpty = false;
|
||||
this.matching = false;
|
||||
|
||||
this.removePreviousListener = null;
|
||||
this.stats = null;
|
||||
}
|
||||
|
||||
startRun(plan) {
|
||||
if (plan.bailWithoutReporting) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.reset();
|
||||
|
||||
this.failFastEnabled = plan.failFastEnabled;
|
||||
this.matching = plan.matching;
|
||||
this.previousFailures = plan.previousFailures;
|
||||
this.emptyParallelRun = plan.status.emptyParallelRun;
|
||||
this.selectionInsights = plan.status.selectionInsights;
|
||||
|
||||
if (this.watching || plan.files.length > 1) {
|
||||
this.prefixTitle = (testFile, title) => prefixTitle(this.extensions, plan.filePathPrefix, testFile, title);
|
||||
}
|
||||
|
||||
this.removePreviousListener = plan.status.on('stateChange', evt => {
|
||||
this.consumeStateChange(evt);
|
||||
});
|
||||
|
||||
if (this.watching && plan.runVector > 1) {
|
||||
this.lineWriter.write(chalk.gray.dim('\u2500'.repeat(this.lineWriter.columns)) + os.EOL);
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
consumeStateChange(event) { // eslint-disable-line complexity
|
||||
const fileStats = this.stats && event.testFile ? this.stats.byFile.get(event.testFile) : null;
|
||||
|
||||
switch (event.type) { // eslint-disable-line default-case
|
||||
case 'hook-failed': {
|
||||
this.failures.push(event);
|
||||
this.writeTestSummary(event);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'stats': {
|
||||
this.stats = event.stats;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'test-failed': {
|
||||
this.failures.push(event);
|
||||
this.writeTestSummary(event);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'test-passed': {
|
||||
if (event.knownFailing) {
|
||||
this.knownFailures.push(event);
|
||||
}
|
||||
|
||||
this.writeTestSummary(event);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'timeout': {
|
||||
this.lineWriter.writeLine(colors.error(`\n${figures.cross} Timed out while running tests`));
|
||||
this.lineWriter.writeLine('');
|
||||
this.writePendingTests(event);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'interrupt': {
|
||||
this.lineWriter.writeLine(colors.error(`\n${figures.cross} Exiting due to SIGINT`));
|
||||
this.lineWriter.writeLine('');
|
||||
this.writePendingTests(event);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'internal-error': {
|
||||
this.internalErrors.push(event);
|
||||
|
||||
if (event.testFile) {
|
||||
this.write(colors.error(`${figures.cross} Internal error when running ${this.relativeFile(event.testFile)}`));
|
||||
} else {
|
||||
this.write(colors.error(`${figures.cross} Internal error`));
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine(colors.stack(event.err.summary));
|
||||
this.lineWriter.writeLine(colors.errorStack(event.err.stack));
|
||||
this.lineWriter.writeLine();
|
||||
this.lineWriter.writeLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'line-number-selection-error': {
|
||||
this.lineNumberErrors.push(event);
|
||||
|
||||
this.write(colors.information(`${figures.warning} Could not parse ${this.relativeFile(event.testFile)} for line number selection`));
|
||||
this.lineWriter.writeLine();
|
||||
this.lineWriter.writeLine(colors.errorStack(event.err.stack));
|
||||
this.lineWriter.writeLine();
|
||||
break;
|
||||
}
|
||||
|
||||
case 'missing-ava-import': {
|
||||
this.filesWithMissingAvaImports.add(event.testFile);
|
||||
|
||||
this.write(colors.error(`${figures.cross} No tests found in ${this.relativeFile(event.testFile)}, make sure to import "ava" at the top of your test file`));
|
||||
break;
|
||||
}
|
||||
|
||||
case 'process-exit': {
|
||||
this.write(colors.error(`${figures.cross} Exiting due to process.exit() when running ${this.relativeFile(event.testFile)}`));
|
||||
|
||||
this.lineWriter.writeLine();
|
||||
this.lineWriter.writeLine(colors.errorStack(event.stack));
|
||||
this.lineWriter.writeLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'hook-finished': {
|
||||
if (event.logs.length > 0) {
|
||||
this.lineWriter.writeLine(` ${this.prefixTitle(event.testFile, event.title)}`);
|
||||
this.writeLogs(event);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'selected-test': {
|
||||
if (event.skip) {
|
||||
this.lineWriter.writeLine(colors.skip(`- [skip] ${this.prefixTitle(event.testFile, event.title)}`));
|
||||
} else if (event.todo) {
|
||||
this.lineWriter.writeLine(colors.todo(`- [todo] ${this.prefixTitle(event.testFile, event.title)}`));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'shared-worker-error': {
|
||||
this.sharedWorkerErrors.push(event);
|
||||
|
||||
this.lineWriter.ensureEmptyLine();
|
||||
this.lineWriter.writeLine(colors.error(`${figures.cross} Error in shared worker`));
|
||||
this.lineWriter.writeLine();
|
||||
this.writeErr(event);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'uncaught-exception': {
|
||||
this.uncaughtExceptions.push(event);
|
||||
|
||||
this.lineWriter.ensureEmptyLine();
|
||||
this.lineWriter.writeLine(colors.title(`Uncaught exception in ${this.relativeFile(event.testFile)}`));
|
||||
this.lineWriter.writeLine();
|
||||
this.writeErr(event);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'unhandled-rejection': {
|
||||
this.unhandledRejections.push(event);
|
||||
|
||||
this.lineWriter.ensureEmptyLine();
|
||||
this.lineWriter.writeLine(colors.title(`Unhandled rejection in ${this.relativeFile(event.testFile)}`));
|
||||
this.lineWriter.writeLine();
|
||||
this.writeErr(event);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'worker-failed': {
|
||||
if (fileStats.declaredTests === 0) {
|
||||
this.filesWithoutDeclaredTests.add(event.testFile);
|
||||
}
|
||||
|
||||
if (!this.filesWithMissingAvaImports.has(event.testFile)) {
|
||||
if (event.err) {
|
||||
this.lineWriter.writeLine(colors.error(`${figures.cross} ${this.relativeFile(event.testFile)} exited due to an error:`));
|
||||
this.lineWriter.writeLine();
|
||||
this.writeErr(event);
|
||||
} else if (event.nonZeroExitCode) {
|
||||
this.lineWriter.writeLine(colors.error(`${figures.cross} ${this.relativeFile(event.testFile)} exited with a non-zero exit code: ${event.nonZeroExitCode}`));
|
||||
} else {
|
||||
this.lineWriter.writeLine(colors.error(`${figures.cross} ${this.relativeFile(event.testFile)} exited due to ${event.signal}`));
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'worker-finished': {
|
||||
if (!event.forcedExit && !this.filesWithMissingAvaImports.has(event.testFile)) {
|
||||
if (fileStats.declaredTests === 0) {
|
||||
this.filesWithoutDeclaredTests.add(event.testFile);
|
||||
|
||||
this.write(colors.error(`${figures.cross} No tests found in ${this.relativeFile(event.testFile)}`));
|
||||
} else if (fileStats.selectingLines && fileStats.selectedTests === 0) {
|
||||
this.filesWithoutMatchedLineNumbers.add(event.testFile);
|
||||
|
||||
this.lineWriter.writeLine(colors.error(`${figures.cross} Line numbers for ${this.relativeFile(event.testFile)} did not match any tests`));
|
||||
} else if (!this.failFastEnabled && fileStats.remainingTests > 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${figures.cross} ${fileStats.remainingTests} ${plur('test', fileStats.remainingTests)} remaining in ${this.relativeFile(event.testFile)}`));
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'worker-stderr': {
|
||||
this.stdStream.write(event.chunk);
|
||||
// If the chunk does not end with a linebreak, *forcibly* write one to
|
||||
// ensure it remains visible in the TTY.
|
||||
// Tests cannot assume their standard output is not interrupted. Indeed
|
||||
// we multiplex stdout and stderr into a single stream. However as
|
||||
// long as stdStream is different from reportStream users can read
|
||||
// their original output by redirecting the streams.
|
||||
if (event.chunk[event.chunk.length - 1] !== 0x0A) {
|
||||
this.reportStream.write(os.EOL);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'worker-stdout': {
|
||||
this.stdStream.write(event.chunk);
|
||||
// If the chunk does not end with a linebreak, *forcibly* write one to
|
||||
// ensure it remains visible in the TTY.
|
||||
// Tests cannot assume their standard output is not interrupted. Indeed
|
||||
// we multiplex stdout and stderr into a single stream. However as
|
||||
// long as stdStream is different from reportStream users can read
|
||||
// their original output by redirecting the streams.
|
||||
if (event.chunk[event.chunk.length - 1] !== 0x0A) {
|
||||
this.reportStream.write(os.EOL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
writePendingTests(evt) {
|
||||
for (const [file, testsInFile] of evt.pendingTests) {
|
||||
if (testsInFile.size === 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine(`${testsInFile.size} tests were pending in ${this.relativeFile(file)}\n`);
|
||||
const testTitleToLogs = evt.pendingTestsLogs.get(file);
|
||||
for (const title of testsInFile) {
|
||||
const logs = testTitleToLogs?.get(title);
|
||||
this.lineWriter.writeLine(`${figures.circleDotted} ${this.prefixTitle(file, title)}`);
|
||||
this.writeLogs({logs});
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine('');
|
||||
}
|
||||
}
|
||||
|
||||
write(string) {
|
||||
this.lineWriter.writeLine(string);
|
||||
}
|
||||
|
||||
writeWithCounts(string) {
|
||||
if (!this.stats) {
|
||||
return this.lineWriter.writeLine(string);
|
||||
}
|
||||
|
||||
string = string || '';
|
||||
if (string !== '') {
|
||||
string += os.EOL;
|
||||
}
|
||||
|
||||
let firstLinePostfix = this.watching ? ' ' + chalk.gray.dim('[' + new Date().toLocaleTimeString('en-US', {hour12: false}) + ']') : '';
|
||||
|
||||
if (this.stats.passedTests > 0) {
|
||||
string += os.EOL + colors.pass(`${this.stats.passedTests} passed`) + firstLinePostfix;
|
||||
firstLinePostfix = '';
|
||||
}
|
||||
|
||||
if (this.stats.passedKnownFailingTests > 0) {
|
||||
string += os.EOL + colors.error(`${this.stats.passedKnownFailingTests} ${plur('known failure', this.stats.passedKnownFailingTests)}`);
|
||||
}
|
||||
|
||||
if (this.stats.failedHooks > 0) {
|
||||
string += os.EOL + colors.error(`${this.stats.failedHooks} ${plur('hook', this.stats.failedHooks)} failed`) + firstLinePostfix;
|
||||
firstLinePostfix = '';
|
||||
}
|
||||
|
||||
if (this.stats.failedTests > 0) {
|
||||
string += os.EOL + colors.error(`${this.stats.failedTests} ${plur('test', this.stats.failedTests)} failed`) + firstLinePostfix;
|
||||
firstLinePostfix = '';
|
||||
}
|
||||
|
||||
if (this.stats.skippedTests > 0) {
|
||||
string += os.EOL + colors.skip(`${this.stats.skippedTests} skipped`);
|
||||
}
|
||||
|
||||
if (this.stats.todoTests > 0) {
|
||||
string += os.EOL + colors.todo(`${this.stats.todoTests} todo`);
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine(string);
|
||||
}
|
||||
|
||||
writeErr(event) {
|
||||
if (event.err.name === 'TSError' && event.err.object && event.err.object.diagnosticText) {
|
||||
this.lineWriter.writeLine(colors.errorStack(event.err.object.diagnosticText));
|
||||
this.lineWriter.writeLine();
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.err.source) {
|
||||
this.lineWriter.writeLine(colors.errorSource(`${this.relativeFile(event.err.source.file)}:${event.err.source.line}`));
|
||||
const excerpt = codeExcerpt(event.err.source, {maxWidth: this.reportStream.columns - 2});
|
||||
if (excerpt) {
|
||||
this.lineWriter.writeLine();
|
||||
this.lineWriter.writeLine(excerpt);
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
}
|
||||
|
||||
if (event.err.avaAssertionError) {
|
||||
const result = formatSerializedError(event.err);
|
||||
if (result.printMessage) {
|
||||
this.lineWriter.writeLine(event.err.message);
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
if (result.formatted) {
|
||||
this.lineWriter.writeLine(result.formatted);
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
const message = improperUsageMessage(event.err);
|
||||
if (message) {
|
||||
this.lineWriter.writeLine(message);
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
} else if (event.err.nonErrorObject) {
|
||||
this.lineWriter.writeLine(event.err.formatted);
|
||||
this.lineWriter.writeLine();
|
||||
} else {
|
||||
this.lineWriter.writeLine(event.err.summary);
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
const formatted = this.formatErrorStack(event.err);
|
||||
if (formatted.length > 0) {
|
||||
this.lineWriter.writeLine(formatted.join('\n'));
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
}
|
||||
|
||||
formatErrorStack(error) {
|
||||
if (!error.stack) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (error.shouldBeautifyStack) {
|
||||
return beautifyStack(error.stack).map(line => {
|
||||
if (nodeInternals.some(internal => internal.test(line))) {
|
||||
return colors.errorStackInternal(`${figures.pointerSmall} ${line}`);
|
||||
}
|
||||
|
||||
return colors.errorStack(`${figures.pointerSmall} ${line}`);
|
||||
});
|
||||
}
|
||||
|
||||
return [error.stack];
|
||||
}
|
||||
|
||||
writeLogs(event, surroundLines) {
|
||||
if (event.logs && event.logs.length > 0) {
|
||||
if (surroundLines) {
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
for (const log of event.logs) {
|
||||
const logLines = indentString(colors.log(log), 4);
|
||||
const logLinesWithLeadingFigure = logLines.replace(/^ {4}/, ` ${colors.information(figures.info)} `);
|
||||
this.lineWriter.writeLine(logLinesWithLeadingFigure);
|
||||
}
|
||||
|
||||
if (surroundLines) {
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
writeTestSummary(event) {
|
||||
// Prefix icon indicates matched expectations vs. not.
|
||||
// Prefix color indicates passed-as-expected vs. not (fail or unexpected pass).
|
||||
// This yields four possibilities, which in the standard configuration render as:
|
||||
// * normal test, pass: <green>✔</green>
|
||||
// * normal test, fail: <red>✘ [fail]</red>
|
||||
// * fail-expected test, fail: <red>✔ [expected fail]</red>
|
||||
// * fail-expected test, pass: <red>✘ [unexpected pass]</red>
|
||||
let prefix;
|
||||
let suffix;
|
||||
if (event.type === 'hook-failed' || event.type === 'test-failed') {
|
||||
const type = event.knownFailing ? '[unexpected pass]' : '[fail]';
|
||||
prefix = colors.error(`${figures.cross} ${type}:`);
|
||||
suffix = chalk.italic(colors.error(event.err.message));
|
||||
} else if (event.knownFailing) {
|
||||
prefix = colors.error(figures.tick + ' [expected fail]');
|
||||
} else {
|
||||
prefix = colors.pass(figures.tick);
|
||||
if (event.duration > this.durationThreshold) {
|
||||
suffix = colors.duration(`(${prettyMs(event.duration)})`);
|
||||
}
|
||||
}
|
||||
|
||||
const label = this.prefixTitle(event.testFile, event.title);
|
||||
this.write(`${prefix} ${label}${suffix ? ' ' + suffix : ''}`);
|
||||
this.writeLogs(event);
|
||||
}
|
||||
|
||||
writeFailure(event) {
|
||||
this.lineWriter.writeLine(colors.title(this.prefixTitle(event.testFile, event.title)));
|
||||
|
||||
if (!event.logs || event.logs.length === 0) {
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
this.writeErr(event);
|
||||
}
|
||||
|
||||
endRun() {// eslint-disable-line complexity
|
||||
let firstLinePostfix = this.watching ? ` ${chalk.gray.dim(`[${new Date().toLocaleTimeString('en-US', {hour12: false})}]`)}` : '';
|
||||
|
||||
if (this.emptyParallelRun) {
|
||||
this.lineWriter.writeLine('No files tested in this parallel run');
|
||||
this.lineWriter.writeLine();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.selectionInsights.ignoredFilterPatternFiles.length > 0) {
|
||||
this.write(colors.information(`${figures.warning} Paths for additional test files were disregarded:`));
|
||||
this.lineWriter.writeLine();
|
||||
for (const pattern of this.selectionInsights.ignoredFilterPatternFiles) {
|
||||
this.lineWriter.writeLine(chalk.magenta(`* ${pattern}`));
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine();
|
||||
this.write(colors.information('Files starting with underscores are never treated as test files.'));
|
||||
this.write(colors.information('Files handled by @ava/typescript can only be selected if your configuration already selects them.'));
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
if (this.selectionInsights.selectionCount === 0) {
|
||||
if (this.selectionInsights.testFileCount === 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${figures.cross} Couldn’t find any files to test` + firstLinePostfix));
|
||||
} else {
|
||||
const {testFileCount: count} = this.selectionInsights;
|
||||
this.lineWriter.writeLine(colors.error(`${figures.cross} Based on your configuration, ${count} test ${plur('file was', 'files were', count)} found, but did not match the CLI arguments:` + firstLinePostfix));
|
||||
this.lineWriter.writeLine();
|
||||
for (const {pattern} of this.selectionInsights.filter) {
|
||||
this.lineWriter.writeLine(colors.error(`* ${pattern}`));
|
||||
}
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.matching && this.stats.selectedTests === 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${figures.cross} Couldn’t find any matching tests` + firstLinePostfix));
|
||||
this.lineWriter.writeLine();
|
||||
return;
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine(colors.log(figures.line));
|
||||
this.lineWriter.writeLine();
|
||||
|
||||
if (this.failures.length > 0) {
|
||||
const lastFailure = this.failures[this.failures.length - 1];
|
||||
for (const event of this.failures) {
|
||||
this.writeFailure(event);
|
||||
if (event !== lastFailure) {
|
||||
this.lineWriter.writeLine();
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine(colors.log(figures.line));
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
if (this.failFastEnabled && (this.stats.remainingTests > 0 || this.stats.files > this.stats.finishedWorkers)) {
|
||||
let remaining = '';
|
||||
if (this.stats.remainingTests > 0) {
|
||||
remaining += `At least ${this.stats.remainingTests} ${plur('test was', 'tests were', this.stats.remainingTests)} skipped`;
|
||||
if (this.stats.files > this.stats.finishedWorkers) {
|
||||
remaining += ', as well as ';
|
||||
}
|
||||
}
|
||||
|
||||
if (this.stats.files > this.stats.finishedWorkers) {
|
||||
const skippedFileCount = this.stats.files - this.stats.finishedWorkers;
|
||||
remaining += `${skippedFileCount} ${plur('test file', 'test files', skippedFileCount)}`;
|
||||
if (this.stats.remainingTests === 0) {
|
||||
remaining += ` ${plur('was', 'were', skippedFileCount)} skipped`;
|
||||
}
|
||||
}
|
||||
|
||||
this.lineWriter.writeLine(colors.information(`\`--fail-fast\` is on. ${remaining}.`));
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
if (this.stats.parallelRuns) {
|
||||
const {
|
||||
currentFileCount,
|
||||
currentIndex,
|
||||
totalRuns,
|
||||
} = this.stats.parallelRuns;
|
||||
this.lineWriter.writeLine(colors.information(`Ran ${currentFileCount} test ${plur('file', currentFileCount)} out of ${this.stats.files} for job ${currentIndex + 1} of ${totalRuns}`));
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
|
||||
if (this.stats.failedHooks > 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${this.stats.failedHooks} ${plur('hook', this.stats.failedHooks)} failed`) + firstLinePostfix);
|
||||
firstLinePostfix = '';
|
||||
}
|
||||
|
||||
if (this.stats.failedTests > 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${this.stats.failedTests} ${plur('test', this.stats.failedTests)} failed`) + firstLinePostfix);
|
||||
firstLinePostfix = '';
|
||||
}
|
||||
|
||||
if (
|
||||
this.stats.failedHooks === 0
|
||||
&& this.stats.failedTests === 0
|
||||
&& this.stats.passedTests > 0
|
||||
) {
|
||||
this.lineWriter.writeLine(colors.pass(`${this.stats.passedTests} ${plur('test', this.stats.passedTests)} passed`) + firstLinePostfix,
|
||||
);
|
||||
firstLinePostfix = '';
|
||||
}
|
||||
|
||||
if (this.stats.passedKnownFailingTests > 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${this.stats.passedKnownFailingTests} ${plur('known failure', this.stats.passedKnownFailingTests)}`));
|
||||
}
|
||||
|
||||
if (this.stats.skippedTests > 0) {
|
||||
this.lineWriter.writeLine(colors.skip(`${this.stats.skippedTests} ${plur('test', this.stats.skippedTests)} skipped`));
|
||||
}
|
||||
|
||||
if (this.stats.todoTests > 0) {
|
||||
this.lineWriter.writeLine(colors.todo(`${this.stats.todoTests} ${plur('test', this.stats.todoTests)} todo`));
|
||||
}
|
||||
|
||||
if (this.stats.unhandledRejections > 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${this.stats.unhandledRejections} unhandled ${plur('rejection', this.stats.unhandledRejections)}`));
|
||||
}
|
||||
|
||||
if (this.stats.uncaughtExceptions > 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${this.stats.uncaughtExceptions} uncaught ${plur('exception', this.stats.uncaughtExceptions)}`));
|
||||
}
|
||||
|
||||
if (this.stats.timedOutTests > 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${this.stats.timedOutTests} ${plur('test', this.stats.timedOutTests)} remained pending after a timeout`));
|
||||
}
|
||||
|
||||
if (this.previousFailures > 0) {
|
||||
this.lineWriter.writeLine(colors.error(`${this.previousFailures} previous ${plur('failure', this.previousFailures)} in test files that were not rerun`));
|
||||
}
|
||||
|
||||
if (this.watching) {
|
||||
this.lineWriter.writeLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
16
github/codeql-action-v2/node_modules/ava/lib/reporters/format-serialized-error.js
generated
vendored
Normal file
16
github/codeql-action-v2/node_modules/ava/lib/reporters/format-serialized-error.js
generated
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
export default function formatSerializedError(error) {
|
||||
const printMessage = error.values.length === 0
|
||||
? Boolean(error.message)
|
||||
: !error.values[0].label.startsWith(error.message);
|
||||
|
||||
if (error.values.length === 0) {
|
||||
return {formatted: null, printMessage};
|
||||
}
|
||||
|
||||
let formatted = '';
|
||||
for (const value of error.values) {
|
||||
formatted += `${value.label}\n\n${value.formatted}\n\n`;
|
||||
}
|
||||
|
||||
return {formatted: formatted.trim(), printMessage};
|
||||
}
|
||||
54
github/codeql-action-v2/node_modules/ava/lib/reporters/improper-usage-messages.js
generated
vendored
Normal file
54
github/codeql-action-v2/node_modules/ava/lib/reporters/improper-usage-messages.js
generated
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
import {chalk} from '../chalk.js';
|
||||
import pkg from '../pkg.cjs';
|
||||
|
||||
export default function buildMessage(error) {
|
||||
if (!error.improperUsage) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const {assertion} = error;
|
||||
if (assertion === 'throws' || assertion === 'notThrows') {
|
||||
return `Try wrapping the first argument to \`t.${assertion}()\` in a function:
|
||||
|
||||
${chalk.cyan(`t.${assertion}(() => { `)}${chalk.grey('/* your code here */')}${chalk.cyan(' })')}
|
||||
|
||||
Visit the following URL for more details:
|
||||
|
||||
${chalk.blue.underline(`https://github.com/avajs/ava/blob/v${pkg.version}/docs/03-assertions.md#throwsfn-expected-message`)}`;
|
||||
}
|
||||
|
||||
if (assertion === 'snapshot') {
|
||||
const {name, snapPath} = error.improperUsage;
|
||||
|
||||
if (name === 'ChecksumError' || name === 'InvalidSnapshotError') {
|
||||
return `The snapshot file is corrupted.
|
||||
|
||||
File path: ${chalk.yellow(snapPath)}
|
||||
|
||||
Please run AVA again with the ${chalk.cyan('--update-snapshots')} flag to recreate it.`;
|
||||
}
|
||||
|
||||
if (name === 'LegacyError') {
|
||||
return `The snapshot file was created with AVA 0.19. It’s not supported by this AVA version.
|
||||
|
||||
File path: ${chalk.yellow(snapPath)}
|
||||
|
||||
Please run AVA again with the ${chalk.cyan('--update-snapshots')} flag to upgrade.`;
|
||||
}
|
||||
|
||||
if (name === 'VersionMismatchError') {
|
||||
const {snapVersion, expectedVersion} = error.improperUsage;
|
||||
const upgradeMessage = snapVersion < expectedVersion
|
||||
? `Please run AVA again with the ${chalk.cyan('--update-snapshots')} flag to upgrade.`
|
||||
: 'You should upgrade AVA.';
|
||||
|
||||
return `The snapshot file is v${snapVersion}, but only v${expectedVersion} is supported.
|
||||
|
||||
File path: ${chalk.yellow(snapPath)}
|
||||
|
||||
${upgradeMessage}`;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
23
github/codeql-action-v2/node_modules/ava/lib/reporters/prefix-title.js
generated
vendored
Normal file
23
github/codeql-action-v2/node_modules/ava/lib/reporters/prefix-title.js
generated
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
import path from 'node:path';
|
||||
|
||||
import figures from 'figures';
|
||||
|
||||
import {chalk} from '../chalk.js';
|
||||
|
||||
const SEPARATOR = ' ' + chalk.gray.dim(figures.pointerSmall) + ' ';
|
||||
|
||||
export default function prefixTitle(extensions, base, file, title) {
|
||||
const parts = file
|
||||
// Only replace base if it is found at the start of the path
|
||||
.replace(base, (match, offset) => offset === 0 ? '' : match)
|
||||
.split(path.sep)
|
||||
.filter(p => p !== '__tests__');
|
||||
|
||||
const filename = parts.pop()
|
||||
.replace(/\.spec\./, '.')
|
||||
.replace(/\.test\./, '.')
|
||||
.replace(/test-/, '')
|
||||
.replace(new RegExp(`.(${extensions.join('|')})$`), '');
|
||||
|
||||
return [...parts, filename, title].join(SEPARATOR);
|
||||
}
|
||||
262
github/codeql-action-v2/node_modules/ava/lib/reporters/tap.js
generated
vendored
Normal file
262
github/codeql-action-v2/node_modules/ava/lib/reporters/tap.js
generated
vendored
Normal file
|
|
@ -0,0 +1,262 @@
|
|||
import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
|
||||
import indentString from 'indent-string';
|
||||
import plur from 'plur';
|
||||
import stripAnsi from 'strip-ansi';
|
||||
import * as supertap from 'supertap';
|
||||
|
||||
import beautifyStack from './beautify-stack.js';
|
||||
import prefixTitle from './prefix-title.js';
|
||||
|
||||
function dumpError(error) {
|
||||
const object = {...error.object};
|
||||
if (error.name) {
|
||||
object.name = error.name;
|
||||
}
|
||||
|
||||
if (error.message) {
|
||||
object.message = error.message;
|
||||
}
|
||||
|
||||
if (error.avaAssertionError) {
|
||||
if (error.assertion) {
|
||||
object.assertion = error.assertion;
|
||||
}
|
||||
|
||||
if (error.operator) {
|
||||
object.operator = error.operator;
|
||||
}
|
||||
|
||||
if (error.values.length > 0) {
|
||||
object.values = Object.fromEntries(error.values.map(({label, formatted}) => [stripAnsi(label), stripAnsi(formatted)]));
|
||||
}
|
||||
}
|
||||
|
||||
if (error.nonErrorObject) {
|
||||
object.message = 'Non-error object';
|
||||
object.formatted = stripAnsi(error.formatted);
|
||||
}
|
||||
|
||||
if (error.stack) {
|
||||
object.at = error.shouldBeautifyStack ? beautifyStack(error.stack).join('\n') : error.stack;
|
||||
}
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
export default class TapReporter {
|
||||
constructor(options) {
|
||||
this.i = 0;
|
||||
|
||||
this.extensions = options.extensions;
|
||||
this.stdStream = options.stdStream;
|
||||
this.reportStream = options.reportStream;
|
||||
|
||||
this.crashCount = 0;
|
||||
this.filesWithMissingAvaImports = new Set();
|
||||
this.prefixTitle = (testFile, title) => title;
|
||||
this.relativeFile = file => path.relative(options.projectDir, file);
|
||||
this.stats = null;
|
||||
}
|
||||
|
||||
startRun(plan) {
|
||||
if (plan.files.length > 1) {
|
||||
this.prefixTitle = (testFile, title) => prefixTitle(this.extensions, plan.filePathPrefix, testFile, title);
|
||||
}
|
||||
|
||||
plan.status.on('stateChange', evt => this.consumeStateChange(evt));
|
||||
|
||||
this.reportStream.write(supertap.start() + os.EOL);
|
||||
}
|
||||
|
||||
endRun() {
|
||||
if (this.stats) {
|
||||
this.reportStream.write(supertap.finish({
|
||||
crashed: this.crashCount,
|
||||
failed: this.stats.failedTests + this.stats.remainingTests,
|
||||
passed: this.stats.passedTests + this.stats.passedKnownFailingTests,
|
||||
skipped: this.stats.skippedTests,
|
||||
todo: this.stats.todoTests,
|
||||
}) + os.EOL);
|
||||
|
||||
if (this.stats.parallelRuns) {
|
||||
const {currentFileCount, currentIndex, totalRuns} = this.stats.parallelRuns;
|
||||
this.reportStream.write(`# Ran ${currentFileCount} test ${plur('file', currentFileCount)} out of ${this.stats.files} for job ${currentIndex + 1} of ${totalRuns}` + os.EOL + os.EOL);
|
||||
}
|
||||
} else {
|
||||
this.reportStream.write(supertap.finish({
|
||||
crashed: this.crashCount,
|
||||
failed: 0,
|
||||
passed: 0,
|
||||
skipped: 0,
|
||||
todo: 0,
|
||||
}) + os.EOL);
|
||||
}
|
||||
}
|
||||
|
||||
writeTest(evt, flags) {
|
||||
this.reportStream.write(supertap.test(this.prefixTitle(evt.testFile, evt.title), {
|
||||
comment: evt.logs,
|
||||
error: evt.err ? dumpError(evt.err) : null,
|
||||
index: ++this.i,
|
||||
passed: flags.passed,
|
||||
skip: flags.skip,
|
||||
todo: flags.todo,
|
||||
}) + os.EOL);
|
||||
}
|
||||
|
||||
writeCrash(evt, title) {
|
||||
this.crashCount++;
|
||||
this.reportStream.write(supertap.test(title || evt.err.summary || evt.type, {
|
||||
comment: evt.logs,
|
||||
error: evt.err ? dumpError(evt.err) : null,
|
||||
index: ++this.i,
|
||||
passed: false,
|
||||
skip: false,
|
||||
todo: false,
|
||||
}) + os.EOL);
|
||||
}
|
||||
|
||||
writeComment(evt, {title = this.prefixTitle(evt.testFile, evt.title)}) {
|
||||
this.reportStream.write(`# ${stripAnsi(title)}${os.EOL}`);
|
||||
if (evt.logs) {
|
||||
for (const log of evt.logs) {
|
||||
const logLines = indentString(log, 4).replace(/^ {4}/gm, '# ');
|
||||
this.reportStream.write(`${logLines}${os.EOL}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
writeProcessExit(evt) {
|
||||
const error = new Error(`Exiting due to process.exit() when running ${this.relativeFile(evt.testFile)}`);
|
||||
error.stack = evt.stack;
|
||||
|
||||
for (const [testFile, tests] of evt.pendingTests) {
|
||||
for (const title of tests) {
|
||||
this.writeTest({testFile, title, err: error}, {passed: false, todo: false, skip: false});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
writeTimeout(evt) {
|
||||
const error = new Error(`Exited because no new tests completed within the last ${evt.period}ms of inactivity`);
|
||||
|
||||
for (const [testFile, tests] of evt.pendingTests) {
|
||||
for (const title of tests) {
|
||||
this.writeTest({testFile, title, err: error}, {passed: false, todo: false, skip: false});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
consumeStateChange(evt) { // eslint-disable-line complexity
|
||||
const fileStats = this.stats && evt.testFile ? this.stats.byFile.get(evt.testFile) : null;
|
||||
|
||||
switch (evt.type) {
|
||||
case 'declared-test': {
|
||||
// Ignore
|
||||
break;
|
||||
}
|
||||
|
||||
case 'hook-failed': {
|
||||
this.writeTest(evt, {passed: false, todo: false, skip: false});
|
||||
break;
|
||||
}
|
||||
|
||||
case 'hook-finished': {
|
||||
this.writeComment(evt, {});
|
||||
break;
|
||||
}
|
||||
|
||||
case 'internal-error': {
|
||||
this.writeCrash(evt);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'missing-ava-import': {
|
||||
this.filesWithMissingAvaImports.add(evt.testFile);
|
||||
this.writeCrash(evt, `No tests found in ${this.relativeFile(evt.testFile)}, make sure to import "ava" at the top of your test file`);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'process-exit': {
|
||||
this.writeProcessExit(evt);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'selected-test': {
|
||||
if (evt.skip) {
|
||||
this.writeTest(evt, {passed: true, todo: false, skip: true});
|
||||
} else if (evt.todo) {
|
||||
this.writeTest(evt, {passed: false, todo: true, skip: false});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'stats': {
|
||||
this.stats = evt.stats;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'test-failed': {
|
||||
this.writeTest(evt, {passed: false, todo: false, skip: false});
|
||||
break;
|
||||
}
|
||||
|
||||
case 'test-passed': {
|
||||
this.writeTest(evt, {passed: true, todo: false, skip: false});
|
||||
break;
|
||||
}
|
||||
|
||||
case 'timeout': {
|
||||
this.writeTimeout(evt);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'uncaught-exception': {
|
||||
this.writeCrash(evt);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'unhandled-rejection': {
|
||||
this.writeCrash(evt);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'worker-failed': {
|
||||
if (!this.filesWithMissingAvaImports.has(evt.testFile)) {
|
||||
if (evt.nonZeroExitCode) {
|
||||
this.writeCrash(evt, `${this.relativeFile(evt.testFile)} exited with a non-zero exit code: ${evt.nonZeroExitCode}`);
|
||||
} else {
|
||||
this.writeCrash(evt, `${this.relativeFile(evt.testFile)} exited due to ${evt.signal}`);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'worker-finished': {
|
||||
if (!evt.forcedExit && !this.filesWithMissingAvaImports.has(evt.testFile)) {
|
||||
if (fileStats.declaredTests === 0) {
|
||||
this.writeCrash(evt, `No tests found in ${this.relativeFile(evt.testFile)}`);
|
||||
} else if (!this.failFastEnabled && fileStats.remainingTests > 0) {
|
||||
this.writeComment(evt, {title: `${fileStats.remainingTests} ${plur('test', fileStats.remainingTests)} remaining in ${this.relativeFile(evt.testFile)}`});
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 'worker-stderr':
|
||||
case 'worker-stdout': {
|
||||
this.stdStream.write(evt.chunk);
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue