vitest
Version:
A blazing fast unit test framework powered by Vite
268 lines (263 loc) • 9.54 kB
JavaScript
import { startTests } from '@vitest/runner';
import { resolve } from 'pathe';
import { g as getWorkerState, r as resetModules } from './chunk-utils-env.04ffbef7.js';
import { R as RealDate, g as globalExpect, a as vi } from './chunk-utils-import.39ffe9c5.js';
import { d as distDir } from './chunk-paths.e36446b4.js';
import { s as startCoverageInsideWorker, t as takeCoverageInsideWorker, a as stopCoverageInsideWorker } from './chunk-integrations-coverage.e0a6acd2.js';
import { createRequire } from 'node:module';
import { isatty } from 'node:tty';
import { installSourcemapsSupport } from 'vite-node/source-map';
import { setupColors, createColors, getSafeTimers } from '@vitest/utils';
import { e as environments } from './chunk-env-node.affdd278.js';
import { i as index } from './chunk-integrations-utils.d7c85bd9.js';
import { s as setupSnapshotEnvironment } from './chunk-snapshot-env.a347d647.js';
import { promises, existsSync } from 'node:fs';
import { r as rpc } from './chunk-runtime-rpc.1b5714dc.js';
import { s as setupCommonEnv } from './chunk-runtime-setup.a49dc2f9.js';
import 'std-env';
import '@vitest/runner/utils';
import 'chai';
import './vendor-_commonjsHelpers.addc3445.js';
import '@vitest/expect';
import './chunk-utils-base.81f83dbd.js';
import './chunk-utils-tasks.b41c8284.js';
import 'util';
import '@vitest/spy';
import 'node:url';
import 'local-pkg';
import 'node:console';
import './chunk-integrations-run-once.a2b4758b.js';
class NodeSnapshotEnvironment {
resolvePath(filepath) {
return rpc().resolveSnapshotPath(filepath);
}
async prepareDirectory(filepath) {
await promises.mkdir(filepath, { recursive: true });
}
async saveSnapshotFile(filepath, snapshot) {
await promises.writeFile(filepath, snapshot, "utf-8");
}
async readSnapshotFile(filepath) {
if (!existsSync(filepath))
return null;
return promises.readFile(filepath, "utf-8");
}
async removeSnapshotFile(filepath) {
if (existsSync(filepath))
await promises.unlink(filepath);
}
}
let globalSetup = false;
async function setupGlobalEnv(config) {
await setupCommonEnv(config);
Object.defineProperty(globalThis, "__vitest_index__", {
value: index,
enumerable: false
});
if (globalSetup)
return;
globalSetup = true;
setupSnapshotEnvironment(new NodeSnapshotEnvironment());
setupColors(createColors(isatty(1)));
const _require = createRequire(import.meta.url);
_require.extensions[".css"] = () => ({});
_require.extensions[".scss"] = () => ({});
_require.extensions[".sass"] = () => ({});
const state = getWorkerState();
installSourcemapsSupport({
getSourceMap: (source) => state.moduleCache.getSourceMap(source)
});
await setupConsoleLogSpy();
}
async function setupConsoleLogSpy() {
const stdoutBuffer = /* @__PURE__ */ new Map();
const stderrBuffer = /* @__PURE__ */ new Map();
const timers = /* @__PURE__ */ new Map();
const unknownTestId = "__vitest__unknown_test__";
const { Writable } = await import('node:stream');
const { Console } = await import('node:console');
const { setTimeout, clearTimeout } = getSafeTimers();
function schedule(taskId) {
const timer = timers.get(taskId);
const { stdoutTime, stderrTime } = timer;
clearTimeout(timer.timer);
timer.timer = setTimeout(() => {
if (stderrTime < stdoutTime) {
sendStderr(taskId);
sendStdout(taskId);
} else {
sendStdout(taskId);
sendStderr(taskId);
}
});
}
function sendStdout(taskId) {
const buffer = stdoutBuffer.get(taskId);
if (!buffer)
return;
const content = buffer.map((i) => String(i)).join("");
const timer = timers.get(taskId);
rpc().onUserConsoleLog({
type: "stdout",
content: content || "<empty line>",
taskId,
time: timer.stdoutTime || RealDate.now(),
size: buffer.length
});
stdoutBuffer.set(taskId, []);
timer.stdoutTime = 0;
}
function sendStderr(taskId) {
const buffer = stderrBuffer.get(taskId);
if (!buffer)
return;
const content = buffer.map((i) => String(i)).join("");
const timer = timers.get(taskId);
rpc().onUserConsoleLog({
type: "stderr",
content: content || "<empty line>",
taskId,
time: timer.stderrTime || RealDate.now(),
size: buffer.length
});
stderrBuffer.set(taskId, []);
timer.stderrTime = 0;
}
const stdout = new Writable({
write(data, encoding, callback) {
var _a, _b;
const id = ((_b = (_a = getWorkerState()) == null ? void 0 : _a.current) == null ? void 0 : _b.id) ?? unknownTestId;
let timer = timers.get(id);
if (timer) {
timer.stdoutTime = timer.stdoutTime || RealDate.now();
} else {
timer = { stdoutTime: RealDate.now(), stderrTime: RealDate.now(), timer: 0 };
timers.set(id, timer);
}
let buffer = stdoutBuffer.get(id);
if (!buffer) {
buffer = [];
stdoutBuffer.set(id, buffer);
}
buffer.push(data);
schedule(id);
callback();
}
});
const stderr = new Writable({
write(data, encoding, callback) {
var _a, _b;
const id = ((_b = (_a = getWorkerState()) == null ? void 0 : _a.current) == null ? void 0 : _b.id) ?? unknownTestId;
let timer = timers.get(id);
if (timer) {
timer.stderrTime = timer.stderrTime || RealDate.now();
} else {
timer = { stderrTime: RealDate.now(), stdoutTime: RealDate.now(), timer: 0 };
timers.set(id, timer);
}
let buffer = stderrBuffer.get(id);
if (!buffer) {
buffer = [];
stderrBuffer.set(id, buffer);
}
buffer.push(data);
schedule(id);
callback();
}
});
globalThis.console = new Console({
stdout,
stderr,
colorMode: true,
groupIndentation: 2
});
}
async function loadEnvironment(name, executor) {
const pkg = await executor.executeId(`vitest-environment-${name}`);
if (!pkg || !pkg.default || typeof pkg.default !== "object" || typeof pkg.default.setup !== "function") {
throw new Error(
`Environment "${name}" is not a valid environment. Package "vitest-environment-${name}" should have default export with "setup" method.`
);
}
return pkg.default;
}
async function withEnv(name, options, executor, fn) {
const config = environments[name] || await loadEnvironment(name, executor);
globalThis.__vitest_environment__ = config.name || name;
globalExpect.setState({
environment: config.name || name || "node"
});
const env = await config.setup(globalThis, options);
try {
await fn();
} finally {
const { setTimeout } = getSafeTimers();
await new Promise((resolve) => setTimeout(resolve));
await env.teardown(globalThis);
}
}
const runnersFile = resolve(distDir, "runners.js");
async function getTestRunnerConstructor(config, executor) {
if (!config.runner) {
const { VitestTestRunner, NodeBenchmarkRunner } = await executor.executeFile(runnersFile);
return config.mode === "test" ? VitestTestRunner : NodeBenchmarkRunner;
}
const mod = await executor.executeId(config.runner);
if (!mod.default && typeof mod.default !== "function")
throw new Error(`Runner must export a default function, but got ${typeof mod.default} imported from ${config.runner}`);
return mod.default;
}
async function getTestRunner(config, executor) {
const TestRunner = await getTestRunnerConstructor(config, executor);
const testRunner = new TestRunner(config);
Object.defineProperty(testRunner, "__vitest_executor", {
value: executor,
enumerable: false,
configurable: false
});
if (!testRunner.config)
testRunner.config = config;
if (!testRunner.importFile)
throw new Error('Runner must implement "importFile" method.');
const originalOnTaskUpdate = testRunner.onTaskUpdate;
testRunner.onTaskUpdate = async (task) => {
const p = rpc().onTaskUpdate(task);
await (originalOnTaskUpdate == null ? void 0 : originalOnTaskUpdate.call(testRunner, task));
return p;
};
const originalOnCollected = testRunner.onCollected;
testRunner.onCollected = async (files) => {
rpc().onCollected(files);
await (originalOnCollected == null ? void 0 : originalOnCollected.call(testRunner, files));
};
const originalOnAfterRun = testRunner.onAfterRun;
testRunner.onAfterRun = async (files) => {
const coverage = await takeCoverageInsideWorker(config.coverage, executor);
rpc().onAfterSuiteRun({ coverage });
await (originalOnAfterRun == null ? void 0 : originalOnAfterRun.call(testRunner, files));
};
return testRunner;
}
async function run(files, config, environment, executor) {
await setupGlobalEnv(config);
await startCoverageInsideWorker(config.coverage, executor);
const workerState = getWorkerState();
const runner = await getTestRunner(config, executor);
globalThis.__vitest_environment__ = environment;
await withEnv(environment.name, environment.options || config.environmentOptions || {}, executor, async () => {
for (const file of files) {
if (config.isolate) {
workerState.mockMap.clear();
resetModules(workerState.moduleCache, true);
}
workerState.filepath = file;
await startTests([file], runner);
workerState.filepath = void 0;
vi.resetConfig();
vi.restoreAllMocks();
}
await stopCoverageInsideWorker(config.coverage, executor);
});
workerState.environmentTeardownRun = true;
}
export { run };