UNPKG

@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
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 };