File: //home/cafsindia/snap.cafsinfotech.in/node_modules/@sentry/utils/cjs/normalize.js.map
{"version":3,"file":"normalize.js","sources":["../../src/normalize.ts"],"sourcesContent":["import type { Primitive } from '@sentry/types';\n\nimport { isNaN, isSyntheticEvent, isVueViewModel } from './is';\nimport type { MemoFunc } from './memo';\nimport { memoBuilder } from './memo';\nimport { convertToPlainObject } from './object';\nimport { getFunctionName } from './stacktrace';\n\ntype Prototype = { constructor: (...args: unknown[]) => unknown };\n// This is a hack to placate TS, relying on the fact that technically, arrays are objects with integer keys. Normally we\n// think of those keys as actual numbers, but `arr['0']` turns out to work just as well as `arr[0]`, and doing it this\n// way lets us use a single type in the places where behave as if we are only dealing with objects, even if some of them\n// might be arrays.\ntype ObjOrArray<T> = { [key: string]: T };\n\n/**\n * Recursively normalizes the given object.\n *\n * - Creates a copy to prevent original input mutation\n * - Skips non-enumerable properties\n * - When stringifying, calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format\n * - Translates known global objects/classes to a string representations\n * - Takes care of `Error` object serialization\n * - Optionally limits depth of final output\n * - Optionally limits number of properties/elements included in any single object/array\n *\n * @param input The object to be normalized.\n * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.)\n * @param maxProperties The max number of elements or properties to be included in any single array or\n * object in the normallized output.\n * @returns A normalized version of the object, or `\"**non-serializable**\"` if any errors are thrown during normalization.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function normalize(input: unknown, depth: number = 100, maxProperties: number = +Infinity): any {\n try {\n // since we're at the outermost level, we don't provide a key\n return visit('', input, depth, maxProperties);\n } catch (err) {\n return { ERROR: `**non-serializable** (${err})` };\n }\n}\n\n/** JSDoc */\nexport function normalizeToSize<T>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n object: { [key: string]: any },\n // Default Node.js REPL depth\n depth: number = 3,\n // 100kB, as 200kB is max payload size, so half sounds reasonable\n maxSize: number = 100 * 1024,\n): T {\n const normalized = normalize(object, depth);\n\n if (jsonSize(normalized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n\n return normalized as T;\n}\n\n/**\n * Visits a node to perform normalization on it\n *\n * @param key The key corresponding to the given node\n * @param value The node to be visited\n * @param depth Optional number indicating the maximum recursion depth\n * @param maxProperties Optional maximum number of properties/elements included in any single object/array\n * @param memo Optional Memo class handling decycling\n */\nfunction visit(\n key: string,\n value: unknown,\n depth: number = +Infinity,\n maxProperties: number = +Infinity,\n memo: MemoFunc = memoBuilder(),\n): Primitive | ObjOrArray<unknown> {\n const [memoize, unmemoize] = memo;\n\n // Get the simple cases out of the way first\n if (\n value == null || // this matches null and undefined -> eqeq not eqeqeq\n (['number', 'boolean', 'string'].includes(typeof value) && !isNaN(value))\n ) {\n return value as Primitive;\n }\n\n const stringified = stringifyValue(key, value);\n\n // Anything we could potentially dig into more (objects or arrays) will have come back as `\"[object XXXX]\"`.\n // Everything else will have already been serialized, so if we don't see that pattern, we're done.\n if (!stringified.startsWith('[object ')) {\n return stringified;\n }\n\n // From here on, we can assert that `value` is either an object or an array.\n\n // Do not normalize objects that we know have already been normalized. As a general rule, the\n // \"__sentry_skip_normalization__\" property should only be used sparingly and only should only be set on objects that\n // have already been normalized.\n if ((value as ObjOrArray<unknown>)['__sentry_skip_normalization__']) {\n return value as ObjOrArray<unknown>;\n }\n\n // We can set `__sentry_override_normalization_depth__` on an object to ensure that from there\n // We keep a certain amount of depth.\n // This should be used sparingly, e.g. we use it for the redux integration to ensure we get a certain amount of state.\n const remainingDepth =\n typeof (value as ObjOrArray<unknown>)['__sentry_override_normalization_depth__'] === 'number'\n ? ((value as ObjOrArray<unknown>)['__sentry_override_normalization_depth__'] as number)\n : depth;\n\n // We're also done if we've reached the max depth\n if (remainingDepth === 0) {\n // At this point we know `serialized` is a string of the form `\"[object XXXX]\"`. Clean it up so it's just `\"[XXXX]\"`.\n return stringified.replace('object ', '');\n }\n\n // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now.\n if (memoize(value)) {\n return '[Circular ~]';\n }\n\n // If the value has a `toJSON` method, we call it to extract more information\n const valueWithToJSON = value as unknown & { toJSON?: () => unknown };\n if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') {\n try {\n const jsonValue = valueWithToJSON.toJSON();\n // We need to normalize the return value of `.toJSON()` in case it has circular references\n return visit('', jsonValue, remainingDepth - 1, maxProperties, memo);\n } catch (err) {\n // pass (The built-in `toJSON` failed, but we can still try to do it ourselves)\n }\n }\n\n // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse\n // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each\n // property/entry, and keep track of the number of items we add to it.\n const normalized = (Array.isArray(value) ? [] : {}) as ObjOrArray<unknown>;\n let numAdded = 0;\n\n // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant\n // properties are non-enumerable and otherwise would get missed.\n const visitable = convertToPlainObject(value as ObjOrArray<unknown>);\n\n for (const visitKey in visitable) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) {\n continue;\n }\n\n if (numAdded >= maxProperties) {\n normalized[visitKey] = '[MaxProperties ~]';\n break;\n }\n\n // Recursively visit all the child nodes\n const visitValue = visitable[visitKey];\n normalized[visitKey] = visit(visitKey, visitValue, remainingDepth - 1, maxProperties, memo);\n\n numAdded++;\n }\n\n // Once we've visited all the branches, remove the parent from memo storage\n unmemoize(value);\n\n // Return accumulated values\n return normalized;\n}\n\n/**\n * @deprecated This export will be removed in v8.\n */\nexport { visit as walk };\n\n/* eslint-disable complexity */\n/**\n * Stringify the given value. Handles various known special values and types.\n *\n * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn\n * the number 1231 into \"[Object Number]\", nor on `null`, as it will throw.\n *\n * @param value The value to stringify\n * @returns A stringified representation of the given value\n */\nfunction stringifyValue(\n key: unknown,\n // this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for\n // our internal use, it'll do\n value: Exclude<unknown, string | number | boolean | null>,\n): string {\n try {\n if (key === 'domain' && value && typeof value === 'object' && (value as { _events: unknown })._events) {\n return '[Domain]';\n }\n\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n\n // It's safe to use `global`, `window`, and `document` here in this manner, as we are asserting using `typeof` first\n // which won't throw if they are not present.\n\n if (typeof global !== 'undefined' && value === global) {\n return '[Global]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof window !== 'undefined' && value === window) {\n return '[Window]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof document !== 'undefined' && value === document) {\n return '[Document]';\n }\n\n if (isVueViewModel(value)) {\n return '[VueViewModel]';\n }\n\n // React's SyntheticEvent thingy\n if (isSyntheticEvent(value)) {\n return '[SyntheticEvent]';\n }\n\n if (typeof value === 'number' && value !== value) {\n return '[NaN]';\n }\n\n if (typeof value === 'function') {\n return `[Function: ${getFunctionName(value)}]`;\n }\n\n if (typeof value === 'symbol') {\n return `[${String(value)}]`;\n }\n\n // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion\n if (typeof value === 'bigint') {\n return `[BigInt: ${String(value)}]`;\n }\n\n // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting\n // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as\n // `\"[object Object]\"`. If we instead look at the constructor's name (which is the same as the name of the class),\n // we can make sure that only plain objects come out that way.\n const objName = getConstructorName(value);\n\n // Handle HTML Elements\n if (/^HTML(\\w*)Element$/.test(objName)) {\n return `[HTMLElement: ${objName}]`;\n }\n\n return `[object ${objName}]`;\n } catch (err) {\n return `**non-serializable** (${err})`;\n }\n}\n/* eslint-enable complexity */\n\nfunction getConstructorName(value: unknown): string {\n const prototype: Prototype | null = Object.getPrototypeOf(value);\n\n return prototype ? prototype.constructor.name : 'null prototype';\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value: string): number {\n // eslint-disable-next-line no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction jsonSize(value: any): number {\n return utf8Length(JSON.stringify(value));\n}\n"],"names":["memo","memoBuilder","isNaN","convertToPlainObject","isVueViewModel","isSyntheticEvent","getFunctionName"],"mappings":"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"}