diff --git a/packages/browser/src/bugsnag.ts b/packages/browser/src/bugsnag.ts index 36bf6e6c0..1d31f8868 100644 --- a/packages/browser/src/bugsnag.ts +++ b/packages/browser/src/bugsnag.ts @@ -1,12 +1,10 @@ -import ClientWithInternals from '@bugsnag/core/client' -import type { BugsnagStatic, Config, Client } from '@bugsnag/core' +import { BugsnagStatic, Config, Client, schema as baseConfig } from '@bugsnag/core' import map from '@bugsnag/core/lib/es-utils/map' import keys from '@bugsnag/core/lib/es-utils/keys' import assign from '@bugsnag/core/lib/es-utils/assign' // extend the base config schema with some browser-specific options -import { schema as baseConfig } from '@bugsnag/core/config' import browserConfig from './config' import pluginWindowOnerror from '@bugsnag/plugin-window-onerror' @@ -55,10 +53,10 @@ declare global { } } -type BrowserClient = Partial & { - _client: ClientWithInternals | null +type BrowserClient = Partial & { + _client: Client | null createClient: (opts?: Config) => Client - start: (opts?: Config) => ClientWithInternals + start: (opts?: Config) => Client isStarted: () => boolean } @@ -91,7 +89,7 @@ const notifier: BrowserClient = { ] // configure a client with user supplied options - const bugsnag = new ClientWithInternals(opts, schema, internalPlugins, { name, version, url }); + const bugsnag = new Client(opts, schema, internalPlugins, { name, version, url }); // set delivery based on browser capability (IE 8+9 have an XDomainRequest object) (bugsnag as BrowserClient)._setDelivery?.(window.XDomainRequest ? dXDomainRequest : dXMLHttpRequest) @@ -108,7 +106,7 @@ const notifier: BrowserClient = { notifier._client._logger.warn('Bugsnag.start() was called more than once. Ignoring.') return notifier._client } - notifier._client = notifier.createClient(opts) as ClientWithInternals + notifier._client = notifier.createClient(opts) return notifier._client }, isStarted: () => { @@ -116,9 +114,9 @@ const notifier: BrowserClient = { } } -type Method = keyof typeof ClientWithInternals.prototype +type Method = keyof typeof Client.prototype -map(['resetEventCount'].concat(keys(ClientWithInternals.prototype)) as Method[], (m) => { +map(['resetEventCount'].concat(keys(Client.prototype)) as Method[], (m) => { if (/^_/.test(m)) return notifier[m] = function () { if (!notifier._client) return console.log(`Bugsnag.${m}() was called before Bugsnag.start()`) diff --git a/packages/browser/src/config.ts b/packages/browser/src/config.ts index fd9c49a33..1991f8dd9 100644 --- a/packages/browser/src/config.ts +++ b/packages/browser/src/config.ts @@ -1,4 +1,4 @@ -import { schema } from '@bugsnag/core/config' +import { schema } from '@bugsnag/core' import assign from '@bugsnag/core/lib/es-utils/assign' import getPrefixedConsole from './get-prefixed-console' diff --git a/packages/browser/src/index-cjs.ts b/packages/browser/src/index-cjs.ts index a65efdf08..b81ba3805 100644 --- a/packages/browser/src/index-cjs.ts +++ b/packages/browser/src/index-cjs.ts @@ -1,8 +1,4 @@ -import Client from '@bugsnag/core/client' -import Event from '@bugsnag/core/event' -import Session from '@bugsnag/core/session' - -import { Breadcrumb } from '@bugsnag/core' +import { Breadcrumb, Client, Event, Session } from '@bugsnag/core' import assign from '@bugsnag/core/lib/es-utils/assign' diff --git a/packages/browser/src/index-umd.ts b/packages/browser/src/index-umd.ts index a65efdf08..b81ba3805 100644 --- a/packages/browser/src/index-umd.ts +++ b/packages/browser/src/index-umd.ts @@ -1,8 +1,4 @@ -import Client from '@bugsnag/core/client' -import Event from '@bugsnag/core/event' -import Session from '@bugsnag/core/session' - -import { Breadcrumb } from '@bugsnag/core' +import { Breadcrumb, Client, Event, Session } from '@bugsnag/core' import assign from '@bugsnag/core/lib/es-utils/assign' diff --git a/packages/core/package.json b/packages/core/package.json index 5c1fddb52..71be97202 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -28,19 +28,7 @@ "./lib/validators/string-with-length": "./src/lib/validators/string-with-length.js", "./lib/validators/list-of-functions": "./src/lib/validators/list-of-functions.js", "./lib/extract-object": "./src/lib/extract-object.js", - "./lib/feature-flag-delegate": "./src/lib/feature-flag-delegate.js", - "./client": { - "import": "./src/client.js", - "default": "./src/client.js", - "types": "./src/client.d.ts" - }, - "./config": "./src/config.js", - "./event": { - "import": "./src/event.js", - "default": "./src/event.js", - "types": "./src/event.d.ts" - }, - "./session": "./src/session.js" + "./lib/feature-flag-delegate": "./src/lib/feature-flag-delegate.js" }, "description": "Core classes and utilities for Bugsnag notifiers", "homepage": "https://www.bugsnag.com/", @@ -54,7 +42,6 @@ "files": [ "src", "types", - "*.js", "dist" ], "scripts": { diff --git a/packages/core/rollup.config.npm.mjs b/packages/core/rollup.config.npm.mjs index 50b002a07..b939f0ecf 100644 --- a/packages/core/rollup.config.npm.mjs +++ b/packages/core/rollup.config.npm.mjs @@ -14,9 +14,7 @@ const plugins = [ babel({ babelHelpers: 'bundled' }), ] -const external = [ - '@bugsnag/cuid', -] +const external = [/node_modules/] export default [ createRollupConfig({ diff --git a/packages/core/src/common.ts b/packages/core/src/common.ts new file mode 100644 index 000000000..6de314579 --- /dev/null +++ b/packages/core/src/common.ts @@ -0,0 +1 @@ +export type BreadcrumbType = 'error' | 'log' | 'manual' | 'navigation' | 'process' | 'request' | 'state' | 'user'; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 21bbf6ec8..d3bd525a6 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,3 +2,4 @@ export { default as Breadcrumb } from './breadcrumb' export { default as Client } from './client' export { default as Event } from './event' export { default as Session } from './session' +export { schema } from './config' diff --git a/packages/core/test/client.test.ts b/packages/core/test/client.test.ts index f6c090afd..7ea3466ee 100644 --- a/packages/core/test/client.test.ts +++ b/packages/core/test/client.test.ts @@ -7,12 +7,12 @@ import { BreadcrumbType } from '../types/common' const noop = () => {} const id = (a: T) => a -describe('@bugsnag/core/client', () => { +describe('Client', () => { describe('constructor', () => { it('can handle bad input', () => { - // @ts-ignore + // @ts-expect-error - testing with unexpected arguments expect(() => new Client()).toThrow() - // @ts-ignore + // @ts-expect-error - testing with unexpected arguments expect(() => new Client('foo')).toThrow() }) }) @@ -21,7 +21,7 @@ describe('@bugsnag/core/client', () => { it('handles bad/good input', () => { expect(() => { // no opts supplied - // @ts-ignore + // @ts-expect-error - testing with unexpected arguments const client = new Client({}) expect(client).toBe(client) }).toThrow() diff --git a/packages/core/test/config.test.ts b/packages/core/test/config.test.ts index 829b4cf2b..e77bda05d 100644 --- a/packages/core/test/config.test.ts +++ b/packages/core/test/config.test.ts @@ -1,12 +1,12 @@ import config from '../src/config' -describe('@bugsnag/core/config', () => { +describe('config', () => { describe('schema', () => { it('has the required properties { validate(), defaultValue(), message }', () => { Object.keys(config.schema).forEach(k => { const key = k as unknown as keyof typeof config.schema config.schema[key].defaultValue(undefined) - // @ts-expect-error + // @ts-expect-error testing invalid arguments config.schema[key].validate() config.schema[key].validate(-1) config.schema[key].validate('stringy stringerson') diff --git a/packages/core/test/event.test.ts b/packages/core/test/event.test.ts index 143c4b151..dd3863ed6 100644 --- a/packages/core/test/event.test.ts +++ b/packages/core/test/event.test.ts @@ -5,7 +5,7 @@ jest.mock('stack-generator', () => ({ backtrace: () => [{}, {}] })) -describe('@bugsnag/core/event', () => { +describe('Event', () => { describe('constructor', () => { it('sets default handledState', () => { const err = new Error('noooooo') diff --git a/packages/core/test/session.test.ts b/packages/core/test/session.test.ts index 098a28e30..0b4c9be59 100644 --- a/packages/core/test/session.test.ts +++ b/packages/core/test/session.test.ts @@ -1,6 +1,6 @@ import Session from '../src/session' -describe('@bugsnag/core/session', () => { +describe('Session', () => { describe('toJSON()', () => { it('returns the correct data structure', () => { const s = new Session().toJSON() diff --git a/packages/core/types/client.d.ts b/packages/core/types/client.d.ts index e0ae9dfa8..872e62a25 100644 --- a/packages/core/types/client.d.ts +++ b/packages/core/types/client.d.ts @@ -15,26 +15,26 @@ import { import Event from './event' import Session from './session' -interface LoggerConfig { +export interface LoggerConfig { debug: (msg: any) => void info: (msg: any) => void warn: (msg: any) => void error: (msg: any, err?: unknown) => void } -interface Notifier { +export interface Notifier { name: string version: string url: string } -interface EventDeliveryPayload { +export interface EventDeliveryPayload { apiKey: string notifier: Notifier events: Event[] } -interface SessionDeliveryPayload { +export interface SessionDeliveryPayload { notifier?: Notifier device?: Device app?: App @@ -45,7 +45,7 @@ interface SessionDeliveryPayload { }> } -interface Delivery { +export interface Delivery { sendEvent(payload: EventDeliveryPayload, cb: (err?: Error | null) => void): void sendSession(session: SessionDeliveryPayload, cb: (err?: Error | null) => void): void } diff --git a/packages/core/types/config.d.ts b/packages/core/types/config.d.ts new file mode 100644 index 000000000..cee871526 --- /dev/null +++ b/packages/core/types/config.d.ts @@ -0,0 +1,115 @@ +export interface Schema { + apiKey: { + defaultValue: () => null + message: string + validate: (value: unknown) => boolean + } + appVersion: { + defaultValue: () => undefined + message: string + validate: (value: unknown) => boolean + } + appType: { + defaultValue: () => undefined + message: string + validate: (value: unknown) => boolean + } + autoDetectErrors: { + defaultValue: () => true + message: string + validate: (value: unknown) => boolean + } + enabledErrorTypes: { + defaultValue: () => { unhandledExceptions: boolean, unhandledRejections: boolean } + message: string + allowPartialObject: boolean + validate: (value: unknown) => boolean + } + onError: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + onSession: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + onBreadcrumb: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + endpoints: { + defaultValue: (endpoints: { notify: string, sessions: string } | undefined) => { notify: string | null, sessions: string | null } + message: string + validate: (value: unknown) => boolean + } + autoTrackSessions: { + defaultValue: () => boolean + message: string + validate: (value: unknown) => boolean + } + enabledReleaseStages: { + defaultValue: () => null + message: string + validate: (value: unknown) => boolean + } + releaseStage: { + defaultValue: () => 'production' + message: string + validate: (value: unknown) => boolean + } + maxBreadcrumbs: { + defaultValue: () => 25 + message: string + validate: (value: unknown) => boolean + } + enabledBreadcrumbTypes: { + defaultValue: () => ['navigation', 'request', 'process', 'log', 'user', 'state', 'error', 'manual'] + message: string + validate: (value: unknown) => boolean + } + context: { + defaultValue: () => undefined + message: string + validate: (value: unknown) => boolean + } + user: { + defaultValue: () => {} + message: string + validate: (value: unknown) => boolean + } + metadata: { + defaultValue: () => {} + message: string + validate: (value: unknown) => boolean + } + logger: { + defaultValue: () => undefined + message: string + validate: (value: unknown) => boolean + } + redactedKeys: { + defaultValue: () => ['password'] + message: string + validate: (value: unknown) => boolean + } + plugins: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + featureFlags: { + defaultValue: () => [] + message: string + validate: (value: unknown) => boolean + } + reportUnhandledPromiseRejectionsAsHandled: { + defaultValue: () => false + message: string + validate: (value: unknown) => boolean + } +} + +export const schema: Schema diff --git a/packages/core/types/event.d.ts b/packages/core/types/event.d.ts index 2339fb560..83d88e43a 100644 --- a/packages/core/types/event.d.ts +++ b/packages/core/types/event.d.ts @@ -9,7 +9,12 @@ import { Stackframe, FeatureFlag } from './common' +import Session from './session' +interface FeatureFlagPayload { + featureFlag: string + variant?: string +} declare class Event { public static create( maybeError: any, @@ -56,6 +61,37 @@ declare class Event { // trace correlation public setTraceCorrelation(traceId: string, spanId?: string): void + + // "private" api + _metadata: { [key: string]: any } + constructor (errorClass: string, errorMessage: string, stacktrace: any[], handledState?: HandledState, originalError?: Error) + _features: FeatureFlag | null[] + _featuresIndex: { [key: string]: number } + _user: User + _handledState: HandledState + _correlation?: { spanId: string, traceId: string } + _session?: Session + toJSON(): { + payloadVersion: '4' + exceptions: Array + severity: Event['severity'] + unhandled: boolean + severityReason: { + type: string + [key: string]: any + } + app: App + device: Device + request: Request + breadcrumbs: Breadcrumb[] + context: string | undefined + correlation: { spanId: string, traceId: string } | undefined + groupingHash: string | undefined + metaData: { [key: string]: any } + user: User + session: Session + featureFlags: FeatureFlagPayload[] + }; } interface HandledState { diff --git a/packages/core/types/index.d.ts b/packages/core/types/index.d.ts index bccb0aafd..d09b71d84 100644 --- a/packages/core/types/index.d.ts +++ b/packages/core/types/index.d.ts @@ -4,5 +4,7 @@ import Event from './event' import Session from './session' import BugsnagStatic from './bugsnag' +export { schema } from './config' +export { EventDeliveryPayload, SessionDeliveryPayload, Delivery, Notifier, LoggerConfig } from './client' export * from './common' export { Breadcrumb, Client, Event, Session, BugsnagStatic } diff --git a/packages/delivery-electron/delivery.d.ts b/packages/delivery-electron/delivery.d.ts index 33c75280c..0c0bafc87 100644 --- a/packages/delivery-electron/delivery.d.ts +++ b/packages/delivery-electron/delivery.d.ts @@ -1,5 +1,4 @@ -import { Delivery } from '@bugsnag/core/client' -import { Client } from '@bugsnag/core' +import { Client, Delivery } from '@bugsnag/core' declare const delivery: (filestore: any, net: any, app: any) => (client: Client) => Delivery diff --git a/packages/delivery-electron/test/delivery.test-main.ts b/packages/delivery-electron/test/delivery.test-main.ts index c4321167e..1c4c057a1 100644 --- a/packages/delivery-electron/test/delivery.test-main.ts +++ b/packages/delivery-electron/test/delivery.test-main.ts @@ -2,8 +2,7 @@ import { createServer, IncomingHttpHeaders, STATUS_CODES } from 'http' import { app, net } from 'electron' import { AddressInfo } from 'net' import delivery from '../delivery' -import { EventDeliveryPayload } from '@bugsnag/core/client' -import { Client } from '@bugsnag/core' +import { Client, EventDeliveryPayload } from '@bugsnag/core' import PayloadQueue from '../queue' import PayloadDeliveryLoop from '../payload-loop' import { mkdtemp, rm } from 'fs/promises' diff --git a/packages/delivery-fetch/delivery.d.ts b/packages/delivery-fetch/delivery.d.ts index f6cedbd4d..a5636f74a 100644 --- a/packages/delivery-fetch/delivery.d.ts +++ b/packages/delivery-fetch/delivery.d.ts @@ -1,7 +1,6 @@ /// -import type { Client } from '@bugsnag/core' -import type { Delivery } from '@bugsnag/core/client' +import type { Client, Delivery } from '@bugsnag/core' type Fetch = (input: RequestInfo | URL, init?: RequestInit) => Promise diff --git a/packages/delivery-fetch/test/delivery.test.ts b/packages/delivery-fetch/test/delivery.test.ts index afd9911c1..1b130b496 100644 --- a/packages/delivery-fetch/test/delivery.test.ts +++ b/packages/delivery-fetch/test/delivery.test.ts @@ -1,6 +1,5 @@ import delivery from '../delivery' -import type { Client } from '@bugsnag/core' -import type { EventDeliveryPayload, SessionDeliveryPayload } from '@bugsnag/core/client' +import type { Client, EventDeliveryPayload, SessionDeliveryPayload } from '@bugsnag/core' const globalAny: any = global diff --git a/packages/delivery-node/delivery.d.ts b/packages/delivery-node/delivery.d.ts index 9dd36b3a1..b6f8c20bf 100644 --- a/packages/delivery-node/delivery.d.ts +++ b/packages/delivery-node/delivery.d.ts @@ -1,5 +1,4 @@ -import { Delivery } from '@bugsnag/core/client' -import { Client } from '@bugsnag/core' +import { Client, Delivery } from '@bugsnag/core' declare const delivery: (client: Client) => Delivery diff --git a/packages/delivery-node/test/delivery.test.ts b/packages/delivery-node/test/delivery.test.ts index 23c2c35fc..6818dd8f7 100644 --- a/packages/delivery-node/test/delivery.test.ts +++ b/packages/delivery-node/test/delivery.test.ts @@ -1,7 +1,6 @@ import delivery from '../' import http from 'http' -import { Client } from '@bugsnag/core' -import { EventDeliveryPayload, SessionDeliveryPayload } from '@bugsnag/core/client' +import { Client, EventDeliveryPayload, SessionDeliveryPayload } from '@bugsnag/core' import { AddressInfo } from 'net' interface Request { diff --git a/packages/delivery-react-native/test/delivery.test.ts b/packages/delivery-react-native/test/delivery.test.ts index 023124101..3a60abce0 100644 --- a/packages/delivery-react-native/test/delivery.test.ts +++ b/packages/delivery-react-native/test/delivery.test.ts @@ -1,6 +1,5 @@ -import Client from '@bugsnag/core/client' +import { Client, Event } from '@bugsnag/core' import delivery from '../' -import EventWithInternals from '@bugsnag/core/event' type NativeStackIOS = string[] interface AndroidStackFrame { @@ -11,7 +10,7 @@ interface AndroidStackFrame { } type NativeStackAndroid = AndroidStackFrame[] -type NativeClientEvent = Pick & { - severityReason: EventWithInternals['_handledState']['severityReason'] - user: EventWithInternals['_user'] - metadata: EventWithInternals['_metadata'] - correlation: EventWithInternals['_correlation'] + severityReason: Event['_handledState']['severityReason'] + user: Event['_user'] + metadata: Event['_metadata'] + correlation: Event['_correlation'] nativeStack: NativeStackIOS | NativeStackAndroid } diff --git a/packages/delivery-x-domain-request/src/delivery.ts b/packages/delivery-x-domain-request/src/delivery.ts index 72179c636..2293c8cee 100644 --- a/packages/delivery-x-domain-request/src/delivery.ts +++ b/packages/delivery-x-domain-request/src/delivery.ts @@ -5,18 +5,17 @@ import { Client, Config, Event, Session } from '@bugsnag/core' import getApiUrl from './get-api-url' import matchPageProtocol from './match-page-protocol' -import type ClientWithInternals from '@bugsnag/core/client' -import type { Delivery } from '@bugsnag/core/client' +import { Delivery } from '@bugsnag/core' const delivery = (client: Client, win = window): Delivery => ({ sendEvent: (event, cb = () => {}) => { - if ((client as ClientWithInternals)._config.endpoints?.notify === null) { + if (client._config.endpoints?.notify === null) { const err = new Error('Event not sent due to incomplete endpoint configuration') return cb(err) } - const url = getApiUrl((client as ClientWithInternals>)._config, 'notify', '4', win) - const body = payload.event(event as unknown as Event, (client as ClientWithInternals>)._config.redactedKeys) + const url = getApiUrl(client._config as Required, 'notify', '4', win) + const body = payload.event(event as unknown as Event, client._config.redactedKeys) // @ts-expect-error XDomainRequest is not defined in the Window interface const req = new win.XDomainRequest() @@ -25,9 +24,9 @@ const delivery = (client: Client, win = window): Delivery => ({ } req.onerror = function () { const err = new Error('Event failed to send'); - (client as ClientWithInternals)._logger.error('Event failed to send…', err) + client._logger.error('Event failed to send…', err) if (body.length > 10e5) { - (client as ClientWithInternals)._logger.warn(`Event oversized (${(body.length / 10e5).toFixed(2)} MB)`) + client._logger.warn(`Event oversized (${(body.length / 10e5).toFixed(2)} MB)`) } cb(err) } @@ -36,7 +35,7 @@ const delivery = (client: Client, win = window): Delivery => ({ try { req.send(body) } catch (e) { - (client as ClientWithInternals)._logger.error(e) + client._logger.error(e) if (e instanceof Error || e === undefined || e === null) { cb(e) } @@ -44,12 +43,12 @@ const delivery = (client: Client, win = window): Delivery => ({ }, 0) }, sendSession: (session, cb = () => {}) => { - if ((client as ClientWithInternals>)._config.endpoints.sessions === null) { + if ((client._config as Required).endpoints.sessions === null) { const err = new Error('Session not sent due to incomplete endpoint configuration') return cb(err) } - const url = getApiUrl((client as ClientWithInternals>)._config, 'sessions', '1', win) + const url = getApiUrl((client._config as Required), 'sessions', '1', win) // @ts-expect-error XDomainRequest is not defined in the Window interface const req = new win.XDomainRequest() req.onload = function () { @@ -58,9 +57,9 @@ const delivery = (client: Client, win = window): Delivery => ({ req.open('POST', url) setTimeout(() => { try { - req.send(payload.session(session as Session, (client as ClientWithInternals>)._config.redactedKeys)) + req.send(payload.session(session as Session, (client._config as Required).redactedKeys)) } catch (e) { - (client as ClientWithInternals)._logger.error(e) + client._logger.error(e) if (e instanceof Error || e === undefined || e === null) { cb(e) } diff --git a/packages/delivery-x-domain-request/test/delivery.test.ts b/packages/delivery-x-domain-request/test/delivery.test.ts index cf7021522..6fb3dad4a 100644 --- a/packages/delivery-x-domain-request/test/delivery.test.ts +++ b/packages/delivery-x-domain-request/test/delivery.test.ts @@ -1,6 +1,5 @@ import delivery from '../' -import { Client } from '@bugsnag/core' -import { SessionDeliveryPayload, EventDeliveryPayload } from '@bugsnag/core/client' +import { Client, EventDeliveryPayload, SessionDeliveryPayload } from '@bugsnag/core' interface XDomainRequest { method: string | null diff --git a/packages/delivery-xml-http-request/src/delivery.ts b/packages/delivery-xml-http-request/src/delivery.ts index b7b04e752..1fe05827c 100644 --- a/packages/delivery-xml-http-request/src/delivery.ts +++ b/packages/delivery-xml-http-request/src/delivery.ts @@ -1,8 +1,7 @@ -import type { Client, Config } from '@bugsnag/core' +import { Client, Config } from '@bugsnag/core' import payload from '@bugsnag/core/lib/json-payload' -import { Event } from '@bugsnag/core' -import ClientWithInternals, { Delivery } from '@bugsnag/core/client' +import { Event, Delivery } from '@bugsnag/core' function getIntegrityHeaderValue (windowOrWorkerGlobalScope: Window, requestBody: string) { @@ -22,8 +21,8 @@ function getIntegrityHeaderValue (windowOrWorkerGlobalScope: Window, requestBody const delivery = (client: Client, win = window): Delivery => ({ sendEvent: (event, cb = () => {}) => { - const config = (client as ClientWithInternals>)._config - const logger = (client as ClientWithInternals)._logger + const config = client._config as Required + const logger = client._logger try { const url = config.endpoints.notify @@ -74,8 +73,8 @@ const delivery = (client: Client, win = window): Delivery => ({ } }, sendSession: (session, cb = () => {}) => { - const config = (client as ClientWithInternals>)._config - const logger = (client as ClientWithInternals)._logger + const config = client._config as Required + const logger = client._logger try { const url = config.endpoints.sessions diff --git a/packages/delivery-xml-http-request/test/delivery.test.ts b/packages/delivery-xml-http-request/test/delivery.test.ts index 652ab458b..b03f0b076 100644 --- a/packages/delivery-xml-http-request/test/delivery.test.ts +++ b/packages/delivery-xml-http-request/test/delivery.test.ts @@ -1,6 +1,5 @@ import delivery from '../' -import { Client } from '@bugsnag/core' -import { EventDeliveryPayload } from '@bugsnag/core/client' +import { Client, EventDeliveryPayload } from '@bugsnag/core' interface MockXMLHttpRequest { method: string | null diff --git a/packages/electron-network-status/tests/network-status.test.ts b/packages/electron-network-status/tests/network-status.test.ts index 5a8611eae..ca20ac631 100644 --- a/packages/electron-network-status/tests/network-status.test.ts +++ b/packages/electron-network-status/tests/network-status.test.ts @@ -1,4 +1,4 @@ -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import stateManager from '@bugsnag/plugin-electron-client-state-manager' import EventEmitter from 'events' import NetworkStatus from '../network-status' diff --git a/packages/electron-test-helpers/src/client.ts b/packages/electron-test-helpers/src/client.ts index 9199fb3ee..714ae10d2 100644 --- a/packages/electron-test-helpers/src/client.ts +++ b/packages/electron-test-helpers/src/client.ts @@ -1,6 +1,4 @@ -import Client from '@bugsnag/core/client' -import { schema as defaultSchema } from '@bugsnag/core/config' -import { Event, Session, SessionPayload, EventPayload, Plugin } from '@bugsnag/core' +import { Client, schema as defaultSchema, Event, Session, SessionPayload, EventPayload, Plugin } from '@bugsnag/core' interface ClientTestHelpers { client: Client diff --git a/packages/electron/src/client/createClient.js b/packages/electron/src/client/createClient.js index a7bc71015..de627ac3f 100644 --- a/packages/electron/src/client/createClient.js +++ b/packages/electron/src/client/createClient.js @@ -1,4 +1,4 @@ -const Client = require('@bugsnag/core/client') +const { Client } = require('@bugsnag/core') const createClient = (createProcessClient, process) => { const Bugsnag = { diff --git a/packages/electron/src/client/main.js b/packages/electron/src/client/main.js index 618365654..01c78376f 100644 --- a/packages/electron/src/client/main.js +++ b/packages/electron/src/client/main.js @@ -1,9 +1,6 @@ const electron = require('electron') -const Client = require('@bugsnag/core/client') -const Event = require('@bugsnag/core/event') -const { Breadcrumb } = require('@bugsnag/core') -const Session = require('@bugsnag/core/session') +const { Breadcrumb, Client, Event, Session } = require('@bugsnag/core') const { plugin: PluginClientStatePersistence, NativeClient diff --git a/packages/electron/src/client/renderer.js b/packages/electron/src/client/renderer.js index 7402435a7..762021d1c 100644 --- a/packages/electron/src/client/renderer.js +++ b/packages/electron/src/client/renderer.js @@ -1,7 +1,4 @@ -const Client = require('@bugsnag/core/client') -const Event = require('@bugsnag/core/event') -const { Breadcrumb } = require('@bugsnag/core') -const Session = require('@bugsnag/core/session') +const { Breadcrumb, Client, Event, Session } = require('@bugsnag/core') const createClient = require('./createClient') diff --git a/packages/electron/src/config/common.js b/packages/electron/src/config/common.js index a34a587ad..d6bc98919 100644 --- a/packages/electron/src/config/common.js +++ b/packages/electron/src/config/common.js @@ -1,4 +1,4 @@ -const { schema } = require('@bugsnag/core/config') +const { schema } = require('@bugsnag/core') const stringWithLength = require('@bugsnag/core/lib/validators/string-with-length') const defaultErrorTypes = () => ({ unhandledExceptions: true, unhandledRejections: true, nativeCrashes: true }) diff --git a/packages/in-flight/test/in-flight.test.ts b/packages/in-flight/test/in-flight.test.ts index 301f5d008..26d61578e 100644 --- a/packages/in-flight/test/in-flight.test.ts +++ b/packages/in-flight/test/in-flight.test.ts @@ -1,5 +1,5 @@ import clone from '@bugsnag/core/lib/clone-client' -import Client, { EventDeliveryPayload, SessionDeliveryPayload } from '@bugsnag/core/client' +import { Client, EventPayload, SessionDeliveryPayload } from '@bugsnag/core' // The in-flight package has module level state which can leak between tests // We can avoid this using jest's 'isolateModules' but need to type the @@ -14,7 +14,7 @@ const id = (a: T) => a describe('@bugsnag/in-flight', () => { it('tracks in-flight events', () => { const client = new Client({ apiKey: 'AN_API_KEY' }) - const payloads: EventDeliveryPayload[] = [] + const payloads: EventPayload[] = [] const sendSession = jest.fn() client._setDelivery(() => ({ @@ -50,7 +50,7 @@ describe('@bugsnag/in-flight', () => { // eslint thinks this is never reassigned, but it clearly is let cloned: Client // eslint-disable-line prefer-const - const payloads: EventDeliveryPayload[] = [] + const payloads: EventPayload[] = [] const sendSession = jest.fn() client._setDelivery(() => ({ @@ -168,7 +168,7 @@ describe('@bugsnag/in-flight', () => { it('tracks all in-flight requests', () => { const client = new Client({ apiKey: 'AN_API_KEY' }) - const eventPayloads: EventDeliveryPayload[] = [] + const eventPayloads: EventPayload[] = [] const sessionPayloads: SessionDeliveryPayload[] = [] const sessionCallback = jest.fn() @@ -217,7 +217,7 @@ describe('@bugsnag/in-flight', () => { it('can flush successfully', async () => { const client = new Client({ apiKey: 'AN_API_KEY' }) - const eventPayloads: EventDeliveryPayload[] = [] + const eventPayloads: EventPayload[] = [] const sessionPayloads: SessionDeliveryPayload[] = [] client._sessionDelegate = { @@ -261,7 +261,7 @@ describe('@bugsnag/in-flight', () => { it('will timeout if flush takes too long', async () => { const client = new Client({ apiKey: 'AN_API_KEY' }) - const eventPayloads: EventDeliveryPayload[] = [] + const eventPayloads: EventPayload[] = [] const sessionPayloads: SessionDeliveryPayload[] = [] client._sessionDelegate = { @@ -311,7 +311,7 @@ describe('@bugsnag/in-flight', () => { it('can track requests when delivery is changed', async () => { const client = new Client({ apiKey: 'AN_API_KEY' }) - const originalEventPayloads: EventDeliveryPayload[] = [] + const originalEventPayloads: EventPayload[] = [] const originalSessionPayloads: SessionDeliveryPayload[] = [] client._sessionDelegate = { @@ -352,7 +352,7 @@ describe('@bugsnag/in-flight', () => { expect(originalEventPayloads.length).toBe(1) expect(originalSessionPayloads.length).toBe(1) - const newEventPayloads: EventDeliveryPayload[] = [] + const newEventPayloads: EventPayload[] = [] const newSessionPayloads: SessionDeliveryPayload[] = [] client._setDelivery(() => ({ diff --git a/packages/node/src/bugsnag.ts b/packages/node/src/bugsnag.ts index 400b6aca7..b418cb15e 100644 --- a/packages/node/src/bugsnag.ts +++ b/packages/node/src/bugsnag.ts @@ -3,7 +3,7 @@ import { AsyncLocalStorage } from 'async_hooks' import assign from '@bugsnag/core/lib/es-utils/assign' // extend the base config schema with some browser-specific options -import { schema as baseConfig } from '@bugsnag/core/config' +import { schema as baseConfig } from '@bugsnag/core' import browserConfig from './config' import delivery from '@bugsnag/delivery-node' @@ -21,8 +21,6 @@ import pluginContextualize from '@bugsnag/plugin-contextualize' import pluginStackframePathNormaliser from '@bugsnag/plugin-stackframe-path-normaliser' import pluginConsoleBreadcrumbs from '@bugsnag/plugin-console-breadcrumbs' import { BugsnagStatic, Client, Config, Event, Logger } from '@bugsnag/core' -import ClientWithInternals from '@bugsnag/core/client' -import EventWithInternals from '@bugsnag/core/event' type AfterErrorCb = (err: any, event: Event, logger: Logger) => void; @@ -47,7 +45,7 @@ const version = '__BUGSNAG_NOTIFIER_VERSION__' const url = 'https://github.com/bugsnag/bugsnag-js' // @ts-ignore -EventWithInternals.__type = 'nodejs' +Event.__type = 'nodejs' // extend the base config schema with some node-specific options const internalPlugins = [ @@ -65,14 +63,14 @@ const internalPlugins = [ pluginConsoleBreadcrumbs ] -type NodeClient = Partial & { - _client: ClientWithInternals | null +type NodeClient = Partial & { + _client: Client | null createClient: (opts?: Config) => Client - start: (opts?: Config) => ClientWithInternals + start: (opts?: Config) => Client isStarted: () => boolean } -type Method = keyof typeof ClientWithInternals.prototype +type Method = keyof typeof Client.prototype const notifier: NodeClient = { _client: null, @@ -81,7 +79,7 @@ const notifier: NodeClient = { if (typeof opts === 'string') opts = { apiKey: opts } if (!opts) opts = {} as unknown as Config - const bugsnag = new ClientWithInternals(opts, schema, internalPlugins, { name, version, url }); + const bugsnag = new Client(opts, schema, internalPlugins, { name, version, url }); /** * Patch all calls to the client in order to forwards them to the context client if it exists @@ -89,7 +87,7 @@ const notifier: NodeClient = { * This is useful for when client methods are called later, such as in the console breadcrumbs * plugin where we want to call `leaveBreadcrumb` on the request-scoped client, if it exists. */ - (Object.keys(ClientWithInternals.prototype) as Method[]).forEach((m) => { + (Object.keys(Client.prototype) as Method[]).forEach((m) => { const original = bugsnag[m] bugsnag[m] = function () { // if we are in an async context, use the client from that context @@ -120,7 +118,7 @@ const notifier: NodeClient = { notifier._client._logger.warn('Bugsnag.start() was called more than once. Ignoring.') return notifier._client } - notifier._client = notifier.createClient(opts) as ClientWithInternals + notifier._client = notifier.createClient(opts) return notifier._client }, isStarted: () => { @@ -128,7 +126,7 @@ const notifier: NodeClient = { } } -;(Object.keys(ClientWithInternals.prototype) as Method[]).forEach((m) => { +;(Object.keys(Client.prototype) as Method[]).forEach((m) => { if (/^_/.test(m)) return notifier[m] = function () { // if we are in an async context, use the client from that context diff --git a/packages/node/src/config.ts b/packages/node/src/config.ts index adaa286b2..9e71efb89 100644 --- a/packages/node/src/config.ts +++ b/packages/node/src/config.ts @@ -1,12 +1,10 @@ -import { schema } from '@bugsnag/core/config' +import { Event, LoggerConfig, schema } from '@bugsnag/core' import stringWithLength from '@bugsnag/core/lib/validators/string-with-length' import os from 'os' import { inspect } from 'util' import assign from '@bugsnag/core/lib/es-utils/assign' import getPrefixedConsole from './get-prefixed-console' -import EventWithInternals from '@bugsnag/core/event' -import { LoggerConfig } from '@bugsnag/core/client' const config = { appType: { @@ -40,7 +38,7 @@ const config = { validate: (value: unknown) => value === undefined || isAgent(value) }, onUncaughtException: { - defaultValue: () => (err: Error, event: EventWithInternals, logger: LoggerConfig) => { + defaultValue: () => (err: Error, event: Event, logger: LoggerConfig) => { logger.error(`Uncaught exception${getContext(event)}, the process will now terminate…\n${printError(err)}`) process.exit(1) }, @@ -48,7 +46,7 @@ const config = { validate: (value: unknown) => typeof value === 'function' }, onUnhandledRejection: { - defaultValue: () => (err: Error, event: EventWithInternals, logger: LoggerConfig) => { + defaultValue: () => (err: Error, event: Event, logger: LoggerConfig) => { logger.error(`Unhandled rejection${getContext(event)}…\n${printError(err)}`) }, message: 'should be a function', @@ -58,7 +56,7 @@ const config = { const printError = (err: Error) => err && err.stack ? err.stack : inspect(err) -const getContext = (event: EventWithInternals) => +const getContext = (event: Event) => event.request && Object.keys(event.request).length ? ` at ${event.request.httpMethod} ${event.request.path || event.request.url}` : '' diff --git a/packages/node/src/index-cjs.ts b/packages/node/src/index-cjs.ts index f1930cb14..b81ba3805 100644 --- a/packages/node/src/index-cjs.ts +++ b/packages/node/src/index-cjs.ts @@ -1,7 +1,4 @@ -import Client from '@bugsnag/core/client' -import Event from '@bugsnag/core/event' -import Session from '@bugsnag/core/session' -import { Breadcrumb } from '@bugsnag/core' +import { Breadcrumb, Client, Event, Session } from '@bugsnag/core' import assign from '@bugsnag/core/lib/es-utils/assign' diff --git a/packages/plugin-app-duration/test/app-duration.test.ts b/packages/plugin-app-duration/test/app-duration.test.ts index a8d234ad5..b80a419e8 100644 --- a/packages/plugin-app-duration/test/app-duration.test.ts +++ b/packages/plugin-app-duration/test/app-duration.test.ts @@ -1,6 +1,5 @@ import plugin from '../src/app-duration' -import Client from '@bugsnag/core/client' -import Event from '@bugsnag/core/event' +import { Client, Event } from '@bugsnag/core' describe('plugin-app-duration', () => { it('includes duration in event.app', done => { diff --git a/packages/plugin-aws-lambda/test/index.test.ts b/packages/plugin-aws-lambda/test/index.test.ts index 64827d2b2..5b7642e45 100644 --- a/packages/plugin-aws-lambda/test/index.test.ts +++ b/packages/plugin-aws-lambda/test/index.test.ts @@ -1,11 +1,11 @@ import util from 'util' import BugsnagPluginAwsLambda from '../src/' -import Client, { EventDeliveryPayload, SessionDeliveryPayload } from '@bugsnag/core/client' +import { Client, EventPayload, SessionDeliveryPayload } from '@bugsnag/core' -const createClient = (events: EventDeliveryPayload[], sessions: SessionDeliveryPayload[], config = {}) => { +const createClient = (events: EventPayload[], sessions: SessionDeliveryPayload[], config = {}) => { const client = new Client({ apiKey: 'AN_API_KEY', plugins: [BugsnagPluginAwsLambda], ...config }) - // @ts-ignore the following property is not defined on the public Event interface + // @ts-expect-error the following property is not defined on the public Event interface client.Event.__type = 'nodejs' // a flush failure won't throw as we don't want to crash apps if delivery takes @@ -55,7 +55,7 @@ describe('plugin: aws lambda', () => { }) it('adds the context as metadata', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -117,7 +117,7 @@ describe('plugin: aws lambda', () => { }) it('returns a wrapped handler that resolves to the original return value (async)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -144,7 +144,7 @@ describe('plugin: aws lambda', () => { }) it('notifies when an error is thrown (async)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -176,7 +176,7 @@ describe('plugin: aws lambda', () => { }) it('does not notify when "autoDetectErrors" is false (async)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions, { autoDetectErrors: false }) @@ -206,7 +206,7 @@ describe('plugin: aws lambda', () => { }) it('does not notify when "unhandledExceptions" are disabled (async)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions, { enabledErrorTypes: { unhandledExceptions: false } }) @@ -236,7 +236,7 @@ describe('plugin: aws lambda', () => { }) it('returns a wrapped handler that resolves to the value passed to the callback (callback)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -265,7 +265,7 @@ describe('plugin: aws lambda', () => { }) it('notifies when an error is passed (callback)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -297,7 +297,7 @@ describe('plugin: aws lambda', () => { }) it('does not notify when "autoDetectErrors" is false (callback)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions, { autoDetectErrors: false }) @@ -327,7 +327,7 @@ describe('plugin: aws lambda', () => { }) it('does not notify when "unhandledExceptions" are disabled (callback)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions, { enabledErrorTypes: { unhandledExceptions: false } }) @@ -357,7 +357,7 @@ describe('plugin: aws lambda', () => { }) it('works when an async handler has the callback parameter', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -386,7 +386,7 @@ describe('plugin: aws lambda', () => { }) it('works when an async handler has the callback parameter and calls it', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -415,7 +415,7 @@ describe('plugin: aws lambda', () => { }) it('works when an async handler has the callback parameter and throws', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -447,7 +447,7 @@ describe('plugin: aws lambda', () => { }) it('works when an async handler has the callback parameter and calls it with an error', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -479,7 +479,7 @@ describe('plugin: aws lambda', () => { }) it('will track sessions when "autoTrackSessions" is enabled', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions, { autoTrackSessions: true }) @@ -504,7 +504,7 @@ describe('plugin: aws lambda', () => { }) it('will not track sessions when "autoTrackSessions" is disabled', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions, { autoTrackSessions: false }) @@ -529,7 +529,7 @@ describe('plugin: aws lambda', () => { }) it('notifies when it is close to timing out (async)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -573,7 +573,7 @@ describe('plugin: aws lambda', () => { }) it('notifies when it is close to timing out (callback)', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -617,7 +617,7 @@ describe('plugin: aws lambda', () => { }) it('uses the function name as the event context when present', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -665,7 +665,7 @@ describe('plugin: aws lambda', () => { .mockReturnValueOnce(superLongWaitMs - lambdaTimeoutNotifyMs) .mockImplementationOnce(() => { throw new Error('unexpected call to "getRemainingTimeInMillis"') }) - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -709,7 +709,7 @@ describe('plugin: aws lambda', () => { }) it('does not notify if "lambdaTimeoutNotifyMs" is 0', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) @@ -740,7 +740,7 @@ describe('plugin: aws lambda', () => { }) it('supports a string as the error argument in a lambda callback', async () => { - const events: EventDeliveryPayload[] = [] + const events: EventPayload[] = [] const sessions: SessionDeliveryPayload[] = [] const client = createClient(events, sessions) diff --git a/packages/plugin-browser-context/test/context.test.ts b/packages/plugin-browser-context/test/context.test.ts index d3d9293c5..fa902e622 100644 --- a/packages/plugin-browser-context/test/context.test.ts +++ b/packages/plugin-browser-context/test/context.test.ts @@ -1,6 +1,6 @@ import plugin from '../src/context' -import Client, { EventDeliveryPayload } from '@bugsnag/core/client' +import { Client, EventDeliveryPayload } from '@bugsnag/core' const window = { location: { diff --git a/packages/plugin-browser-device/test/device.test.ts b/packages/plugin-browser-device/test/device.test.ts index 35cf600f0..5cd18799c 100644 --- a/packages/plugin-browser-device/test/device.test.ts +++ b/packages/plugin-browser-device/test/device.test.ts @@ -1,12 +1,6 @@ import plugin from '../src/device' -import Client, { - SessionDeliveryPayload, - EventDeliveryPayload -} from '@bugsnag/core/client' -import { Device, Session } from '@bugsnag/core' -import EventWithInternals from '@bugsnag/core/event' -import { schema } from '@bugsnag/core/config' +import { Client, Device, Event, Session, SessionDeliveryPayload, EventDeliveryPayload, schema } from '@bugsnag/core' interface SessionWithDevice extends Session { device: Device } @@ -116,7 +110,7 @@ describe('plugin: device', () => { const mockDelivery = ( client: Client, - events: EventWithInternals[], + events: Event[], sessions: SessionWithDevice[] ) => { client._sessionDelegate = { @@ -164,7 +158,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -188,7 +182,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -210,7 +204,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -241,7 +235,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -285,7 +279,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -312,7 +306,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -343,7 +337,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -374,7 +368,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -399,7 +393,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -425,7 +419,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -451,7 +445,7 @@ describe('plugin: device', () => { [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] mockDelivery(client, events, sessions) @@ -480,7 +474,7 @@ describe('plugin: device', () => { }, [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] expect(client._cbs.e).toHaveLength(1) @@ -510,7 +504,7 @@ describe('plugin: device', () => { }, [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] expect(client._cbs.e).toHaveLength(1) @@ -542,7 +536,7 @@ describe('plugin: device', () => { }, [plugin(navigator)] ) - const events: EventWithInternals[] = [] + const events: Event[] = [] const sessions: SessionWithDevice[] = [] expect(client._cbs.e).toHaveLength(1) diff --git a/packages/plugin-browser-request/test/request.test.ts b/packages/plugin-browser-request/test/request.test.ts index 3610374e1..8a1dfe5d0 100644 --- a/packages/plugin-browser-request/test/request.test.ts +++ b/packages/plugin-browser-request/test/request.test.ts @@ -1,6 +1,6 @@ import plugin from '../src/request' -import Client, { EventDeliveryPayload } from '@bugsnag/core/client' +import { Client, EventDeliveryPayload } from '@bugsnag/core' const window = { location: { href: 'http://xyz.abc/foo/bar.html' } } as unknown as Window & typeof globalThis diff --git a/packages/plugin-browser-session/src/session.ts b/packages/plugin-browser-session/src/session.ts index 4d866f908..4a4497064 100644 --- a/packages/plugin-browser-session/src/session.ts +++ b/packages/plugin-browser-session/src/session.ts @@ -1,19 +1,18 @@ -import { Plugin, Session } from '@bugsnag/core' -import ClientWithInternals, { Notifier } from '@bugsnag/core/client' +import { Client, Plugin, Session, Notifier } from '@bugsnag/core' import includes from '@bugsnag/core/lib/es-utils/includes' -interface InternalClient extends ClientWithInternals { +interface InternalClient { _notifier?: Notifier } const plugin: Plugin = { load: client => { - (client as InternalClient)._sessionDelegate = sessionDelegate + client._sessionDelegate = sessionDelegate } } const sessionDelegate = { - startSession: (client: InternalClient, session: Session) => { + startSession: (client: Client, session: Session) => { const sessionClient = client sessionClient._session = session sessionClient._pausedSession = null @@ -25,7 +24,7 @@ const sessionDelegate = { } sessionClient._delivery.sendSession({ - notifier: sessionClient._notifier, + notifier: (sessionClient as unknown as InternalClient)._notifier, device: session.device, app: session.app, sessions: [ @@ -38,7 +37,7 @@ const sessionDelegate = { }, () => {}) return sessionClient }, - resumeSession: (client: InternalClient) => { + resumeSession: (client: Client) => { // Do nothing if there's already an active session if (client._session) { return client @@ -55,7 +54,7 @@ const sessionDelegate = { // Otherwise start a new session return client.startSession() }, - pauseSession: (client: InternalClient) => { + pauseSession: (client: Client) => { client._pausedSession = client._session client._session = null } diff --git a/packages/plugin-browser-session/test/session.test.ts b/packages/plugin-browser-session/test/session.test.ts index c1369afcf..2b594ccec 100644 --- a/packages/plugin-browser-session/test/session.test.ts +++ b/packages/plugin-browser-session/test/session.test.ts @@ -1,7 +1,6 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import plugin from '../src/session' -import Client, { EventDeliveryPayload } from '@bugsnag/core/client' -import EventWithInternals from '@bugsnag/core/event' +import { Client, EventDeliveryPayload } from '@bugsnag/core' const VALID_NOTIFIER = { name: 't', version: '0', url: 'http://' } @@ -38,7 +37,7 @@ describe('plugin: sessions', () => { } })) const sessionClient = c.startSession() - const Event = c.Event as unknown as typeof EventWithInternals + const Event = c.Event sessionClient.notify(new Error('broke')) sessionClient._notify(new Event('err', 'bad', [], { unhandled: true, severity: 'error', severityReason: { type: 'unhandledException' } })) sessionClient.notify(new Error('broke')) diff --git a/packages/plugin-client-ip/test/client-ip.test.ts b/packages/plugin-client-ip/test/client-ip.test.ts index 04a4f50b0..a715afa08 100644 --- a/packages/plugin-client-ip/test/client-ip.test.ts +++ b/packages/plugin-client-ip/test/client-ip.test.ts @@ -1,6 +1,6 @@ import plugin from '../' -import Client, { EventDeliveryPayload } from '@bugsnag/core/client' +import { Client, EventDeliveryPayload } from '@bugsnag/core' describe('plugin: ip', () => { it('does nothing when collectUserIp=true', () => { diff --git a/packages/plugin-console-breadcrumbs/test/console-breadcrumbs.test.ts b/packages/plugin-console-breadcrumbs/test/console-breadcrumbs.test.ts index 46ca7a8f7..521448c85 100644 --- a/packages/plugin-console-breadcrumbs/test/console-breadcrumbs.test.ts +++ b/packages/plugin-console-breadcrumbs/test/console-breadcrumbs.test.ts @@ -1,6 +1,6 @@ import plugin from '../src/console-breadcrumbs' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' describe('plugin: console breadcrumbs', () => { beforeAll(() => { diff --git a/packages/plugin-electron-app-breadcrumbs/test/app-breadcrumbs.test.ts b/packages/plugin-electron-app-breadcrumbs/test/app-breadcrumbs.test.ts index 8fa6e5311..ddcbab6b7 100644 --- a/packages/plugin-electron-app-breadcrumbs/test/app-breadcrumbs.test.ts +++ b/packages/plugin-electron-app-breadcrumbs/test/app-breadcrumbs.test.ts @@ -1,5 +1,4 @@ -import { Breadcrumb } from '@bugsnag/core' -import Client from '@bugsnag/core/client' +import { Breadcrumb, Client } from '@bugsnag/core' import { makeApp, makeBrowserWindow } from '@bugsnag/electron-test-helpers' import plugin from '../' diff --git a/packages/plugin-electron-app/app.js b/packages/plugin-electron-app/app.js index d01b68dbf..cfc274fc1 100644 --- a/packages/plugin-electron-app/app.js +++ b/packages/plugin-electron-app/app.js @@ -1,5 +1,5 @@ const native = require('bindings')('bugsnag_plugin_electron_app_bindings') -const { schema } = require('@bugsnag/core/config') +const { schema } = require('@bugsnag/core') const intRange = require('@bugsnag/core/lib/validators/int-range') const isNativeClientEnabled = client => client._config.autoDetectErrors && client._config.enabledErrorTypes.nativeCrashes diff --git a/packages/plugin-electron-client-state-manager/test/client-state-manager.test.ts b/packages/plugin-electron-client-state-manager/test/client-state-manager.test.ts index 5194080a3..a8f7e276f 100644 --- a/packages/plugin-electron-client-state-manager/test/client-state-manager.test.ts +++ b/packages/plugin-electron-client-state-manager/test/client-state-manager.test.ts @@ -1,5 +1,5 @@ import stateManager from '../client-state-manager' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import { User } from '@bugsnag/core' const Notifier = { diff --git a/packages/plugin-electron-deliver-minidumps/event-serialisation.js b/packages/plugin-electron-deliver-minidumps/event-serialisation.js index 9875059ef..e0ea83e5f 100644 --- a/packages/plugin-electron-deliver-minidumps/event-serialisation.js +++ b/packages/plugin-electron-deliver-minidumps/event-serialisation.js @@ -1,6 +1,4 @@ -const Event = require('@bugsnag/core/event') -const Session = require('@bugsnag/core/session') -const { Breadcrumb } = require('@bugsnag/core') +const { Breadcrumb, Event, Session } = require('@bugsnag/core') const supportedProperties = [ 'app', diff --git a/packages/plugin-electron-deliver-minidumps/test/minidump-loop.test.ts b/packages/plugin-electron-deliver-minidumps/test/minidump-loop.test.ts index 1f8ecb675..e2f402299 100644 --- a/packages/plugin-electron-deliver-minidumps/test/minidump-loop.test.ts +++ b/packages/plugin-electron-deliver-minidumps/test/minidump-loop.test.ts @@ -1,6 +1,5 @@ import EventEmitter from 'events' -import Session from '@bugsnag/core/session' -import { Breadcrumb } from '@bugsnag/core' +import { Breadcrumb, Session } from '@bugsnag/core' import NetworkStatus from '@bugsnag/electron-network-status' import MinidumpDeliveryLoop from '../minidump-loop' diff --git a/packages/plugin-electron-ipc/bugsnag-ipc-main.js b/packages/plugin-electron-ipc/bugsnag-ipc-main.js index acbefbbd7..3d61c8c0d 100644 --- a/packages/plugin-electron-ipc/bugsnag-ipc-main.js +++ b/packages/plugin-electron-ipc/bugsnag-ipc-main.js @@ -1,5 +1,4 @@ -const Event = require('@bugsnag/core/event') -const { Breadcrumb } = require('@bugsnag/core') +const { Breadcrumb, Event } = require('@bugsnag/core') const runCallbacks = require('@bugsnag/core/lib/callback-runner') const featureFlagDelegate = require('@bugsnag/core/lib/feature-flag-delegate') diff --git a/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts b/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts index df49c5de3..af5b262cc 100644 --- a/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts +++ b/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts @@ -1,7 +1,5 @@ import BugsnagIpcMain from '../bugsnag-ipc-main' -import Client from '@bugsnag/core/client' -import InternalEvent from '@bugsnag/core/event' -import { User, Plugin, Event, FeatureFlag } from '@bugsnag/core' +import { Client, User, Plugin, Event, FeatureFlag } from '@bugsnag/core' const mockClientStateManagerPlugin = { name: 'clientStateManager', @@ -367,7 +365,7 @@ describe('BugsnagIpcMain', () => { client._setDelivery(client => mockDelivery) const bugsnagIpcMain = new BugsnagIpcMain(client) - const event = new InternalEvent('Error', 'Something bad happened', []) + const event = new Event('Error', 'Something bad happened', []) bugsnagIpcMain.dispatch(Object.assign({}, event)) expect(mockDelivery.sendEvent).toHaveBeenCalledWith(expect.objectContaining({ diff --git a/packages/plugin-electron-network-status/test/network-status.test.ts b/packages/plugin-electron-network-status/test/network-status.test.ts index df608c297..54769f322 100644 --- a/packages/plugin-electron-network-status/test/network-status.test.ts +++ b/packages/plugin-electron-network-status/test/network-status.test.ts @@ -1,4 +1,4 @@ -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import plugin from '../' describe('plugin: electron network status', () => { diff --git a/packages/plugin-electron-process-info/test/procinfo.test.ts b/packages/plugin-electron-process-info/test/procinfo.test.ts index cca57d313..27ece93cb 100644 --- a/packages/plugin-electron-process-info/test/procinfo.test.ts +++ b/packages/plugin-electron-process-info/test/procinfo.test.ts @@ -1,5 +1,4 @@ -import Client, { Delivery } from '@bugsnag/core/client' -import Event from '@bugsnag/core/event' +import { Client, Event, Delivery } from '@bugsnag/core' import plugin from '../' describe('plugin: electron process info', () => { diff --git a/packages/plugin-electron-renderer-client-state-updates/test/client-state-updates.test.ts b/packages/plugin-electron-renderer-client-state-updates/test/client-state-updates.test.ts index 95d493d7c..a74e6c063 100644 --- a/packages/plugin-electron-renderer-client-state-updates/test/client-state-updates.test.ts +++ b/packages/plugin-electron-renderer-client-state-updates/test/client-state-updates.test.ts @@ -1,5 +1,5 @@ import clientStateUpdatesPlugin from '../client-state-updates' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' const Notifier = { name: 'Bugsnag Electron Test', diff --git a/packages/plugin-electron-renderer-strip-project-root/test/strip-project-root.test.ts b/packages/plugin-electron-renderer-strip-project-root/test/strip-project-root.test.ts index 7562da07d..f3fe6a0ff 100644 --- a/packages/plugin-electron-renderer-strip-project-root/test/strip-project-root.test.ts +++ b/packages/plugin-electron-renderer-strip-project-root/test/strip-project-root.test.ts @@ -1,4 +1,4 @@ -import Event from '@bugsnag/core/event' +import { Event } from '@bugsnag/core' import plugin from '..' import { makeClientForPlugin } from '@bugsnag/electron-test-helpers' diff --git a/packages/plugin-electron-session/session.js b/packages/plugin-electron-session/session.js index f5440fe25..fd1cf000d 100644 --- a/packages/plugin-electron-session/session.js +++ b/packages/plugin-electron-session/session.js @@ -1,5 +1,5 @@ const sessionDelegate = require('@bugsnag/plugin-browser-session') -const Session = require('@bugsnag/core/session') +const { Session } = require('@bugsnag/core') const SESSION_TIMEOUT_MS = 60 * 1000 diff --git a/packages/plugin-electron-session/test/session.test.ts b/packages/plugin-electron-session/test/session.test.ts index fa7abb877..7a32d852d 100644 --- a/packages/plugin-electron-session/test/session.test.ts +++ b/packages/plugin-electron-session/test/session.test.ts @@ -1,6 +1,4 @@ -import Client, { EventDeliveryPayload } from '@bugsnag/core/client' -import { schema as defaultSchema } from '@bugsnag/core/config' -import { SessionPayload } from '@bugsnag/core' +import { Client, EventDeliveryPayload, SessionPayload, schema as defaultSchema } from '@bugsnag/core' import { makeApp, makeBrowserWindow } from '@bugsnag/electron-test-helpers' import plugin from '../' diff --git a/packages/plugin-express/test/express.test.ts b/packages/plugin-express/test/express.test.ts index 97c3ab1a6..7584ef0b9 100644 --- a/packages/plugin-express/test/express.test.ts +++ b/packages/plugin-express/test/express.test.ts @@ -1,4 +1,4 @@ -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import plugin from '../src/express' describe('plugin: express', () => { diff --git a/packages/plugin-inline-script-content/test/inline-script-content.test.ts b/packages/plugin-inline-script-content/test/inline-script-content.test.ts index afaff413d..3c99e8697 100644 --- a/packages/plugin-inline-script-content/test/inline-script-content.test.ts +++ b/packages/plugin-inline-script-content/test/inline-script-content.test.ts @@ -1,7 +1,6 @@ import plugin from '../inline-script-content' -import Client from '@bugsnag/core/client' -import Event from '@bugsnag/core/event' +import { Client, Event } from '@bugsnag/core' describe('plugin: inline script content', () => { it('should add an onError callback which captures the HTML content if file=current url', () => { diff --git a/packages/plugin-interaction-breadcrumbs/src/interaction-breadcrumbs.ts b/packages/plugin-interaction-breadcrumbs/src/interaction-breadcrumbs.ts index 33941db5d..4a11993e3 100644 --- a/packages/plugin-interaction-breadcrumbs/src/interaction-breadcrumbs.ts +++ b/packages/plugin-interaction-breadcrumbs/src/interaction-breadcrumbs.ts @@ -1,5 +1,4 @@ import { Plugin } from '@bugsnag/core' -import type ClientWithInternals from '@bugsnag/core/client' /* * Leaves breadcrumbs when the user interacts with the DOM @@ -7,7 +6,7 @@ import type ClientWithInternals from '@bugsnag/core/client' export default (win = window): Plugin => ({ load: (client) => { if (!('addEventListener' in win)) return - if (!(client as ClientWithInternals)._isBreadcrumbTypeEnabled('user')) return + if (!client._isBreadcrumbTypeEnabled('user')) return win.addEventListener('click', (event) => { let targetText, targetSelector @@ -17,7 +16,7 @@ export default (win = window): Plugin => ({ } catch (e) { targetText = '[hidden]' targetSelector = '[hidden]'; - (client as ClientWithInternals)._logger.error('Cross domain error when tracking click event. See docs: https://tinyurl.com/yy3rn63z') + client._logger.error('Cross domain error when tracking click event. See docs: https://tinyurl.com/yy3rn63z') } client.leaveBreadcrumb('UI click', { targetText, targetSelector }, 'user') }, true) diff --git a/packages/plugin-intercept/test/intercept.test.ts b/packages/plugin-intercept/test/intercept.test.ts index cb6f73c71..986782f62 100644 --- a/packages/plugin-intercept/test/intercept.test.ts +++ b/packages/plugin-intercept/test/intercept.test.ts @@ -1,4 +1,4 @@ -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import plugin from '../' import fs from 'fs' diff --git a/packages/plugin-internal-callback-marker/test/internal-callback-marker.test.ts b/packages/plugin-internal-callback-marker/test/internal-callback-marker.test.ts index a74e70700..6d774ced6 100644 --- a/packages/plugin-internal-callback-marker/test/internal-callback-marker.test.ts +++ b/packages/plugin-internal-callback-marker/test/internal-callback-marker.test.ts @@ -1,5 +1,4 @@ import { FirstPlugin, LastPlugin } from '../internal-callback-marker' -import InternalClient from '@bugsnag/core/client' import { Plugin, Client } from '@bugsnag/core' describe('@bugsnag/plugin-internal-callback-marker', () => { @@ -30,7 +29,7 @@ describe('@bugsnag/plugin-internal-callback-marker', () => { } ] - const client = new InternalClient({ + const client = new Client({ apiKey: '123', onError: externalOnErrorViaConfig, plugins: externalPlugins diff --git a/packages/plugin-koa/test/koa.test.ts b/packages/plugin-koa/test/koa.test.ts index a4b1e1fe6..9f06ffe61 100644 --- a/packages/plugin-koa/test/koa.test.ts +++ b/packages/plugin-koa/test/koa.test.ts @@ -1,7 +1,5 @@ -import Client from '@bugsnag/core/client' import plugin from '../src/koa' -import { EventPayload } from '@bugsnag/core' -import Event from '@bugsnag/core/event' +import { Client, Event, EventPayload } from '@bugsnag/core' const noop = () => {} const id = (a: T) => a diff --git a/packages/plugin-navigation-breadcrumbs/test/navigation-breadcrumbs.test.ts b/packages/plugin-navigation-breadcrumbs/test/navigation-breadcrumbs.test.ts index 0d2c34b9d..17090afea 100644 --- a/packages/plugin-navigation-breadcrumbs/test/navigation-breadcrumbs.test.ts +++ b/packages/plugin-navigation-breadcrumbs/test/navigation-breadcrumbs.test.ts @@ -1,6 +1,6 @@ import plugin from '../src/navigation-breadcrumbs' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' const noop = () => {} const id = (a: T) => a diff --git a/packages/plugin-network-breadcrumbs/test/network-breadcrumbs.test.ts b/packages/plugin-network-breadcrumbs/test/network-breadcrumbs.test.ts index 9cdda0fc8..f76fe1f07 100644 --- a/packages/plugin-network-breadcrumbs/test/network-breadcrumbs.test.ts +++ b/packages/plugin-network-breadcrumbs/test/network-breadcrumbs.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import plugin from '../' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import { Config } from '@bugsnag/core' class XMLHttpRequest { diff --git a/packages/plugin-node-device/test/device.test.ts b/packages/plugin-node-device/test/device.test.ts index 9b47bcf14..e3a7a939c 100644 --- a/packages/plugin-node-device/test/device.test.ts +++ b/packages/plugin-node-device/test/device.test.ts @@ -1,8 +1,8 @@ import plugin from '../device' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' const schema = { - ...require('@bugsnag/core/config').schema, + ...require('@bugsnag/core').schema, hostname: { defaultValue: () => 'test-machine.local', validate: () => true, diff --git a/packages/plugin-node-in-project/test/in-project.test.ts b/packages/plugin-node-in-project/test/in-project.test.ts index 15a32532d..4e69d4e3c 100644 --- a/packages/plugin-node-in-project/test/in-project.test.ts +++ b/packages/plugin-node-in-project/test/in-project.test.ts @@ -1,8 +1,6 @@ import plugin from '../' import { join } from 'path' -import Event from '@bugsnag/core/event' -import Client from '@bugsnag/core/client' -import { schema } from '@bugsnag/core/config' +import { Client, Event, schema } from '@bugsnag/core' describe('plugin: node in project', () => { it('should mark stackframes as "inProject" if it is a descendent of the "projectRoot"', done => { diff --git a/packages/plugin-node-surrounding-code/test/surrounding-code.test.ts b/packages/plugin-node-surrounding-code/test/surrounding-code.test.ts index eccea05a4..7e5b5017d 100644 --- a/packages/plugin-node-surrounding-code/test/surrounding-code.test.ts +++ b/packages/plugin-node-surrounding-code/test/surrounding-code.test.ts @@ -2,9 +2,7 @@ import fs from 'fs' import plugin from '../' import { join } from 'path' -import Event from '@bugsnag/core/event' -import Client from '@bugsnag/core/client' -import { schema as defaultSchema } from '@bugsnag/core/config' +import { Client, Event, schema as defaultSchema } from '@bugsnag/core' let createReadStreamCount = 0 const originalReadStream = fs.createReadStream diff --git a/packages/plugin-node-uncaught-exception/test/uncaught-exception.test.ts b/packages/plugin-node-uncaught-exception/test/uncaught-exception.test.ts index a801d9efb..254d5836b 100644 --- a/packages/plugin-node-uncaught-exception/test/uncaught-exception.test.ts +++ b/packages/plugin-node-uncaught-exception/test/uncaught-exception.test.ts @@ -1,7 +1,5 @@ -import Client from '@bugsnag/core/client' -import { schema } from '@bugsnag/core/config' +import { Client, Event, schema } from '@bugsnag/core' import plugin from '../' -import EventWithInternals from '@bugsnag/core/event' describe('plugin: node uncaught exception handler', () => { it('should listen to the process#uncaughtException event', () => { @@ -36,7 +34,7 @@ describe('plugin: node uncaught exception handler', () => { it('should call the configured onUncaughtException callback', done => { const c = new Client({ apiKey: 'api_key', - onUncaughtException: (err: Error, event: EventWithInternals) => { + onUncaughtException: (err: Error, event: Event) => { expect(err.message).toBe('never gonna catch me') expect(event.errors[0].errorMessage).toBe('never gonna catch me') expect(event._handledState.unhandled).toBe(true) @@ -64,7 +62,7 @@ describe('plugin: node uncaught exception handler', () => { it('should tolerate delivery errors', done => { const c = new Client({ apiKey: 'api_key', - onUncaughtException: (err: Error, event: EventWithInternals) => { + onUncaughtException: (err: Error, event: Event) => { expect(err.message).toBe('never gonna catch me') expect(event.errors[0].errorMessage).toBe('never gonna catch me') expect(event._handledState.unhandled).toBe(true) diff --git a/packages/plugin-node-unhandled-rejection/test/unhandled-rejection.test.ts b/packages/plugin-node-unhandled-rejection/test/unhandled-rejection.test.ts index 0500cbd64..d65c7ba69 100644 --- a/packages/plugin-node-unhandled-rejection/test/unhandled-rejection.test.ts +++ b/packages/plugin-node-unhandled-rejection/test/unhandled-rejection.test.ts @@ -1,7 +1,5 @@ -import Client from '@bugsnag/core/client' -import { schema } from '@bugsnag/core/config' +import { Client, Event, schema } from '@bugsnag/core' import plugin from '../' -import EventWithInternals from '@bugsnag/core/event' describe('plugin: node unhandled rejection handler', () => { it('should listen to the process#unhandledRejection event', () => { @@ -36,7 +34,7 @@ describe('plugin: node unhandled rejection handler', () => { it('should call the configured onUnhandledRejection callback', done => { const c = new Client({ apiKey: 'api_key', - onUnhandledRejection: (err: Error, event: EventWithInternals) => { + onUnhandledRejection: (err: Error, event: Event) => { expect(err.message).toBe('never gonna catch me') expect(event.errors[0].errorMessage).toBe('never gonna catch me') expect(event._handledState.unhandled).toBe(true) @@ -65,7 +63,7 @@ describe('plugin: node unhandled rejection handler', () => { const c = new Client({ apiKey: 'api_key', reportUnhandledPromiseRejectionsAsHandled: true, - onUnhandledRejection: (err: Error, event: EventWithInternals) => { + onUnhandledRejection: (err: Error, event: Event) => { expect(err.message).toBe('never gonna catch me') expect(event._handledState.unhandled).toBe(false) expect(event._handledState.severity).toBe('error') @@ -92,7 +90,7 @@ describe('plugin: node unhandled rejection handler', () => { it('should tolerate delivery errors', done => { const c = new Client({ apiKey: 'api_key', - onUnhandledRejection: (err: Error, event: EventWithInternals) => { + onUnhandledRejection: (err: Error, event: Event) => { expect(err.message).toBe('never gonna catch me') expect(event.errors[0].errorMessage).toBe('never gonna catch me') expect(event._handledState.unhandled).toBe(true) diff --git a/packages/plugin-react-native-client-sync/test/client-sync.test.ts b/packages/plugin-react-native-client-sync/test/client-sync.test.ts index 29b7991a7..962983cb8 100644 --- a/packages/plugin-react-native-client-sync/test/client-sync.test.ts +++ b/packages/plugin-react-native-client-sync/test/client-sync.test.ts @@ -1,6 +1,5 @@ -import Client from '@bugsnag/core/client' import plugin from '../' -import { Breadcrumb } from '@bugsnag/core' +import { Client, Breadcrumb } from '@bugsnag/core' import { DeviceEventEmitter } from 'react-native' diff --git a/packages/plugin-react-native-event-sync/test/event-sync.test.ts b/packages/plugin-react-native-event-sync/test/event-sync.test.ts index ddcf909e0..4e8c8344b 100644 --- a/packages/plugin-react-native-event-sync/test/event-sync.test.ts +++ b/packages/plugin-react-native-event-sync/test/event-sync.test.ts @@ -1,4 +1,4 @@ -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import plugin from '../' describe('plugin: react native event sync', () => { diff --git a/packages/plugin-react-native-global-error-handler/test/error-handler.test.ts b/packages/plugin-react-native-global-error-handler/test/error-handler.test.ts index fc86aef8b..26a3c01a1 100644 --- a/packages/plugin-react-native-global-error-handler/test/error-handler.test.ts +++ b/packages/plugin-react-native-global-error-handler/test/error-handler.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import plugin from '../' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' class MockErrorUtils { _globalHandler: ((err: Error) => void) | null; diff --git a/packages/plugin-react-native-hermes/test/hermes.test.ts b/packages/plugin-react-native-hermes/test/hermes.test.ts index 933d526c3..18b768bd2 100644 --- a/packages/plugin-react-native-hermes/test/hermes.test.ts +++ b/packages/plugin-react-native-hermes/test/hermes.test.ts @@ -1,11 +1,11 @@ import plugin from '../hermes' -import Client, { EventDeliveryPayload } from '@bugsnag/core/client' +import { Client, EventPayload } from '@bugsnag/core' describe('plugin: react native hermes', () => { it('should add an onError callback which captures device information', () => { const client = new Client({ apiKey: 'API_KEY_YEAH', plugins: [plugin()] }) - const payloads: EventDeliveryPayload[] = [] + const payloads: EventPayload[] = [] expect(client._cbs.e.length).toBe(1) diff --git a/packages/plugin-react-native-navigation/test/react-native-navigation.test.ts b/packages/plugin-react-native-navigation/test/react-native-navigation.test.ts index eb40da2a9..86c530715 100644 --- a/packages/plugin-react-native-navigation/test/react-native-navigation.test.ts +++ b/packages/plugin-react-native-navigation/test/react-native-navigation.test.ts @@ -1,6 +1,5 @@ import Plugin from '../react-native-navigation' -import { Breadcrumb } from '@bugsnag/core' -import Client from '@bugsnag/core/client' +import { Breadcrumb, Client } from '@bugsnag/core' interface Event { componentId: number diff --git a/packages/plugin-react-native-orientation-breadcrumbs/test/orientation.test.ts b/packages/plugin-react-native-orientation-breadcrumbs/test/orientation.test.ts index d5126d8d2..84ab1e3fa 100644 --- a/packages/plugin-react-native-orientation-breadcrumbs/test/orientation.test.ts +++ b/packages/plugin-react-native-orientation-breadcrumbs/test/orientation.test.ts @@ -1,4 +1,4 @@ -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import plugin from '..' import { Dimensions } from 'react-native' diff --git a/packages/plugin-react-native-session/test/session.test.ts b/packages/plugin-react-native-session/test/session.test.ts index 0cbc4176b..dd11982e2 100644 --- a/packages/plugin-react-native-session/test/session.test.ts +++ b/packages/plugin-react-native-session/test/session.test.ts @@ -1,5 +1,5 @@ import plugin from '../' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' describe('plugin: react native session', () => { it('adds missing methods and forwards calls to native client', () => { diff --git a/packages/plugin-react-native-unhandled-rejection/test/rejection-handler.test.ts b/packages/plugin-react-native-unhandled-rejection/test/rejection-handler.test.ts index 609cf6587..29504080d 100644 --- a/packages/plugin-react-native-unhandled-rejection/test/rejection-handler.test.ts +++ b/packages/plugin-react-native-unhandled-rejection/test/rejection-handler.test.ts @@ -1,5 +1,5 @@ import plugin from '../' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' // use the promise polyfill that RN uses, otherwise the unhandled rejections in // this test go to node's process#unhandledRejection event diff --git a/packages/plugin-react-navigation/test/react-navigation.test.tsx b/packages/plugin-react-navigation/test/react-navigation.test.tsx index b16cfdf67..52e4ed8f9 100644 --- a/packages/plugin-react-navigation/test/react-navigation.test.tsx +++ b/packages/plugin-react-navigation/test/react-navigation.test.tsx @@ -1,5 +1,5 @@ import Plugin from '../' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import TestRenderer from 'react-test-renderer' import * as React from 'react' import { NavigationContainer, NavigationContainerRef } from '@react-navigation/native' diff --git a/packages/plugin-react/test/index.test.tsx b/packages/plugin-react/test/index.test.tsx index 5553991fd..4f1a69492 100644 --- a/packages/plugin-react/test/index.test.tsx +++ b/packages/plugin-react/test/index.test.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react' import { create, act } from 'react-test-renderer' import BugsnagPluginReact, { formatComponentStack } from '../src/plugin' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' const client = new Client( { apiKey: '123', plugins: [new BugsnagPluginReact(React)] }, diff --git a/packages/plugin-restify/test/restify.test.ts b/packages/plugin-restify/test/restify.test.ts index 06790a43b..8f5f49945 100644 --- a/packages/plugin-restify/test/restify.test.ts +++ b/packages/plugin-restify/test/restify.test.ts @@ -1,4 +1,4 @@ -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import plugin from '../src/restify' describe('plugin: restify', () => { diff --git a/packages/plugin-server-session/test/session.test.ts b/packages/plugin-server-session/test/session.test.ts index 71b844369..549873a72 100644 --- a/packages/plugin-server-session/test/session.test.ts +++ b/packages/plugin-server-session/test/session.test.ts @@ -1,5 +1,5 @@ import { EventEmitter } from 'events' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import _Tracker from '../tracker' import plugin from '../session' import { Session } from '@bugsnag/core' diff --git a/packages/plugin-server-session/test/tracker.test.ts b/packages/plugin-server-session/test/tracker.test.ts index 09593991a..4318dae04 100644 --- a/packages/plugin-server-session/test/tracker.test.ts +++ b/packages/plugin-server-session/test/tracker.test.ts @@ -1,5 +1,5 @@ import Tracker from '../tracker' -import Session from '@bugsnag/core/session' +import { Session } from '@bugsnag/core' import timekeeper from 'timekeeper' describe('session tracker', () => { diff --git a/packages/plugin-simple-throttle/test/throttle.test.ts b/packages/plugin-simple-throttle/test/throttle.test.ts index 29d27a5bc..647b81efd 100644 --- a/packages/plugin-simple-throttle/test/throttle.test.ts +++ b/packages/plugin-simple-throttle/test/throttle.test.ts @@ -1,6 +1,6 @@ import plugin from '../src/throttle' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' describe('plugin: throttle', () => { const payloads = [] diff --git a/packages/plugin-stackframe-path-normaliser/test/path-normaliser.test.ts b/packages/plugin-stackframe-path-normaliser/test/path-normaliser.test.ts index c44986b99..82c3b7427 100644 --- a/packages/plugin-stackframe-path-normaliser/test/path-normaliser.test.ts +++ b/packages/plugin-stackframe-path-normaliser/test/path-normaliser.test.ts @@ -1,6 +1,5 @@ import plugin from '../' -import Event from '@bugsnag/core/event' -import Client from '@bugsnag/core/client' +import { Client, Event } from '@bugsnag/core' describe('plugin: stackframe path normaliser', () => { it('does not change frames with no file path', done => { diff --git a/packages/plugin-strip-project-root/test/strip-project-root.test.ts b/packages/plugin-strip-project-root/test/strip-project-root.test.ts index 4b5426b93..a61881cbe 100644 --- a/packages/plugin-strip-project-root/test/strip-project-root.test.ts +++ b/packages/plugin-strip-project-root/test/strip-project-root.test.ts @@ -1,8 +1,6 @@ import plugin from '../' import { join } from 'path' -import Event from '@bugsnag/core/event' -import Client from '@bugsnag/core/client' -import { schema } from '@bugsnag/core/config' +import { Client, Event, schema } from '@bugsnag/core' describe('plugin: strip project root', () => { it('should remove the project root if it matches the start of the stackframe’s file', done => { diff --git a/packages/plugin-strip-query-string/test/strip-query-string.test.ts b/packages/plugin-strip-query-string/test/strip-query-string.test.ts index 4eb1f0cd2..a9f4c84fb 100644 --- a/packages/plugin-strip-query-string/test/strip-query-string.test.ts +++ b/packages/plugin-strip-query-string/test/strip-query-string.test.ts @@ -1,7 +1,8 @@ import plugin from '../' -import Client, { EventDeliveryPayload } from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' import { Stackframe } from '@bugsnag/core' +import { EventDeliveryPayload } from '@bugsnag/core/client' describe('plugin: strip query string', () => { it('should strip querystrings and fragments from urls', () => { diff --git a/packages/plugin-vue/test/index.test.ts b/packages/plugin-vue/test/index.test.ts index 696414237..8a6054393 100644 --- a/packages/plugin-vue/test/index.test.ts +++ b/packages/plugin-vue/test/index.test.ts @@ -1,5 +1,5 @@ import BugsnagVuePlugin from '../src' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' describe('bugsnag vue', () => { beforeAll(() => { diff --git a/packages/plugin-window-onerror/test/onerror.test.ts b/packages/plugin-window-onerror/test/onerror.test.ts index b37b621d6..11e425ac0 100644 --- a/packages/plugin-window-onerror/test/onerror.test.ts +++ b/packages/plugin-window-onerror/test/onerror.test.ts @@ -2,7 +2,7 @@ import plugin from '../src/onerror' -import Client, { EventDeliveryPayload } from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' type EnhancedWindow = Window & typeof globalThis & { onerror: OnErrorEventHandlerNonNull } diff --git a/packages/plugin-window-unhandled-rejection/test/unhandled-rejection.test.ts b/packages/plugin-window-unhandled-rejection/test/unhandled-rejection.test.ts index b0ffbd64e..1e8b2f888 100644 --- a/packages/plugin-window-unhandled-rejection/test/unhandled-rejection.test.ts +++ b/packages/plugin-window-unhandled-rejection/test/unhandled-rejection.test.ts @@ -1,7 +1,7 @@ /* eslint-disable jest/no-commented-out-tests */ import plugin from '../src/unhandled-rejection' -import Client from '@bugsnag/core/client' +import { Client } from '@bugsnag/core' describe('plugin: unhandled rejection', () => { beforeEach(() => { diff --git a/packages/react-native/src/config.js b/packages/react-native/src/config.js index 0dd03184b..19ac7f1ca 100644 --- a/packages/react-native/src/config.js +++ b/packages/react-native/src/config.js @@ -1,4 +1,4 @@ -const { schema } = require('@bugsnag/core/config') +const { schema } = require('@bugsnag/core') const stringWithLength = require('@bugsnag/core/lib/validators/string-with-length') const rnPackage = require('react-native/package.json') const iserror = require('iserror') diff --git a/packages/react-native/src/notifier.js b/packages/react-native/src/notifier.js index b8d7f776b..e3009d253 100644 --- a/packages/react-native/src/notifier.js +++ b/packages/react-native/src/notifier.js @@ -19,10 +19,7 @@ const url = 'https://github.com/bugsnag/bugsnag-js' const React = require('react') -const Client = require('@bugsnag/core/client') -const Event = require('@bugsnag/core/event') -const Session = require('@bugsnag/core/session') -const { Breadcrumb } = require('@bugsnag/core') +const { Breadcrumb, Client, Event, Session } = require('@bugsnag/core') Event.__type = 'reactnativejs' diff --git a/packages/web-worker/src/bugsnag.ts b/packages/web-worker/src/bugsnag.ts index 4fe8195f5..01e2446e9 100644 --- a/packages/web-worker/src/bugsnag.ts +++ b/packages/web-worker/src/bugsnag.ts @@ -6,13 +6,11 @@ import pluginWindowOnError from '@bugsnag/plugin-window-onerror' import pluginWindowUnhandledRejection from '@bugsnag/plugin-window-unhandled-rejection' // extend the base config schema with some browser-specific options -import { schema as baseConfig } from '@bugsnag/core/config' import workerConfig from './config' import pluginBrowserDevice from '@bugsnag/plugin-browser-device' import pluginBrowserSession from '@bugsnag/plugin-browser-session' import pluginPreventDiscard from './prevent-discard' -import ClientWithInternals from '@bugsnag/core/client' -import type { Client, Config, BugsnagStatic } from '@bugsnag/core' +import { Client, Config, BugsnagStatic, schema as baseConfig } from '@bugsnag/core' import assign from '@bugsnag/core/lib/es-utils/assign' export interface WorkerConfig extends Config { @@ -32,10 +30,10 @@ const version = '__BUGSNAG_NOTIFIER_VERSION__' // extend the base config schema with some worker-specific options const schema = assign({}, baseConfig, workerConfig) -type WorkerClient = Partial & { - _client: ClientWithInternals | null - createClient: (opts?: Config) => ClientWithInternals - start: (opts?: Config) => ClientWithInternals +type WorkerClient = Partial & { + _client: Client | null + createClient: (opts?: Config) => Client + start: (opts?: Config) => Client isStarted: () => boolean } @@ -56,7 +54,7 @@ const notifier: WorkerClient = { ] // configure a client with user supplied options - const bugsnag = new ClientWithInternals(opts, schema, internalPlugins, { name, version, url }) + const bugsnag = new Client(opts, schema, internalPlugins, { name, version, url }) bugsnag._setDelivery(client => delivery(client, self.fetch, self)) @@ -79,10 +77,10 @@ const notifier: WorkerClient = { } } -type Method = keyof typeof ClientWithInternals.prototype +type Method = keyof typeof Client.prototype // Add client functions to notifier -(Object.getOwnPropertyNames(ClientWithInternals.prototype) as Method[]).forEach(method => { +(Object.getOwnPropertyNames(Client.prototype) as Method[]).forEach(method => { // skip private methods // @ts-ignore if (/^_/.test(method) || method === 'constructor') return diff --git a/packages/web-worker/src/config.ts b/packages/web-worker/src/config.ts index a23ee75fc..1c073a7f1 100644 --- a/packages/web-worker/src/config.ts +++ b/packages/web-worker/src/config.ts @@ -1,6 +1,6 @@ /* eslint-env worker, serviceworker */ -import { schema } from '@bugsnag/core/config' +import { schema } from '@bugsnag/core' import assign from '@bugsnag/core/lib/es-utils/assign' import getPrefixedConsole from './get-prefixed-console' diff --git a/packages/web-worker/src/index-umd.ts b/packages/web-worker/src/index-umd.ts index f1930cb14..b81ba3805 100644 --- a/packages/web-worker/src/index-umd.ts +++ b/packages/web-worker/src/index-umd.ts @@ -1,7 +1,4 @@ -import Client from '@bugsnag/core/client' -import Event from '@bugsnag/core/event' -import Session from '@bugsnag/core/session' -import { Breadcrumb } from '@bugsnag/core' +import { Breadcrumb, Client, Event, Session } from '@bugsnag/core' import assign from '@bugsnag/core/lib/es-utils/assign' diff --git a/packages/web-worker/src/prevent-discard.ts b/packages/web-worker/src/prevent-discard.ts index 886db0563..8a242e90a 100644 --- a/packages/web-worker/src/prevent-discard.ts +++ b/packages/web-worker/src/prevent-discard.ts @@ -1,16 +1,14 @@ /* eslint-env worker, serviceworker */ import { Client } from '@bugsnag/core' -import ClientWithInternals from '@bugsnag/core/client' -import EventWithInternals from '@bugsnag/core/event' const extensionRegex = /^(chrome|moz|safari|safari-web)-extension:/ export default { name: 'preventDiscard', load: (client: Client) => { - (client as ClientWithInternals).addOnError((event) => { - (event as EventWithInternals).errors.forEach(({ stacktrace }) => { + client.addOnError((event) => { + event.errors.forEach(({ stacktrace }) => { stacktrace.forEach(function (frame) { frame.file = frame.file.replace(extensionRegex, '$1_extension:') })