aboutsummaryrefslogtreecommitdiffstats
path: root/vanilla/node_modules/vitest/dist/module-evaluator.js
diff options
context:
space:
mode:
Diffstat (limited to 'vanilla/node_modules/vitest/dist/module-evaluator.js')
-rw-r--r--vanilla/node_modules/vitest/dist/module-evaluator.js343
1 files changed, 0 insertions, 343 deletions
diff --git a/vanilla/node_modules/vitest/dist/module-evaluator.js b/vanilla/node_modules/vitest/dist/module-evaluator.js
deleted file mode 100644
index 0ff253b..0000000
--- a/vanilla/node_modules/vitest/dist/module-evaluator.js
+++ /dev/null
@@ -1,343 +0,0 @@
-import { isBuiltin, createRequire } from 'node:module';
-import { pathToFileURL, fileURLToPath } from 'node:url';
-import vm from 'node:vm';
-import { ssrModuleExportsKey, ssrImportMetaKey, ssrImportKey, ssrDynamicImportKey, ssrExportAllKey } from 'vite/module-runner';
-import { T as Traces } from './chunks/traces.CCmnQaNT.js';
-
-const performanceNow = performance.now.bind(performance);
-class ModuleDebug {
- executionStack = [];
- startCalculateModuleExecutionInfo(filename, options) {
- const startTime = performanceNow();
- this.executionStack.push({
- filename,
- startTime,
- subImportTime: 0
- });
- return () => {
- const duration = performanceNow() - startTime;
- const currentExecution = this.executionStack.pop();
- if (currentExecution == null) throw new Error("Execution stack is empty, this should never happen");
- const selfTime = duration - currentExecution.subImportTime;
- if (this.executionStack.length > 0) this.executionStack.at(-1).subImportTime += duration;
- return {
- startOffset: options.startOffset,
- external: options.external,
- importer: options.importer,
- duration,
- selfTime
- };
- };
- }
-}
-
-const isWindows = process.platform === "win32";
-class VitestModuleEvaluator {
- stubs = {};
- env = createImportMetaEnvProxy();
- vm;
- compiledFunctionArgumentsNames;
- compiledFunctionArgumentsValues = [];
- primitives;
- debug = new ModuleDebug();
- _otel;
- _evaluatedModules;
- constructor(vmOptions, options = {}) {
- this.options = options;
- this._otel = options.traces || new Traces({ enabled: false });
- this.vm = vmOptions;
- this.stubs = getDefaultRequestStubs(vmOptions?.context);
- this._evaluatedModules = options.evaluatedModules;
- if (options.compiledFunctionArgumentsNames) this.compiledFunctionArgumentsNames = options.compiledFunctionArgumentsNames;
- if (options.compiledFunctionArgumentsValues) this.compiledFunctionArgumentsValues = options.compiledFunctionArgumentsValues;
- if (vmOptions) this.primitives = vm.runInContext("({ Object, Proxy, Reflect })", vmOptions.context);
- else this.primitives = {
- Object,
- Proxy,
- Reflect
- };
- }
- convertIdToImportUrl(id) {
- // TODO: vitest returns paths for external modules, but Vite returns file://
- // REMOVE WHEN VITE 6 SUPPORT IS OVER
- // unfortunetly, there is a bug in Vite where ID is resolved incorrectly, so we can't return files until the fix is merged
- // https://github.com/vitejs/vite/pull/20449
- if (!isWindows || isBuiltin(id) || /^(?:node:|data:|http:|https:|file:)/.test(id)) return id;
- const [filepath, query] = id.split("?");
- if (query) return `${pathToFileURL(filepath).toString()}?${query}`;
- return pathToFileURL(filepath).toString();
- }
- async runExternalModule(id) {
- if (id in this.stubs) return this.stubs[id];
- const file = this.convertIdToImportUrl(id);
- const importer = (this._evaluatedModules?.getModuleById(id)?.importers)?.values().next().value;
- const filename = id.startsWith("file://") ? fileURLToPath(id) : id;
- const finishModuleExecutionInfo = this.debug.startCalculateModuleExecutionInfo(filename, {
- startOffset: 0,
- external: true,
- importer
- });
- const namespace = await this._otel.$("vitest.module.external", { attributes: { "code.file.path": file } }, () => this.vm ? this.vm.externalModulesExecutor.import(file) : import(file)).finally(() => {
- this.options.moduleExecutionInfo?.set(filename, finishModuleExecutionInfo());
- });
- if (!this.shouldInterop(file, namespace)) return namespace;
- const { mod, defaultExport } = interopModule(namespace);
- const { Proxy, Reflect } = this.primitives;
- return new Proxy(mod, {
- get(mod, prop) {
- if (prop === "default") return defaultExport;
- return mod[prop] ?? defaultExport?.[prop];
- },
- has(mod, prop) {
- if (prop === "default") return defaultExport !== void 0;
- return prop in mod || defaultExport && prop in defaultExport;
- },
- getOwnPropertyDescriptor(mod, prop) {
- const descriptor = Reflect.getOwnPropertyDescriptor(mod, prop);
- if (descriptor) return descriptor;
- if (prop === "default" && defaultExport !== void 0) return {
- value: defaultExport,
- enumerable: true,
- configurable: true
- };
- }
- });
- }
- async runInlinedModule(context, code, module) {
- return this._otel.$("vitest.module.inline", (span) => this._runInlinedModule(context, code, module, span));
- }
- async _runInlinedModule(context, code, module, span) {
- context.__vite_ssr_import_meta__.env = this.env;
- const { Reflect, Proxy, Object } = this.primitives;
- const exportsObject = context[ssrModuleExportsKey];
- const SYMBOL_NOT_DEFINED = Symbol("not defined");
- let moduleExports = SYMBOL_NOT_DEFINED;
- // this proxy is triggered only on exports.{name} and module.exports access
- // inside the module itself. imported module is always "exports"
- const cjsExports = new Proxy(exportsObject, {
- get: (target, p, receiver) => {
- if (Reflect.has(target, p)) return Reflect.get(target, p, receiver);
- return Reflect.get(Object.prototype, p, receiver);
- },
- getPrototypeOf: () => Object.prototype,
- set: (_, p, value) => {
- span.addEvent(`cjs export proxy is triggered for ${String(p)}`);
- // treat "module.exports =" the same as "exports.default =" to not have nested "default.default",
- // so "exports.default" becomes the actual module
- if (p === "default" && this.shouldInterop(module.file, { default: value }) && cjsExports !== value) {
- span.addEvent("`exports.default` is assigned, copying values");
- exportAll(cjsExports, value);
- exportsObject.default = value;
- return true;
- }
- if (!Reflect.has(exportsObject, "default")) exportsObject.default = {};
- // returns undefined, when accessing named exports, if default is not an object
- // but is still present inside hasOwnKeys, this is Node behaviour for CJS
- if (moduleExports !== SYMBOL_NOT_DEFINED && isPrimitive(moduleExports)) {
- span.addEvent(`\`exports.${String(p)}\` is assigned, but module.exports is a primitive. assigning "undefined" values instead to comply with ESM`);
- defineExport(exportsObject, p, () => void 0);
- return true;
- }
- if (!isPrimitive(exportsObject.default)) exportsObject.default[p] = value;
- if (p !== "default") defineExport(exportsObject, p, () => value);
- return true;
- }
- });
- const moduleProxy = {
- set exports(value) {
- span.addEvent("`module.exports` is assigned directly, copying all properties to `exports`");
- exportAll(cjsExports, value);
- exportsObject.default = value;
- moduleExports = value;
- },
- get exports() {
- return cjsExports;
- }
- };
- const meta = context[ssrImportMetaKey];
- if (this.options.getCurrentTestFilepath?.() === module.file) {
- const globalNamespace = this.vm?.context || globalThis;
- Object.defineProperty(meta, "vitest", { get: () => globalNamespace.__vitest_index__ });
- }
- const filename = meta.filename;
- const dirname = meta.dirname;
- span.setAttributes({ "code.file.path": filename });
- const require = this.createRequire(meta.url);
- const argumentsList = [
- ssrModuleExportsKey,
- ssrImportMetaKey,
- ssrImportKey,
- ssrDynamicImportKey,
- ssrExportAllKey,
- "__vite_ssr_exportName__",
- "__filename",
- "__dirname",
- "module",
- "exports",
- "require"
- ];
- if (this.compiledFunctionArgumentsNames) argumentsList.push(...this.compiledFunctionArgumentsNames);
- span.setAttribute("vitest.module.arguments", argumentsList);
- // add 'use strict' since ESM enables it by default
- const codeDefinition = `'use strict';async (${argumentsList.join(",")})=>{{`;
- const wrappedCode = `${codeDefinition}${code}\n}}`;
- const options = {
- filename: module.id,
- lineOffset: 0,
- columnOffset: -codeDefinition.length
- };
- // this will always be 1 element because it's cached after load
- const importer = module.importers.values().next().value;
- const finishModuleExecutionInfo = this.debug.startCalculateModuleExecutionInfo(options.filename, {
- startOffset: codeDefinition.length,
- importer
- });
- try {
- await (this.vm ? vm.runInContext(wrappedCode, this.vm.context, options) : vm.runInThisContext(wrappedCode, options))(
- context[ssrModuleExportsKey],
- context[ssrImportMetaKey],
- context[ssrImportKey],
- context[ssrDynamicImportKey],
- context[ssrExportAllKey],
- // vite 7 support, remove when vite 7+ is supported
- context.__vite_ssr_exportName__ || ((name, getter) => Object.defineProperty(exportsObject, name, {
- enumerable: true,
- configurable: true,
- get: getter
- })),
- filename,
- dirname,
- moduleProxy,
- cjsExports,
- require,
- ...this.compiledFunctionArgumentsValues
- );
- } finally {
- // moduleExecutionInfo needs to use Node filename instead of the normalized one
- // because we rely on this behaviour in coverage-v8, for example
- this.options.moduleExecutionInfo?.set(options.filename, finishModuleExecutionInfo());
- }
- }
- createRequire(filename) {
- return this.vm ? this.vm.externalModulesExecutor.createRequire(filename) : createRequire(filename);
- }
- shouldInterop(path, mod) {
- if (this.options.interopDefault === false) return false;
- // never interop ESM modules
- // TODO: should also skip for `.js` with `type="module"`
- return !path.endsWith(".mjs") && "default" in mod;
- }
-}
-function createImportMetaEnvProxy() {
- // packages/vitest/src/node/plugins/index.ts:146
- const booleanKeys = [
- "DEV",
- "PROD",
- "SSR"
- ];
- return new Proxy(process.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;
- }
- });
-}
-function updateStyle(id, css) {
- if (typeof document === "undefined") return;
- const element = document.querySelector(`[data-vite-dev-id="${id}"]`);
- if (element) {
- element.textContent = css;
- return;
- }
- const head = document.querySelector("head");
- const style = document.createElement("style");
- style.setAttribute("type", "text/css");
- style.setAttribute("data-vite-dev-id", id);
- style.textContent = css;
- head?.appendChild(style);
-}
-function removeStyle(id) {
- if (typeof document === "undefined") return;
- const sheet = document.querySelector(`[data-vite-dev-id="${id}"]`);
- if (sheet) document.head.removeChild(sheet);
-}
-const defaultClientStub = {
- injectQuery: (id) => id,
- createHotContext: () => {
- return {
- accept: () => {},
- prune: () => {},
- dispose: () => {},
- decline: () => {},
- invalidate: () => {},
- on: () => {},
- send: () => {}
- };
- },
- updateStyle: () => {},
- removeStyle: () => {}
-};
-function getDefaultRequestStubs(context) {
- if (!context) {
- const clientStub = {
- ...defaultClientStub,
- updateStyle,
- removeStyle
- };
- return { "/@vite/client": clientStub };
- }
- const clientStub = vm.runInContext(`(defaultClient) => ({ ...defaultClient, updateStyle: ${updateStyle.toString()}, removeStyle: ${removeStyle.toString()} })`, context)(defaultClientStub);
- return { "/@vite/client": clientStub };
-}
-function exportAll(exports$1, sourceModule) {
- // #1120 when a module exports itself it causes
- // call stack error
- if (exports$1 === sourceModule) return;
- if (isPrimitive(sourceModule) || Array.isArray(sourceModule) || sourceModule instanceof Promise) return;
- for (const key in sourceModule) if (key !== "default" && !(key in exports$1)) try {
- defineExport(exports$1, key, () => sourceModule[key]);
- } catch {}
-}
-// keep consistency with Vite on how exports are defined
-function defineExport(exports$1, key, value) {
- Object.defineProperty(exports$1, key, {
- enumerable: true,
- configurable: true,
- get: value
- });
-}
-function isPrimitive(v) {
- return !(typeof v === "object" || typeof v === "function") || v == null;
-}
-function interopModule(mod) {
- if (isPrimitive(mod)) return {
- mod: { default: mod },
- defaultExport: mod
- };
- let defaultExport = "default" in mod ? mod.default : mod;
- if (!isPrimitive(defaultExport) && "__esModule" in defaultExport) {
- mod = defaultExport;
- if ("default" in defaultExport) defaultExport = defaultExport.default;
- }
- return {
- mod,
- defaultExport
- };
-}
-const VALID_ID_PREFIX = `/@id/`;
-const NULL_BYTE_PLACEHOLDER = `__x00__`;
-function wrapId(id) {
- return id.startsWith(VALID_ID_PREFIX) ? id : VALID_ID_PREFIX + id.replace("\0", NULL_BYTE_PLACEHOLDER);
-}
-function unwrapId(id) {
- return id.startsWith(VALID_ID_PREFIX) ? id.slice(VALID_ID_PREFIX.length).replace(NULL_BYTE_PLACEHOLDER, "\0") : id;
-}
-
-export { VitestModuleEvaluator, createImportMetaEnvProxy, getDefaultRequestStubs, isPrimitive, unwrapId, wrapId };