import callsites from 'callsites'; import type { Event } from '@sentry/node'; type Level = 'warning' | 'error' | 'fatal' | 'info'; export type ReportingOptions = { level?: Level; } & Pick; export class ApplicationError extends Error { level: Level; readonly tags?: Event['tags']; readonly extra?: Event['extra']; readonly packageName?: string; constructor( message: string, { level, tags = {}, extra, ...rest }: Partial & ReportingOptions = {}, ) { super(message, rest); this.level = level ?? 'error'; this.tags = tags; this.extra = extra; try { const filePath = callsites()[2].getFileName() ?? ''; const match = /packages\/([^\/]+)\//.exec(filePath)?.[1]; if (match) this.tags.packageName = match; } catch {} } }