Spaces:
Paused
Paused
| import { diff } from './diff.js'; | |
| import { f as format, s as stringify } from './chunk-display.js'; | |
| import { deepClone, getOwnProperties, getType } from './helpers.js'; | |
| import 'pretty-format'; | |
| import 'diff-sequences'; | |
| import './chunk-colors.js'; | |
| import 'loupe'; | |
| 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>"; | |
| } | |
| function serializeError(val, seen = /* @__PURE__ */ new WeakMap()) { | |
| if (!val || typeof val === "string") | |
| return val; | |
| if (typeof val === "function") | |
| return `Function<${val.name || "anonymous"}>`; | |
| if (typeof val === "symbol") | |
| return val.toString(); | |
| if (typeof val !== "object") | |
| return val; | |
| if (isImmutable(val)) | |
| return serializeError(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 val.toJSON(); | |
| if (seen.has(val)) | |
| return seen.get(val); | |
| if (Array.isArray(val)) { | |
| const clone = new Array(val.length); | |
| seen.set(val, clone); | |
| val.forEach((e, i) => { | |
| try { | |
| clone[i] = serializeError(e, seen); | |
| } catch (err) { | |
| clone[i] = getUnserializableMessage(err); | |
| } | |
| }); | |
| return clone; | |
| } else { | |
| const clone = /* @__PURE__ */ 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] = serializeError(val[key], seen); | |
| } catch (err) { | |
| delete clone[key]; | |
| clone[key] = getUnserializableMessage(err); | |
| } | |
| }); | |
| obj = Object.getPrototypeOf(obj); | |
| } | |
| return clone; | |
| } | |
| } | |
| function normalizeErrorMessage(message) { | |
| return message.replace(/__(vite_ssr_import|vi_import)_\d+__\./g, ""); | |
| } | |
| function processError(err, diffOptions) { | |
| if (!err || typeof err !== "object") | |
| return { message: err }; | |
| if (err.stack) | |
| err.stackStr = String(err.stack); | |
| if (err.name) | |
| err.nameStr = String(err.name); | |
| if (err.showDiff || err.showDiff === void 0 && err.expected !== void 0 && err.actual !== void 0) { | |
| const clonedActual = deepClone(err.actual, { forceWritable: true }); | |
| const clonedExpected = deepClone(err.expected, { forceWritable: true }); | |
| const { replacedActual, replacedExpected } = replaceAsymmetricMatcher(clonedActual, clonedExpected); | |
| err.diff = diff(replacedExpected, replacedActual, { ...diffOptions, ...err.diffOptions }); | |
| } | |
| if (typeof err.expected !== "string") | |
| err.expected = stringify(err.expected, 10); | |
| if (typeof err.actual !== "string") | |
| err.actual = stringify(err.actual, 10); | |
| try { | |
| if (typeof err.message === "string") | |
| err.message = normalizeErrorMessage(err.message); | |
| if (typeof err.cause === "object" && typeof err.cause.message === "string") | |
| err.cause.message = normalizeErrorMessage(err.cause.message); | |
| } catch { | |
| } | |
| try { | |
| return serializeError(err); | |
| } catch (e) { | |
| return serializeError(new Error(`Failed to fully serialize error: ${e == null ? void 0 : e.message} | |
| Inner error message: ${err == null ? void 0 : err.message}`)); | |
| } | |
| } | |
| function isAsymmetricMatcher(data) { | |
| const type = getType(data); | |
| return type === "Object" && typeof data.asymmetricMatch === "function"; | |
| } | |
| function isReplaceable(obj1, obj2) { | |
| const obj1Type = getType(obj1); | |
| const obj2Type = getType(obj2); | |
| return obj1Type === obj2Type && (obj1Type === "Object" || obj1Type === "Array"); | |
| } | |
| function replaceAsymmetricMatcher(actual, expected, actualReplaced = /* @__PURE__ */ new WeakSet(), expectedReplaced = /* @__PURE__ */ new WeakSet()) { | |
| if (!isReplaceable(actual, expected)) | |
| return { replacedActual: actual, replacedExpected: expected }; | |
| if (actualReplaced.has(actual) || expectedReplaced.has(expected)) | |
| return { replacedActual: actual, replacedExpected: expected }; | |
| actualReplaced.add(actual); | |
| expectedReplaced.add(expected); | |
| getOwnProperties(expected).forEach((key) => { | |
| const expectedValue = expected[key]; | |
| const actualValue = actual[key]; | |
| if (isAsymmetricMatcher(expectedValue)) { | |
| if (expectedValue.asymmetricMatch(actualValue)) | |
| actual[key] = expectedValue; | |
| } else if (isAsymmetricMatcher(actualValue)) { | |
| if (actualValue.asymmetricMatch(expectedValue)) | |
| expected[key] = actualValue; | |
| } else if (isReplaceable(actualValue, expectedValue)) { | |
| const replaced = replaceAsymmetricMatcher( | |
| actualValue, | |
| expectedValue, | |
| actualReplaced, | |
| expectedReplaced | |
| ); | |
| actual[key] = replaced.replacedActual; | |
| expected[key] = replaced.replacedExpected; | |
| } | |
| }); | |
| return { | |
| replacedActual: actual, | |
| replacedExpected: expected | |
| }; | |
| } | |
| export { processError, replaceAsymmetricMatcher, serializeError }; | |