@vitest/utils
Advanced tools
| declare const KNOWN_ASSET_TYPES: string[]; | ||
| declare const KNOWN_ASSET_RE: RegExp; | ||
| declare const CSS_LANGS_RE: RegExp; | ||
| /** | ||
| * Prefix for resolved Ids that are not valid browser import specifiers | ||
| */ | ||
| declare const VALID_ID_PREFIX = "/@id/"; | ||
| /** | ||
| * Plugins that use 'virtual modules' (e.g. for helper functions), prefix the | ||
| * module ID with `\0`, a convention from the rollup ecosystem. | ||
| * This prevents other plugins from trying to process the id (like node resolution), | ||
| * and core features like sourcemaps can use this info to differentiate between | ||
| * virtual modules and regular files. | ||
| * `\0` is not a permitted char in import URLs so we have to replace them during | ||
| * import analysis. The id will be decoded back before entering the plugins pipeline. | ||
| * These encoded virtual ids are also prefixed by the VALID_ID_PREFIX, so virtual | ||
| * modules in the browser end up encoded as `/@id/__x00__{id}` | ||
| */ | ||
| declare const NULL_BYTE_PLACEHOLDER = "__x00__"; | ||
| export { CSS_LANGS_RE, KNOWN_ASSET_RE, KNOWN_ASSET_TYPES, NULL_BYTE_PLACEHOLDER, VALID_ID_PREFIX }; |
| // TODO: this is all copy pasted from Vite - can they expose a module that exports only constants? | ||
| const KNOWN_ASSET_TYPES = [ | ||
| "apng", | ||
| "bmp", | ||
| "png", | ||
| "jpe?g", | ||
| "jfif", | ||
| "pjpeg", | ||
| "pjp", | ||
| "gif", | ||
| "svg", | ||
| "ico", | ||
| "webp", | ||
| "avif", | ||
| "mp4", | ||
| "webm", | ||
| "ogg", | ||
| "mp3", | ||
| "wav", | ||
| "flac", | ||
| "aac", | ||
| "woff2?", | ||
| "eot", | ||
| "ttf", | ||
| "otf", | ||
| "webmanifest", | ||
| "pdf", | ||
| "txt" | ||
| ]; | ||
| const KNOWN_ASSET_RE = new RegExp(`\\.(${KNOWN_ASSET_TYPES.join("|")})$`); | ||
| const CSS_LANGS_RE = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/; | ||
| /** | ||
| * Prefix for resolved Ids that are not valid browser import specifiers | ||
| */ | ||
| const VALID_ID_PREFIX = `/@id/`; | ||
| /** | ||
| * Plugins that use 'virtual modules' (e.g. for helper functions), prefix the | ||
| * module ID with `\0`, a convention from the rollup ecosystem. | ||
| * This prevents other plugins from trying to process the id (like node resolution), | ||
| * and core features like sourcemaps can use this info to differentiate between | ||
| * virtual modules and regular files. | ||
| * `\0` is not a permitted char in import URLs so we have to replace them during | ||
| * import analysis. The id will be decoded back before entering the plugins pipeline. | ||
| * These encoded virtual ids are also prefixed by the VALID_ID_PREFIX, so virtual | ||
| * modules in the browser end up encoded as `/@id/__x00__{id}` | ||
| */ | ||
| const NULL_BYTE_PLACEHOLDER = `__x00__`; | ||
| export { CSS_LANGS_RE, KNOWN_ASSET_RE, KNOWN_ASSET_TYPES, NULL_BYTE_PLACEHOLDER, VALID_ID_PREFIX }; |
| import { PrettyFormatOptions } from '@vitest/pretty-format'; | ||
| type Inspect = (value: unknown, options: Options) => string; | ||
| interface Options { | ||
| showHidden: boolean; | ||
| depth: number; | ||
| colors: boolean; | ||
| customInspect: boolean; | ||
| showProxy: boolean; | ||
| maxArrayLength: number; | ||
| breakLength: number; | ||
| truncate: number; | ||
| seen: unknown[]; | ||
| inspect: Inspect; | ||
| stylize: (value: string, styleType: string) => string; | ||
| } | ||
| type LoupeOptions = Partial<Options>; | ||
| interface StringifyOptions extends PrettyFormatOptions { | ||
| maxLength?: number; | ||
| } | ||
| declare function stringify(object: unknown, maxDepth?: number, { maxLength,...options }?: StringifyOptions): string; | ||
| declare const formatRegExp: RegExp; | ||
| declare function format(...args: unknown[]): string; | ||
| declare function inspect(obj: unknown, options?: LoupeOptions): string; | ||
| declare function objDisplay(obj: unknown, options?: LoupeOptions): string; | ||
| export { format, formatRegExp, inspect, objDisplay, stringify }; | ||
| export type { LoupeOptions, StringifyOptions }; |
+727
| import { plugins, format as format$1 } from '@vitest/pretty-format'; | ||
| const ansiColors = { | ||
| bold: ['1', '22'], | ||
| dim: ['2', '22'], | ||
| italic: ['3', '23'], | ||
| underline: ['4', '24'], | ||
| // 5 & 6 are blinking | ||
| inverse: ['7', '27'], | ||
| hidden: ['8', '28'], | ||
| strike: ['9', '29'], | ||
| // 10-20 are fonts | ||
| // 21-29 are resets for 1-9 | ||
| black: ['30', '39'], | ||
| red: ['31', '39'], | ||
| green: ['32', '39'], | ||
| yellow: ['33', '39'], | ||
| blue: ['34', '39'], | ||
| magenta: ['35', '39'], | ||
| cyan: ['36', '39'], | ||
| white: ['37', '39'], | ||
| brightblack: ['30;1', '39'], | ||
| brightred: ['31;1', '39'], | ||
| brightgreen: ['32;1', '39'], | ||
| brightyellow: ['33;1', '39'], | ||
| brightblue: ['34;1', '39'], | ||
| brightmagenta: ['35;1', '39'], | ||
| brightcyan: ['36;1', '39'], | ||
| brightwhite: ['37;1', '39'], | ||
| grey: ['90', '39'], | ||
| }; | ||
| const styles = { | ||
| special: 'cyan', | ||
| number: 'yellow', | ||
| bigint: 'yellow', | ||
| boolean: 'yellow', | ||
| undefined: 'grey', | ||
| null: 'bold', | ||
| string: 'green', | ||
| symbol: 'green', | ||
| date: 'magenta', | ||
| regexp: 'red', | ||
| }; | ||
| const truncator = '…'; | ||
| function colorise(value, styleType) { | ||
| const color = ansiColors[styles[styleType]] || ansiColors[styleType] || ''; | ||
| if (!color) { | ||
| return String(value); | ||
| } | ||
| return `\u001b[${color[0]}m${String(value)}\u001b[${color[1]}m`; | ||
| } | ||
| function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [], | ||
| // eslint-disable-next-line no-shadow | ||
| truncate = Infinity, stylize = String, } = {}, inspect) { | ||
| const options = { | ||
| showHidden: Boolean(showHidden), | ||
| depth: Number(depth), | ||
| colors: Boolean(colors), | ||
| customInspect: Boolean(customInspect), | ||
| showProxy: Boolean(showProxy), | ||
| maxArrayLength: Number(maxArrayLength), | ||
| breakLength: Number(breakLength), | ||
| truncate: Number(truncate), | ||
| seen, | ||
| inspect, | ||
| stylize, | ||
| }; | ||
| if (options.colors) { | ||
| options.stylize = colorise; | ||
| } | ||
| return options; | ||
| } | ||
| function isHighSurrogate(char) { | ||
| return char >= '\ud800' && char <= '\udbff'; | ||
| } | ||
| function truncate(string, length, tail = truncator) { | ||
| string = String(string); | ||
| const tailLength = tail.length; | ||
| const stringLength = string.length; | ||
| if (tailLength > length && stringLength > tailLength) { | ||
| return tail; | ||
| } | ||
| if (stringLength > length && stringLength > tailLength) { | ||
| let end = length - tailLength; | ||
| if (end > 0 && isHighSurrogate(string[end - 1])) { | ||
| end = end - 1; | ||
| } | ||
| return `${string.slice(0, end)}${tail}`; | ||
| } | ||
| return string; | ||
| } | ||
| // eslint-disable-next-line complexity | ||
| function inspectList(list, options, inspectItem, separator = ', ') { | ||
| inspectItem = inspectItem || options.inspect; | ||
| const size = list.length; | ||
| if (size === 0) | ||
| return ''; | ||
| const originalLength = options.truncate; | ||
| let output = ''; | ||
| let peek = ''; | ||
| let truncated = ''; | ||
| for (let i = 0; i < size; i += 1) { | ||
| const last = i + 1 === list.length; | ||
| const secondToLast = i + 2 === list.length; | ||
| truncated = `${truncator}(${list.length - i})`; | ||
| const value = list[i]; | ||
| // If there is more than one remaining we need to account for a separator of `, ` | ||
| options.truncate = originalLength - output.length - (last ? 0 : separator.length); | ||
| const string = peek || inspectItem(value, options) + (last ? '' : separator); | ||
| const nextLength = output.length + string.length; | ||
| const truncatedLength = nextLength + truncated.length; | ||
| // If this is the last element, and adding it would | ||
| // take us over length, but adding the truncator wouldn't - then break now | ||
| if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) { | ||
| break; | ||
| } | ||
| // If this isn't the last or second to last element to scan, | ||
| // but the string is already over length then break here | ||
| if (!last && !secondToLast && truncatedLength > originalLength) { | ||
| break; | ||
| } | ||
| // Peek at the next string to determine if we should | ||
| // break early before adding this item to the output | ||
| peek = last ? '' : inspectItem(list[i + 1], options) + (secondToLast ? '' : separator); | ||
| // If we have one element left, but this element and | ||
| // the next takes over length, the break early | ||
| if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) { | ||
| break; | ||
| } | ||
| output += string; | ||
| // If the next element takes us to length - | ||
| // but there are more after that, then we should truncate now | ||
| if (!last && !secondToLast && nextLength + peek.length >= originalLength) { | ||
| truncated = `${truncator}(${list.length - i - 1})`; | ||
| break; | ||
| } | ||
| truncated = ''; | ||
| } | ||
| return `${output}${truncated}`; | ||
| } | ||
| function quoteComplexKey(key) { | ||
| if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) { | ||
| return key; | ||
| } | ||
| return JSON.stringify(key) | ||
| .replace(/'/g, "\\'") | ||
| .replace(/\\"/g, '"') | ||
| .replace(/(^"|"$)/g, "'"); | ||
| } | ||
| function inspectProperty([key, value], options) { | ||
| options.truncate -= 2; | ||
| if (typeof key === 'string') { | ||
| key = quoteComplexKey(key); | ||
| } | ||
| else if (typeof key !== 'number') { | ||
| key = `[${options.inspect(key, options)}]`; | ||
| } | ||
| options.truncate -= key.length; | ||
| value = options.inspect(value, options); | ||
| return `${key}: ${value}`; | ||
| } | ||
| function inspectArray(array, options) { | ||
| // Object.keys will always output the Array indices first, so we can slice by | ||
| // `array.length` to get non-index properties | ||
| const nonIndexProperties = Object.keys(array).slice(array.length); | ||
| if (!array.length && !nonIndexProperties.length) | ||
| return '[]'; | ||
| options.truncate -= 4; | ||
| const listContents = inspectList(array, options); | ||
| options.truncate -= listContents.length; | ||
| let propertyContents = ''; | ||
| if (nonIndexProperties.length) { | ||
| propertyContents = inspectList(nonIndexProperties.map(key => [key, array[key]]), options, inspectProperty); | ||
| } | ||
| return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ''} ]`; | ||
| } | ||
| const getArrayName = (array) => { | ||
| // We need to special case Node.js' Buffers, which report to be Uint8Array | ||
| // @ts-ignore | ||
| if (typeof Buffer === 'function' && array instanceof Buffer) { | ||
| return 'Buffer'; | ||
| } | ||
| if (array[Symbol.toStringTag]) { | ||
| return array[Symbol.toStringTag]; | ||
| } | ||
| return array.constructor.name; | ||
| }; | ||
| function inspectTypedArray(array, options) { | ||
| const name = getArrayName(array); | ||
| options.truncate -= name.length + 4; | ||
| // Object.keys will always output the Array indices first, so we can slice by | ||
| // `array.length` to get non-index properties | ||
| const nonIndexProperties = Object.keys(array).slice(array.length); | ||
| if (!array.length && !nonIndexProperties.length) | ||
| return `${name}[]`; | ||
| // As we know TypedArrays only contain Unsigned Integers, we can skip inspecting each one and simply | ||
| // stylise the toString() value of them | ||
| let output = ''; | ||
| for (let i = 0; i < array.length; i++) { | ||
| const string = `${options.stylize(truncate(array[i], options.truncate), 'number')}${i === array.length - 1 ? '' : ', '}`; | ||
| options.truncate -= string.length; | ||
| if (array[i] !== array.length && options.truncate <= 3) { | ||
| output += `${truncator}(${array.length - array[i] + 1})`; | ||
| break; | ||
| } | ||
| output += string; | ||
| } | ||
| let propertyContents = ''; | ||
| if (nonIndexProperties.length) { | ||
| propertyContents = inspectList(nonIndexProperties.map(key => [key, array[key]]), options, inspectProperty); | ||
| } | ||
| return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ''} ]`; | ||
| } | ||
| function inspectDate(dateObject, options) { | ||
| const stringRepresentation = dateObject.toJSON(); | ||
| if (stringRepresentation === null) { | ||
| return 'Invalid Date'; | ||
| } | ||
| const split = stringRepresentation.split('T'); | ||
| const date = split[0]; | ||
| // If we need to - truncate the time portion, but never the date | ||
| return options.stylize(`${date}T${truncate(split[1], options.truncate - date.length - 1)}`, 'date'); | ||
| } | ||
| function inspectFunction(func, options) { | ||
| const functionType = func[Symbol.toStringTag] || 'Function'; | ||
| const name = func.name; | ||
| if (!name) { | ||
| return options.stylize(`[${functionType}]`, 'special'); | ||
| } | ||
| return options.stylize(`[${functionType} ${truncate(name, options.truncate - 11)}]`, 'special'); | ||
| } | ||
| function inspectMapEntry([key, value], options) { | ||
| options.truncate -= 4; | ||
| key = options.inspect(key, options); | ||
| options.truncate -= key.length; | ||
| value = options.inspect(value, options); | ||
| return `${key} => ${value}`; | ||
| } | ||
| // IE11 doesn't support `map.entries()` | ||
| function mapToEntries(map) { | ||
| const entries = []; | ||
| map.forEach((value, key) => { | ||
| entries.push([key, value]); | ||
| }); | ||
| return entries; | ||
| } | ||
| function inspectMap(map, options) { | ||
| if (map.size === 0) | ||
| return 'Map{}'; | ||
| options.truncate -= 7; | ||
| return `Map{ ${inspectList(mapToEntries(map), options, inspectMapEntry)} }`; | ||
| } | ||
| const isNaN = Number.isNaN || (i => i !== i); // eslint-disable-line no-self-compare | ||
| function inspectNumber(number, options) { | ||
| if (isNaN(number)) { | ||
| return options.stylize('NaN', 'number'); | ||
| } | ||
| if (number === Infinity) { | ||
| return options.stylize('Infinity', 'number'); | ||
| } | ||
| if (number === -Infinity) { | ||
| return options.stylize('-Infinity', 'number'); | ||
| } | ||
| if (number === 0) { | ||
| return options.stylize(1 / number === Infinity ? '+0' : '-0', 'number'); | ||
| } | ||
| return options.stylize(truncate(String(number), options.truncate), 'number'); | ||
| } | ||
| function inspectBigInt(number, options) { | ||
| let nums = truncate(number.toString(), options.truncate - 1); | ||
| if (nums !== truncator) | ||
| nums += 'n'; | ||
| return options.stylize(nums, 'bigint'); | ||
| } | ||
| function inspectRegExp(value, options) { | ||
| const flags = value.toString().split('/')[2]; | ||
| const sourceLength = options.truncate - (2 + flags.length); | ||
| const source = value.source; | ||
| return options.stylize(`/${truncate(source, sourceLength)}/${flags}`, 'regexp'); | ||
| } | ||
| // IE11 doesn't support `Array.from(set)` | ||
| function arrayFromSet(set) { | ||
| const values = []; | ||
| set.forEach(value => { | ||
| values.push(value); | ||
| }); | ||
| return values; | ||
| } | ||
| function inspectSet(set, options) { | ||
| if (set.size === 0) | ||
| return 'Set{}'; | ||
| options.truncate -= 7; | ||
| return `Set{ ${inspectList(arrayFromSet(set), options)} }`; | ||
| } | ||
| const stringEscapeChars = new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5" + | ||
| '\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]', 'g'); | ||
| const escapeCharacters = { | ||
| '\b': '\\b', | ||
| '\t': '\\t', | ||
| '\n': '\\n', | ||
| '\f': '\\f', | ||
| '\r': '\\r', | ||
| "'": "\\'", | ||
| '\\': '\\\\', | ||
| }; | ||
| const hex = 16; | ||
| function escape(char) { | ||
| return (escapeCharacters[char] || | ||
| `\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-4)}`); | ||
| } | ||
| function inspectString(string, options) { | ||
| if (stringEscapeChars.test(string)) { | ||
| string = string.replace(stringEscapeChars, escape); | ||
| } | ||
| return options.stylize(`'${truncate(string, options.truncate - 2)}'`, 'string'); | ||
| } | ||
| function inspectSymbol(value) { | ||
| if ('description' in Symbol.prototype) { | ||
| return value.description ? `Symbol(${value.description})` : 'Symbol()'; | ||
| } | ||
| return value.toString(); | ||
| } | ||
| const getPromiseValue = () => 'Promise{…}'; | ||
| function inspectObject$1(object, options) { | ||
| const properties = Object.getOwnPropertyNames(object); | ||
| const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : []; | ||
| if (properties.length === 0 && symbols.length === 0) { | ||
| return '{}'; | ||
| } | ||
| options.truncate -= 4; | ||
| options.seen = options.seen || []; | ||
| if (options.seen.includes(object)) { | ||
| return '[Circular]'; | ||
| } | ||
| options.seen.push(object); | ||
| const propertyContents = inspectList(properties.map(key => [key, object[key]]), options, inspectProperty); | ||
| const symbolContents = inspectList(symbols.map(key => [key, object[key]]), options, inspectProperty); | ||
| options.seen.pop(); | ||
| let sep = ''; | ||
| if (propertyContents && symbolContents) { | ||
| sep = ', '; | ||
| } | ||
| return `{ ${propertyContents}${sep}${symbolContents} }`; | ||
| } | ||
| const toStringTag = typeof Symbol !== 'undefined' && Symbol.toStringTag ? Symbol.toStringTag : false; | ||
| function inspectClass(value, options) { | ||
| let name = ''; | ||
| if (toStringTag && toStringTag in value) { | ||
| name = value[toStringTag]; | ||
| } | ||
| name = name || value.constructor.name; | ||
| // Babel transforms anonymous classes to the name `_class` | ||
| if (!name || name === '_class') { | ||
| name = '<Anonymous Class>'; | ||
| } | ||
| options.truncate -= name.length; | ||
| return `${name}${inspectObject$1(value, options)}`; | ||
| } | ||
| function inspectArguments(args, options) { | ||
| if (args.length === 0) | ||
| return 'Arguments[]'; | ||
| options.truncate -= 13; | ||
| return `Arguments[ ${inspectList(args, options)} ]`; | ||
| } | ||
| const errorKeys = [ | ||
| 'stack', | ||
| 'line', | ||
| 'column', | ||
| 'name', | ||
| 'message', | ||
| 'fileName', | ||
| 'lineNumber', | ||
| 'columnNumber', | ||
| 'number', | ||
| 'description', | ||
| 'cause', | ||
| ]; | ||
| function inspectObject(error, options) { | ||
| const properties = Object.getOwnPropertyNames(error).filter(key => errorKeys.indexOf(key) === -1); | ||
| const name = error.name; | ||
| options.truncate -= name.length; | ||
| let message = ''; | ||
| if (typeof error.message === 'string') { | ||
| message = truncate(error.message, options.truncate); | ||
| } | ||
| else { | ||
| properties.unshift('message'); | ||
| } | ||
| message = message ? `: ${message}` : ''; | ||
| options.truncate -= message.length + 5; | ||
| options.seen = options.seen || []; | ||
| if (options.seen.includes(error)) { | ||
| return '[Circular]'; | ||
| } | ||
| options.seen.push(error); | ||
| const propertyContents = inspectList(properties.map(key => [key, error[key]]), options, inspectProperty); | ||
| return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ''}`; | ||
| } | ||
| function inspectAttribute([key, value], options) { | ||
| options.truncate -= 3; | ||
| if (!value) { | ||
| return `${options.stylize(String(key), 'yellow')}`; | ||
| } | ||
| return `${options.stylize(String(key), 'yellow')}=${options.stylize(`"${value}"`, 'string')}`; | ||
| } | ||
| function inspectNodeCollection(collection, options) { | ||
| return inspectList(collection, options, inspectNode, '\n'); | ||
| } | ||
| function inspectNode(node, options) { | ||
| switch (node.nodeType) { | ||
| case 1: | ||
| return inspectHTML(node, options); | ||
| case 3: | ||
| return options.inspect(node.data, options); | ||
| default: | ||
| return options.inspect(node, options); | ||
| } | ||
| } | ||
| // @ts-ignore (Deno doesn't have Element) | ||
| function inspectHTML(element, options) { | ||
| const properties = element.getAttributeNames(); | ||
| const name = element.tagName.toLowerCase(); | ||
| const head = options.stylize(`<${name}`, 'special'); | ||
| const headClose = options.stylize(`>`, 'special'); | ||
| const tail = options.stylize(`</${name}>`, 'special'); | ||
| options.truncate -= name.length * 2 + 5; | ||
| let propertyContents = ''; | ||
| if (properties.length > 0) { | ||
| propertyContents += ' '; | ||
| propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options, inspectAttribute, ' '); | ||
| } | ||
| options.truncate -= propertyContents.length; | ||
| const truncate = options.truncate; | ||
| let children = inspectNodeCollection(element.children, options); | ||
| if (children && children.length > truncate) { | ||
| children = `${truncator}(${element.children.length})`; | ||
| } | ||
| return `${head}${propertyContents}${headClose}${children}${tail}`; | ||
| } | ||
| /* ! | ||
| * loupe | ||
| * Copyright(c) 2013 Jake Luer <jake@alogicalparadox.com> | ||
| * MIT Licensed | ||
| */ | ||
| const symbolsSupported = typeof Symbol === 'function' && typeof Symbol.for === 'function'; | ||
| const chaiInspect = symbolsSupported ? Symbol.for('chai/inspect') : '@@chai/inspect'; | ||
| const nodeInspect = Symbol.for('nodejs.util.inspect.custom'); | ||
| const constructorMap = new WeakMap(); | ||
| const stringTagMap = {}; | ||
| const baseTypesMap = { | ||
| undefined: (value, options) => options.stylize('undefined', 'undefined'), | ||
| null: (value, options) => options.stylize('null', 'null'), | ||
| boolean: (value, options) => options.stylize(String(value), 'boolean'), | ||
| Boolean: (value, options) => options.stylize(String(value), 'boolean'), | ||
| number: inspectNumber, | ||
| Number: inspectNumber, | ||
| bigint: inspectBigInt, | ||
| BigInt: inspectBigInt, | ||
| string: inspectString, | ||
| String: inspectString, | ||
| function: inspectFunction, | ||
| Function: inspectFunction, | ||
| symbol: inspectSymbol, | ||
| // A Symbol polyfill will return `Symbol` not `symbol` from typedetect | ||
| Symbol: inspectSymbol, | ||
| Array: inspectArray, | ||
| Date: inspectDate, | ||
| Map: inspectMap, | ||
| Set: inspectSet, | ||
| RegExp: inspectRegExp, | ||
| Promise: getPromiseValue, | ||
| // WeakSet, WeakMap are totally opaque to us | ||
| WeakSet: (value, options) => options.stylize('WeakSet{…}', 'special'), | ||
| WeakMap: (value, options) => options.stylize('WeakMap{…}', 'special'), | ||
| Arguments: inspectArguments, | ||
| Int8Array: inspectTypedArray, | ||
| Uint8Array: inspectTypedArray, | ||
| Uint8ClampedArray: inspectTypedArray, | ||
| Int16Array: inspectTypedArray, | ||
| Uint16Array: inspectTypedArray, | ||
| Int32Array: inspectTypedArray, | ||
| Uint32Array: inspectTypedArray, | ||
| Float32Array: inspectTypedArray, | ||
| Float64Array: inspectTypedArray, | ||
| Generator: () => '', | ||
| DataView: () => '', | ||
| ArrayBuffer: () => '', | ||
| Error: inspectObject, | ||
| HTMLCollection: inspectNodeCollection, | ||
| NodeList: inspectNodeCollection, | ||
| }; | ||
| // eslint-disable-next-line complexity | ||
| const inspectCustom = (value, options, type, inspectFn) => { | ||
| if (chaiInspect in value && typeof value[chaiInspect] === 'function') { | ||
| return value[chaiInspect](options); | ||
| } | ||
| if (nodeInspect in value && typeof value[nodeInspect] === 'function') { | ||
| return value[nodeInspect](options.depth, options, inspectFn); | ||
| } | ||
| if ('inspect' in value && typeof value.inspect === 'function') { | ||
| return value.inspect(options.depth, options); | ||
| } | ||
| if ('constructor' in value && constructorMap.has(value.constructor)) { | ||
| return constructorMap.get(value.constructor)(value, options); | ||
| } | ||
| if (stringTagMap[type]) { | ||
| return stringTagMap[type](value, options); | ||
| } | ||
| return ''; | ||
| }; | ||
| const toString = Object.prototype.toString; | ||
| // eslint-disable-next-line complexity | ||
| function inspect$1(value, opts = {}) { | ||
| const options = normaliseOptions(opts, inspect$1); | ||
| const { customInspect } = options; | ||
| let type = value === null ? 'null' : typeof value; | ||
| if (type === 'object') { | ||
| type = toString.call(value).slice(8, -1); | ||
| } | ||
| // If it is a base value that we already support, then use Loupe's inspector | ||
| if (type in baseTypesMap) { | ||
| return baseTypesMap[type](value, options); | ||
| } | ||
| // If `options.customInspect` is set to true then try to use the custom inspector | ||
| if (customInspect && value) { | ||
| const output = inspectCustom(value, options, type, inspect$1); | ||
| if (output) { | ||
| if (typeof output === 'string') | ||
| return output; | ||
| return inspect$1(output, options); | ||
| } | ||
| } | ||
| const proto = value ? Object.getPrototypeOf(value) : false; | ||
| // If it's a plain Object then use Loupe's inspector | ||
| if (proto === Object.prototype || proto === null) { | ||
| return inspectObject$1(value, options); | ||
| } | ||
| // Specifically account for HTMLElements | ||
| // @ts-ignore | ||
| if (value && typeof HTMLElement === 'function' && value instanceof HTMLElement) { | ||
| return inspectHTML(value, options); | ||
| } | ||
| if ('constructor' in value) { | ||
| // If it is a class, inspect it like an object but add the constructor name | ||
| if (value.constructor !== Object) { | ||
| return inspectClass(value, options); | ||
| } | ||
| // If it is an object with an anonymous prototype, display it as an object. | ||
| return inspectObject$1(value, options); | ||
| } | ||
| // last chance to check if it's an object | ||
| if (value === Object(value)) { | ||
| return inspectObject$1(value, options); | ||
| } | ||
| // We have run out of options! Just stringify the value | ||
| return options.stylize(String(value), type); | ||
| } | ||
| const { AsymmetricMatcher, DOMCollection, DOMElement, Immutable, ReactElement, ReactTestComponent } = plugins; | ||
| const PLUGINS = [ | ||
| ReactTestComponent, | ||
| ReactElement, | ||
| DOMElement, | ||
| DOMCollection, | ||
| Immutable, | ||
| AsymmetricMatcher | ||
| ]; | ||
| function stringify(object, maxDepth = 10, { maxLength,...options } = {}) { | ||
| const MAX_LENGTH = maxLength ?? 1e4; | ||
| let result; | ||
| try { | ||
| result = format$1(object, { | ||
| maxDepth, | ||
| escapeString: false, | ||
| plugins: PLUGINS, | ||
| ...options | ||
| }); | ||
| } catch { | ||
| result = format$1(object, { | ||
| callToJSON: false, | ||
| maxDepth, | ||
| escapeString: false, | ||
| plugins: PLUGINS, | ||
| ...options | ||
| }); | ||
| } | ||
| // Prevents infinite loop https://github.com/vitest-dev/vitest/issues/7249 | ||
| return result.length >= MAX_LENGTH && maxDepth > 1 ? stringify(object, Math.floor(Math.min(maxDepth, Number.MAX_SAFE_INTEGER) / 2), { | ||
| maxLength, | ||
| ...options | ||
| }) : result; | ||
| } | ||
| const formatRegExp = /%[sdjifoOc%]/g; | ||
| function format(...args) { | ||
| if (typeof args[0] !== "string") { | ||
| const objects = []; | ||
| for (let i = 0; i < args.length; i++) { | ||
| objects.push(inspect(args[i], { | ||
| depth: 0, | ||
| colors: false | ||
| })); | ||
| } | ||
| return objects.join(" "); | ||
| } | ||
| const len = args.length; | ||
| let i = 1; | ||
| const template = args[0]; | ||
| let str = String(template).replace(formatRegExp, (x) => { | ||
| if (x === "%%") { | ||
| return "%"; | ||
| } | ||
| if (i >= len) { | ||
| return x; | ||
| } | ||
| switch (x) { | ||
| case "%s": { | ||
| const value = args[i++]; | ||
| if (typeof value === "bigint") { | ||
| return `${value.toString()}n`; | ||
| } | ||
| if (typeof value === "number" && value === 0 && 1 / value < 0) { | ||
| return "-0"; | ||
| } | ||
| if (typeof value === "object" && value !== null) { | ||
| if (typeof value.toString === "function" && value.toString !== Object.prototype.toString) { | ||
| return value.toString(); | ||
| } | ||
| return inspect(value, { | ||
| depth: 0, | ||
| colors: false | ||
| }); | ||
| } | ||
| return String(value); | ||
| } | ||
| case "%d": { | ||
| const value = args[i++]; | ||
| if (typeof value === "bigint") { | ||
| return `${value.toString()}n`; | ||
| } | ||
| return Number(value).toString(); | ||
| } | ||
| case "%i": { | ||
| const value = args[i++]; | ||
| if (typeof value === "bigint") { | ||
| return `${value.toString()}n`; | ||
| } | ||
| return Number.parseInt(String(value)).toString(); | ||
| } | ||
| case "%f": return Number.parseFloat(String(args[i++])).toString(); | ||
| case "%o": return inspect(args[i++], { | ||
| showHidden: true, | ||
| showProxy: true | ||
| }); | ||
| case "%O": return inspect(args[i++]); | ||
| case "%c": { | ||
| i++; | ||
| return ""; | ||
| } | ||
| case "%j": try { | ||
| return JSON.stringify(args[i++]); | ||
| } catch (err) { | ||
| const m = err.message; | ||
| if (m.includes("circular structure") || m.includes("cyclic structures") || m.includes("cyclic object")) { | ||
| return "[Circular]"; | ||
| } | ||
| throw err; | ||
| } | ||
| default: return x; | ||
| } | ||
| }); | ||
| for (let x = args[i]; i < len; x = args[++i]) { | ||
| if (x === null || typeof x !== "object") { | ||
| str += ` ${x}`; | ||
| } else { | ||
| str += ` ${inspect(x)}`; | ||
| } | ||
| } | ||
| return str; | ||
| } | ||
| function inspect(obj, options = {}) { | ||
| if (options.truncate === 0) { | ||
| options.truncate = Number.POSITIVE_INFINITY; | ||
| } | ||
| return inspect$1(obj, options); | ||
| } | ||
| function objDisplay(obj, options = {}) { | ||
| if (typeof options.truncate === "undefined") { | ||
| options.truncate = 40; | ||
| } | ||
| const str = inspect(obj, options); | ||
| const type = Object.prototype.toString.call(obj); | ||
| if (options.truncate && str.length >= options.truncate) { | ||
| if (type === "[object Function]") { | ||
| const fn = obj; | ||
| return !fn.name ? "[Function]" : `[Function: ${fn.name}]`; | ||
| } else if (type === "[object Array]") { | ||
| return `[ Array(${obj.length}) ]`; | ||
| } else if (type === "[object Object]") { | ||
| const keys = Object.keys(obj); | ||
| const kstr = keys.length > 2 ? `${keys.splice(0, 2).join(", ")}, ...` : keys.join(", "); | ||
| return `{ Object (${kstr}) }`; | ||
| } else { | ||
| return str; | ||
| } | ||
| } | ||
| return str; | ||
| } | ||
| export { format, formatRegExp, inspect, objDisplay, stringify }; |
| import { Colors } from 'tinyrainbow'; | ||
| interface HighlightOptions { | ||
| jsx?: boolean; | ||
| colors?: Colors; | ||
| } | ||
| declare function highlight(code: string, options?: HighlightOptions): string; | ||
| export { highlight }; |
| import { g as getDefaultExportFromCjs } from './chunk-_commonjsHelpers.js'; | ||
| import c from 'tinyrainbow'; | ||
| var jsTokens_1; | ||
| var hasRequiredJsTokens; | ||
| function requireJsTokens () { | ||
| if (hasRequiredJsTokens) return jsTokens_1; | ||
| hasRequiredJsTokens = 1; | ||
| // Copyright 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Simon Lydell | ||
| // License: MIT. | ||
| var Identifier, JSXIdentifier, JSXPunctuator, JSXString, JSXText, KeywordsWithExpressionAfter, KeywordsWithNoLineTerminatorAfter, LineTerminatorSequence, MultiLineComment, Newline, NumericLiteral, Punctuator, RegularExpressionLiteral, SingleLineComment, StringLiteral, Template, TokensNotPrecedingObjectLiteral, TokensPrecedingExpression, WhiteSpace; | ||
| RegularExpressionLiteral = /\/(?![*\/])(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\\]).|\\.)*(\/[$_\u200C\u200D\p{ID_Continue}]*|\\)?/yu; | ||
| Punctuator = /--|\+\+|=>|\.{3}|\??\.(?!\d)|(?:&&|\|\||\?\?|[+\-%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2}|\/(?![\/*]))=?|[?~,:;[\](){}]/y; | ||
| Identifier = /(\x23?)(?=[$_\p{ID_Start}\\])(?:[$_\u200C\u200D\p{ID_Continue}]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+/yu; | ||
| StringLiteral = /(['"])(?:(?!\1)[^\\\n\r]|\\(?:\r\n|[^]))*(\1)?/y; | ||
| NumericLiteral = /(?:0[xX][\da-fA-F](?:_?[\da-fA-F])*|0[oO][0-7](?:_?[0-7])*|0[bB][01](?:_?[01])*)n?|0n|[1-9](?:_?\d)*n|(?:(?:0(?!\d)|0\d*[89]\d*|[1-9](?:_?\d)*)(?:\.(?:\d(?:_?\d)*)?)?|\.\d(?:_?\d)*)(?:[eE][+-]?\d(?:_?\d)*)?|0[0-7]+/y; | ||
| Template = /[`}](?:[^`\\$]|\\[^]|\$(?!\{))*(`|\$\{)?/y; | ||
| WhiteSpace = /[\t\v\f\ufeff\p{Zs}]+/yu; | ||
| LineTerminatorSequence = /\r?\n|[\r\u2028\u2029]/y; | ||
| MultiLineComment = /\/\*(?:[^*]|\*(?!\/))*(\*\/)?/y; | ||
| SingleLineComment = /\/\/.*/y; | ||
| JSXPunctuator = /[<>.:={}]|\/(?![\/*])/y; | ||
| JSXIdentifier = /[$_\p{ID_Start}][$_\u200C\u200D\p{ID_Continue}-]*/yu; | ||
| JSXString = /(['"])(?:(?!\1)[^])*(\1)?/y; | ||
| JSXText = /[^<>{}]+/y; | ||
| TokensPrecedingExpression = /^(?:[\/+-]|\.{3}|\?(?:InterpolationIn(?:JSX|Template)|NoLineTerminatorHere|NonExpressionParenEnd|UnaryIncDec))?$|[{}([,;<>=*%&|^!~?:]$/; | ||
| TokensNotPrecedingObjectLiteral = /^(?:=>|[;\]){}]|else|\?(?:NoLineTerminatorHere|NonExpressionParenEnd))?$/; | ||
| KeywordsWithExpressionAfter = /^(?:await|case|default|delete|do|else|instanceof|new|return|throw|typeof|void|yield)$/; | ||
| KeywordsWithNoLineTerminatorAfter = /^(?:return|throw|yield)$/; | ||
| Newline = RegExp(LineTerminatorSequence.source); | ||
| jsTokens_1 = function*(input, {jsx = false} = {}) { | ||
| var braces, firstCodePoint, isExpression, lastIndex, lastSignificantToken, length, match, mode, nextLastIndex, nextLastSignificantToken, parenNesting, postfixIncDec, punctuator, stack; | ||
| ({length} = input); | ||
| lastIndex = 0; | ||
| lastSignificantToken = ""; | ||
| stack = [ | ||
| {tag: "JS"} | ||
| ]; | ||
| braces = []; | ||
| parenNesting = 0; | ||
| postfixIncDec = false; | ||
| while (lastIndex < length) { | ||
| mode = stack[stack.length - 1]; | ||
| switch (mode.tag) { | ||
| case "JS": | ||
| case "JSNonExpressionParen": | ||
| case "InterpolationInTemplate": | ||
| case "InterpolationInJSX": | ||
| if (input[lastIndex] === "/" && (TokensPrecedingExpression.test(lastSignificantToken) || KeywordsWithExpressionAfter.test(lastSignificantToken))) { | ||
| RegularExpressionLiteral.lastIndex = lastIndex; | ||
| if (match = RegularExpressionLiteral.exec(input)) { | ||
| lastIndex = RegularExpressionLiteral.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "RegularExpressionLiteral", | ||
| value: match[0], | ||
| closed: match[1] !== void 0 && match[1] !== "\\" | ||
| }); | ||
| continue; | ||
| } | ||
| } | ||
| Punctuator.lastIndex = lastIndex; | ||
| if (match = Punctuator.exec(input)) { | ||
| punctuator = match[0]; | ||
| nextLastIndex = Punctuator.lastIndex; | ||
| nextLastSignificantToken = punctuator; | ||
| switch (punctuator) { | ||
| case "(": | ||
| if (lastSignificantToken === "?NonExpressionParenKeyword") { | ||
| stack.push({ | ||
| tag: "JSNonExpressionParen", | ||
| nesting: parenNesting | ||
| }); | ||
| } | ||
| parenNesting++; | ||
| postfixIncDec = false; | ||
| break; | ||
| case ")": | ||
| parenNesting--; | ||
| postfixIncDec = true; | ||
| if (mode.tag === "JSNonExpressionParen" && parenNesting === mode.nesting) { | ||
| stack.pop(); | ||
| nextLastSignificantToken = "?NonExpressionParenEnd"; | ||
| postfixIncDec = false; | ||
| } | ||
| break; | ||
| case "{": | ||
| Punctuator.lastIndex = 0; | ||
| isExpression = !TokensNotPrecedingObjectLiteral.test(lastSignificantToken) && (TokensPrecedingExpression.test(lastSignificantToken) || KeywordsWithExpressionAfter.test(lastSignificantToken)); | ||
| braces.push(isExpression); | ||
| postfixIncDec = false; | ||
| break; | ||
| case "}": | ||
| switch (mode.tag) { | ||
| case "InterpolationInTemplate": | ||
| if (braces.length === mode.nesting) { | ||
| Template.lastIndex = lastIndex; | ||
| match = Template.exec(input); | ||
| lastIndex = Template.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| if (match[1] === "${") { | ||
| lastSignificantToken = "?InterpolationInTemplate"; | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: "TemplateMiddle", | ||
| value: match[0] | ||
| }); | ||
| } else { | ||
| stack.pop(); | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "TemplateTail", | ||
| value: match[0], | ||
| closed: match[1] === "`" | ||
| }); | ||
| } | ||
| continue; | ||
| } | ||
| break; | ||
| case "InterpolationInJSX": | ||
| if (braces.length === mode.nesting) { | ||
| stack.pop(); | ||
| lastIndex += 1; | ||
| lastSignificantToken = "}"; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: "}" | ||
| }); | ||
| continue; | ||
| } | ||
| } | ||
| postfixIncDec = braces.pop(); | ||
| nextLastSignificantToken = postfixIncDec ? "?ExpressionBraceEnd" : "}"; | ||
| break; | ||
| case "]": | ||
| postfixIncDec = true; | ||
| break; | ||
| case "++": | ||
| case "--": | ||
| nextLastSignificantToken = postfixIncDec ? "?PostfixIncDec" : "?UnaryIncDec"; | ||
| break; | ||
| case "<": | ||
| if (jsx && (TokensPrecedingExpression.test(lastSignificantToken) || KeywordsWithExpressionAfter.test(lastSignificantToken))) { | ||
| stack.push({tag: "JSXTag"}); | ||
| lastIndex += 1; | ||
| lastSignificantToken = "<"; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: punctuator | ||
| }); | ||
| continue; | ||
| } | ||
| postfixIncDec = false; | ||
| break; | ||
| default: | ||
| postfixIncDec = false; | ||
| } | ||
| lastIndex = nextLastIndex; | ||
| lastSignificantToken = nextLastSignificantToken; | ||
| yield ({ | ||
| type: "Punctuator", | ||
| value: punctuator | ||
| }); | ||
| continue; | ||
| } | ||
| Identifier.lastIndex = lastIndex; | ||
| if (match = Identifier.exec(input)) { | ||
| lastIndex = Identifier.lastIndex; | ||
| nextLastSignificantToken = match[0]; | ||
| switch (match[0]) { | ||
| case "for": | ||
| case "if": | ||
| case "while": | ||
| case "with": | ||
| if (lastSignificantToken !== "." && lastSignificantToken !== "?.") { | ||
| nextLastSignificantToken = "?NonExpressionParenKeyword"; | ||
| } | ||
| } | ||
| lastSignificantToken = nextLastSignificantToken; | ||
| postfixIncDec = !KeywordsWithExpressionAfter.test(match[0]); | ||
| yield ({ | ||
| type: match[1] === "#" ? "PrivateIdentifier" : "IdentifierName", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| StringLiteral.lastIndex = lastIndex; | ||
| if (match = StringLiteral.exec(input)) { | ||
| lastIndex = StringLiteral.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "StringLiteral", | ||
| value: match[0], | ||
| closed: match[2] !== void 0 | ||
| }); | ||
| continue; | ||
| } | ||
| NumericLiteral.lastIndex = lastIndex; | ||
| if (match = NumericLiteral.exec(input)) { | ||
| lastIndex = NumericLiteral.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "NumericLiteral", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| Template.lastIndex = lastIndex; | ||
| if (match = Template.exec(input)) { | ||
| lastIndex = Template.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| if (match[1] === "${") { | ||
| lastSignificantToken = "?InterpolationInTemplate"; | ||
| stack.push({ | ||
| tag: "InterpolationInTemplate", | ||
| nesting: braces.length | ||
| }); | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: "TemplateHead", | ||
| value: match[0] | ||
| }); | ||
| } else { | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "NoSubstitutionTemplate", | ||
| value: match[0], | ||
| closed: match[1] === "`" | ||
| }); | ||
| } | ||
| continue; | ||
| } | ||
| break; | ||
| case "JSXTag": | ||
| case "JSXTagEnd": | ||
| JSXPunctuator.lastIndex = lastIndex; | ||
| if (match = JSXPunctuator.exec(input)) { | ||
| lastIndex = JSXPunctuator.lastIndex; | ||
| nextLastSignificantToken = match[0]; | ||
| switch (match[0]) { | ||
| case "<": | ||
| stack.push({tag: "JSXTag"}); | ||
| break; | ||
| case ">": | ||
| stack.pop(); | ||
| if (lastSignificantToken === "/" || mode.tag === "JSXTagEnd") { | ||
| nextLastSignificantToken = "?JSX"; | ||
| postfixIncDec = true; | ||
| } else { | ||
| stack.push({tag: "JSXChildren"}); | ||
| } | ||
| break; | ||
| case "{": | ||
| stack.push({ | ||
| tag: "InterpolationInJSX", | ||
| nesting: braces.length | ||
| }); | ||
| nextLastSignificantToken = "?InterpolationInJSX"; | ||
| postfixIncDec = false; | ||
| break; | ||
| case "/": | ||
| if (lastSignificantToken === "<") { | ||
| stack.pop(); | ||
| if (stack[stack.length - 1].tag === "JSXChildren") { | ||
| stack.pop(); | ||
| } | ||
| stack.push({tag: "JSXTagEnd"}); | ||
| } | ||
| } | ||
| lastSignificantToken = nextLastSignificantToken; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| JSXIdentifier.lastIndex = lastIndex; | ||
| if (match = JSXIdentifier.exec(input)) { | ||
| lastIndex = JSXIdentifier.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| yield ({ | ||
| type: "JSXIdentifier", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| JSXString.lastIndex = lastIndex; | ||
| if (match = JSXString.exec(input)) { | ||
| lastIndex = JSXString.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| yield ({ | ||
| type: "JSXString", | ||
| value: match[0], | ||
| closed: match[2] !== void 0 | ||
| }); | ||
| continue; | ||
| } | ||
| break; | ||
| case "JSXChildren": | ||
| JSXText.lastIndex = lastIndex; | ||
| if (match = JSXText.exec(input)) { | ||
| lastIndex = JSXText.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| yield ({ | ||
| type: "JSXText", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| switch (input[lastIndex]) { | ||
| case "<": | ||
| stack.push({tag: "JSXTag"}); | ||
| lastIndex++; | ||
| lastSignificantToken = "<"; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: "<" | ||
| }); | ||
| continue; | ||
| case "{": | ||
| stack.push({ | ||
| tag: "InterpolationInJSX", | ||
| nesting: braces.length | ||
| }); | ||
| lastIndex++; | ||
| lastSignificantToken = "?InterpolationInJSX"; | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: "{" | ||
| }); | ||
| continue; | ||
| } | ||
| } | ||
| WhiteSpace.lastIndex = lastIndex; | ||
| if (match = WhiteSpace.exec(input)) { | ||
| lastIndex = WhiteSpace.lastIndex; | ||
| yield ({ | ||
| type: "WhiteSpace", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| LineTerminatorSequence.lastIndex = lastIndex; | ||
| if (match = LineTerminatorSequence.exec(input)) { | ||
| lastIndex = LineTerminatorSequence.lastIndex; | ||
| postfixIncDec = false; | ||
| if (KeywordsWithNoLineTerminatorAfter.test(lastSignificantToken)) { | ||
| lastSignificantToken = "?NoLineTerminatorHere"; | ||
| } | ||
| yield ({ | ||
| type: "LineTerminatorSequence", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| MultiLineComment.lastIndex = lastIndex; | ||
| if (match = MultiLineComment.exec(input)) { | ||
| lastIndex = MultiLineComment.lastIndex; | ||
| if (Newline.test(match[0])) { | ||
| postfixIncDec = false; | ||
| if (KeywordsWithNoLineTerminatorAfter.test(lastSignificantToken)) { | ||
| lastSignificantToken = "?NoLineTerminatorHere"; | ||
| } | ||
| } | ||
| yield ({ | ||
| type: "MultiLineComment", | ||
| value: match[0], | ||
| closed: match[1] !== void 0 | ||
| }); | ||
| continue; | ||
| } | ||
| SingleLineComment.lastIndex = lastIndex; | ||
| if (match = SingleLineComment.exec(input)) { | ||
| lastIndex = SingleLineComment.lastIndex; | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: "SingleLineComment", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| firstCodePoint = String.fromCodePoint(input.codePointAt(lastIndex)); | ||
| lastIndex += firstCodePoint.length; | ||
| lastSignificantToken = firstCodePoint; | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: mode.tag.startsWith("JSX") ? "JSXInvalid" : "Invalid", | ||
| value: firstCodePoint | ||
| }); | ||
| } | ||
| return void 0; | ||
| }; | ||
| return jsTokens_1; | ||
| } | ||
| var jsTokensExports = /*@__PURE__*/ requireJsTokens(); | ||
| var jsTokens = /*@__PURE__*/getDefaultExportFromCjs(jsTokensExports); | ||
| // src/index.ts | ||
| var reservedWords = { | ||
| keyword: [ | ||
| "break", | ||
| "case", | ||
| "catch", | ||
| "continue", | ||
| "debugger", | ||
| "default", | ||
| "do", | ||
| "else", | ||
| "finally", | ||
| "for", | ||
| "function", | ||
| "if", | ||
| "return", | ||
| "switch", | ||
| "throw", | ||
| "try", | ||
| "var", | ||
| "const", | ||
| "while", | ||
| "with", | ||
| "new", | ||
| "this", | ||
| "super", | ||
| "class", | ||
| "extends", | ||
| "export", | ||
| "import", | ||
| "null", | ||
| "true", | ||
| "false", | ||
| "in", | ||
| "instanceof", | ||
| "typeof", | ||
| "void", | ||
| "delete" | ||
| ], | ||
| strict: [ | ||
| "implements", | ||
| "interface", | ||
| "let", | ||
| "package", | ||
| "private", | ||
| "protected", | ||
| "public", | ||
| "static", | ||
| "yield" | ||
| ] | ||
| }, keywords = new Set(reservedWords.keyword), reservedWordsStrictSet = new Set(reservedWords.strict), sometimesKeywords = /* @__PURE__ */ new Set(["as", "async", "from", "get", "of", "set"]); | ||
| function isReservedWord(word) { | ||
| return word === "await" || word === "enum"; | ||
| } | ||
| function isStrictReservedWord(word) { | ||
| return isReservedWord(word) || reservedWordsStrictSet.has(word); | ||
| } | ||
| function isKeyword(word) { | ||
| return keywords.has(word); | ||
| } | ||
| var BRACKET = /^[()[\]{}]$/, getTokenType = function(token) { | ||
| if (token.type === "IdentifierName") { | ||
| if (isKeyword(token.value) || isStrictReservedWord(token.value) || sometimesKeywords.has(token.value)) | ||
| return "Keyword"; | ||
| if (token.value[0] && token.value[0] !== token.value[0].toLowerCase()) | ||
| return "IdentifierCapitalized"; | ||
| } | ||
| return token.type === "Punctuator" && BRACKET.test(token.value) ? "Bracket" : token.type === "Invalid" && (token.value === "@" || token.value === "#") ? "Punctuator" : token.type; | ||
| }; | ||
| function getCallableType(token) { | ||
| if (token.type === "IdentifierName") | ||
| return "IdentifierCallable"; | ||
| if (token.type === "PrivateIdentifier") | ||
| return "PrivateIdentifierCallable"; | ||
| throw new Error("Not a callable token"); | ||
| } | ||
| var colorize = (defs, type, value) => { | ||
| let colorize2 = defs[type]; | ||
| return colorize2 ? colorize2(value) : value; | ||
| }, highlightTokens = (defs, text, jsx) => { | ||
| let highlighted = "", lastPotentialCallable = null, stackedHighlight = ""; | ||
| for (let token of jsTokens(text, { jsx })) { | ||
| let type = getTokenType(token); | ||
| if (type === "IdentifierName" || type === "PrivateIdentifier") { | ||
| lastPotentialCallable && (highlighted += colorize(defs, getTokenType(lastPotentialCallable), lastPotentialCallable.value) + stackedHighlight, stackedHighlight = ""), lastPotentialCallable = token; | ||
| continue; | ||
| } | ||
| if (lastPotentialCallable && (token.type === "WhiteSpace" || token.type === "LineTerminatorSequence" || token.type === "Punctuator" && (token.value === "?." || token.value === "!"))) { | ||
| stackedHighlight += colorize(defs, type, token.value); | ||
| continue; | ||
| } | ||
| if (stackedHighlight && !lastPotentialCallable && (highlighted += stackedHighlight, stackedHighlight = ""), lastPotentialCallable) { | ||
| let type2 = token.type === "Punctuator" && token.value === "(" ? getCallableType(lastPotentialCallable) : getTokenType(lastPotentialCallable); | ||
| highlighted += colorize(defs, type2, lastPotentialCallable.value) + stackedHighlight, stackedHighlight = "", lastPotentialCallable = null; | ||
| } | ||
| highlighted += colorize(defs, type, token.value); | ||
| } | ||
| return highlighted; | ||
| }; | ||
| function highlight$1(code, options = { jsx: false, colors: {} }) { | ||
| return code && highlightTokens(options.colors || {}, code, options.jsx); | ||
| } | ||
| function getDefs(c) { | ||
| const Invalid = (text) => c.white(c.bgRed(c.bold(text))); | ||
| return { | ||
| Keyword: c.magenta, | ||
| IdentifierCapitalized: c.yellow, | ||
| Punctuator: c.yellow, | ||
| StringLiteral: c.green, | ||
| NoSubstitutionTemplate: c.green, | ||
| MultiLineComment: c.gray, | ||
| SingleLineComment: c.gray, | ||
| RegularExpressionLiteral: c.cyan, | ||
| NumericLiteral: c.blue, | ||
| TemplateHead: (text) => c.green(text.slice(0, text.length - 2)) + c.cyan(text.slice(-2)), | ||
| TemplateTail: (text) => c.cyan(text.slice(0, 1)) + c.green(text.slice(1)), | ||
| TemplateMiddle: (text) => c.cyan(text.slice(0, 1)) + c.green(text.slice(1, text.length - 2)) + c.cyan(text.slice(-2)), | ||
| IdentifierCallable: c.blue, | ||
| PrivateIdentifierCallable: (text) => `#${c.blue(text.slice(1))}`, | ||
| Invalid, | ||
| JSXString: c.green, | ||
| JSXIdentifier: c.yellow, | ||
| JSXInvalid: Invalid, | ||
| JSXPunctuator: c.yellow | ||
| }; | ||
| } | ||
| function highlight(code, options = { jsx: false }) { | ||
| return highlight$1(code, { | ||
| jsx: options.jsx, | ||
| colors: getDefs(options.colors || c) | ||
| }); | ||
| } | ||
| export { highlight }; |
| declare const lineSplitRE: RegExp; | ||
| declare function positionToOffset(source: string, lineNumber: number, columnNumber: number): number; | ||
| declare function offsetToLineNumber(source: string, offset: number): number; | ||
| export { lineSplitRE, offsetToLineNumber, positionToOffset }; |
| const lineSplitRE = /\r?\n/; | ||
| 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 { lineSplitRE, offsetToLineNumber, positionToOffset }; |
| declare function serializeValue(val: any, seen?: WeakMap<WeakKey, any>): any; | ||
| export { serializeValue }; |
| const IS_RECORD_SYMBOL = "@@__IMMUTABLE_RECORD__@@"; | ||
| const IS_COLLECTION_SYMBOL = "@@__IMMUTABLE_ITERABLE__@@"; | ||
| function isImmutable(v) { | ||
| return v && (v[IS_COLLECTION_SYMBOL] || v[IS_RECORD_SYMBOL]); | ||
| } | ||
| const OBJECT_PROTO = Object.getPrototypeOf({}); | ||
| function getUnserializableMessage(err) { | ||
| if (err instanceof Error) { | ||
| return `<unserializable>: ${err.message}`; | ||
| } | ||
| if (typeof err === "string") { | ||
| return `<unserializable>: ${err}`; | ||
| } | ||
| return "<unserializable>"; | ||
| } | ||
| // https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm | ||
| function serializeValue(val, seen = new WeakMap()) { | ||
| if (!val || typeof val === "string") { | ||
| return val; | ||
| } | ||
| if (val instanceof Error && "toJSON" in val && typeof val.toJSON === "function") { | ||
| const jsonValue = val.toJSON(); | ||
| if (jsonValue && jsonValue !== val && typeof jsonValue === "object") { | ||
| if (typeof val.message === "string") { | ||
| safe(() => jsonValue.message ?? (jsonValue.message = normalizeErrorMessage(val.message))); | ||
| } | ||
| if (typeof val.stack === "string") { | ||
| safe(() => jsonValue.stack ?? (jsonValue.stack = val.stack)); | ||
| } | ||
| if (typeof val.name === "string") { | ||
| safe(() => jsonValue.name ?? (jsonValue.name = val.name)); | ||
| } | ||
| if (val.cause != null) { | ||
| safe(() => jsonValue.cause ?? (jsonValue.cause = serializeValue(val.cause, seen))); | ||
| } | ||
| } | ||
| return serializeValue(jsonValue, seen); | ||
| } | ||
| if (typeof val === "function") { | ||
| return `Function<${val.name || "anonymous"}>`; | ||
| } | ||
| if (typeof val === "symbol") { | ||
| return val.toString(); | ||
| } | ||
| if (typeof val !== "object") { | ||
| return val; | ||
| } | ||
| if (typeof Buffer !== "undefined" && val instanceof Buffer) { | ||
| return `<Buffer(${val.length}) ...>`; | ||
| } | ||
| if (typeof Uint8Array !== "undefined" && val instanceof Uint8Array) { | ||
| return `<Uint8Array(${val.length}) ...>`; | ||
| } | ||
| // cannot serialize immutables as immutables | ||
| if (isImmutable(val)) { | ||
| return serializeValue(val.toJSON(), seen); | ||
| } | ||
| if (val instanceof Promise || val.constructor && val.constructor.prototype === "AsyncFunction") { | ||
| return "Promise"; | ||
| } | ||
| if (typeof Element !== "undefined" && val instanceof Element) { | ||
| return val.tagName; | ||
| } | ||
| if (typeof val.toJSON === "function") { | ||
| return serializeValue(val.toJSON(), seen); | ||
| } | ||
| if (seen.has(val)) { | ||
| return seen.get(val); | ||
| } | ||
| if (Array.isArray(val)) { | ||
| // eslint-disable-next-line unicorn/no-new-array -- we need to keep sparse arrays ([1,,3]) | ||
| const clone = new Array(val.length); | ||
| seen.set(val, clone); | ||
| val.forEach((e, i) => { | ||
| try { | ||
| clone[i] = serializeValue(e, seen); | ||
| } catch (err) { | ||
| clone[i] = getUnserializableMessage(err); | ||
| } | ||
| }); | ||
| return clone; | ||
| } else { | ||
| // Objects with `Error` constructors appear to cause problems during worker communication | ||
| // using `MessagePort`, so the serialized error object is being recreated as plain object. | ||
| const clone = Object.create(null); | ||
| seen.set(val, clone); | ||
| let obj = val; | ||
| while (obj && obj !== OBJECT_PROTO) { | ||
| Object.getOwnPropertyNames(obj).forEach((key) => { | ||
| if (key in clone) { | ||
| return; | ||
| } | ||
| try { | ||
| clone[key] = serializeValue(val[key], seen); | ||
| } catch (err) { | ||
| // delete in case it has a setter from prototype that might throw | ||
| delete clone[key]; | ||
| clone[key] = getUnserializableMessage(err); | ||
| } | ||
| }); | ||
| obj = Object.getPrototypeOf(obj); | ||
| } | ||
| if (val instanceof Error) { | ||
| safe(() => val.message = normalizeErrorMessage(val.message)); | ||
| } | ||
| return clone; | ||
| } | ||
| } | ||
| function safe(fn) { | ||
| try { | ||
| return fn(); | ||
| } catch {} | ||
| } | ||
| function normalizeErrorMessage(message) { | ||
| return message.replace(/__(vite_ssr_import|vi_import)_\d+__\./g, ""); | ||
| } | ||
| export { serializeValue }; |
| interface SafeTimers { | ||
| nextTick?: (cb: () => void) => void; | ||
| setImmediate?: { | ||
| <TArgs extends any[]>(callback: (...args: TArgs) => void, ...args: TArgs): any; | ||
| __promisify__: <T = void>(value?: T, options?: any) => Promise<T>; | ||
| }; | ||
| clearImmediate?: (immediateId: any) => void; | ||
| setTimeout: typeof setTimeout; | ||
| setInterval: typeof setInterval; | ||
| clearInterval: typeof clearInterval; | ||
| clearTimeout: typeof clearTimeout; | ||
| queueMicrotask: typeof queueMicrotask; | ||
| } | ||
| declare function getSafeTimers(): SafeTimers; | ||
| declare function setSafeTimers(): void; | ||
| export { getSafeTimers, setSafeTimers }; | ||
| export type { SafeTimers }; |
| const SAFE_TIMERS_SYMBOL = Symbol("vitest:SAFE_TIMERS"); | ||
| function getSafeTimers() { | ||
| const { setTimeout: safeSetTimeout, setInterval: safeSetInterval, clearInterval: safeClearInterval, clearTimeout: safeClearTimeout, setImmediate: safeSetImmediate, clearImmediate: safeClearImmediate, queueMicrotask: safeQueueMicrotask } = globalThis[SAFE_TIMERS_SYMBOL] || globalThis; | ||
| const { nextTick: safeNextTick } = globalThis[SAFE_TIMERS_SYMBOL] || globalThis.process || {}; | ||
| return { | ||
| nextTick: safeNextTick, | ||
| setTimeout: safeSetTimeout, | ||
| setInterval: safeSetInterval, | ||
| clearInterval: safeClearInterval, | ||
| clearTimeout: safeClearTimeout, | ||
| setImmediate: safeSetImmediate, | ||
| clearImmediate: safeClearImmediate, | ||
| queueMicrotask: safeQueueMicrotask | ||
| }; | ||
| } | ||
| function setSafeTimers() { | ||
| const { setTimeout: safeSetTimeout, setInterval: safeSetInterval, clearInterval: safeClearInterval, clearTimeout: safeClearTimeout, setImmediate: safeSetImmediate, clearImmediate: safeClearImmediate, queueMicrotask: safeQueueMicrotask } = globalThis; | ||
| const { nextTick: safeNextTick } = globalThis.process || {}; | ||
| const timers = { | ||
| nextTick: safeNextTick, | ||
| setTimeout: safeSetTimeout, | ||
| setInterval: safeSetInterval, | ||
| clearInterval: safeClearInterval, | ||
| clearTimeout: safeClearTimeout, | ||
| setImmediate: safeSetImmediate, | ||
| clearImmediate: safeClearImmediate, | ||
| queueMicrotask: safeQueueMicrotask | ||
| }; | ||
| globalThis[SAFE_TIMERS_SYMBOL] = timers; | ||
| } | ||
| export { getSafeTimers, setSafeTimers }; |
@@ -1,154 +0,1 @@ | ||
| import { plugins, format as format$1 } from '@vitest/pretty-format'; | ||
| import * as loupe from 'loupe'; | ||
| const { AsymmetricMatcher, DOMCollection, DOMElement, Immutable, ReactElement, ReactTestComponent } = plugins; | ||
| const PLUGINS = [ | ||
| ReactTestComponent, | ||
| ReactElement, | ||
| DOMElement, | ||
| DOMCollection, | ||
| Immutable, | ||
| AsymmetricMatcher | ||
| ]; | ||
| function stringify(object, maxDepth = 10, { maxLength,...options } = {}) { | ||
| const MAX_LENGTH = maxLength ?? 1e4; | ||
| let result; | ||
| try { | ||
| result = format$1(object, { | ||
| maxDepth, | ||
| escapeString: false, | ||
| plugins: PLUGINS, | ||
| ...options | ||
| }); | ||
| } catch { | ||
| result = format$1(object, { | ||
| callToJSON: false, | ||
| maxDepth, | ||
| escapeString: false, | ||
| plugins: PLUGINS, | ||
| ...options | ||
| }); | ||
| } | ||
| // Prevents infinite loop https://github.com/vitest-dev/vitest/issues/7249 | ||
| return result.length >= MAX_LENGTH && maxDepth > 1 ? stringify(object, Math.floor(Math.min(maxDepth, Number.MAX_SAFE_INTEGER) / 2), { | ||
| maxLength, | ||
| ...options | ||
| }) : result; | ||
| } | ||
| const formatRegExp = /%[sdjifoOc%]/g; | ||
| function format(...args) { | ||
| if (typeof args[0] !== "string") { | ||
| const objects = []; | ||
| for (let i = 0; i < args.length; i++) { | ||
| objects.push(inspect(args[i], { | ||
| depth: 0, | ||
| colors: false | ||
| })); | ||
| } | ||
| return objects.join(" "); | ||
| } | ||
| const len = args.length; | ||
| let i = 1; | ||
| const template = args[0]; | ||
| let str = String(template).replace(formatRegExp, (x) => { | ||
| if (x === "%%") { | ||
| return "%"; | ||
| } | ||
| if (i >= len) { | ||
| return x; | ||
| } | ||
| switch (x) { | ||
| case "%s": { | ||
| const value = args[i++]; | ||
| if (typeof value === "bigint") { | ||
| return `${value.toString()}n`; | ||
| } | ||
| if (typeof value === "number" && value === 0 && 1 / value < 0) { | ||
| return "-0"; | ||
| } | ||
| if (typeof value === "object" && value !== null) { | ||
| if (typeof value.toString === "function" && value.toString !== Object.prototype.toString) { | ||
| return value.toString(); | ||
| } | ||
| return inspect(value, { | ||
| depth: 0, | ||
| colors: false | ||
| }); | ||
| } | ||
| return String(value); | ||
| } | ||
| case "%d": { | ||
| const value = args[i++]; | ||
| if (typeof value === "bigint") { | ||
| return `${value.toString()}n`; | ||
| } | ||
| return Number(value).toString(); | ||
| } | ||
| case "%i": { | ||
| const value = args[i++]; | ||
| if (typeof value === "bigint") { | ||
| return `${value.toString()}n`; | ||
| } | ||
| return Number.parseInt(String(value)).toString(); | ||
| } | ||
| case "%f": return Number.parseFloat(String(args[i++])).toString(); | ||
| case "%o": return inspect(args[i++], { | ||
| showHidden: true, | ||
| showProxy: true | ||
| }); | ||
| case "%O": return inspect(args[i++]); | ||
| case "%c": { | ||
| i++; | ||
| return ""; | ||
| } | ||
| case "%j": try { | ||
| return JSON.stringify(args[i++]); | ||
| } catch (err) { | ||
| const m = err.message; | ||
| if (m.includes("circular structure") || m.includes("cyclic structures") || m.includes("cyclic object")) { | ||
| return "[Circular]"; | ||
| } | ||
| throw err; | ||
| } | ||
| default: return x; | ||
| } | ||
| }); | ||
| for (let x = args[i]; i < len; x = args[++i]) { | ||
| if (x === null || typeof x !== "object") { | ||
| str += ` ${x}`; | ||
| } else { | ||
| str += ` ${inspect(x)}`; | ||
| } | ||
| } | ||
| return str; | ||
| } | ||
| function inspect(obj, options = {}) { | ||
| if (options.truncate === 0) { | ||
| options.truncate = Number.POSITIVE_INFINITY; | ||
| } | ||
| return loupe.inspect(obj, options); | ||
| } | ||
| function objDisplay(obj, options = {}) { | ||
| if (typeof options.truncate === "undefined") { | ||
| options.truncate = 40; | ||
| } | ||
| const str = inspect(obj, options); | ||
| const type = Object.prototype.toString.call(obj); | ||
| if (options.truncate && str.length >= options.truncate) { | ||
| if (type === "[object Function]") { | ||
| const fn = obj; | ||
| return !fn.name ? "[Function]" : `[Function: ${fn.name}]`; | ||
| } else if (type === "[object Array]") { | ||
| return `[ Array(${obj.length}) ]`; | ||
| } else if (type === "[object Object]") { | ||
| const keys = Object.keys(obj); | ||
| const kstr = keys.length > 2 ? `${keys.splice(0, 2).join(", ")}, ...` : keys.join(", "); | ||
| return `{ Object (${kstr}) }`; | ||
| } else { | ||
| return str; | ||
| } | ||
| } | ||
| return str; | ||
| } | ||
| function getDefaultExportFromCjs (x) { | ||
@@ -158,2 +5,2 @@ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; | ||
| export { format as f, getDefaultExportFromCjs as g, inspect as i, objDisplay as o, stringify as s }; | ||
| export { getDefaultExportFromCjs as g }; |
+2
-3
| import { D as DiffOptions } from './types.d-BCElaP-c.js'; | ||
| export { serializeValue as serializeError } from './serialize.js'; | ||
| import '@vitest/pretty-format'; | ||
| declare function serializeValue(val: any, seen?: WeakMap<WeakKey, any>): any; | ||
| declare function processError(_err: any, diffOptions?: DiffOptions, seen?: WeakSet<WeakKey>): any; | ||
| export { processError, serializeValue as serializeError, serializeValue }; | ||
| export { processError }; |
+6
-126
| import { printDiffOrStringify } from './diff.js'; | ||
| import { f as format, s as stringify } from './chunk-_commonjsHelpers.js'; | ||
| import { stringify } from './display.js'; | ||
| import { serializeValue } from './serialize.js'; | ||
| import '@vitest/pretty-format'; | ||
| import 'tinyrainbow'; | ||
| import './chunk-helpers.js'; | ||
| import 'loupe'; | ||
| import './helpers.js'; | ||
| import './constants.js'; | ||
| import './chunk-_commonjsHelpers.js'; | ||
| const IS_RECORD_SYMBOL = "@@__IMMUTABLE_RECORD__@@"; | ||
| const IS_COLLECTION_SYMBOL = "@@__IMMUTABLE_ITERABLE__@@"; | ||
| function isImmutable(v) { | ||
| return v && (v[IS_COLLECTION_SYMBOL] || v[IS_RECORD_SYMBOL]); | ||
| } | ||
| const OBJECT_PROTO = Object.getPrototypeOf({}); | ||
| function getUnserializableMessage(err) { | ||
| if (err instanceof Error) { | ||
| return `<unserializable>: ${err.message}`; | ||
| } | ||
| if (typeof err === "string") { | ||
| return `<unserializable>: ${err}`; | ||
| } | ||
| return "<unserializable>"; | ||
| } | ||
| // https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm | ||
| function serializeValue(val, seen = new WeakMap()) { | ||
| if (!val || typeof val === "string") { | ||
| return val; | ||
| } | ||
| if (val instanceof Error && "toJSON" in val && typeof val.toJSON === "function") { | ||
| const jsonValue = val.toJSON(); | ||
| if (jsonValue && jsonValue !== val && typeof jsonValue === "object") { | ||
| if (typeof val.message === "string") { | ||
| safe(() => jsonValue.message ?? (jsonValue.message = val.message)); | ||
| } | ||
| if (typeof val.stack === "string") { | ||
| safe(() => jsonValue.stack ?? (jsonValue.stack = val.stack)); | ||
| } | ||
| if (typeof val.name === "string") { | ||
| safe(() => jsonValue.name ?? (jsonValue.name = val.name)); | ||
| } | ||
| if (val.cause != null) { | ||
| safe(() => jsonValue.cause ?? (jsonValue.cause = serializeValue(val.cause, seen))); | ||
| } | ||
| } | ||
| return serializeValue(jsonValue, seen); | ||
| } | ||
| if (typeof val === "function") { | ||
| return `Function<${val.name || "anonymous"}>`; | ||
| } | ||
| if (typeof val === "symbol") { | ||
| return val.toString(); | ||
| } | ||
| if (typeof val !== "object") { | ||
| return val; | ||
| } | ||
| if (typeof Buffer !== "undefined" && val instanceof Buffer) { | ||
| return `<Buffer(${val.length}) ...>`; | ||
| } | ||
| if (typeof Uint8Array !== "undefined" && val instanceof Uint8Array) { | ||
| return `<Uint8Array(${val.length}) ...>`; | ||
| } | ||
| // cannot serialize immutables as immutables | ||
| if (isImmutable(val)) { | ||
| return serializeValue(val.toJSON(), seen); | ||
| } | ||
| if (val instanceof Promise || val.constructor && val.constructor.prototype === "AsyncFunction") { | ||
| return "Promise"; | ||
| } | ||
| if (typeof Element !== "undefined" && val instanceof Element) { | ||
| return val.tagName; | ||
| } | ||
| if (typeof val.asymmetricMatch === "function") { | ||
| return `${val.toString()} ${format(val.sample)}`; | ||
| } | ||
| if (typeof val.toJSON === "function") { | ||
| return serializeValue(val.toJSON(), seen); | ||
| } | ||
| if (seen.has(val)) { | ||
| return seen.get(val); | ||
| } | ||
| if (Array.isArray(val)) { | ||
| // eslint-disable-next-line unicorn/no-new-array -- we need to keep sparse arrays ([1,,3]) | ||
| const clone = new Array(val.length); | ||
| seen.set(val, clone); | ||
| val.forEach((e, i) => { | ||
| try { | ||
| clone[i] = serializeValue(e, seen); | ||
| } catch (err) { | ||
| clone[i] = getUnserializableMessage(err); | ||
| } | ||
| }); | ||
| return clone; | ||
| } else { | ||
| // Objects with `Error` constructors appear to cause problems during worker communication | ||
| // using `MessagePort`, so the serialized error object is being recreated as plain object. | ||
| const clone = Object.create(null); | ||
| seen.set(val, clone); | ||
| let obj = val; | ||
| while (obj && obj !== OBJECT_PROTO) { | ||
| Object.getOwnPropertyNames(obj).forEach((key) => { | ||
| if (key in clone) { | ||
| return; | ||
| } | ||
| try { | ||
| clone[key] = serializeValue(val[key], seen); | ||
| } catch (err) { | ||
| // delete in case it has a setter from prototype that might throw | ||
| delete clone[key]; | ||
| clone[key] = getUnserializableMessage(err); | ||
| } | ||
| }); | ||
| obj = Object.getPrototypeOf(obj); | ||
| } | ||
| return clone; | ||
| } | ||
| } | ||
| function safe(fn) { | ||
| try { | ||
| return fn(); | ||
| } catch {} | ||
| } | ||
| function normalizeErrorMessage(message) { | ||
| return message.replace(/__(vite_ssr_import|vi_import)_\d+__\./g, ""); | ||
| } | ||
| function processError(_err, diffOptions, seen = new WeakSet()) { | ||
@@ -141,8 +27,2 @@ if (!_err || typeof _err !== "object") { | ||
| } | ||
| // some Error implementations don't allow rewriting message | ||
| try { | ||
| if (typeof err.message === "string") { | ||
| err.message = normalizeErrorMessage(err.message); | ||
| } | ||
| } catch {} | ||
| // some Error implementations may not allow rewriting cause | ||
@@ -163,2 +43,2 @@ // in most cases, the assignment will lead to "err.cause = err.cause" | ||
| export { processError, serializeValue as serializeError, serializeValue }; | ||
| export { processError, serializeValue as serializeError }; |
| import { Nullable, Arrayable } from './types.js'; | ||
| declare function nanoid(size?: number): string; | ||
| declare function shuffle<T>(array: T[], seed?: number): T[]; | ||
| interface CloneOptions { | ||
@@ -10,2 +14,3 @@ forceWritable?: boolean; | ||
| } | ||
| /** | ||
@@ -35,3 +40,2 @@ * Get original stacktrace without source map support the most performant way. | ||
| declare function isBareImport(id: string): boolean; | ||
| declare function parseRegexp(input: string): RegExp; | ||
| declare function toArray<T>(array?: Nullable<Arrayable<T>>): Array<T>; | ||
@@ -70,3 +74,3 @@ declare function isObject(item: unknown): boolean; | ||
| export { assertTypes, cleanUrl, clone, createDefer, createSimpleStackTrace, deepClone, deepMerge, getCallLastIndex, getOwnProperties, getType, isBareImport, isExternalUrl, isNegativeNaN, isObject, isPrimitive, noop, notNullish, objectAttr, parseRegexp, slash, toArray, unwrapId, withTrailingSlash, wrapId }; | ||
| export { assertTypes, cleanUrl, clone, createDefer, createSimpleStackTrace, deepClone, deepMerge, getCallLastIndex, getOwnProperties, getType, isBareImport, isExternalUrl, isNegativeNaN, isObject, isPrimitive, nanoid, noop, notNullish, objectAttr, shuffle, slash, toArray, unwrapId, withTrailingSlash, wrapId }; | ||
| export type { DeferPromise }; |
+295
-1
@@ -1,1 +0,295 @@ | ||
| export { b as assertTypes, c as cleanUrl, d as clone, e as createDefer, f as createSimpleStackTrace, g as deepClone, h as deepMerge, j as getCallLastIndex, k as getOwnProperties, l as getType, m as isBareImport, o as isExternalUrl, p as isNegativeNaN, q as isObject, i as isPrimitive, r as noop, n as notNullish, s as objectAttr, t as parseRegexp, u as slash, v as toArray, w as unwrapId, x as withTrailingSlash, y as wrapId } from './chunk-helpers.js'; | ||
| import { VALID_ID_PREFIX, NULL_BYTE_PLACEHOLDER } from './constants.js'; | ||
| // port from nanoid | ||
| // https://github.com/ai/nanoid | ||
| const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; | ||
| function nanoid(size = 21) { | ||
| let id = ""; | ||
| let i = size; | ||
| while (i--) { | ||
| id += urlAlphabet[Math.random() * 64 | 0]; | ||
| } | ||
| return id; | ||
| } | ||
| 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; | ||
| } | ||
| /** | ||
| * Get original stacktrace without source map support the most performant way. | ||
| * - Create only 1 stack frame. | ||
| * - Rewrite prepareStackTrace to bypass "support-stack-trace" (usually takes ~250ms). | ||
| */ | ||
| function createSimpleStackTrace(options) { | ||
| const { message = "$$stack trace 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 notNullish(v) { | ||
| return v != null; | ||
| } | ||
| function assertTypes(value, name, types) { | ||
| const receivedType = typeof value; | ||
| const pass = types.includes(receivedType); | ||
| if (!pass) { | ||
| throw new TypeError(`${name} value must be ${types.join(" or ")}, received "${receivedType}"`); | ||
| } | ||
| } | ||
| function isPrimitive(value) { | ||
| return value === null || typeof value !== "function" && typeof value !== "object"; | ||
| } | ||
| function slash(path) { | ||
| return path.replace(/\\/g, "/"); | ||
| } | ||
| const postfixRE = /[?#].*$/; | ||
| function cleanUrl(url) { | ||
| return url.replace(postfixRE, ""); | ||
| } | ||
| const externalRE = /^(?:[a-z]+:)?\/\//; | ||
| const isExternalUrl = (url) => externalRE.test(url); | ||
| /** | ||
| * Prepend `/@id/` and replace null byte so the id is URL-safe. | ||
| * This is prepended to resolved ids that are not valid browser | ||
| * import specifiers by the importAnalysis plugin. | ||
| */ | ||
| function wrapId(id) { | ||
| return id.startsWith(VALID_ID_PREFIX) ? id : VALID_ID_PREFIX + id.replace("\0", NULL_BYTE_PLACEHOLDER); | ||
| } | ||
| /** | ||
| * Undo {@link wrapId}'s `/@id/` and null byte replacements. | ||
| */ | ||
| function unwrapId(id) { | ||
| return id.startsWith(VALID_ID_PREFIX) ? id.slice(VALID_ID_PREFIX.length).replace(NULL_BYTE_PLACEHOLDER, "\0") : id; | ||
| } | ||
| function withTrailingSlash(path) { | ||
| if (path.at(-1) !== "/") { | ||
| return `${path}/`; | ||
| } | ||
| return path; | ||
| } | ||
| const bareImportRE = /^(?![a-z]:)[\w@](?!.*:\/\/)/i; | ||
| function isBareImport(id) { | ||
| return bareImportRE.test(id); | ||
| } | ||
| function toArray(array) { | ||
| if (array === null || array === undefined) { | ||
| array = []; | ||
| } | ||
| if (Array.isArray(array)) { | ||
| return array; | ||
| } | ||
| return [array]; | ||
| } | ||
| function isObject(item) { | ||
| return item != null && typeof item === "object" && !Array.isArray(item); | ||
| } | ||
| function isFinalObj(obj) { | ||
| return obj === Object.prototype || obj === Function.prototype || obj === RegExp.prototype; | ||
| } | ||
| function getType(value) { | ||
| return Object.prototype.toString.apply(value).slice(8, -1); | ||
| } | ||
| function collectOwnProperties(obj, collector) { | ||
| const collect = typeof collector === "function" ? collector : (key) => collector.add(key); | ||
| Object.getOwnPropertyNames(obj).forEach(collect); | ||
| Object.getOwnPropertySymbols(obj).forEach(collect); | ||
| } | ||
| function getOwnProperties(obj) { | ||
| const ownProps = new Set(); | ||
| if (isFinalObj(obj)) { | ||
| return []; | ||
| } | ||
| collectOwnProperties(obj, ownProps); | ||
| return Array.from(ownProps); | ||
| } | ||
| const defaultCloneOptions = { forceWritable: false }; | ||
| function deepClone(val, options = defaultCloneOptions) { | ||
| const seen = new WeakMap(); | ||
| return clone(val, seen, options); | ||
| } | ||
| function clone(val, seen, options = defaultCloneOptions) { | ||
| let k, out; | ||
| if (seen.has(val)) { | ||
| return seen.get(val); | ||
| } | ||
| if (Array.isArray(val)) { | ||
| out = Array.from({ length: k = val.length }); | ||
| seen.set(val, out); | ||
| while (k--) { | ||
| out[k] = clone(val[k], seen, options); | ||
| } | ||
| return out; | ||
| } | ||
| if (Object.prototype.toString.call(val) === "[object Object]") { | ||
| out = Object.create(Object.getPrototypeOf(val)); | ||
| seen.set(val, out); | ||
| // we don't need properties from prototype | ||
| const props = getOwnProperties(val); | ||
| for (const k of props) { | ||
| const descriptor = Object.getOwnPropertyDescriptor(val, k); | ||
| if (!descriptor) { | ||
| continue; | ||
| } | ||
| const cloned = clone(val[k], seen, options); | ||
| if (options.forceWritable) { | ||
| Object.defineProperty(out, k, { | ||
| enumerable: descriptor.enumerable, | ||
| configurable: true, | ||
| writable: true, | ||
| value: cloned | ||
| }); | ||
| } else if ("get" in descriptor) { | ||
| Object.defineProperty(out, k, { | ||
| ...descriptor, | ||
| get() { | ||
| return cloned; | ||
| } | ||
| }); | ||
| } else { | ||
| Object.defineProperty(out, k, { | ||
| ...descriptor, | ||
| value: cloned | ||
| }); | ||
| } | ||
| } | ||
| return out; | ||
| } | ||
| return val; | ||
| } | ||
| function noop() {} | ||
| function objectAttr(source, path, defaultValue = undefined) { | ||
| // a[3].b -> a.3.b | ||
| const paths = path.replace(/\[(\d+)\]/g, ".$1").split("."); | ||
| let result = source; | ||
| for (const p of paths) { | ||
| result = new Object(result)[p]; | ||
| if (result === undefined) { | ||
| return defaultValue; | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| function createDefer() { | ||
| let resolve = null; | ||
| let reject = null; | ||
| const p = new Promise((_resolve, _reject) => { | ||
| resolve = _resolve; | ||
| reject = _reject; | ||
| }); | ||
| p.resolve = resolve; | ||
| p.reject = reject; | ||
| return p; | ||
| } | ||
| /** | ||
| * If code starts with a function call, will return its last index, respecting arguments. | ||
| * This will return 25 - last ending character of toMatch ")" | ||
| * Also works with callbacks | ||
| * ``` | ||
| * toMatch({ test: '123' }); | ||
| * toBeAliased('123') | ||
| * ``` | ||
| */ | ||
| function getCallLastIndex(code) { | ||
| let charIndex = -1; | ||
| let inString = null; | ||
| let startedBracers = 0; | ||
| let endedBracers = 0; | ||
| let beforeChar = null; | ||
| while (charIndex <= code.length) { | ||
| beforeChar = code[charIndex]; | ||
| charIndex++; | ||
| const char = code[charIndex]; | ||
| const isCharString = char === "\"" || char === "'" || char === "`"; | ||
| if (isCharString && beforeChar !== "\\") { | ||
| if (inString === char) { | ||
| inString = null; | ||
| } else if (!inString) { | ||
| inString = char; | ||
| } | ||
| } | ||
| if (!inString) { | ||
| if (char === "(") { | ||
| startedBracers++; | ||
| } | ||
| if (char === ")") { | ||
| endedBracers++; | ||
| } | ||
| } | ||
| if (startedBracers && endedBracers && startedBracers === endedBracers) { | ||
| return charIndex; | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| function isNegativeNaN(val) { | ||
| if (!Number.isNaN(val)) { | ||
| return false; | ||
| } | ||
| const f64 = new Float64Array(1); | ||
| f64[0] = val; | ||
| const u32 = new Uint32Array(f64.buffer); | ||
| const isNegative = u32[1] >>> 31 === 1; | ||
| return isNegative; | ||
| } | ||
| function toString(v) { | ||
| return Object.prototype.toString.call(v); | ||
| } | ||
| function isPlainObject(val) { | ||
| return toString(val) === "[object Object]" && (!val.constructor || val.constructor.name === "Object"); | ||
| } | ||
| function isMergeableObject(item) { | ||
| return isPlainObject(item) && !Array.isArray(item); | ||
| } | ||
| /** | ||
| * Deep merge :P | ||
| * | ||
| * Will merge objects only if they are plain | ||
| * | ||
| * Do not merge types - it is very expensive and usually it's better to case a type here | ||
| */ | ||
| function deepMerge(target, ...sources) { | ||
| if (!sources.length) { | ||
| return target; | ||
| } | ||
| const source = sources.shift(); | ||
| if (source === undefined) { | ||
| return target; | ||
| } | ||
| if (isMergeableObject(target) && isMergeableObject(source)) { | ||
| Object.keys(source).forEach((key) => { | ||
| const _source = source; | ||
| if (isMergeableObject(_source[key])) { | ||
| if (!target[key]) { | ||
| target[key] = {}; | ||
| } | ||
| deepMerge(target[key], _source[key]); | ||
| } else { | ||
| target[key] = _source[key]; | ||
| } | ||
| }); | ||
| } | ||
| return deepMerge(target, ...sources); | ||
| } | ||
| export { assertTypes, cleanUrl, clone, createDefer, createSimpleStackTrace, deepClone, deepMerge, getCallLastIndex, getOwnProperties, getType, isBareImport, isExternalUrl, isNegativeNaN, isObject, isPrimitive, nanoid, noop, notNullish, objectAttr, shuffle, slash, toArray, unwrapId, withTrailingSlash, wrapId }; |
+4
-79
@@ -1,80 +0,5 @@ | ||
| import { PrettyFormatOptions } from '@vitest/pretty-format'; | ||
| export { DeferPromise, assertTypes, cleanUrl, clone, createDefer, createSimpleStackTrace, deepClone, deepMerge, getCallLastIndex, getOwnProperties, getType, isBareImport, isExternalUrl, isNegativeNaN, isObject, isPrimitive, noop, notNullish, objectAttr, parseRegexp, slash, toArray, unwrapId, withTrailingSlash, wrapId } from './helpers.js'; | ||
| import { Colors } from 'tinyrainbow'; | ||
| export { LoupeOptions, StringifyOptions } from './display.js'; | ||
| export { DeferPromise } from './helpers.js'; | ||
| export { SafeTimers } from './timers.js'; | ||
| export { ArgumentsType, Arrayable, Awaitable, Constructable, DeepMerge, MergeInsertions, Nullable, ParsedStack, SerializedError, TestError } from './types.js'; | ||
| declare const KNOWN_ASSET_TYPES: string[]; | ||
| declare const KNOWN_ASSET_RE: RegExp; | ||
| declare const CSS_LANGS_RE: RegExp; | ||
| /** | ||
| * Prefix for resolved Ids that are not valid browser import specifiers | ||
| */ | ||
| declare const VALID_ID_PREFIX = "/@id/"; | ||
| /** | ||
| * Plugins that use 'virtual modules' (e.g. for helper functions), prefix the | ||
| * module ID with `\0`, a convention from the rollup ecosystem. | ||
| * This prevents other plugins from trying to process the id (like node resolution), | ||
| * and core features like sourcemaps can use this info to differentiate between | ||
| * virtual modules and regular files. | ||
| * `\0` is not a permitted char in import URLs so we have to replace them during | ||
| * import analysis. The id will be decoded back before entering the plugins pipeline. | ||
| * These encoded virtual ids are also prefixed by the VALID_ID_PREFIX, so virtual | ||
| * modules in the browser end up encoded as `/@id/__x00__{id}` | ||
| */ | ||
| declare const NULL_BYTE_PLACEHOLDER = "__x00__"; | ||
| type Inspect = (value: unknown, options: Options) => string; | ||
| interface Options { | ||
| showHidden: boolean; | ||
| depth: number; | ||
| colors: boolean; | ||
| customInspect: boolean; | ||
| showProxy: boolean; | ||
| maxArrayLength: number; | ||
| breakLength: number; | ||
| truncate: number; | ||
| seen: unknown[]; | ||
| inspect: Inspect; | ||
| stylize: (value: string, styleType: string) => string; | ||
| } | ||
| type LoupeOptions = Partial<Options>; | ||
| interface StringifyOptions extends PrettyFormatOptions { | ||
| maxLength?: number; | ||
| } | ||
| declare function stringify(object: unknown, maxDepth?: number, { maxLength,...options }?: StringifyOptions): string; | ||
| declare function format(...args: unknown[]): string; | ||
| declare function inspect(obj: unknown, options?: LoupeOptions): string; | ||
| declare function objDisplay(obj: unknown, options?: LoupeOptions): string; | ||
| interface HighlightOptions { | ||
| jsx?: boolean; | ||
| colors?: Colors; | ||
| } | ||
| declare function highlight(code: string, options?: HighlightOptions): string; | ||
| declare function nanoid(size?: number): string; | ||
| declare const lineSplitRE: RegExp; | ||
| declare function positionToOffset(source: string, lineNumber: number, columnNumber: number): number; | ||
| declare function offsetToLineNumber(source: string, offset: number): number; | ||
| declare function shuffle<T>(array: T[], seed?: number): T[]; | ||
| interface SafeTimers { | ||
| nextTick?: (cb: () => void) => void; | ||
| setImmediate?: { | ||
| <TArgs extends any[]>(callback: (...args: TArgs) => void, ...args: TArgs): any; | ||
| __promisify__: <T = void>(value?: T, options?: any) => Promise<T>; | ||
| }; | ||
| clearImmediate?: (immediateId: any) => void; | ||
| setTimeout: typeof setTimeout; | ||
| setInterval: typeof setInterval; | ||
| clearInterval: typeof clearInterval; | ||
| clearTimeout: typeof clearTimeout; | ||
| queueMicrotask: typeof queueMicrotask; | ||
| } | ||
| declare function getSafeTimers(): SafeTimers; | ||
| declare function setSafeTimers(): void; | ||
| export { CSS_LANGS_RE, KNOWN_ASSET_RE, KNOWN_ASSET_TYPES, NULL_BYTE_PLACEHOLDER, VALID_ID_PREFIX, format, getSafeTimers, highlight, inspect, lineSplitRE, nanoid, objDisplay, offsetToLineNumber, positionToOffset, setSafeTimers, shuffle, stringify }; | ||
| export type { LoupeOptions, SafeTimers, StringifyOptions }; | ||
| import '@vitest/pretty-format'; |
+0
-632
@@ -1,633 +0,1 @@ | ||
| export { C as CSS_LANGS_RE, K as KNOWN_ASSET_RE, a as KNOWN_ASSET_TYPES, N as NULL_BYTE_PLACEHOLDER, V as VALID_ID_PREFIX, b as assertTypes, c as cleanUrl, d as clone, e as createDefer, f as createSimpleStackTrace, g as deepClone, h as deepMerge, j as getCallLastIndex, k as getOwnProperties, l as getType, m as isBareImport, o as isExternalUrl, p as isNegativeNaN, q as isObject, i as isPrimitive, r as noop, n as notNullish, s as objectAttr, t as parseRegexp, u as slash, v as toArray, w as unwrapId, x as withTrailingSlash, y as wrapId } from './chunk-helpers.js'; | ||
| import { g as getDefaultExportFromCjs } from './chunk-_commonjsHelpers.js'; | ||
| export { f as format, i as inspect, o as objDisplay, s as stringify } from './chunk-_commonjsHelpers.js'; | ||
| import c from 'tinyrainbow'; | ||
| import '@vitest/pretty-format'; | ||
| import 'loupe'; | ||
| var jsTokens_1; | ||
| var hasRequiredJsTokens; | ||
| function requireJsTokens () { | ||
| if (hasRequiredJsTokens) return jsTokens_1; | ||
| hasRequiredJsTokens = 1; | ||
| // Copyright 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Simon Lydell | ||
| // License: MIT. | ||
| var Identifier, JSXIdentifier, JSXPunctuator, JSXString, JSXText, KeywordsWithExpressionAfter, KeywordsWithNoLineTerminatorAfter, LineTerminatorSequence, MultiLineComment, Newline, NumericLiteral, Punctuator, RegularExpressionLiteral, SingleLineComment, StringLiteral, Template, TokensNotPrecedingObjectLiteral, TokensPrecedingExpression, WhiteSpace; | ||
| RegularExpressionLiteral = /\/(?![*\/])(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\\]).|\\.)*(\/[$_\u200C\u200D\p{ID_Continue}]*|\\)?/yu; | ||
| Punctuator = /--|\+\+|=>|\.{3}|\??\.(?!\d)|(?:&&|\|\||\?\?|[+\-%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2}|\/(?![\/*]))=?|[?~,:;[\](){}]/y; | ||
| Identifier = /(\x23?)(?=[$_\p{ID_Start}\\])(?:[$_\u200C\u200D\p{ID_Continue}]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+/yu; | ||
| StringLiteral = /(['"])(?:(?!\1)[^\\\n\r]|\\(?:\r\n|[^]))*(\1)?/y; | ||
| NumericLiteral = /(?:0[xX][\da-fA-F](?:_?[\da-fA-F])*|0[oO][0-7](?:_?[0-7])*|0[bB][01](?:_?[01])*)n?|0n|[1-9](?:_?\d)*n|(?:(?:0(?!\d)|0\d*[89]\d*|[1-9](?:_?\d)*)(?:\.(?:\d(?:_?\d)*)?)?|\.\d(?:_?\d)*)(?:[eE][+-]?\d(?:_?\d)*)?|0[0-7]+/y; | ||
| Template = /[`}](?:[^`\\$]|\\[^]|\$(?!\{))*(`|\$\{)?/y; | ||
| WhiteSpace = /[\t\v\f\ufeff\p{Zs}]+/yu; | ||
| LineTerminatorSequence = /\r?\n|[\r\u2028\u2029]/y; | ||
| MultiLineComment = /\/\*(?:[^*]|\*(?!\/))*(\*\/)?/y; | ||
| SingleLineComment = /\/\/.*/y; | ||
| JSXPunctuator = /[<>.:={}]|\/(?![\/*])/y; | ||
| JSXIdentifier = /[$_\p{ID_Start}][$_\u200C\u200D\p{ID_Continue}-]*/yu; | ||
| JSXString = /(['"])(?:(?!\1)[^])*(\1)?/y; | ||
| JSXText = /[^<>{}]+/y; | ||
| TokensPrecedingExpression = /^(?:[\/+-]|\.{3}|\?(?:InterpolationIn(?:JSX|Template)|NoLineTerminatorHere|NonExpressionParenEnd|UnaryIncDec))?$|[{}([,;<>=*%&|^!~?:]$/; | ||
| TokensNotPrecedingObjectLiteral = /^(?:=>|[;\]){}]|else|\?(?:NoLineTerminatorHere|NonExpressionParenEnd))?$/; | ||
| KeywordsWithExpressionAfter = /^(?:await|case|default|delete|do|else|instanceof|new|return|throw|typeof|void|yield)$/; | ||
| KeywordsWithNoLineTerminatorAfter = /^(?:return|throw|yield)$/; | ||
| Newline = RegExp(LineTerminatorSequence.source); | ||
| jsTokens_1 = function*(input, {jsx = false} = {}) { | ||
| var braces, firstCodePoint, isExpression, lastIndex, lastSignificantToken, length, match, mode, nextLastIndex, nextLastSignificantToken, parenNesting, postfixIncDec, punctuator, stack; | ||
| ({length} = input); | ||
| lastIndex = 0; | ||
| lastSignificantToken = ""; | ||
| stack = [ | ||
| {tag: "JS"} | ||
| ]; | ||
| braces = []; | ||
| parenNesting = 0; | ||
| postfixIncDec = false; | ||
| while (lastIndex < length) { | ||
| mode = stack[stack.length - 1]; | ||
| switch (mode.tag) { | ||
| case "JS": | ||
| case "JSNonExpressionParen": | ||
| case "InterpolationInTemplate": | ||
| case "InterpolationInJSX": | ||
| if (input[lastIndex] === "/" && (TokensPrecedingExpression.test(lastSignificantToken) || KeywordsWithExpressionAfter.test(lastSignificantToken))) { | ||
| RegularExpressionLiteral.lastIndex = lastIndex; | ||
| if (match = RegularExpressionLiteral.exec(input)) { | ||
| lastIndex = RegularExpressionLiteral.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "RegularExpressionLiteral", | ||
| value: match[0], | ||
| closed: match[1] !== void 0 && match[1] !== "\\" | ||
| }); | ||
| continue; | ||
| } | ||
| } | ||
| Punctuator.lastIndex = lastIndex; | ||
| if (match = Punctuator.exec(input)) { | ||
| punctuator = match[0]; | ||
| nextLastIndex = Punctuator.lastIndex; | ||
| nextLastSignificantToken = punctuator; | ||
| switch (punctuator) { | ||
| case "(": | ||
| if (lastSignificantToken === "?NonExpressionParenKeyword") { | ||
| stack.push({ | ||
| tag: "JSNonExpressionParen", | ||
| nesting: parenNesting | ||
| }); | ||
| } | ||
| parenNesting++; | ||
| postfixIncDec = false; | ||
| break; | ||
| case ")": | ||
| parenNesting--; | ||
| postfixIncDec = true; | ||
| if (mode.tag === "JSNonExpressionParen" && parenNesting === mode.nesting) { | ||
| stack.pop(); | ||
| nextLastSignificantToken = "?NonExpressionParenEnd"; | ||
| postfixIncDec = false; | ||
| } | ||
| break; | ||
| case "{": | ||
| Punctuator.lastIndex = 0; | ||
| isExpression = !TokensNotPrecedingObjectLiteral.test(lastSignificantToken) && (TokensPrecedingExpression.test(lastSignificantToken) || KeywordsWithExpressionAfter.test(lastSignificantToken)); | ||
| braces.push(isExpression); | ||
| postfixIncDec = false; | ||
| break; | ||
| case "}": | ||
| switch (mode.tag) { | ||
| case "InterpolationInTemplate": | ||
| if (braces.length === mode.nesting) { | ||
| Template.lastIndex = lastIndex; | ||
| match = Template.exec(input); | ||
| lastIndex = Template.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| if (match[1] === "${") { | ||
| lastSignificantToken = "?InterpolationInTemplate"; | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: "TemplateMiddle", | ||
| value: match[0] | ||
| }); | ||
| } else { | ||
| stack.pop(); | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "TemplateTail", | ||
| value: match[0], | ||
| closed: match[1] === "`" | ||
| }); | ||
| } | ||
| continue; | ||
| } | ||
| break; | ||
| case "InterpolationInJSX": | ||
| if (braces.length === mode.nesting) { | ||
| stack.pop(); | ||
| lastIndex += 1; | ||
| lastSignificantToken = "}"; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: "}" | ||
| }); | ||
| continue; | ||
| } | ||
| } | ||
| postfixIncDec = braces.pop(); | ||
| nextLastSignificantToken = postfixIncDec ? "?ExpressionBraceEnd" : "}"; | ||
| break; | ||
| case "]": | ||
| postfixIncDec = true; | ||
| break; | ||
| case "++": | ||
| case "--": | ||
| nextLastSignificantToken = postfixIncDec ? "?PostfixIncDec" : "?UnaryIncDec"; | ||
| break; | ||
| case "<": | ||
| if (jsx && (TokensPrecedingExpression.test(lastSignificantToken) || KeywordsWithExpressionAfter.test(lastSignificantToken))) { | ||
| stack.push({tag: "JSXTag"}); | ||
| lastIndex += 1; | ||
| lastSignificantToken = "<"; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: punctuator | ||
| }); | ||
| continue; | ||
| } | ||
| postfixIncDec = false; | ||
| break; | ||
| default: | ||
| postfixIncDec = false; | ||
| } | ||
| lastIndex = nextLastIndex; | ||
| lastSignificantToken = nextLastSignificantToken; | ||
| yield ({ | ||
| type: "Punctuator", | ||
| value: punctuator | ||
| }); | ||
| continue; | ||
| } | ||
| Identifier.lastIndex = lastIndex; | ||
| if (match = Identifier.exec(input)) { | ||
| lastIndex = Identifier.lastIndex; | ||
| nextLastSignificantToken = match[0]; | ||
| switch (match[0]) { | ||
| case "for": | ||
| case "if": | ||
| case "while": | ||
| case "with": | ||
| if (lastSignificantToken !== "." && lastSignificantToken !== "?.") { | ||
| nextLastSignificantToken = "?NonExpressionParenKeyword"; | ||
| } | ||
| } | ||
| lastSignificantToken = nextLastSignificantToken; | ||
| postfixIncDec = !KeywordsWithExpressionAfter.test(match[0]); | ||
| yield ({ | ||
| type: match[1] === "#" ? "PrivateIdentifier" : "IdentifierName", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| StringLiteral.lastIndex = lastIndex; | ||
| if (match = StringLiteral.exec(input)) { | ||
| lastIndex = StringLiteral.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "StringLiteral", | ||
| value: match[0], | ||
| closed: match[2] !== void 0 | ||
| }); | ||
| continue; | ||
| } | ||
| NumericLiteral.lastIndex = lastIndex; | ||
| if (match = NumericLiteral.exec(input)) { | ||
| lastIndex = NumericLiteral.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "NumericLiteral", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| Template.lastIndex = lastIndex; | ||
| if (match = Template.exec(input)) { | ||
| lastIndex = Template.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| if (match[1] === "${") { | ||
| lastSignificantToken = "?InterpolationInTemplate"; | ||
| stack.push({ | ||
| tag: "InterpolationInTemplate", | ||
| nesting: braces.length | ||
| }); | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: "TemplateHead", | ||
| value: match[0] | ||
| }); | ||
| } else { | ||
| postfixIncDec = true; | ||
| yield ({ | ||
| type: "NoSubstitutionTemplate", | ||
| value: match[0], | ||
| closed: match[1] === "`" | ||
| }); | ||
| } | ||
| continue; | ||
| } | ||
| break; | ||
| case "JSXTag": | ||
| case "JSXTagEnd": | ||
| JSXPunctuator.lastIndex = lastIndex; | ||
| if (match = JSXPunctuator.exec(input)) { | ||
| lastIndex = JSXPunctuator.lastIndex; | ||
| nextLastSignificantToken = match[0]; | ||
| switch (match[0]) { | ||
| case "<": | ||
| stack.push({tag: "JSXTag"}); | ||
| break; | ||
| case ">": | ||
| stack.pop(); | ||
| if (lastSignificantToken === "/" || mode.tag === "JSXTagEnd") { | ||
| nextLastSignificantToken = "?JSX"; | ||
| postfixIncDec = true; | ||
| } else { | ||
| stack.push({tag: "JSXChildren"}); | ||
| } | ||
| break; | ||
| case "{": | ||
| stack.push({ | ||
| tag: "InterpolationInJSX", | ||
| nesting: braces.length | ||
| }); | ||
| nextLastSignificantToken = "?InterpolationInJSX"; | ||
| postfixIncDec = false; | ||
| break; | ||
| case "/": | ||
| if (lastSignificantToken === "<") { | ||
| stack.pop(); | ||
| if (stack[stack.length - 1].tag === "JSXChildren") { | ||
| stack.pop(); | ||
| } | ||
| stack.push({tag: "JSXTagEnd"}); | ||
| } | ||
| } | ||
| lastSignificantToken = nextLastSignificantToken; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| JSXIdentifier.lastIndex = lastIndex; | ||
| if (match = JSXIdentifier.exec(input)) { | ||
| lastIndex = JSXIdentifier.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| yield ({ | ||
| type: "JSXIdentifier", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| JSXString.lastIndex = lastIndex; | ||
| if (match = JSXString.exec(input)) { | ||
| lastIndex = JSXString.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| yield ({ | ||
| type: "JSXString", | ||
| value: match[0], | ||
| closed: match[2] !== void 0 | ||
| }); | ||
| continue; | ||
| } | ||
| break; | ||
| case "JSXChildren": | ||
| JSXText.lastIndex = lastIndex; | ||
| if (match = JSXText.exec(input)) { | ||
| lastIndex = JSXText.lastIndex; | ||
| lastSignificantToken = match[0]; | ||
| yield ({ | ||
| type: "JSXText", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| switch (input[lastIndex]) { | ||
| case "<": | ||
| stack.push({tag: "JSXTag"}); | ||
| lastIndex++; | ||
| lastSignificantToken = "<"; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: "<" | ||
| }); | ||
| continue; | ||
| case "{": | ||
| stack.push({ | ||
| tag: "InterpolationInJSX", | ||
| nesting: braces.length | ||
| }); | ||
| lastIndex++; | ||
| lastSignificantToken = "?InterpolationInJSX"; | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: "JSXPunctuator", | ||
| value: "{" | ||
| }); | ||
| continue; | ||
| } | ||
| } | ||
| WhiteSpace.lastIndex = lastIndex; | ||
| if (match = WhiteSpace.exec(input)) { | ||
| lastIndex = WhiteSpace.lastIndex; | ||
| yield ({ | ||
| type: "WhiteSpace", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| LineTerminatorSequence.lastIndex = lastIndex; | ||
| if (match = LineTerminatorSequence.exec(input)) { | ||
| lastIndex = LineTerminatorSequence.lastIndex; | ||
| postfixIncDec = false; | ||
| if (KeywordsWithNoLineTerminatorAfter.test(lastSignificantToken)) { | ||
| lastSignificantToken = "?NoLineTerminatorHere"; | ||
| } | ||
| yield ({ | ||
| type: "LineTerminatorSequence", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| MultiLineComment.lastIndex = lastIndex; | ||
| if (match = MultiLineComment.exec(input)) { | ||
| lastIndex = MultiLineComment.lastIndex; | ||
| if (Newline.test(match[0])) { | ||
| postfixIncDec = false; | ||
| if (KeywordsWithNoLineTerminatorAfter.test(lastSignificantToken)) { | ||
| lastSignificantToken = "?NoLineTerminatorHere"; | ||
| } | ||
| } | ||
| yield ({ | ||
| type: "MultiLineComment", | ||
| value: match[0], | ||
| closed: match[1] !== void 0 | ||
| }); | ||
| continue; | ||
| } | ||
| SingleLineComment.lastIndex = lastIndex; | ||
| if (match = SingleLineComment.exec(input)) { | ||
| lastIndex = SingleLineComment.lastIndex; | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: "SingleLineComment", | ||
| value: match[0] | ||
| }); | ||
| continue; | ||
| } | ||
| firstCodePoint = String.fromCodePoint(input.codePointAt(lastIndex)); | ||
| lastIndex += firstCodePoint.length; | ||
| lastSignificantToken = firstCodePoint; | ||
| postfixIncDec = false; | ||
| yield ({ | ||
| type: mode.tag.startsWith("JSX") ? "JSXInvalid" : "Invalid", | ||
| value: firstCodePoint | ||
| }); | ||
| } | ||
| return void 0; | ||
| }; | ||
| return jsTokens_1; | ||
| } | ||
| var jsTokensExports = requireJsTokens(); | ||
| var jsTokens = /*@__PURE__*/getDefaultExportFromCjs(jsTokensExports); | ||
| // src/index.ts | ||
| var reservedWords = { | ||
| keyword: [ | ||
| "break", | ||
| "case", | ||
| "catch", | ||
| "continue", | ||
| "debugger", | ||
| "default", | ||
| "do", | ||
| "else", | ||
| "finally", | ||
| "for", | ||
| "function", | ||
| "if", | ||
| "return", | ||
| "switch", | ||
| "throw", | ||
| "try", | ||
| "var", | ||
| "const", | ||
| "while", | ||
| "with", | ||
| "new", | ||
| "this", | ||
| "super", | ||
| "class", | ||
| "extends", | ||
| "export", | ||
| "import", | ||
| "null", | ||
| "true", | ||
| "false", | ||
| "in", | ||
| "instanceof", | ||
| "typeof", | ||
| "void", | ||
| "delete" | ||
| ], | ||
| strict: [ | ||
| "implements", | ||
| "interface", | ||
| "let", | ||
| "package", | ||
| "private", | ||
| "protected", | ||
| "public", | ||
| "static", | ||
| "yield" | ||
| ] | ||
| }, keywords = new Set(reservedWords.keyword), reservedWordsStrictSet = new Set(reservedWords.strict), sometimesKeywords = /* @__PURE__ */ new Set(["as", "async", "from", "get", "of", "set"]); | ||
| function isReservedWord(word) { | ||
| return word === "await" || word === "enum"; | ||
| } | ||
| function isStrictReservedWord(word) { | ||
| return isReservedWord(word) || reservedWordsStrictSet.has(word); | ||
| } | ||
| function isKeyword(word) { | ||
| return keywords.has(word); | ||
| } | ||
| var BRACKET = /^[()[\]{}]$/, getTokenType = function(token) { | ||
| if (token.type === "IdentifierName") { | ||
| if (isKeyword(token.value) || isStrictReservedWord(token.value) || sometimesKeywords.has(token.value)) | ||
| return "Keyword"; | ||
| if (token.value[0] && token.value[0] !== token.value[0].toLowerCase()) | ||
| return "IdentifierCapitalized"; | ||
| } | ||
| return token.type === "Punctuator" && BRACKET.test(token.value) ? "Bracket" : token.type === "Invalid" && (token.value === "@" || token.value === "#") ? "Punctuator" : token.type; | ||
| }; | ||
| function getCallableType(token) { | ||
| if (token.type === "IdentifierName") | ||
| return "IdentifierCallable"; | ||
| if (token.type === "PrivateIdentifier") | ||
| return "PrivateIdentifierCallable"; | ||
| throw new Error("Not a callable token"); | ||
| } | ||
| var colorize = (defs, type, value) => { | ||
| let colorize2 = defs[type]; | ||
| return colorize2 ? colorize2(value) : value; | ||
| }, highlightTokens = (defs, text, jsx) => { | ||
| let highlighted = "", lastPotentialCallable = null, stackedHighlight = ""; | ||
| for (let token of jsTokens(text, { jsx })) { | ||
| let type = getTokenType(token); | ||
| if (type === "IdentifierName" || type === "PrivateIdentifier") { | ||
| lastPotentialCallable && (highlighted += colorize(defs, getTokenType(lastPotentialCallable), lastPotentialCallable.value) + stackedHighlight, stackedHighlight = ""), lastPotentialCallable = token; | ||
| continue; | ||
| } | ||
| if (lastPotentialCallable && (token.type === "WhiteSpace" || token.type === "LineTerminatorSequence" || token.type === "Punctuator" && (token.value === "?." || token.value === "!"))) { | ||
| stackedHighlight += colorize(defs, type, token.value); | ||
| continue; | ||
| } | ||
| if (stackedHighlight && !lastPotentialCallable && (highlighted += stackedHighlight, stackedHighlight = ""), lastPotentialCallable) { | ||
| let type2 = token.type === "Punctuator" && token.value === "(" ? getCallableType(lastPotentialCallable) : getTokenType(lastPotentialCallable); | ||
| highlighted += colorize(defs, type2, lastPotentialCallable.value) + stackedHighlight, stackedHighlight = "", lastPotentialCallable = null; | ||
| } | ||
| highlighted += colorize(defs, type, token.value); | ||
| } | ||
| return highlighted; | ||
| }; | ||
| function highlight$1(code, options = { jsx: false, colors: {} }) { | ||
| return code && highlightTokens(options.colors || {}, code, options.jsx); | ||
| } | ||
| function getDefs(c) { | ||
| const Invalid = (text) => c.white(c.bgRed(c.bold(text))); | ||
| return { | ||
| Keyword: c.magenta, | ||
| IdentifierCapitalized: c.yellow, | ||
| Punctuator: c.yellow, | ||
| StringLiteral: c.green, | ||
| NoSubstitutionTemplate: c.green, | ||
| MultiLineComment: c.gray, | ||
| SingleLineComment: c.gray, | ||
| RegularExpressionLiteral: c.cyan, | ||
| NumericLiteral: c.blue, | ||
| TemplateHead: (text) => c.green(text.slice(0, text.length - 2)) + c.cyan(text.slice(-2)), | ||
| TemplateTail: (text) => c.cyan(text.slice(0, 1)) + c.green(text.slice(1)), | ||
| TemplateMiddle: (text) => c.cyan(text.slice(0, 1)) + c.green(text.slice(1, text.length - 2)) + c.cyan(text.slice(-2)), | ||
| IdentifierCallable: c.blue, | ||
| PrivateIdentifierCallable: (text) => `#${c.blue(text.slice(1))}`, | ||
| Invalid, | ||
| JSXString: c.green, | ||
| JSXIdentifier: c.yellow, | ||
| JSXInvalid: Invalid, | ||
| JSXPunctuator: c.yellow | ||
| }; | ||
| } | ||
| function highlight(code, options = { jsx: false }) { | ||
| return highlight$1(code, { | ||
| jsx: options.jsx, | ||
| colors: getDefs(options.colors || c) | ||
| }); | ||
| } | ||
| // port from nanoid | ||
| // https://github.com/ai/nanoid | ||
| const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; | ||
| function nanoid(size = 21) { | ||
| let id = ""; | ||
| let i = size; | ||
| while (i--) { | ||
| id += urlAlphabet[Math.random() * 64 | 0]; | ||
| } | ||
| return id; | ||
| } | ||
| const lineSplitRE = /\r?\n/; | ||
| 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; | ||
| } | ||
| 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; | ||
| } | ||
| const SAFE_TIMERS_SYMBOL = Symbol("vitest:SAFE_TIMERS"); | ||
| function getSafeTimers() { | ||
| const { setTimeout: safeSetTimeout, setInterval: safeSetInterval, clearInterval: safeClearInterval, clearTimeout: safeClearTimeout, setImmediate: safeSetImmediate, clearImmediate: safeClearImmediate, queueMicrotask: safeQueueMicrotask } = globalThis[SAFE_TIMERS_SYMBOL] || globalThis; | ||
| const { nextTick: safeNextTick } = globalThis[SAFE_TIMERS_SYMBOL] || globalThis.process || {}; | ||
| return { | ||
| nextTick: safeNextTick, | ||
| setTimeout: safeSetTimeout, | ||
| setInterval: safeSetInterval, | ||
| clearInterval: safeClearInterval, | ||
| clearTimeout: safeClearTimeout, | ||
| setImmediate: safeSetImmediate, | ||
| clearImmediate: safeClearImmediate, | ||
| queueMicrotask: safeQueueMicrotask | ||
| }; | ||
| } | ||
| function setSafeTimers() { | ||
| const { setTimeout: safeSetTimeout, setInterval: safeSetInterval, clearInterval: safeClearInterval, clearTimeout: safeClearTimeout, setImmediate: safeSetImmediate, clearImmediate: safeClearImmediate, queueMicrotask: safeQueueMicrotask } = globalThis; | ||
| const { nextTick: safeNextTick } = globalThis.process || {}; | ||
| const timers = { | ||
| nextTick: safeNextTick, | ||
| setTimeout: safeSetTimeout, | ||
| setInterval: safeSetInterval, | ||
| clearInterval: safeClearInterval, | ||
| clearTimeout: safeClearTimeout, | ||
| setImmediate: safeSetImmediate, | ||
| clearImmediate: safeClearImmediate, | ||
| queueMicrotask: safeQueueMicrotask | ||
| }; | ||
| globalThis[SAFE_TIMERS_SYMBOL] = timers; | ||
| } | ||
| export { getSafeTimers, highlight, lineSplitRE, nanoid, offsetToLineNumber, positionToOffset, setSafeTimers, shuffle }; |
+31
-120
| import { TestError, ParsedStack } from './types.js'; | ||
| type GeneratedColumn = number; | ||
| type SourcesIndex = number; | ||
| type SourceLine = number; | ||
| type SourceColumn = number; | ||
| type NamesIndex = number; | ||
| type SourceMapSegment = [GeneratedColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn] | [GeneratedColumn, SourcesIndex, SourceLine, SourceColumn, NamesIndex]; | ||
| interface SourceMapV3 { | ||
| file?: string | null; | ||
| names: string[]; | ||
| sourceRoot?: string; | ||
| sources: (string | null)[]; | ||
| sourcesContent?: (string | null)[]; | ||
| version: 3; | ||
| ignoreList?: number[]; | ||
| } | ||
| interface EncodedSourceMap extends SourceMapV3 { | ||
| mappings: string; | ||
| } | ||
| interface DecodedSourceMap extends SourceMapV3 { | ||
| mappings: SourceMapSegment[][]; | ||
| } | ||
| type OriginalMapping = { | ||
@@ -31,99 +9,3 @@ source: string | null; | ||
| }; | ||
| type InvalidOriginalMapping = { | ||
| source: null; | ||
| line: null; | ||
| column: null; | ||
| name: null; | ||
| }; | ||
| type GeneratedMapping = { | ||
| line: number; | ||
| column: number; | ||
| }; | ||
| type InvalidGeneratedMapping = { | ||
| line: null; | ||
| column: null; | ||
| }; | ||
| type Bias = typeof GREATEST_LOWER_BOUND | typeof LEAST_UPPER_BOUND; | ||
| type XInput = { | ||
| x_google_ignoreList?: SourceMapV3['ignoreList']; | ||
| }; | ||
| type EncodedSourceMapXInput = EncodedSourceMap & XInput; | ||
| type DecodedSourceMapXInput = DecodedSourceMap & XInput; | ||
| type SourceMapInput = string | EncodedSourceMapXInput | DecodedSourceMapXInput | TraceMap; | ||
| type Needle = { | ||
| line: number; | ||
| column: number; | ||
| bias?: Bias; | ||
| }; | ||
| type SourceNeedle = { | ||
| source: string; | ||
| line: number; | ||
| column: number; | ||
| bias?: Bias; | ||
| }; | ||
| type EachMapping = { | ||
| generatedLine: number; | ||
| generatedColumn: number; | ||
| source: null; | ||
| originalLine: null; | ||
| originalColumn: null; | ||
| name: null; | ||
| } | { | ||
| generatedLine: number; | ||
| generatedColumn: number; | ||
| source: string | null; | ||
| originalLine: number; | ||
| originalColumn: number; | ||
| name: string | null; | ||
| }; | ||
| declare abstract class SourceMap { | ||
| version: SourceMapV3['version']; | ||
| file: SourceMapV3['file']; | ||
| names: SourceMapV3['names']; | ||
| sourceRoot: SourceMapV3['sourceRoot']; | ||
| sources: SourceMapV3['sources']; | ||
| sourcesContent: SourceMapV3['sourcesContent']; | ||
| resolvedSources: SourceMapV3['sources']; | ||
| ignoreList: SourceMapV3['ignoreList']; | ||
| } | ||
| type Ro<T> = T extends Array<infer V> ? V[] | Readonly<V[]> | RoArray<V> | Readonly<RoArray<V>> : T extends object ? T | Readonly<T> | RoObject<T> | Readonly<RoObject<T>> : T; | ||
| type RoArray<T> = Ro<T>[]; | ||
| type RoObject<T> = { | ||
| [K in keyof T]: T[K] | Ro<T[K]>; | ||
| }; | ||
| declare const LEAST_UPPER_BOUND = -1; | ||
| declare const GREATEST_LOWER_BOUND = 1; | ||
| declare class TraceMap implements SourceMap { | ||
| version: SourceMapV3['version']; | ||
| file: SourceMapV3['file']; | ||
| names: SourceMapV3['names']; | ||
| sourceRoot: SourceMapV3['sourceRoot']; | ||
| sources: SourceMapV3['sources']; | ||
| sourcesContent: SourceMapV3['sourcesContent']; | ||
| ignoreList: SourceMapV3['ignoreList']; | ||
| resolvedSources: string[]; | ||
| private _encoded; | ||
| private _decoded; | ||
| private _decodedMemo; | ||
| private _bySources; | ||
| private _bySourceMemos; | ||
| constructor(map: Ro<SourceMapInput>, mapUrl?: string | null); | ||
| } | ||
| /** | ||
| * A higher-level API to find the source/line/column associated with a generated line/column | ||
| * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in | ||
| * `source-map` library. | ||
| */ | ||
| declare function originalPositionFor(map: TraceMap, needle: Needle): OriginalMapping | InvalidOriginalMapping; | ||
| /** | ||
| * Finds the generated line/column position of the provided source/line/column source position. | ||
| */ | ||
| declare function generatedPositionFor(map: TraceMap, needle: SourceNeedle): GeneratedMapping | InvalidGeneratedMapping; | ||
| /** | ||
| * Iterates each mapping in generated position order. | ||
| */ | ||
| declare function eachMapping(map: TraceMap, cb: (mapping: EachMapping) => void): void; | ||
| interface StackTraceParserOptions { | ||
@@ -143,4 +25,33 @@ ignoreStackEntries?: (RegExp | string)[]; | ||
| declare function parseErrorStacktrace(e: TestError | Error, options?: StackTraceParserOptions): ParsedStack[]; | ||
| interface SourceMapLike { | ||
| version: number; | ||
| mappings?: string; | ||
| names?: string[]; | ||
| sources?: string[]; | ||
| sourcesContent?: string[]; | ||
| sourceRoot?: string; | ||
| } | ||
| interface Needle { | ||
| line: number; | ||
| column: number; | ||
| } | ||
| declare class DecodedMap { | ||
| map: SourceMapLike; | ||
| _encoded: string; | ||
| _decoded: undefined | number[][][]; | ||
| _decodedMemo: Stats; | ||
| url: string; | ||
| version: number; | ||
| names: string[]; | ||
| resolvedSources: string[]; | ||
| constructor(map: SourceMapLike, from: string); | ||
| } | ||
| interface Stats { | ||
| lastKey: number; | ||
| lastNeedle: number; | ||
| lastIndex: number; | ||
| } | ||
| declare function getOriginalPosition(map: DecodedMap, needle: Needle): OriginalMapping | null; | ||
| export { TraceMap, createStackString, stackIgnorePatterns as defaultStackIgnorePatterns, eachMapping, generatedPositionFor, originalPositionFor, parseErrorStacktrace, parseSingleFFOrSafariStack, parseSingleStack, parseSingleV8Stack, parseStacktrace }; | ||
| export type { EachMapping, SourceMapInput, StackTraceParserOptions }; | ||
| export { DecodedMap, createStackString, stackIgnorePatterns as defaultStackIgnorePatterns, getOriginalPosition, parseErrorStacktrace, parseSingleFFOrSafariStack, parseSingleStack, parseSingleV8Stack, parseStacktrace }; | ||
| export type { StackTraceParserOptions }; |
+160
-535
@@ -1,362 +0,106 @@ | ||
| import { i as isPrimitive, n as notNullish } from './chunk-helpers.js'; | ||
| import { r as resolve$1 } from './chunk-pathe.M-eThtNZ.js'; | ||
| import { isPrimitive, notNullish } from './helpers.js'; | ||
| import { r as resolve } from './chunk-pathe.M-eThtNZ.js'; | ||
| import './constants.js'; | ||
| const comma = ','.charCodeAt(0); | ||
| const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | ||
| const intToChar = new Uint8Array(64); // 64 possible chars. | ||
| const charToInt = new Uint8Array(128); // z is 122 in ASCII | ||
| // src/vlq.ts | ||
| var comma = ",".charCodeAt(0); | ||
| var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | ||
| var intToChar = new Uint8Array(64); | ||
| var charToInt = new Uint8Array(128); | ||
| for (let i = 0; i < chars.length; i++) { | ||
| const c = chars.charCodeAt(i); | ||
| intToChar[i] = c; | ||
| charToInt[c] = i; | ||
| const c = chars.charCodeAt(i); | ||
| intToChar[i] = c; | ||
| charToInt[c] = i; | ||
| } | ||
| function decodeInteger(reader, relative) { | ||
| let value = 0; | ||
| let shift = 0; | ||
| let integer = 0; | ||
| do { | ||
| const c = reader.next(); | ||
| integer = charToInt[c]; | ||
| value |= (integer & 31) << shift; | ||
| shift += 5; | ||
| } while (integer & 32); | ||
| const shouldNegate = value & 1; | ||
| value >>>= 1; | ||
| if (shouldNegate) { | ||
| value = -2147483648 | -value; | ||
| } | ||
| return relative + value; | ||
| let value = 0; | ||
| let shift = 0; | ||
| let integer = 0; | ||
| do { | ||
| const c = reader.next(); | ||
| integer = charToInt[c]; | ||
| value |= (integer & 31) << shift; | ||
| shift += 5; | ||
| } while (integer & 32); | ||
| const shouldNegate = value & 1; | ||
| value >>>= 1; | ||
| if (shouldNegate) { | ||
| value = -2147483648 | -value; | ||
| } | ||
| return relative + value; | ||
| } | ||
| function hasMoreVlq(reader, max) { | ||
| if (reader.pos >= max) | ||
| return false; | ||
| return reader.peek() !== comma; | ||
| if (reader.pos >= max) return false; | ||
| return reader.peek() !== comma; | ||
| } | ||
| class StringReader { | ||
| constructor(buffer) { | ||
| this.pos = 0; | ||
| this.buffer = buffer; | ||
| } | ||
| next() { | ||
| return this.buffer.charCodeAt(this.pos++); | ||
| } | ||
| peek() { | ||
| return this.buffer.charCodeAt(this.pos); | ||
| } | ||
| indexOf(char) { | ||
| const { buffer, pos } = this; | ||
| const idx = buffer.indexOf(char, pos); | ||
| return idx === -1 ? buffer.length : idx; | ||
| } | ||
| } | ||
| var StringReader = class { | ||
| constructor(buffer) { | ||
| this.pos = 0; | ||
| this.buffer = buffer; | ||
| } | ||
| next() { | ||
| return this.buffer.charCodeAt(this.pos++); | ||
| } | ||
| peek() { | ||
| return this.buffer.charCodeAt(this.pos); | ||
| } | ||
| indexOf(char) { | ||
| const { buffer, pos } = this; | ||
| const idx = buffer.indexOf(char, pos); | ||
| return idx === -1 ? buffer.length : idx; | ||
| } | ||
| }; | ||
| // src/sourcemap-codec.ts | ||
| function decode(mappings) { | ||
| const { length } = mappings; | ||
| const reader = new StringReader(mappings); | ||
| const decoded = []; | ||
| let genColumn = 0; | ||
| let sourcesIndex = 0; | ||
| let sourceLine = 0; | ||
| let sourceColumn = 0; | ||
| let namesIndex = 0; | ||
| do { | ||
| const semi = reader.indexOf(';'); | ||
| const line = []; | ||
| let sorted = true; | ||
| let lastCol = 0; | ||
| genColumn = 0; | ||
| while (reader.pos < semi) { | ||
| let seg; | ||
| genColumn = decodeInteger(reader, genColumn); | ||
| if (genColumn < lastCol) | ||
| sorted = false; | ||
| lastCol = genColumn; | ||
| if (hasMoreVlq(reader, semi)) { | ||
| sourcesIndex = decodeInteger(reader, sourcesIndex); | ||
| sourceLine = decodeInteger(reader, sourceLine); | ||
| sourceColumn = decodeInteger(reader, sourceColumn); | ||
| if (hasMoreVlq(reader, semi)) { | ||
| namesIndex = decodeInteger(reader, namesIndex); | ||
| seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]; | ||
| } | ||
| else { | ||
| seg = [genColumn, sourcesIndex, sourceLine, sourceColumn]; | ||
| } | ||
| } | ||
| else { | ||
| seg = [genColumn]; | ||
| } | ||
| line.push(seg); | ||
| reader.pos++; | ||
| const { length } = mappings; | ||
| const reader = new StringReader(mappings); | ||
| const decoded = []; | ||
| let genColumn = 0; | ||
| let sourcesIndex = 0; | ||
| let sourceLine = 0; | ||
| let sourceColumn = 0; | ||
| let namesIndex = 0; | ||
| do { | ||
| const semi = reader.indexOf(";"); | ||
| const line = []; | ||
| let sorted = true; | ||
| let lastCol = 0; | ||
| genColumn = 0; | ||
| while (reader.pos < semi) { | ||
| let seg; | ||
| genColumn = decodeInteger(reader, genColumn); | ||
| if (genColumn < lastCol) sorted = false; | ||
| lastCol = genColumn; | ||
| if (hasMoreVlq(reader, semi)) { | ||
| sourcesIndex = decodeInteger(reader, sourcesIndex); | ||
| sourceLine = decodeInteger(reader, sourceLine); | ||
| sourceColumn = decodeInteger(reader, sourceColumn); | ||
| if (hasMoreVlq(reader, semi)) { | ||
| namesIndex = decodeInteger(reader, namesIndex); | ||
| seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]; | ||
| } else { | ||
| seg = [genColumn, sourcesIndex, sourceLine, sourceColumn]; | ||
| } | ||
| if (!sorted) | ||
| sort(line); | ||
| decoded.push(line); | ||
| reader.pos = semi + 1; | ||
| } while (reader.pos <= length); | ||
| return decoded; | ||
| } else { | ||
| seg = [genColumn]; | ||
| } | ||
| line.push(seg); | ||
| reader.pos++; | ||
| } | ||
| if (!sorted) sort(line); | ||
| decoded.push(line); | ||
| reader.pos = semi + 1; | ||
| } while (reader.pos <= length); | ||
| return decoded; | ||
| } | ||
| function sort(line) { | ||
| line.sort(sortComparator$1); | ||
| line.sort(sortComparator); | ||
| } | ||
| function sortComparator$1(a, b) { | ||
| return a[0] - b[0]; | ||
| function sortComparator(a, b) { | ||
| return a[0] - b[0]; | ||
| } | ||
| // Matches the scheme of a URL, eg "http://" | ||
| const schemeRegex = /^[\w+.-]+:\/\//; | ||
| /** | ||
| * Matches the parts of a URL: | ||
| * 1. Scheme, including ":", guaranteed. | ||
| * 2. User/password, including "@", optional. | ||
| * 3. Host, guaranteed. | ||
| * 4. Port, including ":", optional. | ||
| * 5. Path, including "/", optional. | ||
| * 6. Query, including "?", optional. | ||
| * 7. Hash, including "#", optional. | ||
| */ | ||
| const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/; | ||
| /** | ||
| * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start | ||
| * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive). | ||
| * | ||
| * 1. Host, optional. | ||
| * 2. Path, which may include "/", guaranteed. | ||
| * 3. Query, including "?", optional. | ||
| * 4. Hash, including "#", optional. | ||
| */ | ||
| const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i; | ||
| var UrlType; | ||
| (function (UrlType) { | ||
| UrlType[UrlType["Empty"] = 1] = "Empty"; | ||
| UrlType[UrlType["Hash"] = 2] = "Hash"; | ||
| UrlType[UrlType["Query"] = 3] = "Query"; | ||
| UrlType[UrlType["RelativePath"] = 4] = "RelativePath"; | ||
| UrlType[UrlType["AbsolutePath"] = 5] = "AbsolutePath"; | ||
| UrlType[UrlType["SchemeRelative"] = 6] = "SchemeRelative"; | ||
| UrlType[UrlType["Absolute"] = 7] = "Absolute"; | ||
| })(UrlType || (UrlType = {})); | ||
| function isAbsoluteUrl(input) { | ||
| return schemeRegex.test(input); | ||
| } | ||
| function isSchemeRelativeUrl(input) { | ||
| return input.startsWith('//'); | ||
| } | ||
| function isAbsolutePath(input) { | ||
| return input.startsWith('/'); | ||
| } | ||
| function isFileUrl(input) { | ||
| return input.startsWith('file:'); | ||
| } | ||
| function isRelative(input) { | ||
| return /^[.?#]/.test(input); | ||
| } | ||
| function parseAbsoluteUrl(input) { | ||
| const match = urlRegex.exec(input); | ||
| return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || ''); | ||
| } | ||
| function parseFileUrl(input) { | ||
| const match = fileRegex.exec(input); | ||
| const path = match[2]; | ||
| return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || ''); | ||
| } | ||
| function makeUrl(scheme, user, host, port, path, query, hash) { | ||
| return { | ||
| scheme, | ||
| user, | ||
| host, | ||
| port, | ||
| path, | ||
| query, | ||
| hash, | ||
| type: UrlType.Absolute, | ||
| }; | ||
| } | ||
| function parseUrl(input) { | ||
| if (isSchemeRelativeUrl(input)) { | ||
| const url = parseAbsoluteUrl('http:' + input); | ||
| url.scheme = ''; | ||
| url.type = UrlType.SchemeRelative; | ||
| return url; | ||
| } | ||
| if (isAbsolutePath(input)) { | ||
| const url = parseAbsoluteUrl('http://foo.com' + input); | ||
| url.scheme = ''; | ||
| url.host = ''; | ||
| url.type = UrlType.AbsolutePath; | ||
| return url; | ||
| } | ||
| if (isFileUrl(input)) | ||
| return parseFileUrl(input); | ||
| if (isAbsoluteUrl(input)) | ||
| return parseAbsoluteUrl(input); | ||
| const url = parseAbsoluteUrl('http://foo.com/' + input); | ||
| url.scheme = ''; | ||
| url.host = ''; | ||
| url.type = input | ||
| ? input.startsWith('?') | ||
| ? UrlType.Query | ||
| : input.startsWith('#') | ||
| ? UrlType.Hash | ||
| : UrlType.RelativePath | ||
| : UrlType.Empty; | ||
| return url; | ||
| } | ||
| function stripPathFilename(path) { | ||
| // If a path ends with a parent directory "..", then it's a relative path with excess parent | ||
| // paths. It's not a file, so we can't strip it. | ||
| if (path.endsWith('/..')) | ||
| return path; | ||
| const index = path.lastIndexOf('/'); | ||
| return path.slice(0, index + 1); | ||
| } | ||
| function mergePaths(url, base) { | ||
| normalizePath(base, base.type); | ||
| // If the path is just a "/", then it was an empty path to begin with (remember, we're a relative | ||
| // path). | ||
| if (url.path === '/') { | ||
| url.path = base.path; | ||
| } | ||
| else { | ||
| // Resolution happens relative to the base path's directory, not the file. | ||
| url.path = stripPathFilename(base.path) + url.path; | ||
| } | ||
| } | ||
| /** | ||
| * The path can have empty directories "//", unneeded parents "foo/..", or current directory | ||
| * "foo/.". We need to normalize to a standard representation. | ||
| */ | ||
| function normalizePath(url, type) { | ||
| const rel = type <= UrlType.RelativePath; | ||
| const pieces = url.path.split('/'); | ||
| // We need to preserve the first piece always, so that we output a leading slash. The item at | ||
| // pieces[0] is an empty string. | ||
| let pointer = 1; | ||
| // Positive is the number of real directories we've output, used for popping a parent directory. | ||
| // Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo". | ||
| let positive = 0; | ||
| // We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will | ||
| // generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a | ||
| // real directory, we won't need to append, unless the other conditions happen again. | ||
| let addTrailingSlash = false; | ||
| for (let i = 1; i < pieces.length; i++) { | ||
| const piece = pieces[i]; | ||
| // An empty directory, could be a trailing slash, or just a double "//" in the path. | ||
| if (!piece) { | ||
| addTrailingSlash = true; | ||
| continue; | ||
| } | ||
| // If we encounter a real directory, then we don't need to append anymore. | ||
| addTrailingSlash = false; | ||
| // A current directory, which we can always drop. | ||
| if (piece === '.') | ||
| continue; | ||
| // A parent directory, we need to see if there are any real directories we can pop. Else, we | ||
| // have an excess of parents, and we'll need to keep the "..". | ||
| if (piece === '..') { | ||
| if (positive) { | ||
| addTrailingSlash = true; | ||
| positive--; | ||
| pointer--; | ||
| } | ||
| else if (rel) { | ||
| // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute | ||
| // URL, protocol relative URL, or an absolute path, we don't need to keep excess. | ||
| pieces[pointer++] = piece; | ||
| } | ||
| continue; | ||
| } | ||
| // We've encountered a real directory. Move it to the next insertion pointer, which accounts for | ||
| // any popped or dropped directories. | ||
| pieces[pointer++] = piece; | ||
| positive++; | ||
| } | ||
| let path = ''; | ||
| for (let i = 1; i < pointer; i++) { | ||
| path += '/' + pieces[i]; | ||
| } | ||
| if (!path || (addTrailingSlash && !path.endsWith('/..'))) { | ||
| path += '/'; | ||
| } | ||
| url.path = path; | ||
| } | ||
| /** | ||
| * Attempts to resolve `input` URL/path relative to `base`. | ||
| */ | ||
| function resolve(input, base) { | ||
| if (!input && !base) | ||
| return ''; | ||
| const url = parseUrl(input); | ||
| let inputType = url.type; | ||
| if (base && inputType !== UrlType.Absolute) { | ||
| const baseUrl = parseUrl(base); | ||
| const baseType = baseUrl.type; | ||
| switch (inputType) { | ||
| case UrlType.Empty: | ||
| url.hash = baseUrl.hash; | ||
| // fall through | ||
| case UrlType.Hash: | ||
| url.query = baseUrl.query; | ||
| // fall through | ||
| case UrlType.Query: | ||
| case UrlType.RelativePath: | ||
| mergePaths(url, baseUrl); | ||
| // fall through | ||
| case UrlType.AbsolutePath: | ||
| // The host, user, and port are joined, you can't copy one without the others. | ||
| url.user = baseUrl.user; | ||
| url.host = baseUrl.host; | ||
| url.port = baseUrl.port; | ||
| // fall through | ||
| case UrlType.SchemeRelative: | ||
| // The input doesn't have a schema at least, so we need to copy at least that over. | ||
| url.scheme = baseUrl.scheme; | ||
| } | ||
| if (baseType > inputType) | ||
| inputType = baseType; | ||
| } | ||
| normalizePath(url, inputType); | ||
| const queryHash = url.query + url.hash; | ||
| switch (inputType) { | ||
| // This is impossible, because of the empty checks at the start of the function. | ||
| // case UrlType.Empty: | ||
| case UrlType.Hash: | ||
| case UrlType.Query: | ||
| return queryHash; | ||
| case UrlType.RelativePath: { | ||
| // The first char is always a "/", and we need it to be relative. | ||
| const path = url.path.slice(1); | ||
| if (!path) | ||
| return queryHash || '.'; | ||
| if (isRelative(base || input) && !isRelative(path)) { | ||
| // If base started with a leading ".", or there is no base and input started with a ".", | ||
| // then we need to ensure that the relative path starts with a ".". We don't know if | ||
| // relative starts with a "..", though, so check before prepending. | ||
| return './' + path + queryHash; | ||
| } | ||
| return path + queryHash; | ||
| } | ||
| case UrlType.AbsolutePath: | ||
| return url.path + queryHash; | ||
| default: | ||
| return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash; | ||
| } | ||
| } | ||
| // src/trace-mapping.ts | ||
| // src/strip-filename.ts | ||
| function stripFilename(path) { | ||
| if (!path) return ""; | ||
| const index = path.lastIndexOf("/"); | ||
| return path.slice(0, index + 1); | ||
| } | ||
| // src/resolve.ts | ||
| function resolver(mapUrl, sourceRoot) { | ||
| const from = stripFilename(mapUrl); | ||
| const prefix = sourceRoot ? sourceRoot + "/" : ""; | ||
| return (source) => resolve(prefix + (source || ""), from); | ||
| } | ||
| // src/sourcemap-segment.ts | ||
@@ -368,37 +112,3 @@ var COLUMN = 0; | ||
| var NAMES_INDEX = 4; | ||
| var REV_GENERATED_LINE = 1; | ||
| var REV_GENERATED_COLUMN = 2; | ||
| // src/sort.ts | ||
| function maybeSort(mappings, owned) { | ||
| const unsortedIndex = nextUnsortedSegmentLine(mappings, 0); | ||
| if (unsortedIndex === mappings.length) return mappings; | ||
| if (!owned) mappings = mappings.slice(); | ||
| for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) { | ||
| mappings[i] = sortSegments(mappings[i], owned); | ||
| } | ||
| return mappings; | ||
| } | ||
| function nextUnsortedSegmentLine(mappings, start) { | ||
| for (let i = start; i < mappings.length; i++) { | ||
| if (!isSorted(mappings[i])) return i; | ||
| } | ||
| return mappings.length; | ||
| } | ||
| function isSorted(line) { | ||
| for (let j = 1; j < line.length; j++) { | ||
| if (line[j][COLUMN] < line[j - 1][COLUMN]) { | ||
| return false; | ||
| } | ||
| } | ||
| return true; | ||
| } | ||
| function sortSegments(line, owned) { | ||
| if (!owned) line = line.slice(); | ||
| return line.sort(sortComparator); | ||
| } | ||
| function sortComparator(a, b) { | ||
| return a[COLUMN] - b[COLUMN]; | ||
| } | ||
| // src/binary-search.ts | ||
@@ -435,9 +145,2 @@ var found = false; | ||
| } | ||
| function memoizedState() { | ||
| return { | ||
| lastKey: -1, | ||
| lastNeedle: -1, | ||
| lastIndex: -1 | ||
| }; | ||
| } | ||
| function memoizedBinarySearch(haystack, needle, state, key) { | ||
@@ -463,42 +166,2 @@ const { lastKey, lastNeedle, lastIndex } = state; | ||
| // src/by-source.ts | ||
| function buildBySources(decoded, memos) { | ||
| const sources = memos.map(buildNullArray); | ||
| for (let i = 0; i < decoded.length; i++) { | ||
| const line = decoded[i]; | ||
| for (let j = 0; j < line.length; j++) { | ||
| const seg = line[j]; | ||
| if (seg.length === 1) continue; | ||
| const sourceIndex2 = seg[SOURCES_INDEX]; | ||
| const sourceLine = seg[SOURCE_LINE]; | ||
| const sourceColumn = seg[SOURCE_COLUMN]; | ||
| const originalSource = sources[sourceIndex2]; | ||
| const originalLine = originalSource[sourceLine] || (originalSource[sourceLine] = []); | ||
| const memo = memos[sourceIndex2]; | ||
| let index = upperBound( | ||
| originalLine, | ||
| sourceColumn, | ||
| memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine) | ||
| ); | ||
| memo.lastIndex = ++index; | ||
| insert(originalLine, index, [sourceColumn, i, seg[COLUMN]]); | ||
| } | ||
| } | ||
| return sources; | ||
| } | ||
| function insert(array, index, value) { | ||
| for (let i = array.length; i > index; i--) { | ||
| array[i] = array[i - 1]; | ||
| } | ||
| array[index] = value; | ||
| } | ||
| function buildNullArray() { | ||
| return { __proto__: null }; | ||
| } | ||
| // src/types.ts | ||
| function parse(map) { | ||
| return typeof map === "string" ? JSON.parse(map) : map; | ||
| } | ||
| // src/trace-mapping.ts | ||
@@ -509,34 +172,2 @@ var LINE_GTR_ZERO = "`line` must be greater than 0 (lines start at line 1)"; | ||
| var GREATEST_LOWER_BOUND = 1; | ||
| var TraceMap = class { | ||
| constructor(map, mapUrl) { | ||
| const isString = typeof map === "string"; | ||
| if (!isString && map._decodedMemo) return map; | ||
| const parsed = parse(map); | ||
| const { version, file, names, sourceRoot, sources, sourcesContent } = parsed; | ||
| this.version = version; | ||
| this.file = file; | ||
| this.names = names || []; | ||
| this.sourceRoot = sourceRoot; | ||
| this.sources = sources; | ||
| this.sourcesContent = sourcesContent; | ||
| this.ignoreList = parsed.ignoreList || parsed.x_google_ignoreList || void 0; | ||
| const resolve = resolver(mapUrl, sourceRoot); | ||
| this.resolvedSources = sources.map(resolve); | ||
| const { mappings } = parsed; | ||
| if (typeof mappings === "string") { | ||
| this._encoded = mappings; | ||
| this._decoded = void 0; | ||
| } else if (Array.isArray(mappings)) { | ||
| this._encoded = void 0; | ||
| this._decoded = maybeSort(mappings, isString); | ||
| } else if (parsed.sections) { | ||
| throw new Error(`TraceMap passed sectioned source map, please use FlattenMap export instead`); | ||
| } else { | ||
| throw new Error(`invalid source map: ${JSON.stringify(parsed)}`); | ||
| } | ||
| this._decodedMemo = memoizedState(); | ||
| this._bySources = void 0; | ||
| this._bySourceMemos = void 0; | ||
| } | ||
| }; | ||
| function cast(map) { | ||
@@ -575,42 +206,5 @@ return map; | ||
| } | ||
| function generatedPositionFor(map, needle) { | ||
| const { source, line, column, bias } = needle; | ||
| return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false); | ||
| } | ||
| function eachMapping(map, cb) { | ||
| const decoded = decodedMappings(map); | ||
| const { names, resolvedSources } = map; | ||
| for (let i = 0; i < decoded.length; i++) { | ||
| const line = decoded[i]; | ||
| for (let j = 0; j < line.length; j++) { | ||
| const seg = line[j]; | ||
| const generatedLine = i + 1; | ||
| const generatedColumn = seg[0]; | ||
| let source = null; | ||
| let originalLine = null; | ||
| let originalColumn = null; | ||
| let name = null; | ||
| if (seg.length !== 1) { | ||
| source = resolvedSources[seg[1]]; | ||
| originalLine = seg[2] + 1; | ||
| originalColumn = seg[3]; | ||
| } | ||
| if (seg.length === 5) name = names[seg[4]]; | ||
| cb({ | ||
| generatedLine, | ||
| generatedColumn, | ||
| source, | ||
| originalLine, | ||
| originalColumn, | ||
| name | ||
| }); | ||
| } | ||
| } | ||
| } | ||
| function OMapping(source, line, column, name) { | ||
| return { source, line, column, name }; | ||
| } | ||
| function GMapping(line, column) { | ||
| return { line, column }; | ||
| } | ||
| function traceSegmentInternal(segments, memo, line, column, bias) { | ||
@@ -624,23 +218,2 @@ let index = memoizedBinarySearch(segments, column, memo, line); | ||
| } | ||
| function generatedPosition(map, source, line, column, bias, all) { | ||
| var _a; | ||
| line--; | ||
| if (line < 0) throw new Error(LINE_GTR_ZERO); | ||
| if (column < 0) throw new Error(COL_GTR_EQ_ZERO); | ||
| const { sources, resolvedSources } = map; | ||
| let sourceIndex2 = sources.indexOf(source); | ||
| if (sourceIndex2 === -1) sourceIndex2 = resolvedSources.indexOf(source); | ||
| if (sourceIndex2 === -1) return all ? [] : GMapping(null, null); | ||
| const generated = (_a = cast(map))._bySources || (_a._bySources = buildBySources( | ||
| decodedMappings(map), | ||
| cast(map)._bySourceMemos = sources.map(memoizedState) | ||
| )); | ||
| const segments = generated[sourceIndex2][line]; | ||
| if (segments == null) return all ? [] : GMapping(null, null); | ||
| const memo = cast(map)._bySourceMemos[sourceIndex2]; | ||
| const index = traceSegmentInternal(segments, memo, line, column, bias); | ||
| if (index === -1) return GMapping(null, null); | ||
| const segment = segments[index]; | ||
| return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]); | ||
| } | ||
@@ -709,10 +282,31 @@ const CHROME_IE_STACK_REGEXP = /^\s*at .*(?:\S:\d+|\(native\))/m; | ||
| } | ||
| if (!line.includes("@") && !line.includes(":")) { | ||
| // Early return for lines that don't look like Firefox/Safari stack traces | ||
| // Firefox/Safari stack traces must contain '@' and should have location info after it | ||
| if (!line.includes("@")) { | ||
| return null; | ||
| } | ||
| // eslint-disable-next-line regexp/no-super-linear-backtracking, regexp/optimal-quantifier-concatenation | ||
| const functionNameRegex = /((.*".+"[^@]*)?[^@]*)(@)/; | ||
| const matches = line.match(functionNameRegex); | ||
| const functionName = matches && matches[1] ? matches[1] : undefined; | ||
| const [url, lineNumber, columnNumber] = extractLocation(line.replace(functionNameRegex, "")); | ||
| // Find the correct @ that separates function name from location | ||
| // For cases like '@https://@fs/path' or 'functionName@https://@fs/path' | ||
| // we need to find the first @ that precedes a valid location (containing :) | ||
| let atIndex = -1; | ||
| let locationPart = ""; | ||
| let functionName; | ||
| // Try each @ from left to right to find the one that gives us a valid location | ||
| for (let i = 0; i < line.length; i++) { | ||
| if (line[i] === "@") { | ||
| const candidateLocation = line.slice(i + 1); | ||
| // Minimum length 3 for valid location: 1 for filename + 1 for colon + 1 for line number (e.g., "a:1") | ||
| if (candidateLocation.includes(":") && candidateLocation.length >= 3) { | ||
| atIndex = i; | ||
| locationPart = candidateLocation; | ||
| functionName = i > 0 ? line.slice(0, i) : undefined; | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| // Validate we found a valid location with minimum length (filename:line format) | ||
| if (atIndex === -1 || !locationPart.includes(":") || locationPart.length < 3) { | ||
| return null; | ||
| } | ||
| const [url, lineNumber, columnNumber] = extractLocation(locationPart); | ||
| if (!url || !lineNumber || !columnNumber) { | ||
@@ -766,5 +360,5 @@ return null; | ||
| // normalize Windows path (\ -> /) | ||
| file = file.startsWith("node:") || file.startsWith("internal:") ? file : resolve$1(file); | ||
| file = file.startsWith("node:") || file.startsWith("internal:") ? file : resolve(file); | ||
| if (method) { | ||
| method = method.replace(/__vite_ssr_import_\d+__\./g, ""); | ||
| method = method.replace(/__vite_ssr_import_\d+__\./g, "").replace(/(Object\.)?__vite_ssr_export_default__\s?/g, ""); | ||
| } | ||
@@ -799,14 +393,12 @@ return { | ||
| } | ||
| const traceMap = new TraceMap(map); | ||
| const { line, column, source, name } = originalPositionFor(traceMap, stack); | ||
| let file = stack.file; | ||
| if (source) { | ||
| const fileUrl = stack.file.startsWith("file://") ? stack.file : `file://${stack.file}`; | ||
| const sourceRootUrl = map.sourceRoot ? new URL(map.sourceRoot, fileUrl) : fileUrl; | ||
| file = new URL(source, sourceRootUrl).pathname; | ||
| // if the file path is on windows, we need to remove the leading slash | ||
| if (file.match(/\/\w:\//)) { | ||
| file = file.slice(1); | ||
| } | ||
| const traceMap = new DecodedMap(map, stack.file); | ||
| const position = getOriginalPosition(traceMap, stack); | ||
| if (!position) { | ||
| return stack; | ||
| } | ||
| const { line, column, source, name } = position; | ||
| let file = source || stack.file; | ||
| if (file.match(/\/\w:\//)) { | ||
| file = file.slice(1); | ||
| } | ||
| if (shouldFilter(ignoreStackEntries, file)) { | ||
@@ -861,3 +453,36 @@ return null; | ||
| } | ||
| class DecodedMap { | ||
| _encoded; | ||
| _decoded; | ||
| _decodedMemo; | ||
| url; | ||
| version; | ||
| names = []; | ||
| resolvedSources; | ||
| constructor(map, from) { | ||
| this.map = map; | ||
| const { mappings, names, sources } = map; | ||
| this.version = map.version; | ||
| this.names = names || []; | ||
| this._encoded = mappings || ""; | ||
| this._decodedMemo = memoizedState(); | ||
| this.url = from; | ||
| this.resolvedSources = (sources || []).map((s) => resolve(s || "", from)); | ||
| } | ||
| } | ||
| function memoizedState() { | ||
| return { | ||
| lastKey: -1, | ||
| lastNeedle: -1, | ||
| lastIndex: -1 | ||
| }; | ||
| } | ||
| function getOriginalPosition(map, needle) { | ||
| const result = originalPositionFor(map, needle); | ||
| if (result.column == null) { | ||
| return null; | ||
| } | ||
| return result; | ||
| } | ||
| export { TraceMap, createStackString, stackIgnorePatterns as defaultStackIgnorePatterns, eachMapping, generatedPositionFor, originalPositionFor, parseErrorStacktrace, parseSingleFFOrSafariStack, parseSingleStack, parseSingleV8Stack, parseStacktrace }; | ||
| export { DecodedMap, createStackString, stackIgnorePatterns as defaultStackIgnorePatterns, getOriginalPosition, parseErrorStacktrace, parseSingleFFOrSafariStack, parseSingleStack, parseSingleV8Stack, parseStacktrace }; |
+29
-5
| { | ||
| "name": "@vitest/utils", | ||
| "type": "module", | ||
| "version": "4.0.0-beta.10", | ||
| "version": "4.0.0-beta.11", | ||
| "description": "Shared Vitest utility functions", | ||
@@ -39,2 +39,22 @@ "license": "MIT", | ||
| }, | ||
| "./offset": { | ||
| "types": "./dist/offset.d.ts", | ||
| "default": "./dist/offset.js" | ||
| }, | ||
| "./constants": { | ||
| "types": "./dist/constants.d.ts", | ||
| "default": "./dist/constants.js" | ||
| }, | ||
| "./timers": { | ||
| "types": "./dist/timers.d.ts", | ||
| "default": "./dist/timers.js" | ||
| }, | ||
| "./display": { | ||
| "types": "./dist/display.d.ts", | ||
| "default": "./dist/display.js" | ||
| }, | ||
| "./highlight": { | ||
| "types": "./dist/highlight.d.ts", | ||
| "default": "./dist/highlight.js" | ||
| }, | ||
| "./source-map": { | ||
@@ -44,2 +64,6 @@ "types": "./dist/source-map.d.ts", | ||
| }, | ||
| "./serialize": { | ||
| "types": "./dist/serialize.d.ts", | ||
| "default": "./dist/serialize.js" | ||
| }, | ||
| "./*": "./*" | ||
@@ -62,10 +86,10 @@ }, | ||
| "dependencies": { | ||
| "loupe": "^3.2.1", | ||
| "tinyrainbow": "^2.0.0", | ||
| "@vitest/pretty-format": "4.0.0-beta.10" | ||
| "tinyrainbow": "^3.0.3", | ||
| "@vitest/pretty-format": "4.0.0-beta.11" | ||
| }, | ||
| "devDependencies": { | ||
| "@jridgewell/trace-mapping": "^0.3.30", | ||
| "@jridgewell/trace-mapping": "0.3.30", | ||
| "@types/estree": "^1.0.8", | ||
| "diff-sequences": "^29.6.3", | ||
| "loupe": "^3.2.1", | ||
| "tinyhighlight": "^0.3.2" | ||
@@ -72,0 +96,0 @@ }, |
| // TODO: this is all copy pasted from Vite - can they expose a module that exports only constants? | ||
| const KNOWN_ASSET_TYPES = [ | ||
| "apng", | ||
| "bmp", | ||
| "png", | ||
| "jpe?g", | ||
| "jfif", | ||
| "pjpeg", | ||
| "pjp", | ||
| "gif", | ||
| "svg", | ||
| "ico", | ||
| "webp", | ||
| "avif", | ||
| "mp4", | ||
| "webm", | ||
| "ogg", | ||
| "mp3", | ||
| "wav", | ||
| "flac", | ||
| "aac", | ||
| "woff2?", | ||
| "eot", | ||
| "ttf", | ||
| "otf", | ||
| "webmanifest", | ||
| "pdf", | ||
| "txt" | ||
| ]; | ||
| const KNOWN_ASSET_RE = new RegExp(`\\.(${KNOWN_ASSET_TYPES.join("|")})$`); | ||
| const CSS_LANGS_RE = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/; | ||
| /** | ||
| * Prefix for resolved Ids that are not valid browser import specifiers | ||
| */ | ||
| const VALID_ID_PREFIX = `/@id/`; | ||
| /** | ||
| * Plugins that use 'virtual modules' (e.g. for helper functions), prefix the | ||
| * module ID with `\0`, a convention from the rollup ecosystem. | ||
| * This prevents other plugins from trying to process the id (like node resolution), | ||
| * and core features like sourcemaps can use this info to differentiate between | ||
| * virtual modules and regular files. | ||
| * `\0` is not a permitted char in import URLs so we have to replace them during | ||
| * import analysis. The id will be decoded back before entering the plugins pipeline. | ||
| * These encoded virtual ids are also prefixed by the VALID_ID_PREFIX, so virtual | ||
| * modules in the browser end up encoded as `/@id/__x00__{id}` | ||
| */ | ||
| const NULL_BYTE_PLACEHOLDER = `__x00__`; | ||
| /** | ||
| * Get original stacktrace without source map support the most performant way. | ||
| * - Create only 1 stack frame. | ||
| * - Rewrite prepareStackTrace to bypass "support-stack-trace" (usually takes ~250ms). | ||
| */ | ||
| function createSimpleStackTrace(options) { | ||
| const { message = "$$stack trace 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 notNullish(v) { | ||
| return v != null; | ||
| } | ||
| function assertTypes(value, name, types) { | ||
| const receivedType = typeof value; | ||
| const pass = types.includes(receivedType); | ||
| if (!pass) { | ||
| throw new TypeError(`${name} value must be ${types.join(" or ")}, received "${receivedType}"`); | ||
| } | ||
| } | ||
| function isPrimitive(value) { | ||
| return value === null || typeof value !== "function" && typeof value !== "object"; | ||
| } | ||
| function slash(path) { | ||
| return path.replace(/\\/g, "/"); | ||
| } | ||
| const postfixRE = /[?#].*$/; | ||
| function cleanUrl(url) { | ||
| return url.replace(postfixRE, ""); | ||
| } | ||
| const externalRE = /^(?:[a-z]+:)?\/\//; | ||
| const isExternalUrl = (url) => externalRE.test(url); | ||
| /** | ||
| * Prepend `/@id/` and replace null byte so the id is URL-safe. | ||
| * This is prepended to resolved ids that are not valid browser | ||
| * import specifiers by the importAnalysis plugin. | ||
| */ | ||
| function wrapId(id) { | ||
| return id.startsWith(VALID_ID_PREFIX) ? id : VALID_ID_PREFIX + id.replace("\0", NULL_BYTE_PLACEHOLDER); | ||
| } | ||
| /** | ||
| * Undo {@link wrapId}'s `/@id/` and null byte replacements. | ||
| */ | ||
| function unwrapId(id) { | ||
| return id.startsWith(VALID_ID_PREFIX) ? id.slice(VALID_ID_PREFIX.length).replace(NULL_BYTE_PLACEHOLDER, "\0") : id; | ||
| } | ||
| function withTrailingSlash(path) { | ||
| if (path.at(-1) !== "/") { | ||
| return `${path}/`; | ||
| } | ||
| return path; | ||
| } | ||
| const bareImportRE = /^(?![a-z]:)[\w@](?!.*:\/\/)/i; | ||
| function isBareImport(id) { | ||
| return bareImportRE.test(id); | ||
| } | ||
| // convert RegExp.toString to RegExp | ||
| function parseRegexp(input) { | ||
| // Parse input | ||
| // eslint-disable-next-line regexp/no-misleading-capturing-group | ||
| const m = input.match(/(\/?)(.+)\1([a-z]*)/i); | ||
| // match nothing | ||
| if (!m) { | ||
| return /$^/; | ||
| } | ||
| // Invalid flags | ||
| // eslint-disable-next-line regexp/optimal-quantifier-concatenation | ||
| if (m[3] && !/^(?!.*?(.).*?\1)[gmixXsuUAJ]+$/.test(m[3])) { | ||
| return new RegExp(input); | ||
| } | ||
| // Create the regular expression | ||
| return new RegExp(m[2], m[3]); | ||
| } | ||
| function toArray(array) { | ||
| if (array === null || array === undefined) { | ||
| array = []; | ||
| } | ||
| if (Array.isArray(array)) { | ||
| return array; | ||
| } | ||
| return [array]; | ||
| } | ||
| function isObject(item) { | ||
| return item != null && typeof item === "object" && !Array.isArray(item); | ||
| } | ||
| function isFinalObj(obj) { | ||
| return obj === Object.prototype || obj === Function.prototype || obj === RegExp.prototype; | ||
| } | ||
| function getType(value) { | ||
| return Object.prototype.toString.apply(value).slice(8, -1); | ||
| } | ||
| function collectOwnProperties(obj, collector) { | ||
| const collect = typeof collector === "function" ? collector : (key) => collector.add(key); | ||
| Object.getOwnPropertyNames(obj).forEach(collect); | ||
| Object.getOwnPropertySymbols(obj).forEach(collect); | ||
| } | ||
| function getOwnProperties(obj) { | ||
| const ownProps = new Set(); | ||
| if (isFinalObj(obj)) { | ||
| return []; | ||
| } | ||
| collectOwnProperties(obj, ownProps); | ||
| return Array.from(ownProps); | ||
| } | ||
| const defaultCloneOptions = { forceWritable: false }; | ||
| function deepClone(val, options = defaultCloneOptions) { | ||
| const seen = new WeakMap(); | ||
| return clone(val, seen, options); | ||
| } | ||
| function clone(val, seen, options = defaultCloneOptions) { | ||
| let k, out; | ||
| if (seen.has(val)) { | ||
| return seen.get(val); | ||
| } | ||
| if (Array.isArray(val)) { | ||
| out = Array.from({ length: k = val.length }); | ||
| seen.set(val, out); | ||
| while (k--) { | ||
| out[k] = clone(val[k], seen, options); | ||
| } | ||
| return out; | ||
| } | ||
| if (Object.prototype.toString.call(val) === "[object Object]") { | ||
| out = Object.create(Object.getPrototypeOf(val)); | ||
| seen.set(val, out); | ||
| // we don't need properties from prototype | ||
| const props = getOwnProperties(val); | ||
| for (const k of props) { | ||
| const descriptor = Object.getOwnPropertyDescriptor(val, k); | ||
| if (!descriptor) { | ||
| continue; | ||
| } | ||
| const cloned = clone(val[k], seen, options); | ||
| if (options.forceWritable) { | ||
| Object.defineProperty(out, k, { | ||
| enumerable: descriptor.enumerable, | ||
| configurable: true, | ||
| writable: true, | ||
| value: cloned | ||
| }); | ||
| } else if ("get" in descriptor) { | ||
| Object.defineProperty(out, k, { | ||
| ...descriptor, | ||
| get() { | ||
| return cloned; | ||
| } | ||
| }); | ||
| } else { | ||
| Object.defineProperty(out, k, { | ||
| ...descriptor, | ||
| value: cloned | ||
| }); | ||
| } | ||
| } | ||
| return out; | ||
| } | ||
| return val; | ||
| } | ||
| function noop() {} | ||
| function objectAttr(source, path, defaultValue = undefined) { | ||
| // a[3].b -> a.3.b | ||
| const paths = path.replace(/\[(\d+)\]/g, ".$1").split("."); | ||
| let result = source; | ||
| for (const p of paths) { | ||
| result = new Object(result)[p]; | ||
| if (result === undefined) { | ||
| return defaultValue; | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| function createDefer() { | ||
| let resolve = null; | ||
| let reject = null; | ||
| const p = new Promise((_resolve, _reject) => { | ||
| resolve = _resolve; | ||
| reject = _reject; | ||
| }); | ||
| p.resolve = resolve; | ||
| p.reject = reject; | ||
| return p; | ||
| } | ||
| /** | ||
| * If code starts with a function call, will return its last index, respecting arguments. | ||
| * This will return 25 - last ending character of toMatch ")" | ||
| * Also works with callbacks | ||
| * ``` | ||
| * toMatch({ test: '123' }); | ||
| * toBeAliased('123') | ||
| * ``` | ||
| */ | ||
| function getCallLastIndex(code) { | ||
| let charIndex = -1; | ||
| let inString = null; | ||
| let startedBracers = 0; | ||
| let endedBracers = 0; | ||
| let beforeChar = null; | ||
| while (charIndex <= code.length) { | ||
| beforeChar = code[charIndex]; | ||
| charIndex++; | ||
| const char = code[charIndex]; | ||
| const isCharString = char === "\"" || char === "'" || char === "`"; | ||
| if (isCharString && beforeChar !== "\\") { | ||
| if (inString === char) { | ||
| inString = null; | ||
| } else if (!inString) { | ||
| inString = char; | ||
| } | ||
| } | ||
| if (!inString) { | ||
| if (char === "(") { | ||
| startedBracers++; | ||
| } | ||
| if (char === ")") { | ||
| endedBracers++; | ||
| } | ||
| } | ||
| if (startedBracers && endedBracers && startedBracers === endedBracers) { | ||
| return charIndex; | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| function isNegativeNaN(val) { | ||
| if (!Number.isNaN(val)) { | ||
| return false; | ||
| } | ||
| const f64 = new Float64Array(1); | ||
| f64[0] = val; | ||
| const u32 = new Uint32Array(f64.buffer); | ||
| const isNegative = u32[1] >>> 31 === 1; | ||
| return isNegative; | ||
| } | ||
| function toString(v) { | ||
| return Object.prototype.toString.call(v); | ||
| } | ||
| function isPlainObject(val) { | ||
| return toString(val) === "[object Object]" && (!val.constructor || val.constructor.name === "Object"); | ||
| } | ||
| function isMergeableObject(item) { | ||
| return isPlainObject(item) && !Array.isArray(item); | ||
| } | ||
| /** | ||
| * Deep merge :P | ||
| * | ||
| * Will merge objects only if they are plain | ||
| * | ||
| * Do not merge types - it is very expensive and usually it's better to case a type here | ||
| */ | ||
| function deepMerge(target, ...sources) { | ||
| if (!sources.length) { | ||
| return target; | ||
| } | ||
| const source = sources.shift(); | ||
| if (source === undefined) { | ||
| return target; | ||
| } | ||
| if (isMergeableObject(target) && isMergeableObject(source)) { | ||
| Object.keys(source).forEach((key) => { | ||
| const _source = source; | ||
| if (isMergeableObject(_source[key])) { | ||
| if (!target[key]) { | ||
| target[key] = {}; | ||
| } | ||
| deepMerge(target[key], _source[key]); | ||
| } else { | ||
| target[key] = _source[key]; | ||
| } | ||
| }); | ||
| } | ||
| return deepMerge(target, ...sources); | ||
| } | ||
| export { CSS_LANGS_RE as C, KNOWN_ASSET_RE as K, NULL_BYTE_PLACEHOLDER as N, VALID_ID_PREFIX as V, KNOWN_ASSET_TYPES as a, assertTypes as b, cleanUrl as c, clone as d, createDefer as e, createSimpleStackTrace as f, deepClone as g, deepMerge as h, isPrimitive as i, getCallLastIndex as j, getOwnProperties as k, getType as l, isBareImport as m, notNullish as n, isExternalUrl as o, isNegativeNaN as p, isObject as q, noop as r, objectAttr as s, parseRegexp as t, slash as u, toArray as v, unwrapId as w, withTrailingSlash as x, wrapId as y }; |
Sorry, the diff of this file is too big to display
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
178575
1.24%2
-33.33%34
47.83%4995
1.77%1
-50%5
25%+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
Updated