diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
| commit | 76cb9c2a39d477a64824a985ade40507e3bbade1 (patch) | |
| tree | 41e997aa9c6f538d3a136af61dae9424db2005a9 /vanilla/node_modules/vitest/dist/chunks/index.CyBMJtT7.js | |
| parent | 819a39a21ac992b1393244a4c283bbb125208c69 (diff) | |
| download | neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.gz neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.bz2 neko-76cb9c2a39d477a64824a985ade40507e3bbade1.zip | |
feat(vanilla): add testing infrastructure and tests (NK-wjnczv)
Diffstat (limited to 'vanilla/node_modules/vitest/dist/chunks/index.CyBMJtT7.js')
| -rw-r--r-- | vanilla/node_modules/vitest/dist/chunks/index.CyBMJtT7.js | 727 |
1 files changed, 727 insertions, 0 deletions
diff --git a/vanilla/node_modules/vitest/dist/chunks/index.CyBMJtT7.js b/vanilla/node_modules/vitest/dist/chunks/index.CyBMJtT7.js new file mode 100644 index 0000000..6123ed4 --- /dev/null +++ b/vanilla/node_modules/vitest/dist/chunks/index.CyBMJtT7.js @@ -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 }; |
