🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@rrweb/rrweb-plugin-console-record

Package Overview
Dependencies
Maintainers
2
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@rrweb/rrweb-plugin-console-record - npm Package Compare versions

Comparing version
2.0.0-alpha.20
to
2.0.0
+521
umd/rrweb-plugin-console-record.js
(function (g, f) {
if ("object" == typeof exports && "object" == typeof module) {
module.exports = f();
} else if ("function" == typeof define && define.amd) {
define("rrwebPluginConsoleRecord", [], f);
} else if ("object" == typeof exports) {
exports["rrwebPluginConsoleRecord"] = f();
} else {
g["rrwebPluginConsoleRecord"] = f();
}
}(this, () => {
var exports = {};
var module = { exports };
"use strict";
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
if (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) ;
function patch(source, name, replacement) {
try {
if (!(name in source)) {
return () => {
};
}
const original = source[name];
const wrapped = replacement(original);
if (typeof wrapped === "function") {
wrapped.prototype = wrapped.prototype || {};
Object.defineProperties(wrapped, {
__rrweb_original__: {
enumerable: false,
value: original
}
});
}
source[name] = wrapped;
return () => {
source[name] = original;
};
} catch (e) {
return () => {
};
}
}
class StackFrame {
constructor(obj) {
__publicField(this, "fileName");
__publicField(this, "functionName");
__publicField(this, "lineNumber");
__publicField(this, "columnNumber");
this.fileName = obj.fileName || "";
this.functionName = obj.functionName || "";
this.lineNumber = obj.lineNumber;
this.columnNumber = obj.columnNumber;
}
toString() {
const lineNumber = this.lineNumber || "";
const columnNumber = this.columnNumber || "";
if (this.functionName)
return `${this.functionName} (${this.fileName}:${lineNumber}:${columnNumber})`;
return `${this.fileName}:${lineNumber}:${columnNumber}`;
}
}
const FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\S+:\d+/;
const CHROME_IE_STACK_REGEXP = /^\s*at .*(\S+:\d+|\(native\))/m;
const SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\[native code])?$/;
const ErrorStackParser = {
/**
* Given an Error object, extract the most information from it.
*/
parse: function(error) {
if (!error) {
return [];
}
if (
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
typeof error.stacktrace !== "undefined" || // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
typeof error["opera#sourceloc"] !== "undefined"
) {
return this.parseOpera(
error
);
} else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {
return this.parseV8OrIE(error);
} else if (error.stack) {
return this.parseFFOrSafari(error);
} else {
console.warn(
"[console-record-plugin]: Failed to parse error object:",
error
);
return [];
}
},
// Separate line and column numbers from a string of the form: (URI:Line:Column)
extractLocation: function(urlLike) {
if (urlLike.indexOf(":") === -1) {
return [urlLike];
}
const regExp = /(.+?)(?::(\d+))?(?::(\d+))?$/;
const parts = regExp.exec(urlLike.replace(/[()]/g, ""));
if (!parts) throw new Error(`Cannot parse given url: ${urlLike}`);
return [parts[1], parts[2] || void 0, parts[3] || void 0];
},
parseV8OrIE: function(error) {
const filtered = error.stack.split("\n").filter(function(line) {
return !!line.match(CHROME_IE_STACK_REGEXP);
}, this);
return filtered.map(function(line) {
if (line.indexOf("(eval ") > -1) {
line = line.replace(/eval code/g, "eval").replace(/(\(eval at [^()]*)|(\),.*$)/g, "");
}
let sanitizedLine = line.replace(/^\s+/, "").replace(/\(eval code/g, "(");
const location = sanitizedLine.match(/ (\((.+):(\d+):(\d+)\)$)/);
sanitizedLine = location ? sanitizedLine.replace(location[0], "") : sanitizedLine;
const tokens = sanitizedLine.split(/\s+/).slice(1);
const locationParts = this.extractLocation(
location ? location[1] : tokens.pop()
);
const functionName = tokens.join(" ") || void 0;
const fileName = ["eval", "<anonymous>"].indexOf(locationParts[0]) > -1 ? void 0 : locationParts[0];
return new StackFrame({
functionName,
fileName,
lineNumber: locationParts[1],
columnNumber: locationParts[2]
});
}, this);
},
parseFFOrSafari: function(error) {
const filtered = error.stack.split("\n").filter(function(line) {
return !line.match(SAFARI_NATIVE_CODE_REGEXP);
}, this);
return filtered.map(function(line) {
if (line.indexOf(" > eval") > -1) {
line = line.replace(
/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,
":$1"
);
}
if (line.indexOf("@") === -1 && line.indexOf(":") === -1) {
return new StackFrame({
functionName: line
});
} else {
const functionNameRegex = /((.*".+"[^@]*)?[^@]*)(?:@)/;
const matches = line.match(functionNameRegex);
const functionName = matches && matches[1] ? matches[1] : void 0;
const locationParts = this.extractLocation(
line.replace(functionNameRegex, "")
);
return new StackFrame({
functionName,
fileName: locationParts[0],
lineNumber: locationParts[1],
columnNumber: locationParts[2]
});
}
}, this);
},
parseOpera: function(e) {
if (!e.stacktrace || e.message.indexOf("\n") > -1 && e.message.split("\n").length > e.stacktrace.split("\n").length) {
return this.parseOpera9(e);
} else if (!e.stack) {
return this.parseOpera10(e);
} else {
return this.parseOpera11(e);
}
},
parseOpera9: function(e) {
const lineRE = /Line (\d+).*script (?:in )?(\S+)/i;
const lines = e.message.split("\n");
const result = [];
for (let i = 2, len = lines.length; i < len; i += 2) {
const match = lineRE.exec(lines[i]);
if (match) {
result.push(
new StackFrame({
fileName: match[2],
lineNumber: parseFloat(match[1])
})
);
}
}
return result;
},
parseOpera10: function(e) {
const lineRE = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i;
const lines = e.stacktrace.split("\n");
const result = [];
for (let i = 0, len = lines.length; i < len; i += 2) {
const match = lineRE.exec(lines[i]);
if (match) {
result.push(
new StackFrame({
functionName: match[3] || void 0,
fileName: match[2],
lineNumber: parseFloat(match[1])
})
);
}
}
return result;
},
// Opera 10.65+ Error.stack very similar to FF/Safari
parseOpera11: function(error) {
const filtered = error.stack.split("\n").filter(function(line) {
return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);
}, this);
return filtered.map(function(line) {
const tokens = line.split("@");
const locationParts = this.extractLocation(tokens.pop());
const functionCall = tokens.shift() || "";
const functionName = functionCall.replace(/<anonymous function(: (\w+))?>/, "$2").replace(/\([^)]*\)/g, "") || void 0;
return new StackFrame({
functionName,
fileName: locationParts[0],
lineNumber: locationParts[1],
columnNumber: locationParts[2]
});
}, this);
}
};
function pathToSelector(node) {
if (!node || !node.outerHTML) {
return "";
}
let path = "";
while (node.parentElement) {
let name = node.localName;
if (!name) {
break;
}
name = name.toLowerCase();
const parent = node.parentElement;
const domSiblings = [];
if (parent.children && parent.children.length > 0) {
for (let i = 0; i < parent.children.length; i++) {
const sibling = parent.children[i];
if (sibling.localName && sibling.localName.toLowerCase) {
if (sibling.localName.toLowerCase() === name) {
domSiblings.push(sibling);
}
}
}
}
if (domSiblings.length > 1) {
name += `:eq(${domSiblings.indexOf(node)})`;
}
path = name + (path ? ">" + path : "");
node = parent;
}
return path;
}
function isObject(obj) {
return Object.prototype.toString.call(obj) === "[object Object]";
}
function isObjTooDeep(obj, limit) {
if (limit === 0) {
return true;
}
const keys = Object.keys(obj);
for (const key of keys) {
if (isObject(obj[key]) && isObjTooDeep(obj[key], limit - 1)) {
return true;
}
}
return false;
}
function stringify(obj, stringifyOptions) {
const options = {
numOfKeysLimit: 50,
depthOfLimit: 4
};
Object.assign(options, stringifyOptions);
const stack = [];
const keys = [];
return JSON.stringify(
obj,
function(key, value) {
if (stack.length > 0) {
const thisPos = stack.indexOf(this);
~thisPos ? stack.splice(thisPos + 1) : stack.push(this);
~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);
if (~stack.indexOf(value)) {
if (stack[0] === value) {
value = "[Circular ~]";
} else {
value = "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]";
}
}
} else {
stack.push(value);
}
if (value === null) return value;
if (value === void 0) return "undefined";
if (shouldIgnore(value)) {
return toString(value);
}
if (typeof value === "bigint") {
return value.toString() + "n";
}
if (value instanceof Event) {
const eventResult = {};
for (const eventKey in value) {
const eventValue = value[eventKey];
if (Array.isArray(eventValue)) {
eventResult[eventKey] = pathToSelector(
eventValue.length ? eventValue[0] : null
);
} else {
eventResult[eventKey] = eventValue;
}
}
return eventResult;
} else if (value instanceof Node) {
if (value instanceof HTMLElement) {
return value ? value.outerHTML : "";
}
return value.nodeName;
} else if (value instanceof Error) {
return value.stack ? value.stack + "\nEnd of stack for Error object" : value.name + ": " + value.message;
}
return value;
}
);
function shouldIgnore(_obj) {
if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {
return true;
}
if (typeof _obj === "function") {
return true;
}
if (isObject(_obj) && isObjTooDeep(_obj, options.depthOfLimit)) {
return true;
}
return false;
}
function toString(_obj) {
let str = _obj.toString();
if (options.stringLengthLimit && str.length > options.stringLengthLimit) {
str = `${str.slice(0, options.stringLengthLimit)}...`;
}
return str;
}
}
const defaultLogOptions = {
level: [
"assert",
"clear",
"count",
"countReset",
"debug",
"dir",
"dirxml",
"error",
"group",
"groupCollapsed",
"groupEnd",
"info",
"log",
"table",
"time",
"timeEnd",
"timeLog",
"trace",
"warn"
],
lengthThreshold: 1e3,
logger: "console"
};
function initLogObserver(cb, win, options) {
const logOptions = options ? Object.assign({}, defaultLogOptions, options) : defaultLogOptions;
const loggerType = logOptions.logger;
if (!loggerType) {
return () => {
};
}
let logger;
if (typeof loggerType === "string") {
logger = win[loggerType];
} else {
logger = loggerType;
}
let logCount = 0;
let inStack = false;
const cancelHandlers = [];
if (logOptions.level.includes("error")) {
const errorHandler = (event) => {
const message = event.message, error = event.error;
const trace = ErrorStackParser.parse(error).map(
(stackFrame) => stackFrame.toString()
);
const payload = [stringify(message, logOptions.stringifyOptions)];
cb({
level: "error",
trace,
payload
});
};
win.addEventListener("error", errorHandler);
cancelHandlers.push(() => {
win.removeEventListener("error", errorHandler);
});
const unhandledrejectionHandler = (event) => {
let error;
let payload;
if (event.reason instanceof Error) {
error = event.reason;
payload = [
stringify(
`Uncaught (in promise) ${error.name}: ${error.message}`,
logOptions.stringifyOptions
)
];
} else {
error = new Error();
payload = [
stringify("Uncaught (in promise)", logOptions.stringifyOptions),
stringify(event.reason, logOptions.stringifyOptions)
];
}
const trace = ErrorStackParser.parse(error).map(
(stackFrame) => stackFrame.toString()
);
cb({
level: "error",
trace,
payload
});
};
win.addEventListener("unhandledrejection", unhandledrejectionHandler);
cancelHandlers.push(() => {
win.removeEventListener("unhandledrejection", unhandledrejectionHandler);
});
}
for (const levelType of logOptions.level) {
cancelHandlers.push(replace(logger, levelType));
}
return () => {
cancelHandlers.forEach((h) => h());
};
function replace(_logger, level) {
if (!_logger[level]) {
return () => {
};
}
return patch(
_logger,
level,
(original) => {
return (...args) => {
original.apply(this, args);
if (level === "assert" && !!args[0]) {
return;
}
if (inStack) {
return;
}
inStack = true;
try {
const trace = ErrorStackParser.parse(new Error()).map((stackFrame) => stackFrame.toString()).splice(1);
const argsForPayload = level === "assert" ? args.slice(1) : args;
const payload = argsForPayload.map(
(s) => stringify(s, logOptions.stringifyOptions)
);
logCount++;
if (logCount < logOptions.lengthThreshold) {
cb({
level,
trace,
payload
});
} else if (logCount === logOptions.lengthThreshold) {
cb({
level: "warn",
trace: [],
payload: [
stringify("The number of log records reached the threshold.")
]
});
}
} catch (error) {
original("rrweb logger error:", error, ...args);
} finally {
inStack = false;
}
};
}
);
}
}
const PLUGIN_NAME = "rrweb/console@1";
const getRecordConsolePlugin = (options) => ({
name: PLUGIN_NAME,
observer: initLogObserver,
options
});
exports.PLUGIN_NAME = PLUGIN_NAME;
exports.getRecordConsolePlugin = getRecordConsolePlugin;
if (typeof module.exports == "object" && typeof exports == "object") {
var __cp = (to, from, except, desc) => {
if ((from && typeof from === "object") || typeof from === "function") {
for (let key of Object.getOwnPropertyNames(from)) {
if (!Object.prototype.hasOwnProperty.call(to, key) && key !== except)
Object.defineProperty(to, key, {
get: () => from[key],
enumerable: !(desc = Object.getOwnPropertyDescriptor(from, key)) || desc.enumerable,
});
}
}
return to;
};
module.exports = __cp(module.exports, exports);
}
return module.exports;
}))
//# sourceMappingURL=rrweb-plugin-console-record.umd.cjs.map
(function (g, f) {
if ("object" == typeof exports && "object" == typeof module) {
module.exports = f();
} else if ("function" == typeof define && define.amd) {
define("rrwebPluginConsoleRecord", [], f);
} else if ("object" == typeof exports) {
exports["rrwebPluginConsoleRecord"] = f();
} else {
g["rrwebPluginConsoleRecord"] = f();
}
}(this, () => {
var exports = {};
var module = { exports };
"use strict";var $=Object.defineProperty,k=(e,r,t)=>r in e?$(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,E=(e,r,t)=>k(e,typeof r!="symbol"?r+"":r,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});Date.now().toString();function _(e,r,t){try{if(!(r in e))return()=>{};const n=e[r],i=t(n);return typeof i=="function"&&(i.prototype=i.prototype||{},Object.defineProperties(i,{__rrweb_original__:{enumerable:!1,value:n}})),e[r]=i,()=>{e[r]=n}}catch(n){return()=>{}}}class d{constructor(r){E(this,"fileName"),E(this,"functionName"),E(this,"lineNumber"),E(this,"columnNumber"),this.fileName=r.fileName||"",this.functionName=r.functionName||"",this.lineNumber=r.lineNumber,this.columnNumber=r.columnNumber}toString(){const r=this.lineNumber||"",t=this.columnNumber||"";return this.functionName?`${this.functionName} (${this.fileName}:${r}:${t})`:`${this.fileName}:${r}:${t}`}}const C=/(^|@)\S+:\d+/,S=/^\s*at .*(\S+:\d+|\(native\))/m,F=/^(eval@)?(\[native code])?$/,b={parse:function(e){return e?typeof e.stacktrace!="undefined"||typeof e["opera#sourceloc"]!="undefined"?this.parseOpera(e):e.stack&&e.stack.match(S)?this.parseV8OrIE(e):e.stack?this.parseFFOrSafari(e):(console.warn("[console-record-plugin]: Failed to parse error object:",e),[]):[]},extractLocation:function(e){if(e.indexOf(":")===-1)return[e];const t=/(.+?)(?::(\d+))?(?::(\d+))?$/.exec(e.replace(/[()]/g,""));if(!t)throw new Error(`Cannot parse given url: ${e}`);return[t[1],t[2]||void 0,t[3]||void 0]},parseV8OrIE:function(e){return e.stack.split(`
`).filter(function(t){return!!t.match(S)},this).map(function(t){t.indexOf("(eval ")>-1&&(t=t.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(\),.*$)/g,""));let n=t.replace(/^\s+/,"").replace(/\(eval code/g,"(");const i=n.match(/ (\((.+):(\d+):(\d+)\)$)/);n=i?n.replace(i[0],""):n;const c=n.split(/\s+/).slice(1),s=this.extractLocation(i?i[1]:c.pop()),a=c.join(" ")||void 0,o=["eval","<anonymous>"].indexOf(s[0])>-1?void 0:s[0];return new d({functionName:a,fileName:o,lineNumber:s[1],columnNumber:s[2]})},this)},parseFFOrSafari:function(e){return e.stack.split(`
`).filter(function(t){return!t.match(F)},this).map(function(t){if(t.indexOf(" > eval")>-1&&(t=t.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),t.indexOf("@")===-1&&t.indexOf(":")===-1)return new d({functionName:t});{const n=/((.*".+"[^@]*)?[^@]*)(?:@)/,i=t.match(n),c=i&&i[1]?i[1]:void 0,s=this.extractLocation(t.replace(n,""));return new d({functionName:c,fileName:s[0],lineNumber:s[1],columnNumber:s[2]})}},this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf(`
`)>-1&&e.message.split(`
`).length>e.stacktrace.split(`
`).length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(e){const r=/Line (\d+).*script (?:in )?(\S+)/i,t=e.message.split(`
`),n=[];for(let i=2,c=t.length;i<c;i+=2){const s=r.exec(t[i]);s&&n.push(new d({fileName:s[2],lineNumber:parseFloat(s[1])}))}return n},parseOpera10:function(e){const r=/Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i,t=e.stacktrace.split(`
`),n=[];for(let i=0,c=t.length;i<c;i+=2){const s=r.exec(t[i]);s&&n.push(new d({functionName:s[3]||void 0,fileName:s[2],lineNumber:parseFloat(s[1])}))}return n},parseOpera11:function(e){return e.stack.split(`
`).filter(function(t){return!!t.match(C)&&!t.match(/^Error created at/)},this).map(function(t){const n=t.split("@"),i=this.extractLocation(n.pop()),s=(n.shift()||"").replace(/<anonymous function(: (\w+))?>/,"$2").replace(/\([^)]*\)/g,"")||void 0;return new d({functionName:s,fileName:i[0],lineNumber:i[1],columnNumber:i[2]})},this)}};function T(e){if(!e||!e.outerHTML)return"";let r="";for(;e.parentElement;){let t=e.localName;if(!t)break;t=t.toLowerCase();const n=e.parentElement,i=[];if(n.children&&n.children.length>0)for(let c=0;c<n.children.length;c++){const s=n.children[c];s.localName&&s.localName.toLowerCase&&s.localName.toLowerCase()===t&&i.push(s)}i.length>1&&(t+=`:eq(${i.indexOf(e)})`),r=t+(r?">"+r:""),e=n}return r}function L(e){return Object.prototype.toString.call(e)==="[object Object]"}function w(e,r){if(r===0)return!0;const t=Object.keys(e);for(const n of t)if(L(e[n])&&w(e[n],r-1))return!0;return!1}function g(e,r){const t={numOfKeysLimit:50,depthOfLimit:4};Object.assign(t,r);const n=[],i=[];return JSON.stringify(e,function(a,o){if(n.length>0){const p=n.indexOf(this);~p?n.splice(p+1):n.push(this),~p?i.splice(p,1/0,a):i.push(a),~n.indexOf(o)&&(n[0]===o?o="[Circular ~]":o="[Circular ~."+i.slice(0,n.indexOf(o)).join(".")+"]")}else n.push(o);if(o===null)return o;if(o===void 0)return"undefined";if(c(o))return s(o);if(typeof o=="bigint")return o.toString()+"n";if(o instanceof Event){const p={};for(const l in o){const f=o[l];Array.isArray(f)?p[l]=T(f.length?f[0]:null):p[l]=f}return p}else{if(o instanceof Node)return o instanceof HTMLElement?o?o.outerHTML:"":o.nodeName;if(o instanceof Error)return o.stack?o.stack+`
End of stack for Error object`:o.name+": "+o.message}return o});function c(a){return!!(L(a)&&Object.keys(a).length>t.numOfKeysLimit||typeof a=="function"||L(a)&&w(a,t.depthOfLimit))}function s(a){let o=a.toString();return t.stringLengthLimit&&o.length>t.stringLengthLimit&&(o=`${o.slice(0,t.stringLengthLimit)}...`),o}}const x={level:["assert","clear","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],lengthThreshold:1e3,logger:"console"};function R(e,r,t){const n=t?Object.assign({},x,t):x,i=n.logger;if(!i)return()=>{};let c;typeof i=="string"?c=r[i]:c=i;let s=0,a=!1;const o=[];if(n.level.includes("error")){const l=m=>{const u=m.message,h=m.error,y=b.parse(h).map(O=>O.toString()),N=[g(u,n.stringifyOptions)];e({level:"error",trace:y,payload:N})};r.addEventListener("error",l),o.push(()=>{r.removeEventListener("error",l)});const f=m=>{let u,h;m.reason instanceof Error?(u=m.reason,h=[g(`Uncaught (in promise) ${u.name}: ${u.message}`,n.stringifyOptions)]):(u=new Error,h=[g("Uncaught (in promise)",n.stringifyOptions),g(m.reason,n.stringifyOptions)]);const y=b.parse(u).map(N=>N.toString());e({level:"error",trace:y,payload:h})};r.addEventListener("unhandledrejection",f),o.push(()=>{r.removeEventListener("unhandledrejection",f)})}for(const l of n.level)o.push(p(c,l));return()=>{o.forEach(l=>l())};function p(l,f){return l[f]?_(l,f,m=>(...u)=>{if(m.apply(this,u),!(f==="assert"&&u[0])&&!a){a=!0;try{const h=b.parse(new Error).map(O=>O.toString()).splice(1),N=(f==="assert"?u.slice(1):u).map(O=>g(O,n.stringifyOptions));s++,s<n.lengthThreshold?e({level:f,trace:h,payload:N}):s===n.lengthThreshold&&e({level:"warn",trace:[],payload:[g("The number of log records reached the threshold.")]})}catch(h){m("rrweb logger error:",h,...u)}finally{a=!1}}}):()=>{}}}const P="rrweb/console@1",I=e=>({name:P,observer:R,options:e});exports.PLUGIN_NAME=P;exports.getRecordConsolePlugin=I;
if (typeof module.exports == "object" && typeof exports == "object") {
var __cp = (to, from, except, desc) => {
if ((from && typeof from === "object") || typeof from === "function") {
for (let key of Object.getOwnPropertyNames(from)) {
if (!Object.prototype.hasOwnProperty.call(to, key) && key !== except)
Object.defineProperty(to, key, {
get: () => from[key],
enumerable: !(desc = Object.getOwnPropertyDescriptor(from, key)) || desc.enumerable,
});
}
}
return to;
};
module.exports = __cp(module.exports, exports);
}
return module.exports;
}))
//# sourceMappingURL=rrweb-plugin-console-record.umd.min.cjs.map
+1
-0

@@ -6,2 +6,3 @@ "use strict";

Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
if (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) ;
function patch(source, name, replacement) {

@@ -8,0 +9,0 @@ try {

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"rrweb-plugin-console-record.cjs","sources":["../../../utils/dist/utils.js","../src/error-stack-parser.ts","../src/stringify.ts","../src/index.ts"],"sourcesContent":["const testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n isAngularZonePresent,\n mutationObserverCtor,\n ownerDocument,\n parentElement,\n parentNode,\n patch,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=utils.js.map\n","/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return */\n/**\n * Class StackFrame is a fork of https://github.com/stacktracejs/stackframe/blob/master/stackframe.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n * 3. StackFrame contains some functions we don't need.\n */\nexport class StackFrame {\n private fileName: string;\n private functionName: string;\n private lineNumber?: number;\n private columnNumber?: number;\n\n constructor(obj: {\n fileName?: string;\n functionName?: string;\n lineNumber?: number;\n columnNumber?: number;\n }) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n\n toString() {\n const lineNumber = this.lineNumber || '';\n const columnNumber = this.columnNumber || '';\n if (this.functionName)\n return `${this.functionName} (${this.fileName}:${lineNumber}:${columnNumber})`;\n return `${this.fileName}:${lineNumber}:${columnNumber}`;\n }\n}\n\n/**\n * ErrorStackParser is a fork of https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n */\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nconst CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nexport const ErrorStackParser = {\n /**\n * Given an Error object, extract the most information from it.\n */\n parse: function (error: Error): StackFrame[] {\n // https://github.com/rrweb-io/rrweb/issues/782\n if (!error) {\n return [];\n }\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error.stacktrace !== 'undefined' ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error['opera#sourceloc'] !== 'undefined'\n ) {\n return this.parseOpera(\n error as {\n stacktrace?: string;\n message: string;\n stack?: string;\n },\n );\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error as { stack: string });\n } else if (error.stack) {\n return this.parseFFOrSafari(error as { stack: string });\n } else {\n console.warn(\n '[console-record-plugin]: Failed to parse error object:',\n error,\n );\n return [];\n }\n },\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function (urlLike: string) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n const regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n const parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts) throw new Error(`Cannot parse given url: ${urlLike}`);\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n let sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n\n // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n const location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n\n // remove the parenthesized location from the line, if it was matched\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n\n const tokens = sanitizedLine.split(/\\s+/).slice(1);\n // if a location was matched, pass it to extractLocation() otherwise pop the last token\n const locationParts = this.extractLocation(\n location ? location[1] : tokens.pop(),\n );\n const functionName = tokens.join(' ') || undefined;\n const fileName =\n ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n\n return new StackFrame({\n functionName,\n fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1',\n );\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line,\n });\n } else {\n const functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n const matches = line.match(functionNameRegex);\n const functionName = matches && matches[1] ? matches[1] : undefined;\n const locationParts = this.extractLocation(\n line.replace(functionNameRegex, ''),\n );\n\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e: {\n stacktrace?: string;\n message: string;\n stack?: string;\n }): StackFrame[] {\n if (\n !e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)\n ) {\n return this.parseOpera9(e as { message: string });\n } else if (!e.stack) {\n return this.parseOpera10(e as { stacktrace: string });\n } else {\n return this.parseOpera11(e as { stack: string });\n }\n },\n parseOpera9: function (e: { message: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n const lines = e.message.split('\\n');\n const result = [];\n\n for (let i = 2, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n parseOpera10: function (e: { stacktrace: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n const lines = e.stacktrace.split('\\n');\n const result = [];\n\n for (let i = 0, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return (\n !!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/)\n );\n }, this);\n\n return filtered.map(function (line: string) {\n const tokens = line.split('@');\n const locationParts = this.extractLocation(tokens.pop());\n const functionCall = tokens.shift() || '';\n const functionName =\n functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n","/**\n * this file is used to serialize log message to string\n *\n */\n\nimport type { StringifyOptions } from './index';\n\n/**\n * transfer the node path in Event to string\n * @param node - the first node in a node path array\n */\nfunction pathToSelector(node: HTMLElement): string | '' {\n if (!node || !node.outerHTML) {\n return '';\n }\n\n let path = '';\n while (node.parentElement) {\n let name = node.localName;\n if (!name) {\n break;\n }\n name = name.toLowerCase();\n const parent = node.parentElement;\n\n const domSiblings = [];\n\n if (parent.children && parent.children.length > 0) {\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n\n if (domSiblings.length > 1) {\n name += `:eq(${domSiblings.indexOf(node)})`;\n }\n path = name + (path ? '>' + path : '');\n node = parent;\n }\n\n return path;\n}\n\n/**\n * judge is object\n */\nfunction isObject(obj: unknown): boolean {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * judge the object's depth\n */\nfunction isObjTooDeep(obj: Record<string, unknown>, limit: number): boolean {\n if (limit === 0) {\n return true;\n }\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (\n isObject(obj[key]) &&\n isObjTooDeep(obj[key] as Record<string, unknown>, limit - 1)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * stringify any js object\n * @param obj - the object to stringify\n */\nexport function stringify(\n obj: unknown,\n stringifyOptions?: StringifyOptions,\n): string {\n const options: StringifyOptions = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n const stack: unknown[] = [];\n const keys: unknown[] = [];\n return JSON.stringify(\n obj,\n function (key, value: string | bigint | object | null | undefined) {\n /**\n * forked from https://github.com/moll/json-stringify-safe/blob/master/stringify.js\n * to deCycle the object\n */\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n } else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n } else {\n stack.push(value);\n }\n /* END of the FORK */\n\n if (value === null) return value;\n if (value === undefined) return 'undefined';\n if (shouldIgnore(value as object)) {\n return toString(value as object);\n }\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n if (value instanceof Event) {\n const eventResult: Record<string, unknown> = {};\n for (const eventKey in value) {\n const eventValue = (value as unknown as Record<string, unknown>)[\n eventKey\n ];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(\n (eventValue.length ? eventValue[0] : null) as HTMLElement,\n );\n } else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n } else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n } else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n },\n );\n\n /**\n * whether we should ignore obj's info and call toString() function instead\n */\n function shouldIgnore(_obj: object): boolean {\n // outof keys limit\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n\n // is function or bigint\n if (typeof _obj === 'function') {\n return true;\n }\n\n /**\n * judge object's depth to avoid browser's OOM\n *\n * issues: https://github.com/rrweb-io/rrweb/issues/653\n */\n if (\n isObject(_obj) &&\n isObjTooDeep(_obj as Record<string, unknown>, options.depthOfLimit)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * limit the toString() result according to option\n */\n function toString(_obj: object): string {\n let str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = `${str.slice(0, options.stringLengthLimit)}...`;\n }\n return str;\n }\n}\n","import type { listenerHandler, RecordPlugin, IWindow } from '@rrweb/types';\nimport { patch } from '@rrweb/utils';\nimport { ErrorStackParser, StackFrame } from './error-stack-parser';\nimport { stringify } from './stringify';\n\nexport type StringifyOptions = {\n // limit of string length\n stringLengthLimit?: number;\n /**\n * limit of number of keys in an object\n * if an object contains more keys than this limit, we would call its toString function directly\n */\n numOfKeysLimit: number;\n /**\n * limit number of depth in an object\n * if an object is too deep, toString process may cause browser OOM\n */\n depthOfLimit: number;\n};\n\ntype LogRecordOptions = {\n level?: LogLevel[];\n lengthThreshold?: number;\n stringifyOptions?: StringifyOptions;\n logger?: Logger | 'console';\n};\n\nconst defaultLogOptions: LogRecordOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\n\nexport type LogData = {\n level: LogLevel;\n trace: string[];\n payload: string[];\n};\n\ntype logCallback = (p: LogData) => void;\n\n/* fork from interface Console */\n// all kinds of console functions\nexport type Logger = {\n assert?: typeof console.assert;\n clear?: typeof console.clear;\n count?: typeof console.count;\n countReset?: typeof console.countReset;\n debug?: typeof console.debug;\n dir?: typeof console.dir;\n dirxml?: typeof console.dirxml;\n error?: typeof console.error;\n group?: typeof console.group;\n groupCollapsed?: typeof console.groupCollapsed;\n groupEnd?: () => void;\n info?: typeof console.info;\n log?: typeof console.log;\n table?: typeof console.table;\n time?: typeof console.time;\n timeEnd?: typeof console.timeEnd;\n timeLog?: typeof console.timeLog;\n trace?: typeof console.trace;\n warn?: typeof console.warn;\n};\n\nexport type LogLevel = keyof Logger;\n\nfunction initLogObserver(\n cb: logCallback,\n win: IWindow, // top window or in an iframe\n options: LogRecordOptions,\n): listenerHandler {\n const logOptions = (\n options ? Object.assign({}, defaultLogOptions, options) : defaultLogOptions\n ) as {\n level: LogLevel[];\n lengthThreshold: number;\n stringifyOptions?: StringifyOptions;\n logger: Logger | 'console';\n };\n const loggerType = logOptions.logger;\n if (!loggerType) {\n return () => {\n //\n };\n }\n let logger: Logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n } else {\n logger = loggerType;\n }\n let logCount = 0;\n let inStack = false;\n const cancelHandlers: listenerHandler[] = [];\n // add listener to thrown errors\n if (logOptions.level.includes('error')) {\n const errorHandler = (event: ErrorEvent) => {\n const message = event.message,\n error = event.error as Error;\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n const payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('error', errorHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('error', errorHandler);\n });\n const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {\n let error: Error;\n let payload: string[];\n if (event.reason instanceof Error) {\n error = event.reason;\n payload = [\n stringify(\n `Uncaught (in promise) ${error.name}: ${error.message}`,\n logOptions.stringifyOptions,\n ),\n ];\n } else {\n error = new Error();\n payload = [\n stringify('Uncaught (in promise)', logOptions.stringifyOptions),\n stringify(event.reason, logOptions.stringifyOptions),\n ];\n }\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('unhandledrejection', unhandledrejectionHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('unhandledrejection', unhandledrejectionHandler);\n });\n }\n for (const levelType of logOptions.level) {\n cancelHandlers.push(replace(logger, levelType));\n }\n return () => {\n cancelHandlers.forEach((h) => h());\n };\n\n /**\n * replace the original console function and record logs\n * @param logger - the logger object such as Console\n * @param level - the name of log function to be replaced\n */\n function replace(_logger: Logger, level: LogLevel) {\n if (!_logger[level]) {\n return () => {\n //\n };\n }\n // replace the logger.{level}. return a restore function\n return patch(\n _logger,\n level,\n (original: (...args: Array<unknown>) => void) => {\n return (...args: Array<unknown>) => {\n original.apply(this, args);\n\n if (level === 'assert' && !!args[0]) {\n // assert does not log if the first argument evaluates to true\n return;\n }\n\n if (inStack) {\n // If we are already in a stack this means something from the following code is calling a console method\n // likely a proxy method called from stringify. We don't want to log this as it will cause an infinite loop\n return;\n }\n inStack = true;\n try {\n const trace = ErrorStackParser.parse(new Error())\n .map((stackFrame: StackFrame) => stackFrame.toString())\n .splice(1); // splice(1) to omit the hijacked log function\n\n // assert does not log its first arg, that's only used for deciding whether to log\n const argsForPayload = level === 'assert' ? args.slice(1) : args;\n\n const payload = argsForPayload.map((s) =>\n stringify(s, logOptions.stringifyOptions),\n );\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level,\n trace,\n payload,\n });\n } else if (logCount === logOptions.lengthThreshold) {\n // notify the user\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n } catch (error) {\n original('rrweb logger error:', error, ...args);\n } finally {\n inStack = false;\n }\n };\n },\n );\n }\n}\n\nexport const PLUGIN_NAME = 'rrweb/console@1';\n\nexport const getRecordConsolePlugin: (\n options?: LogRecordOptions,\n) => RecordPlugin = (options) => ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options,\n});\n"],"names":[],"mappings":"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"}
{"version":3,"file":"rrweb-plugin-console-record.cjs","sources":["../../../utils/dist/utils.js","../src/error-stack-parser.ts","../src/stringify.ts","../src/index.ts"],"sourcesContent":["const testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nlet nowTimestamp = Date.now;\nif (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) {\n nowTimestamp = () => (/* @__PURE__ */ new Date()).getTime();\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n nowTimestamp,\n patch\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n isAngularZonePresent,\n mutationObserverCtor,\n nowTimestamp,\n ownerDocument,\n parentElement,\n parentNode,\n patch,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=utils.js.map\n","/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return */\n/**\n * Class StackFrame is a fork of https://github.com/stacktracejs/stackframe/blob/master/stackframe.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n * 3. StackFrame contains some functions we don't need.\n */\nexport class StackFrame {\n private fileName: string;\n private functionName: string;\n private lineNumber?: number;\n private columnNumber?: number;\n\n constructor(obj: {\n fileName?: string;\n functionName?: string;\n lineNumber?: number;\n columnNumber?: number;\n }) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n\n toString() {\n const lineNumber = this.lineNumber || '';\n const columnNumber = this.columnNumber || '';\n if (this.functionName)\n return `${this.functionName} (${this.fileName}:${lineNumber}:${columnNumber})`;\n return `${this.fileName}:${lineNumber}:${columnNumber}`;\n }\n}\n\n/**\n * ErrorStackParser is a fork of https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n */\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nconst CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nexport const ErrorStackParser = {\n /**\n * Given an Error object, extract the most information from it.\n */\n parse: function (error: Error): StackFrame[] {\n // https://github.com/rrweb-io/rrweb/issues/782\n if (!error) {\n return [];\n }\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error.stacktrace !== 'undefined' ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error['opera#sourceloc'] !== 'undefined'\n ) {\n return this.parseOpera(\n error as {\n stacktrace?: string;\n message: string;\n stack?: string;\n },\n );\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error as { stack: string });\n } else if (error.stack) {\n return this.parseFFOrSafari(error as { stack: string });\n } else {\n console.warn(\n '[console-record-plugin]: Failed to parse error object:',\n error,\n );\n return [];\n }\n },\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function (urlLike: string) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n const regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n const parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts) throw new Error(`Cannot parse given url: ${urlLike}`);\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n let sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n\n // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n const location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n\n // remove the parenthesized location from the line, if it was matched\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n\n const tokens = sanitizedLine.split(/\\s+/).slice(1);\n // if a location was matched, pass it to extractLocation() otherwise pop the last token\n const locationParts = this.extractLocation(\n location ? location[1] : tokens.pop(),\n );\n const functionName = tokens.join(' ') || undefined;\n const fileName =\n ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n\n return new StackFrame({\n functionName,\n fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1',\n );\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line,\n });\n } else {\n const functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n const matches = line.match(functionNameRegex);\n const functionName = matches && matches[1] ? matches[1] : undefined;\n const locationParts = this.extractLocation(\n line.replace(functionNameRegex, ''),\n );\n\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e: {\n stacktrace?: string;\n message: string;\n stack?: string;\n }): StackFrame[] {\n if (\n !e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)\n ) {\n return this.parseOpera9(e as { message: string });\n } else if (!e.stack) {\n return this.parseOpera10(e as { stacktrace: string });\n } else {\n return this.parseOpera11(e as { stack: string });\n }\n },\n parseOpera9: function (e: { message: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n const lines = e.message.split('\\n');\n const result = [];\n\n for (let i = 2, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n parseOpera10: function (e: { stacktrace: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n const lines = e.stacktrace.split('\\n');\n const result = [];\n\n for (let i = 0, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return (\n !!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/)\n );\n }, this);\n\n return filtered.map(function (line: string) {\n const tokens = line.split('@');\n const locationParts = this.extractLocation(tokens.pop());\n const functionCall = tokens.shift() || '';\n const functionName =\n functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n","/**\n * this file is used to serialize log message to string\n *\n */\n\nimport type { StringifyOptions } from './index';\n\n/**\n * transfer the node path in Event to string\n * @param node - the first node in a node path array\n */\nfunction pathToSelector(node: HTMLElement): string | '' {\n if (!node || !node.outerHTML) {\n return '';\n }\n\n let path = '';\n while (node.parentElement) {\n let name = node.localName;\n if (!name) {\n break;\n }\n name = name.toLowerCase();\n const parent = node.parentElement;\n\n const domSiblings = [];\n\n if (parent.children && parent.children.length > 0) {\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n\n if (domSiblings.length > 1) {\n name += `:eq(${domSiblings.indexOf(node)})`;\n }\n path = name + (path ? '>' + path : '');\n node = parent;\n }\n\n return path;\n}\n\n/**\n * judge is object\n */\nfunction isObject(obj: unknown): boolean {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * judge the object's depth\n */\nfunction isObjTooDeep(obj: Record<string, unknown>, limit: number): boolean {\n if (limit === 0) {\n return true;\n }\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (\n isObject(obj[key]) &&\n isObjTooDeep(obj[key] as Record<string, unknown>, limit - 1)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * stringify any js object\n * @param obj - the object to stringify\n */\nexport function stringify(\n obj: unknown,\n stringifyOptions?: StringifyOptions,\n): string {\n const options: StringifyOptions = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n const stack: unknown[] = [];\n const keys: unknown[] = [];\n return JSON.stringify(\n obj,\n function (key, value: string | bigint | object | null | undefined) {\n /**\n * forked from https://github.com/moll/json-stringify-safe/blob/master/stringify.js\n * to deCycle the object\n */\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n } else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n } else {\n stack.push(value);\n }\n /* END of the FORK */\n\n if (value === null) return value;\n if (value === undefined) return 'undefined';\n if (shouldIgnore(value as object)) {\n return toString(value as object);\n }\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n if (value instanceof Event) {\n const eventResult: Record<string, unknown> = {};\n for (const eventKey in value) {\n const eventValue = (value as unknown as Record<string, unknown>)[\n eventKey\n ];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(\n (eventValue.length ? eventValue[0] : null) as HTMLElement,\n );\n } else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n } else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n } else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n },\n );\n\n /**\n * whether we should ignore obj's info and call toString() function instead\n */\n function shouldIgnore(_obj: object): boolean {\n // outof keys limit\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n\n // is function or bigint\n if (typeof _obj === 'function') {\n return true;\n }\n\n /**\n * judge object's depth to avoid browser's OOM\n *\n * issues: https://github.com/rrweb-io/rrweb/issues/653\n */\n if (\n isObject(_obj) &&\n isObjTooDeep(_obj as Record<string, unknown>, options.depthOfLimit)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * limit the toString() result according to option\n */\n function toString(_obj: object): string {\n let str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = `${str.slice(0, options.stringLengthLimit)}...`;\n }\n return str;\n }\n}\n","import type { listenerHandler, RecordPlugin, IWindow } from '@rrweb/types';\nimport { patch } from '@rrweb/utils';\nimport { ErrorStackParser, StackFrame } from './error-stack-parser';\nimport { stringify } from './stringify';\n\nexport type StringifyOptions = {\n // limit of string length\n stringLengthLimit?: number;\n /**\n * limit of number of keys in an object\n * if an object contains more keys than this limit, we would call its toString function directly\n */\n numOfKeysLimit: number;\n /**\n * limit number of depth in an object\n * if an object is too deep, toString process may cause browser OOM\n */\n depthOfLimit: number;\n};\n\ntype LogRecordOptions = {\n level?: LogLevel[];\n lengthThreshold?: number;\n stringifyOptions?: StringifyOptions;\n logger?: Logger | 'console';\n};\n\nconst defaultLogOptions: LogRecordOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\n\nexport type LogData = {\n level: LogLevel;\n trace: string[];\n payload: string[];\n};\n\ntype logCallback = (p: LogData) => void;\n\n/* fork from interface Console */\n// all kinds of console functions\nexport type Logger = {\n assert?: typeof console.assert;\n clear?: typeof console.clear;\n count?: typeof console.count;\n countReset?: typeof console.countReset;\n debug?: typeof console.debug;\n dir?: typeof console.dir;\n dirxml?: typeof console.dirxml;\n error?: typeof console.error;\n group?: typeof console.group;\n groupCollapsed?: typeof console.groupCollapsed;\n groupEnd?: () => void;\n info?: typeof console.info;\n log?: typeof console.log;\n table?: typeof console.table;\n time?: typeof console.time;\n timeEnd?: typeof console.timeEnd;\n timeLog?: typeof console.timeLog;\n trace?: typeof console.trace;\n warn?: typeof console.warn;\n};\n\nexport type LogLevel = keyof Logger;\n\nfunction initLogObserver(\n cb: logCallback,\n win: IWindow, // top window or in an iframe\n options: LogRecordOptions,\n): listenerHandler {\n const logOptions = (\n options ? Object.assign({}, defaultLogOptions, options) : defaultLogOptions\n ) as {\n level: LogLevel[];\n lengthThreshold: number;\n stringifyOptions?: StringifyOptions;\n logger: Logger | 'console';\n };\n const loggerType = logOptions.logger;\n if (!loggerType) {\n return () => {\n //\n };\n }\n let logger: Logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n } else {\n logger = loggerType;\n }\n let logCount = 0;\n let inStack = false;\n const cancelHandlers: listenerHandler[] = [];\n // add listener to thrown errors\n if (logOptions.level.includes('error')) {\n const errorHandler = (event: ErrorEvent) => {\n const message = event.message,\n error = event.error as Error;\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n const payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('error', errorHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('error', errorHandler);\n });\n const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {\n let error: Error;\n let payload: string[];\n if (event.reason instanceof Error) {\n error = event.reason;\n payload = [\n stringify(\n `Uncaught (in promise) ${error.name}: ${error.message}`,\n logOptions.stringifyOptions,\n ),\n ];\n } else {\n error = new Error();\n payload = [\n stringify('Uncaught (in promise)', logOptions.stringifyOptions),\n stringify(event.reason, logOptions.stringifyOptions),\n ];\n }\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('unhandledrejection', unhandledrejectionHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('unhandledrejection', unhandledrejectionHandler);\n });\n }\n for (const levelType of logOptions.level) {\n cancelHandlers.push(replace(logger, levelType));\n }\n return () => {\n cancelHandlers.forEach((h) => h());\n };\n\n /**\n * replace the original console function and record logs\n * @param logger - the logger object such as Console\n * @param level - the name of log function to be replaced\n */\n function replace(_logger: Logger, level: LogLevel) {\n if (!_logger[level]) {\n return () => {\n //\n };\n }\n // replace the logger.{level}. return a restore function\n return patch(\n _logger,\n level,\n (original: (...args: Array<unknown>) => void) => {\n return (...args: Array<unknown>) => {\n original.apply(this, args);\n\n if (level === 'assert' && !!args[0]) {\n // assert does not log if the first argument evaluates to true\n return;\n }\n\n if (inStack) {\n // If we are already in a stack this means something from the following code is calling a console method\n // likely a proxy method called from stringify. We don't want to log this as it will cause an infinite loop\n return;\n }\n inStack = true;\n try {\n const trace = ErrorStackParser.parse(new Error())\n .map((stackFrame: StackFrame) => stackFrame.toString())\n .splice(1); // splice(1) to omit the hijacked log function\n\n // assert does not log its first arg, that's only used for deciding whether to log\n const argsForPayload = level === 'assert' ? args.slice(1) : args;\n\n const payload = argsForPayload.map((s) =>\n stringify(s, logOptions.stringifyOptions),\n );\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level,\n trace,\n payload,\n });\n } else if (logCount === logOptions.lengthThreshold) {\n // notify the user\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n } catch (error) {\n original('rrweb logger error:', error, ...args);\n } finally {\n inStack = false;\n }\n };\n },\n );\n }\n}\n\nexport const PLUGIN_NAME = 'rrweb/console@1';\n\nexport const getRecordConsolePlugin: (\n options?: LogRecordOptions,\n) => RecordPlugin = (options) => ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options,\n});\n"],"names":[],"mappings":"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"}
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
if (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) ;
function patch(source, name, replacement) {

@@ -5,0 +6,0 @@ try {

@@ -1,1 +0,1 @@

{"version":3,"file":"rrweb-plugin-console-record.js","sources":["../../../utils/dist/utils.js","../src/error-stack-parser.ts","../src/stringify.ts","../src/index.ts"],"sourcesContent":["const testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n isAngularZonePresent,\n mutationObserverCtor,\n ownerDocument,\n parentElement,\n parentNode,\n patch,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=utils.js.map\n","/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return */\n/**\n * Class StackFrame is a fork of https://github.com/stacktracejs/stackframe/blob/master/stackframe.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n * 3. StackFrame contains some functions we don't need.\n */\nexport class StackFrame {\n private fileName: string;\n private functionName: string;\n private lineNumber?: number;\n private columnNumber?: number;\n\n constructor(obj: {\n fileName?: string;\n functionName?: string;\n lineNumber?: number;\n columnNumber?: number;\n }) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n\n toString() {\n const lineNumber = this.lineNumber || '';\n const columnNumber = this.columnNumber || '';\n if (this.functionName)\n return `${this.functionName} (${this.fileName}:${lineNumber}:${columnNumber})`;\n return `${this.fileName}:${lineNumber}:${columnNumber}`;\n }\n}\n\n/**\n * ErrorStackParser is a fork of https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n */\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nconst CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nexport const ErrorStackParser = {\n /**\n * Given an Error object, extract the most information from it.\n */\n parse: function (error: Error): StackFrame[] {\n // https://github.com/rrweb-io/rrweb/issues/782\n if (!error) {\n return [];\n }\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error.stacktrace !== 'undefined' ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error['opera#sourceloc'] !== 'undefined'\n ) {\n return this.parseOpera(\n error as {\n stacktrace?: string;\n message: string;\n stack?: string;\n },\n );\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error as { stack: string });\n } else if (error.stack) {\n return this.parseFFOrSafari(error as { stack: string });\n } else {\n console.warn(\n '[console-record-plugin]: Failed to parse error object:',\n error,\n );\n return [];\n }\n },\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function (urlLike: string) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n const regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n const parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts) throw new Error(`Cannot parse given url: ${urlLike}`);\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n let sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n\n // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n const location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n\n // remove the parenthesized location from the line, if it was matched\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n\n const tokens = sanitizedLine.split(/\\s+/).slice(1);\n // if a location was matched, pass it to extractLocation() otherwise pop the last token\n const locationParts = this.extractLocation(\n location ? location[1] : tokens.pop(),\n );\n const functionName = tokens.join(' ') || undefined;\n const fileName =\n ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n\n return new StackFrame({\n functionName,\n fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1',\n );\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line,\n });\n } else {\n const functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n const matches = line.match(functionNameRegex);\n const functionName = matches && matches[1] ? matches[1] : undefined;\n const locationParts = this.extractLocation(\n line.replace(functionNameRegex, ''),\n );\n\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e: {\n stacktrace?: string;\n message: string;\n stack?: string;\n }): StackFrame[] {\n if (\n !e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)\n ) {\n return this.parseOpera9(e as { message: string });\n } else if (!e.stack) {\n return this.parseOpera10(e as { stacktrace: string });\n } else {\n return this.parseOpera11(e as { stack: string });\n }\n },\n parseOpera9: function (e: { message: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n const lines = e.message.split('\\n');\n const result = [];\n\n for (let i = 2, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n parseOpera10: function (e: { stacktrace: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n const lines = e.stacktrace.split('\\n');\n const result = [];\n\n for (let i = 0, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return (\n !!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/)\n );\n }, this);\n\n return filtered.map(function (line: string) {\n const tokens = line.split('@');\n const locationParts = this.extractLocation(tokens.pop());\n const functionCall = tokens.shift() || '';\n const functionName =\n functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n","/**\n * this file is used to serialize log message to string\n *\n */\n\nimport type { StringifyOptions } from './index';\n\n/**\n * transfer the node path in Event to string\n * @param node - the first node in a node path array\n */\nfunction pathToSelector(node: HTMLElement): string | '' {\n if (!node || !node.outerHTML) {\n return '';\n }\n\n let path = '';\n while (node.parentElement) {\n let name = node.localName;\n if (!name) {\n break;\n }\n name = name.toLowerCase();\n const parent = node.parentElement;\n\n const domSiblings = [];\n\n if (parent.children && parent.children.length > 0) {\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n\n if (domSiblings.length > 1) {\n name += `:eq(${domSiblings.indexOf(node)})`;\n }\n path = name + (path ? '>' + path : '');\n node = parent;\n }\n\n return path;\n}\n\n/**\n * judge is object\n */\nfunction isObject(obj: unknown): boolean {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * judge the object's depth\n */\nfunction isObjTooDeep(obj: Record<string, unknown>, limit: number): boolean {\n if (limit === 0) {\n return true;\n }\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (\n isObject(obj[key]) &&\n isObjTooDeep(obj[key] as Record<string, unknown>, limit - 1)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * stringify any js object\n * @param obj - the object to stringify\n */\nexport function stringify(\n obj: unknown,\n stringifyOptions?: StringifyOptions,\n): string {\n const options: StringifyOptions = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n const stack: unknown[] = [];\n const keys: unknown[] = [];\n return JSON.stringify(\n obj,\n function (key, value: string | bigint | object | null | undefined) {\n /**\n * forked from https://github.com/moll/json-stringify-safe/blob/master/stringify.js\n * to deCycle the object\n */\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n } else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n } else {\n stack.push(value);\n }\n /* END of the FORK */\n\n if (value === null) return value;\n if (value === undefined) return 'undefined';\n if (shouldIgnore(value as object)) {\n return toString(value as object);\n }\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n if (value instanceof Event) {\n const eventResult: Record<string, unknown> = {};\n for (const eventKey in value) {\n const eventValue = (value as unknown as Record<string, unknown>)[\n eventKey\n ];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(\n (eventValue.length ? eventValue[0] : null) as HTMLElement,\n );\n } else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n } else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n } else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n },\n );\n\n /**\n * whether we should ignore obj's info and call toString() function instead\n */\n function shouldIgnore(_obj: object): boolean {\n // outof keys limit\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n\n // is function or bigint\n if (typeof _obj === 'function') {\n return true;\n }\n\n /**\n * judge object's depth to avoid browser's OOM\n *\n * issues: https://github.com/rrweb-io/rrweb/issues/653\n */\n if (\n isObject(_obj) &&\n isObjTooDeep(_obj as Record<string, unknown>, options.depthOfLimit)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * limit the toString() result according to option\n */\n function toString(_obj: object): string {\n let str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = `${str.slice(0, options.stringLengthLimit)}...`;\n }\n return str;\n }\n}\n","import type { listenerHandler, RecordPlugin, IWindow } from '@rrweb/types';\nimport { patch } from '@rrweb/utils';\nimport { ErrorStackParser, StackFrame } from './error-stack-parser';\nimport { stringify } from './stringify';\n\nexport type StringifyOptions = {\n // limit of string length\n stringLengthLimit?: number;\n /**\n * limit of number of keys in an object\n * if an object contains more keys than this limit, we would call its toString function directly\n */\n numOfKeysLimit: number;\n /**\n * limit number of depth in an object\n * if an object is too deep, toString process may cause browser OOM\n */\n depthOfLimit: number;\n};\n\ntype LogRecordOptions = {\n level?: LogLevel[];\n lengthThreshold?: number;\n stringifyOptions?: StringifyOptions;\n logger?: Logger | 'console';\n};\n\nconst defaultLogOptions: LogRecordOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\n\nexport type LogData = {\n level: LogLevel;\n trace: string[];\n payload: string[];\n};\n\ntype logCallback = (p: LogData) => void;\n\n/* fork from interface Console */\n// all kinds of console functions\nexport type Logger = {\n assert?: typeof console.assert;\n clear?: typeof console.clear;\n count?: typeof console.count;\n countReset?: typeof console.countReset;\n debug?: typeof console.debug;\n dir?: typeof console.dir;\n dirxml?: typeof console.dirxml;\n error?: typeof console.error;\n group?: typeof console.group;\n groupCollapsed?: typeof console.groupCollapsed;\n groupEnd?: () => void;\n info?: typeof console.info;\n log?: typeof console.log;\n table?: typeof console.table;\n time?: typeof console.time;\n timeEnd?: typeof console.timeEnd;\n timeLog?: typeof console.timeLog;\n trace?: typeof console.trace;\n warn?: typeof console.warn;\n};\n\nexport type LogLevel = keyof Logger;\n\nfunction initLogObserver(\n cb: logCallback,\n win: IWindow, // top window or in an iframe\n options: LogRecordOptions,\n): listenerHandler {\n const logOptions = (\n options ? Object.assign({}, defaultLogOptions, options) : defaultLogOptions\n ) as {\n level: LogLevel[];\n lengthThreshold: number;\n stringifyOptions?: StringifyOptions;\n logger: Logger | 'console';\n };\n const loggerType = logOptions.logger;\n if (!loggerType) {\n return () => {\n //\n };\n }\n let logger: Logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n } else {\n logger = loggerType;\n }\n let logCount = 0;\n let inStack = false;\n const cancelHandlers: listenerHandler[] = [];\n // add listener to thrown errors\n if (logOptions.level.includes('error')) {\n const errorHandler = (event: ErrorEvent) => {\n const message = event.message,\n error = event.error as Error;\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n const payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('error', errorHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('error', errorHandler);\n });\n const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {\n let error: Error;\n let payload: string[];\n if (event.reason instanceof Error) {\n error = event.reason;\n payload = [\n stringify(\n `Uncaught (in promise) ${error.name}: ${error.message}`,\n logOptions.stringifyOptions,\n ),\n ];\n } else {\n error = new Error();\n payload = [\n stringify('Uncaught (in promise)', logOptions.stringifyOptions),\n stringify(event.reason, logOptions.stringifyOptions),\n ];\n }\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('unhandledrejection', unhandledrejectionHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('unhandledrejection', unhandledrejectionHandler);\n });\n }\n for (const levelType of logOptions.level) {\n cancelHandlers.push(replace(logger, levelType));\n }\n return () => {\n cancelHandlers.forEach((h) => h());\n };\n\n /**\n * replace the original console function and record logs\n * @param logger - the logger object such as Console\n * @param level - the name of log function to be replaced\n */\n function replace(_logger: Logger, level: LogLevel) {\n if (!_logger[level]) {\n return () => {\n //\n };\n }\n // replace the logger.{level}. return a restore function\n return patch(\n _logger,\n level,\n (original: (...args: Array<unknown>) => void) => {\n return (...args: Array<unknown>) => {\n original.apply(this, args);\n\n if (level === 'assert' && !!args[0]) {\n // assert does not log if the first argument evaluates to true\n return;\n }\n\n if (inStack) {\n // If we are already in a stack this means something from the following code is calling a console method\n // likely a proxy method called from stringify. We don't want to log this as it will cause an infinite loop\n return;\n }\n inStack = true;\n try {\n const trace = ErrorStackParser.parse(new Error())\n .map((stackFrame: StackFrame) => stackFrame.toString())\n .splice(1); // splice(1) to omit the hijacked log function\n\n // assert does not log its first arg, that's only used for deciding whether to log\n const argsForPayload = level === 'assert' ? args.slice(1) : args;\n\n const payload = argsForPayload.map((s) =>\n stringify(s, logOptions.stringifyOptions),\n );\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level,\n trace,\n payload,\n });\n } else if (logCount === logOptions.lengthThreshold) {\n // notify the user\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n } catch (error) {\n original('rrweb logger error:', error, ...args);\n } finally {\n inStack = false;\n }\n };\n },\n );\n }\n}\n\nexport const PLUGIN_NAME = 'rrweb/console@1';\n\nexport const getRecordConsolePlugin: (\n options?: LogRecordOptions,\n) => RecordPlugin = (options) => ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options,\n});\n"],"names":[],"mappings":"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"}
{"version":3,"file":"rrweb-plugin-console-record.js","sources":["../../../utils/dist/utils.js","../src/error-stack-parser.ts","../src/stringify.ts","../src/index.ts"],"sourcesContent":["const testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nlet nowTimestamp = Date.now;\nif (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) {\n nowTimestamp = () => (/* @__PURE__ */ new Date()).getTime();\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n nowTimestamp,\n patch\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n isAngularZonePresent,\n mutationObserverCtor,\n nowTimestamp,\n ownerDocument,\n parentElement,\n parentNode,\n patch,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=utils.js.map\n","/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return */\n/**\n * Class StackFrame is a fork of https://github.com/stacktracejs/stackframe/blob/master/stackframe.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n * 3. StackFrame contains some functions we don't need.\n */\nexport class StackFrame {\n private fileName: string;\n private functionName: string;\n private lineNumber?: number;\n private columnNumber?: number;\n\n constructor(obj: {\n fileName?: string;\n functionName?: string;\n lineNumber?: number;\n columnNumber?: number;\n }) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n\n toString() {\n const lineNumber = this.lineNumber || '';\n const columnNumber = this.columnNumber || '';\n if (this.functionName)\n return `${this.functionName} (${this.fileName}:${lineNumber}:${columnNumber})`;\n return `${this.fileName}:${lineNumber}:${columnNumber}`;\n }\n}\n\n/**\n * ErrorStackParser is a fork of https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n */\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nconst CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nexport const ErrorStackParser = {\n /**\n * Given an Error object, extract the most information from it.\n */\n parse: function (error: Error): StackFrame[] {\n // https://github.com/rrweb-io/rrweb/issues/782\n if (!error) {\n return [];\n }\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error.stacktrace !== 'undefined' ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error['opera#sourceloc'] !== 'undefined'\n ) {\n return this.parseOpera(\n error as {\n stacktrace?: string;\n message: string;\n stack?: string;\n },\n );\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error as { stack: string });\n } else if (error.stack) {\n return this.parseFFOrSafari(error as { stack: string });\n } else {\n console.warn(\n '[console-record-plugin]: Failed to parse error object:',\n error,\n );\n return [];\n }\n },\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function (urlLike: string) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n const regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n const parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts) throw new Error(`Cannot parse given url: ${urlLike}`);\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n let sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n\n // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n const location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n\n // remove the parenthesized location from the line, if it was matched\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n\n const tokens = sanitizedLine.split(/\\s+/).slice(1);\n // if a location was matched, pass it to extractLocation() otherwise pop the last token\n const locationParts = this.extractLocation(\n location ? location[1] : tokens.pop(),\n );\n const functionName = tokens.join(' ') || undefined;\n const fileName =\n ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n\n return new StackFrame({\n functionName,\n fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1',\n );\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line,\n });\n } else {\n const functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n const matches = line.match(functionNameRegex);\n const functionName = matches && matches[1] ? matches[1] : undefined;\n const locationParts = this.extractLocation(\n line.replace(functionNameRegex, ''),\n );\n\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e: {\n stacktrace?: string;\n message: string;\n stack?: string;\n }): StackFrame[] {\n if (\n !e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)\n ) {\n return this.parseOpera9(e as { message: string });\n } else if (!e.stack) {\n return this.parseOpera10(e as { stacktrace: string });\n } else {\n return this.parseOpera11(e as { stack: string });\n }\n },\n parseOpera9: function (e: { message: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n const lines = e.message.split('\\n');\n const result = [];\n\n for (let i = 2, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n parseOpera10: function (e: { stacktrace: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n const lines = e.stacktrace.split('\\n');\n const result = [];\n\n for (let i = 0, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return (\n !!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/)\n );\n }, this);\n\n return filtered.map(function (line: string) {\n const tokens = line.split('@');\n const locationParts = this.extractLocation(tokens.pop());\n const functionCall = tokens.shift() || '';\n const functionName =\n functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n","/**\n * this file is used to serialize log message to string\n *\n */\n\nimport type { StringifyOptions } from './index';\n\n/**\n * transfer the node path in Event to string\n * @param node - the first node in a node path array\n */\nfunction pathToSelector(node: HTMLElement): string | '' {\n if (!node || !node.outerHTML) {\n return '';\n }\n\n let path = '';\n while (node.parentElement) {\n let name = node.localName;\n if (!name) {\n break;\n }\n name = name.toLowerCase();\n const parent = node.parentElement;\n\n const domSiblings = [];\n\n if (parent.children && parent.children.length > 0) {\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n\n if (domSiblings.length > 1) {\n name += `:eq(${domSiblings.indexOf(node)})`;\n }\n path = name + (path ? '>' + path : '');\n node = parent;\n }\n\n return path;\n}\n\n/**\n * judge is object\n */\nfunction isObject(obj: unknown): boolean {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * judge the object's depth\n */\nfunction isObjTooDeep(obj: Record<string, unknown>, limit: number): boolean {\n if (limit === 0) {\n return true;\n }\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (\n isObject(obj[key]) &&\n isObjTooDeep(obj[key] as Record<string, unknown>, limit - 1)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * stringify any js object\n * @param obj - the object to stringify\n */\nexport function stringify(\n obj: unknown,\n stringifyOptions?: StringifyOptions,\n): string {\n const options: StringifyOptions = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n const stack: unknown[] = [];\n const keys: unknown[] = [];\n return JSON.stringify(\n obj,\n function (key, value: string | bigint | object | null | undefined) {\n /**\n * forked from https://github.com/moll/json-stringify-safe/blob/master/stringify.js\n * to deCycle the object\n */\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n } else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n } else {\n stack.push(value);\n }\n /* END of the FORK */\n\n if (value === null) return value;\n if (value === undefined) return 'undefined';\n if (shouldIgnore(value as object)) {\n return toString(value as object);\n }\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n if (value instanceof Event) {\n const eventResult: Record<string, unknown> = {};\n for (const eventKey in value) {\n const eventValue = (value as unknown as Record<string, unknown>)[\n eventKey\n ];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(\n (eventValue.length ? eventValue[0] : null) as HTMLElement,\n );\n } else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n } else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n } else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n },\n );\n\n /**\n * whether we should ignore obj's info and call toString() function instead\n */\n function shouldIgnore(_obj: object): boolean {\n // outof keys limit\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n\n // is function or bigint\n if (typeof _obj === 'function') {\n return true;\n }\n\n /**\n * judge object's depth to avoid browser's OOM\n *\n * issues: https://github.com/rrweb-io/rrweb/issues/653\n */\n if (\n isObject(_obj) &&\n isObjTooDeep(_obj as Record<string, unknown>, options.depthOfLimit)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * limit the toString() result according to option\n */\n function toString(_obj: object): string {\n let str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = `${str.slice(0, options.stringLengthLimit)}...`;\n }\n return str;\n }\n}\n","import type { listenerHandler, RecordPlugin, IWindow } from '@rrweb/types';\nimport { patch } from '@rrweb/utils';\nimport { ErrorStackParser, StackFrame } from './error-stack-parser';\nimport { stringify } from './stringify';\n\nexport type StringifyOptions = {\n // limit of string length\n stringLengthLimit?: number;\n /**\n * limit of number of keys in an object\n * if an object contains more keys than this limit, we would call its toString function directly\n */\n numOfKeysLimit: number;\n /**\n * limit number of depth in an object\n * if an object is too deep, toString process may cause browser OOM\n */\n depthOfLimit: number;\n};\n\ntype LogRecordOptions = {\n level?: LogLevel[];\n lengthThreshold?: number;\n stringifyOptions?: StringifyOptions;\n logger?: Logger | 'console';\n};\n\nconst defaultLogOptions: LogRecordOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\n\nexport type LogData = {\n level: LogLevel;\n trace: string[];\n payload: string[];\n};\n\ntype logCallback = (p: LogData) => void;\n\n/* fork from interface Console */\n// all kinds of console functions\nexport type Logger = {\n assert?: typeof console.assert;\n clear?: typeof console.clear;\n count?: typeof console.count;\n countReset?: typeof console.countReset;\n debug?: typeof console.debug;\n dir?: typeof console.dir;\n dirxml?: typeof console.dirxml;\n error?: typeof console.error;\n group?: typeof console.group;\n groupCollapsed?: typeof console.groupCollapsed;\n groupEnd?: () => void;\n info?: typeof console.info;\n log?: typeof console.log;\n table?: typeof console.table;\n time?: typeof console.time;\n timeEnd?: typeof console.timeEnd;\n timeLog?: typeof console.timeLog;\n trace?: typeof console.trace;\n warn?: typeof console.warn;\n};\n\nexport type LogLevel = keyof Logger;\n\nfunction initLogObserver(\n cb: logCallback,\n win: IWindow, // top window or in an iframe\n options: LogRecordOptions,\n): listenerHandler {\n const logOptions = (\n options ? Object.assign({}, defaultLogOptions, options) : defaultLogOptions\n ) as {\n level: LogLevel[];\n lengthThreshold: number;\n stringifyOptions?: StringifyOptions;\n logger: Logger | 'console';\n };\n const loggerType = logOptions.logger;\n if (!loggerType) {\n return () => {\n //\n };\n }\n let logger: Logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n } else {\n logger = loggerType;\n }\n let logCount = 0;\n let inStack = false;\n const cancelHandlers: listenerHandler[] = [];\n // add listener to thrown errors\n if (logOptions.level.includes('error')) {\n const errorHandler = (event: ErrorEvent) => {\n const message = event.message,\n error = event.error as Error;\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n const payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('error', errorHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('error', errorHandler);\n });\n const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {\n let error: Error;\n let payload: string[];\n if (event.reason instanceof Error) {\n error = event.reason;\n payload = [\n stringify(\n `Uncaught (in promise) ${error.name}: ${error.message}`,\n logOptions.stringifyOptions,\n ),\n ];\n } else {\n error = new Error();\n payload = [\n stringify('Uncaught (in promise)', logOptions.stringifyOptions),\n stringify(event.reason, logOptions.stringifyOptions),\n ];\n }\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('unhandledrejection', unhandledrejectionHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('unhandledrejection', unhandledrejectionHandler);\n });\n }\n for (const levelType of logOptions.level) {\n cancelHandlers.push(replace(logger, levelType));\n }\n return () => {\n cancelHandlers.forEach((h) => h());\n };\n\n /**\n * replace the original console function and record logs\n * @param logger - the logger object such as Console\n * @param level - the name of log function to be replaced\n */\n function replace(_logger: Logger, level: LogLevel) {\n if (!_logger[level]) {\n return () => {\n //\n };\n }\n // replace the logger.{level}. return a restore function\n return patch(\n _logger,\n level,\n (original: (...args: Array<unknown>) => void) => {\n return (...args: Array<unknown>) => {\n original.apply(this, args);\n\n if (level === 'assert' && !!args[0]) {\n // assert does not log if the first argument evaluates to true\n return;\n }\n\n if (inStack) {\n // If we are already in a stack this means something from the following code is calling a console method\n // likely a proxy method called from stringify. We don't want to log this as it will cause an infinite loop\n return;\n }\n inStack = true;\n try {\n const trace = ErrorStackParser.parse(new Error())\n .map((stackFrame: StackFrame) => stackFrame.toString())\n .splice(1); // splice(1) to omit the hijacked log function\n\n // assert does not log its first arg, that's only used for deciding whether to log\n const argsForPayload = level === 'assert' ? args.slice(1) : args;\n\n const payload = argsForPayload.map((s) =>\n stringify(s, logOptions.stringifyOptions),\n );\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level,\n trace,\n payload,\n });\n } else if (logCount === logOptions.lengthThreshold) {\n // notify the user\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n } catch (error) {\n original('rrweb logger error:', error, ...args);\n } finally {\n inStack = false;\n }\n };\n },\n );\n }\n}\n\nexport const PLUGIN_NAME = 'rrweb/console@1';\n\nexport const getRecordConsolePlugin: (\n options?: LogRecordOptions,\n) => RecordPlugin = (options) => ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options,\n});\n"],"names":[],"mappings":"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"}

@@ -19,2 +19,3 @@ (function (g, f) {

Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
if (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) ;
function patch(source, name, replacement) {

@@ -21,0 +22,0 @@ try {

{
"version": 3,
"sources": ["../../../utils/dist/utils.js", "../src/error-stack-parser.ts", "../src/stringify.ts", "../src/index.ts"],
"sourcesContent": ["const testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n isAngularZonePresent,\n mutationObserverCtor,\n ownerDocument,\n parentElement,\n parentNode,\n patch,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=utils.js.map\n", "/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return */\n/**\n * Class StackFrame is a fork of https://github.com/stacktracejs/stackframe/blob/master/stackframe.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n * 3. StackFrame contains some functions we don't need.\n */\nexport class StackFrame {\n private fileName: string;\n private functionName: string;\n private lineNumber?: number;\n private columnNumber?: number;\n\n constructor(obj: {\n fileName?: string;\n functionName?: string;\n lineNumber?: number;\n columnNumber?: number;\n }) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n\n toString() {\n const lineNumber = this.lineNumber || '';\n const columnNumber = this.columnNumber || '';\n if (this.functionName)\n return `${this.functionName} (${this.fileName}:${lineNumber}:${columnNumber})`;\n return `${this.fileName}:${lineNumber}:${columnNumber}`;\n }\n}\n\n/**\n * ErrorStackParser is a fork of https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n */\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nconst CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nexport const ErrorStackParser = {\n /**\n * Given an Error object, extract the most information from it.\n */\n parse: function (error: Error): StackFrame[] {\n // https://github.com/rrweb-io/rrweb/issues/782\n if (!error) {\n return [];\n }\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error.stacktrace !== 'undefined' ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error['opera#sourceloc'] !== 'undefined'\n ) {\n return this.parseOpera(\n error as {\n stacktrace?: string;\n message: string;\n stack?: string;\n },\n );\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error as { stack: string });\n } else if (error.stack) {\n return this.parseFFOrSafari(error as { stack: string });\n } else {\n console.warn(\n '[console-record-plugin]: Failed to parse error object:',\n error,\n );\n return [];\n }\n },\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function (urlLike: string) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n const regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n const parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts) throw new Error(`Cannot parse given url: ${urlLike}`);\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n let sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n\n // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n const location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n\n // remove the parenthesized location from the line, if it was matched\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n\n const tokens = sanitizedLine.split(/\\s+/).slice(1);\n // if a location was matched, pass it to extractLocation() otherwise pop the last token\n const locationParts = this.extractLocation(\n location ? location[1] : tokens.pop(),\n );\n const functionName = tokens.join(' ') || undefined;\n const fileName =\n ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n\n return new StackFrame({\n functionName,\n fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1',\n );\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line,\n });\n } else {\n const functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n const matches = line.match(functionNameRegex);\n const functionName = matches && matches[1] ? matches[1] : undefined;\n const locationParts = this.extractLocation(\n line.replace(functionNameRegex, ''),\n );\n\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e: {\n stacktrace?: string;\n message: string;\n stack?: string;\n }): StackFrame[] {\n if (\n !e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)\n ) {\n return this.parseOpera9(e as { message: string });\n } else if (!e.stack) {\n return this.parseOpera10(e as { stacktrace: string });\n } else {\n return this.parseOpera11(e as { stack: string });\n }\n },\n parseOpera9: function (e: { message: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n const lines = e.message.split('\\n');\n const result = [];\n\n for (let i = 2, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n parseOpera10: function (e: { stacktrace: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n const lines = e.stacktrace.split('\\n');\n const result = [];\n\n for (let i = 0, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return (\n !!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/)\n );\n }, this);\n\n return filtered.map(function (line: string) {\n const tokens = line.split('@');\n const locationParts = this.extractLocation(tokens.pop());\n const functionCall = tokens.shift() || '';\n const functionName =\n functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n", "/**\n * this file is used to serialize log message to string\n *\n */\n\nimport type { StringifyOptions } from './index';\n\n/**\n * transfer the node path in Event to string\n * @param node - the first node in a node path array\n */\nfunction pathToSelector(node: HTMLElement): string | '' {\n if (!node || !node.outerHTML) {\n return '';\n }\n\n let path = '';\n while (node.parentElement) {\n let name = node.localName;\n if (!name) {\n break;\n }\n name = name.toLowerCase();\n const parent = node.parentElement;\n\n const domSiblings = [];\n\n if (parent.children && parent.children.length > 0) {\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n\n if (domSiblings.length > 1) {\n name += `:eq(${domSiblings.indexOf(node)})`;\n }\n path = name + (path ? '>' + path : '');\n node = parent;\n }\n\n return path;\n}\n\n/**\n * judge is object\n */\nfunction isObject(obj: unknown): boolean {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * judge the object's depth\n */\nfunction isObjTooDeep(obj: Record<string, unknown>, limit: number): boolean {\n if (limit === 0) {\n return true;\n }\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (\n isObject(obj[key]) &&\n isObjTooDeep(obj[key] as Record<string, unknown>, limit - 1)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * stringify any js object\n * @param obj - the object to stringify\n */\nexport function stringify(\n obj: unknown,\n stringifyOptions?: StringifyOptions,\n): string {\n const options: StringifyOptions = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n const stack: unknown[] = [];\n const keys: unknown[] = [];\n return JSON.stringify(\n obj,\n function (key, value: string | bigint | object | null | undefined) {\n /**\n * forked from https://github.com/moll/json-stringify-safe/blob/master/stringify.js\n * to deCycle the object\n */\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n } else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n } else {\n stack.push(value);\n }\n /* END of the FORK */\n\n if (value === null) return value;\n if (value === undefined) return 'undefined';\n if (shouldIgnore(value as object)) {\n return toString(value as object);\n }\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n if (value instanceof Event) {\n const eventResult: Record<string, unknown> = {};\n for (const eventKey in value) {\n const eventValue = (value as unknown as Record<string, unknown>)[\n eventKey\n ];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(\n (eventValue.length ? eventValue[0] : null) as HTMLElement,\n );\n } else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n } else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n } else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n },\n );\n\n /**\n * whether we should ignore obj's info and call toString() function instead\n */\n function shouldIgnore(_obj: object): boolean {\n // outof keys limit\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n\n // is function or bigint\n if (typeof _obj === 'function') {\n return true;\n }\n\n /**\n * judge object's depth to avoid browser's OOM\n *\n * issues: https://github.com/rrweb-io/rrweb/issues/653\n */\n if (\n isObject(_obj) &&\n isObjTooDeep(_obj as Record<string, unknown>, options.depthOfLimit)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * limit the toString() result according to option\n */\n function toString(_obj: object): string {\n let str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = `${str.slice(0, options.stringLengthLimit)}...`;\n }\n return str;\n }\n}\n", "import type { listenerHandler, RecordPlugin, IWindow } from '@rrweb/types';\nimport { patch } from '@rrweb/utils';\nimport { ErrorStackParser, StackFrame } from './error-stack-parser';\nimport { stringify } from './stringify';\n\nexport type StringifyOptions = {\n // limit of string length\n stringLengthLimit?: number;\n /**\n * limit of number of keys in an object\n * if an object contains more keys than this limit, we would call its toString function directly\n */\n numOfKeysLimit: number;\n /**\n * limit number of depth in an object\n * if an object is too deep, toString process may cause browser OOM\n */\n depthOfLimit: number;\n};\n\ntype LogRecordOptions = {\n level?: LogLevel[];\n lengthThreshold?: number;\n stringifyOptions?: StringifyOptions;\n logger?: Logger | 'console';\n};\n\nconst defaultLogOptions: LogRecordOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\n\nexport type LogData = {\n level: LogLevel;\n trace: string[];\n payload: string[];\n};\n\ntype logCallback = (p: LogData) => void;\n\n/* fork from interface Console */\n// all kinds of console functions\nexport type Logger = {\n assert?: typeof console.assert;\n clear?: typeof console.clear;\n count?: typeof console.count;\n countReset?: typeof console.countReset;\n debug?: typeof console.debug;\n dir?: typeof console.dir;\n dirxml?: typeof console.dirxml;\n error?: typeof console.error;\n group?: typeof console.group;\n groupCollapsed?: typeof console.groupCollapsed;\n groupEnd?: () => void;\n info?: typeof console.info;\n log?: typeof console.log;\n table?: typeof console.table;\n time?: typeof console.time;\n timeEnd?: typeof console.timeEnd;\n timeLog?: typeof console.timeLog;\n trace?: typeof console.trace;\n warn?: typeof console.warn;\n};\n\nexport type LogLevel = keyof Logger;\n\nfunction initLogObserver(\n cb: logCallback,\n win: IWindow, // top window or in an iframe\n options: LogRecordOptions,\n): listenerHandler {\n const logOptions = (\n options ? Object.assign({}, defaultLogOptions, options) : defaultLogOptions\n ) as {\n level: LogLevel[];\n lengthThreshold: number;\n stringifyOptions?: StringifyOptions;\n logger: Logger | 'console';\n };\n const loggerType = logOptions.logger;\n if (!loggerType) {\n return () => {\n //\n };\n }\n let logger: Logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n } else {\n logger = loggerType;\n }\n let logCount = 0;\n let inStack = false;\n const cancelHandlers: listenerHandler[] = [];\n // add listener to thrown errors\n if (logOptions.level.includes('error')) {\n const errorHandler = (event: ErrorEvent) => {\n const message = event.message,\n error = event.error as Error;\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n const payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('error', errorHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('error', errorHandler);\n });\n const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {\n let error: Error;\n let payload: string[];\n if (event.reason instanceof Error) {\n error = event.reason;\n payload = [\n stringify(\n `Uncaught (in promise) ${error.name}: ${error.message}`,\n logOptions.stringifyOptions,\n ),\n ];\n } else {\n error = new Error();\n payload = [\n stringify('Uncaught (in promise)', logOptions.stringifyOptions),\n stringify(event.reason, logOptions.stringifyOptions),\n ];\n }\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('unhandledrejection', unhandledrejectionHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('unhandledrejection', unhandledrejectionHandler);\n });\n }\n for (const levelType of logOptions.level) {\n cancelHandlers.push(replace(logger, levelType));\n }\n return () => {\n cancelHandlers.forEach((h) => h());\n };\n\n /**\n * replace the original console function and record logs\n * @param logger - the logger object such as Console\n * @param level - the name of log function to be replaced\n */\n function replace(_logger: Logger, level: LogLevel) {\n if (!_logger[level]) {\n return () => {\n //\n };\n }\n // replace the logger.{level}. return a restore function\n return patch(\n _logger,\n level,\n (original: (...args: Array<unknown>) => void) => {\n return (...args: Array<unknown>) => {\n original.apply(this, args);\n\n if (level === 'assert' && !!args[0]) {\n // assert does not log if the first argument evaluates to true\n return;\n }\n\n if (inStack) {\n // If we are already in a stack this means something from the following code is calling a console method\n // likely a proxy method called from stringify. We don't want to log this as it will cause an infinite loop\n return;\n }\n inStack = true;\n try {\n const trace = ErrorStackParser.parse(new Error())\n .map((stackFrame: StackFrame) => stackFrame.toString())\n .splice(1); // splice(1) to omit the hijacked log function\n\n // assert does not log its first arg, that's only used for deciding whether to log\n const argsForPayload = level === 'assert' ? args.slice(1) : args;\n\n const payload = argsForPayload.map((s) =>\n stringify(s, logOptions.stringifyOptions),\n );\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level,\n trace,\n payload,\n });\n } else if (logCount === logOptions.lengthThreshold) {\n // notify the user\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n } catch (error) {\n original('rrweb logger error:', error, ...args);\n } finally {\n inStack = false;\n }\n };\n },\n );\n }\n}\n\nexport const PLUGIN_NAME = 'rrweb/console@1';\n\nexport const getRecordConsolePlugin: (\n options?: LogRecordOptions,\n) => RecordPlugin = (options) => ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options,\n});\n"],
"mappings": "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",
"sourcesContent": ["const testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nlet nowTimestamp = Date.now;\nif (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) {\n nowTimestamp = () => (/* @__PURE__ */ new Date()).getTime();\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n nowTimestamp,\n patch\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n isAngularZonePresent,\n mutationObserverCtor,\n nowTimestamp,\n ownerDocument,\n parentElement,\n parentNode,\n patch,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=utils.js.map\n", "/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return */\n/**\n * Class StackFrame is a fork of https://github.com/stacktracejs/stackframe/blob/master/stackframe.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n * 3. StackFrame contains some functions we don't need.\n */\nexport class StackFrame {\n private fileName: string;\n private functionName: string;\n private lineNumber?: number;\n private columnNumber?: number;\n\n constructor(obj: {\n fileName?: string;\n functionName?: string;\n lineNumber?: number;\n columnNumber?: number;\n }) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n\n toString() {\n const lineNumber = this.lineNumber || '';\n const columnNumber = this.columnNumber || '';\n if (this.functionName)\n return `${this.functionName} (${this.fileName}:${lineNumber}:${columnNumber})`;\n return `${this.fileName}:${lineNumber}:${columnNumber}`;\n }\n}\n\n/**\n * ErrorStackParser is a fork of https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n */\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nconst CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nexport const ErrorStackParser = {\n /**\n * Given an Error object, extract the most information from it.\n */\n parse: function (error: Error): StackFrame[] {\n // https://github.com/rrweb-io/rrweb/issues/782\n if (!error) {\n return [];\n }\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error.stacktrace !== 'undefined' ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error['opera#sourceloc'] !== 'undefined'\n ) {\n return this.parseOpera(\n error as {\n stacktrace?: string;\n message: string;\n stack?: string;\n },\n );\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error as { stack: string });\n } else if (error.stack) {\n return this.parseFFOrSafari(error as { stack: string });\n } else {\n console.warn(\n '[console-record-plugin]: Failed to parse error object:',\n error,\n );\n return [];\n }\n },\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function (urlLike: string) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n const regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n const parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts) throw new Error(`Cannot parse given url: ${urlLike}`);\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n let sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n\n // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n const location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n\n // remove the parenthesized location from the line, if it was matched\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n\n const tokens = sanitizedLine.split(/\\s+/).slice(1);\n // if a location was matched, pass it to extractLocation() otherwise pop the last token\n const locationParts = this.extractLocation(\n location ? location[1] : tokens.pop(),\n );\n const functionName = tokens.join(' ') || undefined;\n const fileName =\n ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n\n return new StackFrame({\n functionName,\n fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1',\n );\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line,\n });\n } else {\n const functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n const matches = line.match(functionNameRegex);\n const functionName = matches && matches[1] ? matches[1] : undefined;\n const locationParts = this.extractLocation(\n line.replace(functionNameRegex, ''),\n );\n\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e: {\n stacktrace?: string;\n message: string;\n stack?: string;\n }): StackFrame[] {\n if (\n !e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)\n ) {\n return this.parseOpera9(e as { message: string });\n } else if (!e.stack) {\n return this.parseOpera10(e as { stacktrace: string });\n } else {\n return this.parseOpera11(e as { stack: string });\n }\n },\n parseOpera9: function (e: { message: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n const lines = e.message.split('\\n');\n const result = [];\n\n for (let i = 2, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n parseOpera10: function (e: { stacktrace: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n const lines = e.stacktrace.split('\\n');\n const result = [];\n\n for (let i = 0, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return (\n !!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/)\n );\n }, this);\n\n return filtered.map(function (line: string) {\n const tokens = line.split('@');\n const locationParts = this.extractLocation(tokens.pop());\n const functionCall = tokens.shift() || '';\n const functionName =\n functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n", "/**\n * this file is used to serialize log message to string\n *\n */\n\nimport type { StringifyOptions } from './index';\n\n/**\n * transfer the node path in Event to string\n * @param node - the first node in a node path array\n */\nfunction pathToSelector(node: HTMLElement): string | '' {\n if (!node || !node.outerHTML) {\n return '';\n }\n\n let path = '';\n while (node.parentElement) {\n let name = node.localName;\n if (!name) {\n break;\n }\n name = name.toLowerCase();\n const parent = node.parentElement;\n\n const domSiblings = [];\n\n if (parent.children && parent.children.length > 0) {\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n\n if (domSiblings.length > 1) {\n name += `:eq(${domSiblings.indexOf(node)})`;\n }\n path = name + (path ? '>' + path : '');\n node = parent;\n }\n\n return path;\n}\n\n/**\n * judge is object\n */\nfunction isObject(obj: unknown): boolean {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * judge the object's depth\n */\nfunction isObjTooDeep(obj: Record<string, unknown>, limit: number): boolean {\n if (limit === 0) {\n return true;\n }\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (\n isObject(obj[key]) &&\n isObjTooDeep(obj[key] as Record<string, unknown>, limit - 1)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * stringify any js object\n * @param obj - the object to stringify\n */\nexport function stringify(\n obj: unknown,\n stringifyOptions?: StringifyOptions,\n): string {\n const options: StringifyOptions = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n const stack: unknown[] = [];\n const keys: unknown[] = [];\n return JSON.stringify(\n obj,\n function (key, value: string | bigint | object | null | undefined) {\n /**\n * forked from https://github.com/moll/json-stringify-safe/blob/master/stringify.js\n * to deCycle the object\n */\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n } else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n } else {\n stack.push(value);\n }\n /* END of the FORK */\n\n if (value === null) return value;\n if (value === undefined) return 'undefined';\n if (shouldIgnore(value as object)) {\n return toString(value as object);\n }\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n if (value instanceof Event) {\n const eventResult: Record<string, unknown> = {};\n for (const eventKey in value) {\n const eventValue = (value as unknown as Record<string, unknown>)[\n eventKey\n ];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(\n (eventValue.length ? eventValue[0] : null) as HTMLElement,\n );\n } else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n } else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n } else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n },\n );\n\n /**\n * whether we should ignore obj's info and call toString() function instead\n */\n function shouldIgnore(_obj: object): boolean {\n // outof keys limit\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n\n // is function or bigint\n if (typeof _obj === 'function') {\n return true;\n }\n\n /**\n * judge object's depth to avoid browser's OOM\n *\n * issues: https://github.com/rrweb-io/rrweb/issues/653\n */\n if (\n isObject(_obj) &&\n isObjTooDeep(_obj as Record<string, unknown>, options.depthOfLimit)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * limit the toString() result according to option\n */\n function toString(_obj: object): string {\n let str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = `${str.slice(0, options.stringLengthLimit)}...`;\n }\n return str;\n }\n}\n", "import type { listenerHandler, RecordPlugin, IWindow } from '@rrweb/types';\nimport { patch } from '@rrweb/utils';\nimport { ErrorStackParser, StackFrame } from './error-stack-parser';\nimport { stringify } from './stringify';\n\nexport type StringifyOptions = {\n // limit of string length\n stringLengthLimit?: number;\n /**\n * limit of number of keys in an object\n * if an object contains more keys than this limit, we would call its toString function directly\n */\n numOfKeysLimit: number;\n /**\n * limit number of depth in an object\n * if an object is too deep, toString process may cause browser OOM\n */\n depthOfLimit: number;\n};\n\ntype LogRecordOptions = {\n level?: LogLevel[];\n lengthThreshold?: number;\n stringifyOptions?: StringifyOptions;\n logger?: Logger | 'console';\n};\n\nconst defaultLogOptions: LogRecordOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\n\nexport type LogData = {\n level: LogLevel;\n trace: string[];\n payload: string[];\n};\n\ntype logCallback = (p: LogData) => void;\n\n/* fork from interface Console */\n// all kinds of console functions\nexport type Logger = {\n assert?: typeof console.assert;\n clear?: typeof console.clear;\n count?: typeof console.count;\n countReset?: typeof console.countReset;\n debug?: typeof console.debug;\n dir?: typeof console.dir;\n dirxml?: typeof console.dirxml;\n error?: typeof console.error;\n group?: typeof console.group;\n groupCollapsed?: typeof console.groupCollapsed;\n groupEnd?: () => void;\n info?: typeof console.info;\n log?: typeof console.log;\n table?: typeof console.table;\n time?: typeof console.time;\n timeEnd?: typeof console.timeEnd;\n timeLog?: typeof console.timeLog;\n trace?: typeof console.trace;\n warn?: typeof console.warn;\n};\n\nexport type LogLevel = keyof Logger;\n\nfunction initLogObserver(\n cb: logCallback,\n win: IWindow, // top window or in an iframe\n options: LogRecordOptions,\n): listenerHandler {\n const logOptions = (\n options ? Object.assign({}, defaultLogOptions, options) : defaultLogOptions\n ) as {\n level: LogLevel[];\n lengthThreshold: number;\n stringifyOptions?: StringifyOptions;\n logger: Logger | 'console';\n };\n const loggerType = logOptions.logger;\n if (!loggerType) {\n return () => {\n //\n };\n }\n let logger: Logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n } else {\n logger = loggerType;\n }\n let logCount = 0;\n let inStack = false;\n const cancelHandlers: listenerHandler[] = [];\n // add listener to thrown errors\n if (logOptions.level.includes('error')) {\n const errorHandler = (event: ErrorEvent) => {\n const message = event.message,\n error = event.error as Error;\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n const payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('error', errorHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('error', errorHandler);\n });\n const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {\n let error: Error;\n let payload: string[];\n if (event.reason instanceof Error) {\n error = event.reason;\n payload = [\n stringify(\n `Uncaught (in promise) ${error.name}: ${error.message}`,\n logOptions.stringifyOptions,\n ),\n ];\n } else {\n error = new Error();\n payload = [\n stringify('Uncaught (in promise)', logOptions.stringifyOptions),\n stringify(event.reason, logOptions.stringifyOptions),\n ];\n }\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('unhandledrejection', unhandledrejectionHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('unhandledrejection', unhandledrejectionHandler);\n });\n }\n for (const levelType of logOptions.level) {\n cancelHandlers.push(replace(logger, levelType));\n }\n return () => {\n cancelHandlers.forEach((h) => h());\n };\n\n /**\n * replace the original console function and record logs\n * @param logger - the logger object such as Console\n * @param level - the name of log function to be replaced\n */\n function replace(_logger: Logger, level: LogLevel) {\n if (!_logger[level]) {\n return () => {\n //\n };\n }\n // replace the logger.{level}. return a restore function\n return patch(\n _logger,\n level,\n (original: (...args: Array<unknown>) => void) => {\n return (...args: Array<unknown>) => {\n original.apply(this, args);\n\n if (level === 'assert' && !!args[0]) {\n // assert does not log if the first argument evaluates to true\n return;\n }\n\n if (inStack) {\n // If we are already in a stack this means something from the following code is calling a console method\n // likely a proxy method called from stringify. We don't want to log this as it will cause an infinite loop\n return;\n }\n inStack = true;\n try {\n const trace = ErrorStackParser.parse(new Error())\n .map((stackFrame: StackFrame) => stackFrame.toString())\n .splice(1); // splice(1) to omit the hijacked log function\n\n // assert does not log its first arg, that's only used for deciding whether to log\n const argsForPayload = level === 'assert' ? args.slice(1) : args;\n\n const payload = argsForPayload.map((s) =>\n stringify(s, logOptions.stringifyOptions),\n );\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level,\n trace,\n payload,\n });\n } else if (logCount === logOptions.lengthThreshold) {\n // notify the user\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n } catch (error) {\n original('rrweb logger error:', error, ...args);\n } finally {\n inStack = false;\n }\n };\n },\n );\n }\n}\n\nexport const PLUGIN_NAME = 'rrweb/console@1';\n\nexport const getRecordConsolePlugin: (\n options?: LogRecordOptions,\n) => RecordPlugin = (options) => ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options,\n});\n"],
"mappings": "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",
"names": []
}

@@ -14,3 +14,3 @@ (function (g, f) {

var module = { exports };
"use strict";var $=Object.defineProperty,k=(e,r,t)=>r in e?$(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,E=(e,r,t)=>k(e,typeof r!="symbol"?r+"":r,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function _(e,r,t){try{if(!(r in e))return()=>{};const n=e[r],i=t(n);return typeof i=="function"&&(i.prototype=i.prototype||{},Object.defineProperties(i,{__rrweb_original__:{enumerable:!1,value:n}})),e[r]=i,()=>{e[r]=n}}catch(n){return()=>{}}}class d{constructor(r){E(this,"fileName"),E(this,"functionName"),E(this,"lineNumber"),E(this,"columnNumber"),this.fileName=r.fileName||"",this.functionName=r.functionName||"",this.lineNumber=r.lineNumber,this.columnNumber=r.columnNumber}toString(){const r=this.lineNumber||"",t=this.columnNumber||"";return this.functionName?`${this.functionName} (${this.fileName}:${r}:${t})`:`${this.fileName}:${r}:${t}`}}const C=/(^|@)\S+:\d+/,S=/^\s*at .*(\S+:\d+|\(native\))/m,F=/^(eval@)?(\[native code])?$/,b={parse:function(e){return e?typeof e.stacktrace!="undefined"||typeof e["opera#sourceloc"]!="undefined"?this.parseOpera(e):e.stack&&e.stack.match(S)?this.parseV8OrIE(e):e.stack?this.parseFFOrSafari(e):(console.warn("[console-record-plugin]: Failed to parse error object:",e),[]):[]},extractLocation:function(e){if(e.indexOf(":")===-1)return[e];const t=/(.+?)(?::(\d+))?(?::(\d+))?$/.exec(e.replace(/[()]/g,""));if(!t)throw new Error(`Cannot parse given url: ${e}`);return[t[1],t[2]||void 0,t[3]||void 0]},parseV8OrIE:function(e){return e.stack.split(`
"use strict";var $=Object.defineProperty,k=(e,r,t)=>r in e?$(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,E=(e,r,t)=>k(e,typeof r!="symbol"?r+"":r,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});Date.now().toString();function _(e,r,t){try{if(!(r in e))return()=>{};const n=e[r],i=t(n);return typeof i=="function"&&(i.prototype=i.prototype||{},Object.defineProperties(i,{__rrweb_original__:{enumerable:!1,value:n}})),e[r]=i,()=>{e[r]=n}}catch(n){return()=>{}}}class d{constructor(r){E(this,"fileName"),E(this,"functionName"),E(this,"lineNumber"),E(this,"columnNumber"),this.fileName=r.fileName||"",this.functionName=r.functionName||"",this.lineNumber=r.lineNumber,this.columnNumber=r.columnNumber}toString(){const r=this.lineNumber||"",t=this.columnNumber||"";return this.functionName?`${this.functionName} (${this.fileName}:${r}:${t})`:`${this.fileName}:${r}:${t}`}}const C=/(^|@)\S+:\d+/,S=/^\s*at .*(\S+:\d+|\(native\))/m,F=/^(eval@)?(\[native code])?$/,b={parse:function(e){return e?typeof e.stacktrace!="undefined"||typeof e["opera#sourceloc"]!="undefined"?this.parseOpera(e):e.stack&&e.stack.match(S)?this.parseV8OrIE(e):e.stack?this.parseFFOrSafari(e):(console.warn("[console-record-plugin]: Failed to parse error object:",e),[]):[]},extractLocation:function(e){if(e.indexOf(":")===-1)return[e];const t=/(.+?)(?::(\d+))?(?::(\d+))?$/.exec(e.replace(/[()]/g,""));if(!t)throw new Error(`Cannot parse given url: ${e}`);return[t[1],t[2]||void 0,t[3]||void 0]},parseV8OrIE:function(e){return e.stack.split(`
`).filter(function(t){return!!t.match(S)},this).map(function(t){t.indexOf("(eval ")>-1&&(t=t.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(\),.*$)/g,""));let n=t.replace(/^\s+/,"").replace(/\(eval code/g,"(");const i=n.match(/ (\((.+):(\d+):(\d+)\)$)/);n=i?n.replace(i[0],""):n;const c=n.split(/\s+/).slice(1),s=this.extractLocation(i?i[1]:c.pop()),a=c.join(" ")||void 0,o=["eval","<anonymous>"].indexOf(s[0])>-1?void 0:s[0];return new d({functionName:a,fileName:o,lineNumber:s[1],columnNumber:s[2]})},this)},parseFFOrSafari:function(e){return e.stack.split(`

@@ -17,0 +17,0 @@ `).filter(function(t){return!t.match(F)},this).map(function(t){if(t.indexOf(" > eval")>-1&&(t=t.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),t.indexOf("@")===-1&&t.indexOf(":")===-1)return new d({functionName:t});{const n=/((.*".+"[^@]*)?[^@]*)(?:@)/,i=t.match(n),c=i&&i[1]?i[1]:void 0,s=this.extractLocation(t.replace(n,""));return new d({functionName:c,fileName:s[0],lineNumber:s[1],columnNumber:s[2]})}},this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf(`

{
"version": 3,
"sources": ["../../../utils/dist/utils.js", "../src/error-stack-parser.ts", "../src/stringify.ts", "../src/index.ts"],
"sourcesContent": ["const testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n isAngularZonePresent,\n mutationObserverCtor,\n ownerDocument,\n parentElement,\n parentNode,\n patch,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=utils.js.map\n", "/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return */\n/**\n * Class StackFrame is a fork of https://github.com/stacktracejs/stackframe/blob/master/stackframe.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n * 3. StackFrame contains some functions we don't need.\n */\nexport class StackFrame {\n private fileName: string;\n private functionName: string;\n private lineNumber?: number;\n private columnNumber?: number;\n\n constructor(obj: {\n fileName?: string;\n functionName?: string;\n lineNumber?: number;\n columnNumber?: number;\n }) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n\n toString() {\n const lineNumber = this.lineNumber || '';\n const columnNumber = this.columnNumber || '';\n if (this.functionName)\n return `${this.functionName} (${this.fileName}:${lineNumber}:${columnNumber})`;\n return `${this.fileName}:${lineNumber}:${columnNumber}`;\n }\n}\n\n/**\n * ErrorStackParser is a fork of https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n */\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nconst CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nexport const ErrorStackParser = {\n /**\n * Given an Error object, extract the most information from it.\n */\n parse: function (error: Error): StackFrame[] {\n // https://github.com/rrweb-io/rrweb/issues/782\n if (!error) {\n return [];\n }\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error.stacktrace !== 'undefined' ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error['opera#sourceloc'] !== 'undefined'\n ) {\n return this.parseOpera(\n error as {\n stacktrace?: string;\n message: string;\n stack?: string;\n },\n );\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error as { stack: string });\n } else if (error.stack) {\n return this.parseFFOrSafari(error as { stack: string });\n } else {\n console.warn(\n '[console-record-plugin]: Failed to parse error object:',\n error,\n );\n return [];\n }\n },\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function (urlLike: string) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n const regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n const parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts) throw new Error(`Cannot parse given url: ${urlLike}`);\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n let sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n\n // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n const location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n\n // remove the parenthesized location from the line, if it was matched\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n\n const tokens = sanitizedLine.split(/\\s+/).slice(1);\n // if a location was matched, pass it to extractLocation() otherwise pop the last token\n const locationParts = this.extractLocation(\n location ? location[1] : tokens.pop(),\n );\n const functionName = tokens.join(' ') || undefined;\n const fileName =\n ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n\n return new StackFrame({\n functionName,\n fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1',\n );\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line,\n });\n } else {\n const functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n const matches = line.match(functionNameRegex);\n const functionName = matches && matches[1] ? matches[1] : undefined;\n const locationParts = this.extractLocation(\n line.replace(functionNameRegex, ''),\n );\n\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e: {\n stacktrace?: string;\n message: string;\n stack?: string;\n }): StackFrame[] {\n if (\n !e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)\n ) {\n return this.parseOpera9(e as { message: string });\n } else if (!e.stack) {\n return this.parseOpera10(e as { stacktrace: string });\n } else {\n return this.parseOpera11(e as { stack: string });\n }\n },\n parseOpera9: function (e: { message: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n const lines = e.message.split('\\n');\n const result = [];\n\n for (let i = 2, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n parseOpera10: function (e: { stacktrace: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n const lines = e.stacktrace.split('\\n');\n const result = [];\n\n for (let i = 0, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return (\n !!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/)\n );\n }, this);\n\n return filtered.map(function (line: string) {\n const tokens = line.split('@');\n const locationParts = this.extractLocation(tokens.pop());\n const functionCall = tokens.shift() || '';\n const functionName =\n functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n", "/**\n * this file is used to serialize log message to string\n *\n */\n\nimport type { StringifyOptions } from './index';\n\n/**\n * transfer the node path in Event to string\n * @param node - the first node in a node path array\n */\nfunction pathToSelector(node: HTMLElement): string | '' {\n if (!node || !node.outerHTML) {\n return '';\n }\n\n let path = '';\n while (node.parentElement) {\n let name = node.localName;\n if (!name) {\n break;\n }\n name = name.toLowerCase();\n const parent = node.parentElement;\n\n const domSiblings = [];\n\n if (parent.children && parent.children.length > 0) {\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n\n if (domSiblings.length > 1) {\n name += `:eq(${domSiblings.indexOf(node)})`;\n }\n path = name + (path ? '>' + path : '');\n node = parent;\n }\n\n return path;\n}\n\n/**\n * judge is object\n */\nfunction isObject(obj: unknown): boolean {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * judge the object's depth\n */\nfunction isObjTooDeep(obj: Record<string, unknown>, limit: number): boolean {\n if (limit === 0) {\n return true;\n }\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (\n isObject(obj[key]) &&\n isObjTooDeep(obj[key] as Record<string, unknown>, limit - 1)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * stringify any js object\n * @param obj - the object to stringify\n */\nexport function stringify(\n obj: unknown,\n stringifyOptions?: StringifyOptions,\n): string {\n const options: StringifyOptions = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n const stack: unknown[] = [];\n const keys: unknown[] = [];\n return JSON.stringify(\n obj,\n function (key, value: string | bigint | object | null | undefined) {\n /**\n * forked from https://github.com/moll/json-stringify-safe/blob/master/stringify.js\n * to deCycle the object\n */\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n } else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n } else {\n stack.push(value);\n }\n /* END of the FORK */\n\n if (value === null) return value;\n if (value === undefined) return 'undefined';\n if (shouldIgnore(value as object)) {\n return toString(value as object);\n }\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n if (value instanceof Event) {\n const eventResult: Record<string, unknown> = {};\n for (const eventKey in value) {\n const eventValue = (value as unknown as Record<string, unknown>)[\n eventKey\n ];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(\n (eventValue.length ? eventValue[0] : null) as HTMLElement,\n );\n } else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n } else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n } else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n },\n );\n\n /**\n * whether we should ignore obj's info and call toString() function instead\n */\n function shouldIgnore(_obj: object): boolean {\n // outof keys limit\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n\n // is function or bigint\n if (typeof _obj === 'function') {\n return true;\n }\n\n /**\n * judge object's depth to avoid browser's OOM\n *\n * issues: https://github.com/rrweb-io/rrweb/issues/653\n */\n if (\n isObject(_obj) &&\n isObjTooDeep(_obj as Record<string, unknown>, options.depthOfLimit)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * limit the toString() result according to option\n */\n function toString(_obj: object): string {\n let str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = `${str.slice(0, options.stringLengthLimit)}...`;\n }\n return str;\n }\n}\n", "import type { listenerHandler, RecordPlugin, IWindow } from '@rrweb/types';\nimport { patch } from '@rrweb/utils';\nimport { ErrorStackParser, StackFrame } from './error-stack-parser';\nimport { stringify } from './stringify';\n\nexport type StringifyOptions = {\n // limit of string length\n stringLengthLimit?: number;\n /**\n * limit of number of keys in an object\n * if an object contains more keys than this limit, we would call its toString function directly\n */\n numOfKeysLimit: number;\n /**\n * limit number of depth in an object\n * if an object is too deep, toString process may cause browser OOM\n */\n depthOfLimit: number;\n};\n\ntype LogRecordOptions = {\n level?: LogLevel[];\n lengthThreshold?: number;\n stringifyOptions?: StringifyOptions;\n logger?: Logger | 'console';\n};\n\nconst defaultLogOptions: LogRecordOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\n\nexport type LogData = {\n level: LogLevel;\n trace: string[];\n payload: string[];\n};\n\ntype logCallback = (p: LogData) => void;\n\n/* fork from interface Console */\n// all kinds of console functions\nexport type Logger = {\n assert?: typeof console.assert;\n clear?: typeof console.clear;\n count?: typeof console.count;\n countReset?: typeof console.countReset;\n debug?: typeof console.debug;\n dir?: typeof console.dir;\n dirxml?: typeof console.dirxml;\n error?: typeof console.error;\n group?: typeof console.group;\n groupCollapsed?: typeof console.groupCollapsed;\n groupEnd?: () => void;\n info?: typeof console.info;\n log?: typeof console.log;\n table?: typeof console.table;\n time?: typeof console.time;\n timeEnd?: typeof console.timeEnd;\n timeLog?: typeof console.timeLog;\n trace?: typeof console.trace;\n warn?: typeof console.warn;\n};\n\nexport type LogLevel = keyof Logger;\n\nfunction initLogObserver(\n cb: logCallback,\n win: IWindow, // top window or in an iframe\n options: LogRecordOptions,\n): listenerHandler {\n const logOptions = (\n options ? Object.assign({}, defaultLogOptions, options) : defaultLogOptions\n ) as {\n level: LogLevel[];\n lengthThreshold: number;\n stringifyOptions?: StringifyOptions;\n logger: Logger | 'console';\n };\n const loggerType = logOptions.logger;\n if (!loggerType) {\n return () => {\n //\n };\n }\n let logger: Logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n } else {\n logger = loggerType;\n }\n let logCount = 0;\n let inStack = false;\n const cancelHandlers: listenerHandler[] = [];\n // add listener to thrown errors\n if (logOptions.level.includes('error')) {\n const errorHandler = (event: ErrorEvent) => {\n const message = event.message,\n error = event.error as Error;\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n const payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('error', errorHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('error', errorHandler);\n });\n const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {\n let error: Error;\n let payload: string[];\n if (event.reason instanceof Error) {\n error = event.reason;\n payload = [\n stringify(\n `Uncaught (in promise) ${error.name}: ${error.message}`,\n logOptions.stringifyOptions,\n ),\n ];\n } else {\n error = new Error();\n payload = [\n stringify('Uncaught (in promise)', logOptions.stringifyOptions),\n stringify(event.reason, logOptions.stringifyOptions),\n ];\n }\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('unhandledrejection', unhandledrejectionHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('unhandledrejection', unhandledrejectionHandler);\n });\n }\n for (const levelType of logOptions.level) {\n cancelHandlers.push(replace(logger, levelType));\n }\n return () => {\n cancelHandlers.forEach((h) => h());\n };\n\n /**\n * replace the original console function and record logs\n * @param logger - the logger object such as Console\n * @param level - the name of log function to be replaced\n */\n function replace(_logger: Logger, level: LogLevel) {\n if (!_logger[level]) {\n return () => {\n //\n };\n }\n // replace the logger.{level}. return a restore function\n return patch(\n _logger,\n level,\n (original: (...args: Array<unknown>) => void) => {\n return (...args: Array<unknown>) => {\n original.apply(this, args);\n\n if (level === 'assert' && !!args[0]) {\n // assert does not log if the first argument evaluates to true\n return;\n }\n\n if (inStack) {\n // If we are already in a stack this means something from the following code is calling a console method\n // likely a proxy method called from stringify. We don't want to log this as it will cause an infinite loop\n return;\n }\n inStack = true;\n try {\n const trace = ErrorStackParser.parse(new Error())\n .map((stackFrame: StackFrame) => stackFrame.toString())\n .splice(1); // splice(1) to omit the hijacked log function\n\n // assert does not log its first arg, that's only used for deciding whether to log\n const argsForPayload = level === 'assert' ? args.slice(1) : args;\n\n const payload = argsForPayload.map((s) =>\n stringify(s, logOptions.stringifyOptions),\n );\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level,\n trace,\n payload,\n });\n } else if (logCount === logOptions.lengthThreshold) {\n // notify the user\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n } catch (error) {\n original('rrweb logger error:', error, ...args);\n } finally {\n inStack = false;\n }\n };\n },\n );\n }\n}\n\nexport const PLUGIN_NAME = 'rrweb/console@1';\n\nexport const getRecordConsolePlugin: (\n options?: LogRecordOptions,\n) => RecordPlugin = (options) => ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options,\n});\n"],
"mappings": "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",
"sourcesContent": ["const testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nlet nowTimestamp = Date.now;\nif (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) {\n nowTimestamp = () => (/* @__PURE__ */ new Date()).getTime();\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n nowTimestamp,\n patch\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n isAngularZonePresent,\n mutationObserverCtor,\n nowTimestamp,\n ownerDocument,\n parentElement,\n parentNode,\n patch,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=utils.js.map\n", "/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return */\n/**\n * Class StackFrame is a fork of https://github.com/stacktracejs/stackframe/blob/master/stackframe.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n * 3. StackFrame contains some functions we don't need.\n */\nexport class StackFrame {\n private fileName: string;\n private functionName: string;\n private lineNumber?: number;\n private columnNumber?: number;\n\n constructor(obj: {\n fileName?: string;\n functionName?: string;\n lineNumber?: number;\n columnNumber?: number;\n }) {\n this.fileName = obj.fileName || '';\n this.functionName = obj.functionName || '';\n this.lineNumber = obj.lineNumber;\n this.columnNumber = obj.columnNumber;\n }\n\n toString() {\n const lineNumber = this.lineNumber || '';\n const columnNumber = this.columnNumber || '';\n if (this.functionName)\n return `${this.functionName} (${this.fileName}:${lineNumber}:${columnNumber})`;\n return `${this.fileName}:${lineNumber}:${columnNumber}`;\n }\n}\n\n/**\n * ErrorStackParser is a fork of https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js\n * I fork it because:\n * 1. There are some build issues when importing this package.\n * 2. Rewrites into typescript give us a better type interface.\n */\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/;\nconst CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m;\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code])?$/;\nexport const ErrorStackParser = {\n /**\n * Given an Error object, extract the most information from it.\n */\n parse: function (error: Error): StackFrame[] {\n // https://github.com/rrweb-io/rrweb/issues/782\n if (!error) {\n return [];\n }\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error.stacktrace !== 'undefined' ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n typeof error['opera#sourceloc'] !== 'undefined'\n ) {\n return this.parseOpera(\n error as {\n stacktrace?: string;\n message: string;\n stack?: string;\n },\n );\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error as { stack: string });\n } else if (error.stack) {\n return this.parseFFOrSafari(error as { stack: string });\n } else {\n console.warn(\n '[console-record-plugin]: Failed to parse error object:',\n error,\n );\n return [];\n }\n },\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function (urlLike: string) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n const regExp = /(.+?)(?::(\\d+))?(?::(\\d+))?$/;\n const parts = regExp.exec(urlLike.replace(/[()]/g, ''));\n if (!parts) throw new Error(`Cannot parse given url: ${urlLike}`);\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n let sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(');\n\n // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n const location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/);\n\n // remove the parenthesized location from the line, if it was matched\n sanitizedLine = location\n ? sanitizedLine.replace(location[0], '')\n : sanitizedLine;\n\n const tokens = sanitizedLine.split(/\\s+/).slice(1);\n // if a location was matched, pass it to extractLocation() otherwise pop the last token\n const locationParts = this.extractLocation(\n location ? location[1] : tokens.pop(),\n );\n const functionName = tokens.join(' ') || undefined;\n const fileName =\n ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1\n ? undefined\n : locationParts[0];\n\n return new StackFrame({\n functionName,\n fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n parseFFOrSafari: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return filtered.map(function (line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1',\n );\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line,\n });\n } else {\n const functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n const matches = line.match(functionNameRegex);\n const functionName = matches && matches[1] ? matches[1] : undefined;\n const locationParts = this.extractLocation(\n line.replace(functionNameRegex, ''),\n );\n\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }\n }, this);\n },\n parseOpera: function (e: {\n stacktrace?: string;\n message: string;\n stack?: string;\n }): StackFrame[] {\n if (\n !e.stacktrace ||\n (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)\n ) {\n return this.parseOpera9(e as { message: string });\n } else if (!e.stack) {\n return this.parseOpera10(e as { stacktrace: string });\n } else {\n return this.parseOpera11(e as { stack: string });\n }\n },\n parseOpera9: function (e: { message: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n const lines = e.message.split('\\n');\n const result = [];\n\n for (let i = 2, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n parseOpera10: function (e: { stacktrace: string }) {\n const lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n const lines = e.stacktrace.split('\\n');\n const result = [];\n\n for (let i = 0, len = lines.length; i < len; i += 2) {\n const match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: parseFloat(match[1]),\n }),\n );\n }\n }\n\n return result;\n },\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function (error: { stack: string }) {\n const filtered = error.stack.split('\\n').filter(function (line) {\n return (\n !!line.match(FIREFOX_SAFARI_STACK_REGEXP) &&\n !line.match(/^Error created at/)\n );\n }, this);\n\n return filtered.map(function (line: string) {\n const tokens = line.split('@');\n const locationParts = this.extractLocation(tokens.pop());\n const functionCall = tokens.shift() || '';\n const functionName =\n functionCall\n .replace(/<anonymous function(: (\\w+))?>/, '$2')\n .replace(/\\([^)]*\\)/g, '') || undefined;\n return new StackFrame({\n functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n });\n }, this);\n },\n};\n", "/**\n * this file is used to serialize log message to string\n *\n */\n\nimport type { StringifyOptions } from './index';\n\n/**\n * transfer the node path in Event to string\n * @param node - the first node in a node path array\n */\nfunction pathToSelector(node: HTMLElement): string | '' {\n if (!node || !node.outerHTML) {\n return '';\n }\n\n let path = '';\n while (node.parentElement) {\n let name = node.localName;\n if (!name) {\n break;\n }\n name = name.toLowerCase();\n const parent = node.parentElement;\n\n const domSiblings = [];\n\n if (parent.children && parent.children.length > 0) {\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.localName && sibling.localName.toLowerCase) {\n if (sibling.localName.toLowerCase() === name) {\n domSiblings.push(sibling);\n }\n }\n }\n }\n\n if (domSiblings.length > 1) {\n name += `:eq(${domSiblings.indexOf(node)})`;\n }\n path = name + (path ? '>' + path : '');\n node = parent;\n }\n\n return path;\n}\n\n/**\n * judge is object\n */\nfunction isObject(obj: unknown): boolean {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * judge the object's depth\n */\nfunction isObjTooDeep(obj: Record<string, unknown>, limit: number): boolean {\n if (limit === 0) {\n return true;\n }\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (\n isObject(obj[key]) &&\n isObjTooDeep(obj[key] as Record<string, unknown>, limit - 1)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * stringify any js object\n * @param obj - the object to stringify\n */\nexport function stringify(\n obj: unknown,\n stringifyOptions?: StringifyOptions,\n): string {\n const options: StringifyOptions = {\n numOfKeysLimit: 50,\n depthOfLimit: 4,\n };\n Object.assign(options, stringifyOptions);\n const stack: unknown[] = [];\n const keys: unknown[] = [];\n return JSON.stringify(\n obj,\n function (key, value: string | bigint | object | null | undefined) {\n /**\n * forked from https://github.com/moll/json-stringify-safe/blob/master/stringify.js\n * to deCycle the object\n */\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) {\n if (stack[0] === value) {\n value = '[Circular ~]';\n } else {\n value =\n '[Circular ~.' +\n keys.slice(0, stack.indexOf(value)).join('.') +\n ']';\n }\n }\n } else {\n stack.push(value);\n }\n /* END of the FORK */\n\n if (value === null) return value;\n if (value === undefined) return 'undefined';\n if (shouldIgnore(value as object)) {\n return toString(value as object);\n }\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n if (value instanceof Event) {\n const eventResult: Record<string, unknown> = {};\n for (const eventKey in value) {\n const eventValue = (value as unknown as Record<string, unknown>)[\n eventKey\n ];\n if (Array.isArray(eventValue)) {\n eventResult[eventKey] = pathToSelector(\n (eventValue.length ? eventValue[0] : null) as HTMLElement,\n );\n } else {\n eventResult[eventKey] = eventValue;\n }\n }\n return eventResult;\n } else if (value instanceof Node) {\n if (value instanceof HTMLElement) {\n return value ? value.outerHTML : '';\n }\n return value.nodeName;\n } else if (value instanceof Error) {\n return value.stack\n ? value.stack + '\\nEnd of stack for Error object'\n : value.name + ': ' + value.message;\n }\n return value;\n },\n );\n\n /**\n * whether we should ignore obj's info and call toString() function instead\n */\n function shouldIgnore(_obj: object): boolean {\n // outof keys limit\n if (isObject(_obj) && Object.keys(_obj).length > options.numOfKeysLimit) {\n return true;\n }\n\n // is function or bigint\n if (typeof _obj === 'function') {\n return true;\n }\n\n /**\n * judge object's depth to avoid browser's OOM\n *\n * issues: https://github.com/rrweb-io/rrweb/issues/653\n */\n if (\n isObject(_obj) &&\n isObjTooDeep(_obj as Record<string, unknown>, options.depthOfLimit)\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * limit the toString() result according to option\n */\n function toString(_obj: object): string {\n let str = _obj.toString();\n if (options.stringLengthLimit && str.length > options.stringLengthLimit) {\n str = `${str.slice(0, options.stringLengthLimit)}...`;\n }\n return str;\n }\n}\n", "import type { listenerHandler, RecordPlugin, IWindow } from '@rrweb/types';\nimport { patch } from '@rrweb/utils';\nimport { ErrorStackParser, StackFrame } from './error-stack-parser';\nimport { stringify } from './stringify';\n\nexport type StringifyOptions = {\n // limit of string length\n stringLengthLimit?: number;\n /**\n * limit of number of keys in an object\n * if an object contains more keys than this limit, we would call its toString function directly\n */\n numOfKeysLimit: number;\n /**\n * limit number of depth in an object\n * if an object is too deep, toString process may cause browser OOM\n */\n depthOfLimit: number;\n};\n\ntype LogRecordOptions = {\n level?: LogLevel[];\n lengthThreshold?: number;\n stringifyOptions?: StringifyOptions;\n logger?: Logger | 'console';\n};\n\nconst defaultLogOptions: LogRecordOptions = {\n level: [\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n ],\n lengthThreshold: 1000,\n logger: 'console',\n};\n\nexport type LogData = {\n level: LogLevel;\n trace: string[];\n payload: string[];\n};\n\ntype logCallback = (p: LogData) => void;\n\n/* fork from interface Console */\n// all kinds of console functions\nexport type Logger = {\n assert?: typeof console.assert;\n clear?: typeof console.clear;\n count?: typeof console.count;\n countReset?: typeof console.countReset;\n debug?: typeof console.debug;\n dir?: typeof console.dir;\n dirxml?: typeof console.dirxml;\n error?: typeof console.error;\n group?: typeof console.group;\n groupCollapsed?: typeof console.groupCollapsed;\n groupEnd?: () => void;\n info?: typeof console.info;\n log?: typeof console.log;\n table?: typeof console.table;\n time?: typeof console.time;\n timeEnd?: typeof console.timeEnd;\n timeLog?: typeof console.timeLog;\n trace?: typeof console.trace;\n warn?: typeof console.warn;\n};\n\nexport type LogLevel = keyof Logger;\n\nfunction initLogObserver(\n cb: logCallback,\n win: IWindow, // top window or in an iframe\n options: LogRecordOptions,\n): listenerHandler {\n const logOptions = (\n options ? Object.assign({}, defaultLogOptions, options) : defaultLogOptions\n ) as {\n level: LogLevel[];\n lengthThreshold: number;\n stringifyOptions?: StringifyOptions;\n logger: Logger | 'console';\n };\n const loggerType = logOptions.logger;\n if (!loggerType) {\n return () => {\n //\n };\n }\n let logger: Logger;\n if (typeof loggerType === 'string') {\n logger = win[loggerType];\n } else {\n logger = loggerType;\n }\n let logCount = 0;\n let inStack = false;\n const cancelHandlers: listenerHandler[] = [];\n // add listener to thrown errors\n if (logOptions.level.includes('error')) {\n const errorHandler = (event: ErrorEvent) => {\n const message = event.message,\n error = event.error as Error;\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n const payload = [stringify(message, logOptions.stringifyOptions)];\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('error', errorHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('error', errorHandler);\n });\n const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {\n let error: Error;\n let payload: string[];\n if (event.reason instanceof Error) {\n error = event.reason;\n payload = [\n stringify(\n `Uncaught (in promise) ${error.name}: ${error.message}`,\n logOptions.stringifyOptions,\n ),\n ];\n } else {\n error = new Error();\n payload = [\n stringify('Uncaught (in promise)', logOptions.stringifyOptions),\n stringify(event.reason, logOptions.stringifyOptions),\n ];\n }\n const trace: string[] = ErrorStackParser.parse(error).map(\n (stackFrame: StackFrame) => stackFrame.toString(),\n );\n cb({\n level: 'error',\n trace,\n payload,\n });\n };\n win.addEventListener('unhandledrejection', unhandledrejectionHandler);\n cancelHandlers.push(() => {\n win.removeEventListener('unhandledrejection', unhandledrejectionHandler);\n });\n }\n for (const levelType of logOptions.level) {\n cancelHandlers.push(replace(logger, levelType));\n }\n return () => {\n cancelHandlers.forEach((h) => h());\n };\n\n /**\n * replace the original console function and record logs\n * @param logger - the logger object such as Console\n * @param level - the name of log function to be replaced\n */\n function replace(_logger: Logger, level: LogLevel) {\n if (!_logger[level]) {\n return () => {\n //\n };\n }\n // replace the logger.{level}. return a restore function\n return patch(\n _logger,\n level,\n (original: (...args: Array<unknown>) => void) => {\n return (...args: Array<unknown>) => {\n original.apply(this, args);\n\n if (level === 'assert' && !!args[0]) {\n // assert does not log if the first argument evaluates to true\n return;\n }\n\n if (inStack) {\n // If we are already in a stack this means something from the following code is calling a console method\n // likely a proxy method called from stringify. We don't want to log this as it will cause an infinite loop\n return;\n }\n inStack = true;\n try {\n const trace = ErrorStackParser.parse(new Error())\n .map((stackFrame: StackFrame) => stackFrame.toString())\n .splice(1); // splice(1) to omit the hijacked log function\n\n // assert does not log its first arg, that's only used for deciding whether to log\n const argsForPayload = level === 'assert' ? args.slice(1) : args;\n\n const payload = argsForPayload.map((s) =>\n stringify(s, logOptions.stringifyOptions),\n );\n logCount++;\n if (logCount < logOptions.lengthThreshold) {\n cb({\n level,\n trace,\n payload,\n });\n } else if (logCount === logOptions.lengthThreshold) {\n // notify the user\n cb({\n level: 'warn',\n trace: [],\n payload: [\n stringify('The number of log records reached the threshold.'),\n ],\n });\n }\n } catch (error) {\n original('rrweb logger error:', error, ...args);\n } finally {\n inStack = false;\n }\n };\n },\n );\n }\n}\n\nexport const PLUGIN_NAME = 'rrweb/console@1';\n\nexport const getRecordConsolePlugin: (\n options?: LogRecordOptions,\n) => RecordPlugin = (options) => ({\n name: PLUGIN_NAME,\n observer: initLogObserver,\n options: options,\n});\n"],
"mappings": "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",
"names": ["patch", "source", "name", "replacement", "original", "wrapped", "e", "StackFrame", "obj", "__publicField", "lineNumber", "columnNumber", "FIREFOX_SAFARI_STACK_REGEXP", "CHROME_IE_STACK_REGEXP", "SAFARI_NATIVE_CODE_REGEXP", "ErrorStackParser", "error", "urlLike", "parts", "line", "sanitizedLine", "location", "tokens", "locationParts", "functionName", "fileName", "functionNameRegex", "matches", "lineRE", "lines", "result", "len", "match", "pathToSelector", "node", "path", "parent", "domSiblings", "i", "sibling", "isObject", "isObjTooDeep", "limit", "keys", "key", "stringify", "stringifyOptions", "options", "stack", "value", "thisPos", "shouldIgnore", "toString", "eventResult", "eventKey", "eventValue", "_obj", "str", "defaultLogOptions", "initLogObserver", "cb", "win", "logOptions", "loggerType", "logger", "logCount", "inStack", "cancelHandlers", "errorHandler", "event", "message", "trace", "stackFrame", "payload", "unhandledrejectionHandler", "levelType", "replace", "h", "_logger", "level", "args", "s", "PLUGIN_NAME", "getRecordConsolePlugin"]
}
{
"name": "@rrweb/rrweb-plugin-console-record",
"version": "2.0.0-alpha.20",
"version": "2.0.0",
"description": "",

@@ -23,2 +23,3 @@ "type": "module",

"files": [
"umd",
"dist",

@@ -49,5 +50,5 @@ "package.json"

"devDependencies": {
"rrweb": "^2.0.0-alpha.20",
"rrweb": "^2.0.0",
"typescript": "^5.4.5",
"vite": "^5.3.1",
"vite": "^6.0.1",
"vite-plugin-dts": "^3.9.1",

@@ -58,5 +59,5 @@ "vitest": "^1.4.0",

"peerDependencies": {
"rrweb": "^2.0.0-alpha.20",
"@rrweb/utils": "^2.0.0-alpha.20"
"rrweb": "^2.0.0",
"@rrweb/utils": "^2.0.0"
}
}