mirror of
https://github.com/soconnor0919/beenpad.git
synced 2026-02-05 00:06:40 -05:00
first commit
This commit is contained in:
6
node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
generated
vendored
Normal file
6
node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
|
||||
function getDefaultExportFromCjs(x) {
|
||||
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
||||
}
|
||||
|
||||
export { commonjsGlobal as c, getDefaultExportFromCjs as g };
|
||||
163
node_modules/vitest/dist/chunks/base.CTp-EStD.js
generated
vendored
Normal file
163
node_modules/vitest/dist/chunks/base.CTp-EStD.js
generated
vendored
Normal file
@@ -0,0 +1,163 @@
|
||||
import { runInThisContext } from 'node:vm';
|
||||
import * as spyModule from '@vitest/spy';
|
||||
import { r as resolveTestRunner, a as resolveSnapshotEnvironment, s as setupChaiConfig } from './index.bFLgAE-Z.js';
|
||||
import { l as loadEnvironment } from './init.B04saIIg.js';
|
||||
import { V as VitestEvaluatedModules } from './evaluatedModules.Dg1zASAC.js';
|
||||
import { s as startVitestModuleRunner, c as createNodeImportMeta } from './startModuleRunner.Iz2V0ESw.js';
|
||||
import { performance as performance$1 } from 'node:perf_hooks';
|
||||
import { startTests, collectTests } from '@vitest/runner';
|
||||
import { c as setupCommonEnv, s as startCoverageInsideWorker, a as stopCoverageInsideWorker } from './setup-common.Cm-kSBVi.js';
|
||||
import { g as globalExpect, v as vi } from './vi.2VT5v0um.js';
|
||||
import { c as closeInspector } from './inspector.CvyFGlXm.js';
|
||||
import { createRequire } from 'node:module';
|
||||
import timers from 'node:timers';
|
||||
import timersPromises from 'node:timers/promises';
|
||||
import util from 'node:util';
|
||||
import { KNOWN_ASSET_TYPES } from '@vitest/utils/constants';
|
||||
import { i as index } from './index.Z5E_ObnR.js';
|
||||
import { g as getWorkerState, r as resetModules, p as provideWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
// this should only be used in Node
|
||||
let globalSetup = false;
|
||||
async function setupGlobalEnv(config, environment) {
|
||||
await setupCommonEnv(config);
|
||||
Object.defineProperty(globalThis, "__vitest_index__", {
|
||||
value: index,
|
||||
enumerable: false
|
||||
});
|
||||
globalExpect.setState({ environment: environment.name });
|
||||
if (globalSetup) return;
|
||||
globalSetup = true;
|
||||
if ((environment.viteEnvironment || environment.name) === "client") {
|
||||
const _require = createRequire(import.meta.url);
|
||||
// always mock "required" `css` files, because we cannot process them
|
||||
_require.extensions[".css"] = resolveCss;
|
||||
_require.extensions[".scss"] = resolveCss;
|
||||
_require.extensions[".sass"] = resolveCss;
|
||||
_require.extensions[".less"] = resolveCss;
|
||||
// since we are using Vite, we can assume how these will be resolved
|
||||
KNOWN_ASSET_TYPES.forEach((type) => {
|
||||
_require.extensions[`.${type}`] = resolveAsset;
|
||||
});
|
||||
process.env.SSR = "";
|
||||
} else process.env.SSR = "1";
|
||||
// @ts-expect-error not typed global for patched timers
|
||||
globalThis.__vitest_required__ = {
|
||||
util,
|
||||
timers,
|
||||
timersPromises
|
||||
};
|
||||
if (!config.disableConsoleIntercept) await setupConsoleLogSpy();
|
||||
}
|
||||
function resolveCss(mod) {
|
||||
mod.exports = "";
|
||||
}
|
||||
function resolveAsset(mod, url) {
|
||||
mod.exports = url;
|
||||
}
|
||||
async function setupConsoleLogSpy() {
|
||||
const { createCustomConsole } = await import('./console.Cf-YriPC.js');
|
||||
globalThis.console = createCustomConsole();
|
||||
}
|
||||
|
||||
// browser shouldn't call this!
|
||||
async function run(method, files, config, moduleRunner, environment, traces) {
|
||||
const workerState = getWorkerState();
|
||||
const [testRunner] = await Promise.all([
|
||||
traces.$("vitest.runtime.runner", () => resolveTestRunner(config, moduleRunner, traces)),
|
||||
traces.$("vitest.runtime.global_env", () => setupGlobalEnv(config, environment)),
|
||||
traces.$("vitest.runtime.coverage.start", () => startCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.isolate })),
|
||||
traces.$("vitest.runtime.snapshot.environment", async () => {
|
||||
if (!workerState.config.snapshotOptions.snapshotEnvironment) workerState.config.snapshotOptions.snapshotEnvironment = await resolveSnapshotEnvironment(config, moduleRunner);
|
||||
})
|
||||
]);
|
||||
workerState.onCancel((reason) => {
|
||||
closeInspector(config);
|
||||
testRunner.cancel?.(reason);
|
||||
});
|
||||
workerState.durations.prepare = performance$1.now() - workerState.durations.prepare;
|
||||
await traces.$(`vitest.test.runner.${method}`, async () => {
|
||||
for (const file of files) {
|
||||
if (config.isolate) {
|
||||
moduleRunner.mocker.reset();
|
||||
resetModules(workerState.evaluatedModules, true);
|
||||
}
|
||||
workerState.filepath = file.filepath;
|
||||
if (method === "run") await traces.$(`vitest.test.runner.${method}.module`, { attributes: { "code.file.path": file.filepath } }, () => startTests([file], testRunner));
|
||||
else await traces.$(`vitest.test.runner.${method}.module`, { attributes: { "code.file.path": file.filepath } }, () => collectTests([file], testRunner));
|
||||
// reset after tests, because user might call `vi.setConfig` in setupFile
|
||||
vi.resetConfig();
|
||||
// mocks should not affect different files
|
||||
vi.restoreAllMocks();
|
||||
}
|
||||
});
|
||||
await traces.$("vitest.runtime.coverage.stop", () => stopCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.isolate }));
|
||||
}
|
||||
|
||||
let _moduleRunner;
|
||||
const evaluatedModules = new VitestEvaluatedModules();
|
||||
const moduleExecutionInfo = /* @__PURE__ */ new Map();
|
||||
function startModuleRunner(options) {
|
||||
if (_moduleRunner) return _moduleRunner;
|
||||
_moduleRunner = startVitestModuleRunner(options);
|
||||
return _moduleRunner;
|
||||
}
|
||||
let _currentEnvironment;
|
||||
let _environmentTime;
|
||||
async function setupEnvironment(context) {
|
||||
const startTime = performance.now();
|
||||
const { environment: { name: environmentName, options: environmentOptions }, rpc, config } = context;
|
||||
// we could load @vite/env, but it would take ~8ms, while this takes ~0,02ms
|
||||
if (context.config.serializedDefines) try {
|
||||
runInThisContext(`(() =>{\n${context.config.serializedDefines}})()`, {
|
||||
lineOffset: 1,
|
||||
filename: "virtual:load-defines.js"
|
||||
});
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to load custom "defines": ${error.message}`);
|
||||
}
|
||||
const otel = context.traces;
|
||||
const { environment, loader } = await loadEnvironment(environmentName, config.root, rpc, otel);
|
||||
_currentEnvironment = environment;
|
||||
const env = await otel.$("vitest.runtime.environment.setup", { attributes: {
|
||||
"vitest.environment": environment.name,
|
||||
"vitest.environment.vite_environment": environment.viteEnvironment || environment.name
|
||||
} }, () => environment.setup(globalThis, environmentOptions || config.environmentOptions || {}));
|
||||
_environmentTime = performance.now() - startTime;
|
||||
if (config.chaiConfig) setupChaiConfig(config.chaiConfig);
|
||||
return async () => {
|
||||
await otel.$("vitest.runtime.environment.teardown", () => env.teardown(globalThis));
|
||||
await loader?.close();
|
||||
};
|
||||
}
|
||||
/** @experimental */
|
||||
async function runBaseTests(method, state, traces) {
|
||||
const { ctx } = state;
|
||||
state.environment = _currentEnvironment;
|
||||
state.durations.environment = _environmentTime;
|
||||
// state has new context, but we want to reuse existing ones
|
||||
state.evaluatedModules = evaluatedModules;
|
||||
state.moduleExecutionInfo = moduleExecutionInfo;
|
||||
provideWorkerState(globalThis, state);
|
||||
if (ctx.invalidates) ctx.invalidates.forEach((filepath) => {
|
||||
(state.evaluatedModules.fileToModulesMap.get(filepath) || []).forEach((module) => {
|
||||
state.evaluatedModules.invalidateModule(module);
|
||||
});
|
||||
});
|
||||
ctx.files.forEach((i) => {
|
||||
const filepath = i.filepath;
|
||||
(state.evaluatedModules.fileToModulesMap.get(filepath) || []).forEach((module) => {
|
||||
state.evaluatedModules.invalidateModule(module);
|
||||
});
|
||||
});
|
||||
const moduleRunner = startModuleRunner({
|
||||
state,
|
||||
evaluatedModules: state.evaluatedModules,
|
||||
spyModule,
|
||||
createImportMeta: createNodeImportMeta,
|
||||
traces
|
||||
});
|
||||
await run(method, ctx.files, ctx.config, moduleRunner, _currentEnvironment, traces);
|
||||
}
|
||||
|
||||
export { runBaseTests as r, setupEnvironment as s };
|
||||
40
node_modules/vitest/dist/chunks/benchmark.B3N2zMcH.js
generated
vendored
Normal file
40
node_modules/vitest/dist/chunks/benchmark.B3N2zMcH.js
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
import { getCurrentSuite } from '@vitest/runner';
|
||||
import { createChainable } from '@vitest/runner/utils';
|
||||
import { noop } from '@vitest/utils/helpers';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
const benchFns = /* @__PURE__ */ new WeakMap();
|
||||
const benchOptsMap = /* @__PURE__ */ new WeakMap();
|
||||
function getBenchOptions(key) {
|
||||
return benchOptsMap.get(key);
|
||||
}
|
||||
function getBenchFn(key) {
|
||||
return benchFns.get(key);
|
||||
}
|
||||
const bench = createBenchmark(function(name, fn = noop, options = {}) {
|
||||
if (getWorkerState().config.mode !== "benchmark") throw new Error("`bench()` is only available in benchmark mode.");
|
||||
const task = getCurrentSuite().task(formatName(name), {
|
||||
...this,
|
||||
meta: { benchmark: true }
|
||||
});
|
||||
benchFns.set(task, fn);
|
||||
benchOptsMap.set(task, options);
|
||||
// vitest runner sets mode to `todo` if handler is not passed down
|
||||
// but we store handler separetly
|
||||
if (!this.todo && task.mode === "todo") task.mode = "run";
|
||||
});
|
||||
function createBenchmark(fn) {
|
||||
const benchmark = createChainable([
|
||||
"skip",
|
||||
"only",
|
||||
"todo"
|
||||
], fn);
|
||||
benchmark.skipIf = (condition) => condition ? benchmark.skip : benchmark;
|
||||
benchmark.runIf = (condition) => condition ? benchmark : benchmark.skip;
|
||||
return benchmark;
|
||||
}
|
||||
function formatName(name) {
|
||||
return typeof name === "string" ? name : typeof name === "function" ? name.name || "<anonymous>" : String(name);
|
||||
}
|
||||
|
||||
export { getBenchOptions as a, bench as b, getBenchFn as g };
|
||||
24
node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts
generated
vendored
Normal file
24
node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
import { Test } from '@vitest/runner';
|
||||
import { ChainableFunction } from '@vitest/runner/utils';
|
||||
import { TaskResult, Bench, Options } from 'tinybench';
|
||||
|
||||
interface Benchmark extends Test {
|
||||
meta: {
|
||||
benchmark: true;
|
||||
result?: TaskResult;
|
||||
};
|
||||
}
|
||||
interface BenchmarkResult extends TaskResult {
|
||||
name: string;
|
||||
rank: number;
|
||||
sampleCount: number;
|
||||
median: number;
|
||||
}
|
||||
type BenchFunction = (this: Bench) => Promise<void> | void;
|
||||
type ChainableBenchmarkAPI = ChainableFunction<"skip" | "only" | "todo", (name: string | Function, fn?: BenchFunction, options?: Options) => void>;
|
||||
type BenchmarkAPI = ChainableBenchmarkAPI & {
|
||||
skipIf: (condition: any) => ChainableBenchmarkAPI;
|
||||
runIf: (condition: any) => ChainableBenchmarkAPI;
|
||||
};
|
||||
|
||||
export type { BenchmarkResult as B, BenchFunction as a, Benchmark as b, BenchmarkAPI as c };
|
||||
57
node_modules/vitest/dist/chunks/browser.d.DBzUq_Na.d.ts
generated
vendored
Normal file
57
node_modules/vitest/dist/chunks/browser.d.DBzUq_Na.d.ts
generated
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
import { FileSpecification } from '@vitest/runner';
|
||||
import { T as TestExecutionMethod } from './worker.d.B4A26qg6.js';
|
||||
|
||||
type SerializedTestSpecification = [project: {
|
||||
name: string | undefined;
|
||||
root: string;
|
||||
}, file: string, options: {
|
||||
pool: string;
|
||||
testLines?: number[] | undefined;
|
||||
}];
|
||||
|
||||
interface ModuleDefinitionLocation {
|
||||
line: number;
|
||||
column: number;
|
||||
}
|
||||
interface SourceModuleLocations {
|
||||
modules: ModuleDefinitionDiagnostic[];
|
||||
untracked: ModuleDefinitionDiagnostic[];
|
||||
}
|
||||
interface ModuleDefinitionDiagnostic {
|
||||
start: ModuleDefinitionLocation;
|
||||
end: ModuleDefinitionLocation;
|
||||
startIndex: number;
|
||||
endIndex: number;
|
||||
rawUrl: string;
|
||||
resolvedUrl: string;
|
||||
resolvedId: string;
|
||||
}
|
||||
interface ModuleDefinitionDurationsDiagnostic extends ModuleDefinitionDiagnostic {
|
||||
selfTime: number;
|
||||
totalTime: number;
|
||||
transformTime?: number;
|
||||
external?: boolean;
|
||||
importer?: string;
|
||||
}
|
||||
interface UntrackedModuleDefinitionDiagnostic {
|
||||
url: string;
|
||||
resolvedId: string;
|
||||
resolvedUrl: string;
|
||||
selfTime: number;
|
||||
totalTime: number;
|
||||
transformTime?: number;
|
||||
external?: boolean;
|
||||
importer?: string;
|
||||
}
|
||||
interface SourceModuleDiagnostic {
|
||||
modules: ModuleDefinitionDurationsDiagnostic[];
|
||||
untrackedModules: UntrackedModuleDefinitionDiagnostic[];
|
||||
}
|
||||
|
||||
interface BrowserTesterOptions {
|
||||
method: TestExecutionMethod;
|
||||
files: FileSpecification[];
|
||||
providedContext: string;
|
||||
}
|
||||
|
||||
export type { BrowserTesterOptions as B, ModuleDefinitionDurationsDiagnostic as M, SerializedTestSpecification as S, UntrackedModuleDefinitionDiagnostic as U, ModuleDefinitionDiagnostic as a, ModuleDefinitionLocation as b, SourceModuleDiagnostic as c, SourceModuleLocations as d };
|
||||
1409
node_modules/vitest/dist/chunks/cac.BNNpZQl7.js
generated
vendored
Normal file
1409
node_modules/vitest/dist/chunks/cac.BNNpZQl7.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
13570
node_modules/vitest/dist/chunks/cli-api.C7sYjHmQ.js
generated
vendored
Normal file
13570
node_modules/vitest/dist/chunks/cli-api.C7sYjHmQ.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
205
node_modules/vitest/dist/chunks/config.d.CzIjkicf.d.ts
generated
vendored
Normal file
205
node_modules/vitest/dist/chunks/config.d.CzIjkicf.d.ts
generated
vendored
Normal file
@@ -0,0 +1,205 @@
|
||||
import { PrettyFormatOptions } from '@vitest/pretty-format';
|
||||
import { SequenceHooks, SequenceSetupFiles } from '@vitest/runner';
|
||||
import { SnapshotUpdateState, SnapshotEnvironment } from '@vitest/snapshot';
|
||||
import { SerializedDiffOptions } from '@vitest/utils/diff';
|
||||
|
||||
/**
|
||||
* Names of clock methods that may be faked by install.
|
||||
*/
|
||||
type FakeMethod =
|
||||
| "setTimeout"
|
||||
| "clearTimeout"
|
||||
| "setImmediate"
|
||||
| "clearImmediate"
|
||||
| "setInterval"
|
||||
| "clearInterval"
|
||||
| "Date"
|
||||
| "nextTick"
|
||||
| "hrtime"
|
||||
| "requestAnimationFrame"
|
||||
| "cancelAnimationFrame"
|
||||
| "requestIdleCallback"
|
||||
| "cancelIdleCallback"
|
||||
| "performance"
|
||||
| "queueMicrotask";
|
||||
|
||||
interface FakeTimerInstallOpts {
|
||||
/**
|
||||
* Installs fake timers with the specified unix epoch (default: 0)
|
||||
*/
|
||||
now?: number | Date | undefined;
|
||||
|
||||
/**
|
||||
* An array with names of global methods and APIs to fake.
|
||||
* For instance, `vi.useFakeTimer({ toFake: ['setTimeout', 'performance'] })` will fake only `setTimeout()` and `performance.now()`
|
||||
* @default everything available globally except `nextTick`
|
||||
*/
|
||||
toFake?: FakeMethod[] | undefined;
|
||||
|
||||
/**
|
||||
* The maximum number of timers that will be run when calling runAll()
|
||||
* @default 10000
|
||||
*/
|
||||
loopLimit?: number | undefined;
|
||||
|
||||
/**
|
||||
* Tells @sinonjs/fake-timers to increment mocked time automatically based on the real system time shift (e.g. the mocked time will be incremented by
|
||||
* 20ms for every 20ms change in the real system time) (default: false)
|
||||
*/
|
||||
shouldAdvanceTime?: boolean | undefined;
|
||||
|
||||
/**
|
||||
* Relevant only when using with shouldAdvanceTime: true. increment mocked time by advanceTimeDelta ms every advanceTimeDelta ms change
|
||||
* in the real system time (default: 20)
|
||||
*/
|
||||
advanceTimeDelta?: number | undefined;
|
||||
|
||||
/**
|
||||
* Tells FakeTimers to clear 'native' (i.e. not fake) timers by delegating to their respective handlers.
|
||||
* @default true
|
||||
*/
|
||||
shouldClearNativeTimers?: boolean | undefined;
|
||||
|
||||
/**
|
||||
* Don't throw error when asked to fake timers that are not present.
|
||||
* @default false
|
||||
*/
|
||||
ignoreMissingTimers?: boolean | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Config that tests have access to.
|
||||
*/
|
||||
interface SerializedConfig {
|
||||
name: string | undefined;
|
||||
globals: boolean;
|
||||
base: string | undefined;
|
||||
snapshotEnvironment?: string;
|
||||
disableConsoleIntercept: boolean | undefined;
|
||||
runner: string | undefined;
|
||||
isolate: boolean;
|
||||
maxWorkers: number;
|
||||
mode: "test" | "benchmark";
|
||||
bail: number | undefined;
|
||||
environmentOptions?: Record<string, any>;
|
||||
root: string;
|
||||
setupFiles: string[];
|
||||
passWithNoTests: boolean;
|
||||
testNamePattern: RegExp | undefined;
|
||||
allowOnly: boolean;
|
||||
testTimeout: number;
|
||||
hookTimeout: number;
|
||||
clearMocks: boolean;
|
||||
mockReset: boolean;
|
||||
restoreMocks: boolean;
|
||||
unstubGlobals: boolean;
|
||||
unstubEnvs: boolean;
|
||||
fakeTimers: FakeTimerInstallOpts;
|
||||
maxConcurrency: number;
|
||||
defines: Record<string, any>;
|
||||
expect: {
|
||||
requireAssertions?: boolean;
|
||||
poll?: {
|
||||
timeout?: number;
|
||||
interval?: number;
|
||||
};
|
||||
};
|
||||
printConsoleTrace: boolean | undefined;
|
||||
sequence: {
|
||||
shuffle?: boolean;
|
||||
concurrent?: boolean;
|
||||
seed: number;
|
||||
hooks: SequenceHooks;
|
||||
setupFiles: SequenceSetupFiles;
|
||||
};
|
||||
deps: {
|
||||
web: {
|
||||
transformAssets?: boolean;
|
||||
transformCss?: boolean;
|
||||
transformGlobPattern?: RegExp | RegExp[];
|
||||
};
|
||||
optimizer: Record<string, {
|
||||
enabled: boolean;
|
||||
}>;
|
||||
interopDefault: boolean | undefined;
|
||||
moduleDirectories: string[] | undefined;
|
||||
};
|
||||
snapshotOptions: {
|
||||
updateSnapshot: SnapshotUpdateState;
|
||||
expand: boolean | undefined;
|
||||
snapshotFormat: PrettyFormatOptions | undefined;
|
||||
/**
|
||||
* only exists for tests, not available in the main process
|
||||
*/
|
||||
snapshotEnvironment: SnapshotEnvironment;
|
||||
};
|
||||
pool: string;
|
||||
snapshotSerializers: string[];
|
||||
chaiConfig: {
|
||||
includeStack?: boolean;
|
||||
showDiff?: boolean;
|
||||
truncateThreshold?: number;
|
||||
} | undefined;
|
||||
diff: string | SerializedDiffOptions | undefined;
|
||||
retry: number;
|
||||
includeTaskLocation: boolean | undefined;
|
||||
inspect: boolean | string | undefined;
|
||||
inspectBrk: boolean | string | undefined;
|
||||
inspector: {
|
||||
enabled?: boolean;
|
||||
port?: number;
|
||||
host?: string;
|
||||
waitForDebugger?: boolean;
|
||||
};
|
||||
watch: boolean;
|
||||
env: Record<string, any>;
|
||||
browser: {
|
||||
name: string;
|
||||
headless: boolean;
|
||||
isolate: boolean;
|
||||
fileParallelism: boolean;
|
||||
ui: boolean;
|
||||
viewport: {
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
locators: {
|
||||
testIdAttribute: string;
|
||||
};
|
||||
screenshotFailures: boolean;
|
||||
providerOptions: {
|
||||
actionTimeout?: number;
|
||||
};
|
||||
trace: BrowserTraceViewMode;
|
||||
trackUnhandledErrors: boolean;
|
||||
};
|
||||
standalone: boolean;
|
||||
logHeapUsage: boolean | undefined;
|
||||
coverage: SerializedCoverageConfig;
|
||||
benchmark: {
|
||||
includeSamples: boolean;
|
||||
} | undefined;
|
||||
serializedDefines: string;
|
||||
experimental: {
|
||||
fsModuleCache: boolean;
|
||||
printImportBreakdown: boolean | undefined;
|
||||
};
|
||||
}
|
||||
interface SerializedCoverageConfig {
|
||||
provider: "istanbul" | "v8" | "custom" | undefined;
|
||||
reportsDirectory: string;
|
||||
htmlReporter: {
|
||||
subdir: string | undefined;
|
||||
} | undefined;
|
||||
enabled: boolean;
|
||||
customProviderModule: string | undefined;
|
||||
}
|
||||
type RuntimeConfig = Pick<SerializedConfig, "allowOnly" | "testTimeout" | "hookTimeout" | "clearMocks" | "mockReset" | "restoreMocks" | "fakeTimers" | "maxConcurrency" | "expect" | "printConsoleTrace"> & {
|
||||
sequence?: {
|
||||
hooks?: SequenceHooks;
|
||||
};
|
||||
};
|
||||
type RuntimeOptions = Partial<RuntimeConfig>;
|
||||
type BrowserTraceViewMode = "on" | "off" | "on-first-retry" | "on-all-retries" | "retain-on-failure";
|
||||
|
||||
export type { BrowserTraceViewMode as B, FakeTimerInstallOpts as F, RuntimeOptions as R, SerializedConfig as S, SerializedCoverageConfig as a, RuntimeConfig as b };
|
||||
146
node_modules/vitest/dist/chunks/console.Cf-YriPC.js
generated
vendored
Normal file
146
node_modules/vitest/dist/chunks/console.Cf-YriPC.js
generated
vendored
Normal file
@@ -0,0 +1,146 @@
|
||||
import { Console } from 'node:console';
|
||||
import { relative } from 'node:path';
|
||||
import { Writable } from 'node:stream';
|
||||
import { getSafeTimers } from '@vitest/utils/timers';
|
||||
import c from 'tinyrainbow';
|
||||
import { R as RealDate } from './date.Bq6ZW5rf.js';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
const UNKNOWN_TEST_ID = "__vitest__unknown_test__";
|
||||
function getTaskIdByStack(root) {
|
||||
const stack = (/* @__PURE__ */ new Error("STACK_TRACE_ERROR")).stack?.split("\n");
|
||||
if (!stack) return UNKNOWN_TEST_ID;
|
||||
const index = stack.findIndex((line) => line.includes("at Console.value"));
|
||||
const line = index === -1 ? null : stack[index + 2];
|
||||
if (!line) return UNKNOWN_TEST_ID;
|
||||
const filepath = line.match(/at\s(.*)\s?/)?.[1];
|
||||
if (filepath) return relative(root, filepath);
|
||||
return UNKNOWN_TEST_ID;
|
||||
}
|
||||
function createCustomConsole(defaultState) {
|
||||
const stdoutBuffer = /* @__PURE__ */ new Map();
|
||||
const stderrBuffer = /* @__PURE__ */ new Map();
|
||||
const timers = /* @__PURE__ */ new Map();
|
||||
const { queueMicrotask } = getSafeTimers();
|
||||
function queueCancelableMicrotask(callback) {
|
||||
let canceled = false;
|
||||
queueMicrotask(() => {
|
||||
if (!canceled) callback();
|
||||
});
|
||||
return () => {
|
||||
canceled = true;
|
||||
};
|
||||
}
|
||||
const state = () => defaultState || getWorkerState();
|
||||
// group sync console.log calls with micro task
|
||||
function schedule(taskId) {
|
||||
const timer = timers.get(taskId);
|
||||
const { stdoutTime, stderrTime } = timer;
|
||||
timer.cancel?.();
|
||||
timer.cancel = queueCancelableMicrotask(() => {
|
||||
if (stderrTime < stdoutTime) {
|
||||
sendStderr(taskId);
|
||||
sendStdout(taskId);
|
||||
} else {
|
||||
sendStdout(taskId);
|
||||
sendStderr(taskId);
|
||||
}
|
||||
});
|
||||
}
|
||||
function sendStdout(taskId) {
|
||||
sendBuffer("stdout", taskId);
|
||||
}
|
||||
function sendStderr(taskId) {
|
||||
sendBuffer("stderr", taskId);
|
||||
}
|
||||
function sendBuffer(type, taskId) {
|
||||
const buffers = type === "stdout" ? stdoutBuffer : stderrBuffer;
|
||||
const buffer = buffers.get(taskId);
|
||||
if (!buffer) return;
|
||||
if (state().config.printConsoleTrace) buffer.forEach(([buffer, origin]) => {
|
||||
sendLog(type, taskId, String(buffer), buffer.length, origin);
|
||||
});
|
||||
else sendLog(type, taskId, buffer.map((i) => String(i[0])).join(""), buffer.length);
|
||||
const timer = timers.get(taskId);
|
||||
buffers.delete(taskId);
|
||||
if (type === "stderr") timer.stderrTime = 0;
|
||||
else timer.stdoutTime = 0;
|
||||
}
|
||||
function sendLog(type, taskId, content, size, origin) {
|
||||
const timer = timers.get(taskId);
|
||||
const time = type === "stderr" ? timer.stderrTime : timer.stdoutTime;
|
||||
state().rpc.onUserConsoleLog({
|
||||
type,
|
||||
content: content || "<empty line>",
|
||||
taskId,
|
||||
time: time || RealDate.now(),
|
||||
size,
|
||||
origin
|
||||
});
|
||||
}
|
||||
return new Console({
|
||||
stdout: new Writable({ write(data, encoding, callback) {
|
||||
const s = state();
|
||||
const id = s?.current?.id || s?.current?.suite?.id || s.current?.file.id || getTaskIdByStack(s.config.root);
|
||||
let timer = timers.get(id);
|
||||
if (timer) timer.stdoutTime = timer.stdoutTime || RealDate.now();
|
||||
else {
|
||||
timer = {
|
||||
stdoutTime: RealDate.now(),
|
||||
stderrTime: RealDate.now()
|
||||
};
|
||||
timers.set(id, timer);
|
||||
}
|
||||
let buffer = stdoutBuffer.get(id);
|
||||
if (!buffer) {
|
||||
buffer = [];
|
||||
stdoutBuffer.set(id, buffer);
|
||||
}
|
||||
if (state().config.printConsoleTrace) {
|
||||
const limit = Error.stackTraceLimit;
|
||||
Error.stackTraceLimit = limit + 6;
|
||||
const trace = (/* @__PURE__ */ new Error("STACK_TRACE")).stack?.split("\n").slice(7).join("\n");
|
||||
Error.stackTraceLimit = limit;
|
||||
buffer.push([data, trace]);
|
||||
} else buffer.push([data, void 0]);
|
||||
schedule(id);
|
||||
callback();
|
||||
} }),
|
||||
stderr: new Writable({ write(data, encoding, callback) {
|
||||
const s = state();
|
||||
const id = s?.current?.id || s?.current?.suite?.id || s.current?.file.id || getTaskIdByStack(s.config.root);
|
||||
let timer = timers.get(id);
|
||||
if (timer) timer.stderrTime = timer.stderrTime || RealDate.now();
|
||||
else {
|
||||
timer = {
|
||||
stderrTime: RealDate.now(),
|
||||
stdoutTime: RealDate.now()
|
||||
};
|
||||
timers.set(id, timer);
|
||||
}
|
||||
let buffer = stderrBuffer.get(id);
|
||||
if (!buffer) {
|
||||
buffer = [];
|
||||
stderrBuffer.set(id, buffer);
|
||||
}
|
||||
if (state().config.printConsoleTrace) {
|
||||
const limit = Error.stackTraceLimit;
|
||||
Error.stackTraceLimit = limit + 6;
|
||||
const stack = (/* @__PURE__ */ new Error("STACK_TRACE")).stack?.split("\n");
|
||||
Error.stackTraceLimit = limit;
|
||||
if (stack?.some((line) => line.includes("at Console.trace"))) buffer.push([data, void 0]);
|
||||
else {
|
||||
const trace = stack?.slice(7).join("\n");
|
||||
Error.stackTraceLimit = limit;
|
||||
buffer.push([data, trace]);
|
||||
}
|
||||
} else buffer.push([data, void 0]);
|
||||
schedule(id);
|
||||
callback();
|
||||
} }),
|
||||
colorMode: c.isColorSupported,
|
||||
groupIndentation: 2
|
||||
});
|
||||
}
|
||||
|
||||
export { UNKNOWN_TEST_ID, createCustomConsole };
|
||||
36
node_modules/vitest/dist/chunks/constants.D_Q9UYh-.js
generated
vendored
Normal file
36
node_modules/vitest/dist/chunks/constants.D_Q9UYh-.js
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
// if changed, update also jsdocs and docs
|
||||
const defaultPort = 51204;
|
||||
const defaultBrowserPort = 63315;
|
||||
const defaultInspectPort = 9229;
|
||||
const API_PATH = "/__vitest_api__";
|
||||
const CONFIG_NAMES = ["vitest.config", "vite.config"];
|
||||
const CONFIG_EXTENSIONS = [
|
||||
".ts",
|
||||
".mts",
|
||||
".cts",
|
||||
".js",
|
||||
".mjs",
|
||||
".cjs"
|
||||
];
|
||||
const configFiles = CONFIG_NAMES.flatMap((name) => CONFIG_EXTENSIONS.map((ext) => name + ext));
|
||||
const globalApis = [
|
||||
"suite",
|
||||
"test",
|
||||
"describe",
|
||||
"it",
|
||||
"chai",
|
||||
"expect",
|
||||
"assert",
|
||||
"expectTypeOf",
|
||||
"assertType",
|
||||
"vitest",
|
||||
"vi",
|
||||
"beforeAll",
|
||||
"afterAll",
|
||||
"beforeEach",
|
||||
"afterEach",
|
||||
"onTestFinished",
|
||||
"onTestFailed"
|
||||
];
|
||||
|
||||
export { API_PATH as A, defaultPort as a, defaultInspectPort as b, configFiles as c, defaultBrowserPort as d, globalApis as g };
|
||||
3287
node_modules/vitest/dist/chunks/coverage.CtyeYmKM.js
generated
vendored
Normal file
3287
node_modules/vitest/dist/chunks/coverage.CtyeYmKM.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
25
node_modules/vitest/dist/chunks/coverage.D_JHT54q.js
generated
vendored
Normal file
25
node_modules/vitest/dist/chunks/coverage.D_JHT54q.js
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
const CoverageProviderMap = {
|
||||
v8: "@vitest/coverage-v8",
|
||||
istanbul: "@vitest/coverage-istanbul"
|
||||
};
|
||||
async function resolveCoverageProviderModule(options, loader) {
|
||||
if (!options?.enabled || !options.provider) return null;
|
||||
const provider = options.provider;
|
||||
if (provider === "v8" || provider === "istanbul") {
|
||||
let builtInModule = CoverageProviderMap[provider];
|
||||
if (provider === "v8" && loader.isBrowser) builtInModule += "/browser";
|
||||
const { default: coverageModule } = await loader.import(builtInModule);
|
||||
if (!coverageModule) throw new Error(`Failed to load ${CoverageProviderMap[provider]}. Default export is missing.`);
|
||||
return coverageModule;
|
||||
}
|
||||
let customProviderModule;
|
||||
try {
|
||||
customProviderModule = await loader.import(options.customProviderModule);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to load custom CoverageProviderModule from ${options.customProviderModule}`, { cause: error });
|
||||
}
|
||||
if (customProviderModule.default == null) throw new Error(`Custom CoverageProviderModule loaded from ${options.customProviderModule} was not the default export`);
|
||||
return customProviderModule.default;
|
||||
}
|
||||
|
||||
export { CoverageProviderMap as C, resolveCoverageProviderModule as r };
|
||||
37
node_modules/vitest/dist/chunks/coverage.d.BZtK59WP.d.ts
generated
vendored
Normal file
37
node_modules/vitest/dist/chunks/coverage.d.BZtK59WP.d.ts
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
interface RuntimeCoverageModuleLoader {
|
||||
import: (id: string) => Promise<{
|
||||
default: RuntimeCoverageProviderModule;
|
||||
}>;
|
||||
isBrowser?: boolean;
|
||||
moduleExecutionInfo?: Map<string, {
|
||||
startOffset: number;
|
||||
}>;
|
||||
}
|
||||
interface RuntimeCoverageProviderModule {
|
||||
/**
|
||||
* Factory for creating a new coverage provider
|
||||
*/
|
||||
getProvider: () => any;
|
||||
/**
|
||||
* Executed before tests are run in the worker thread.
|
||||
*/
|
||||
startCoverage?: (runtimeOptions: {
|
||||
isolate: boolean;
|
||||
}) => unknown | Promise<unknown>;
|
||||
/**
|
||||
* Executed on after each run in the worker thread. Possible to return a payload passed to the provider
|
||||
*/
|
||||
takeCoverage?: (runtimeOptions?: {
|
||||
moduleExecutionInfo?: Map<string, {
|
||||
startOffset: number;
|
||||
}>;
|
||||
}) => unknown | Promise<unknown>;
|
||||
/**
|
||||
* Executed after all tests have been run in the worker thread.
|
||||
*/
|
||||
stopCoverage?: (runtimeOptions: {
|
||||
isolate: boolean;
|
||||
}) => unknown | Promise<unknown>;
|
||||
}
|
||||
|
||||
export type { RuntimeCoverageModuleLoader as R, RuntimeCoverageProviderModule as a };
|
||||
673
node_modules/vitest/dist/chunks/creator.DAmOKTvJ.js
generated
vendored
Normal file
673
node_modules/vitest/dist/chunks/creator.DAmOKTvJ.js
generated
vendored
Normal file
@@ -0,0 +1,673 @@
|
||||
import { existsSync, writeFileSync, readFileSync } from 'node:fs';
|
||||
import { mkdir, writeFile } from 'node:fs/promises';
|
||||
import { resolve, dirname, relative } from 'node:path';
|
||||
import { detectPackageManager, installPackage } from './index.D3XRDfWc.js';
|
||||
import { p as prompt, a as any } from './index.D4KonVSU.js';
|
||||
import { x } from 'tinyexec';
|
||||
import c from 'tinyrainbow';
|
||||
import { c as configFiles } from './constants.D_Q9UYh-.js';
|
||||
import 'node:process';
|
||||
import 'node:module';
|
||||
import 'node:url';
|
||||
import './_commonjsHelpers.D26ty3Ew.js';
|
||||
import 'readline';
|
||||
import 'events';
|
||||
|
||||
const jsxExample = {
|
||||
name: "HelloWorld.jsx",
|
||||
js: `
|
||||
export default function HelloWorld({ name }) {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello {name}!</h1>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
`,
|
||||
ts: `
|
||||
export default function HelloWorld({ name }: { name: string }) {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello {name}!</h1>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from '@testing-library/jsx'
|
||||
import HelloWorld from './HelloWorld.<EXT>x'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = await render(<HelloWorld name="Vitest" />)
|
||||
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const vueExample = {
|
||||
name: "HelloWorld.vue",
|
||||
js: `
|
||||
<script setup>
|
||||
defineProps({
|
||||
name: String
|
||||
})
|
||||
<\/script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<h1>Hello {{ name }}!</h1>
|
||||
</div>
|
||||
</template>
|
||||
`,
|
||||
ts: `
|
||||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
name: string
|
||||
}>()
|
||||
<\/script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<h1>Hello {{ name }}!</h1>
|
||||
</div>
|
||||
</template>
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from 'vitest-browser-vue'
|
||||
import HelloWorld from './HelloWorld.vue'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = render(HelloWorld, {
|
||||
props: { name: 'Vitest' },
|
||||
})
|
||||
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const svelteExample = {
|
||||
name: "HelloWorld.svelte",
|
||||
js: `
|
||||
<script>
|
||||
export let name
|
||||
<\/script>
|
||||
|
||||
<h1>Hello {name}!</h1>
|
||||
`,
|
||||
ts: `
|
||||
<script lang="ts">
|
||||
export let name: string
|
||||
<\/script>
|
||||
|
||||
<h1>Hello {name}!</h1>
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from 'vitest-browser-svelte'
|
||||
import HelloWorld from './HelloWorld.svelte'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = render(HelloWorld, { name: 'Vitest' })
|
||||
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const markoExample = {
|
||||
name: "HelloWorld.marko",
|
||||
js: `
|
||||
class {
|
||||
onCreate() {
|
||||
this.state = { name: null }
|
||||
}
|
||||
}
|
||||
|
||||
<h1>Hello \${state.name}!</h1>
|
||||
`,
|
||||
ts: `
|
||||
export interface Input {
|
||||
name: string
|
||||
}
|
||||
|
||||
<h1>Hello \${input.name}!</h1>
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from '@marko/testing-library'
|
||||
import HelloWorld from './HelloWorld.svelte'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = await render(HelloWorld, { name: 'Vitest' })
|
||||
const element = getByText('Hello Vitest!')
|
||||
expect(element).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const litExample = {
|
||||
name: "HelloWorld.js",
|
||||
js: `
|
||||
import { html, LitElement } from 'lit'
|
||||
|
||||
export class HelloWorld extends LitElement {
|
||||
static properties = {
|
||||
name: { type: String },
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.name = 'World'
|
||||
}
|
||||
|
||||
render() {
|
||||
return html\`<h1>Hello \${this.name}!</h1>\`
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define('hello-world', HelloWorld)
|
||||
`,
|
||||
ts: `
|
||||
import { html, LitElement } from 'lit'
|
||||
import { customElement, property } from 'lit/decorators.js'
|
||||
|
||||
@customElement('hello-world')
|
||||
export class HelloWorld extends LitElement {
|
||||
@property({ type: String })
|
||||
name = 'World'
|
||||
|
||||
render() {
|
||||
return html\`<h1>Hello \${this.name}!</h1>\`
|
||||
}
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'hello-world': HelloWorld
|
||||
}
|
||||
}
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from 'vitest-browser-lit'
|
||||
import { html } from 'lit'
|
||||
import './HelloWorld.js'
|
||||
|
||||
test('renders name', async () => {
|
||||
const screen = render(html\`<hello-world name="Vitest"></hello-world>\`)
|
||||
const element = screen.getByText('Hello Vitest!')
|
||||
await expect.element(element).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const qwikExample = {
|
||||
name: "HelloWorld.jsx",
|
||||
js: `
|
||||
import { component$ } from '@builder.io/qwik'
|
||||
|
||||
export default component$(({ name }) => {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello {name}!</h1>
|
||||
</div>
|
||||
)
|
||||
})
|
||||
`,
|
||||
ts: `
|
||||
import { component$ } from '@builder.io/qwik'
|
||||
|
||||
export default component$(({ name }: { name: string }) => {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello {name}!</h1>
|
||||
</div>
|
||||
)
|
||||
})
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from 'vitest-browser-qwik'
|
||||
import HelloWorld from './HelloWorld.tsx'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = render(<HelloWorld name="Vitest" />)
|
||||
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const vanillaExample = {
|
||||
name: "HelloWorld.js",
|
||||
js: `
|
||||
export default function HelloWorld({ name }) {
|
||||
const parent = document.createElement('div')
|
||||
|
||||
const h1 = document.createElement('h1')
|
||||
h1.textContent = 'Hello ' + name + '!'
|
||||
parent.appendChild(h1)
|
||||
|
||||
return parent
|
||||
}
|
||||
`,
|
||||
ts: `
|
||||
export default function HelloWorld({ name }: { name: string }): HTMLDivElement {
|
||||
const parent = document.createElement('div')
|
||||
|
||||
const h1 = document.createElement('h1')
|
||||
h1.textContent = 'Hello ' + name + '!'
|
||||
parent.appendChild(h1)
|
||||
|
||||
return parent
|
||||
}
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { getByText } from '@testing-library/dom'
|
||||
import HelloWorld from './HelloWorld.js'
|
||||
|
||||
test('renders name', () => {
|
||||
const parent = HelloWorld({ name: 'Vitest' })
|
||||
document.body.appendChild(parent)
|
||||
|
||||
const element = getByText(parent, 'Hello Vitest!')
|
||||
expect(element).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
function getExampleTest(framework) {
|
||||
switch (framework) {
|
||||
case "solid": return {
|
||||
...jsxExample,
|
||||
test: jsxExample.test.replace("@testing-library/jsx", `@testing-library/${framework}`)
|
||||
};
|
||||
case "preact":
|
||||
case "react": return {
|
||||
...jsxExample,
|
||||
test: jsxExample.test.replace("@testing-library/jsx", `vitest-browser-${framework}`)
|
||||
};
|
||||
case "vue": return vueExample;
|
||||
case "svelte": return svelteExample;
|
||||
case "lit": return litExample;
|
||||
case "marko": return markoExample;
|
||||
case "qwik": return qwikExample;
|
||||
default: return vanillaExample;
|
||||
}
|
||||
}
|
||||
async function generateExampleFiles(framework, lang) {
|
||||
const example = getExampleTest(framework);
|
||||
let fileName = example.name;
|
||||
const folder = resolve(process.cwd(), "vitest-example");
|
||||
const fileContent = example[lang];
|
||||
if (!existsSync(folder)) await mkdir(folder, { recursive: true });
|
||||
const isJSX = fileName.endsWith(".jsx");
|
||||
if (isJSX && lang === "ts") fileName = fileName.replace(".jsx", ".tsx");
|
||||
else if (fileName.endsWith(".js") && lang === "ts") fileName = fileName.replace(".js", ".ts");
|
||||
example.test = example.test.replace("<EXT>", lang);
|
||||
const filePath = resolve(folder, fileName);
|
||||
const testPath = resolve(folder, `HelloWorld.test.${isJSX ? `${lang}x` : lang}`);
|
||||
writeFileSync(filePath, fileContent.trimStart(), "utf-8");
|
||||
writeFileSync(testPath, example.test.trimStart(), "utf-8");
|
||||
return testPath;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
const log = console.log;
|
||||
function getProviderOptions() {
|
||||
return Object.entries({
|
||||
playwright: "Playwright relies on Chrome DevTools protocol. Read more: https://playwright.dev",
|
||||
webdriverio: "WebdriverIO uses WebDriver protocol. Read more: https://webdriver.io",
|
||||
preview: "Preview is useful to quickly run your tests in the browser, but not suitable for CI."
|
||||
}).map(([provider, description]) => {
|
||||
return {
|
||||
title: provider,
|
||||
description,
|
||||
value: provider
|
||||
};
|
||||
});
|
||||
}
|
||||
function getBrowserNames(provider) {
|
||||
switch (provider) {
|
||||
case "webdriverio": return [
|
||||
"chrome",
|
||||
"firefox",
|
||||
"edge",
|
||||
"safari"
|
||||
];
|
||||
case "playwright": return [
|
||||
"chromium",
|
||||
"firefox",
|
||||
"webkit"
|
||||
];
|
||||
case "preview": return [
|
||||
"chrome",
|
||||
"firefox",
|
||||
"safari"
|
||||
];
|
||||
}
|
||||
}
|
||||
function getFramework() {
|
||||
return [
|
||||
{
|
||||
title: "vanilla",
|
||||
value: "vanilla",
|
||||
description: "No framework, just plain JavaScript or TypeScript."
|
||||
},
|
||||
{
|
||||
title: "vue",
|
||||
value: "vue",
|
||||
description: "\"The Progressive JavaScript Framework\""
|
||||
},
|
||||
{
|
||||
title: "svelte",
|
||||
value: "svelte",
|
||||
description: "\"Svelte: cybernetically enhanced web apps\""
|
||||
},
|
||||
{
|
||||
title: "react",
|
||||
value: "react",
|
||||
description: "\"The library for web and native user interfaces\""
|
||||
},
|
||||
{
|
||||
title: "lit",
|
||||
value: "lit",
|
||||
description: "\"A simple library for building fast, lightweight web components.\""
|
||||
},
|
||||
{
|
||||
title: "preact",
|
||||
value: "preact",
|
||||
description: "\"Fast 3kB alternative to React with the same modern API\""
|
||||
},
|
||||
{
|
||||
title: "solid",
|
||||
value: "solid",
|
||||
description: "\"Simple and performant reactivity for building user interfaces\""
|
||||
},
|
||||
{
|
||||
title: "marko",
|
||||
value: "marko",
|
||||
description: "\"A declarative, HTML-based language that makes building web apps fun\""
|
||||
},
|
||||
{
|
||||
title: "qwik",
|
||||
value: "qwik",
|
||||
description: "\"Instantly interactive web apps at scale\""
|
||||
}
|
||||
];
|
||||
}
|
||||
function getFrameworkTestPackage(framework) {
|
||||
switch (framework) {
|
||||
case "vanilla": return null;
|
||||
case "vue": return "vitest-browser-vue";
|
||||
case "svelte": return "vitest-browser-svelte";
|
||||
case "react": return "vitest-browser-react";
|
||||
case "lit": return "vitest-browser-lit";
|
||||
case "preact": return "vitest-browser-preact";
|
||||
case "solid": return "@solidjs/testing-library";
|
||||
case "marko": return "@marko/testing-library";
|
||||
case "qwik": return "vitest-browser-qwik";
|
||||
}
|
||||
throw new Error(`Unsupported framework: ${framework}`);
|
||||
}
|
||||
function getFrameworkPluginPackage(framework) {
|
||||
switch (framework) {
|
||||
case "vue": return "@vitejs/plugin-vue";
|
||||
case "svelte": return "@sveltejs/vite-plugin-svelte";
|
||||
case "react": return "@vitejs/plugin-react";
|
||||
case "preact": return "@preact/preset-vite";
|
||||
case "solid": return "vite-plugin-solid";
|
||||
case "marko": return "@marko/vite";
|
||||
case "qwik": return "@builder.io/qwik/optimizer";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function getLanguageOptions() {
|
||||
return [{
|
||||
title: "TypeScript",
|
||||
description: "Use TypeScript.",
|
||||
value: "ts"
|
||||
}, {
|
||||
title: "JavaScript",
|
||||
description: "Use plain JavaScript.",
|
||||
value: "js"
|
||||
}];
|
||||
}
|
||||
async function installPackages(pkgManager, packages) {
|
||||
if (!packages.length) {
|
||||
log(c.green("✔"), c.bold("All packages are already installed."));
|
||||
return;
|
||||
}
|
||||
log(c.cyan("◼"), c.bold("Installing packages..."));
|
||||
log(c.cyan("◼"), packages.join(", "));
|
||||
log();
|
||||
await installPackage(packages, {
|
||||
dev: true,
|
||||
packageManager: pkgManager ?? void 0
|
||||
});
|
||||
}
|
||||
function readPkgJson(path) {
|
||||
if (!existsSync(path)) return null;
|
||||
const content = readFileSync(path, "utf-8");
|
||||
return JSON.parse(content);
|
||||
}
|
||||
function getPossibleDefaults(dependencies) {
|
||||
return {
|
||||
lang: "ts",
|
||||
provider: getPossibleProvider(dependencies),
|
||||
framework: getPossibleFramework(dependencies)
|
||||
};
|
||||
}
|
||||
function getPossibleFramework(dependencies) {
|
||||
if (dependencies.vue || dependencies["vue-tsc"] || dependencies["@vue/reactivity"]) return "vue";
|
||||
if (dependencies.react || dependencies["react-dom"]) return "react";
|
||||
if (dependencies.svelte || dependencies["@sveltejs/kit"]) return "svelte";
|
||||
if (dependencies.lit || dependencies["lit-html"]) return "lit";
|
||||
if (dependencies.preact) return "preact";
|
||||
if (dependencies["solid-js"] || dependencies["@solidjs/start"]) return "solid";
|
||||
if (dependencies.marko) return "marko";
|
||||
if (dependencies["@builder.io/qwik"] || dependencies["@qwik.dev/core"]) return "qwik";
|
||||
return "vanilla";
|
||||
}
|
||||
function getPossibleProvider(dependencies) {
|
||||
if (dependencies.webdriverio || dependencies["@wdio/cli"] || dependencies["@wdio/config"]) return "webdriverio";
|
||||
// playwright is the default recommendation
|
||||
return "playwright";
|
||||
}
|
||||
function getProviderDocsLink(provider) {
|
||||
switch (provider) {
|
||||
case "playwright": return "https://vitest.dev/config/browser/playwright";
|
||||
case "webdriverio": return "https://vitest.dev/config/browser/webdriverio";
|
||||
}
|
||||
}
|
||||
function sort(choices, value) {
|
||||
const index = choices.findIndex((i) => i.value === value);
|
||||
if (index === -1) return choices;
|
||||
return [choices.splice(index, 1)[0], ...choices];
|
||||
}
|
||||
function fail() {
|
||||
process.exitCode = 1;
|
||||
}
|
||||
function getFrameworkImportInfo(framework) {
|
||||
switch (framework) {
|
||||
case "svelte": return {
|
||||
importName: "svelte",
|
||||
isNamedExport: true
|
||||
};
|
||||
case "qwik": return {
|
||||
importName: "qwikVite",
|
||||
isNamedExport: true
|
||||
};
|
||||
default: return {
|
||||
importName: framework,
|
||||
isNamedExport: false
|
||||
};
|
||||
}
|
||||
}
|
||||
async function generateFrameworkConfigFile(options) {
|
||||
const { importName, isNamedExport } = getFrameworkImportInfo(options.framework);
|
||||
const frameworkImport = isNamedExport ? `import { ${importName} } from '${options.frameworkPlugin}'` : `import ${importName} from '${options.frameworkPlugin}'`;
|
||||
const configContent = [
|
||||
`import { defineConfig } from 'vitest/config'`,
|
||||
`import { ${options.provider} } from '@vitest/browser-${options.provider}'`,
|
||||
options.frameworkPlugin ? frameworkImport : null,
|
||||
``,
|
||||
"export default defineConfig({",
|
||||
options.frameworkPlugin ? ` plugins: [${importName}()],` : null,
|
||||
` test: {`,
|
||||
` browser: {`,
|
||||
` enabled: true,`,
|
||||
` provider: ${options.provider}(),`,
|
||||
options.provider !== "preview" && ` // ${getProviderDocsLink(options.provider)}`,
|
||||
` instances: [`,
|
||||
...options.browsers.map((browser) => ` { browser: '${browser}' },`),
|
||||
` ],`,
|
||||
` },`,
|
||||
` },`,
|
||||
`})`,
|
||||
""
|
||||
].filter((t) => typeof t === "string").join("\n");
|
||||
await writeFile(options.configPath, configContent);
|
||||
}
|
||||
async function updatePkgJsonScripts(pkgJsonPath, vitestScript) {
|
||||
if (!existsSync(pkgJsonPath)) {
|
||||
const pkg = { scripts: { "test:browser": vitestScript } };
|
||||
await writeFile(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
|
||||
} else {
|
||||
const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
|
||||
pkg.scripts = pkg.scripts || {};
|
||||
pkg.scripts["test:browser"] = vitestScript;
|
||||
await writeFile(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
|
||||
}
|
||||
log(c.green("✔"), "Added \"test:browser\" script to your package.json.");
|
||||
}
|
||||
function getRunScript(pkgManager) {
|
||||
switch (pkgManager) {
|
||||
case "yarn@berry":
|
||||
case "yarn": return "yarn test:browser";
|
||||
case "pnpm@6":
|
||||
case "pnpm": return "pnpm test:browser";
|
||||
case "bun": return "bun test:browser";
|
||||
default: return "npm run test:browser";
|
||||
}
|
||||
}
|
||||
function getPlaywrightRunArgs(pkgManager) {
|
||||
switch (pkgManager) {
|
||||
case "yarn@berry":
|
||||
case "yarn": return ["yarn", "exec"];
|
||||
case "pnpm@6":
|
||||
case "pnpm": return ["pnpx"];
|
||||
case "bun": return ["bunx"];
|
||||
default: return ["npx"];
|
||||
}
|
||||
}
|
||||
async function create() {
|
||||
log(c.cyan("◼"), "This utility will help you set up a browser testing environment.\n");
|
||||
const pkgJsonPath = resolve(process.cwd(), "package.json");
|
||||
const pkg = readPkgJson(pkgJsonPath) || {};
|
||||
const dependencies = {
|
||||
...pkg.dependencies,
|
||||
...pkg.devDependencies
|
||||
};
|
||||
const defaults = getPossibleDefaults(dependencies);
|
||||
const { lang } = await prompt({
|
||||
type: "select",
|
||||
name: "lang",
|
||||
message: "Choose a language for your tests",
|
||||
choices: sort(getLanguageOptions(), defaults?.lang)
|
||||
});
|
||||
if (!lang) return fail();
|
||||
const { provider } = await prompt({
|
||||
type: "select",
|
||||
name: "provider",
|
||||
message: "Choose a browser provider. Vitest will use its API to control the testing environment",
|
||||
choices: sort(getProviderOptions(), defaults?.provider)
|
||||
});
|
||||
if (!provider) return fail();
|
||||
const { browsers } = await prompt({
|
||||
type: "multiselect",
|
||||
name: "browsers",
|
||||
message: "Choose a browser",
|
||||
choices: getBrowserNames(provider).map((browser) => ({
|
||||
title: browser,
|
||||
value: browser
|
||||
}))
|
||||
});
|
||||
if (!provider) return fail();
|
||||
const { framework } = await prompt({
|
||||
type: "select",
|
||||
name: "framework",
|
||||
message: "Choose your framework",
|
||||
choices: sort(getFramework(), defaults?.framework)
|
||||
});
|
||||
if (!framework) return fail();
|
||||
let installPlaywright = false;
|
||||
if (provider === "playwright") ({installPlaywright} = await prompt({
|
||||
type: "confirm",
|
||||
name: "installPlaywright",
|
||||
message: `Install Playwright browsers (can be done manually via 'pnpm exec playwright install')?`
|
||||
}));
|
||||
if (installPlaywright == null) return fail();
|
||||
const dependenciesToInstall = [`@vitest/browser-${provider}`];
|
||||
const frameworkPackage = getFrameworkTestPackage(framework);
|
||||
if (frameworkPackage) dependenciesToInstall.push(frameworkPackage);
|
||||
const frameworkPlugin = getFrameworkPluginPackage(framework);
|
||||
if (frameworkPlugin) dependenciesToInstall.push(frameworkPlugin);
|
||||
const pkgManager = await detectPackageManager();
|
||||
log();
|
||||
await installPackages(pkgManager, dependenciesToInstall.filter((pkg) => !dependencies[pkg]));
|
||||
const rootConfig = any(configFiles, { cwd: process.cwd() });
|
||||
let scriptCommand = "vitest";
|
||||
log();
|
||||
if (rootConfig) {
|
||||
const configPath = resolve(dirname(rootConfig), `vitest.browser.config.${lang}`);
|
||||
scriptCommand = `vitest --config=${relative(process.cwd(), configPath)}`;
|
||||
await generateFrameworkConfigFile({
|
||||
configPath,
|
||||
framework,
|
||||
frameworkPlugin,
|
||||
provider,
|
||||
browsers
|
||||
});
|
||||
log(
|
||||
c.green("✔"),
|
||||
"Created a new config file for browser tests:",
|
||||
c.bold(relative(process.cwd(), configPath)),
|
||||
// TODO: Can we modify the config ourselves?
|
||||
"\nSince you already have a Vitest config file, it is recommended to copy the contents of the new file ",
|
||||
"into your existing config located at ",
|
||||
c.bold(relative(process.cwd(), rootConfig))
|
||||
);
|
||||
} else {
|
||||
const configPath = resolve(process.cwd(), `vitest.config.${lang}`);
|
||||
await generateFrameworkConfigFile({
|
||||
configPath,
|
||||
framework,
|
||||
frameworkPlugin,
|
||||
provider,
|
||||
browsers
|
||||
});
|
||||
log(c.green("✔"), "Created a config file for browser tests:", c.bold(relative(process.cwd(), configPath)));
|
||||
}
|
||||
log();
|
||||
await updatePkgJsonScripts(pkgJsonPath, scriptCommand);
|
||||
if (installPlaywright) {
|
||||
log();
|
||||
const [command, ...args] = getPlaywrightRunArgs(pkgManager);
|
||||
const allArgs = [
|
||||
...args,
|
||||
"playwright",
|
||||
"install",
|
||||
"--with-deps"
|
||||
];
|
||||
log(c.cyan("◼"), `Installing Playwright dependencies with \`${c.bold(command)} ${c.bold(allArgs.join(" "))}\`...`);
|
||||
log();
|
||||
await x(command, allArgs, { nodeOptions: { stdio: [
|
||||
"pipe",
|
||||
"inherit",
|
||||
"inherit"
|
||||
] } });
|
||||
}
|
||||
log();
|
||||
const exampleTestFile = await generateExampleFiles(framework, lang);
|
||||
log(c.green("✔"), "Created example test file in", c.bold(relative(process.cwd(), exampleTestFile)));
|
||||
log(c.dim(" You can safely delete this file once you have written your own tests."));
|
||||
log();
|
||||
log(c.cyan("◼"), "All done! Run your tests with", c.bold(getRunScript(pkgManager)));
|
||||
}
|
||||
|
||||
export { create };
|
||||
73
node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
generated
vendored
Normal file
73
node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
/* Ported from https://github.com/boblauer/MockDate/blob/master/src/mockdate.ts */
|
||||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Bob Lauer
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
const RealDate = Date;
|
||||
let now = null;
|
||||
class MockDate extends RealDate {
|
||||
constructor(y, m, d, h, M, s, ms) {
|
||||
super();
|
||||
let date;
|
||||
switch (arguments.length) {
|
||||
case 0:
|
||||
if (now !== null) date = new RealDate(now.valueOf());
|
||||
else date = new RealDate();
|
||||
break;
|
||||
case 1:
|
||||
date = new RealDate(y);
|
||||
break;
|
||||
default:
|
||||
d = typeof d === "undefined" ? 1 : d;
|
||||
h = h || 0;
|
||||
M = M || 0;
|
||||
s = s || 0;
|
||||
ms = ms || 0;
|
||||
date = new RealDate(y, m, d, h, M, s, ms);
|
||||
break;
|
||||
}
|
||||
Object.setPrototypeOf(date, MockDate.prototype);
|
||||
return date;
|
||||
}
|
||||
}
|
||||
MockDate.UTC = RealDate.UTC;
|
||||
MockDate.now = function() {
|
||||
return new MockDate().valueOf();
|
||||
};
|
||||
MockDate.parse = function(dateString) {
|
||||
return RealDate.parse(dateString);
|
||||
};
|
||||
MockDate.toString = function() {
|
||||
return RealDate.toString();
|
||||
};
|
||||
function mockDate(date) {
|
||||
const dateObj = new RealDate(date.valueOf());
|
||||
if (Number.isNaN(dateObj.getTime())) throw new TypeError(`mockdate: The time set is an invalid date: ${date}`);
|
||||
// @ts-expect-error global
|
||||
globalThis.Date = MockDate;
|
||||
now = dateObj.valueOf();
|
||||
}
|
||||
function resetDate() {
|
||||
globalThis.Date = RealDate;
|
||||
}
|
||||
|
||||
export { RealDate as R, mockDate as m, resetDate as r };
|
||||
74
node_modules/vitest/dist/chunks/defaults.BOqNVLsY.js
generated
vendored
Normal file
74
node_modules/vitest/dist/chunks/defaults.BOqNVLsY.js
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
import nodeos__default from 'node:os';
|
||||
import './env.D4Lgay0q.js';
|
||||
import { isCI } from 'std-env';
|
||||
|
||||
const defaultInclude = ["**/*.{test,spec}.?(c|m)[jt]s?(x)"];
|
||||
const defaultExclude = ["**/node_modules/**", "**/.git/**"];
|
||||
const benchmarkConfigDefaults = {
|
||||
include: ["**/*.{bench,benchmark}.?(c|m)[jt]s?(x)"],
|
||||
exclude: defaultExclude,
|
||||
includeSource: [],
|
||||
reporters: ["default"],
|
||||
includeSamples: false
|
||||
};
|
||||
// These are the generic defaults for coverage. Providers may also set some provider specific defaults.
|
||||
const coverageConfigDefaults = {
|
||||
provider: "v8",
|
||||
enabled: false,
|
||||
clean: true,
|
||||
cleanOnRerun: true,
|
||||
reportsDirectory: "./coverage",
|
||||
exclude: [],
|
||||
reportOnFailure: false,
|
||||
reporter: [
|
||||
["text", {}],
|
||||
["html", {}],
|
||||
["clover", {}],
|
||||
["json", {}]
|
||||
],
|
||||
allowExternal: false,
|
||||
excludeAfterRemap: false,
|
||||
processingConcurrency: Math.min(20, nodeos__default.availableParallelism?.() ?? nodeos__default.cpus().length)
|
||||
};
|
||||
const fakeTimersDefaults = {
|
||||
loopLimit: 1e4,
|
||||
shouldClearNativeTimers: true
|
||||
};
|
||||
const configDefaults = Object.freeze({
|
||||
allowOnly: !isCI,
|
||||
isolate: true,
|
||||
watch: !isCI && process.stdin.isTTY,
|
||||
globals: false,
|
||||
environment: "node",
|
||||
clearMocks: false,
|
||||
restoreMocks: false,
|
||||
mockReset: false,
|
||||
unstubGlobals: false,
|
||||
unstubEnvs: false,
|
||||
include: defaultInclude,
|
||||
exclude: defaultExclude,
|
||||
teardownTimeout: 1e4,
|
||||
forceRerunTriggers: ["**/package.json/**", "**/{vitest,vite}.config.*/**"],
|
||||
update: false,
|
||||
reporters: [],
|
||||
silent: false,
|
||||
hideSkippedTests: false,
|
||||
api: false,
|
||||
ui: false,
|
||||
uiBase: "/__vitest__/",
|
||||
open: !isCI,
|
||||
css: { include: [] },
|
||||
coverage: coverageConfigDefaults,
|
||||
fakeTimers: fakeTimersDefaults,
|
||||
maxConcurrency: 5,
|
||||
dangerouslyIgnoreUnhandledErrors: false,
|
||||
typecheck: {
|
||||
checker: "tsc",
|
||||
include: ["**/*.{test,spec}-d.?(c|m)[jt]s?(x)"],
|
||||
exclude: defaultExclude
|
||||
},
|
||||
slowTestThreshold: 300,
|
||||
disableConsoleIntercept: false
|
||||
});
|
||||
|
||||
export { coverageConfigDefaults as a, defaultInclude as b, configDefaults as c, defaultExclude as d, benchmarkConfigDefaults as e };
|
||||
8
node_modules/vitest/dist/chunks/env.D4Lgay0q.js
generated
vendored
Normal file
8
node_modules/vitest/dist/chunks/env.D4Lgay0q.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import { isCI } from 'std-env';
|
||||
|
||||
const isNode = typeof process < "u" && typeof process.stdout < "u" && !process.versions?.deno && !globalThis.window;
|
||||
const isDeno = typeof process < "u" && typeof process.stdout < "u" && process.versions?.deno !== void 0;
|
||||
const isWindows = (isNode || isDeno) && process.platform === "win32";
|
||||
const isTTY = (isNode || isDeno) && process.stdout?.isTTY && !isCI;
|
||||
|
||||
export { isWindows as a, isTTY as i };
|
||||
29
node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts
generated
vendored
Normal file
29
node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
import { Awaitable } from '@vitest/utils';
|
||||
|
||||
interface EnvironmentReturn {
|
||||
teardown: (global: any) => Awaitable<void>;
|
||||
}
|
||||
interface VmEnvironmentReturn {
|
||||
getVmContext: () => {
|
||||
[key: string]: any;
|
||||
};
|
||||
teardown: () => Awaitable<void>;
|
||||
}
|
||||
interface Environment {
|
||||
name: string;
|
||||
/**
|
||||
* @deprecated use `viteEnvironment` instead. Uses `name` by default
|
||||
*/
|
||||
transformMode?: "web" | "ssr";
|
||||
/**
|
||||
* Environment initiated by the Vite server. It is usually available
|
||||
* as `vite.server.environments.${name}`.
|
||||
*
|
||||
* By default, fallbacks to `name`.
|
||||
*/
|
||||
viteEnvironment?: "client" | "ssr" | ({} & string);
|
||||
setupVM?: (options: Record<string, any>) => Awaitable<VmEnvironmentReturn>;
|
||||
setup: (global: any, options: Record<string, any>) => Awaitable<EnvironmentReturn>;
|
||||
}
|
||||
|
||||
export type { Environment as E, VmEnvironmentReturn as V, EnvironmentReturn as a };
|
||||
17
node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js
generated
vendored
Normal file
17
node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
import { dirname, resolve } from 'pathe';
|
||||
import { EvaluatedModules } from 'vite/module-runner';
|
||||
|
||||
// TODO: this is not needed in Vite 7.2+
|
||||
class VitestEvaluatedModules extends EvaluatedModules {
|
||||
getModuleSourceMapById(id) {
|
||||
const map = super.getModuleSourceMapById(id);
|
||||
if (map != null && !("_patched" in map)) {
|
||||
map._patched = true;
|
||||
const dir = dirname(map.url);
|
||||
map.resolvedSources = (map.map.sources || []).map((s) => resolve(dir, s || ""));
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
||||
export { VitestEvaluatedModules as V };
|
||||
7
node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts
generated
vendored
Normal file
7
node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import { EvaluatedModules } from 'vite/module-runner';
|
||||
|
||||
declare class VitestEvaluatedModules extends EvaluatedModules {
|
||||
getModuleSourceMapById(id: string): any;
|
||||
}
|
||||
|
||||
export { VitestEvaluatedModules as V };
|
||||
71
node_modules/vitest/dist/chunks/git.Bm2pzPAa.js
generated
vendored
Normal file
71
node_modules/vitest/dist/chunks/git.Bm2pzPAa.js
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
import { resolve } from 'pathe';
|
||||
import { x } from 'tinyexec';
|
||||
|
||||
class VitestGit {
|
||||
root;
|
||||
constructor(cwd) {
|
||||
this.cwd = cwd;
|
||||
}
|
||||
async resolveFilesWithGitCommand(args) {
|
||||
let result;
|
||||
try {
|
||||
result = await x("git", args, { nodeOptions: { cwd: this.root } });
|
||||
} catch (e) {
|
||||
e.message = e.stderr;
|
||||
throw e;
|
||||
}
|
||||
return result.stdout.split("\n").filter((s) => s !== "").map((changedPath) => resolve(this.root, changedPath));
|
||||
}
|
||||
async findChangedFiles(options) {
|
||||
const root = await this.getRoot(this.cwd);
|
||||
if (!root) return null;
|
||||
this.root = root;
|
||||
const changedSince = options.changedSince;
|
||||
if (typeof changedSince === "string") {
|
||||
const [committed, staged, unstaged] = await Promise.all([
|
||||
this.getFilesSince(changedSince),
|
||||
this.getStagedFiles(),
|
||||
this.getUnstagedFiles()
|
||||
]);
|
||||
return [
|
||||
...committed,
|
||||
...staged,
|
||||
...unstaged
|
||||
];
|
||||
}
|
||||
const [staged, unstaged] = await Promise.all([this.getStagedFiles(), this.getUnstagedFiles()]);
|
||||
return [...staged, ...unstaged];
|
||||
}
|
||||
getFilesSince(hash) {
|
||||
return this.resolveFilesWithGitCommand([
|
||||
"diff",
|
||||
"--name-only",
|
||||
`${hash}...HEAD`
|
||||
]);
|
||||
}
|
||||
getStagedFiles() {
|
||||
return this.resolveFilesWithGitCommand([
|
||||
"diff",
|
||||
"--cached",
|
||||
"--name-only"
|
||||
]);
|
||||
}
|
||||
getUnstagedFiles() {
|
||||
return this.resolveFilesWithGitCommand([
|
||||
"ls-files",
|
||||
"--other",
|
||||
"--modified",
|
||||
"--exclude-standard"
|
||||
]);
|
||||
}
|
||||
async getRoot(cwd) {
|
||||
const args = ["rev-parse", "--show-cdup"];
|
||||
try {
|
||||
return resolve(cwd, (await x("git", args, { nodeOptions: { cwd } })).stdout.trim());
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export { VitestGit };
|
||||
99
node_modules/vitest/dist/chunks/global.d.B15mdLcR.d.ts
generated
vendored
Normal file
99
node_modules/vitest/dist/chunks/global.d.B15mdLcR.d.ts
generated
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
import { PromisifyAssertion, Tester, ExpectStatic } from '@vitest/expect';
|
||||
import { Plugin } from '@vitest/pretty-format';
|
||||
import { SnapshotState } from '@vitest/snapshot';
|
||||
import { B as BenchmarkResult } from './benchmark.d.DAaHLpsq.js';
|
||||
import { U as UserConsoleLog } from './rpc.d.RH3apGEf.js';
|
||||
|
||||
interface SnapshotMatcher<T> {
|
||||
<U extends { [P in keyof T] : any }>(snapshot: Partial<U>, hint?: string): void;
|
||||
(hint?: string): void;
|
||||
}
|
||||
interface InlineSnapshotMatcher<T> {
|
||||
<U extends { [P in keyof T] : any }>(properties: Partial<U>, snapshot?: string, hint?: string): void;
|
||||
(hint?: string): void;
|
||||
}
|
||||
declare module "@vitest/expect" {
|
||||
interface MatcherState {
|
||||
environment: string;
|
||||
snapshotState: SnapshotState;
|
||||
}
|
||||
interface ExpectPollOptions {
|
||||
interval?: number;
|
||||
timeout?: number;
|
||||
message?: string;
|
||||
}
|
||||
interface ExpectStatic {
|
||||
assert: Chai.AssertStatic;
|
||||
unreachable: (message?: string) => never;
|
||||
soft: <T>(actual: T, message?: string) => Assertion<T>;
|
||||
poll: <T>(actual: () => T, options?: ExpectPollOptions) => PromisifyAssertion<Awaited<T>>;
|
||||
addEqualityTesters: (testers: Array<Tester>) => void;
|
||||
assertions: (expected: number) => void;
|
||||
hasAssertions: () => void;
|
||||
addSnapshotSerializer: (plugin: Plugin) => void;
|
||||
}
|
||||
interface Assertion<T> {
|
||||
matchSnapshot: SnapshotMatcher<T>;
|
||||
toMatchSnapshot: SnapshotMatcher<T>;
|
||||
toMatchInlineSnapshot: InlineSnapshotMatcher<T>;
|
||||
/**
|
||||
* Checks that an error thrown by a function matches a previously recorded snapshot.
|
||||
*
|
||||
* @param hint - Optional custom error message.
|
||||
*
|
||||
* @example
|
||||
* expect(functionWithError).toThrowErrorMatchingSnapshot();
|
||||
*/
|
||||
toThrowErrorMatchingSnapshot: (hint?: string) => void;
|
||||
/**
|
||||
* Checks that an error thrown by a function matches an inline snapshot within the test file.
|
||||
* Useful for keeping snapshots close to the test code.
|
||||
*
|
||||
* @param snapshot - Optional inline snapshot string to match.
|
||||
* @param hint - Optional custom error message.
|
||||
*
|
||||
* @example
|
||||
* const throwError = () => { throw new Error('Error occurred') };
|
||||
* expect(throwError).toThrowErrorMatchingInlineSnapshot(`"Error occurred"`);
|
||||
*/
|
||||
toThrowErrorMatchingInlineSnapshot: (snapshot?: string, hint?: string) => void;
|
||||
/**
|
||||
* Compares the received value to a snapshot saved in a specified file.
|
||||
* Useful for cases where snapshot content is large or needs to be shared across tests.
|
||||
*
|
||||
* @param filepath - Path to the snapshot file.
|
||||
* @param hint - Optional custom error message.
|
||||
*
|
||||
* @example
|
||||
* await expect(largeData).toMatchFileSnapshot('path/to/snapshot.json');
|
||||
*/
|
||||
toMatchFileSnapshot: (filepath: string, hint?: string) => Promise<void>;
|
||||
}
|
||||
}
|
||||
declare module "@vitest/runner" {
|
||||
interface TestContext {
|
||||
/**
|
||||
* `expect` instance bound to the current test.
|
||||
*
|
||||
* This API is useful for running snapshot tests concurrently because global expect cannot track them.
|
||||
*/
|
||||
readonly expect: ExpectStatic;
|
||||
/** @internal */
|
||||
_local: boolean;
|
||||
}
|
||||
interface TaskMeta {
|
||||
typecheck?: boolean;
|
||||
benchmark?: boolean;
|
||||
failScreenshotPath?: string;
|
||||
}
|
||||
interface File {
|
||||
prepareDuration?: number;
|
||||
environmentLoad?: number;
|
||||
}
|
||||
interface TaskBase {
|
||||
logs?: UserConsoleLog[];
|
||||
}
|
||||
interface TaskResult {
|
||||
benchmark?: BenchmarkResult;
|
||||
}
|
||||
}
|
||||
30
node_modules/vitest/dist/chunks/globals.DOayXfHP.js
generated
vendored
Normal file
30
node_modules/vitest/dist/chunks/globals.DOayXfHP.js
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
import { g as globalApis } from './constants.D_Q9UYh-.js';
|
||||
import { i as index } from './index.Z5E_ObnR.js';
|
||||
import './vi.2VT5v0um.js';
|
||||
import '@vitest/expect';
|
||||
import '@vitest/runner';
|
||||
import './utils.DvEY5TfP.js';
|
||||
import '@vitest/utils/timers';
|
||||
import '@vitest/runner/utils';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/error';
|
||||
import '@vitest/utils/helpers';
|
||||
import '@vitest/spy';
|
||||
import '@vitest/utils/offset';
|
||||
import '@vitest/utils/source-map';
|
||||
import './_commonjsHelpers.D26ty3Ew.js';
|
||||
import './date.Bq6ZW5rf.js';
|
||||
import './benchmark.B3N2zMcH.js';
|
||||
import './evaluatedModules.Dg1zASAC.js';
|
||||
import 'pathe';
|
||||
import 'vite/module-runner';
|
||||
import 'expect-type';
|
||||
|
||||
function registerApiGlobally() {
|
||||
globalApis.forEach((api) => {
|
||||
// @ts-expect-error I know what I am doing :P
|
||||
globalThis[api] = index[api];
|
||||
});
|
||||
}
|
||||
|
||||
export { registerApiGlobally };
|
||||
220
node_modules/vitest/dist/chunks/index.0kCJoeWi.js
generated
vendored
Normal file
220
node_modules/vitest/dist/chunks/index.0kCJoeWi.js
generated
vendored
Normal file
@@ -0,0 +1,220 @@
|
||||
const TYPE_REQUEST = "q";
|
||||
const TYPE_RESPONSE = "s";
|
||||
const DEFAULT_TIMEOUT = 6e4;
|
||||
function defaultSerialize(i) {
|
||||
return i;
|
||||
}
|
||||
const defaultDeserialize = defaultSerialize;
|
||||
const { clearTimeout, setTimeout } = globalThis;
|
||||
const random = Math.random.bind(Math);
|
||||
function createBirpc($functions, options) {
|
||||
const {
|
||||
post,
|
||||
on,
|
||||
off = () => {
|
||||
},
|
||||
eventNames = [],
|
||||
serialize = defaultSerialize,
|
||||
deserialize = defaultDeserialize,
|
||||
resolver,
|
||||
bind = "rpc",
|
||||
timeout = DEFAULT_TIMEOUT
|
||||
} = options;
|
||||
let $closed = false;
|
||||
const _rpcPromiseMap = /* @__PURE__ */ new Map();
|
||||
let _promiseInit;
|
||||
async function _call(method, args, event, optional) {
|
||||
if ($closed)
|
||||
throw new Error(`[birpc] rpc is closed, cannot call "${method}"`);
|
||||
const req = { m: method, a: args, t: TYPE_REQUEST };
|
||||
if (optional)
|
||||
req.o = true;
|
||||
const send = async (_req) => post(serialize(_req));
|
||||
if (event) {
|
||||
await send(req);
|
||||
return;
|
||||
}
|
||||
if (_promiseInit) {
|
||||
try {
|
||||
await _promiseInit;
|
||||
} finally {
|
||||
_promiseInit = void 0;
|
||||
}
|
||||
}
|
||||
let { promise, resolve, reject } = createPromiseWithResolvers();
|
||||
const id = nanoid();
|
||||
req.i = id;
|
||||
let timeoutId;
|
||||
async function handler(newReq = req) {
|
||||
if (timeout >= 0) {
|
||||
timeoutId = setTimeout(() => {
|
||||
try {
|
||||
const handleResult = options.onTimeoutError?.(method, args);
|
||||
if (handleResult !== true)
|
||||
throw new Error(`[birpc] timeout on calling "${method}"`);
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
_rpcPromiseMap.delete(id);
|
||||
}, timeout);
|
||||
if (typeof timeoutId === "object")
|
||||
timeoutId = timeoutId.unref?.();
|
||||
}
|
||||
_rpcPromiseMap.set(id, { resolve, reject, timeoutId, method });
|
||||
await send(newReq);
|
||||
return promise;
|
||||
}
|
||||
try {
|
||||
if (options.onRequest)
|
||||
await options.onRequest(req, handler, resolve);
|
||||
else
|
||||
await handler();
|
||||
} catch (e) {
|
||||
if (options.onGeneralError?.(e) !== true)
|
||||
throw e;
|
||||
return;
|
||||
} finally {
|
||||
clearTimeout(timeoutId);
|
||||
_rpcPromiseMap.delete(id);
|
||||
}
|
||||
return promise;
|
||||
}
|
||||
const $call = (method, ...args) => _call(method, args, false);
|
||||
const $callOptional = (method, ...args) => _call(method, args, false, true);
|
||||
const $callEvent = (method, ...args) => _call(method, args, true);
|
||||
const $callRaw = (options2) => _call(options2.method, options2.args, options2.event, options2.optional);
|
||||
const builtinMethods = {
|
||||
$call,
|
||||
$callOptional,
|
||||
$callEvent,
|
||||
$callRaw,
|
||||
$rejectPendingCalls,
|
||||
get $closed() {
|
||||
return $closed;
|
||||
},
|
||||
$close,
|
||||
$functions
|
||||
};
|
||||
const rpc = new Proxy({}, {
|
||||
get(_, method) {
|
||||
if (Object.prototype.hasOwnProperty.call(builtinMethods, method))
|
||||
return builtinMethods[method];
|
||||
if (method === "then" && !eventNames.includes("then") && !("then" in $functions))
|
||||
return void 0;
|
||||
const sendEvent = (...args) => _call(method, args, true);
|
||||
if (eventNames.includes(method)) {
|
||||
sendEvent.asEvent = sendEvent;
|
||||
return sendEvent;
|
||||
}
|
||||
const sendCall = (...args) => _call(method, args, false);
|
||||
sendCall.asEvent = sendEvent;
|
||||
return sendCall;
|
||||
}
|
||||
});
|
||||
function $close(customError) {
|
||||
$closed = true;
|
||||
_rpcPromiseMap.forEach(({ reject, method }) => {
|
||||
const error = new Error(`[birpc] rpc is closed, cannot call "${method}"`);
|
||||
if (customError) {
|
||||
customError.cause ??= error;
|
||||
return reject(customError);
|
||||
}
|
||||
reject(error);
|
||||
});
|
||||
_rpcPromiseMap.clear();
|
||||
off(onMessage);
|
||||
}
|
||||
function $rejectPendingCalls(handler) {
|
||||
const entries = Array.from(_rpcPromiseMap.values());
|
||||
const handlerResults = entries.map(({ method, reject }) => {
|
||||
if (!handler) {
|
||||
return reject(new Error(`[birpc]: rejected pending call "${method}".`));
|
||||
}
|
||||
return handler({ method, reject });
|
||||
});
|
||||
_rpcPromiseMap.clear();
|
||||
return handlerResults;
|
||||
}
|
||||
async function onMessage(data, ...extra) {
|
||||
let msg;
|
||||
try {
|
||||
msg = deserialize(data);
|
||||
} catch (e) {
|
||||
if (options.onGeneralError?.(e) !== true)
|
||||
throw e;
|
||||
return;
|
||||
}
|
||||
if (msg.t === TYPE_REQUEST) {
|
||||
const { m: method, a: args, o: optional } = msg;
|
||||
let result, error;
|
||||
let fn = await (resolver ? resolver(method, $functions[method]) : $functions[method]);
|
||||
if (optional)
|
||||
fn ||= () => void 0;
|
||||
if (!fn) {
|
||||
error = new Error(`[birpc] function "${method}" not found`);
|
||||
} else {
|
||||
try {
|
||||
result = await fn.apply(bind === "rpc" ? rpc : $functions, args);
|
||||
} catch (e) {
|
||||
error = e;
|
||||
}
|
||||
}
|
||||
if (msg.i) {
|
||||
if (error && options.onError)
|
||||
options.onError(error, method, args);
|
||||
if (error && options.onFunctionError) {
|
||||
if (options.onFunctionError(error, method, args) === true)
|
||||
return;
|
||||
}
|
||||
if (!error) {
|
||||
try {
|
||||
await post(serialize({ t: TYPE_RESPONSE, i: msg.i, r: result }), ...extra);
|
||||
return;
|
||||
} catch (e) {
|
||||
error = e;
|
||||
if (options.onGeneralError?.(e, method, args) !== true)
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
try {
|
||||
await post(serialize({ t: TYPE_RESPONSE, i: msg.i, e: error }), ...extra);
|
||||
} catch (e) {
|
||||
if (options.onGeneralError?.(e, method, args) !== true)
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const { i: ack, r: result, e: error } = msg;
|
||||
const promise = _rpcPromiseMap.get(ack);
|
||||
if (promise) {
|
||||
clearTimeout(promise.timeoutId);
|
||||
if (error)
|
||||
promise.reject(error);
|
||||
else
|
||||
promise.resolve(result);
|
||||
}
|
||||
_rpcPromiseMap.delete(ack);
|
||||
}
|
||||
}
|
||||
_promiseInit = on(onMessage);
|
||||
return rpc;
|
||||
}
|
||||
function createPromiseWithResolvers() {
|
||||
let resolve;
|
||||
let reject;
|
||||
const promise = new Promise((res, rej) => {
|
||||
resolve = res;
|
||||
reject = rej;
|
||||
});
|
||||
return { promise, resolve, reject };
|
||||
}
|
||||
const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
|
||||
function nanoid(size = 21) {
|
||||
let id = "";
|
||||
let i = size;
|
||||
while (i--)
|
||||
id += urlAlphabet[random() * 64 | 0];
|
||||
return id;
|
||||
}
|
||||
|
||||
export { createBirpc as c };
|
||||
3815
node_modules/vitest/dist/chunks/index.456_DGfR.js
generated
vendored
Normal file
3815
node_modules/vitest/dist/chunks/index.456_DGfR.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
727
node_modules/vitest/dist/chunks/index.BspFP3mn.js
generated
vendored
Normal file
727
node_modules/vitest/dist/chunks/index.BspFP3mn.js
generated
vendored
Normal file
@@ -0,0 +1,727 @@
|
||||
import { URL } from 'node:url';
|
||||
import { Console } from 'node:console';
|
||||
|
||||
// SEE https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/interfaces.js
|
||||
const LIVING_KEYS = [
|
||||
"DOMException",
|
||||
"EventTarget",
|
||||
"NamedNodeMap",
|
||||
"Node",
|
||||
"Attr",
|
||||
"Element",
|
||||
"DocumentFragment",
|
||||
"DOMImplementation",
|
||||
"Document",
|
||||
"XMLDocument",
|
||||
"CharacterData",
|
||||
"Text",
|
||||
"CDATASection",
|
||||
"ProcessingInstruction",
|
||||
"Comment",
|
||||
"DocumentType",
|
||||
"NodeList",
|
||||
"RadioNodeList",
|
||||
"HTMLCollection",
|
||||
"HTMLOptionsCollection",
|
||||
"DOMStringMap",
|
||||
"DOMTokenList",
|
||||
"StyleSheetList",
|
||||
"HTMLElement",
|
||||
"HTMLHeadElement",
|
||||
"HTMLTitleElement",
|
||||
"HTMLBaseElement",
|
||||
"HTMLLinkElement",
|
||||
"HTMLMetaElement",
|
||||
"HTMLStyleElement",
|
||||
"HTMLBodyElement",
|
||||
"HTMLHeadingElement",
|
||||
"HTMLParagraphElement",
|
||||
"HTMLHRElement",
|
||||
"HTMLPreElement",
|
||||
"HTMLUListElement",
|
||||
"HTMLOListElement",
|
||||
"HTMLLIElement",
|
||||
"HTMLMenuElement",
|
||||
"HTMLDListElement",
|
||||
"HTMLDivElement",
|
||||
"HTMLAnchorElement",
|
||||
"HTMLAreaElement",
|
||||
"HTMLBRElement",
|
||||
"HTMLButtonElement",
|
||||
"HTMLCanvasElement",
|
||||
"HTMLDataElement",
|
||||
"HTMLDataListElement",
|
||||
"HTMLDetailsElement",
|
||||
"HTMLDialogElement",
|
||||
"HTMLDirectoryElement",
|
||||
"HTMLFieldSetElement",
|
||||
"HTMLFontElement",
|
||||
"HTMLFormElement",
|
||||
"HTMLHtmlElement",
|
||||
"HTMLImageElement",
|
||||
"HTMLInputElement",
|
||||
"HTMLLabelElement",
|
||||
"HTMLLegendElement",
|
||||
"HTMLMapElement",
|
||||
"HTMLMarqueeElement",
|
||||
"HTMLMediaElement",
|
||||
"HTMLMeterElement",
|
||||
"HTMLModElement",
|
||||
"HTMLOptGroupElement",
|
||||
"HTMLOptionElement",
|
||||
"HTMLOutputElement",
|
||||
"HTMLPictureElement",
|
||||
"HTMLProgressElement",
|
||||
"HTMLQuoteElement",
|
||||
"HTMLScriptElement",
|
||||
"HTMLSelectElement",
|
||||
"HTMLSlotElement",
|
||||
"HTMLSourceElement",
|
||||
"HTMLSpanElement",
|
||||
"HTMLTableCaptionElement",
|
||||
"HTMLTableCellElement",
|
||||
"HTMLTableColElement",
|
||||
"HTMLTableElement",
|
||||
"HTMLTimeElement",
|
||||
"HTMLTableRowElement",
|
||||
"HTMLTableSectionElement",
|
||||
"HTMLTemplateElement",
|
||||
"HTMLTextAreaElement",
|
||||
"HTMLUnknownElement",
|
||||
"HTMLFrameElement",
|
||||
"HTMLFrameSetElement",
|
||||
"HTMLIFrameElement",
|
||||
"HTMLEmbedElement",
|
||||
"HTMLObjectElement",
|
||||
"HTMLParamElement",
|
||||
"HTMLVideoElement",
|
||||
"HTMLAudioElement",
|
||||
"HTMLTrackElement",
|
||||
"HTMLFormControlsCollection",
|
||||
"SVGElement",
|
||||
"SVGGraphicsElement",
|
||||
"SVGSVGElement",
|
||||
"SVGTitleElement",
|
||||
"SVGAnimatedString",
|
||||
"SVGNumber",
|
||||
"SVGStringList",
|
||||
"Event",
|
||||
"CloseEvent",
|
||||
"CustomEvent",
|
||||
"MessageEvent",
|
||||
"ErrorEvent",
|
||||
"HashChangeEvent",
|
||||
"PopStateEvent",
|
||||
"StorageEvent",
|
||||
"ProgressEvent",
|
||||
"PageTransitionEvent",
|
||||
"SubmitEvent",
|
||||
"UIEvent",
|
||||
"FocusEvent",
|
||||
"InputEvent",
|
||||
"MouseEvent",
|
||||
"KeyboardEvent",
|
||||
"TouchEvent",
|
||||
"CompositionEvent",
|
||||
"WheelEvent",
|
||||
"BarProp",
|
||||
"External",
|
||||
"Location",
|
||||
"History",
|
||||
"Screen",
|
||||
"Crypto",
|
||||
"Performance",
|
||||
"Navigator",
|
||||
"PluginArray",
|
||||
"MimeTypeArray",
|
||||
"Plugin",
|
||||
"MimeType",
|
||||
"FileReader",
|
||||
"FormData",
|
||||
"Blob",
|
||||
"File",
|
||||
"FileList",
|
||||
"ValidityState",
|
||||
"DOMParser",
|
||||
"XMLSerializer",
|
||||
"XMLHttpRequestEventTarget",
|
||||
"XMLHttpRequestUpload",
|
||||
"XMLHttpRequest",
|
||||
"WebSocket",
|
||||
"NodeFilter",
|
||||
"NodeIterator",
|
||||
"TreeWalker",
|
||||
"AbstractRange",
|
||||
"Range",
|
||||
"StaticRange",
|
||||
"Selection",
|
||||
"Storage",
|
||||
"CustomElementRegistry",
|
||||
"ShadowRoot",
|
||||
"MutationObserver",
|
||||
"MutationRecord",
|
||||
"Uint8Array",
|
||||
"Uint16Array",
|
||||
"Uint32Array",
|
||||
"Uint8ClampedArray",
|
||||
"Int8Array",
|
||||
"Int16Array",
|
||||
"Int32Array",
|
||||
"Float32Array",
|
||||
"Float64Array",
|
||||
"ArrayBuffer",
|
||||
"DOMRectReadOnly",
|
||||
"DOMRect",
|
||||
"Image",
|
||||
"Audio",
|
||||
"Option",
|
||||
"CSS"
|
||||
];
|
||||
const OTHER_KEYS = [
|
||||
"addEventListener",
|
||||
"alert",
|
||||
"blur",
|
||||
"cancelAnimationFrame",
|
||||
"close",
|
||||
"confirm",
|
||||
"createPopup",
|
||||
"dispatchEvent",
|
||||
"document",
|
||||
"focus",
|
||||
"frames",
|
||||
"getComputedStyle",
|
||||
"history",
|
||||
"innerHeight",
|
||||
"innerWidth",
|
||||
"length",
|
||||
"location",
|
||||
"matchMedia",
|
||||
"moveBy",
|
||||
"moveTo",
|
||||
"name",
|
||||
"navigator",
|
||||
"open",
|
||||
"outerHeight",
|
||||
"outerWidth",
|
||||
"pageXOffset",
|
||||
"pageYOffset",
|
||||
"parent",
|
||||
"postMessage",
|
||||
"print",
|
||||
"prompt",
|
||||
"removeEventListener",
|
||||
"requestAnimationFrame",
|
||||
"resizeBy",
|
||||
"resizeTo",
|
||||
"screen",
|
||||
"screenLeft",
|
||||
"screenTop",
|
||||
"screenX",
|
||||
"screenY",
|
||||
"scroll",
|
||||
"scrollBy",
|
||||
"scrollLeft",
|
||||
"scrollTo",
|
||||
"scrollTop",
|
||||
"scrollX",
|
||||
"scrollY",
|
||||
"self",
|
||||
"stop",
|
||||
"top",
|
||||
"Window",
|
||||
"window"
|
||||
];
|
||||
const KEYS = LIVING_KEYS.concat(OTHER_KEYS);
|
||||
|
||||
const skipKeys = [
|
||||
"window",
|
||||
"self",
|
||||
"top",
|
||||
"parent"
|
||||
];
|
||||
function getWindowKeys(global, win, additionalKeys = []) {
|
||||
const keysArray = [...additionalKeys, ...KEYS];
|
||||
return new Set(keysArray.concat(Object.getOwnPropertyNames(win)).filter((k) => {
|
||||
if (skipKeys.includes(k)) return false;
|
||||
if (k in global) return keysArray.includes(k);
|
||||
return true;
|
||||
}));
|
||||
}
|
||||
function isClassLikeName(name) {
|
||||
return name[0] === name[0].toUpperCase();
|
||||
}
|
||||
function populateGlobal(global, win, options = {}) {
|
||||
const { bindFunctions = false } = options;
|
||||
const keys = getWindowKeys(global, win, options.additionalKeys);
|
||||
const originals = /* @__PURE__ */ new Map();
|
||||
const overridenKeys = new Set([...KEYS, ...options.additionalKeys || []]);
|
||||
const overrideObject = /* @__PURE__ */ new Map();
|
||||
for (const key of keys) {
|
||||
const boundFunction = bindFunctions && typeof win[key] === "function" && !isClassLikeName(key) && win[key].bind(win);
|
||||
if (overridenKeys.has(key) && key in global) originals.set(key, global[key]);
|
||||
Object.defineProperty(global, key, {
|
||||
get() {
|
||||
if (overrideObject.has(key)) return overrideObject.get(key);
|
||||
if (boundFunction) return boundFunction;
|
||||
return win[key];
|
||||
},
|
||||
set(v) {
|
||||
overrideObject.set(key, v);
|
||||
},
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
global.window = global;
|
||||
global.self = global;
|
||||
global.top = global;
|
||||
global.parent = global;
|
||||
if (global.global) global.global = global;
|
||||
// rewrite defaultView to reference the same global context
|
||||
if (global.document && global.document.defaultView) Object.defineProperty(global.document, "defaultView", {
|
||||
get: () => global,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
skipKeys.forEach((k) => keys.add(k));
|
||||
return {
|
||||
keys,
|
||||
skipKeys,
|
||||
originals
|
||||
};
|
||||
}
|
||||
|
||||
var edge = {
|
||||
name: "edge-runtime",
|
||||
viteEnvironment: "ssr",
|
||||
async setupVM() {
|
||||
const { EdgeVM } = await import('@edge-runtime/vm');
|
||||
const vm = new EdgeVM({ extend: (context) => {
|
||||
context.global = context;
|
||||
context.Buffer = Buffer;
|
||||
return context;
|
||||
} });
|
||||
return {
|
||||
getVmContext() {
|
||||
return vm.context;
|
||||
},
|
||||
teardown() {
|
||||
// nothing to teardown
|
||||
}
|
||||
};
|
||||
},
|
||||
async setup(global) {
|
||||
const { EdgeVM } = await import('@edge-runtime/vm');
|
||||
const { keys, originals } = populateGlobal(global, new EdgeVM({ extend: (context) => {
|
||||
context.global = context;
|
||||
context.Buffer = Buffer;
|
||||
KEYS.forEach((key) => {
|
||||
if (key in global) context[key] = global[key];
|
||||
});
|
||||
return context;
|
||||
} }).context, { bindFunctions: true });
|
||||
return { teardown(global) {
|
||||
keys.forEach((key) => delete global[key]);
|
||||
originals.forEach((v, k) => global[k] = v);
|
||||
} };
|
||||
}
|
||||
};
|
||||
|
||||
async function teardownWindow(win) {
|
||||
if (win.close && win.happyDOM.abort) {
|
||||
await win.happyDOM.abort();
|
||||
win.close();
|
||||
} else win.happyDOM.cancelAsync();
|
||||
}
|
||||
var happy = {
|
||||
name: "happy-dom",
|
||||
viteEnvironment: "client",
|
||||
async setupVM({ happyDOM = {} }) {
|
||||
const { Window } = await import('happy-dom');
|
||||
let win = new Window({
|
||||
...happyDOM,
|
||||
console: console && globalThis.console ? globalThis.console : void 0,
|
||||
url: happyDOM.url || "http://localhost:3000",
|
||||
settings: {
|
||||
...happyDOM.settings,
|
||||
disableErrorCapturing: true
|
||||
}
|
||||
});
|
||||
// TODO: browser doesn't expose Buffer, but a lot of dependencies use it
|
||||
win.Buffer = Buffer;
|
||||
// inject structuredClone if it exists
|
||||
if (typeof structuredClone !== "undefined" && !win.structuredClone) win.structuredClone = structuredClone;
|
||||
return {
|
||||
getVmContext() {
|
||||
return win;
|
||||
},
|
||||
async teardown() {
|
||||
await teardownWindow(win);
|
||||
win = void 0;
|
||||
}
|
||||
};
|
||||
},
|
||||
async setup(global, { happyDOM = {} }) {
|
||||
// happy-dom v3 introduced a breaking change to Window, but
|
||||
// provides GlobalWindow as a way to use previous behaviour
|
||||
const { Window, GlobalWindow } = await import('happy-dom');
|
||||
const win = new (GlobalWindow || Window)({
|
||||
...happyDOM,
|
||||
console: console && global.console ? global.console : void 0,
|
||||
url: happyDOM.url || "http://localhost:3000",
|
||||
settings: {
|
||||
...happyDOM.settings,
|
||||
disableErrorCapturing: true
|
||||
}
|
||||
});
|
||||
const { keys, originals } = populateGlobal(global, win, {
|
||||
bindFunctions: true,
|
||||
additionalKeys: [
|
||||
"Request",
|
||||
"Response",
|
||||
"MessagePort",
|
||||
"fetch",
|
||||
"Headers",
|
||||
"AbortController",
|
||||
"AbortSignal",
|
||||
"URL",
|
||||
"URLSearchParams",
|
||||
"FormData"
|
||||
]
|
||||
});
|
||||
return { async teardown(global) {
|
||||
await teardownWindow(win);
|
||||
keys.forEach((key) => delete global[key]);
|
||||
originals.forEach((v, k) => global[k] = v);
|
||||
} };
|
||||
}
|
||||
};
|
||||
|
||||
function catchWindowErrors(window) {
|
||||
let userErrorListenerCount = 0;
|
||||
function throwUnhandlerError(e) {
|
||||
if (userErrorListenerCount === 0 && e.error != null) {
|
||||
e.preventDefault();
|
||||
process.emit("uncaughtException", e.error);
|
||||
}
|
||||
}
|
||||
const addEventListener = window.addEventListener.bind(window);
|
||||
const removeEventListener = window.removeEventListener.bind(window);
|
||||
window.addEventListener("error", throwUnhandlerError);
|
||||
window.addEventListener = function(...args) {
|
||||
if (args[0] === "error") userErrorListenerCount++;
|
||||
return addEventListener.apply(this, args);
|
||||
};
|
||||
window.removeEventListener = function(...args) {
|
||||
if (args[0] === "error" && userErrorListenerCount) userErrorListenerCount--;
|
||||
return removeEventListener.apply(this, args);
|
||||
};
|
||||
return function clearErrorHandlers() {
|
||||
window.removeEventListener("error", throwUnhandlerError);
|
||||
};
|
||||
}
|
||||
let NodeFormData_;
|
||||
let NodeBlob_;
|
||||
let NodeRequest_;
|
||||
var jsdom = {
|
||||
name: "jsdom",
|
||||
viteEnvironment: "client",
|
||||
async setupVM({ jsdom = {} }) {
|
||||
// delay initialization because it takes ~1s
|
||||
NodeFormData_ = globalThis.FormData;
|
||||
NodeBlob_ = globalThis.Blob;
|
||||
NodeRequest_ = globalThis.Request;
|
||||
const { CookieJar, JSDOM, ResourceLoader, VirtualConsole } = await import('jsdom');
|
||||
const { html = "<!DOCTYPE html>", userAgent, url = "http://localhost:3000", contentType = "text/html", pretendToBeVisual = true, includeNodeLocations = false, runScripts = "dangerously", resources, console = false, cookieJar = false, ...restOptions } = jsdom;
|
||||
let virtualConsole;
|
||||
if (console && globalThis.console) {
|
||||
virtualConsole = new VirtualConsole();
|
||||
// jsdom <27
|
||||
if ("sendTo" in virtualConsole) virtualConsole.sendTo(globalThis.console);
|
||||
else virtualConsole.forwardTo(globalThis.console);
|
||||
}
|
||||
let dom = new JSDOM(html, {
|
||||
pretendToBeVisual,
|
||||
resources: resources ?? (userAgent ? new ResourceLoader({ userAgent }) : void 0),
|
||||
runScripts,
|
||||
url,
|
||||
virtualConsole,
|
||||
cookieJar: cookieJar ? new CookieJar() : void 0,
|
||||
includeNodeLocations,
|
||||
contentType,
|
||||
userAgent,
|
||||
...restOptions
|
||||
});
|
||||
const clearAddEventListenerPatch = patchAddEventListener(dom.window);
|
||||
const clearWindowErrors = catchWindowErrors(dom.window);
|
||||
const utils = createCompatUtils(dom.window);
|
||||
// TODO: browser doesn't expose Buffer, but a lot of dependencies use it
|
||||
dom.window.Buffer = Buffer;
|
||||
dom.window.jsdom = dom;
|
||||
dom.window.Request = createCompatRequest(utils);
|
||||
dom.window.URL = createJSDOMCompatURL(utils);
|
||||
for (const name of [
|
||||
"structuredClone",
|
||||
"BroadcastChannel",
|
||||
"MessageChannel",
|
||||
"MessagePort",
|
||||
"TextEncoder",
|
||||
"TextDecoder"
|
||||
]) {
|
||||
const value = globalThis[name];
|
||||
if (typeof value !== "undefined" && typeof dom.window[name] === "undefined") dom.window[name] = value;
|
||||
}
|
||||
for (const name of [
|
||||
"fetch",
|
||||
"Response",
|
||||
"Headers",
|
||||
"AbortController",
|
||||
"AbortSignal",
|
||||
"URLSearchParams"
|
||||
]) {
|
||||
const value = globalThis[name];
|
||||
if (typeof value !== "undefined") dom.window[name] = value;
|
||||
}
|
||||
return {
|
||||
getVmContext() {
|
||||
return dom.getInternalVMContext();
|
||||
},
|
||||
teardown() {
|
||||
clearAddEventListenerPatch();
|
||||
clearWindowErrors();
|
||||
dom.window.close();
|
||||
dom = void 0;
|
||||
}
|
||||
};
|
||||
},
|
||||
async setup(global, { jsdom = {} }) {
|
||||
// delay initialization because it takes ~1s
|
||||
NodeFormData_ = globalThis.FormData;
|
||||
NodeBlob_ = globalThis.Blob;
|
||||
NodeRequest_ = globalThis.Request;
|
||||
const { CookieJar, JSDOM, ResourceLoader, VirtualConsole } = await import('jsdom');
|
||||
const { html = "<!DOCTYPE html>", userAgent, url = "http://localhost:3000", contentType = "text/html", pretendToBeVisual = true, includeNodeLocations = false, runScripts = "dangerously", resources, console = false, cookieJar = false, ...restOptions } = jsdom;
|
||||
let virtualConsole;
|
||||
if (console && globalThis.console) {
|
||||
virtualConsole = new VirtualConsole();
|
||||
// jsdom <27
|
||||
if ("sendTo" in virtualConsole) virtualConsole.sendTo(globalThis.console);
|
||||
else virtualConsole.forwardTo(globalThis.console);
|
||||
}
|
||||
const dom = new JSDOM(html, {
|
||||
pretendToBeVisual,
|
||||
resources: resources ?? (userAgent ? new ResourceLoader({ userAgent }) : void 0),
|
||||
runScripts,
|
||||
url,
|
||||
virtualConsole,
|
||||
cookieJar: cookieJar ? new CookieJar() : void 0,
|
||||
includeNodeLocations,
|
||||
contentType,
|
||||
userAgent,
|
||||
...restOptions
|
||||
});
|
||||
const clearAddEventListenerPatch = patchAddEventListener(dom.window);
|
||||
const { keys, originals } = populateGlobal(global, dom.window, { bindFunctions: true });
|
||||
const clearWindowErrors = catchWindowErrors(global);
|
||||
const utils = createCompatUtils(dom.window);
|
||||
global.jsdom = dom;
|
||||
global.Request = createCompatRequest(utils);
|
||||
global.URL = createJSDOMCompatURL(utils);
|
||||
return { teardown(global) {
|
||||
clearAddEventListenerPatch();
|
||||
clearWindowErrors();
|
||||
dom.window.close();
|
||||
delete global.jsdom;
|
||||
keys.forEach((key) => delete global[key]);
|
||||
originals.forEach((v, k) => global[k] = v);
|
||||
} };
|
||||
}
|
||||
};
|
||||
function createCompatRequest(utils) {
|
||||
return class Request extends NodeRequest_ {
|
||||
constructor(...args) {
|
||||
const [input, init] = args;
|
||||
if (init?.body != null) {
|
||||
const compatInit = { ...init };
|
||||
if (init.body instanceof utils.window.Blob) compatInit.body = utils.makeCompatBlob(init.body);
|
||||
if (init.body instanceof utils.window.FormData) compatInit.body = utils.makeCompatFormData(init.body);
|
||||
super(input, compatInit);
|
||||
} else super(...args);
|
||||
}
|
||||
static [Symbol.hasInstance](instance) {
|
||||
return instance instanceof NodeRequest_;
|
||||
}
|
||||
};
|
||||
}
|
||||
function createJSDOMCompatURL(utils) {
|
||||
return class URL$1 extends URL {
|
||||
static createObjectURL(blob) {
|
||||
if (blob instanceof utils.window.Blob) {
|
||||
const compatBlob = utils.makeCompatBlob(blob);
|
||||
return URL.createObjectURL(compatBlob);
|
||||
}
|
||||
return URL.createObjectURL(blob);
|
||||
}
|
||||
static [Symbol.hasInstance](instance) {
|
||||
return instance instanceof URL;
|
||||
}
|
||||
};
|
||||
}
|
||||
function createCompatUtils(window) {
|
||||
// this returns a hidden Symbol(impl)
|
||||
// this is cursed, and jsdom should just implement fetch API itself
|
||||
const implSymbol = Object.getOwnPropertySymbols(Object.getOwnPropertyDescriptors(new window.Blob()))[0];
|
||||
const utils = {
|
||||
window,
|
||||
makeCompatFormData(formData) {
|
||||
const nodeFormData = new NodeFormData_();
|
||||
formData.forEach((value, key) => {
|
||||
if (value instanceof window.Blob) nodeFormData.append(key, utils.makeCompatBlob(value));
|
||||
else nodeFormData.append(key, value);
|
||||
});
|
||||
return nodeFormData;
|
||||
},
|
||||
makeCompatBlob(blob) {
|
||||
const buffer = blob[implSymbol]._buffer;
|
||||
return new NodeBlob_([buffer], { type: blob.type });
|
||||
}
|
||||
};
|
||||
return utils;
|
||||
}
|
||||
function patchAddEventListener(window) {
|
||||
const abortControllers = /* @__PURE__ */ new WeakMap();
|
||||
const JSDOMAbortSignal = window.AbortSignal;
|
||||
const JSDOMAbortController = window.AbortController;
|
||||
const originalAddEventListener = window.EventTarget.prototype.addEventListener;
|
||||
function getJsdomAbortController(signal) {
|
||||
if (!abortControllers.has(signal)) {
|
||||
const jsdomAbortController = new JSDOMAbortController();
|
||||
signal.addEventListener("abort", () => {
|
||||
jsdomAbortController.abort(signal.reason);
|
||||
});
|
||||
abortControllers.set(signal, jsdomAbortController);
|
||||
}
|
||||
return abortControllers.get(signal);
|
||||
}
|
||||
window.EventTarget.prototype.addEventListener = function addEventListener(type, callback, options) {
|
||||
if (typeof options === "object" && options.signal != null) {
|
||||
const { signal, ...otherOptions } = options;
|
||||
// - this happens because AbortSignal is provided by Node.js,
|
||||
// but jsdom APIs require jsdom's AbortSignal, while Node APIs
|
||||
// (like fetch and Request) require a Node.js AbortSignal
|
||||
// - disable narrow typing with "as any" because we need it later
|
||||
if (!(signal instanceof JSDOMAbortSignal)) {
|
||||
const jsdomCompatOptions = Object.create(null);
|
||||
Object.assign(jsdomCompatOptions, otherOptions);
|
||||
jsdomCompatOptions.signal = getJsdomAbortController(signal).signal;
|
||||
return originalAddEventListener.call(this, type, callback, jsdomCompatOptions);
|
||||
}
|
||||
}
|
||||
return originalAddEventListener.call(this, type, callback, options);
|
||||
};
|
||||
return () => {
|
||||
window.EventTarget.prototype.addEventListener = originalAddEventListener;
|
||||
};
|
||||
}
|
||||
|
||||
// some globals we do not want, either because deprecated or we set it ourselves
|
||||
const denyList = new Set([
|
||||
"GLOBAL",
|
||||
"root",
|
||||
"global",
|
||||
"Buffer",
|
||||
"ArrayBuffer",
|
||||
"Uint8Array"
|
||||
]);
|
||||
const nodeGlobals = /* @__PURE__ */ new Map();
|
||||
function populateNodeGlobals() {
|
||||
if (nodeGlobals.size !== 0) return;
|
||||
const names = Object.getOwnPropertyNames(globalThis);
|
||||
const length = names.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
const globalName = names[i];
|
||||
if (!denyList.has(globalName)) {
|
||||
const descriptor = Object.getOwnPropertyDescriptor(globalThis, globalName);
|
||||
if (!descriptor) throw new Error(`No property descriptor for ${globalName}, this is a bug in Vitest.`);
|
||||
nodeGlobals.set(globalName, descriptor);
|
||||
}
|
||||
}
|
||||
}
|
||||
var node = {
|
||||
name: "node",
|
||||
viteEnvironment: "ssr",
|
||||
async setupVM() {
|
||||
populateNodeGlobals();
|
||||
const vm = await import('node:vm');
|
||||
let context = vm.createContext();
|
||||
let global = vm.runInContext("this", context);
|
||||
const contextGlobals = new Set(Object.getOwnPropertyNames(global));
|
||||
for (const [nodeGlobalsKey, descriptor] of nodeGlobals) if (!contextGlobals.has(nodeGlobalsKey)) if (descriptor.configurable) Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: true,
|
||||
enumerable: descriptor.enumerable,
|
||||
get() {
|
||||
// @ts-expect-error: no index signature
|
||||
const val = globalThis[nodeGlobalsKey];
|
||||
// override lazy getter
|
||||
Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: true,
|
||||
enumerable: descriptor.enumerable,
|
||||
value: val,
|
||||
writable: descriptor.writable === true || nodeGlobalsKey === "performance"
|
||||
});
|
||||
return val;
|
||||
},
|
||||
set(val) {
|
||||
// override lazy getter
|
||||
Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: true,
|
||||
enumerable: descriptor.enumerable,
|
||||
value: val,
|
||||
writable: true
|
||||
});
|
||||
}
|
||||
});
|
||||
else if ("value" in descriptor) Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: false,
|
||||
enumerable: descriptor.enumerable,
|
||||
value: descriptor.value,
|
||||
writable: descriptor.writable
|
||||
});
|
||||
else Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: false,
|
||||
enumerable: descriptor.enumerable,
|
||||
get: descriptor.get,
|
||||
set: descriptor.set
|
||||
});
|
||||
global.global = global;
|
||||
global.Buffer = Buffer;
|
||||
global.ArrayBuffer = ArrayBuffer;
|
||||
// TextEncoder (global or via 'util') references a Uint8Array constructor
|
||||
// different than the global one used by users in tests. This makes sure the
|
||||
// same constructor is referenced by both.
|
||||
global.Uint8Array = Uint8Array;
|
||||
return {
|
||||
getVmContext() {
|
||||
return context;
|
||||
},
|
||||
teardown() {
|
||||
context = void 0;
|
||||
global = void 0;
|
||||
}
|
||||
};
|
||||
},
|
||||
async setup(global) {
|
||||
global.console.Console = Console;
|
||||
return { teardown(global) {
|
||||
delete global.console.Console;
|
||||
} };
|
||||
}
|
||||
};
|
||||
|
||||
const environments = {
|
||||
node,
|
||||
jsdom,
|
||||
"happy-dom": happy,
|
||||
"edge-runtime": edge
|
||||
};
|
||||
|
||||
export { environments as e, populateGlobal as p };
|
||||
213
node_modules/vitest/dist/chunks/index.D3XRDfWc.js
generated
vendored
Normal file
213
node_modules/vitest/dist/chunks/index.D3XRDfWc.js
generated
vendored
Normal file
@@ -0,0 +1,213 @@
|
||||
import process from 'node:process';
|
||||
import fs from 'node:fs/promises';
|
||||
import path, { resolve } from 'node:path';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { x } from 'tinyexec';
|
||||
|
||||
const AGENTS = [
|
||||
"npm",
|
||||
"yarn",
|
||||
"yarn@berry",
|
||||
"pnpm",
|
||||
"pnpm@6",
|
||||
"bun",
|
||||
"deno"
|
||||
];
|
||||
const LOCKS = {
|
||||
"bun.lock": "bun",
|
||||
"bun.lockb": "bun",
|
||||
"deno.lock": "deno",
|
||||
"pnpm-lock.yaml": "pnpm",
|
||||
"pnpm-workspace.yaml": "pnpm",
|
||||
"yarn.lock": "yarn",
|
||||
"package-lock.json": "npm",
|
||||
"npm-shrinkwrap.json": "npm"
|
||||
};
|
||||
const INSTALL_METADATA = {
|
||||
"node_modules/.deno/": "deno",
|
||||
"node_modules/.pnpm/": "pnpm",
|
||||
"node_modules/.yarn-state.yml": "yarn",
|
||||
// yarn v2+ (node-modules)
|
||||
"node_modules/.yarn_integrity": "yarn",
|
||||
// yarn v1
|
||||
"node_modules/.package-lock.json": "npm",
|
||||
".pnp.cjs": "yarn",
|
||||
// yarn v3+ (pnp)
|
||||
".pnp.js": "yarn",
|
||||
// yarn v2 (pnp)
|
||||
"bun.lock": "bun",
|
||||
"bun.lockb": "bun"
|
||||
};
|
||||
|
||||
async function pathExists(path2, type) {
|
||||
try {
|
||||
const stat = await fs.stat(path2);
|
||||
return type === "file" ? stat.isFile() : stat.isDirectory();
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function* lookup(cwd = process.cwd()) {
|
||||
let directory = path.resolve(cwd);
|
||||
const { root } = path.parse(directory);
|
||||
while (directory && directory !== root) {
|
||||
yield directory;
|
||||
directory = path.dirname(directory);
|
||||
}
|
||||
}
|
||||
async function parsePackageJson(filepath, onUnknown) {
|
||||
return !filepath || !pathExists(filepath, "file") ? null : await handlePackageManager(filepath, onUnknown);
|
||||
}
|
||||
async function detect(options = {}) {
|
||||
const {
|
||||
cwd,
|
||||
strategies = ["lockfile", "packageManager-field", "devEngines-field"],
|
||||
onUnknown
|
||||
} = options;
|
||||
let stopDir;
|
||||
if (typeof options.stopDir === "string") {
|
||||
const resolved = path.resolve(options.stopDir);
|
||||
stopDir = (dir) => dir === resolved;
|
||||
} else {
|
||||
stopDir = options.stopDir;
|
||||
}
|
||||
for (const directory of lookup(cwd)) {
|
||||
for (const strategy of strategies) {
|
||||
switch (strategy) {
|
||||
case "lockfile": {
|
||||
for (const lock of Object.keys(LOCKS)) {
|
||||
if (await pathExists(path.join(directory, lock), "file")) {
|
||||
const name = LOCKS[lock];
|
||||
const result = await parsePackageJson(path.join(directory, "package.json"), onUnknown);
|
||||
if (result)
|
||||
return result;
|
||||
else
|
||||
return { name, agent: name };
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "packageManager-field":
|
||||
case "devEngines-field": {
|
||||
const result = await parsePackageJson(path.join(directory, "package.json"), onUnknown);
|
||||
if (result)
|
||||
return result;
|
||||
break;
|
||||
}
|
||||
case "install-metadata": {
|
||||
for (const metadata of Object.keys(INSTALL_METADATA)) {
|
||||
const fileOrDir = metadata.endsWith("/") ? "dir" : "file";
|
||||
if (await pathExists(path.join(directory, metadata), fileOrDir)) {
|
||||
const name = INSTALL_METADATA[metadata];
|
||||
const agent = name === "yarn" ? isMetadataYarnClassic(metadata) ? "yarn" : "yarn@berry" : name;
|
||||
return { name, agent };
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (stopDir?.(directory))
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function getNameAndVer(pkg) {
|
||||
const handelVer = (version) => version?.match(/\d+(\.\d+){0,2}/)?.[0] ?? version;
|
||||
if (typeof pkg.packageManager === "string") {
|
||||
const [name, ver] = pkg.packageManager.replace(/^\^/, "").split("@");
|
||||
return { name, ver: handelVer(ver) };
|
||||
}
|
||||
if (typeof pkg.devEngines?.packageManager?.name === "string") {
|
||||
return {
|
||||
name: pkg.devEngines.packageManager.name,
|
||||
ver: handelVer(pkg.devEngines.packageManager.version)
|
||||
};
|
||||
}
|
||||
return void 0;
|
||||
}
|
||||
async function handlePackageManager(filepath, onUnknown) {
|
||||
try {
|
||||
const pkg = JSON.parse(await fs.readFile(filepath, "utf8"));
|
||||
let agent;
|
||||
const nameAndVer = getNameAndVer(pkg);
|
||||
if (nameAndVer) {
|
||||
const name = nameAndVer.name;
|
||||
const ver = nameAndVer.ver;
|
||||
let version = ver;
|
||||
if (name === "yarn" && ver && Number.parseInt(ver) > 1) {
|
||||
agent = "yarn@berry";
|
||||
version = "berry";
|
||||
return { name, agent, version };
|
||||
} else if (name === "pnpm" && ver && Number.parseInt(ver) < 7) {
|
||||
agent = "pnpm@6";
|
||||
return { name, agent, version };
|
||||
} else if (AGENTS.includes(name)) {
|
||||
agent = name;
|
||||
return { name, agent, version };
|
||||
} else {
|
||||
return onUnknown?.(pkg.packageManager) ?? null;
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function isMetadataYarnClassic(metadataPath) {
|
||||
return metadataPath.endsWith(".yarn_integrity");
|
||||
}
|
||||
|
||||
// src/detect.ts
|
||||
async function detectPackageManager(cwd = process.cwd()) {
|
||||
const result = await detect({
|
||||
cwd,
|
||||
onUnknown(packageManager) {
|
||||
console.warn("[@antfu/install-pkg] Unknown packageManager:", packageManager);
|
||||
return void 0;
|
||||
}
|
||||
});
|
||||
return result?.agent || null;
|
||||
}
|
||||
async function installPackage(names, options = {}) {
|
||||
const detectedAgent = options.packageManager || await detectPackageManager(options.cwd) || "npm";
|
||||
const [agent] = detectedAgent.split("@");
|
||||
if (!Array.isArray(names))
|
||||
names = [names];
|
||||
const args = (typeof options.additionalArgs === "function" ? options.additionalArgs(agent, detectedAgent) : options.additionalArgs) || [];
|
||||
if (options.preferOffline) {
|
||||
if (detectedAgent === "yarn@berry")
|
||||
args.unshift("--cached");
|
||||
else
|
||||
args.unshift("--prefer-offline");
|
||||
}
|
||||
if (agent === "pnpm") {
|
||||
args.unshift(
|
||||
/**
|
||||
* Prevent pnpm from removing installed devDeps while `NODE_ENV` is `production`
|
||||
* @see https://pnpm.io/cli/install#--prod--p
|
||||
*/
|
||||
"--prod=false"
|
||||
);
|
||||
if (existsSync(resolve(options.cwd ?? process.cwd(), "pnpm-workspace.yaml"))) {
|
||||
args.unshift("-w");
|
||||
}
|
||||
}
|
||||
return x(
|
||||
agent,
|
||||
[
|
||||
agent === "yarn" ? "add" : "install",
|
||||
options.dev ? "-D" : "",
|
||||
...args,
|
||||
...names
|
||||
].filter(Boolean),
|
||||
{
|
||||
nodeOptions: {
|
||||
stdio: options.silent ? "ignore" : "inherit",
|
||||
cwd: options.cwd
|
||||
},
|
||||
throwOnError: true
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export { detectPackageManager, installPackage };
|
||||
6343
node_modules/vitest/dist/chunks/index.D4KonVSU.js
generated
vendored
Normal file
6343
node_modules/vitest/dist/chunks/index.D4KonVSU.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
231
node_modules/vitest/dist/chunks/index.Drsj_6e7.js
generated
vendored
Normal file
231
node_modules/vitest/dist/chunks/index.Drsj_6e7.js
generated
vendored
Normal file
@@ -0,0 +1,231 @@
|
||||
import fs from 'node:fs';
|
||||
import { getTasks, getFullName, getTests } from '@vitest/runner/utils';
|
||||
import * as pathe from 'pathe';
|
||||
import c from 'tinyrainbow';
|
||||
import { g as getStateSymbol, t as truncateString, F as F_RIGHT, D as DefaultReporter, f as formatProjectName, s as separator } from './index.456_DGfR.js';
|
||||
import { stripVTControlCharacters } from 'node:util';
|
||||
import { notNullish } from '@vitest/utils/helpers';
|
||||
|
||||
function createBenchmarkJsonReport(files) {
|
||||
const report = { files: [] };
|
||||
for (const file of files) {
|
||||
const groups = [];
|
||||
for (const task of getTasks(file)) if (task?.type === "suite") {
|
||||
const benchmarks = [];
|
||||
for (const t of task.tasks) {
|
||||
const benchmark = t.meta.benchmark && t.result?.benchmark;
|
||||
if (benchmark) benchmarks.push({
|
||||
id: t.id,
|
||||
...benchmark,
|
||||
samples: []
|
||||
});
|
||||
}
|
||||
if (benchmarks.length) groups.push({
|
||||
fullName: getFullName(task, " > "),
|
||||
benchmarks
|
||||
});
|
||||
}
|
||||
report.files.push({
|
||||
filepath: file.filepath,
|
||||
groups
|
||||
});
|
||||
}
|
||||
return report;
|
||||
}
|
||||
function flattenFormattedBenchmarkReport(report) {
|
||||
const flat = {};
|
||||
for (const file of report.files) for (const group of file.groups) for (const t of group.benchmarks) flat[t.id] = t;
|
||||
return flat;
|
||||
}
|
||||
|
||||
const outputMap = /* @__PURE__ */ new WeakMap();
|
||||
function formatNumber(number) {
|
||||
const res = String(number.toFixed(number < 100 ? 4 : 2)).split(".");
|
||||
return res[0].replace(/(?=(?:\d{3})+$)\B/g, ",") + (res[1] ? `.${res[1]}` : "");
|
||||
}
|
||||
const tableHead = [
|
||||
"name",
|
||||
"hz",
|
||||
"min",
|
||||
"max",
|
||||
"mean",
|
||||
"p75",
|
||||
"p99",
|
||||
"p995",
|
||||
"p999",
|
||||
"rme",
|
||||
"samples"
|
||||
];
|
||||
function renderBenchmarkItems(result) {
|
||||
return [
|
||||
result.name,
|
||||
formatNumber(result.hz || 0),
|
||||
formatNumber(result.min || 0),
|
||||
formatNumber(result.max || 0),
|
||||
formatNumber(result.mean || 0),
|
||||
formatNumber(result.p75 || 0),
|
||||
formatNumber(result.p99 || 0),
|
||||
formatNumber(result.p995 || 0),
|
||||
formatNumber(result.p999 || 0),
|
||||
`±${(result.rme || 0).toFixed(2)}%`,
|
||||
(result.sampleCount || 0).toString()
|
||||
];
|
||||
}
|
||||
function computeColumnWidths(results) {
|
||||
const rows = [tableHead, ...results.map((v) => renderBenchmarkItems(v))];
|
||||
return Array.from(tableHead, (_, i) => Math.max(...rows.map((row) => stripVTControlCharacters(row[i]).length)));
|
||||
}
|
||||
function padRow(row, widths) {
|
||||
return row.map((v, i) => i ? v.padStart(widths[i], " ") : v.padEnd(widths[i], " "));
|
||||
}
|
||||
function renderTableHead(widths) {
|
||||
return " ".repeat(3) + padRow(tableHead, widths).map(c.bold).join(" ");
|
||||
}
|
||||
function renderBenchmark(result, widths) {
|
||||
const padded = padRow(renderBenchmarkItems(result), widths);
|
||||
return [
|
||||
padded[0],
|
||||
c.blue(padded[1]),
|
||||
c.cyan(padded[2]),
|
||||
c.cyan(padded[3]),
|
||||
c.cyan(padded[4]),
|
||||
c.cyan(padded[5]),
|
||||
c.cyan(padded[6]),
|
||||
c.cyan(padded[7]),
|
||||
c.cyan(padded[8]),
|
||||
c.dim(padded[9]),
|
||||
c.dim(padded[10])
|
||||
].join(" ");
|
||||
}
|
||||
function renderTable(options) {
|
||||
const output = [];
|
||||
const benchMap = {};
|
||||
for (const task of options.tasks) if (task.meta.benchmark && task.result?.benchmark) benchMap[task.id] = {
|
||||
current: task.result.benchmark,
|
||||
baseline: options.compare?.[task.id]
|
||||
};
|
||||
const benchCount = Object.entries(benchMap).length;
|
||||
const columnWidths = computeColumnWidths(Object.values(benchMap).flatMap((v) => [v.current, v.baseline]).filter(notNullish));
|
||||
let idx = 0;
|
||||
const padding = " ".repeat(1 );
|
||||
for (const task of options.tasks) {
|
||||
const duration = task.result?.duration;
|
||||
const bench = benchMap[task.id];
|
||||
let prefix = "";
|
||||
if (idx === 0 && task.meta?.benchmark) prefix += `${renderTableHead(columnWidths)}\n${padding}`;
|
||||
prefix += ` ${getStateSymbol(task)} `;
|
||||
let suffix = "";
|
||||
if (task.type === "suite") suffix += c.dim(` (${getTests(task).length})`);
|
||||
if (task.mode === "skip" || task.mode === "todo") suffix += c.dim(c.gray(" [skipped]"));
|
||||
if (duration != null) {
|
||||
const color = duration > options.slowTestThreshold ? c.yellow : c.green;
|
||||
suffix += color(` ${Math.round(duration)}${c.dim("ms")}`);
|
||||
}
|
||||
if (options.showHeap && task.result?.heap != null) suffix += c.magenta(` ${Math.floor(task.result.heap / 1024 / 1024)} MB heap used`);
|
||||
if (bench) {
|
||||
let body = renderBenchmark(bench.current, columnWidths);
|
||||
if (options.compare && bench.baseline) {
|
||||
if (bench.current.hz) {
|
||||
const diff = bench.current.hz / bench.baseline.hz;
|
||||
const diffFixed = diff.toFixed(2);
|
||||
if (diffFixed === "1.0.0") body += c.gray(` [${diffFixed}x]`);
|
||||
if (diff > 1) body += c.blue(` [${diffFixed}x] ⇑`);
|
||||
else body += c.red(` [${diffFixed}x] ⇓`);
|
||||
}
|
||||
output.push(padding + prefix + body + suffix);
|
||||
const bodyBaseline = renderBenchmark(bench.baseline, columnWidths);
|
||||
output.push(`${padding} ${bodyBaseline} ${c.dim("(baseline)")}`);
|
||||
} else {
|
||||
if (bench.current.rank === 1 && benchCount > 1) body += c.bold(c.green(" fastest"));
|
||||
if (bench.current.rank === benchCount && benchCount > 2) body += c.bold(c.gray(" slowest"));
|
||||
output.push(padding + prefix + body + suffix);
|
||||
}
|
||||
} else output.push(padding + prefix + task.name + suffix);
|
||||
if (task.result?.state !== "pass" && outputMap.get(task) != null) {
|
||||
let data = outputMap.get(task);
|
||||
if (typeof data === "string") {
|
||||
data = stripVTControlCharacters(data.trim().split("\n").filter(Boolean).pop());
|
||||
if (data === "") data = void 0;
|
||||
}
|
||||
if (data != null) {
|
||||
const out = ` ${" ".repeat(options.level)}${F_RIGHT} ${data}`;
|
||||
output.push(c.gray(truncateString(out, options.columns)));
|
||||
}
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
return output.filter(Boolean).join("\n");
|
||||
}
|
||||
|
||||
class BenchmarkReporter extends DefaultReporter {
|
||||
compare;
|
||||
async onInit(ctx) {
|
||||
super.onInit(ctx);
|
||||
if (this.ctx.config.benchmark?.compare) {
|
||||
const compareFile = pathe.resolve(this.ctx.config.root, this.ctx.config.benchmark?.compare);
|
||||
try {
|
||||
this.compare = flattenFormattedBenchmarkReport(JSON.parse(await fs.promises.readFile(compareFile, "utf-8")));
|
||||
} catch (e) {
|
||||
this.error(`Failed to read '${compareFile}'`, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
onTaskUpdate(packs) {
|
||||
for (const pack of packs) {
|
||||
const task = this.ctx.state.idMap.get(pack[0]);
|
||||
if (task?.type === "suite" && task.result?.state !== "run") task.tasks.filter((task) => task.result?.benchmark).sort((benchA, benchB) => benchA.result.benchmark.mean - benchB.result.benchmark.mean).forEach((bench, idx) => {
|
||||
bench.result.benchmark.rank = Number(idx) + 1;
|
||||
});
|
||||
}
|
||||
}
|
||||
onTestSuiteResult(testSuite) {
|
||||
super.onTestSuiteResult(testSuite);
|
||||
this.printSuiteTable(testSuite);
|
||||
}
|
||||
printTestModule(testModule) {
|
||||
this.printSuiteTable(testModule);
|
||||
}
|
||||
printSuiteTable(testTask) {
|
||||
const state = testTask.state();
|
||||
if (state === "pending" || state === "queued") return;
|
||||
const benches = testTask.task.tasks.filter((t) => t.meta.benchmark);
|
||||
const duration = testTask.task.result?.duration || 0;
|
||||
if (benches.length > 0 && benches.every((t) => t.result?.state !== "run" && t.result?.state !== "queued")) {
|
||||
let title = `\n ${getStateSymbol(testTask.task)} ${formatProjectName(testTask.project)}${getFullName(testTask.task, separator)}`;
|
||||
if (duration != null && duration > this.ctx.config.slowTestThreshold) title += c.yellow(` ${Math.round(duration)}${c.dim("ms")}`);
|
||||
this.log(title);
|
||||
this.log(renderTable({
|
||||
tasks: benches,
|
||||
level: 1,
|
||||
columns: this.ctx.logger.getColumns(),
|
||||
compare: this.compare,
|
||||
showHeap: this.ctx.config.logHeapUsage,
|
||||
slowTestThreshold: this.ctx.config.slowTestThreshold
|
||||
}));
|
||||
}
|
||||
}
|
||||
async onTestRunEnd(testModules, unhandledErrors, reason) {
|
||||
super.onTestRunEnd(testModules, unhandledErrors, reason);
|
||||
// write output for future comparison
|
||||
let outputFile = this.ctx.config.benchmark?.outputJson;
|
||||
if (outputFile) {
|
||||
outputFile = pathe.resolve(this.ctx.config.root, outputFile);
|
||||
const outputDirectory = pathe.dirname(outputFile);
|
||||
if (!fs.existsSync(outputDirectory)) await fs.promises.mkdir(outputDirectory, { recursive: true });
|
||||
const output = createBenchmarkJsonReport(testModules.map((t) => t.task.file));
|
||||
await fs.promises.writeFile(outputFile, JSON.stringify(output, null, 2));
|
||||
this.log(`Benchmark report written to ${outputFile}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class VerboseBenchmarkReporter extends BenchmarkReporter {
|
||||
verbose = true;
|
||||
}
|
||||
|
||||
const BenchmarkReportsMap = {
|
||||
default: BenchmarkReporter,
|
||||
verbose: VerboseBenchmarkReporter
|
||||
};
|
||||
|
||||
export { BenchmarkReporter as B, VerboseBenchmarkReporter as V, BenchmarkReportsMap as a };
|
||||
37
node_modules/vitest/dist/chunks/index.Z5E_ObnR.js
generated
vendored
Normal file
37
node_modules/vitest/dist/chunks/index.Z5E_ObnR.js
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
import { b as assert, c as createExpect, g as globalExpect, i as inject, s as should, v as vi, d as vitest } from './vi.2VT5v0um.js';
|
||||
import { b as bench } from './benchmark.B3N2zMcH.js';
|
||||
import { V as VitestEvaluatedModules } from './evaluatedModules.Dg1zASAC.js';
|
||||
import { expectTypeOf } from 'expect-type';
|
||||
import { afterAll, afterEach, beforeAll, beforeEach, describe, it, onTestFailed, onTestFinished, recordArtifact, suite, test } from '@vitest/runner';
|
||||
import { chai } from '@vitest/expect';
|
||||
|
||||
const assertType = function assertType() {};
|
||||
|
||||
var index = /*#__PURE__*/Object.freeze({
|
||||
__proto__: null,
|
||||
EvaluatedModules: VitestEvaluatedModules,
|
||||
afterAll: afterAll,
|
||||
afterEach: afterEach,
|
||||
assert: assert,
|
||||
assertType: assertType,
|
||||
beforeAll: beforeAll,
|
||||
beforeEach: beforeEach,
|
||||
bench: bench,
|
||||
chai: chai,
|
||||
createExpect: createExpect,
|
||||
describe: describe,
|
||||
expect: globalExpect,
|
||||
expectTypeOf: expectTypeOf,
|
||||
inject: inject,
|
||||
it: it,
|
||||
onTestFailed: onTestFailed,
|
||||
onTestFinished: onTestFinished,
|
||||
recordArtifact: recordArtifact,
|
||||
should: should,
|
||||
suite: suite,
|
||||
test: test,
|
||||
vi: vi,
|
||||
vitest: vitest
|
||||
});
|
||||
|
||||
export { assertType as a, index as i };
|
||||
109
node_modules/vitest/dist/chunks/index.bFLgAE-Z.js
generated
vendored
Normal file
109
node_modules/vitest/dist/chunks/index.bFLgAE-Z.js
generated
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
import { chai } from '@vitest/expect';
|
||||
import { l as loadDiffConfig, b as loadSnapshotSerializers, t as takeCoverageInsideWorker } from './setup-common.Cm-kSBVi.js';
|
||||
import { r as rpc } from './rpc.BytlcPfC.js';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
import { V as VitestTestRunner, N as NodeBenchmarkRunner } from './test.BT8LKgU9.js';
|
||||
|
||||
function setupChaiConfig(config) {
|
||||
Object.assign(chai.config, config);
|
||||
}
|
||||
|
||||
async function resolveSnapshotEnvironment(config, executor) {
|
||||
if (!config.snapshotEnvironment) {
|
||||
const { VitestNodeSnapshotEnvironment } = await import('./node.Ce0vMQM7.js');
|
||||
return new VitestNodeSnapshotEnvironment();
|
||||
}
|
||||
const mod = await executor.import(config.snapshotEnvironment);
|
||||
if (typeof mod.default !== "object" || !mod.default) throw new Error("Snapshot environment module must have a default export object with a shape of `SnapshotEnvironment`");
|
||||
return mod.default;
|
||||
}
|
||||
|
||||
async function getTestRunnerConstructor(config, moduleRunner) {
|
||||
if (!config.runner) return config.mode === "test" ? VitestTestRunner : NodeBenchmarkRunner;
|
||||
const mod = await moduleRunner.import(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 resolveTestRunner(config, moduleRunner, traces) {
|
||||
const testRunner = new (await (getTestRunnerConstructor(config, moduleRunner)))(config);
|
||||
// inject private executor to every runner
|
||||
Object.defineProperty(testRunner, "moduleRunner", {
|
||||
value: moduleRunner,
|
||||
enumerable: false,
|
||||
configurable: false
|
||||
});
|
||||
if (!testRunner.config) testRunner.config = config;
|
||||
if (!testRunner.importFile) throw new Error("Runner must implement \"importFile\" method.");
|
||||
if ("__setTraces" in testRunner) testRunner.__setTraces(traces);
|
||||
const [diffOptions] = await Promise.all([loadDiffConfig(config, moduleRunner), loadSnapshotSerializers(config, moduleRunner)]);
|
||||
testRunner.config.diffOptions = diffOptions;
|
||||
// patch some methods, so custom runners don't need to call RPC
|
||||
const originalOnTaskUpdate = testRunner.onTaskUpdate;
|
||||
testRunner.onTaskUpdate = async (task, events) => {
|
||||
const p = rpc().onTaskUpdate(task, events);
|
||||
await originalOnTaskUpdate?.call(testRunner, task, events);
|
||||
return p;
|
||||
};
|
||||
// patch some methods, so custom runners don't need to call RPC
|
||||
const originalOnTestAnnotate = testRunner.onTestAnnotate;
|
||||
testRunner.onTestAnnotate = async (test, annotation) => {
|
||||
const p = rpc().onTaskArtifactRecord(test.id, {
|
||||
type: "internal:annotation",
|
||||
location: annotation.location,
|
||||
annotation
|
||||
});
|
||||
const overriddenResult = await originalOnTestAnnotate?.call(testRunner, test, annotation);
|
||||
const vitestResult = await p;
|
||||
return overriddenResult || vitestResult.annotation;
|
||||
};
|
||||
const originalOnTestArtifactRecord = testRunner.onTestArtifactRecord;
|
||||
testRunner.onTestArtifactRecord = async (test, artifact) => {
|
||||
const p = rpc().onTaskArtifactRecord(test.id, artifact);
|
||||
const overriddenResult = await originalOnTestArtifactRecord?.call(testRunner, test, artifact);
|
||||
const vitestResult = await p;
|
||||
return overriddenResult || vitestResult;
|
||||
};
|
||||
const originalOnCollectStart = testRunner.onCollectStart;
|
||||
testRunner.onCollectStart = async (file) => {
|
||||
await rpc().onQueued(file);
|
||||
await originalOnCollectStart?.call(testRunner, file);
|
||||
};
|
||||
const originalOnCollected = testRunner.onCollected;
|
||||
testRunner.onCollected = async (files) => {
|
||||
const state = getWorkerState();
|
||||
files.forEach((file) => {
|
||||
file.prepareDuration = state.durations.prepare;
|
||||
file.environmentLoad = state.durations.environment;
|
||||
// should be collected only for a single test file in a batch
|
||||
state.durations.prepare = 0;
|
||||
state.durations.environment = 0;
|
||||
});
|
||||
rpc().onCollected(files);
|
||||
await originalOnCollected?.call(testRunner, files);
|
||||
};
|
||||
const originalOnAfterRun = testRunner.onAfterRunFiles;
|
||||
testRunner.onAfterRunFiles = async (files) => {
|
||||
const state = getWorkerState();
|
||||
const coverage = await takeCoverageInsideWorker(config.coverage, moduleRunner);
|
||||
if (coverage) rpc().onAfterSuiteRun({
|
||||
coverage,
|
||||
testFiles: files.map((file) => file.name).sort(),
|
||||
environment: state.environment.viteEnvironment || state.environment.name,
|
||||
projectName: state.ctx.projectName
|
||||
});
|
||||
await originalOnAfterRun?.call(testRunner, files);
|
||||
};
|
||||
const originalOnAfterRunTask = testRunner.onAfterRunTask;
|
||||
testRunner.onAfterRunTask = async (test) => {
|
||||
if (config.bail && test.result?.state === "fail") {
|
||||
if (1 + await rpc().getCountOfFailedTests() >= config.bail) {
|
||||
rpc().onCancel("test-failure");
|
||||
testRunner.cancel?.("test-failure");
|
||||
}
|
||||
}
|
||||
await originalOnAfterRunTask?.call(testRunner, test);
|
||||
};
|
||||
return testRunner;
|
||||
}
|
||||
|
||||
export { resolveSnapshotEnvironment as a, resolveTestRunner as r, setupChaiConfig as s };
|
||||
41
node_modules/vitest/dist/chunks/init-forks.CKEYp90N.js
generated
vendored
Normal file
41
node_modules/vitest/dist/chunks/init-forks.CKEYp90N.js
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
import { i as init } from './init.B04saIIg.js';
|
||||
|
||||
if (!process.send) throw new Error("Expected worker to be run in node:child_process");
|
||||
// Store globals in case tests overwrite them
|
||||
const processExit = process.exit.bind(process);
|
||||
const processSend = process.send.bind(process);
|
||||
const processOn = process.on.bind(process);
|
||||
const processOff = process.off.bind(process);
|
||||
const processRemoveAllListeners = process.removeAllListeners.bind(process);
|
||||
// Work-around for nodejs/node#55094
|
||||
if (process.execArgv.some((execArg) => execArg.startsWith("--prof") || execArg.startsWith("--cpu-prof") || execArg.startsWith("--heap-prof") || execArg.startsWith("--diagnostic-dir"))) processOn("SIGTERM", () => processExit());
|
||||
processOn("error", onError);
|
||||
function workerInit(options) {
|
||||
const { runTests } = options;
|
||||
init({
|
||||
post: (v) => processSend(v),
|
||||
on: (cb) => processOn("message", cb),
|
||||
off: (cb) => processOff("message", cb),
|
||||
teardown: () => {
|
||||
processRemoveAllListeners("message");
|
||||
processOff("error", onError);
|
||||
},
|
||||
runTests: (state, traces) => executeTests("run", state, traces),
|
||||
collectTests: (state, traces) => executeTests("collect", state, traces),
|
||||
setup: options.setup
|
||||
});
|
||||
async function executeTests(method, state, traces) {
|
||||
try {
|
||||
await runTests(method, state, traces);
|
||||
} finally {
|
||||
process.exit = processExit;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Prevent leaving worker in loops where it tries to send message to closed main
|
||||
// thread, errors, and tries to send the error.
|
||||
function onError(error) {
|
||||
if (error?.code === "ERR_IPC_CHANNEL_CLOSED" || error?.code === "EPIPE") processExit(1);
|
||||
}
|
||||
|
||||
export { workerInit as w };
|
||||
18
node_modules/vitest/dist/chunks/init-threads.D8Ok07M7.js
generated
vendored
Normal file
18
node_modules/vitest/dist/chunks/init-threads.D8Ok07M7.js
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
import { isMainThread, parentPort } from 'node:worker_threads';
|
||||
import { i as init } from './init.B04saIIg.js';
|
||||
|
||||
if (isMainThread || !parentPort) throw new Error("Expected worker to be run in node:worker_threads");
|
||||
function workerInit(options) {
|
||||
const { runTests } = options;
|
||||
init({
|
||||
post: (response) => parentPort.postMessage(response),
|
||||
on: (callback) => parentPort.on("message", callback),
|
||||
off: (callback) => parentPort.off("message", callback),
|
||||
teardown: () => parentPort.removeAllListeners("message"),
|
||||
runTests: async (state, traces) => runTests("run", state, traces),
|
||||
collectTests: async (state, traces) => runTests("collect", state, traces),
|
||||
setup: options.setup
|
||||
});
|
||||
}
|
||||
|
||||
export { workerInit as w };
|
||||
321
node_modules/vitest/dist/chunks/init.B04saIIg.js
generated
vendored
Normal file
321
node_modules/vitest/dist/chunks/init.B04saIIg.js
generated
vendored
Normal file
@@ -0,0 +1,321 @@
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { isBuiltin } from 'node:module';
|
||||
import { pathToFileURL } from 'node:url';
|
||||
import { resolve } from 'pathe';
|
||||
import { ModuleRunner } from 'vite/module-runner';
|
||||
import { b as VitestTransport } from './startModuleRunner.Iz2V0ESw.js';
|
||||
import { e as environments } from './index.BspFP3mn.js';
|
||||
import { serializeError } from '@vitest/utils/error';
|
||||
import { T as Traces } from './traces.U4xDYhzZ.js';
|
||||
import { o as onCancel, a as rpcDone, c as createRuntimeRpc } from './rpc.BytlcPfC.js';
|
||||
import { createStackString, parseStacktrace } from '@vitest/utils/source-map';
|
||||
import { s as setupInspect } from './inspector.CvyFGlXm.js';
|
||||
import { V as VitestEvaluatedModules } from './evaluatedModules.Dg1zASAC.js';
|
||||
|
||||
function isBuiltinEnvironment(env) {
|
||||
return env in environments;
|
||||
}
|
||||
const isWindows = process.platform === "win32";
|
||||
const _loaders = /* @__PURE__ */ new Map();
|
||||
function createEnvironmentLoader(root, rpc) {
|
||||
const cachedLoader = _loaders.get(root);
|
||||
if (!cachedLoader || cachedLoader.isClosed()) {
|
||||
_loaders.delete(root);
|
||||
const moduleRunner = new ModuleRunner({
|
||||
hmr: false,
|
||||
sourcemapInterceptor: "prepareStackTrace",
|
||||
transport: new VitestTransport({
|
||||
async fetchModule(id, importer, options) {
|
||||
const result = await rpc.fetch(id, importer, "__vitest__", options);
|
||||
if ("cached" in result) return {
|
||||
code: readFileSync(result.tmp, "utf-8"),
|
||||
...result
|
||||
};
|
||||
if (isWindows && "externalize" in result)
|
||||
// TODO: vitest returns paths for external modules, but Vite returns file://
|
||||
// https://github.com/vitejs/vite/pull/20449
|
||||
result.externalize = isBuiltin(id) || /^(?:node:|data:|http:|https:|file:)/.test(id) ? result.externalize : pathToFileURL(result.externalize).toString();
|
||||
return result;
|
||||
},
|
||||
async resolveId(id, importer) {
|
||||
return rpc.resolve(id, importer, "__vitest__");
|
||||
}
|
||||
})
|
||||
});
|
||||
_loaders.set(root, moduleRunner);
|
||||
}
|
||||
return _loaders.get(root);
|
||||
}
|
||||
async function loadEnvironment(name, root, rpc, traces) {
|
||||
if (isBuiltinEnvironment(name)) return { environment: environments[name] };
|
||||
const loader = createEnvironmentLoader(root, rpc);
|
||||
const packageId = name[0] === "." || name[0] === "/" ? resolve(root, name) : (await traces.$("vitest.runtime.environment.resolve", () => rpc.resolve(`vitest-environment-${name}`, void 0, "__vitest__")))?.id ?? resolve(root, name);
|
||||
const pkg = await traces.$("vitest.runtime.environment.import", () => loader.import(packageId));
|
||||
if (!pkg || !pkg.default || typeof pkg.default !== "object") throw new TypeError(`Environment "${name}" is not a valid environment. Path "${packageId}" should export default object with a "setup" or/and "setupVM" method.`);
|
||||
const environment = pkg.default;
|
||||
if (environment.transformMode != null && environment.transformMode !== "web" && environment.transformMode !== "ssr") throw new TypeError(`Environment "${name}" is not a valid environment. Path "${packageId}" should export default object with a "transformMode" method equal to "ssr" or "web", received "${environment.transformMode}".`);
|
||||
if (environment.transformMode) {
|
||||
console.warn(`The Vitest environment ${environment.name} defines the "transformMode". This options was deprecated in Vitest 4 and will be removed in the next major version. Please, use "viteEnvironment" instead.`);
|
||||
// keep for backwards compat
|
||||
environment.viteEnvironment ??= environment.transformMode === "ssr" ? "ssr" : "client";
|
||||
}
|
||||
return {
|
||||
environment,
|
||||
loader
|
||||
};
|
||||
}
|
||||
|
||||
const resolvingModules = /* @__PURE__ */ new Set();
|
||||
const globalListeners = /* @__PURE__ */ new Set();
|
||||
async function execute(method, ctx, worker, traces) {
|
||||
const prepareStart = performance.now();
|
||||
const cleanups = [setupInspect(ctx)];
|
||||
// RPC is used to communicate between worker (be it a thread worker or child process or a custom implementation) and the main thread
|
||||
const rpc = ctx.rpc;
|
||||
try {
|
||||
// do not close the RPC channel so that we can get the error messages sent to the main thread
|
||||
cleanups.push(async () => {
|
||||
await Promise.all(rpc.$rejectPendingCalls(({ method, reject }) => {
|
||||
reject(/* @__PURE__ */ new Error(`[vitest-worker]: Closing rpc while "${method}" was pending`));
|
||||
}));
|
||||
});
|
||||
const state = {
|
||||
ctx,
|
||||
evaluatedModules: new VitestEvaluatedModules(),
|
||||
resolvingModules,
|
||||
moduleExecutionInfo: /* @__PURE__ */ new Map(),
|
||||
config: ctx.config,
|
||||
environment: null,
|
||||
durations: {
|
||||
environment: 0,
|
||||
prepare: prepareStart
|
||||
},
|
||||
rpc,
|
||||
onCancel,
|
||||
onCleanup: (listener) => globalListeners.add(listener),
|
||||
providedContext: ctx.providedContext,
|
||||
onFilterStackTrace(stack) {
|
||||
return createStackString(parseStacktrace(stack));
|
||||
},
|
||||
metaEnv: createImportMetaEnvProxy()
|
||||
};
|
||||
const methodName = method === "collect" ? "collectTests" : "runTests";
|
||||
if (!worker[methodName] || typeof worker[methodName] !== "function") throw new TypeError(`Test worker should expose "runTests" method. Received "${typeof worker.runTests}".`);
|
||||
await worker[methodName](state, traces);
|
||||
} finally {
|
||||
await rpcDone().catch(() => {});
|
||||
await Promise.all(cleanups.map((fn) => fn())).catch(() => {});
|
||||
}
|
||||
}
|
||||
function run(ctx, worker, traces) {
|
||||
return execute("run", ctx, worker, traces);
|
||||
}
|
||||
function collect(ctx, worker, traces) {
|
||||
return execute("collect", ctx, worker, traces);
|
||||
}
|
||||
async function teardown() {
|
||||
await Promise.all([...globalListeners].map((l) => l()));
|
||||
}
|
||||
const env = process.env;
|
||||
function createImportMetaEnvProxy() {
|
||||
// packages/vitest/src/node/plugins/index.ts:146
|
||||
const booleanKeys = [
|
||||
"DEV",
|
||||
"PROD",
|
||||
"SSR"
|
||||
];
|
||||
return new Proxy(env, {
|
||||
get(_, key) {
|
||||
if (typeof key !== "string") return;
|
||||
if (booleanKeys.includes(key)) return !!process.env[key];
|
||||
return process.env[key];
|
||||
},
|
||||
set(_, key, value) {
|
||||
if (typeof key !== "string") return true;
|
||||
if (booleanKeys.includes(key)) process.env[key] = value ? "1" : "";
|
||||
else process.env[key] = value;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const __vitest_worker_response__ = true;
|
||||
const memoryUsage = process.memoryUsage.bind(process);
|
||||
let reportMemory = false;
|
||||
let traces;
|
||||
/** @experimental */
|
||||
function init(worker) {
|
||||
worker.on(onMessage);
|
||||
let runPromise;
|
||||
let isRunning = false;
|
||||
let workerTeardown;
|
||||
let setupContext;
|
||||
function send(response) {
|
||||
worker.post(worker.serialize ? worker.serialize(response) : response);
|
||||
}
|
||||
async function onMessage(rawMessage) {
|
||||
const message = worker.deserialize ? worker.deserialize(rawMessage) : rawMessage;
|
||||
if (message?.__vitest_worker_request__ !== true) return;
|
||||
switch (message.type) {
|
||||
case "start": {
|
||||
process.env.VITEST_POOL_ID = String(message.poolId);
|
||||
process.env.VITEST_WORKER_ID = String(message.workerId);
|
||||
reportMemory = message.options.reportMemory;
|
||||
const tracesStart = performance.now();
|
||||
traces ??= await new Traces({
|
||||
enabled: message.traces.enabled,
|
||||
sdkPath: message.traces.sdkPath
|
||||
}).waitInit();
|
||||
const tracesEnd = performance.now();
|
||||
const { environment, config, pool } = message.context;
|
||||
const context = traces.getContextFromCarrier(message.traces.otelCarrier);
|
||||
// record telemetry as part of "start"
|
||||
traces.startSpan("vitest.runtime.traces", { startTime: tracesStart }, context).end(tracesEnd);
|
||||
try {
|
||||
setupContext = {
|
||||
environment,
|
||||
config,
|
||||
pool,
|
||||
rpc: createRuntimeRpc(worker),
|
||||
projectName: config.name || "",
|
||||
traces
|
||||
};
|
||||
workerTeardown = await traces.$("vitest.runtime.setup", { context }, () => worker.setup?.(setupContext));
|
||||
send({
|
||||
type: "started",
|
||||
__vitest_worker_response__
|
||||
});
|
||||
} catch (error) {
|
||||
send({
|
||||
type: "started",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(error)
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "run":
|
||||
// Prevent concurrent execution if worker is already running
|
||||
if (isRunning) {
|
||||
send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(/* @__PURE__ */ new Error("[vitest-worker]: Worker is already running tests"))
|
||||
});
|
||||
return;
|
||||
}
|
||||
try {
|
||||
process.env.VITEST_WORKER_ID = String(message.context.workerId);
|
||||
} catch (error) {
|
||||
return send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(error),
|
||||
usedMemory: reportMemory ? memoryUsage().heapUsed : void 0
|
||||
});
|
||||
}
|
||||
isRunning = true;
|
||||
try {
|
||||
const tracesContext = traces.getContextFromCarrier(message.otelCarrier);
|
||||
runPromise = traces.$("vitest.runtime.run", {
|
||||
context: tracesContext,
|
||||
attributes: {
|
||||
"vitest.worker.specifications": traces.isEnabled() ? getFilesWithLocations(message.context.files) : [],
|
||||
"vitest.worker.id": message.context.workerId
|
||||
}
|
||||
}, () => run({
|
||||
...setupContext,
|
||||
...message.context
|
||||
}, worker, traces).catch((error) => serializeError(error)));
|
||||
send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: await runPromise,
|
||||
usedMemory: reportMemory ? memoryUsage().heapUsed : void 0
|
||||
});
|
||||
} finally {
|
||||
runPromise = void 0;
|
||||
isRunning = false;
|
||||
}
|
||||
break;
|
||||
case "collect":
|
||||
// Prevent concurrent execution if worker is already running
|
||||
if (isRunning) {
|
||||
send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(/* @__PURE__ */ new Error("[vitest-worker]: Worker is already running tests"))
|
||||
});
|
||||
return;
|
||||
}
|
||||
try {
|
||||
process.env.VITEST_WORKER_ID = String(message.context.workerId);
|
||||
} catch (error) {
|
||||
return send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(error),
|
||||
usedMemory: reportMemory ? memoryUsage().heapUsed : void 0
|
||||
});
|
||||
}
|
||||
isRunning = true;
|
||||
try {
|
||||
const tracesContext = traces.getContextFromCarrier(message.otelCarrier);
|
||||
runPromise = traces.$("vitest.runtime.collect", {
|
||||
context: tracesContext,
|
||||
attributes: {
|
||||
"vitest.worker.specifications": traces.isEnabled() ? getFilesWithLocations(message.context.files) : [],
|
||||
"vitest.worker.id": message.context.workerId
|
||||
}
|
||||
}, () => collect({
|
||||
...setupContext,
|
||||
...message.context
|
||||
}, worker, traces).catch((error) => serializeError(error)));
|
||||
send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: await runPromise,
|
||||
usedMemory: reportMemory ? memoryUsage().heapUsed : void 0
|
||||
});
|
||||
} finally {
|
||||
runPromise = void 0;
|
||||
isRunning = false;
|
||||
}
|
||||
break;
|
||||
case "stop":
|
||||
await runPromise;
|
||||
try {
|
||||
const context = traces.getContextFromCarrier(message.otelCarrier);
|
||||
const error = await traces.$("vitest.runtime.teardown", { context }, async () => {
|
||||
const error = await teardown().catch((error) => serializeError(error));
|
||||
await workerTeardown?.();
|
||||
return error;
|
||||
});
|
||||
await traces.finish();
|
||||
send({
|
||||
type: "stopped",
|
||||
error,
|
||||
__vitest_worker_response__
|
||||
});
|
||||
} catch (error) {
|
||||
send({
|
||||
type: "stopped",
|
||||
error: serializeError(error),
|
||||
__vitest_worker_response__
|
||||
});
|
||||
}
|
||||
worker.teardown?.();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
function getFilesWithLocations(files) {
|
||||
return files.flatMap((file) => {
|
||||
if (!file.testLocations) return file.filepath;
|
||||
return file.testLocations.map((location) => {
|
||||
return `${file}:${location}`;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export { init as i, loadEnvironment as l };
|
||||
53
node_modules/vitest/dist/chunks/inspector.CvyFGlXm.js
generated
vendored
Normal file
53
node_modules/vitest/dist/chunks/inspector.CvyFGlXm.js
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
import { createRequire } from 'node:module';
|
||||
import { pathToFileURL } from 'node:url';
|
||||
|
||||
const __require = createRequire(import.meta.url);
|
||||
let inspector;
|
||||
let session;
|
||||
/**
|
||||
* Enables debugging inside `worker_threads` and `child_process`.
|
||||
* Should be called as early as possible when worker/process has been set up.
|
||||
*/
|
||||
function setupInspect(ctx) {
|
||||
const config = ctx.config;
|
||||
const isEnabled = config.inspector.enabled;
|
||||
if (isEnabled) {
|
||||
inspector = __require("node:inspector");
|
||||
if (!(inspector.url() !== void 0)) {
|
||||
inspector.open(config.inspector.port, config.inspector.host, config.inspector.waitForDebugger);
|
||||
if (config.inspectBrk) {
|
||||
const firstTestFile = typeof ctx.files[0] === "string" ? ctx.files[0] : ctx.files[0].filepath;
|
||||
// Stop at first test file
|
||||
if (firstTestFile) {
|
||||
session = new inspector.Session();
|
||||
session.connect();
|
||||
session.post("Debugger.enable");
|
||||
session.post("Debugger.setBreakpointByUrl", {
|
||||
lineNumber: 0,
|
||||
url: pathToFileURL(firstTestFile)
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const keepOpen = shouldKeepOpen(config);
|
||||
return function cleanup() {
|
||||
if (isEnabled && !keepOpen && inspector) {
|
||||
inspector.close();
|
||||
session?.disconnect();
|
||||
}
|
||||
};
|
||||
}
|
||||
function closeInspector(config) {
|
||||
const keepOpen = shouldKeepOpen(config);
|
||||
if (inspector && !keepOpen) {
|
||||
inspector.close();
|
||||
session?.disconnect();
|
||||
}
|
||||
}
|
||||
function shouldKeepOpen(config) {
|
||||
// In watch mode the inspector can persist re-runs if isolation is disabled and a single worker is used
|
||||
return config.watch && config.isolate === false && config.maxWorkers === 1;
|
||||
}
|
||||
|
||||
export { closeInspector as c, setupInspect as s };
|
||||
35
node_modules/vitest/dist/chunks/modules.DJPjQW6m.js
generated
vendored
Normal file
35
node_modules/vitest/dist/chunks/modules.DJPjQW6m.js
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
import { builtinModules } from 'node:module';
|
||||
|
||||
// copied from vite
|
||||
// https://github.com/vitejs/vite/blob/814120f2ad387ca3d1e16c7dd403b04ca4b97f75/packages/vite/src/node/utils.ts#L106
|
||||
// Supported by Node, Deno, Bun
|
||||
const NODE_BUILTIN_NAMESPACE = "node:";
|
||||
// Supported by Deno
|
||||
const NPM_BUILTIN_NAMESPACE = "npm:";
|
||||
// Supported by Bun
|
||||
const BUN_BUILTIN_NAMESPACE = "bun:";
|
||||
// Some runtimes like Bun injects namespaced modules here, which is not a node builtin
|
||||
const nodeBuiltins = builtinModules.filter((id) => !id.includes(":"));
|
||||
// TODO: Use `isBuiltin` from `node:module`, but Deno doesn't support it
|
||||
function isBuiltin(id) {
|
||||
if (process.versions.deno && id.startsWith(NPM_BUILTIN_NAMESPACE)) return true;
|
||||
if (process.versions.bun && id.startsWith(BUN_BUILTIN_NAMESPACE)) return true;
|
||||
return isNodeBuiltin(id);
|
||||
}
|
||||
function isNodeBuiltin(id) {
|
||||
if (id.startsWith(NODE_BUILTIN_NAMESPACE)) return true;
|
||||
return nodeBuiltins.includes(id);
|
||||
}
|
||||
const browserExternalId = "__vite-browser-external";
|
||||
const browserExternalLength = 24;
|
||||
function isBrowserExternal(id) {
|
||||
return id.startsWith(browserExternalId);
|
||||
}
|
||||
function toBuiltin(id) {
|
||||
if (id.startsWith(browserExternalId)) id = id.slice(browserExternalLength);
|
||||
if (id.startsWith(NPM_BUILTIN_NAMESPACE) || id.startsWith(BUN_BUILTIN_NAMESPACE) || id.startsWith(NODE_BUILTIN_NAMESPACE)) return id;
|
||||
if (process.versions.deno || process.versions.bun) return id;
|
||||
return `node:${id}`;
|
||||
}
|
||||
|
||||
export { isBrowserExternal as a, isBuiltin as i, toBuiltin as t };
|
||||
14
node_modules/vitest/dist/chunks/node.Ce0vMQM7.js
generated
vendored
Normal file
14
node_modules/vitest/dist/chunks/node.Ce0vMQM7.js
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
import { NodeSnapshotEnvironment } from '@vitest/snapshot/environment';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
import '@vitest/utils/timers';
|
||||
|
||||
class VitestNodeSnapshotEnvironment extends NodeSnapshotEnvironment {
|
||||
getHeader() {
|
||||
return `// Vitest Snapshot v${this.getVersion()}, https://vitest.dev/guide/snapshot.html`;
|
||||
}
|
||||
resolvePath(filepath) {
|
||||
return getWorkerState().rpc.resolveSnapshotPath(filepath);
|
||||
}
|
||||
}
|
||||
|
||||
export { VitestNodeSnapshotEnvironment };
|
||||
38
node_modules/vitest/dist/chunks/plugin.d.CY7CUjf-.d.ts
generated
vendored
Normal file
38
node_modules/vitest/dist/chunks/plugin.d.CY7CUjf-.d.ts
generated
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
import { DevEnvironment } from 'vite';
|
||||
import { V as Vitest, T as TestProject, b as TestProjectConfiguration } from './reporters.d.OXEK7y4s.js';
|
||||
|
||||
/**
|
||||
* Generate a unique cache identifier.
|
||||
*
|
||||
* Return `false` to disable caching of the file.
|
||||
* @experimental
|
||||
*/
|
||||
interface CacheKeyIdGenerator {
|
||||
(context: CacheKeyIdGeneratorContext): string | undefined | null | false;
|
||||
}
|
||||
/**
|
||||
* @experimental
|
||||
*/
|
||||
interface CacheKeyIdGeneratorContext {
|
||||
environment: DevEnvironment;
|
||||
id: string;
|
||||
sourceCode: string;
|
||||
}
|
||||
|
||||
interface VitestPluginContext {
|
||||
vitest: Vitest;
|
||||
project: TestProject;
|
||||
injectTestProjects: (config: TestProjectConfiguration | TestProjectConfiguration[]) => Promise<TestProject[]>;
|
||||
/**
|
||||
* Define a generator that will be applied before hashing the cache key.
|
||||
*
|
||||
* Use this to make sure Vitest generates correct hash. It is a good idea
|
||||
* to define this function if your plugin can be registered with different options.
|
||||
*
|
||||
* This is called only if `experimental.fsModuleCache` is defined.
|
||||
* @experimental
|
||||
*/
|
||||
experimental_defineCacheKeyGenerator: (callback: CacheKeyIdGenerator) => void;
|
||||
}
|
||||
|
||||
export type { CacheKeyIdGenerator as C, VitestPluginContext as V, CacheKeyIdGeneratorContext as a };
|
||||
3270
node_modules/vitest/dist/chunks/reporters.d.OXEK7y4s.d.ts
generated
vendored
Normal file
3270
node_modules/vitest/dist/chunks/reporters.d.OXEK7y4s.d.ts
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
76
node_modules/vitest/dist/chunks/rpc.BytlcPfC.js
generated
vendored
Normal file
76
node_modules/vitest/dist/chunks/rpc.BytlcPfC.js
generated
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
import { getSafeTimers } from '@vitest/utils/timers';
|
||||
import { c as createBirpc } from './index.0kCJoeWi.js';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
const { get } = Reflect;
|
||||
function withSafeTimers(fn) {
|
||||
const { setTimeout, clearTimeout, nextTick, setImmediate, clearImmediate } = getSafeTimers();
|
||||
const currentSetTimeout = globalThis.setTimeout;
|
||||
const currentClearTimeout = globalThis.clearTimeout;
|
||||
const currentSetImmediate = globalThis.setImmediate;
|
||||
const currentClearImmediate = globalThis.clearImmediate;
|
||||
const currentNextTick = globalThis.process?.nextTick;
|
||||
try {
|
||||
globalThis.setTimeout = setTimeout;
|
||||
globalThis.clearTimeout = clearTimeout;
|
||||
if (setImmediate) globalThis.setImmediate = setImmediate;
|
||||
if (clearImmediate) globalThis.clearImmediate = clearImmediate;
|
||||
if (globalThis.process && nextTick) globalThis.process.nextTick = nextTick;
|
||||
return fn();
|
||||
} finally {
|
||||
globalThis.setTimeout = currentSetTimeout;
|
||||
globalThis.clearTimeout = currentClearTimeout;
|
||||
globalThis.setImmediate = currentSetImmediate;
|
||||
globalThis.clearImmediate = currentClearImmediate;
|
||||
if (globalThis.process && nextTick) nextTick(() => {
|
||||
globalThis.process.nextTick = currentNextTick;
|
||||
});
|
||||
}
|
||||
}
|
||||
const promises = /* @__PURE__ */ new Set();
|
||||
async function rpcDone() {
|
||||
if (!promises.size) return;
|
||||
const awaitable = Array.from(promises);
|
||||
return Promise.all(awaitable);
|
||||
}
|
||||
const onCancelCallbacks = [];
|
||||
function onCancel(callback) {
|
||||
onCancelCallbacks.push(callback);
|
||||
}
|
||||
function createRuntimeRpc(options) {
|
||||
return createSafeRpc(createBirpc({ async onCancel(reason) {
|
||||
await Promise.all(onCancelCallbacks.map((fn) => fn(reason)));
|
||||
} }, {
|
||||
eventNames: [
|
||||
"onUserConsoleLog",
|
||||
"onCollected",
|
||||
"onCancel"
|
||||
],
|
||||
timeout: -1,
|
||||
...options
|
||||
}));
|
||||
}
|
||||
function createSafeRpc(rpc) {
|
||||
return new Proxy(rpc, { get(target, p, handler) {
|
||||
// keep $rejectPendingCalls as sync function
|
||||
if (p === "$rejectPendingCalls") return rpc.$rejectPendingCalls;
|
||||
const sendCall = get(target, p, handler);
|
||||
const safeSendCall = (...args) => withSafeTimers(async () => {
|
||||
const result = sendCall(...args);
|
||||
promises.add(result);
|
||||
try {
|
||||
return await result;
|
||||
} finally {
|
||||
promises.delete(result);
|
||||
}
|
||||
});
|
||||
safeSendCall.asEvent = sendCall.asEvent;
|
||||
return safeSendCall;
|
||||
} });
|
||||
}
|
||||
function rpc() {
|
||||
const { rpc } = getWorkerState();
|
||||
return rpc;
|
||||
}
|
||||
|
||||
export { rpcDone as a, createRuntimeRpc as c, onCancel as o, rpc as r };
|
||||
64
node_modules/vitest/dist/chunks/rpc.d.RH3apGEf.d.ts
generated
vendored
Normal file
64
node_modules/vitest/dist/chunks/rpc.d.RH3apGEf.d.ts
generated
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
import { CancelReason, File, TestArtifact, TaskResultPack, TaskEventPack } from '@vitest/runner';
|
||||
import { SnapshotResult } from '@vitest/snapshot';
|
||||
import { FetchFunctionOptions, FetchResult } from 'vite/module-runner';
|
||||
import { O as OTELCarrier } from './traces.d.402V_yFI.js';
|
||||
|
||||
interface AfterSuiteRunMeta {
|
||||
coverage?: unknown;
|
||||
testFiles: string[];
|
||||
environment: string;
|
||||
projectName?: string;
|
||||
}
|
||||
interface UserConsoleLog {
|
||||
content: string;
|
||||
origin?: string;
|
||||
browser?: boolean;
|
||||
type: "stdout" | "stderr";
|
||||
taskId?: string;
|
||||
time: number;
|
||||
size: number;
|
||||
}
|
||||
interface ModuleGraphData {
|
||||
graph: Record<string, string[]>;
|
||||
externalized: string[];
|
||||
inlined: string[];
|
||||
}
|
||||
interface ProvidedContext {}
|
||||
interface ResolveFunctionResult {
|
||||
id: string;
|
||||
file: string;
|
||||
url: string;
|
||||
}
|
||||
interface FetchCachedFileSystemResult {
|
||||
cached: true;
|
||||
tmp: string;
|
||||
id: string;
|
||||
file: string | null;
|
||||
url: string;
|
||||
invalidate: boolean;
|
||||
}
|
||||
type LabelColor = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white";
|
||||
|
||||
interface RuntimeRPC {
|
||||
fetch: (id: string, importer: string | undefined, environment: string, options?: FetchFunctionOptions, otelCarrier?: OTELCarrier) => Promise<FetchResult | FetchCachedFileSystemResult>;
|
||||
resolve: (id: string, importer: string | undefined, environment: string) => Promise<ResolveFunctionResult | null>;
|
||||
transform: (id: string) => Promise<{
|
||||
code?: string;
|
||||
}>;
|
||||
onUserConsoleLog: (log: UserConsoleLog) => void;
|
||||
onUnhandledError: (err: unknown, type: string) => void;
|
||||
onQueued: (file: File) => void;
|
||||
onCollected: (files: File[]) => Promise<void>;
|
||||
onAfterSuiteRun: (meta: AfterSuiteRunMeta) => void;
|
||||
onTaskArtifactRecord: <Artifact extends TestArtifact>(testId: string, artifact: Artifact) => Promise<Artifact>;
|
||||
onTaskUpdate: (pack: TaskResultPack[], events: TaskEventPack[]) => Promise<void>;
|
||||
onCancel: (reason: CancelReason) => void;
|
||||
getCountOfFailedTests: () => number;
|
||||
snapshotSaved: (snapshot: SnapshotResult) => void;
|
||||
resolveSnapshotPath: (testPath: string) => string;
|
||||
}
|
||||
interface RunnerRPC {
|
||||
onCancel: (reason: CancelReason) => void;
|
||||
}
|
||||
|
||||
export type { AfterSuiteRunMeta as A, LabelColor as L, ModuleGraphData as M, ProvidedContext as P, RuntimeRPC as R, UserConsoleLog as U, RunnerRPC as a };
|
||||
60
node_modules/vitest/dist/chunks/setup-common.Cm-kSBVi.js
generated
vendored
Normal file
60
node_modules/vitest/dist/chunks/setup-common.Cm-kSBVi.js
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
import { r as resolveCoverageProviderModule } from './coverage.D_JHT54q.js';
|
||||
import { addSerializer } from '@vitest/snapshot';
|
||||
import { setSafeTimers } from '@vitest/utils/timers';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
async function startCoverageInsideWorker(options, loader, runtimeOptions) {
|
||||
const coverageModule = await resolveCoverageProviderModule(options, loader);
|
||||
if (coverageModule) return coverageModule.startCoverage?.(runtimeOptions);
|
||||
return null;
|
||||
}
|
||||
async function takeCoverageInsideWorker(options, loader) {
|
||||
const coverageModule = await resolveCoverageProviderModule(options, loader);
|
||||
if (coverageModule) return coverageModule.takeCoverage?.({ moduleExecutionInfo: loader.moduleExecutionInfo });
|
||||
return null;
|
||||
}
|
||||
async function stopCoverageInsideWorker(options, loader, runtimeOptions) {
|
||||
const coverageModule = await resolveCoverageProviderModule(options, loader);
|
||||
if (coverageModule) return coverageModule.stopCoverage?.(runtimeOptions);
|
||||
return null;
|
||||
}
|
||||
|
||||
let globalSetup = false;
|
||||
async function setupCommonEnv(config) {
|
||||
setupDefines(config);
|
||||
setupEnv(config.env);
|
||||
if (globalSetup) return;
|
||||
globalSetup = true;
|
||||
setSafeTimers();
|
||||
if (config.globals) (await import('./globals.DOayXfHP.js')).registerApiGlobally();
|
||||
}
|
||||
function setupDefines(config) {
|
||||
for (const key in config.defines) globalThis[key] = config.defines[key];
|
||||
}
|
||||
function setupEnv(env) {
|
||||
const state = getWorkerState();
|
||||
// same boolean-to-string assignment as VitestPlugin.configResolved
|
||||
const { PROD, DEV, ...restEnvs } = env;
|
||||
state.metaEnv.PROD = PROD;
|
||||
state.metaEnv.DEV = DEV;
|
||||
for (const key in restEnvs) state.metaEnv[key] = env[key];
|
||||
}
|
||||
async function loadDiffConfig(config, moduleRunner) {
|
||||
if (typeof config.diff === "object") return config.diff;
|
||||
if (typeof config.diff !== "string") return;
|
||||
const diffModule = await moduleRunner.import(config.diff);
|
||||
if (diffModule && typeof diffModule.default === "object" && diffModule.default != null) return diffModule.default;
|
||||
else throw new Error(`invalid diff config file ${config.diff}. Must have a default export with config object`);
|
||||
}
|
||||
async function loadSnapshotSerializers(config, moduleRunner) {
|
||||
const files = config.snapshotSerializers;
|
||||
(await Promise.all(files.map(async (file) => {
|
||||
const mo = await moduleRunner.import(file);
|
||||
if (!mo || typeof mo.default !== "object" || mo.default === null) throw new Error(`invalid snapshot serializer file ${file}. Must export a default object`);
|
||||
const config = mo.default;
|
||||
if (typeof config.test !== "function" || typeof config.serialize !== "function" && typeof config.print !== "function") throw new TypeError(`invalid snapshot serializer in ${file}. Must have a 'test' method along with either a 'serialize' or 'print' method.`);
|
||||
return config;
|
||||
}))).forEach((serializer) => addSerializer(serializer));
|
||||
}
|
||||
|
||||
export { stopCoverageInsideWorker as a, loadSnapshotSerializers as b, setupCommonEnv as c, loadDiffConfig as l, startCoverageInsideWorker as s, takeCoverageInsideWorker as t };
|
||||
861
node_modules/vitest/dist/chunks/startModuleRunner.Iz2V0ESw.js
generated
vendored
Normal file
861
node_modules/vitest/dist/chunks/startModuleRunner.Iz2V0ESw.js
generated
vendored
Normal file
@@ -0,0 +1,861 @@
|
||||
import fs from 'node:fs';
|
||||
import { isBareImport } from '@vitest/utils/helpers';
|
||||
import { i as isBuiltin, a as isBrowserExternal, t as toBuiltin } from './modules.DJPjQW6m.js';
|
||||
import { pathToFileURL } from 'node:url';
|
||||
import { normalize as normalize$1, join as join$1 } from 'pathe';
|
||||
import { distDir } from '../path.js';
|
||||
import { serializeValue } from '@vitest/utils/serialize';
|
||||
import { VitestModuleEvaluator, unwrapId } from '../module-evaluator.js';
|
||||
import { resolve as resolve$1, isAbsolute as isAbsolute$1 } from 'node:path';
|
||||
import vm from 'node:vm';
|
||||
import { MockerRegistry, mockObject, RedirectedModule, AutomockedModule } from '@vitest/mocker';
|
||||
import nodeModule from 'node:module';
|
||||
import * as viteModuleRunner from 'vite/module-runner';
|
||||
import { T as Traces } from './traces.U4xDYhzZ.js';
|
||||
|
||||
class VitestTransport {
|
||||
constructor(options) {
|
||||
this.options = options;
|
||||
}
|
||||
async invoke(event) {
|
||||
if (event.type !== "custom") return { error: /* @__PURE__ */ new Error(`Vitest Module Runner doesn't support Vite HMR events.`) };
|
||||
if (event.event !== "vite:invoke") return { error: /* @__PURE__ */ new Error(`Vitest Module Runner doesn't support ${event.event} event.`) };
|
||||
const { name, data } = event.data;
|
||||
if (name === "getBuiltins")
|
||||
// we return an empty array here to avoid client-side builtin check,
|
||||
// as we need builtins to go through `fetchModule`
|
||||
return { result: [] };
|
||||
if (name !== "fetchModule") return { error: /* @__PURE__ */ new Error(`Unknown method: ${name}. Expected "fetchModule".`) };
|
||||
try {
|
||||
return { result: await this.options.fetchModule(...data) };
|
||||
} catch (error) {
|
||||
return { error };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
|
||||
function normalizeWindowsPath(input = "") {
|
||||
if (!input) return input;
|
||||
return input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
|
||||
}
|
||||
const _UNC_REGEX = /^[/\\]{2}/;
|
||||
const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/;
|
||||
const _DRIVE_LETTER_RE = /^[A-Za-z]:$/;
|
||||
const _EXTNAME_RE = /.(\.[^./]+|\.)$/;
|
||||
const normalize = function(path) {
|
||||
if (path.length === 0) return ".";
|
||||
path = normalizeWindowsPath(path);
|
||||
const isUNCPath = path.match(_UNC_REGEX);
|
||||
const isPathAbsolute = isAbsolute(path);
|
||||
const trailingSeparator = path[path.length - 1] === "/";
|
||||
path = normalizeString(path, !isPathAbsolute);
|
||||
if (path.length === 0) {
|
||||
if (isPathAbsolute) return "/";
|
||||
return trailingSeparator ? "./" : ".";
|
||||
}
|
||||
if (trailingSeparator) path += "/";
|
||||
if (_DRIVE_LETTER_RE.test(path)) path += "/";
|
||||
if (isUNCPath) {
|
||||
if (!isPathAbsolute) return `//./${path}`;
|
||||
return `//${path}`;
|
||||
}
|
||||
return isPathAbsolute && !isAbsolute(path) ? `/${path}` : path;
|
||||
};
|
||||
const join = function(...segments) {
|
||||
let path = "";
|
||||
for (const seg of segments) {
|
||||
if (!seg) continue;
|
||||
if (path.length > 0) {
|
||||
const pathTrailing = path[path.length - 1] === "/";
|
||||
const segLeading = seg[0] === "/";
|
||||
if (pathTrailing && segLeading) path += seg.slice(1);
|
||||
else path += pathTrailing || segLeading ? seg : `/${seg}`;
|
||||
} else path += seg;
|
||||
}
|
||||
return normalize(path);
|
||||
};
|
||||
function cwd$1() {
|
||||
if (typeof process !== "undefined" && typeof process.cwd === "function") return process.cwd().replace(/\\/g, "/");
|
||||
return "/";
|
||||
}
|
||||
const resolve = function(...arguments_) {
|
||||
arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
|
||||
let resolvedPath = "";
|
||||
let resolvedAbsolute = false;
|
||||
for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
|
||||
const path = index >= 0 ? arguments_[index] : cwd$1();
|
||||
if (!path || path.length === 0) continue;
|
||||
resolvedPath = `${path}/${resolvedPath}`;
|
||||
resolvedAbsolute = isAbsolute(path);
|
||||
}
|
||||
resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute);
|
||||
if (resolvedAbsolute && !isAbsolute(resolvedPath)) return `/${resolvedPath}`;
|
||||
return resolvedPath.length > 0 ? resolvedPath : ".";
|
||||
};
|
||||
function normalizeString(path, allowAboveRoot) {
|
||||
let res = "";
|
||||
let lastSegmentLength = 0;
|
||||
let lastSlash = -1;
|
||||
let dots = 0;
|
||||
let char = null;
|
||||
for (let index = 0; index <= path.length; ++index) {
|
||||
if (index < path.length) char = path[index];
|
||||
else if (char === "/") break;
|
||||
else char = "/";
|
||||
if (char === "/") {
|
||||
if (lastSlash === index - 1 || dots === 1);
|
||||
else if (dots === 2) {
|
||||
if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
|
||||
if (res.length > 2) {
|
||||
const lastSlashIndex = res.lastIndexOf("/");
|
||||
if (lastSlashIndex === -1) {
|
||||
res = "";
|
||||
lastSegmentLength = 0;
|
||||
} else {
|
||||
res = res.slice(0, lastSlashIndex);
|
||||
lastSegmentLength = res.length - 1 - res.lastIndexOf("/");
|
||||
}
|
||||
lastSlash = index;
|
||||
dots = 0;
|
||||
continue;
|
||||
} else if (res.length > 0) {
|
||||
res = "";
|
||||
lastSegmentLength = 0;
|
||||
lastSlash = index;
|
||||
dots = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (allowAboveRoot) {
|
||||
res += res.length > 0 ? "/.." : "..";
|
||||
lastSegmentLength = 2;
|
||||
}
|
||||
} else {
|
||||
if (res.length > 0) res += `/${path.slice(lastSlash + 1, index)}`;
|
||||
else res = path.slice(lastSlash + 1, index);
|
||||
lastSegmentLength = index - lastSlash - 1;
|
||||
}
|
||||
lastSlash = index;
|
||||
dots = 0;
|
||||
} else if (char === "." && dots !== -1) ++dots;
|
||||
else dots = -1;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
const isAbsolute = function(p) {
|
||||
return _IS_ABSOLUTE_RE.test(p);
|
||||
};
|
||||
const extname = function(p) {
|
||||
if (p === "..") return "";
|
||||
const match = _EXTNAME_RE.exec(normalizeWindowsPath(p));
|
||||
return match && match[1] || "";
|
||||
};
|
||||
const dirname = function(p) {
|
||||
const segments = normalizeWindowsPath(p).replace(/\/$/, "").split("/").slice(0, -1);
|
||||
if (segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0])) segments[0] += "/";
|
||||
return segments.join("/") || (isAbsolute(p) ? "/" : ".");
|
||||
};
|
||||
const basename = function(p, extension) {
|
||||
const segments = normalizeWindowsPath(p).split("/");
|
||||
let lastSegment = "";
|
||||
for (let i = segments.length - 1; i >= 0; i--) {
|
||||
const val = segments[i];
|
||||
if (val) {
|
||||
lastSegment = val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return extension && lastSegment.endsWith(extension) ? lastSegment.slice(0, -extension.length) : lastSegment;
|
||||
};
|
||||
|
||||
const { existsSync, readdirSync, statSync } = fs;
|
||||
function findMockRedirect(root, mockPath, external) {
|
||||
const path = external || mockPath;
|
||||
// it's a node_module alias
|
||||
// all mocks should be inside <root>/__mocks__
|
||||
if (external || isNodeBuiltin(mockPath) || !existsSync(mockPath)) {
|
||||
const mockFolder = join(root, "__mocks__", dirname(path));
|
||||
if (!existsSync(mockFolder)) return null;
|
||||
const baseOriginal = basename(path);
|
||||
function findFile(mockFolder, baseOriginal) {
|
||||
const files = readdirSync(mockFolder);
|
||||
for (const file of files) if (basename(file, extname(file)) === baseOriginal) {
|
||||
const path = resolve(mockFolder, file);
|
||||
// if the same name, return the file
|
||||
if (statSync(path).isFile()) return path;
|
||||
else {
|
||||
// find folder/index.{js,ts}
|
||||
const indexFile = findFile(path, "index");
|
||||
if (indexFile) return indexFile;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return findFile(mockFolder, baseOriginal);
|
||||
}
|
||||
const fullPath = resolve(dirname(path), "__mocks__", basename(path));
|
||||
return existsSync(fullPath) ? fullPath : null;
|
||||
}
|
||||
const builtins = new Set([
|
||||
...nodeModule.builtinModules,
|
||||
"assert/strict",
|
||||
"diagnostics_channel",
|
||||
"dns/promises",
|
||||
"fs/promises",
|
||||
"path/posix",
|
||||
"path/win32",
|
||||
"readline/promises",
|
||||
"stream/consumers",
|
||||
"stream/promises",
|
||||
"stream/web",
|
||||
"timers/promises",
|
||||
"util/types",
|
||||
"wasi"
|
||||
]);
|
||||
// https://nodejs.org/api/modules.html#built-in-modules-with-mandatory-node-prefix
|
||||
const prefixedBuiltins$1 = new Set([
|
||||
"node:sea",
|
||||
"node:sqlite",
|
||||
"node:test",
|
||||
"node:test/reporters"
|
||||
]);
|
||||
const NODE_BUILTIN_NAMESPACE = "node:";
|
||||
function isNodeBuiltin(id) {
|
||||
// Added in v18.6.0
|
||||
if (nodeModule.isBuiltin) return nodeModule.isBuiltin(id);
|
||||
if (prefixedBuiltins$1.has(id)) return true;
|
||||
return builtins.has(id.startsWith(NODE_BUILTIN_NAMESPACE) ? id.slice(5) : id);
|
||||
}
|
||||
|
||||
const spyModulePath = resolve$1(distDir, "spy.js");
|
||||
class VitestMocker {
|
||||
static pendingIds = [];
|
||||
spyModule;
|
||||
primitives;
|
||||
filterPublicKeys;
|
||||
registries = /* @__PURE__ */ new Map();
|
||||
mockContext = { callstack: null };
|
||||
_otel;
|
||||
constructor(moduleRunner, options) {
|
||||
this.moduleRunner = moduleRunner;
|
||||
this.options = options;
|
||||
const context = this.options.context;
|
||||
this._otel = options.traces;
|
||||
if (context) this.primitives = vm.runInContext("({ Object, Error, Function, RegExp, Symbol, Array, Map })", context);
|
||||
else this.primitives = {
|
||||
Object,
|
||||
Error,
|
||||
Function,
|
||||
RegExp,
|
||||
Symbol: globalThis.Symbol,
|
||||
Array,
|
||||
Map
|
||||
};
|
||||
if (options.spyModule) this.spyModule = options.spyModule;
|
||||
const Symbol = this.primitives.Symbol;
|
||||
this.filterPublicKeys = [
|
||||
"__esModule",
|
||||
Symbol.asyncIterator,
|
||||
Symbol.hasInstance,
|
||||
Symbol.isConcatSpreadable,
|
||||
Symbol.iterator,
|
||||
Symbol.match,
|
||||
Symbol.matchAll,
|
||||
Symbol.replace,
|
||||
Symbol.search,
|
||||
Symbol.split,
|
||||
Symbol.species,
|
||||
Symbol.toPrimitive,
|
||||
Symbol.toStringTag,
|
||||
Symbol.unscopables
|
||||
];
|
||||
}
|
||||
get root() {
|
||||
return this.options.root;
|
||||
}
|
||||
get evaluatedModules() {
|
||||
return this.moduleRunner.evaluatedModules;
|
||||
}
|
||||
get moduleDirectories() {
|
||||
return this.options.moduleDirectories || [];
|
||||
}
|
||||
async initializeSpyModule() {
|
||||
if (this.spyModule) return;
|
||||
this.spyModule = await this.moduleRunner.import(spyModulePath);
|
||||
}
|
||||
getMockerRegistry() {
|
||||
const suite = this.getSuiteFilepath();
|
||||
if (!this.registries.has(suite)) this.registries.set(suite, new MockerRegistry());
|
||||
return this.registries.get(suite);
|
||||
}
|
||||
reset() {
|
||||
this.registries.clear();
|
||||
}
|
||||
invalidateModuleById(id) {
|
||||
const mockId = this.getMockPath(id);
|
||||
const node = this.evaluatedModules.getModuleById(mockId);
|
||||
if (node) {
|
||||
this.evaluatedModules.invalidateModule(node);
|
||||
node.mockedExports = void 0;
|
||||
}
|
||||
}
|
||||
isModuleDirectory(path) {
|
||||
return this.moduleDirectories.some((dir) => path.includes(dir));
|
||||
}
|
||||
getSuiteFilepath() {
|
||||
return this.options.getCurrentTestFilepath() || "global";
|
||||
}
|
||||
createError(message, codeFrame) {
|
||||
const Error = this.primitives.Error;
|
||||
const error = new Error(message);
|
||||
Object.assign(error, { codeFrame });
|
||||
return error;
|
||||
}
|
||||
async resolveId(rawId, importer) {
|
||||
return this._otel.$("vitest.mocker.resolve_id", { attributes: {
|
||||
"vitest.module.raw_id": rawId,
|
||||
"vitest.module.importer": rawId
|
||||
} }, async (span) => {
|
||||
const result = await this.options.resolveId(rawId, importer);
|
||||
if (!result) {
|
||||
span.addEvent("could not resolve id, fallback to unresolved values");
|
||||
const id = normalizeModuleId(rawId);
|
||||
span.setAttributes({
|
||||
"vitest.module.id": id,
|
||||
"vitest.module.url": rawId,
|
||||
"vitest.module.external": id,
|
||||
"vitest.module.fallback": true
|
||||
});
|
||||
return {
|
||||
id,
|
||||
url: rawId,
|
||||
external: id
|
||||
};
|
||||
}
|
||||
// external is node_module or unresolved module
|
||||
// for example, some people mock "vscode" and don't have it installed
|
||||
const external = !isAbsolute$1(result.file) || this.isModuleDirectory(result.file) ? normalizeModuleId(rawId) : null;
|
||||
const id = normalizeModuleId(result.id);
|
||||
span.setAttributes({
|
||||
"vitest.module.id": id,
|
||||
"vitest.module.url": result.url,
|
||||
"vitest.module.external": external ?? false
|
||||
});
|
||||
return {
|
||||
...result,
|
||||
id,
|
||||
external
|
||||
};
|
||||
});
|
||||
}
|
||||
async resolveMocks() {
|
||||
if (!VitestMocker.pendingIds.length) return;
|
||||
await Promise.all(VitestMocker.pendingIds.map(async (mock) => {
|
||||
const { id, url, external } = await this.resolveId(mock.id, mock.importer);
|
||||
if (mock.action === "unmock") this.unmockPath(id);
|
||||
if (mock.action === "mock") this.mockPath(mock.id, id, url, external, mock.type, mock.factory);
|
||||
}));
|
||||
VitestMocker.pendingIds = [];
|
||||
}
|
||||
ensureModule(id, url) {
|
||||
const node = this.evaluatedModules.ensureModule(id, url);
|
||||
// TODO
|
||||
node.meta = {
|
||||
id,
|
||||
url,
|
||||
code: "",
|
||||
file: null,
|
||||
invalidate: false
|
||||
};
|
||||
return node;
|
||||
}
|
||||
async callFunctionMock(id, url, mock) {
|
||||
const node = this.ensureModule(id, url);
|
||||
if (node.exports) return node.exports;
|
||||
const exports$1 = await mock.resolve();
|
||||
const moduleExports = new Proxy(exports$1, { get: (target, prop) => {
|
||||
const val = target[prop];
|
||||
// 'then' can exist on non-Promise objects, need nested instanceof check for logic to work
|
||||
if (prop === "then") {
|
||||
if (target instanceof Promise) return target.then.bind(target);
|
||||
} else if (!(prop in target)) {
|
||||
if (this.filterPublicKeys.includes(prop)) return;
|
||||
throw this.createError(`[vitest] No "${String(prop)}" export is defined on the "${mock.raw}" mock. Did you forget to return it from "vi.mock"?
|
||||
If you need to partially mock a module, you can use "importOriginal" helper inside:
|
||||
`, `vi.mock(import("${mock.raw}"), async (importOriginal) => {
|
||||
const actual = await importOriginal()
|
||||
return {
|
||||
...actual,
|
||||
// your mocked methods
|
||||
}
|
||||
})`);
|
||||
}
|
||||
return val;
|
||||
} });
|
||||
node.exports = moduleExports;
|
||||
return moduleExports;
|
||||
}
|
||||
// public method to avoid circular dependency
|
||||
getMockContext() {
|
||||
return this.mockContext;
|
||||
}
|
||||
// path used to store mocked dependencies
|
||||
getMockPath(dep) {
|
||||
return `mock:${dep}`;
|
||||
}
|
||||
getDependencyMock(id) {
|
||||
return this.getMockerRegistry().getById(fixLeadingSlashes(id));
|
||||
}
|
||||
findMockRedirect(mockPath, external) {
|
||||
return findMockRedirect(this.root, mockPath, external);
|
||||
}
|
||||
mockObject(object, mockExports = {}, behavior = "automock") {
|
||||
const createMockInstance = this.spyModule?.createMockInstance;
|
||||
if (!createMockInstance) throw this.createError("[vitest] `spyModule` is not defined. This is a Vitest error. Please open a new issue with reproduction.");
|
||||
return mockObject({
|
||||
globalConstructors: this.primitives,
|
||||
createMockInstance,
|
||||
type: behavior
|
||||
}, object, mockExports);
|
||||
}
|
||||
unmockPath(id) {
|
||||
this.getMockerRegistry().deleteById(id);
|
||||
this.invalidateModuleById(id);
|
||||
}
|
||||
mockPath(originalId, id, url, external, mockType, factory) {
|
||||
const registry = this.getMockerRegistry();
|
||||
if (mockType === "manual") registry.register("manual", originalId, id, url, factory);
|
||||
else if (mockType === "autospy") registry.register("autospy", originalId, id, url);
|
||||
else {
|
||||
const redirect = this.findMockRedirect(id, external);
|
||||
if (redirect) registry.register("redirect", originalId, id, url, redirect);
|
||||
else registry.register("automock", originalId, id, url);
|
||||
}
|
||||
// every time the mock is registered, we remove the previous one from the cache
|
||||
this.invalidateModuleById(id);
|
||||
}
|
||||
async importActual(rawId, importer, callstack) {
|
||||
const { url } = await this.resolveId(rawId, importer);
|
||||
const node = await this.moduleRunner.fetchModule(url, importer);
|
||||
return await this.moduleRunner.cachedRequest(node.url, node, callstack || [importer], void 0, true);
|
||||
}
|
||||
async importMock(rawId, importer) {
|
||||
const { id, url, external } = await this.resolveId(rawId, importer);
|
||||
let mock = this.getDependencyMock(id);
|
||||
if (!mock) {
|
||||
const redirect = this.findMockRedirect(id, external);
|
||||
if (redirect) mock = new RedirectedModule(rawId, id, rawId, redirect);
|
||||
else mock = new AutomockedModule(rawId, id, rawId);
|
||||
}
|
||||
if (mock.type === "automock" || mock.type === "autospy") {
|
||||
const node = await this.moduleRunner.fetchModule(url, importer);
|
||||
const mod = await this.moduleRunner.cachedRequest(url, node, [importer], void 0, true);
|
||||
const Object = this.primitives.Object;
|
||||
return this.mockObject(mod, Object.create(Object.prototype), mock.type);
|
||||
}
|
||||
if (mock.type === "manual") return this.callFunctionMock(id, url, mock);
|
||||
const node = await this.moduleRunner.fetchModule(mock.redirect);
|
||||
return this.moduleRunner.cachedRequest(mock.redirect, node, [importer], void 0, true);
|
||||
}
|
||||
async requestWithMockedModule(url, evaluatedNode, callstack, mock) {
|
||||
return this._otel.$("vitest.mocker.evaluate", async (span) => {
|
||||
const mockId = this.getMockPath(evaluatedNode.id);
|
||||
span.setAttributes({
|
||||
"vitest.module.id": mockId,
|
||||
"vitest.mock.type": mock.type,
|
||||
"vitest.mock.id": mock.id,
|
||||
"vitest.mock.url": mock.url,
|
||||
"vitest.mock.raw": mock.raw
|
||||
});
|
||||
if (mock.type === "automock" || mock.type === "autospy") {
|
||||
const cache = this.evaluatedModules.getModuleById(mockId);
|
||||
if (cache && cache.mockedExports) return cache.mockedExports;
|
||||
const Object = this.primitives.Object;
|
||||
// we have to define a separate object that will copy all properties into itself
|
||||
// and can't just use the same `exports` define automatically by Vite before the evaluator
|
||||
const exports$1 = Object.create(null);
|
||||
Object.defineProperty(exports$1, Symbol.toStringTag, {
|
||||
value: "Module",
|
||||
configurable: true,
|
||||
writable: true
|
||||
});
|
||||
const node = this.ensureModule(mockId, this.getMockPath(evaluatedNode.url));
|
||||
node.meta = evaluatedNode.meta;
|
||||
node.file = evaluatedNode.file;
|
||||
node.mockedExports = exports$1;
|
||||
const mod = await this.moduleRunner.cachedRequest(url, node, callstack, void 0, true);
|
||||
this.mockObject(mod, exports$1, mock.type);
|
||||
return exports$1;
|
||||
}
|
||||
if (mock.type === "manual" && !callstack.includes(mockId) && !callstack.includes(url)) try {
|
||||
callstack.push(mockId);
|
||||
// this will not work if user does Promise.all(import(), import())
|
||||
// we can also use AsyncLocalStorage to store callstack, but this won't work in the browser
|
||||
// maybe we should improve mock API in the future?
|
||||
this.mockContext.callstack = callstack;
|
||||
return await this.callFunctionMock(mockId, this.getMockPath(url), mock);
|
||||
} finally {
|
||||
this.mockContext.callstack = null;
|
||||
const indexMock = callstack.indexOf(mockId);
|
||||
callstack.splice(indexMock, 1);
|
||||
}
|
||||
else if (mock.type === "redirect" && !callstack.includes(mock.redirect)) {
|
||||
span.setAttribute("vitest.mock.redirect", mock.redirect);
|
||||
return mock.redirect;
|
||||
}
|
||||
});
|
||||
}
|
||||
async mockedRequest(url, evaluatedNode, callstack) {
|
||||
const mock = this.getDependencyMock(evaluatedNode.id);
|
||||
if (!mock) return;
|
||||
return this.requestWithMockedModule(url, evaluatedNode, callstack, mock);
|
||||
}
|
||||
queueMock(id, importer, factoryOrOptions) {
|
||||
const mockType = getMockType(factoryOrOptions);
|
||||
VitestMocker.pendingIds.push({
|
||||
action: "mock",
|
||||
id,
|
||||
importer,
|
||||
factory: typeof factoryOrOptions === "function" ? factoryOrOptions : void 0,
|
||||
type: mockType
|
||||
});
|
||||
}
|
||||
queueUnmock(id, importer) {
|
||||
VitestMocker.pendingIds.push({
|
||||
action: "unmock",
|
||||
id,
|
||||
importer
|
||||
});
|
||||
}
|
||||
}
|
||||
function getMockType(factoryOrOptions) {
|
||||
if (!factoryOrOptions) return "automock";
|
||||
if (typeof factoryOrOptions === "function") return "manual";
|
||||
return factoryOrOptions.spy ? "autospy" : "automock";
|
||||
}
|
||||
// unique id that is not available as "$bare_import" like "test"
|
||||
// https://nodejs.org/api/modules.html#built-in-modules-with-mandatory-node-prefix
|
||||
const prefixedBuiltins = new Set([
|
||||
"node:sea",
|
||||
"node:sqlite",
|
||||
"node:test",
|
||||
"node:test/reporters"
|
||||
]);
|
||||
const isWindows$1 = process.platform === "win32";
|
||||
// transform file url to id
|
||||
// virtual:custom -> virtual:custom
|
||||
// \0custom -> \0custom
|
||||
// /root/id -> /id
|
||||
// /root/id.js -> /id.js
|
||||
// C:/root/id.js -> /id.js
|
||||
// C:\root\id.js -> /id.js
|
||||
// TODO: expose this in vite/module-runner
|
||||
function normalizeModuleId(file) {
|
||||
if (prefixedBuiltins.has(file)) return file;
|
||||
// if it's not in the root, keep it as a path, not a URL
|
||||
return slash(file).replace(/^\/@fs\//, isWindows$1 ? "" : "/").replace(/^node:/, "").replace(/^\/+/, "/").replace(/^file:\//, "/");
|
||||
}
|
||||
const windowsSlashRE = /\\/g;
|
||||
function slash(p) {
|
||||
return p.replace(windowsSlashRE, "/");
|
||||
}
|
||||
const multipleSlashRe = /^\/+/;
|
||||
// module-runner incorrectly replaces file:///path with `///path`
|
||||
function fixLeadingSlashes(id) {
|
||||
if (id.startsWith("//")) return id.replace(multipleSlashRe, "/");
|
||||
return id;
|
||||
}
|
||||
|
||||
const createNodeImportMeta = (modulePath) => {
|
||||
if (!viteModuleRunner.createDefaultImportMeta) throw new Error(`createNodeImportMeta is not supported in this version of Vite.`);
|
||||
const defaultMeta = viteModuleRunner.createDefaultImportMeta(modulePath);
|
||||
const href = defaultMeta.url;
|
||||
const importMetaResolver = createImportMetaResolver();
|
||||
return {
|
||||
...defaultMeta,
|
||||
main: false,
|
||||
resolve(id, parent) {
|
||||
return (importMetaResolver ?? defaultMeta.resolve)(id, parent ?? href);
|
||||
}
|
||||
};
|
||||
};
|
||||
function createImportMetaResolver() {
|
||||
if (!import.meta.resolve) return;
|
||||
return (specifier, importer) => import.meta.resolve(specifier, importer);
|
||||
}
|
||||
// @ts-expect-error overriding private method
|
||||
class VitestModuleRunner extends viteModuleRunner.ModuleRunner {
|
||||
mocker;
|
||||
moduleExecutionInfo;
|
||||
_otel;
|
||||
constructor(vitestOptions) {
|
||||
const options = vitestOptions;
|
||||
const transport = new VitestTransport(options.transport);
|
||||
const evaluatedModules = options.evaluatedModules;
|
||||
super({
|
||||
transport,
|
||||
hmr: false,
|
||||
evaluatedModules,
|
||||
sourcemapInterceptor: "prepareStackTrace",
|
||||
createImportMeta: vitestOptions.createImportMeta
|
||||
}, options.evaluator);
|
||||
this.vitestOptions = vitestOptions;
|
||||
this._otel = vitestOptions.traces || new Traces({ enabled: false });
|
||||
this.moduleExecutionInfo = options.getWorkerState().moduleExecutionInfo;
|
||||
this.mocker = options.mocker || new VitestMocker(this, {
|
||||
spyModule: options.spyModule,
|
||||
context: options.vm?.context,
|
||||
traces: this._otel,
|
||||
resolveId: options.transport.resolveId,
|
||||
get root() {
|
||||
return options.getWorkerState().config.root;
|
||||
},
|
||||
get moduleDirectories() {
|
||||
return options.getWorkerState().config.deps.moduleDirectories || [];
|
||||
},
|
||||
getCurrentTestFilepath() {
|
||||
return options.getWorkerState().filepath;
|
||||
}
|
||||
});
|
||||
if (options.vm) options.vm.context.__vitest_mocker__ = this.mocker;
|
||||
else Object.defineProperty(globalThis, "__vitest_mocker__", {
|
||||
configurable: true,
|
||||
writable: true,
|
||||
value: this.mocker
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Vite checks that the module has exports emulating the Node.js behaviour,
|
||||
* but Vitest is more relaxed.
|
||||
*
|
||||
* We should keep the Vite behavour when there is a `strict` flag.
|
||||
* @internal
|
||||
*/
|
||||
processImport(exports$1) {
|
||||
return exports$1;
|
||||
}
|
||||
async import(rawId) {
|
||||
const resolved = await this._otel.$("vitest.module.resolve_id", { attributes: { "vitest.module.raw_id": rawId } }, async (span) => {
|
||||
const result = await this.vitestOptions.transport.resolveId(rawId);
|
||||
if (result) span.setAttributes({
|
||||
"vitest.module.url": result.url,
|
||||
"vitest.module.file": result.file,
|
||||
"vitest.module.id": result.id
|
||||
});
|
||||
return result;
|
||||
});
|
||||
return super.import(resolved ? resolved.url : rawId);
|
||||
}
|
||||
async fetchModule(url, importer) {
|
||||
return await this.cachedModule(url, importer);
|
||||
}
|
||||
_cachedRequest(url, module, callstack = [], metadata) {
|
||||
// @ts-expect-error "cachedRequest" is private
|
||||
return super.cachedRequest(url, module, callstack, metadata);
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
async cachedRequest(url, mod, callstack = [], metadata, ignoreMock = false) {
|
||||
if (ignoreMock) return this._cachedRequest(url, mod, callstack, metadata);
|
||||
let mocked;
|
||||
if (mod.meta && "mockedModule" in mod.meta) mocked = await this.mocker.requestWithMockedModule(url, mod, callstack, mod.meta.mockedModule);
|
||||
else mocked = await this.mocker.mockedRequest(url, mod, callstack);
|
||||
if (typeof mocked === "string") {
|
||||
const node = await this.fetchModule(mocked);
|
||||
return this._cachedRequest(mocked, node, callstack, metadata);
|
||||
}
|
||||
if (mocked != null && typeof mocked === "object") return mocked;
|
||||
return this._cachedRequest(url, mod, callstack, metadata);
|
||||
}
|
||||
/** @internal */
|
||||
_invalidateSubTreeById(ids, invalidated = /* @__PURE__ */ new Set()) {
|
||||
for (const id of ids) {
|
||||
if (invalidated.has(id)) continue;
|
||||
const node = this.evaluatedModules.getModuleById(id);
|
||||
if (!node) continue;
|
||||
invalidated.add(id);
|
||||
const subIds = Array.from(this.evaluatedModules.idToModuleMap).filter(([, mod]) => mod.importers.has(id)).map(([key]) => key);
|
||||
if (subIds.length) this._invalidateSubTreeById(subIds, invalidated);
|
||||
this.evaluatedModules.invalidateModule(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const bareVitestRegexp = /^@?vitest(?:\/|$)/;
|
||||
const normalizedDistDir = normalize$1(distDir);
|
||||
const relativeIds = {};
|
||||
const externalizeMap = /* @__PURE__ */ new Map();
|
||||
// all Vitest imports always need to be externalized
|
||||
function getCachedVitestImport(id, state) {
|
||||
if (id.startsWith("/@fs/") || id.startsWith("\\@fs\\")) id = id.slice(process.platform === "win32" ? 5 : 4);
|
||||
if (externalizeMap.has(id)) return {
|
||||
externalize: externalizeMap.get(id),
|
||||
type: "module"
|
||||
};
|
||||
// always externalize Vitest because we import from there before running tests
|
||||
// so we already have it cached by Node.js
|
||||
const root = state().config.root;
|
||||
const relativeRoot = relativeIds[root] ?? (relativeIds[root] = normalizedDistDir.slice(root.length));
|
||||
if (id.includes(distDir) || id.includes(normalizedDistDir)) {
|
||||
const externalize = id.startsWith("file://") ? id : pathToFileURL(id).toString();
|
||||
externalizeMap.set(id, externalize);
|
||||
return {
|
||||
externalize,
|
||||
type: "module"
|
||||
};
|
||||
}
|
||||
if (relativeRoot && relativeRoot !== "/" && id.startsWith(relativeRoot)) {
|
||||
const externalize = pathToFileURL(join$1(root, id)).toString();
|
||||
externalizeMap.set(id, externalize);
|
||||
return {
|
||||
externalize,
|
||||
type: "module"
|
||||
};
|
||||
}
|
||||
if (bareVitestRegexp.test(id)) {
|
||||
externalizeMap.set(id, id);
|
||||
return {
|
||||
externalize: id,
|
||||
type: "module"
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Store globals in case tests overwrite them
|
||||
const processListeners = process.listeners.bind(process);
|
||||
const processOn = process.on.bind(process);
|
||||
const processOff = process.off.bind(process);
|
||||
const dispose = [];
|
||||
function listenForErrors(state) {
|
||||
dispose.forEach((fn) => fn());
|
||||
dispose.length = 0;
|
||||
function catchError(err, type, event) {
|
||||
const worker = state();
|
||||
// if there is another listener, assume that it's handled by user code
|
||||
// one is Vitest's own listener
|
||||
if (processListeners(event).length > 1) return;
|
||||
const error = serializeValue(err);
|
||||
if (typeof error === "object" && error != null) {
|
||||
error.VITEST_TEST_NAME = worker.current?.type === "test" ? worker.current.name : void 0;
|
||||
if (worker.filepath) error.VITEST_TEST_PATH = worker.filepath;
|
||||
}
|
||||
state().rpc.onUnhandledError(error, type);
|
||||
}
|
||||
const uncaughtException = (e) => catchError(e, "Uncaught Exception", "uncaughtException");
|
||||
const unhandledRejection = (e) => catchError(e, "Unhandled Rejection", "unhandledRejection");
|
||||
processOn("uncaughtException", uncaughtException);
|
||||
processOn("unhandledRejection", unhandledRejection);
|
||||
dispose.push(() => {
|
||||
processOff("uncaughtException", uncaughtException);
|
||||
processOff("unhandledRejection", unhandledRejection);
|
||||
});
|
||||
}
|
||||
|
||||
const { readFileSync } = fs;
|
||||
const VITEST_VM_CONTEXT_SYMBOL = "__vitest_vm_context__";
|
||||
const cwd = process.cwd();
|
||||
const isWindows = process.platform === "win32";
|
||||
function startVitestModuleRunner(options) {
|
||||
const traces = options.traces;
|
||||
const state = () => globalThis.__vitest_worker__ || options.state;
|
||||
const rpc = () => state().rpc;
|
||||
process.exit = (code = process.exitCode || 0) => {
|
||||
throw new Error(`process.exit unexpectedly called with "${code}"`);
|
||||
};
|
||||
listenForErrors(state);
|
||||
const environment = () => {
|
||||
const environment = state().environment;
|
||||
return environment.viteEnvironment || environment.name;
|
||||
};
|
||||
const vm = options.context && options.externalModulesExecutor ? {
|
||||
context: options.context,
|
||||
externalModulesExecutor: options.externalModulesExecutor
|
||||
} : void 0;
|
||||
const evaluator = options.evaluator || new VitestModuleEvaluator(vm, {
|
||||
traces,
|
||||
evaluatedModules: options.evaluatedModules,
|
||||
get moduleExecutionInfo() {
|
||||
return state().moduleExecutionInfo;
|
||||
},
|
||||
get interopDefault() {
|
||||
return state().config.deps.interopDefault;
|
||||
},
|
||||
getCurrentTestFilepath: () => state().filepath
|
||||
});
|
||||
const moduleRunner = new VitestModuleRunner({
|
||||
spyModule: options.spyModule,
|
||||
evaluatedModules: options.evaluatedModules,
|
||||
evaluator,
|
||||
traces,
|
||||
mocker: options.mocker,
|
||||
transport: {
|
||||
async fetchModule(id, importer, options) {
|
||||
const resolvingModules = state().resolvingModules;
|
||||
if (isWindows) {
|
||||
if (id[1] === ":") {
|
||||
// The drive letter is different for whatever reason, we need to normalize it to CWD
|
||||
if (id[0] !== cwd[0] && id[0].toUpperCase() === cwd[0].toUpperCase()) id = (cwd[0].toUpperCase() === cwd[0] ? id[0].toUpperCase() : id[0].toLowerCase()) + id.slice(1);
|
||||
// always mark absolute windows paths, otherwise Vite will externalize it
|
||||
id = `/@id/${id}`;
|
||||
}
|
||||
}
|
||||
const vitest = getCachedVitestImport(id, state);
|
||||
if (vitest) return vitest;
|
||||
const rawId = unwrapId(id);
|
||||
resolvingModules.add(rawId);
|
||||
try {
|
||||
if (VitestMocker.pendingIds.length) await moduleRunner.mocker.resolveMocks();
|
||||
const resolvedMock = moduleRunner.mocker.getDependencyMock(rawId);
|
||||
if (resolvedMock?.type === "manual" || resolvedMock?.type === "redirect") return {
|
||||
code: "",
|
||||
file: null,
|
||||
id,
|
||||
url: id,
|
||||
invalidate: false,
|
||||
mockedModule: resolvedMock
|
||||
};
|
||||
if (isBuiltin(rawId)) return {
|
||||
externalize: rawId,
|
||||
type: "builtin"
|
||||
};
|
||||
if (isBrowserExternal(rawId)) return {
|
||||
externalize: toBuiltin(rawId),
|
||||
type: "builtin"
|
||||
};
|
||||
// if module is invalidated, the worker will be recreated,
|
||||
// so cached is always true in a single worker
|
||||
if (options?.cached) return { cache: true };
|
||||
const otelCarrier = traces?.getContextCarrier();
|
||||
const result = await rpc().fetch(id, importer, environment(), options, otelCarrier);
|
||||
if ("cached" in result) return {
|
||||
code: readFileSync(result.tmp, "utf-8"),
|
||||
...result
|
||||
};
|
||||
return result;
|
||||
} catch (cause) {
|
||||
// rethrow vite error if it cannot load the module because it's not resolved
|
||||
if (typeof cause === "object" && cause != null && cause.code === "ERR_LOAD_URL" || typeof cause?.message === "string" && cause.message.includes("Failed to load url") || typeof cause?.message === "string" && cause.message.startsWith("Cannot find module '")) {
|
||||
const error = new Error(`Cannot find ${isBareImport(id) ? "package" : "module"} '${id}'${importer ? ` imported from '${importer}'` : ""}`, { cause });
|
||||
error.code = "ERR_MODULE_NOT_FOUND";
|
||||
throw error;
|
||||
}
|
||||
throw cause;
|
||||
} finally {
|
||||
resolvingModules.delete(rawId);
|
||||
}
|
||||
},
|
||||
resolveId(id, importer) {
|
||||
return rpc().resolve(id, importer, environment());
|
||||
}
|
||||
},
|
||||
getWorkerState: state,
|
||||
vm,
|
||||
createImportMeta: options.createImportMeta
|
||||
});
|
||||
return moduleRunner;
|
||||
}
|
||||
|
||||
export { VitestModuleRunner as V, VITEST_VM_CONTEXT_SYMBOL as a, VitestTransport as b, createNodeImportMeta as c, startVitestModuleRunner as s };
|
||||
10
node_modules/vitest/dist/chunks/suite.d.BJWk38HB.d.ts
generated
vendored
Normal file
10
node_modules/vitest/dist/chunks/suite.d.BJWk38HB.d.ts
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Test } from '@vitest/runner';
|
||||
import { c as BenchmarkAPI, a as BenchFunction } from './benchmark.d.DAaHLpsq.js';
|
||||
import { Options } from 'tinybench';
|
||||
import '@vitest/runner/utils';
|
||||
|
||||
declare function getBenchOptions(key: Test): Options;
|
||||
declare function getBenchFn(key: Test): BenchFunction;
|
||||
declare const bench: BenchmarkAPI;
|
||||
|
||||
export { getBenchOptions as a, bench as b, getBenchFn as g };
|
||||
254
node_modules/vitest/dist/chunks/test.BT8LKgU9.js
generated
vendored
Normal file
254
node_modules/vitest/dist/chunks/test.BT8LKgU9.js
generated
vendored
Normal file
@@ -0,0 +1,254 @@
|
||||
import { updateTask } from '@vitest/runner';
|
||||
import { createDefer } from '@vitest/utils/helpers';
|
||||
import { getSafeTimers } from '@vitest/utils/timers';
|
||||
import { a as getBenchOptions, g as getBenchFn } from './benchmark.B3N2zMcH.js';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
import { setState, GLOBAL_EXPECT, getState } from '@vitest/expect';
|
||||
import { getTests, getNames, getTestName } from '@vitest/runner/utils';
|
||||
import { processError } from '@vitest/utils/error';
|
||||
import { normalize } from 'pathe';
|
||||
import { a as getSnapshotClient, i as inject, c as createExpect, v as vi } from './vi.2VT5v0um.js';
|
||||
import { r as rpc } from './rpc.BytlcPfC.js';
|
||||
|
||||
function createBenchmarkResult(name) {
|
||||
return {
|
||||
name,
|
||||
rank: 0,
|
||||
rme: 0,
|
||||
samples: []
|
||||
};
|
||||
}
|
||||
const benchmarkTasks = /* @__PURE__ */ new WeakMap();
|
||||
async function runBenchmarkSuite(suite, runner) {
|
||||
const { Task, Bench } = await runner.importTinybench();
|
||||
const start = performance.now();
|
||||
const benchmarkGroup = [];
|
||||
const benchmarkSuiteGroup = [];
|
||||
for (const task of suite.tasks) {
|
||||
if (task.mode !== "run" && task.mode !== "queued") continue;
|
||||
if (task.meta?.benchmark) benchmarkGroup.push(task);
|
||||
else if (task.type === "suite") benchmarkSuiteGroup.push(task);
|
||||
}
|
||||
// run sub suites sequentially
|
||||
for (const subSuite of benchmarkSuiteGroup) await runBenchmarkSuite(subSuite, runner);
|
||||
if (benchmarkGroup.length) {
|
||||
const defer = createDefer();
|
||||
suite.result = {
|
||||
state: "run",
|
||||
startTime: start,
|
||||
benchmark: createBenchmarkResult(suite.name)
|
||||
};
|
||||
updateTask$1("suite-prepare", suite);
|
||||
const addBenchTaskListener = (task, benchmark) => {
|
||||
task.addEventListener("complete", (e) => {
|
||||
const taskRes = e.task.result;
|
||||
const result = benchmark.result.benchmark;
|
||||
benchmark.result.state = "pass";
|
||||
Object.assign(result, taskRes);
|
||||
// compute extra stats and free raw samples as early as possible
|
||||
const samples = result.samples;
|
||||
result.sampleCount = samples.length;
|
||||
result.median = samples.length % 2 ? samples[Math.floor(samples.length / 2)] : (samples[samples.length / 2] + samples[samples.length / 2 - 1]) / 2;
|
||||
if (!runner.config.benchmark?.includeSamples) result.samples.length = 0;
|
||||
updateTask$1("test-finished", benchmark);
|
||||
}, { once: true });
|
||||
task.addEventListener("error", (e) => {
|
||||
const task = e.task;
|
||||
defer.reject(benchmark ? task.result.error : e);
|
||||
}, { once: true });
|
||||
};
|
||||
benchmarkGroup.forEach((benchmark) => {
|
||||
const benchmarkInstance = new Bench(getBenchOptions(benchmark));
|
||||
const benchmarkFn = getBenchFn(benchmark);
|
||||
benchmark.result = {
|
||||
state: "run",
|
||||
startTime: start,
|
||||
benchmark: createBenchmarkResult(benchmark.name)
|
||||
};
|
||||
const task = new Task(benchmarkInstance, benchmark.name, benchmarkFn);
|
||||
benchmarkTasks.set(benchmark, task);
|
||||
addBenchTaskListener(task, benchmark);
|
||||
});
|
||||
const { setTimeout } = getSafeTimers();
|
||||
const tasks = [];
|
||||
for (const benchmark of benchmarkGroup) {
|
||||
const task = benchmarkTasks.get(benchmark);
|
||||
updateTask$1("test-prepare", benchmark);
|
||||
await task.warmup();
|
||||
tasks.push([await new Promise((resolve) => setTimeout(async () => {
|
||||
resolve(await task.run());
|
||||
})), benchmark]);
|
||||
}
|
||||
suite.result.duration = performance.now() - start;
|
||||
suite.result.state = "pass";
|
||||
updateTask$1("suite-finished", suite);
|
||||
defer.resolve(null);
|
||||
await defer;
|
||||
}
|
||||
function updateTask$1(event, task) {
|
||||
updateTask(event, task, runner);
|
||||
}
|
||||
}
|
||||
class NodeBenchmarkRunner {
|
||||
moduleRunner;
|
||||
constructor(config) {
|
||||
this.config = config;
|
||||
}
|
||||
async importTinybench() {
|
||||
return await import('tinybench');
|
||||
}
|
||||
importFile(filepath, source) {
|
||||
if (source === "setup") {
|
||||
const moduleNode = getWorkerState().evaluatedModules.getModuleById(filepath);
|
||||
if (moduleNode) getWorkerState().evaluatedModules.invalidateModule(moduleNode);
|
||||
}
|
||||
return this.moduleRunner.import(filepath);
|
||||
}
|
||||
async runSuite(suite) {
|
||||
await runBenchmarkSuite(suite, this);
|
||||
}
|
||||
async runTask() {
|
||||
throw new Error("`test()` and `it()` is only available in test mode.");
|
||||
}
|
||||
}
|
||||
|
||||
// worker context is shared between all tests
|
||||
const workerContext = Object.create(null);
|
||||
class VitestTestRunner {
|
||||
snapshotClient = getSnapshotClient();
|
||||
workerState = getWorkerState();
|
||||
moduleRunner;
|
||||
cancelRun = false;
|
||||
assertionsErrors = /* @__PURE__ */ new WeakMap();
|
||||
pool = this.workerState.ctx.pool;
|
||||
_otel;
|
||||
viteEnvironment;
|
||||
constructor(config) {
|
||||
this.config = config;
|
||||
const environment = this.workerState.environment;
|
||||
this.viteEnvironment = environment.viteEnvironment || environment.name;
|
||||
}
|
||||
importFile(filepath, source) {
|
||||
if (source === "setup") {
|
||||
const moduleNode = this.workerState.evaluatedModules.getModuleById(filepath);
|
||||
if (moduleNode) this.workerState.evaluatedModules.invalidateModule(moduleNode);
|
||||
}
|
||||
return this._otel.$(`vitest.module.import_${source === "setup" ? "setup" : "spec"}`, { attributes: { "code.file.path": filepath } }, () => this.moduleRunner.import(filepath));
|
||||
}
|
||||
onCollectStart(file) {
|
||||
this.workerState.current = file;
|
||||
}
|
||||
onCleanupWorkerContext(listener) {
|
||||
this.workerState.onCleanup(listener);
|
||||
}
|
||||
onAfterRunFiles() {
|
||||
this.snapshotClient.clear();
|
||||
this.workerState.current = void 0;
|
||||
}
|
||||
getWorkerContext() {
|
||||
return workerContext;
|
||||
}
|
||||
async onAfterRunSuite(suite) {
|
||||
if (this.config.logHeapUsage && typeof process !== "undefined") suite.result.heap = process.memoryUsage().heapUsed;
|
||||
if (suite.mode !== "skip" && "filepath" in suite) {
|
||||
// mark snapshots in skipped tests as not obsolete
|
||||
for (const test of getTests(suite)) if (test.mode === "skip") {
|
||||
const name = getNames(test).slice(1).join(" > ");
|
||||
this.snapshotClient.skipTest(suite.file.filepath, name);
|
||||
}
|
||||
const result = await this.snapshotClient.finish(suite.file.filepath);
|
||||
if (this.workerState.config.snapshotOptions.updateSnapshot === "none" && result.unchecked) {
|
||||
let message = `Obsolete snapshots found when no snapshot update is expected.\n`;
|
||||
for (const key of result.uncheckedKeys) message += `· ${key}\n`;
|
||||
suite.result.errors ??= [];
|
||||
suite.result.errors.push(processError(new Error(message)));
|
||||
suite.result.state = "fail";
|
||||
}
|
||||
await rpc().snapshotSaved(result);
|
||||
}
|
||||
this.workerState.current = suite.suite || suite.file;
|
||||
}
|
||||
onAfterRunTask(test) {
|
||||
if (this.config.logHeapUsage && typeof process !== "undefined") test.result.heap = process.memoryUsage().heapUsed;
|
||||
this.workerState.current = test.suite || test.file;
|
||||
}
|
||||
cancel(_reason) {
|
||||
this.cancelRun = true;
|
||||
}
|
||||
injectValue(key) {
|
||||
// inject has a very limiting type controlled by ProvidedContext
|
||||
// some tests override it which causes the build to fail
|
||||
return inject(key);
|
||||
}
|
||||
async onBeforeRunTask(test) {
|
||||
if (this.cancelRun) test.mode = "skip";
|
||||
if (test.mode !== "run" && test.mode !== "queued") return;
|
||||
this.workerState.current = test;
|
||||
}
|
||||
async onBeforeRunSuite(suite) {
|
||||
if (this.cancelRun) suite.mode = "skip";
|
||||
// initialize snapshot state before running file suite
|
||||
if (suite.mode !== "skip" && "filepath" in suite) await this.snapshotClient.setup(suite.file.filepath, this.workerState.config.snapshotOptions);
|
||||
this.workerState.current = suite;
|
||||
}
|
||||
onBeforeTryTask(test) {
|
||||
clearModuleMocks(this.config);
|
||||
this.snapshotClient.clearTest(test.file.filepath, test.id);
|
||||
setState({
|
||||
assertionCalls: 0,
|
||||
isExpectingAssertions: false,
|
||||
isExpectingAssertionsError: null,
|
||||
expectedAssertionsNumber: null,
|
||||
expectedAssertionsNumberErrorGen: null,
|
||||
currentTestName: getTestName(test),
|
||||
snapshotState: this.snapshotClient.getSnapshotState(test.file.filepath)
|
||||
}, globalThis[GLOBAL_EXPECT]);
|
||||
}
|
||||
onAfterTryTask(test) {
|
||||
const { assertionCalls, expectedAssertionsNumber, expectedAssertionsNumberErrorGen, isExpectingAssertions, isExpectingAssertionsError } = test.context._local ? test.context.expect.getState() : getState(globalThis[GLOBAL_EXPECT]);
|
||||
if (expectedAssertionsNumber !== null && assertionCalls !== expectedAssertionsNumber) throw expectedAssertionsNumberErrorGen();
|
||||
if (isExpectingAssertions === true && assertionCalls === 0) throw isExpectingAssertionsError;
|
||||
if (this.config.expect.requireAssertions && assertionCalls === 0) throw this.assertionsErrors.get(test);
|
||||
}
|
||||
extendTaskContext(context) {
|
||||
// create error during the test initialization so we have a nice stack trace
|
||||
if (this.config.expect.requireAssertions) this.assertionsErrors.set(context.task, /* @__PURE__ */ new Error("expected any number of assertion, but got none"));
|
||||
let _expect;
|
||||
Object.defineProperty(context, "expect", { get() {
|
||||
if (!_expect) _expect = createExpect(context.task);
|
||||
return _expect;
|
||||
} });
|
||||
Object.defineProperty(context, "_local", { get() {
|
||||
return _expect != null;
|
||||
} });
|
||||
return context;
|
||||
}
|
||||
getImportDurations() {
|
||||
const importDurations = {};
|
||||
const entries = this.workerState.moduleExecutionInfo?.entries() || [];
|
||||
for (const [filepath, { duration, selfTime, external, importer }] of entries) importDurations[normalize(filepath)] = {
|
||||
selfTime,
|
||||
totalTime: duration,
|
||||
external,
|
||||
importer
|
||||
};
|
||||
return importDurations;
|
||||
}
|
||||
trace = (name, attributes, cb) => {
|
||||
const options = typeof attributes === "object" ? { attributes } : {};
|
||||
return this._otel.$(`vitest.test.runner.${name}`, options, cb || attributes);
|
||||
};
|
||||
__setTraces(traces) {
|
||||
this._otel = traces;
|
||||
}
|
||||
}
|
||||
function clearModuleMocks(config) {
|
||||
const { clearMocks, mockReset, restoreMocks, unstubEnvs, unstubGlobals } = config;
|
||||
if (restoreMocks) vi.restoreAllMocks();
|
||||
if (mockReset) vi.resetAllMocks();
|
||||
if (clearMocks) vi.clearAllMocks();
|
||||
if (unstubEnvs) vi.unstubAllEnvs();
|
||||
if (unstubGlobals) vi.unstubAllGlobals();
|
||||
}
|
||||
|
||||
export { NodeBenchmarkRunner as N, VitestTestRunner as V };
|
||||
172
node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js
generated
vendored
Normal file
172
node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js
generated
vendored
Normal file
@@ -0,0 +1,172 @@
|
||||
class Traces {
|
||||
/**
|
||||
* otel stands for OpenTelemetry
|
||||
*/
|
||||
#otel = null;
|
||||
#sdk = null;
|
||||
#init = null;
|
||||
#noopSpan = createNoopSpan();
|
||||
#noopContext = createNoopContext();
|
||||
constructor(options) {
|
||||
if (options.enabled) {
|
||||
const apiInit = import('@opentelemetry/api').then((api) => {
|
||||
this.#otel = {
|
||||
tracer: api.trace.getTracer(options.tracerName || "vitest"),
|
||||
context: api.context,
|
||||
propagation: api.propagation,
|
||||
trace: api.trace,
|
||||
SpanKind: api.SpanKind,
|
||||
SpanStatusCode: api.SpanStatusCode
|
||||
};
|
||||
}).catch(() => {
|
||||
throw new Error(`"@opentelemetry/api" is not installed locally. Make sure you have setup OpenTelemetry instrumentation: https://vitest.dev/guide/open-telemetry`);
|
||||
});
|
||||
const sdkInit = (options.sdkPath ? import(options.sdkPath) : Promise.resolve()).catch((cause) => {
|
||||
throw new Error(`Failed to import custom OpenTelemetry SDK script (${options.sdkPath}): ${cause.message}`);
|
||||
});
|
||||
this.#init = Promise.all([sdkInit, apiInit]).then(([sdk]) => {
|
||||
if (sdk != null) {
|
||||
if (sdk.default != null && typeof sdk.default === "object" && typeof sdk.default.shutdown === "function") this.#sdk = sdk.default;
|
||||
else if (options.watchMode !== true && process.env.VITEST_MODE !== "watch") console.warn(`OpenTelemetry instrumentation module (${options.sdkPath}) does not have a default export with a "shutdown" method. Vitest won't be able to ensure that all traces are processed in time. Try running Vitest in watch mode instead.`);
|
||||
}
|
||||
}).finally(() => {
|
||||
this.#init = null;
|
||||
});
|
||||
}
|
||||
}
|
||||
isEnabled() {
|
||||
return !!this.#otel;
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
async waitInit() {
|
||||
if (this.#init) await this.#init;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
startContextSpan(name, currentContext) {
|
||||
if (!this.#otel) return {
|
||||
span: this.#noopSpan,
|
||||
context: this.#noopContext
|
||||
};
|
||||
const activeContext = currentContext || this.#otel.context.active();
|
||||
const span = this.#otel.tracer.startSpan(name, {}, activeContext);
|
||||
return {
|
||||
span,
|
||||
context: this.#otel.trace.setSpan(activeContext, span)
|
||||
};
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
getContextFromCarrier(carrier) {
|
||||
if (!this.#otel) return this.#noopContext;
|
||||
const activeContext = this.#otel.context.active();
|
||||
if (!carrier) return activeContext;
|
||||
return this.#otel.propagation.extract(activeContext, carrier);
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
getContextCarrier(context) {
|
||||
if (!this.#otel) return;
|
||||
const carrier = {};
|
||||
this.#otel.propagation.inject(context || this.#otel.context.active(), carrier);
|
||||
return carrier;
|
||||
}
|
||||
#callActiveSpan(span, callback) {
|
||||
const otel = this.#otel;
|
||||
let result;
|
||||
try {
|
||||
result = callback(span);
|
||||
if (result instanceof Promise) return result.catch((error) => {
|
||||
span.recordException({
|
||||
name: error.name,
|
||||
message: error.message,
|
||||
stack: error.stack
|
||||
});
|
||||
span.setStatus({ code: otel.SpanStatusCode.ERROR });
|
||||
throw error;
|
||||
}).finally(() => span.end());
|
||||
return result;
|
||||
} catch (error) {
|
||||
if (error instanceof Error) {
|
||||
span.recordException({
|
||||
name: error.name,
|
||||
message: error.message,
|
||||
stack: error.stack
|
||||
});
|
||||
span.setStatus({ code: otel.SpanStatusCode.ERROR });
|
||||
}
|
||||
throw error;
|
||||
} finally {
|
||||
// end sync callbcak
|
||||
if (!(result instanceof Promise)) span.end();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
$(name, optionsOrFn, fn) {
|
||||
const callback = typeof optionsOrFn === "function" ? optionsOrFn : fn;
|
||||
if (!this.#otel) return callback(this.#noopSpan);
|
||||
const otel = this.#otel;
|
||||
const options = typeof optionsOrFn === "function" ? {} : optionsOrFn;
|
||||
const context = options.context;
|
||||
if (context) return otel.tracer.startActiveSpan(name, options, context, (span) => this.#callActiveSpan(span, callback));
|
||||
return otel.tracer.startActiveSpan(name, options, (span) => this.#callActiveSpan(span, callback));
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
startSpan(name, options, context) {
|
||||
if (!this.#otel) return this.#noopSpan;
|
||||
const { tracer } = this.#otel;
|
||||
return tracer.startSpan(name, options, context);
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
async finish() {
|
||||
await this.#sdk?.shutdown();
|
||||
}
|
||||
}
|
||||
function noopSpan() {
|
||||
return this;
|
||||
}
|
||||
function createNoopSpan() {
|
||||
return {
|
||||
setAttribute: noopSpan,
|
||||
setStatus: noopSpan,
|
||||
addEvent: noopSpan,
|
||||
addLink: noopSpan,
|
||||
addLinks: noopSpan,
|
||||
setAttributes: noopSpan,
|
||||
updateName: noopSpan,
|
||||
end: () => {},
|
||||
isRecording: () => false,
|
||||
recordException: noopSpan,
|
||||
spanContext() {
|
||||
return {
|
||||
spanId: "",
|
||||
traceFlags: 0,
|
||||
traceId: ""
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
function noopContext() {
|
||||
return this;
|
||||
}
|
||||
function createNoopContext() {
|
||||
return {
|
||||
getValue: noopContext,
|
||||
setValue: noopContext,
|
||||
deleteValue: noopContext
|
||||
};
|
||||
}
|
||||
|
||||
export { Traces as T };
|
||||
18
node_modules/vitest/dist/chunks/traces.d.402V_yFI.d.ts
generated
vendored
Normal file
18
node_modules/vitest/dist/chunks/traces.d.402V_yFI.d.ts
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
interface OTELCarrier {
|
||||
traceparent?: string;
|
||||
tracestate?: string;
|
||||
}
|
||||
interface TracesOptions {
|
||||
enabled: boolean;
|
||||
watchMode?: boolean;
|
||||
sdkPath?: string;
|
||||
tracerName?: string;
|
||||
}
|
||||
declare class Traces {
|
||||
#private;
|
||||
constructor(options: TracesOptions);
|
||||
isEnabled(): boolean;
|
||||
}
|
||||
|
||||
export { Traces as T };
|
||||
export type { OTELCarrier as O };
|
||||
52
node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
generated
vendored
Normal file
52
node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
import { getSafeTimers } from '@vitest/utils/timers';
|
||||
|
||||
const NAME_WORKER_STATE = "__vitest_worker__";
|
||||
function getWorkerState() {
|
||||
// @ts-expect-error untyped global
|
||||
const workerState = globalThis[NAME_WORKER_STATE];
|
||||
if (!workerState) throw new Error("Vitest failed to access its internal state.\n\nOne of the following is possible:\n- \"vitest\" is imported directly without running \"vitest\" command\n- \"vitest\" is imported inside \"globalSetup\" (to fix this, use \"setupFiles\" instead, because \"globalSetup\" runs in a different context)\n- \"vitest\" is imported inside Vite / Vitest config file\n- Otherwise, it might be a Vitest bug. Please report it to https://github.com/vitest-dev/vitest/issues\n");
|
||||
return workerState;
|
||||
}
|
||||
function provideWorkerState(context, state) {
|
||||
Object.defineProperty(context, NAME_WORKER_STATE, {
|
||||
value: state,
|
||||
configurable: true,
|
||||
writable: true,
|
||||
enumerable: false
|
||||
});
|
||||
return state;
|
||||
}
|
||||
function isChildProcess() {
|
||||
return typeof process !== "undefined" && !!process.send;
|
||||
}
|
||||
function resetModules(modules, resetMocks = false) {
|
||||
const skipPaths = [
|
||||
/\/vitest\/dist\//,
|
||||
/vitest-virtual-\w+\/dist/,
|
||||
/@vitest\/dist/,
|
||||
...!resetMocks ? [/^mock:/] : []
|
||||
];
|
||||
modules.idToModuleMap.forEach((node, path) => {
|
||||
if (skipPaths.some((re) => re.test(path))) return;
|
||||
node.promise = void 0;
|
||||
node.exports = void 0;
|
||||
node.evaluated = false;
|
||||
node.importers.clear();
|
||||
});
|
||||
}
|
||||
function waitNextTick() {
|
||||
const { setTimeout } = getSafeTimers();
|
||||
return new Promise((resolve) => setTimeout(resolve, 0));
|
||||
}
|
||||
async function waitForImportsToResolve() {
|
||||
await waitNextTick();
|
||||
const state = getWorkerState();
|
||||
const promises = [];
|
||||
const resolvingCount = state.resolvingModules.size;
|
||||
for (const [_, mod] of state.evaluatedModules.idToModuleMap) if (mod.promise && !mod.evaluated) promises.push(mod.promise);
|
||||
if (!promises.length && !resolvingCount) return;
|
||||
await Promise.allSettled(promises);
|
||||
await waitForImportsToResolve();
|
||||
}
|
||||
|
||||
export { getWorkerState as g, isChildProcess as i, provideWorkerState as p, resetModules as r, waitForImportsToResolve as w };
|
||||
3919
node_modules/vitest/dist/chunks/vi.2VT5v0um.js
generated
vendored
Normal file
3919
node_modules/vitest/dist/chunks/vi.2VT5v0um.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
747
node_modules/vitest/dist/chunks/vm.BwmD1Rql.js
generated
vendored
Normal file
747
node_modules/vitest/dist/chunks/vm.BwmD1Rql.js
generated
vendored
Normal file
@@ -0,0 +1,747 @@
|
||||
import { fileURLToPath, pathToFileURL } from 'node:url';
|
||||
import vm, { isContext, runInContext } from 'node:vm';
|
||||
import { dirname, basename, extname, normalize, resolve } from 'pathe';
|
||||
import { l as loadEnvironment } from './init.B04saIIg.js';
|
||||
import { distDir } from '../path.js';
|
||||
import { createCustomConsole } from './console.Cf-YriPC.js';
|
||||
import fs from 'node:fs';
|
||||
import { createRequire, Module, isBuiltin } from 'node:module';
|
||||
import { toArray, isBareImport } from '@vitest/utils/helpers';
|
||||
import { findNearestPackageData } from '@vitest/utils/resolver';
|
||||
import { dirname as dirname$1 } from 'node:path';
|
||||
import { CSS_LANGS_RE, KNOWN_ASSET_RE } from '@vitest/utils/constants';
|
||||
import { getDefaultRequestStubs } from '../module-evaluator.js';
|
||||
import { s as startVitestModuleRunner, c as createNodeImportMeta, a as VITEST_VM_CONTEXT_SYMBOL } from './startModuleRunner.Iz2V0ESw.js';
|
||||
import { p as provideWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
function interopCommonJsModule(interopDefault, mod) {
|
||||
if (isPrimitive(mod) || Array.isArray(mod) || mod instanceof Promise) return {
|
||||
keys: [],
|
||||
moduleExports: {},
|
||||
defaultExport: mod
|
||||
};
|
||||
if (interopDefault !== false && "__esModule" in mod && !isPrimitive(mod.default)) {
|
||||
const defaultKets = Object.keys(mod.default);
|
||||
const moduleKeys = Object.keys(mod);
|
||||
const allKeys = new Set([...defaultKets, ...moduleKeys]);
|
||||
allKeys.delete("default");
|
||||
return {
|
||||
keys: Array.from(allKeys),
|
||||
moduleExports: new Proxy(mod, { get(mod, prop) {
|
||||
return mod[prop] ?? mod.default?.[prop];
|
||||
} }),
|
||||
defaultExport: mod
|
||||
};
|
||||
}
|
||||
return {
|
||||
keys: Object.keys(mod).filter((key) => key !== "default"),
|
||||
moduleExports: mod,
|
||||
defaultExport: mod
|
||||
};
|
||||
}
|
||||
function isPrimitive(obj) {
|
||||
return !(obj != null && (typeof obj === "object" || typeof obj === "function"));
|
||||
}
|
||||
const SyntheticModule = vm.SyntheticModule;
|
||||
const SourceTextModule = vm.SourceTextModule;
|
||||
|
||||
const _require = createRequire(import.meta.url);
|
||||
const requiresCache = /* @__PURE__ */ new WeakMap();
|
||||
class CommonjsExecutor {
|
||||
context;
|
||||
requireCache = /* @__PURE__ */ new Map();
|
||||
publicRequireCache = this.createProxyCache();
|
||||
moduleCache = /* @__PURE__ */ new Map();
|
||||
builtinCache = Object.create(null);
|
||||
extensions = Object.create(null);
|
||||
fs;
|
||||
Module;
|
||||
interopDefault;
|
||||
constructor(options) {
|
||||
this.context = options.context;
|
||||
this.fs = options.fileMap;
|
||||
this.interopDefault = options.interopDefault;
|
||||
const primitives = vm.runInContext("({ Object, Array, Error })", this.context);
|
||||
// eslint-disable-next-line ts/no-this-alias
|
||||
const executor = this;
|
||||
this.Module = class Module$1 {
|
||||
exports;
|
||||
isPreloading = false;
|
||||
id;
|
||||
filename;
|
||||
loaded;
|
||||
parent;
|
||||
children = [];
|
||||
path;
|
||||
paths = [];
|
||||
constructor(id = "", parent) {
|
||||
this.exports = primitives.Object.create(Object.prototype);
|
||||
// in our case the path should always be resolved already
|
||||
this.path = dirname(id);
|
||||
this.id = id;
|
||||
this.filename = id;
|
||||
this.loaded = false;
|
||||
this.parent = parent;
|
||||
}
|
||||
get require() {
|
||||
const require = requiresCache.get(this);
|
||||
if (require) return require;
|
||||
const _require = Module$1.createRequire(this.id);
|
||||
requiresCache.set(this, _require);
|
||||
return _require;
|
||||
}
|
||||
static getSourceMapsSupport = () => ({
|
||||
enabled: false,
|
||||
nodeModules: false,
|
||||
generatedCode: false
|
||||
});
|
||||
static setSourceMapsSupport = () => {
|
||||
// noop
|
||||
};
|
||||
static register = () => {
|
||||
throw new Error(`[vitest] "register" is not available when running in Vitest.`);
|
||||
};
|
||||
static registerHooks = () => {
|
||||
throw new Error(`[vitest] "registerHooks" is not available when running in Vitest.`);
|
||||
};
|
||||
_compile(code, filename) {
|
||||
const cjsModule = Module$1.wrap(code);
|
||||
const script = new vm.Script(cjsModule, {
|
||||
filename,
|
||||
importModuleDynamically: options.importModuleDynamically
|
||||
});
|
||||
// @ts-expect-error mark script with current identifier
|
||||
script.identifier = filename;
|
||||
const fn = script.runInContext(executor.context);
|
||||
const __dirname = dirname(filename);
|
||||
executor.requireCache.set(filename, this);
|
||||
try {
|
||||
fn(this.exports, this.require, this, filename, __dirname);
|
||||
return this.exports;
|
||||
} finally {
|
||||
this.loaded = true;
|
||||
}
|
||||
}
|
||||
// exposed for external use, Node.js does the opposite
|
||||
static _load = (request, parent, _isMain) => {
|
||||
return Module$1.createRequire(parent?.filename ?? request)(request);
|
||||
};
|
||||
static wrap = (script) => {
|
||||
return Module$1.wrapper[0] + script + Module$1.wrapper[1];
|
||||
};
|
||||
static wrapper = new primitives.Array("(function (exports, require, module, __filename, __dirname) { ", "\n});");
|
||||
static builtinModules = Module.builtinModules;
|
||||
static findSourceMap = Module.findSourceMap;
|
||||
static SourceMap = Module.SourceMap;
|
||||
static syncBuiltinESMExports = Module.syncBuiltinESMExports;
|
||||
static _cache = executor.publicRequireCache;
|
||||
static _extensions = executor.extensions;
|
||||
static createRequire = (filename) => {
|
||||
return executor.createRequire(filename);
|
||||
};
|
||||
static runMain = () => {
|
||||
throw new primitives.Error("[vitest] \"runMain\" is not implemented.");
|
||||
};
|
||||
// @ts-expect-error not typed
|
||||
static _resolveFilename = Module._resolveFilename;
|
||||
// @ts-expect-error not typed
|
||||
static _findPath = Module._findPath;
|
||||
// @ts-expect-error not typed
|
||||
static _initPaths = Module._initPaths;
|
||||
// @ts-expect-error not typed
|
||||
static _preloadModules = Module._preloadModules;
|
||||
// @ts-expect-error not typed
|
||||
static _resolveLookupPaths = Module._resolveLookupPaths;
|
||||
// @ts-expect-error not typed
|
||||
static globalPaths = Module.globalPaths;
|
||||
static isBuiltin = Module.isBuiltin;
|
||||
static constants = Module.constants;
|
||||
static enableCompileCache = Module.enableCompileCache;
|
||||
static getCompileCacheDir = Module.getCompileCacheDir;
|
||||
static flushCompileCache = Module.flushCompileCache;
|
||||
static stripTypeScriptTypes = Module.stripTypeScriptTypes;
|
||||
static findPackageJSON = Module.findPackageJSON;
|
||||
static Module = Module$1;
|
||||
};
|
||||
this.extensions[".js"] = this.requireJs;
|
||||
this.extensions[".json"] = this.requireJson;
|
||||
}
|
||||
requireJs = (m, filename) => {
|
||||
const content = this.fs.readFile(filename);
|
||||
m._compile(content, filename);
|
||||
};
|
||||
requireJson = (m, filename) => {
|
||||
const code = this.fs.readFile(filename);
|
||||
m.exports = JSON.parse(code);
|
||||
};
|
||||
createRequire = (filename) => {
|
||||
const _require = createRequire(filename);
|
||||
const require = ((id) => {
|
||||
const resolved = _require.resolve(id);
|
||||
if (extname(resolved) === ".node" || isBuiltin(resolved)) return this.requireCoreModule(resolved);
|
||||
const module = new this.Module(resolved);
|
||||
return this.loadCommonJSModule(module, resolved);
|
||||
});
|
||||
require.resolve = _require.resolve;
|
||||
Object.defineProperty(require, "extensions", {
|
||||
get: () => this.extensions,
|
||||
set: () => {},
|
||||
configurable: true
|
||||
});
|
||||
require.main = void 0;
|
||||
require.cache = this.publicRequireCache;
|
||||
return require;
|
||||
};
|
||||
createProxyCache() {
|
||||
return new Proxy(Object.create(null), {
|
||||
defineProperty: () => true,
|
||||
deleteProperty: () => true,
|
||||
set: () => true,
|
||||
get: (_, key) => this.requireCache.get(key),
|
||||
has: (_, key) => this.requireCache.has(key),
|
||||
ownKeys: () => Array.from(this.requireCache.keys()),
|
||||
getOwnPropertyDescriptor() {
|
||||
return {
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
// very naive implementation for Node.js require
|
||||
loadCommonJSModule(module, filename) {
|
||||
const cached = this.requireCache.get(filename);
|
||||
if (cached) return cached.exports;
|
||||
const extension = this.findLongestRegisteredExtension(filename);
|
||||
(this.extensions[extension] || this.extensions[".js"])(module, filename);
|
||||
return module.exports;
|
||||
}
|
||||
findLongestRegisteredExtension(filename) {
|
||||
const name = basename(filename);
|
||||
let currentExtension;
|
||||
let index;
|
||||
let startIndex = 0;
|
||||
// eslint-disable-next-line no-cond-assign
|
||||
while ((index = name.indexOf(".", startIndex)) !== -1) {
|
||||
startIndex = index + 1;
|
||||
if (index === 0) continue;
|
||||
currentExtension = name.slice(index);
|
||||
if (this.extensions[currentExtension]) return currentExtension;
|
||||
}
|
||||
return ".js";
|
||||
}
|
||||
getCoreSyntheticModule(identifier) {
|
||||
if (this.moduleCache.has(identifier)) return this.moduleCache.get(identifier);
|
||||
const exports$1 = this.require(identifier);
|
||||
const keys = Object.keys(exports$1);
|
||||
const module = new SyntheticModule([...keys, "default"], () => {
|
||||
for (const key of keys) module.setExport(key, exports$1[key]);
|
||||
module.setExport("default", exports$1);
|
||||
}, {
|
||||
context: this.context,
|
||||
identifier
|
||||
});
|
||||
this.moduleCache.set(identifier, module);
|
||||
return module;
|
||||
}
|
||||
getCjsSyntheticModule(path, identifier) {
|
||||
if (this.moduleCache.has(identifier)) return this.moduleCache.get(identifier);
|
||||
const exports$1 = this.require(path);
|
||||
// TODO: technically module should be parsed to find static exports, implement for strict mode in #2854
|
||||
const { keys, moduleExports, defaultExport } = interopCommonJsModule(this.interopDefault, exports$1);
|
||||
const module = new SyntheticModule([...keys, "default"], function() {
|
||||
for (const key of keys) this.setExport(key, moduleExports[key]);
|
||||
this.setExport("default", defaultExport);
|
||||
}, {
|
||||
context: this.context,
|
||||
identifier
|
||||
});
|
||||
this.moduleCache.set(identifier, module);
|
||||
return module;
|
||||
}
|
||||
// TODO: use this in strict mode, when available in #2854
|
||||
// private _getNamedCjsExports(path: string): Set<string> {
|
||||
// const cachedNamedExports = this.cjsNamedExportsMap.get(path)
|
||||
// if (cachedNamedExports) {
|
||||
// return cachedNamedExports
|
||||
// }
|
||||
// if (extname(path) === '.node') {
|
||||
// const moduleExports = this.require(path)
|
||||
// const namedExports = new Set(Object.keys(moduleExports))
|
||||
// this.cjsNamedExportsMap.set(path, namedExports)
|
||||
// return namedExports
|
||||
// }
|
||||
// const code = this.fs.readFile(path)
|
||||
// const { exports, reexports } = parseCjs(code, path)
|
||||
// const namedExports = new Set(exports)
|
||||
// this.cjsNamedExportsMap.set(path, namedExports)
|
||||
// for (const reexport of reexports) {
|
||||
// if (isNodeBuiltin(reexport)) {
|
||||
// const exports = this.require(reexport)
|
||||
// if (exports !== null && typeof exports === 'object') {
|
||||
// for (const e of Object.keys(exports)) {
|
||||
// namedExports.add(e)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// else {
|
||||
// const require = this.createRequire(path)
|
||||
// const resolved = require.resolve(reexport)
|
||||
// const exports = this._getNamedCjsExports(resolved)
|
||||
// for (const e of exports) {
|
||||
// namedExports.add(e)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return namedExports
|
||||
// }
|
||||
require(identifier) {
|
||||
if (extname(identifier) === ".node" || isBuiltin(identifier)) return this.requireCoreModule(identifier);
|
||||
const module = new this.Module(identifier);
|
||||
return this.loadCommonJSModule(module, identifier);
|
||||
}
|
||||
requireCoreModule(identifier) {
|
||||
const normalized = identifier.replace(/^node:/, "");
|
||||
if (this.builtinCache[normalized]) return this.builtinCache[normalized].exports;
|
||||
const moduleExports = _require(identifier);
|
||||
if (identifier === "node:module" || identifier === "module") {
|
||||
const module = new this.Module("/module.js");
|
||||
module.exports = this.Module;
|
||||
this.builtinCache[normalized] = module;
|
||||
return module.exports;
|
||||
}
|
||||
this.builtinCache[normalized] = _require.cache[normalized];
|
||||
// TODO: should we wrap module to rethrow context errors?
|
||||
return moduleExports;
|
||||
}
|
||||
}
|
||||
|
||||
const dataURIRegex = /^data:(?<mime>text\/javascript|application\/json|application\/wasm)(?:;(?<encoding>charset=utf-8|base64))?,(?<code>.*)$/;
|
||||
class EsmExecutor {
|
||||
moduleCache = /* @__PURE__ */ new Map();
|
||||
esmLinkMap = /* @__PURE__ */ new WeakMap();
|
||||
context;
|
||||
#httpIp = IPnumber("127.0.0.0");
|
||||
constructor(executor, options) {
|
||||
this.executor = executor;
|
||||
this.context = options.context;
|
||||
}
|
||||
async evaluateModule(m) {
|
||||
if (m.status === "unlinked") this.esmLinkMap.set(m, m.link((identifier, referencer) => this.executor.resolveModule(identifier, referencer.identifier)));
|
||||
await this.esmLinkMap.get(m);
|
||||
if (m.status === "linked") await m.evaluate();
|
||||
return m;
|
||||
}
|
||||
async createEsModule(fileURL, getCode) {
|
||||
const cached = this.moduleCache.get(fileURL);
|
||||
if (cached) return cached;
|
||||
const promise = this.loadEsModule(fileURL, getCode);
|
||||
this.moduleCache.set(fileURL, promise);
|
||||
return promise;
|
||||
}
|
||||
async loadEsModule(fileURL, getCode) {
|
||||
const code = await getCode();
|
||||
// TODO: should not be allowed in strict mode, implement in #2854
|
||||
if (fileURL.endsWith(".json")) {
|
||||
const m = new SyntheticModule(["default"], function() {
|
||||
const result = JSON.parse(code);
|
||||
this.setExport("default", result);
|
||||
});
|
||||
this.moduleCache.set(fileURL, m);
|
||||
return m;
|
||||
}
|
||||
const m = new SourceTextModule(code, {
|
||||
identifier: fileURL,
|
||||
context: this.context,
|
||||
importModuleDynamically: this.executor.importModuleDynamically,
|
||||
initializeImportMeta: (meta, mod) => {
|
||||
meta.url = mod.identifier;
|
||||
if (mod.identifier.startsWith("file:")) {
|
||||
const filename = fileURLToPath(mod.identifier);
|
||||
meta.filename = filename;
|
||||
meta.dirname = dirname$1(filename);
|
||||
}
|
||||
meta.resolve = (specifier, importer) => {
|
||||
return this.executor.resolve(specifier, importer != null ? importer.toString() : mod.identifier);
|
||||
};
|
||||
}
|
||||
});
|
||||
this.moduleCache.set(fileURL, m);
|
||||
return m;
|
||||
}
|
||||
async createWebAssemblyModule(fileUrl, getCode) {
|
||||
const cached = this.moduleCache.get(fileUrl);
|
||||
if (cached) return cached;
|
||||
const m = this.loadWebAssemblyModule(getCode(), fileUrl);
|
||||
this.moduleCache.set(fileUrl, m);
|
||||
return m;
|
||||
}
|
||||
async createNetworkModule(fileUrl) {
|
||||
// https://nodejs.org/api/esm.html#https-and-http-imports
|
||||
if (fileUrl.startsWith("http:")) {
|
||||
const url = new URL(fileUrl);
|
||||
if (url.hostname !== "localhost" && url.hostname !== "::1" && (IPnumber(url.hostname) & IPmask(8)) !== this.#httpIp) throw new Error(
|
||||
// we don't know the importer, so it's undefined (the same happens in --pool=threads)
|
||||
`import of '${fileUrl}' by undefined is not supported: http can only be used to load local resources (use https instead).`
|
||||
);
|
||||
}
|
||||
return this.createEsModule(fileUrl, () => fetch(fileUrl).then((r) => r.text()));
|
||||
}
|
||||
async loadWebAssemblyModule(source, identifier) {
|
||||
const cached = this.moduleCache.get(identifier);
|
||||
if (cached) return cached;
|
||||
const wasmModule = await WebAssembly.compile(source);
|
||||
const exports$1 = WebAssembly.Module.exports(wasmModule);
|
||||
const imports = WebAssembly.Module.imports(wasmModule);
|
||||
const moduleLookup = {};
|
||||
for (const { module } of imports) if (moduleLookup[module] === void 0) moduleLookup[module] = await this.executor.resolveModule(module, identifier);
|
||||
const evaluateModule = (module) => this.evaluateModule(module);
|
||||
return new SyntheticModule(exports$1.map(({ name }) => name), async function() {
|
||||
const importsObject = {};
|
||||
for (const { module, name } of imports) {
|
||||
if (!importsObject[module]) importsObject[module] = {};
|
||||
await evaluateModule(moduleLookup[module]);
|
||||
importsObject[module][name] = moduleLookup[module].namespace[name];
|
||||
}
|
||||
const wasmInstance = new WebAssembly.Instance(wasmModule, importsObject);
|
||||
for (const { name } of exports$1) this.setExport(name, wasmInstance.exports[name]);
|
||||
}, {
|
||||
context: this.context,
|
||||
identifier
|
||||
});
|
||||
}
|
||||
cacheModule(identifier, module) {
|
||||
this.moduleCache.set(identifier, module);
|
||||
}
|
||||
resolveCachedModule(identifier) {
|
||||
return this.moduleCache.get(identifier);
|
||||
}
|
||||
async createDataModule(identifier) {
|
||||
const cached = this.moduleCache.get(identifier);
|
||||
if (cached) return cached;
|
||||
const match = identifier.match(dataURIRegex);
|
||||
if (!match || !match.groups) throw new Error("Invalid data URI");
|
||||
const mime = match.groups.mime;
|
||||
const encoding = match.groups.encoding;
|
||||
if (mime === "application/wasm") {
|
||||
if (!encoding) throw new Error("Missing data URI encoding");
|
||||
if (encoding !== "base64") throw new Error(`Invalid data URI encoding: ${encoding}`);
|
||||
const module = this.loadWebAssemblyModule(Buffer.from(match.groups.code, "base64"), identifier);
|
||||
this.moduleCache.set(identifier, module);
|
||||
return module;
|
||||
}
|
||||
let code = match.groups.code;
|
||||
if (!encoding || encoding === "charset=utf-8") code = decodeURIComponent(code);
|
||||
else if (encoding === "base64") code = Buffer.from(code, "base64").toString();
|
||||
else throw new Error(`Invalid data URI encoding: ${encoding}`);
|
||||
if (mime === "application/json") {
|
||||
const module = new SyntheticModule(["default"], function() {
|
||||
const obj = JSON.parse(code);
|
||||
this.setExport("default", obj);
|
||||
}, {
|
||||
context: this.context,
|
||||
identifier
|
||||
});
|
||||
this.moduleCache.set(identifier, module);
|
||||
return module;
|
||||
}
|
||||
return this.createEsModule(identifier, () => code);
|
||||
}
|
||||
}
|
||||
function IPnumber(address) {
|
||||
const ip = address.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
|
||||
if (ip) return (+ip[1] << 24) + (+ip[2] << 16) + (+ip[3] << 8) + +ip[4];
|
||||
throw new Error(`Expected IP address, received ${address}`);
|
||||
}
|
||||
function IPmask(maskSize) {
|
||||
return -1 << 32 - maskSize;
|
||||
}
|
||||
|
||||
const CLIENT_ID = "/@vite/client";
|
||||
const CLIENT_FILE = pathToFileURL(CLIENT_ID).href;
|
||||
class ViteExecutor {
|
||||
esm;
|
||||
constructor(options) {
|
||||
this.options = options;
|
||||
this.esm = options.esmExecutor;
|
||||
}
|
||||
resolve = (identifier) => {
|
||||
if (identifier === CLIENT_ID) return identifier;
|
||||
};
|
||||
get workerState() {
|
||||
return this.options.context.__vitest_worker__;
|
||||
}
|
||||
async createViteModule(fileUrl) {
|
||||
if (fileUrl === CLIENT_FILE || fileUrl === CLIENT_ID) return this.createViteClientModule();
|
||||
const cached = this.esm.resolveCachedModule(fileUrl);
|
||||
if (cached) return cached;
|
||||
return this.esm.createEsModule(fileUrl, async () => {
|
||||
try {
|
||||
const result = await this.options.transform(fileUrl);
|
||||
if (result.code) return result.code;
|
||||
} catch (cause) {
|
||||
// rethrow vite error if it cannot load the module because it's not resolved
|
||||
if (typeof cause === "object" && cause.code === "ERR_LOAD_URL" || typeof cause?.message === "string" && cause.message.includes("Failed to load url")) {
|
||||
const error = new Error(`Cannot find module '${fileUrl}'`, { cause });
|
||||
error.code = "ERR_MODULE_NOT_FOUND";
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
throw new Error(`[vitest] Failed to transform ${fileUrl}. Does the file exist?`);
|
||||
});
|
||||
}
|
||||
createViteClientModule() {
|
||||
const identifier = CLIENT_ID;
|
||||
const cached = this.esm.resolveCachedModule(identifier);
|
||||
if (cached) return cached;
|
||||
const stub = this.options.viteClientModule;
|
||||
const moduleKeys = Object.keys(stub);
|
||||
const module = new SyntheticModule(moduleKeys, function() {
|
||||
moduleKeys.forEach((key) => {
|
||||
this.setExport(key, stub[key]);
|
||||
});
|
||||
}, {
|
||||
context: this.options.context,
|
||||
identifier
|
||||
});
|
||||
this.esm.cacheModule(identifier, module);
|
||||
return module;
|
||||
}
|
||||
canResolve = (fileUrl) => {
|
||||
if (fileUrl === CLIENT_FILE) return true;
|
||||
const config = this.workerState.config.deps?.web || {};
|
||||
const [modulePath] = fileUrl.split("?");
|
||||
if (config.transformCss && CSS_LANGS_RE.test(modulePath)) return true;
|
||||
if (config.transformAssets && KNOWN_ASSET_RE.test(modulePath)) return true;
|
||||
if (toArray(config.transformGlobPattern).some((pattern) => pattern.test(modulePath))) return true;
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
const { existsSync } = fs;
|
||||
// always defined when we use vm pool
|
||||
const nativeResolve = import.meta.resolve;
|
||||
// TODO: improve Node.js strict mode support in #2854
|
||||
class ExternalModulesExecutor {
|
||||
cjs;
|
||||
esm;
|
||||
vite;
|
||||
context;
|
||||
fs;
|
||||
resolvers = [];
|
||||
#networkSupported = null;
|
||||
constructor(options) {
|
||||
this.options = options;
|
||||
this.context = options.context;
|
||||
this.fs = options.fileMap;
|
||||
this.esm = new EsmExecutor(this, { context: this.context });
|
||||
this.cjs = new CommonjsExecutor({
|
||||
context: this.context,
|
||||
importModuleDynamically: this.importModuleDynamically,
|
||||
fileMap: options.fileMap,
|
||||
interopDefault: options.interopDefault
|
||||
});
|
||||
this.vite = new ViteExecutor({
|
||||
esmExecutor: this.esm,
|
||||
context: this.context,
|
||||
transform: options.transform,
|
||||
viteClientModule: options.viteClientModule
|
||||
});
|
||||
this.resolvers = [this.vite.resolve];
|
||||
}
|
||||
async import(identifier) {
|
||||
const module = await this.createModule(identifier);
|
||||
await this.esm.evaluateModule(module);
|
||||
return module.namespace;
|
||||
}
|
||||
require(identifier) {
|
||||
return this.cjs.require(identifier);
|
||||
}
|
||||
createRequire(identifier) {
|
||||
return this.cjs.createRequire(identifier);
|
||||
}
|
||||
// dynamic import can be used in both ESM and CJS, so we have it in the executor
|
||||
importModuleDynamically = async (specifier, referencer) => {
|
||||
const module = await this.resolveModule(specifier, referencer.identifier);
|
||||
return await this.esm.evaluateModule(module);
|
||||
};
|
||||
resolveModule = async (specifier, referencer) => {
|
||||
let identifier = this.resolve(specifier, referencer);
|
||||
if (identifier instanceof Promise) identifier = await identifier;
|
||||
return await this.createModule(identifier);
|
||||
};
|
||||
resolve(specifier, parent) {
|
||||
for (const resolver of this.resolvers) {
|
||||
const id = resolver(specifier, parent);
|
||||
if (id) return id;
|
||||
}
|
||||
// import.meta.resolve can be asynchronous in older +18 Node versions
|
||||
return nativeResolve(specifier, parent);
|
||||
}
|
||||
getModuleInformation(identifier) {
|
||||
if (identifier.startsWith("data:")) return {
|
||||
type: "data",
|
||||
url: identifier,
|
||||
path: identifier
|
||||
};
|
||||
const extension = extname(identifier);
|
||||
if (extension === ".node" || isBuiltin(identifier)) return {
|
||||
type: "builtin",
|
||||
url: identifier,
|
||||
path: identifier
|
||||
};
|
||||
if (this.isNetworkSupported && (identifier.startsWith("http:") || identifier.startsWith("https:"))) return {
|
||||
type: "network",
|
||||
url: identifier,
|
||||
path: identifier
|
||||
};
|
||||
const isFileUrl = identifier.startsWith("file://");
|
||||
const pathUrl = isFileUrl ? fileURLToPath(identifier.split("?")[0]) : identifier;
|
||||
const fileUrl = isFileUrl ? identifier : pathToFileURL(pathUrl).toString();
|
||||
let type;
|
||||
if (this.vite.canResolve(fileUrl)) type = "vite";
|
||||
else if (extension === ".mjs") type = "module";
|
||||
else if (extension === ".cjs") type = "commonjs";
|
||||
else if (extension === ".wasm")
|
||||
// still experimental on NodeJS --experimental-wasm-modules
|
||||
// cf. ESM_FILE_FORMAT(url) in https://nodejs.org/docs/latest-v20.x/api/esm.html#resolution-algorithm
|
||||
type = "wasm";
|
||||
else type = findNearestPackageData(normalize(pathUrl)).type === "module" ? "module" : "commonjs";
|
||||
return {
|
||||
type,
|
||||
path: pathUrl,
|
||||
url: fileUrl
|
||||
};
|
||||
}
|
||||
createModule(identifier) {
|
||||
const { type, url, path } = this.getModuleInformation(identifier);
|
||||
// create ERR_MODULE_NOT_FOUND on our own since latest NodeJS's import.meta.resolve doesn't throw on non-existing namespace or path
|
||||
// https://github.com/nodejs/node/pull/49038
|
||||
if ((type === "module" || type === "commonjs" || type === "wasm") && !existsSync(path)) {
|
||||
const error = /* @__PURE__ */ new Error(`Cannot find ${isBareImport(path) ? "package" : "module"} '${path}'`);
|
||||
error.code = "ERR_MODULE_NOT_FOUND";
|
||||
throw error;
|
||||
}
|
||||
switch (type) {
|
||||
case "data": return this.esm.createDataModule(identifier);
|
||||
case "builtin": return this.cjs.getCoreSyntheticModule(identifier);
|
||||
case "vite": return this.vite.createViteModule(url);
|
||||
case "wasm": return this.esm.createWebAssemblyModule(url, () => this.fs.readBuffer(path));
|
||||
case "module": return this.esm.createEsModule(url, () => this.fs.readFileAsync(path));
|
||||
case "commonjs": return this.cjs.getCjsSyntheticModule(path, identifier);
|
||||
case "network": return this.esm.createNetworkModule(url);
|
||||
default: return type;
|
||||
}
|
||||
}
|
||||
get isNetworkSupported() {
|
||||
if (this.#networkSupported == null) if (process.execArgv.includes("--experimental-network-imports")) this.#networkSupported = true;
|
||||
else if (process.env.NODE_OPTIONS?.includes("--experimental-network-imports")) this.#networkSupported = true;
|
||||
else this.#networkSupported = false;
|
||||
return this.#networkSupported;
|
||||
}
|
||||
}
|
||||
|
||||
const { promises, readFileSync } = fs;
|
||||
class FileMap {
|
||||
fsCache = /* @__PURE__ */ new Map();
|
||||
fsBufferCache = /* @__PURE__ */ new Map();
|
||||
async readFileAsync(path) {
|
||||
const cached = this.fsCache.get(path);
|
||||
if (cached != null) return cached;
|
||||
const source = await promises.readFile(path, "utf-8");
|
||||
this.fsCache.set(path, source);
|
||||
return source;
|
||||
}
|
||||
readFile(path) {
|
||||
const cached = this.fsCache.get(path);
|
||||
if (cached != null) return cached;
|
||||
const source = readFileSync(path, "utf-8");
|
||||
this.fsCache.set(path, source);
|
||||
return source;
|
||||
}
|
||||
readBuffer(path) {
|
||||
const cached = this.fsBufferCache.get(path);
|
||||
if (cached != null) return cached;
|
||||
const buffer = readFileSync(path);
|
||||
this.fsBufferCache.set(path, buffer);
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
|
||||
const entryFile = pathToFileURL(resolve(distDir, "workers/runVmTests.js")).href;
|
||||
const fileMap = new FileMap();
|
||||
const packageCache = /* @__PURE__ */ new Map();
|
||||
async function runVmTests(method, state, traces) {
|
||||
const { ctx, rpc } = state;
|
||||
const beforeEnvironmentTime = performance.now();
|
||||
const { environment } = await loadEnvironment(ctx.environment.name, ctx.config.root, rpc, traces);
|
||||
state.environment = environment;
|
||||
if (!environment.setupVM) {
|
||||
const envName = ctx.environment.name;
|
||||
const packageId = envName[0] === "." ? envName : `vitest-environment-${envName}`;
|
||||
throw new TypeError(`Environment "${ctx.environment.name}" is not a valid environment. Path "${packageId}" doesn't support vm environment because it doesn't provide "setupVM" method.`);
|
||||
}
|
||||
const vm = await traces.$("vitest.runtime.environment.setup", { attributes: {
|
||||
"vitest.environment": environment.name,
|
||||
"vitest.environment.vite_environment": environment.viteEnvironment || environment.name
|
||||
} }, () => environment.setupVM(ctx.environment.options || ctx.config.environmentOptions || {}));
|
||||
state.durations.environment = performance.now() - beforeEnvironmentTime;
|
||||
process.env.VITEST_VM_POOL = "1";
|
||||
if (!vm.getVmContext) throw new TypeError(`Environment ${environment.name} doesn't provide "getVmContext" method. It should return a context created by "vm.createContext" method.`);
|
||||
const context = vm.getVmContext();
|
||||
if (!isContext(context)) throw new TypeError(`Environment ${environment.name} doesn't provide a valid context. It should be created by "vm.createContext" method.`);
|
||||
provideWorkerState(context, state);
|
||||
// this is unfortunately needed for our own dependencies
|
||||
// we need to find a way to not rely on this by default
|
||||
// because browser doesn't provide these globals
|
||||
context.process = process;
|
||||
context.global = context;
|
||||
context.console = state.config.disableConsoleIntercept ? console : createCustomConsole(state);
|
||||
// TODO: don't hardcode setImmediate in fake timers defaults
|
||||
context.setImmediate = setImmediate;
|
||||
context.clearImmediate = clearImmediate;
|
||||
const stubs = getDefaultRequestStubs(context);
|
||||
const externalModulesExecutor = new ExternalModulesExecutor({
|
||||
context,
|
||||
fileMap,
|
||||
packageCache,
|
||||
transform: rpc.transform,
|
||||
viteClientModule: stubs["/@vite/client"]
|
||||
});
|
||||
const moduleRunner = startVitestModuleRunner({
|
||||
context,
|
||||
evaluatedModules: state.evaluatedModules,
|
||||
state,
|
||||
externalModulesExecutor,
|
||||
createImportMeta: createNodeImportMeta,
|
||||
traces
|
||||
});
|
||||
Object.defineProperty(context, VITEST_VM_CONTEXT_SYMBOL, {
|
||||
value: {
|
||||
context,
|
||||
externalModulesExecutor
|
||||
},
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
writable: false
|
||||
});
|
||||
context.__vitest_mocker__ = moduleRunner.mocker;
|
||||
if (ctx.config.serializedDefines) try {
|
||||
runInContext(ctx.config.serializedDefines, context, { filename: "virtual:load-defines.js" });
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to load custom "defines": ${error.message}`);
|
||||
}
|
||||
await moduleRunner.mocker.initializeSpyModule();
|
||||
const { run } = await moduleRunner.import(entryFile);
|
||||
const fileSpecs = ctx.files.map((f) => typeof f === "string" ? {
|
||||
filepath: f,
|
||||
testLocations: void 0
|
||||
} : f);
|
||||
try {
|
||||
await run(method, fileSpecs, ctx.config, moduleRunner, traces);
|
||||
} finally {
|
||||
await traces.$("vitest.runtime.environment.teardown", () => vm.teardown?.());
|
||||
}
|
||||
}
|
||||
|
||||
export { runVmTests as r };
|
||||
238
node_modules/vitest/dist/chunks/worker.d.B4A26qg6.d.ts
generated
vendored
Normal file
238
node_modules/vitest/dist/chunks/worker.d.B4A26qg6.d.ts
generated
vendored
Normal file
@@ -0,0 +1,238 @@
|
||||
import { FileSpecification, Task, CancelReason } from '@vitest/runner';
|
||||
import { EvaluatedModules } from 'vite/module-runner';
|
||||
import { S as SerializedConfig } from './config.d.CzIjkicf.js';
|
||||
import { E as Environment } from './environment.d.CrsxCzP1.js';
|
||||
import { R as RuntimeRPC, a as RunnerRPC } from './rpc.d.RH3apGEf.js';
|
||||
|
||||
type ArgumentsType<T> = T extends (...args: infer A) => any ? A : never;
|
||||
type ReturnType<T> = T extends (...args: any) => infer R ? R : never;
|
||||
type PromisifyFn<T> = ReturnType<T> extends Promise<any> ? T : (...args: ArgumentsType<T>) => Promise<Awaited<ReturnType<T>>>;
|
||||
type Thenable<T> = T | PromiseLike<T>;
|
||||
type BirpcResolver = (name: string, resolved: (...args: unknown[]) => unknown) => Thenable<((...args: unknown[]) => unknown) | undefined>;
|
||||
interface ChannelOptions {
|
||||
/**
|
||||
* Function to post raw message
|
||||
*/
|
||||
post: (data: any, ...extras: any[]) => any | Promise<any>;
|
||||
/**
|
||||
* Listener to receive raw message
|
||||
*/
|
||||
on: (fn: (data: any, ...extras: any[]) => void) => any | Promise<any>;
|
||||
/**
|
||||
* Clear the listener when `$close` is called
|
||||
*/
|
||||
off?: (fn: (data: any, ...extras: any[]) => void) => any | Promise<any>;
|
||||
/**
|
||||
* Custom function to serialize data
|
||||
*
|
||||
* by default it passes the data as-is
|
||||
*/
|
||||
serialize?: (data: any) => any;
|
||||
/**
|
||||
* Custom function to deserialize data
|
||||
*
|
||||
* by default it passes the data as-is
|
||||
*/
|
||||
deserialize?: (data: any) => any;
|
||||
/**
|
||||
* Call the methods with the RPC context or the original functions object
|
||||
*/
|
||||
bind?: 'rpc' | 'functions';
|
||||
}
|
||||
interface EventOptions<Remote> {
|
||||
/**
|
||||
* Names of remote functions that do not need response.
|
||||
*/
|
||||
eventNames?: (keyof Remote)[];
|
||||
/**
|
||||
* Maximum timeout for waiting for response, in milliseconds.
|
||||
*
|
||||
* @default 60_000
|
||||
*/
|
||||
timeout?: number;
|
||||
/**
|
||||
* Custom resolver to resolve function to be called
|
||||
*
|
||||
* For advanced use cases only
|
||||
*/
|
||||
resolver?: BirpcResolver;
|
||||
/**
|
||||
* Hook triggered before an event is sent to the remote
|
||||
*
|
||||
* @param req - Request parameters
|
||||
* @param next - Function to continue the request
|
||||
* @param resolve - Function to resolve the response directly
|
||||
*/
|
||||
onRequest?: (req: Request, next: (req?: Request) => Promise<any>, resolve: (res: any) => void) => void | Promise<void>;
|
||||
/**
|
||||
* Custom error handler
|
||||
*
|
||||
* @deprecated use `onFunctionError` and `onGeneralError` instead
|
||||
*/
|
||||
onError?: (error: Error, functionName: string, args: any[]) => boolean | void;
|
||||
/**
|
||||
* Custom error handler for errors occurred in local functions being called
|
||||
*
|
||||
* @returns `true` to prevent the error from being thrown
|
||||
*/
|
||||
onFunctionError?: (error: Error, functionName: string, args: any[]) => boolean | void;
|
||||
/**
|
||||
* Custom error handler for errors occurred during serialization or messsaging
|
||||
*
|
||||
* @returns `true` to prevent the error from being thrown
|
||||
*/
|
||||
onGeneralError?: (error: Error, functionName?: string, args?: any[]) => boolean | void;
|
||||
/**
|
||||
* Custom error handler for timeouts
|
||||
*
|
||||
* @returns `true` to prevent the error from being thrown
|
||||
*/
|
||||
onTimeoutError?: (functionName: string, args: any[]) => boolean | void;
|
||||
}
|
||||
type BirpcOptions<Remote> = EventOptions<Remote> & ChannelOptions;
|
||||
type BirpcFn<T> = PromisifyFn<T> & {
|
||||
/**
|
||||
* Send event without asking for response
|
||||
*/
|
||||
asEvent: (...args: ArgumentsType<T>) => Promise<void>;
|
||||
};
|
||||
interface BirpcReturnBuiltin<RemoteFunctions, LocalFunctions = Record<string, never>> {
|
||||
/**
|
||||
* Raw functions object
|
||||
*/
|
||||
$functions: LocalFunctions;
|
||||
/**
|
||||
* Whether the RPC is closed
|
||||
*/
|
||||
readonly $closed: boolean;
|
||||
/**
|
||||
* Close the RPC connection
|
||||
*/
|
||||
$close: (error?: Error) => void;
|
||||
/**
|
||||
* Reject pending calls
|
||||
*/
|
||||
$rejectPendingCalls: (handler?: PendingCallHandler) => Promise<void>[];
|
||||
/**
|
||||
* Call the remote function and wait for the result.
|
||||
* An alternative to directly calling the function
|
||||
*/
|
||||
$call: <K extends keyof RemoteFunctions>(method: K, ...args: ArgumentsType<RemoteFunctions[K]>) => Promise<Awaited<ReturnType<RemoteFunctions[K]>>>;
|
||||
/**
|
||||
* Same as `$call`, but returns `undefined` if the function is not defined on the remote side.
|
||||
*/
|
||||
$callOptional: <K extends keyof RemoteFunctions>(method: K, ...args: ArgumentsType<RemoteFunctions[K]>) => Promise<Awaited<ReturnType<RemoteFunctions[K]> | undefined>>;
|
||||
/**
|
||||
* Send event without asking for response
|
||||
*/
|
||||
$callEvent: <K extends keyof RemoteFunctions>(method: K, ...args: ArgumentsType<RemoteFunctions[K]>) => Promise<void>;
|
||||
/**
|
||||
* Call the remote function with the raw options.
|
||||
*/
|
||||
$callRaw: (options: {
|
||||
method: string;
|
||||
args: unknown[];
|
||||
event?: boolean;
|
||||
optional?: boolean;
|
||||
}) => Promise<Awaited<ReturnType<any>>[]>;
|
||||
}
|
||||
type BirpcReturn<RemoteFunctions, LocalFunctions = Record<string, never>> = {
|
||||
[K in keyof RemoteFunctions]: BirpcFn<RemoteFunctions[K]>;
|
||||
} & BirpcReturnBuiltin<RemoteFunctions, LocalFunctions>;
|
||||
type PendingCallHandler = (options: Pick<PromiseEntry, 'method' | 'reject'>) => void | Promise<void>;
|
||||
interface PromiseEntry {
|
||||
resolve: (arg: any) => void;
|
||||
reject: (error: any) => void;
|
||||
method: string;
|
||||
timeoutId?: ReturnType<typeof setTimeout>;
|
||||
}
|
||||
declare const TYPE_REQUEST: "q";
|
||||
interface Request {
|
||||
/**
|
||||
* Type
|
||||
*/
|
||||
t: typeof TYPE_REQUEST;
|
||||
/**
|
||||
* ID
|
||||
*/
|
||||
i?: string;
|
||||
/**
|
||||
* Method
|
||||
*/
|
||||
m: string;
|
||||
/**
|
||||
* Arguments
|
||||
*/
|
||||
a: any[];
|
||||
/**
|
||||
* Optional
|
||||
*/
|
||||
o?: boolean;
|
||||
}
|
||||
declare const setTimeout: typeof globalThis.setTimeout;
|
||||
|
||||
type WorkerRPC = BirpcReturn<RuntimeRPC, RunnerRPC>;
|
||||
interface ContextTestEnvironment {
|
||||
name: string;
|
||||
options: Record<string, any> | null;
|
||||
}
|
||||
interface WorkerTestEnvironment {
|
||||
name: string;
|
||||
options: Record<string, any> | null;
|
||||
}
|
||||
type TestExecutionMethod = "run" | "collect";
|
||||
interface WorkerExecuteContext {
|
||||
files: FileSpecification[];
|
||||
providedContext: Record<string, any>;
|
||||
invalidates?: string[];
|
||||
/** Exposed to test runner as `VITEST_WORKER_ID`. Value is unique per each isolated worker. */
|
||||
workerId: number;
|
||||
}
|
||||
interface ContextRPC {
|
||||
pool: string;
|
||||
config: SerializedConfig;
|
||||
projectName: string;
|
||||
environment: WorkerTestEnvironment;
|
||||
rpc: WorkerRPC;
|
||||
files: FileSpecification[];
|
||||
providedContext: Record<string, any>;
|
||||
invalidates?: string[];
|
||||
/** Exposed to test runner as `VITEST_WORKER_ID`. Value is unique per each isolated worker. */
|
||||
workerId: number;
|
||||
}
|
||||
interface WorkerSetupContext {
|
||||
environment: WorkerTestEnvironment;
|
||||
pool: string;
|
||||
config: SerializedConfig;
|
||||
projectName: string;
|
||||
rpc: WorkerRPC;
|
||||
}
|
||||
interface WorkerGlobalState {
|
||||
ctx: ContextRPC;
|
||||
config: SerializedConfig;
|
||||
rpc: WorkerRPC;
|
||||
current?: Task;
|
||||
filepath?: string;
|
||||
metaEnv: {
|
||||
[key: string]: any;
|
||||
BASE_URL: string;
|
||||
MODE: string;
|
||||
DEV: boolean;
|
||||
PROD: boolean;
|
||||
SSR: boolean;
|
||||
};
|
||||
environment: Environment;
|
||||
evaluatedModules: EvaluatedModules;
|
||||
resolvingModules: Set<string>;
|
||||
moduleExecutionInfo: Map<string, any>;
|
||||
onCancel: (listener: (reason: CancelReason) => unknown) => void;
|
||||
onCleanup: (listener: () => unknown) => void;
|
||||
providedContext: Record<string, any>;
|
||||
durations: {
|
||||
environment: number;
|
||||
prepare: number;
|
||||
};
|
||||
onFilterStackTrace?: (trace: string) => string;
|
||||
}
|
||||
|
||||
export type { BirpcOptions as B, ContextRPC as C, TestExecutionMethod as T, WorkerGlobalState as W, WorkerSetupContext as a, BirpcReturn as b, ContextTestEnvironment as c, WorkerExecuteContext as d, WorkerTestEnvironment as e };
|
||||
Reference in New Issue
Block a user