@ustinian-wang/js-monitor
Version:
A universal front-end error monitor and reporting tool for Vue and JS.
125 lines (124 loc) • 3.75 kB
JavaScript
function h(e) {
return typeof e == "function";
}
function w(e, r = () => {
}) {
return function(...s) {
e.apply(this, s), r.apply(this, s);
};
}
function W(e) {
t("setupVue start", e);
let r = window.Vue;
if (r) {
t("vue proxy warn handler start");
let s = (u, a, l) => {
var p, d;
(p = e.warnHandler) == null || p.call(e, u, a, l), o(e, {
type: "vue-warn",
error: u,
vmName: (d = a == null ? void 0 : a.$options) == null ? void 0 : d.name,
info: l
});
};
r.config.warnHandler ? r.config.warnHandler = w(r.config.warnHandler, s) : r.config.warnHandler = s, t("vue proxy warn handler end"), t("vue proxy error handler start");
let n = (u, a, l) => {
var p, d;
(p = e.errorHandler) == null || p.call(e, u, a, l), o(e, {
type: "vue-error",
error: u,
vmName: (d = a == null ? void 0 : a.$options) == null ? void 0 : d.name,
info: l
});
};
r.config.errorHandler ? r.config.errorHandler = w(r.config.errorHandler, n) : r.config.errorHandler = n, t("vue proxy error handler end");
}
t("setupVue end", e);
}
function j(e) {
t("setupWin start"), t("setupWin onerror start");
let r = function(s, n, u, a, l) {
var p;
(p = e.onerror) == null || p.call(e, s, n, u, a, l), o(e, {
type: "onerror",
message: s,
source: n,
lineno: u,
colno: a,
stack: l == null ? void 0 : l.stack,
error: l
});
};
window.onerror ? window.onerror = w(window.onerror, r) : window.onerror = r, t("setupWin onerror end"), t("setupWin unhandledrejection start"), window.addEventListener("unhandledrejection", function(s) {
var n, u, a;
(n = e.unhandledrejection) == null || n.call(e, s), o(e, {
type: "unhandledrejection",
reason: s.reason,
stack: (u = s.reason) == null ? void 0 : u.stack,
error: s.reason,
message: (a = s.reason) == null ? void 0 : a.message
});
}), t("setupWin unhandledrejection end"), t("setupWin error start"), window.addEventListener(
"error",
function(s) {
var l, p;
(l = e.error) == null || l.call(e, s);
const n = s.target;
let u = (p = n == null ? void 0 : n.tagName) == null ? void 0 : p.toLowerCase();
n && ["img", "script", "link"].includes(u) && o(e, {
type: "resource-error",
tagName: u,
src: n.src || n.href
});
},
!0
// 必须捕获阶段
), t("setupWin error end");
}
function i(e) {
return { ...{}, ...e };
}
let H = !1;
function t(...e) {
H && console.log("[monitor] ", ...e);
}
let y = !1;
function m(e) {
if (t("setup launch start"), !e.force) {
if (y) {
t("setup already launch", e);
return;
}
y = !0;
}
e = i(e), H = e.debug || !1, t("setup start"), W(e), j(e), t("setup end"), t("setup launch end");
}
function o(e, r) {
var u, a, l;
(u = e.report) == null || u.call(e, e, r), t("report start"), e = i(e);
let {
appId: s = "",
api: n = ""
} = e;
if (h(e == null ? void 0 : e.filter) && (a = e == null ? void 0 : e.filter) != null && a.call(e, r)) {
t("report filter report", r);
return;
}
r = {
...r,
appId: s,
time: Date.now(),
url: location.href,
userAgent: navigator.userAgent
}, h(e == null ? void 0 : e.transform) && (t("report transform before", r), r = (l = e == null ? void 0 : e.transform) == null ? void 0 : l.call(e, r), t("report transform after", r)), typeof n == "string" ? (t("report api function", r), fetch(n, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(r)
})) : (t("report api fetch", r), n(r));
}
export {
o as report,
m as setup
};