From 71080cf180f2e38f15fcfd0535b3a52593e3a7d6 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Mon, 23 May 2022 18:26:39 +0800 Subject: [PATCH] feat(push): normalize message --- packages/uni-api/src/service/plugin/push.ts | 29 +- packages/uni-app-plus/dist/uni.runtime.esm.js | 30 +- packages/uni-h5/dist/uni-h5.es.js | 29 +- packages/uni-mp-alipay/dist/uni.api.esm.js | 30 +- packages/uni-mp-baidu/dist/uni.api.esm.js | 30 +- packages/uni-mp-kuaishou/dist/uni.api.esm.js | 30 +- packages/uni-mp-lark/dist/uni.api.esm.js | 30 +- packages/uni-mp-qq/dist/uni.api.esm.js | 30 +- packages/uni-mp-toutiao/dist/uni.api.esm.js | 30 +- packages/uni-mp-weixin/dist/uni.api.esm.js | 30 +- .../uni-quickapp-webview/dist/uni.api.esm.js | 30 +- .../dist/uni-stacktracey.es.js | 406 +++++++++--------- 12 files changed, 487 insertions(+), 247 deletions(-) diff --git a/packages/uni-api/src/service/plugin/push.ts b/packages/uni-api/src/service/plugin/push.ts index e96a2013c..78d26337d 100644 --- a/packages/uni-api/src/service/plugin/push.ts +++ b/packages/uni-api/src/service/plugin/push.ts @@ -24,9 +24,24 @@ interface OnPushClickCallback { let cid: string | undefined let cidErrMsg: string | undefined -function normalizePushMessage(message: unknown) { +function normalizePushMessage(type: 'receive' | 'click', message: unknown) { try { - return JSON.parse(message as string) + const res = JSON.parse(message as string) as Record + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps + } + return res.payload + } + } else if (type === 'click') { + delete res.type + delete res.__UUID__ + delete res.appid + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title + } + } } catch (e: any) {} return message } @@ -47,11 +62,17 @@ export function invokePushCallback( invokeGetPushCidCallbacks(cid, args.errMsg) } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }) + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }) }) } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }) + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }) }) } } diff --git a/packages/uni-app-plus/dist/uni.runtime.esm.js b/packages/uni-app-plus/dist/uni.runtime.esm.js index d65685d29..67eab4598 100644 --- a/packages/uni-app-plus/dist/uni.runtime.esm.js +++ b/packages/uni-app-plus/dist/uni.runtime.esm.js @@ -11057,9 +11057,25 @@ const getLaunchOptionsSync = defineSyncApi(API_GET_LAUNCH_OPTIONS_SYNC, () => { let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } + else if (type === 'click') { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e) { } return message; @@ -11076,12 +11092,18 @@ function invokePushCallback(args) { } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }); + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }); }); } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }); + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }); }); } } diff --git a/packages/uni-h5/dist/uni-h5.es.js b/packages/uni-h5/dist/uni-h5.es.js index 1a63ba2b5..36caa2d8d 100644 --- a/packages/uni-h5/dist/uni-h5.es.js +++ b/packages/uni-h5/dist/uni-h5.es.js @@ -4564,9 +4564,24 @@ const getLaunchOptionsSync = /* @__PURE__ */ defineSyncApi(API_GET_LAUNCH_OPTION }); let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === "receive") { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } else if (type === "click") { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e2) { } return message; @@ -4578,11 +4593,17 @@ function invokePushCallback(args) { invokeGetPushCidCallbacks(cid, args.errMsg); } else if (args.type === "pushMsg") { onPushMessageCallbacks.forEach((callback) => { - callback({ type: "receive", data: normalizePushMessage(args.message) }); + callback({ + type: "receive", + data: normalizePushMessage("receive", args.message) + }); }); } else if (args.type === "click") { onPushMessageCallbacks.forEach((callback) => { - callback({ type: "click", data: normalizePushMessage(args.message) }); + callback({ + type: "click", + data: normalizePushMessage("click", args.message) + }); }); } } diff --git a/packages/uni-mp-alipay/dist/uni.api.esm.js b/packages/uni-mp-alipay/dist/uni.api.esm.js index fde4cbc62..8ffd001f0 100644 --- a/packages/uni-mp-alipay/dist/uni.api.esm.js +++ b/packages/uni-mp-alipay/dist/uni.api.esm.js @@ -540,9 +540,25 @@ const $emit = defineSyncApi(API_EMIT, (name, ...args) => { let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } + else if (type === 'click') { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e) { } return message; @@ -559,12 +575,18 @@ function invokePushCallback(args) { } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }); + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }); }); } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }); + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }); }); } } diff --git a/packages/uni-mp-baidu/dist/uni.api.esm.js b/packages/uni-mp-baidu/dist/uni.api.esm.js index 6fe68f081..8256027c4 100644 --- a/packages/uni-mp-baidu/dist/uni.api.esm.js +++ b/packages/uni-mp-baidu/dist/uni.api.esm.js @@ -540,9 +540,25 @@ const $emit = defineSyncApi(API_EMIT, (name, ...args) => { let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } + else if (type === 'click') { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e) { } return message; @@ -559,12 +575,18 @@ function invokePushCallback(args) { } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }); + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }); }); } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }); + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }); }); } } diff --git a/packages/uni-mp-kuaishou/dist/uni.api.esm.js b/packages/uni-mp-kuaishou/dist/uni.api.esm.js index 93845c24e..679a9120f 100644 --- a/packages/uni-mp-kuaishou/dist/uni.api.esm.js +++ b/packages/uni-mp-kuaishou/dist/uni.api.esm.js @@ -540,9 +540,25 @@ const $emit = defineSyncApi(API_EMIT, (name, ...args) => { let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } + else if (type === 'click') { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e) { } return message; @@ -559,12 +575,18 @@ function invokePushCallback(args) { } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }); + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }); }); } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }); + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }); }); } } diff --git a/packages/uni-mp-lark/dist/uni.api.esm.js b/packages/uni-mp-lark/dist/uni.api.esm.js index 3bcd537cc..dc3890fb2 100644 --- a/packages/uni-mp-lark/dist/uni.api.esm.js +++ b/packages/uni-mp-lark/dist/uni.api.esm.js @@ -540,9 +540,25 @@ const $emit = defineSyncApi(API_EMIT, (name, ...args) => { let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } + else if (type === 'click') { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e) { } return message; @@ -559,12 +575,18 @@ function invokePushCallback(args) { } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }); + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }); }); } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }); + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }); }); } } diff --git a/packages/uni-mp-qq/dist/uni.api.esm.js b/packages/uni-mp-qq/dist/uni.api.esm.js index e915a0c0b..d7fab72cf 100644 --- a/packages/uni-mp-qq/dist/uni.api.esm.js +++ b/packages/uni-mp-qq/dist/uni.api.esm.js @@ -540,9 +540,25 @@ const $emit = defineSyncApi(API_EMIT, (name, ...args) => { let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } + else if (type === 'click') { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e) { } return message; @@ -559,12 +575,18 @@ function invokePushCallback(args) { } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }); + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }); }); } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }); + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }); }); } } diff --git a/packages/uni-mp-toutiao/dist/uni.api.esm.js b/packages/uni-mp-toutiao/dist/uni.api.esm.js index edc4f1b18..87977a99e 100644 --- a/packages/uni-mp-toutiao/dist/uni.api.esm.js +++ b/packages/uni-mp-toutiao/dist/uni.api.esm.js @@ -540,9 +540,25 @@ const $emit = defineSyncApi(API_EMIT, (name, ...args) => { let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } + else if (type === 'click') { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e) { } return message; @@ -559,12 +575,18 @@ function invokePushCallback(args) { } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }); + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }); }); } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }); + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }); }); } } diff --git a/packages/uni-mp-weixin/dist/uni.api.esm.js b/packages/uni-mp-weixin/dist/uni.api.esm.js index 9046d49bd..3fdbdb30d 100644 --- a/packages/uni-mp-weixin/dist/uni.api.esm.js +++ b/packages/uni-mp-weixin/dist/uni.api.esm.js @@ -504,9 +504,25 @@ const $emit = defineSyncApi(API_EMIT, (name, ...args) => { let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } + else if (type === 'click') { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e) { } return message; @@ -523,12 +539,18 @@ function invokePushCallback(args) { } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }); + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }); }); } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }); + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }); }); } } diff --git a/packages/uni-quickapp-webview/dist/uni.api.esm.js b/packages/uni-quickapp-webview/dist/uni.api.esm.js index caa49085f..264913000 100644 --- a/packages/uni-quickapp-webview/dist/uni.api.esm.js +++ b/packages/uni-quickapp-webview/dist/uni.api.esm.js @@ -540,9 +540,25 @@ const $emit = defineSyncApi(API_EMIT, (name, ...args) => { let cid; let cidErrMsg; -function normalizePushMessage(message) { +function normalizePushMessage(type, message) { try { - return JSON.parse(message); + const res = JSON.parse(message); + if (type === 'receive') { + if (res.payload) { + if (res.aps) { + res.payload.aps = res.aps; + } + return res.payload; + } + } + else if (type === 'click') { + delete res.type; + delete res.__UUID__; + delete res.appid; + if (res.aps && res.aps.alert) { + res.title = res.aps.alert.title; + } + } } catch (e) { } return message; @@ -559,12 +575,18 @@ function invokePushCallback(args) { } else if (args.type === 'pushMsg') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'receive', data: normalizePushMessage(args.message) }); + callback({ + type: 'receive', + data: normalizePushMessage('receive', args.message), + }); }); } else if (args.type === 'click') { onPushMessageCallbacks.forEach((callback) => { - callback({ type: 'click', data: normalizePushMessage(args.message) }); + callback({ + type: 'click', + data: normalizePushMessage('click', args.message), + }); }); } } diff --git a/packages/uni-stacktracey/dist/uni-stacktracey.es.js b/packages/uni-stacktracey/dist/uni-stacktracey.es.js index d486ff6fd..6ab12bfbb 100644 --- a/packages/uni-stacktracey/dist/uni-stacktracey.es.js +++ b/packages/uni-stacktracey/dist/uni-stacktracey.es.js @@ -2,209 +2,209 @@ import fs from 'fs'; import StackTracey from 'stacktracey'; import { SourceMapConsumer } from 'source-map'; -// @ts-ignore -{ - // @ts-ignore - SourceMapConsumer.initialize({ - 'lib/mappings.wasm': 'https://unpkg.com/source-map@0.7.3/lib/mappings.wasm', - }); -} -const nixSlashes = (x) => x.replace(/\\/g, '/'); -const sourcemapCatch = {}; -function stacktracey(stacktrace, opts) { - const parseStack = []; - const stack = opts.preset.parseStacktrace(stacktrace); - stack.items.forEach((item, index) => { - const fn = () => { - const { line = 0, column = 0, file, fileName } = item; - try { - return opts.preset - .getSourceMapContent(file, fileName) - .then((content) => { - if (content) - return SourceMapConsumer.with(content, null, (consumer) => { - const sourceMapContent = parseSourceMapContent(consumer, { - line, - column, - }); - if (sourceMapContent) { - const { source, sourcePath, sourceLine, sourceColumn, fileName = '', } = sourceMapContent; - stack.items[index] = Object.assign({}, item, { - file: source, - line: sourceLine, - column: sourceColumn, - fileShort: sourcePath, - fileRelative: sourcePath, - fileName, - }); - } - }); - }); - } - catch (error) { - return Promise.resolve(); - } - }; - parseStack.push(fn()); - }); - return new Promise((resolve, reject) => { - Promise.all(parseStack) - .then(() => { - const parseError = opts.preset.asTableStacktrace({ - stack, - maxColumnWidths: { - callee: 999, - file: 999, - sourceLine: 999, - }, - stacktrace, - }); - resolve(parseError); - }) - .catch(() => { - resolve(stacktrace); - }); - }); -} -function getSourceMapContent(sourcemapUrl) { - try { - return (sourcemapCatch[sourcemapUrl] || - (sourcemapCatch[sourcemapUrl] = new Promise((resolve, reject) => { - try { - if (/^[http|https]+:/i.test(sourcemapUrl)) { - uni.request({ - url: sourcemapUrl, - success: (res) => { - sourcemapCatch[sourcemapUrl] = res.data; - resolve(sourcemapCatch[sourcemapUrl]); - }, - }); - } - else { - sourcemapCatch[sourcemapUrl] = fs.readFileSync(sourcemapUrl, 'utf-8'); - resolve(sourcemapCatch[sourcemapUrl]); - } - } - catch (error) { - resolve(''); - } - }))); - } - catch (error) { - return ''; - } -} -function parseSourceMapContent(consumer, obj) { - // source -> 'uni-app:///node_modules/@sentry/browser/esm/helpers.js' - const { source, line: sourceLine, column: sourceColumn, } = consumer.originalPositionFor(obj); - if (source) { - const sourcePathSplit = source.split('/'); - const sourcePath = sourcePathSplit.slice(3).join('/'); - const fileName = sourcePathSplit.pop(); - return { - source, - sourcePath, - sourceLine: sourceLine === null ? 0 : sourceLine, - sourceColumn: sourceColumn === null ? 0 : sourceColumn, - fileName, - }; - } -} -function uniStracktraceyPreset(opts) { - const { base, sourceRoot } = opts; - return { - parseSourceMapUrl(file, fileName) { - // 组合 sourceMapUrl - if (!base) - return ''; - file = (file.match(/(\/.*)/) || [])[1]; - if (!file) - return ''; - if (sourceRoot) { - return `${file.replace(sourceRoot, base + '/')}.map`; - } - return `${base}/${file}.map`; - }, - getSourceMapContent(file, fileName) { - return Promise.resolve(getSourceMapContent(this.parseSourceMapUrl(file, fileName))); - }, - parseStacktrace(stacktrace) { - return new StackTracey(stacktrace); - }, - asTableStacktrace({ maxColumnWidths, stacktrace, stack }) { - const errorName = stacktrace.split('\n')[0]; - return ((errorName.indexOf('at') === -1 ? `${errorName}\n` : '') + - (stack.asTable ? stack.asTable({ maxColumnWidths }) : '')); - }, - }; -} -function utsStracktraceyPreset(opts) { - const { base, sourceRoot } = opts; - let errStack = []; - return { - parseSourceMapUrl(file, fileName) { - // 组合 sourceMapUrl - if (sourceRoot) { - return `${file.replace(sourceRoot, base + '/')}.map`; - } - return `${base}/${file}.map`; - }, - getSourceMapContent(file, fileName) { - // 根据 base,filename 组合 sourceMapUrl - return Promise.resolve(getSourceMapContent(this.parseSourceMapUrl(file, fileName))); - }, - parseStacktrace(str) { - const lines = (str || '').split('\n'); - const entries = lines - .map((line, index) => { - line = line.trim(); - let callee, fileLineColumn = [], planA, planB; - if ((planA = line.match(/e: (.+\.kt)(.+\))*:\s*(.+)*/))) { - errStack.push('%StacktraceyItem%'); - callee = 'e: '; - fileLineColumn = (planA[2].match(/.*:.*\((\d+).+?(\d+)\)/) || []).slice(1); - } - else { - errStack.push(line); - return undefined; - } - const fileName = planA[1] - ? (planB = planA[1].match(/(.*)*\/(.+)/) || [])[2] || '' - : ''; - return { - beforeParse: line, - callee: callee || '', - index: false, - native: false, - file: nixSlashes(planA[1] || ''), - line: parseInt(fileLineColumn[0] || '', 10) || undefined, - column: parseInt(fileLineColumn[1] || '', 10) || undefined, - fileName, - fileShort: planB ? planB[1] : '', - errMsg: planA[3] || '', - calleeShort: '', - fileRelative: '', - thirdParty: false, - }; - }) - .filter((x) => x !== undefined); - return { - items: entries, - }; - }, - asTableStacktrace({ maxColumnWidths, stacktrace, stack }) { - return errStack - .map((item) => { - if (item === '%StacktraceyItem%') { - const _stack = stack.items.shift(); - if (_stack) - return `${_stack.callee}${_stack.file}: (${_stack.line}, ${_stack.column}): ${_stack.errMsg}`; - } - return item; - }) - .join('\n'); - }, - }; +// @ts-ignore +{ + // @ts-ignore + SourceMapConsumer.initialize({ + 'lib/mappings.wasm': 'https://unpkg.com/source-map@0.7.3/lib/mappings.wasm', + }); +} +const nixSlashes = (x) => x.replace(/\\/g, '/'); +const sourcemapCatch = {}; +function stacktracey(stacktrace, opts) { + const parseStack = []; + const stack = opts.preset.parseStacktrace(stacktrace); + stack.items.forEach((item, index) => { + const fn = () => { + const { line = 0, column = 0, file, fileName } = item; + try { + return opts.preset + .getSourceMapContent(file, fileName) + .then((content) => { + if (content) + return SourceMapConsumer.with(content, null, (consumer) => { + const sourceMapContent = parseSourceMapContent(consumer, { + line, + column, + }); + if (sourceMapContent) { + const { source, sourcePath, sourceLine, sourceColumn, fileName = '', } = sourceMapContent; + stack.items[index] = Object.assign({}, item, { + file: source, + line: sourceLine, + column: sourceColumn, + fileShort: sourcePath, + fileRelative: sourcePath, + fileName, + }); + } + }); + }); + } + catch (error) { + return Promise.resolve(); + } + }; + parseStack.push(fn()); + }); + return new Promise((resolve, reject) => { + Promise.all(parseStack) + .then(() => { + const parseError = opts.preset.asTableStacktrace({ + stack, + maxColumnWidths: { + callee: 999, + file: 999, + sourceLine: 999, + }, + stacktrace, + }); + resolve(parseError); + }) + .catch(() => { + resolve(stacktrace); + }); + }); +} +function getSourceMapContent(sourcemapUrl) { + try { + return (sourcemapCatch[sourcemapUrl] || + (sourcemapCatch[sourcemapUrl] = new Promise((resolve, reject) => { + try { + if (/^[http|https]+:/i.test(sourcemapUrl)) { + uni.request({ + url: sourcemapUrl, + success: (res) => { + sourcemapCatch[sourcemapUrl] = res.data; + resolve(sourcemapCatch[sourcemapUrl]); + }, + }); + } + else { + sourcemapCatch[sourcemapUrl] = fs.readFileSync(sourcemapUrl, 'utf-8'); + resolve(sourcemapCatch[sourcemapUrl]); + } + } + catch (error) { + resolve(''); + } + }))); + } + catch (error) { + return ''; + } +} +function parseSourceMapContent(consumer, obj) { + // source -> 'uni-app:///node_modules/@sentry/browser/esm/helpers.js' + const { source, line: sourceLine, column: sourceColumn, } = consumer.originalPositionFor(obj); + if (source) { + const sourcePathSplit = source.split('/'); + const sourcePath = sourcePathSplit.slice(3).join('/'); + const fileName = sourcePathSplit.pop(); + return { + source, + sourcePath, + sourceLine: sourceLine === null ? 0 : sourceLine, + sourceColumn: sourceColumn === null ? 0 : sourceColumn, + fileName, + }; + } +} +function uniStracktraceyPreset(opts) { + const { base, sourceRoot } = opts; + return { + parseSourceMapUrl(file, fileName) { + // 组合 sourceMapUrl + if (!base) + return ''; + file = (file.match(/(\/.*)/) || [])[1]; + if (!file) + return ''; + if (sourceRoot) { + return `${file.replace(sourceRoot, base + '/')}.map`; + } + return `${base}/${file}.map`; + }, + getSourceMapContent(file, fileName) { + return Promise.resolve(getSourceMapContent(this.parseSourceMapUrl(file, fileName))); + }, + parseStacktrace(stacktrace) { + return new StackTracey(stacktrace); + }, + asTableStacktrace({ maxColumnWidths, stacktrace, stack }) { + const errorName = stacktrace.split('\n')[0]; + return ((errorName.indexOf('at') === -1 ? `${errorName}\n` : '') + + (stack.asTable ? stack.asTable({ maxColumnWidths }) : '')); + }, + }; +} +function utsStracktraceyPreset(opts) { + const { base, sourceRoot } = opts; + let errStack = []; + return { + parseSourceMapUrl(file, fileName) { + // 组合 sourceMapUrl + if (sourceRoot) { + return `${file.replace(sourceRoot, base + '/')}.map`; + } + return `${base}/${file}.map`; + }, + getSourceMapContent(file, fileName) { + // 根据 base,filename 组合 sourceMapUrl + return Promise.resolve(getSourceMapContent(this.parseSourceMapUrl(file, fileName))); + }, + parseStacktrace(str) { + const lines = (str || '').split('\n'); + const entries = lines + .map((line, index) => { + line = line.trim(); + let callee, fileLineColumn = [], planA, planB; + if ((planA = line.match(/e: (.+\.kt)(.+\))*:\s*(.+)*/))) { + errStack.push('%StacktraceyItem%'); + callee = 'e: '; + fileLineColumn = (planA[2].match(/.*:.*\((\d+).+?(\d+)\)/) || []).slice(1); + } + else { + errStack.push(line); + return undefined; + } + const fileName = planA[1] + ? (planB = planA[1].match(/(.*)*\/(.+)/) || [])[2] || '' + : ''; + return { + beforeParse: line, + callee: callee || '', + index: false, + native: false, + file: nixSlashes(planA[1] || ''), + line: parseInt(fileLineColumn[0] || '', 10) || undefined, + column: parseInt(fileLineColumn[1] || '', 10) || undefined, + fileName, + fileShort: planB ? planB[1] : '', + errMsg: planA[3] || '', + calleeShort: '', + fileRelative: '', + thirdParty: false, + }; + }) + .filter((x) => x !== undefined); + return { + items: entries, + }; + }, + asTableStacktrace({ maxColumnWidths, stacktrace, stack }) { + return errStack + .map((item) => { + if (item === '%StacktraceyItem%') { + const _stack = stack.items.shift(); + if (_stack) + return `${_stack.callee}${_stack.file}: (${_stack.line}, ${_stack.column}): ${_stack.errMsg}`; + } + return item; + }) + .join('\n'); + }, + }; } export { stacktracey, uniStracktraceyPreset, utsStracktraceyPreset }; -- GitLab