/* eslint-disable prefer-rest-params */ import type { ErrorReporter } from '../ErrorReporter'; import { Collector } from '@tencent/merlin-core'; import { buildIssueFromError } from '../utils'; import { ErrorReportItemData } from '../types'; import { MayBeVue } from './types'; export class VueErrorCollector extends Collector { private lastCaughtError: Error | null = null; private vue: MayBeVue; constructor(options: { /** Vue 3 传入 vue 的 app 实例,Vue 2 传入全局 Vue 对象 */ vue: MayBeVue; }) { super(); this.vue = options.vue; } init(reporter: ErrorReporter) { super.init(reporter); if (this.vue.config && 'errorHandler' in this.vue.config) { this.vue.config.errorHandler = (err: unknown, _vm: any, _info?: string) => { this.privateErrorListener(err as Error); }; } else { console.warn('[Merlin] 无法解析 Vue 版本'); } } destroy() { if (this.vue.config?.errorHandler) { this.vue.config.errorHandler = undefined; } super.destroy(); } private privateErrorListener(error: Error) { if (error === this.lastCaughtError) { return; } this.lastCaughtError = error || null; if (this.reporter?.logError) { console.error(error); } this.reporter?.log('VueErrorCollector.errorListener', arguments); this.reporter?.capture(buildIssueFromError(error)); } }