UNPKG

vite-uni-dev-tool

Version:

vite-uni-dev-tool, debug, uni-app, 一处编写,到处调试

933 lines (932 loc) 26.6 kB
import { backup as S } from "../core.js"; import "../utils/index.js"; import { transformValueToView as j, transformValueToShortString as P } from "../utils/language.js"; import { getCurrentPagePath as k } from "../utils/page.js"; import { getCurrentDate as I } from "../utils/date.js"; import { parseValue as q, omit as W } from "../utils/object.js"; import { escapeHTML as B } from "../utils/string.js"; class X { constructor(e) { this.initPinia = !1, this.cache$on = /* @__PURE__ */ new Map(), this.cache$once = /* @__PURE__ */ new Map(), this.cache$emit = /* @__PURE__ */ new Map(), this.cache$off = /* @__PURE__ */ new Map(), this.event = e.event; } init({ enableCaptureScreen: e, enableInterceptPromiseReject: t }) { this.enableCaptureScreen = e, this.enableInterceptPromiseReject = t, this.interceptAppError(), this.interceptAppConsole(), this.interceptSetStorage(), this.interceptRemoveStorage(), this.interceptClearStorage(), this.interceptUploadFile(), this.interceptRequest(), this.interceptSocket(), this.interceptSwitchTab(), this.interceptNavigateTo(), this.interceptNavigateBack(), this.interceptReLaunch(), this.interceptRedirectTo(), this.interceptUniEvent(), this.interceptScanCode(), this.enableCaptureScreen && this.interceptCaptureScreen(), this.interceptScreenRecording(), this.enableInterceptPromiseReject && this.interceptPromiseReject(); } reset() { this.resetInterceptAppConsole(), this.resetInterceptPromiseReject(), this.resetInterceptErrorApp(), this.resetInterceptStorage(), this.resetInterceptClearStorage(), this.resetInterceptRemoveStorage(), this.resetInterceptRequest(), this.resetInterceptSocket(), this.resetInterceptUploadFile(), this.resetInterceptNavigateTo(), this.resetInterceptSwitchTab(), this.resetUniEvent(), this.resetInterceptScanCode(), this.enableCaptureScreen && this.resetInterceptCaptureScreen(), this.resetInterceptScreenRecording(), this.enableInterceptPromiseReject && this.resetInterceptPromiseReject(); } /** * app 中拦截 console * app * @memberof DevIntercept */ interceptAppConsole() { if (!uni.__log__) return; const e = this; Object.defineProperty(uni, "__log__", { writable: !1, value: function(t, r, ...c) { S.__log__(t, r, ...c); const i = k(); e.event.updateConsoleList([ { type: t, position: i, time: I(), args: c.map((o) => { const u = j(o), n = q(o), m = u === "object" || u === "array" ? P(n, u) : ""; return { type: u, value: n, shortValue: m }; }), stack: r } ]); } }); } /** * 重置console * * @memberof DevEvent */ resetInterceptAppConsole() { uni.__log__ && Object.defineProperty(uni, "__log__", { writable: !0, value: S.__log__ }); } /** * 拦截 vue3 信息 * * @memberof DevIntercept */ interceptVue(e) { if (!e) return; const t = (c, i, o) => { this.event.getDevToolDestroy() || this.interceptErrorVue(c); }, r = (c, i, o) => { this.event.getDevToolDestroy() || this.interceptWarnVue(c + ` ` + o); }; e.appContext ? (e.appContext.config.errorHandler = t, e.appContext.config.warnHandler = r) : (e.config.errorHandler = t, e.config.warnHandler = r); } /** * app 中捕获全局错误 * * @memberof DevIntercept */ interceptAppError() { uni.onError((e) => { var c, i; if (this.event.getDevToolDestroy()) return; const t = e.toString(), r = ((i = (c = e == null ? void 0 : e.stack) == null ? void 0 : c.split(` `)) == null ? void 0 : i[1]) ?? ""; this.event.updateConsoleList([ { type: "error", args: [ { type: "string", value: t } ], position: k(), time: I(), stack: r } ]); }); } /** * 重置劫持 app 错误 * * @memberof DevEvent */ resetInterceptErrorApp() { uni.onError(() => { }); } /** * 拦截 app 错误 * * @param {*} error * @memberof DevIntercept */ interceptErrorVue(e) { var c; const t = (c = e == null ? void 0 : e.stack) == null ? void 0 : c.split(` `), r = t == null ? void 0 : t[1]; console.error(e), this.event.updateConsoleList([ { type: "error", args: [ { type: "string", value: e.toString() } ], position: k(), time: I(), stack: r } ]); } /** * 拦截 app 警告 * * @param {*} warn * @return {*} * @memberof DevIntercept */ interceptWarnVue(e) { var o, u, n, l; if (this.preWarn === e) return; this.preWarn = e; const t = k(), r = (u = (o = new Error()) == null ? void 0 : o.stack) == null ? void 0 : u.split(` `), c = (n = r == null ? void 0 : r.slice(2)) == null ? void 0 : n[0]; console.warn(e); const i = (l = e.split(` `)) == null ? void 0 : l.map((m) => B(m)).join(` `); this.event.updateConsoleList([ { type: "warn", args: [ { type: "string", value: i } ], position: t, time: I(), stack: c } ]); } /** * 拦截 promise reject * * @memberof DevIntercept */ interceptPromiseReject() { Object.defineProperty(Promise, "reject", { configurable: !0, value: function(e) { return this.interceptErrorApp(e), S.reject.call(Promise, e); } }); } /** * 拦截 switch 跳转 * * @memberof DevIntercept */ interceptSwitchTab() { const e = this; uni.addInterceptor("switchTab", { invoke(t) { const r = t.complete; t.complete = function(c) { var o, u, n; r && r(c); const i = ((n = (u = (o = t.url) == null ? void 0 : o.slice(1)) == null ? void 0 : u.split("?")) == null ? void 0 : n[0]) || "/"; e.event.updateRouteList(i), e.event.closeDevToolWindow(); }; } }); } /** * 重置 nav 跳转 * * @memberof DevEvent */ resetInterceptSwitchTab() { uni.removeInterceptor("switchTab"); } /** * 拦截 redirect to * * @memberof DevIntercept */ interceptRedirectTo() { const e = this; uni.addInterceptor("redirectTo", { invoke(t) { const r = t.complete; t.complete = function(c) { var o, u, n; r && r(c); const i = ((n = (u = (o = t.url) == null ? void 0 : o.slice(1)) == null ? void 0 : u.split("?")) == null ? void 0 : n[0]) || "/"; e.event.updateRouteList(i), e.event.closeDevToolWindow(); }; } }); } /** * 重置页面重定向 * * @memberof DevIntercept */ resetInterceptRedirectTo() { uni.removeInterceptor("redirectTo"); } /** * 拦截 relaunch * * @memberof DevIntercept */ interceptReLaunch() { const e = this; uni.addInterceptor("reLaunch", { invoke(t) { const r = t.complete; t.complete = function(c) { var o, u, n; r && r(c); const i = ((n = (u = (o = t.url) == null ? void 0 : o.slice(1)) == null ? void 0 : u.split("?")) == null ? void 0 : n[0]) || "/"; e.event.updateRouteList(i), e.event.closeDevToolWindow(); }; } }); } /** * 重置页面重定向 * * @memberof DevIntercept */ resetInterceptReLaunch() { uni.removeInterceptor("reLaunch"); } /** * 拦截 navigate back * * @memberof DevIntercept */ interceptNavigateBack() { const e = this; uni.addInterceptor("navigateBack", { invoke(t) { const r = t.complete; t.complete = function(c) { var o, u, n; r && r(c); const i = ((n = (u = (o = t.url) == null ? void 0 : o.slice(1)) == null ? void 0 : u.split("?")) == null ? void 0 : n[0]) || "/"; e.event.updateRouteList(i), e.event.closeDevToolWindow(); }; } }); } /** * 重置页面返回 * * @memberof DevIntercept */ resetInterceptNavigateBack() { uni.removeInterceptor("navigateBack"); } /** * 拦截页面跳转 * * @memberof DevIntercept */ interceptNavigateTo() { const e = this; uni.addInterceptor("navigateTo", { invoke(t) { const r = t.complete; t.complete = function(c) { var o, u, n; r && r(c); const i = ((n = (u = (o = t.url) == null ? void 0 : o.slice(1)) == null ? void 0 : u.split("?")) == null ? void 0 : n[0]) || "/"; e.event.updateRouteList(i), e.event.closeDevToolWindow(); }; } }); } /** * 重置页面跳转 * * @memberof DevEvent */ resetInterceptNavigateTo() { uni.removeInterceptor("navigateTo"); } /** * 拦截网络请求 * * @memberof DevIntercept */ interceptRequest() { const e = this; uni.addInterceptor("request", { invoke(t) { var D, E, R, _, L, U, x; const r = e.event.getRequestIndex(), c = e.event.setRequestIndex(r + 1), i = t.url, o = (D = i == null ? void 0 : i.split("?")) == null ? void 0 : D[0], u = o == null ? void 0 : o.lastIndexOf("/"), n = (o == null ? void 0 : o.slice(u + 1)) ?? "", l = (R = (E = new Error()) == null ? void 0 : E.stack) == null ? void 0 : R.split(` `), m = uni.__dev_tool_platform__ === "app" ? l == null ? void 0 : l[2] : l == null ? void 0 : l[5], p = e.event.getInterceptNetworkMap(), s = `${(_ = t.method) == null ? void 0 : _.toUpperCase()}|${o}`, a = p == null ? void 0 : p.get(s), d = Object.keys(t.header ?? {}).includes( "dev-tool-sponsor" ) ? "dev_tool" : "user"; t.header = { ...W(t.header, ["dev-tool-sponsor"]) }; const h = { index: c, stack: m, url: t.url, name: n, startTime: Date.now(), endTime: 0, time: "-", headers: { requestHeader: Object.entries(t.header ?? {}).map( ([v, b]) => ({ key: v, value: b }) ), responseHeader: [] }, method: t.method || "GET", status: "pending", payload: t != null && t.data ? JSON.stringify(t.data) : "", response: { data: void 0, statusCode: 0, header: {}, cookies: [], errMsg: "" }, size: "", sponsor: d }; a && (h.headers.requestHeader = { ...h.headers.requestHeader, // 拦截规则中的请求头权重更高 ...a.headers.requestHeader }, h.payload = { ...a.payload }, h.intercepted = !0, Object.assign(t, { timeout: a.timeout })), e.event.updateNetworkList([h]); const f = { errMsg: "" }; let T = !0; a && (f.statusCode = a.status, (U = (L = a == null ? void 0 : a.status) == null ? void 0 : L.toString()) != null && U.startsWith("2") ? (T = !0, f.errMsg = "request:ok", f.header = (x = a.headers.responseHeader) == null ? void 0 : x.reduce( (v, b) => ({ ...v, [b.key]: b.value }), {} ), f.data = a.response.data) : (T = !1, f.errMsg = "request:fail")); let y = t.fail, g = t.success, C = t.complete; t.fail = function(v) { a ? T ? g == null || g(f) : y == null || y(f) : y == null || y(v); }, t.success = function(v) { a ? T ? g == null || g(f) : y == null || y(f) : g == null || g(v); }, t.complete = function(v) { var F, H; const b = Date.now() - h.startTime; h.time = b < 1e3 ? b + "ms" : b / 1e3 + "s", h.endTime = Date.now(); const w = ((F = v == null ? void 0 : v.header) == null ? void 0 : F["Content-Length"]) || ((H = v == null ? void 0 : v.header) == null ? void 0 : H["content-length"]) || 0; h.size = w > 1024 ? (w / 1024).toFixed(2) + "k" : w + "b", a ? (C == null || C(f), h.status = a.status, h.response = f, h.headers.responseHeader = a.headers.responseHeader) : (C == null || C(v), h.status = v.statusCode ?? "error", h.response = v, h.headers.responseHeader = Object.entries( v.header ?? {} ).map(([V, M]) => ({ key: V, value: M }))), e.event.updateNetworkList([h], c); }; } }); } /** * 重置网络监听 * * @memberof DevEvent */ resetInterceptRequest() { uni.removeInterceptor("request"); } /** * 拦截 websocket * * @memberof DevIntercept */ interceptSocket() { const e = this, t = function(r) { const c = r.url, i = Object.entries(r.header ?? {}).map( ([s, a]) => ({ key: s, value: a }) ), o = (r.method ?? "GET").toLowerCase(), u = r.protocols ?? []; e.event.updateWsList({ url: c, headers: i, method: o, protocols: u, readyState: "connection", message: [] }); const n = S.connectSocket({ ...r, // 强制生成 socketTask multiple: !0, complete: (s) => { var a; (a = r == null ? void 0 : r.complete) == null || a.call(r, s); } }); function l(s, a, d, h) { const f = j(s), T = q(s), g = f === "object" || f === "array" ? P(T, f) : ""; e.event.updateWsList({ url: c, readyState: d, headers: i, protocols: u, message: [ { value: T, valueType: f, shortValue: g, status: h, time: Date.now(), type: a } ] }); } const m = n.send; n.send = (s) => { m.call(n, { data: s.data, fail: (a) => { var d; (d = s == null ? void 0 : s.fail) == null || d.call(s, a), l(a, "send", "error", "error"); }, success: (a) => { var d; (d = s == null ? void 0 : s.success) == null || d.call(s, a), l(a, "send", "open", "success"); }, complete: (a) => { var d; (d = s == null ? void 0 : s.complete) == null || d.call(s, a); } }); }; const p = n.close; return n.close = (s) => { e.event.updateWsList({ url: c, readyState: "closing", headers: i, protocols: u, message: [] }), p.call(n, { ...s, fail: (a) => { var d; (d = s == null ? void 0 : s.fail) == null || d.call(s, a), l(a, "send", "closing", "error"); }, success: (a) => { var d; (d = s == null ? void 0 : s.success) == null || d.call(s, a), l(a, "send", "closed", "success"); }, complete: (a) => { var d; (d = s == null ? void 0 : s.complete) == null || d.call(s, a); } }); }, n.onError((s) => { l(s, "receive", "error", "error"); }), n.onMessage((s) => { l(s, "receive", "open", "success"); }), n.onClose((s) => { l(s, "receive", "closed", "success"); }), n; }; Object.defineProperty(uni, "connectSocket", { configurable: !0, value: t }); } resetInterceptSocket() { Object.defineProperty(uni, "connectSocket", { configurable: !0, value: S.connectSocket }); } /** * 拦截 uni.setStorageSync 和 uni.setStorage * * @memberof DevIntercept */ interceptSetStorage() { const e = this; Object.defineProperty(uni, "setStorageSync", { configurable: !0, value: function(t, r) { S.setStorageSync(t.toString(), r), e.event.updateStoreList([ { key: t.toString(), _oldKey: t.toString(), value: r } ]); } }), uni.addInterceptor("setStorage", { invoke(t) { const r = t.complete; t.complete = function(c) { var i, o; r && r(c), e.event.updateStoreList([ { key: (i = t.key) == null ? void 0 : i.toString(), _oldKey: (o = t.key) == null ? void 0 : o.toString(), value: t.data } ]); }; } }); } /** * 重置 storage 函数 * * @memberof DevEvent */ resetInterceptStorage() { uni.removeInterceptor("setStorage"), Object.defineProperty(uni, "setStorage", { configurable: !0, value: function(e, t) { S.setStorageSync(e, t); } }), uni.removeInterceptor("clearStorage"), Object.defineProperty(uni, "clearStorage", { configurable: !0, value: function() { S.clearStorageSync(); } }), uni.removeInterceptor("removeStorage"), Object.defineProperty(uni, "removeStorageSync", { configurable: !0, value: function(e) { S.removeStorageSync(e); } }); } /** * 拦截 uni.clearStorageSync 和 uni.clearStorage * * @memberof DevIntercept */ interceptClearStorage() { const e = this; Object.defineProperty(uni, "clearStorage", { configurable: !0, value: function() { S.clearStorage(), e.event.clearStorage(); } }), uni.addInterceptor("clearStorage", { invoke() { e.event.clearStorage(); } }); } /** * 重置 clearStorage 函数 * * @memberof DevIntercept */ resetInterceptClearStorage() { Object.defineProperty(uni, "clearStorage", { configurable: !0, value: S.clearStorage }), uni.removeInterceptor("clearStorage"); } /** * 拦截 uni.removeStorageSync 和 uni.removeStorage * * @memberof DevIntercept */ interceptRemoveStorage() { const e = this; Object.defineProperty(uni, "removeStorageSync", { configurable: !0, value: function(t) { S.removeStorageSync(t), e.event.removeStorage(t); } }), uni.addInterceptor("removeStorage", { invoke(t) { const r = t.complete; t.complete = function(c) { r && r(c), e.event.removeStorage(t.key); }; } }); } /** * 重置 removeStorage 函数 * * @memberof DevIntercept */ resetInterceptRemoveStorage() { Object.defineProperty(uni, "removeStorageSync", { configurable: !0, value: S.removeStorageSync }), uni.removeInterceptor("removeStorage"); } /** 拦截vuex */ interceptVuexStorage(e) { var r; this.event.setVuexList(e.state), !this.event.getDevToolDestroy() && ((r = e == null ? void 0 : e.subscribe) == null || r.call(e, (c, i) => { this.event.setVuexList(i); })); } /** 拦截pinia */ interceptPiniaStore(e) { var r; if (this.initPinia || (this.initPinia = !0, this.event.setPiniaStore(e.pinia)), this.event.setPiniaList(e.pinia.state.value), !this.event.getDevToolDestroy()) return (r = e == null ? void 0 : e.store) == null || r.$subscribe(() => { this.event.setPiniaList({ [e.store.$id]: e.store.$state }); }), e.pinia; } /** * 拦截 uni.uploadFile * * 为什么不用uni.addInterceptor? * * uni.addInterceptor 无法获取上传进度,只能重写 uni.uploadFile * * @memberof DevIntercept */ interceptUploadFile() { const e = this, t = (r) => { var l, m; const c = e.event.getUploadIndex(), i = e.event.setUploadIndex(c + 1), o = (m = (l = new Error()) == null ? void 0 : l.stack) == null ? void 0 : m.split(` `), u = o == null ? void 0 : o[2]; e.event.updateUploadList( [ { index: i, stack: u, name: r.name, url: r.url, filePath: r.filePath, fileType: r.fileType, headers: { requestHeader: Object.entries(r.header || {}).map( ([p, s]) => ({ key: p, value: s }) ), responseHeader: [] }, formData: r.formData, status: "pending", progress: 0, totalBytesSent: 0, totalBytesExpectedToSend: 0, startTime: Date.now() } ], i ); const n = S.uploadFile({ ...r, success: (p) => { var s; (s = r == null ? void 0 : r.success) == null || s.call(r, p), e.event.updateUploadList( [ { index: i, status: "success", endTime: Date.now(), response: { ...p, data: JSON.parse(p.data) } } ], i ), e.event.removeUploadTask(i); }, fail: (p) => { var s; (s = r == null ? void 0 : r.fail) == null || s.call(r, p), e.event.updateUploadList( [ { index: i, status: "error", response: p, endTime: Date.now() } ], i ), e.event.removeUploadTask(i); } }); return n.onProgressUpdate((p) => { e.event.updateUploadList( [ { index: i, progress: p.progress, totalBytesSent: p.totalBytesSent, totalBytesExpectedToSend: p.totalBytesExpectedToSend, status: "uploading" } ], i ); }), e.event.addUploadTask(i, n), n; }; Object.defineProperty(uni, "uploadFile", { configurable: !0, value: t }); } /** * 重置 uni.uploadFile 函数 * * @memberof DevIntercept */ resetInterceptUploadFile() { Object.defineProperty(uni, "uploadFile", { configurable: !0, value: S.uploadFile }); } /** * uni事件工厂 * * @param {DevTool.EventCountKey} type * @param {boolean} [define=true] * @memberof DevIntercept */ uniEventFactory(e, t = !0) { const r = `$${e}`, c = this; Object.defineProperty(uni, r, { configurable: !0, value: function(i, o) { var u, n, l, m; if ((n = (u = S) == null ? void 0 : u[r]) == null || n.call(u, i, o), t) { const p = (m = (l = new Error()) == null ? void 0 : l.stack) == null ? void 0 : m.split(` `), s = p == null ? void 0 : p[2]; c.event.updateUniEventList([ { eventName: i, timer: I(), stack: s, type: e } ]), c.event.updateUniEventCount(e); } } }); } /** * 拦截 uni.on/off/emit/once * * @memberof DevIntercept */ interceptUniEvent() { this.uniEventFactory("on"), this.uniEventFactory("once"), this.uniEventFactory("emit"), this.uniEventFactory("off"); } /** * 重置拦截 uni 事件 * * @memberof DevIntercept */ resetUniEvent() { this.uniEventFactory("on", !1), this.uniEventFactory("once", !1), this.uniEventFactory("emit", !1), this.uniEventFactory("off", !1); } /** * 监听截屏 * * @memberof DevIntercept */ interceptCaptureScreen() { const e = this; function t(r) { if (!e.event.getDevToolDestroy()) { const c = e.event.getScreenIndex(), i = e.event.setScreenIndex(c + 1); e.event.updateScreenList([ { index: i, position: k(), startTime: I(), endTime: I(), type: "captureScreen", path: (r == null ? void 0 : r.path) ?? "" } ]); } } uni.__dev_tool_platform__ !== "web" && uni.onUserCaptureScreen(t); } /** * 重置截屏 * * @memberof DevIntercept */ resetInterceptCaptureScreen() { uni.__dev_tool_platform__ !== "web" && uni.offUserCaptureScreen(() => { }); } /** * 监听记录屏幕 * * @param {string} state * @memberof DevIntercept */ listenerScreenRecording(e) { console.log("state: ", e); const t = this.event.getScreenIndex(), r = this.event.setScreenIndex(t + 1), c = { index: r, position: k(), startTime: I(), endTime: "", type: "recordingScreen" }; e === "start" ? this.event.updateScreenList([c]) : (c.endTime = I(), this.event.updateScreenList([c], r)); } /** * 监听屏幕录制 * * @memberof DevIntercept */ interceptScreenRecording() { } /** * 重置屏幕录制 * * @memberof DevEvent */ resetInterceptScreenRecording() { } /** * 重置拦截 promise reject * * @memberof DevEvent */ resetInterceptPromiseReject() { Object.defineProperty(Promise, "reject", { configurable: !0, value: function(e) { return S.reject.call(Promise, e); } }); } /** * 拦截扫码 * * @memberof DevIntercept */ interceptScanCode() { const e = this; uni.addInterceptor("scanCode", { invoke(t) { var o, u; const r = t.complete, c = (u = (o = new Error()) == null ? void 0 : o.stack) == null ? void 0 : u.split(` `), i = c == null ? void 0 : c[5]; t.complete = function(n) { r && r(n); let l = {}, m = ""; try { l = JSON.parse(n == null ? void 0 : n.result); const p = j(l); m = P(l, p); } catch { l = {}, m = P(n == null ? void 0 : n.result, "string"); } e.event.updateScanCodeList([ { timer: Date.now(), charSet: n == null ? void 0 : n.charSet, rawData: n == null ? void 0 : n.rawData, result: n == null ? void 0 : n.result, resultObject: l, scanType: n == null ? void 0 : n.scanType, errMsg: n == null ? void 0 : n.errMsg, path: k(), stack: i, shortValue: m } ]); }; } }); } /** * 重置拦截扫码 * * @memberof DevIntercept */ resetInterceptScanCode() { uni.removeInterceptor("scanCode"); } } export { X as DevIntercept };