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