import { notNullish, isPrimitive } from './helpers.js'; export { assertTypes, clone, createDefer, deepClone, getCallLastIndex, getOwnProperties, getType, isObject, noop, objectAttr, parseRegexp, slash, toArray } from './helpers.js'; export { f as format, i as inspect, o as objDisplay, s as stringify } from './chunk-display.js'; import { S as SAFE_TIMERS_SYMBOL } from './chunk-colors.js'; export { a as SAFE_COLORS_SYMBOL, c as createColors, b as getColors, g as getDefaultColors, s as setupColors } from './chunk-colors.js'; import 'pretty-format'; import 'loupe'; function getSafeTimers() { const { setTimeout: safeSetTimeout, setInterval: safeSetInterval, clearInterval: safeClearInterval, clearTimeout: safeClearTimeout, setImmediate: safeSetImmediate, clearImmediate: safeClearImmediate } = globalThis[SAFE_TIMERS_SYMBOL] || globalThis; const { nextTick: safeNextTick } = globalThis[SAFE_TIMERS_SYMBOL] || globalThis.process || { nextTick: (cb) => cb() }; return { nextTick: safeNextTick, setTimeout: safeSetTimeout, setInterval: safeSetInterval, clearInterval: safeClearInterval, clearTimeout: safeClearTimeout, setImmediate: safeSetImmediate, clearImmediate: safeClearImmediate }; } function setSafeTimers() { const { setTimeout: safeSetTimeout, setInterval: safeSetInterval, clearInterval: safeClearInterval, clearTimeout: safeClearTimeout, setImmediate: safeSetImmediate, clearImmediate: safeClearImmediate } = globalThis; const { nextTick: safeNextTick } = globalThis.process || { nextTick: (cb) => cb() }; const timers = { nextTick: safeNextTick, setTimeout: safeSetTimeout, setInterval: safeSetInterval, clearInterval: safeClearInterval, clearTimeout: safeClearTimeout, setImmediate: safeSetImmediate, clearImmediate: safeClearImmediate }; globalThis[SAFE_TIMERS_SYMBOL] = timers; } const RealDate = Date; function random(seed) { const x = Math.sin(seed++) * 1e4; return x - Math.floor(x); } function shuffle(array, seed = RealDate.now()) { let length = array.length; while (length) { const index = Math.floor(random(seed) * length--); const previous = array[length]; array[length] = array[index]; array[index] = previous; ++seed; } return array; } function createSimpleStackTrace(options) { const { message = "error", stackTraceLimit = 1 } = options || {}; const limit = Error.stackTraceLimit; const prepareStackTrace = Error.prepareStackTrace; Error.stackTraceLimit = stackTraceLimit; Error.prepareStackTrace = (e) => e.stack; const err = new Error(message); const stackTrace = err.stack || ""; Error.prepareStackTrace = prepareStackTrace; Error.stackTraceLimit = limit; return stackTrace; } function normalizeWindowsPath(input = "") { if (!input || !input.includes("\\")) { return input; } return input.replace(/\\/g, "/"); } const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/; function cwd() { if (typeof process !== "undefined") { 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(); 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 lineSplitRE = /\r?\n/; const stackIgnorePatterns = [ "node:internal", /\/packages\/\w+\/dist\//, /\/@vitest\/\w+\/dist\//, "/vitest/dist/", "/vitest/src/", "/vite-node/dist/", "/vite-node/src/", "/node_modules/chai/", "/node_modules/tinypool/", "/node_modules/tinyspy/" ]; function extractLocation(urlLike) { if (!urlLike.includes(":")) return [urlLike]; const regExp = /(.+?)(?::(\d+))?(?::(\d+))?$/; const parts = regExp.exec(urlLike.replace(/^\(|\)$/g, "")); if (!parts) return [urlLike]; return [parts[1], parts[2] || void 0, parts[3] || void 0]; } function parseSingleStack(raw) { let line = raw.trim(); if (line.includes("(eval ")) line = line.replace(/eval code/g, "eval").replace(/(\(eval at [^()]*)|(,.*$)/g, ""); let sanitizedLine = line.replace(/^\s+/, "").replace(/\(eval code/g, "(").replace(/^.*?\s+/, ""); const location = sanitizedLine.match(/ (\(.+\)$)/); sanitizedLine = location ? sanitizedLine.replace(location[0], "") : sanitizedLine; const [url, lineNumber, columnNumber] = extractLocation(location ? location[1] : sanitizedLine); let method = location && sanitizedLine || ""; let file = url && ["eval", ""].includes(url) ? void 0 : url; if (!file || !lineNumber || !columnNumber) return null; if (method.startsWith("async ")) method = method.slice(6); if (file.startsWith("file://")) file = file.slice(7); file = resolve(file); return { method, file, line: Number.parseInt(lineNumber), column: Number.parseInt(columnNumber) }; } function parseStacktrace(stack, ignore = stackIgnorePatterns) { const stackFrames = stack.split("\n").map((raw) => { const stack2 = parseSingleStack(raw); if (!stack2 || ignore.length && ignore.some((p) => stack2.file.match(p))) return null; return stack2; }).filter(notNullish); return stackFrames; } function parseErrorStacktrace(e, ignore = stackIgnorePatterns) { if (!e || isPrimitive(e)) return []; if (e.stacks) return e.stacks; const stackStr = e.stack || e.stackStr || ""; const stackFrames = parseStacktrace(stackStr, ignore); e.stacks = stackFrames; return stackFrames; } function positionToOffset(source, lineNumber, columnNumber) { const lines = source.split(lineSplitRE); const nl = /\r\n/.test(source) ? 2 : 1; let start = 0; if (lineNumber > lines.length) return source.length; for (let i = 0; i < lineNumber - 1; i++) start += lines[i].length + nl; return start + columnNumber; } function offsetToLineNumber(source, offset) { if (offset > source.length) { throw new Error( `offset is longer than source length! offset ${offset} > length ${source.length}` ); } const lines = source.split(lineSplitRE); const nl = /\r\n/.test(source) ? 2 : 1; let counted = 0; let line = 0; for (; line < lines.length; line++) { const lineLength = lines[line].length + nl; if (counted + lineLength >= offset) break; counted += lineLength; } return line + 1; } export { SAFE_TIMERS_SYMBOL, createSimpleStackTrace, getSafeTimers, isPrimitive, lineSplitRE, notNullish, offsetToLineNumber, parseErrorStacktrace, parseSingleStack, parseStacktrace, positionToOffset, setSafeTimers, shuffle };