From c0d27e19256f01a5b36fe7b1cd76a7cb7b3616c1 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 16 Sep 2025 12:10:28 +0100 Subject: [PATCH 01/38] feat(core): :sparkles: implement additional grouping discriminator in core --- .vscode/settings.json | 5 + packages/core/client.js | 12 ++ packages/core/event.d.ts | 2 + packages/core/event.js | 12 ++ packages/core/test/event.test.ts | 24 +++ .../core/test/grouping-discriminator.test.ts | 172 ++++++++++++++++++ packages/core/types/client.d.ts | 4 + packages/core/types/event.d.ts | 4 + 8 files changed, 235 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 packages/core/test/grouping-discriminator.test.ts diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..3908e21b66 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "conventionalCommits.scopes": [ + "core" + ] +} \ No newline at end of file diff --git a/packages/core/client.js b/packages/core/client.js index 354c4e5f47..bb58111b95 100644 --- a/packages/core/client.js +++ b/packages/core/client.js @@ -43,6 +43,7 @@ class Client { this._features = [] this._context = undefined this._user = {} + this._groupingDiscriminator = undefined // callbacks: // e: onError @@ -118,6 +119,16 @@ class Client { this._context = c } + getGroupingDiscriminator () { + return this._groupingDiscriminator + } + + setGroupingDiscriminator (value) { + const previousValue = this._groupingDiscriminator + if (typeof value === 'string' || value === null || value === undefined) this._groupingDiscriminator = value + return previousValue + } + _configure (opts, internalPlugins) { const schema = reduce(internalPlugins, (schema, plugin) => { if (plugin && plugin.configSchema) return assign({}, schema, plugin.configSchema) @@ -314,6 +325,7 @@ class Client { event._metadata = assign({}, event._metadata, this._metadata) event._user = assign({}, event._user, this._user) event.breadcrumbs = this._breadcrumbs.slice() + event.setGroupingDiscriminator(this._groupingDiscriminator) merge(event._features, this._features, event._featuresIndex) // exit early if events should not be sent on the current releaseStage diff --git a/packages/core/event.d.ts b/packages/core/event.d.ts index 85f70cfe99..9ace225a89 100644 --- a/packages/core/event.d.ts +++ b/packages/core/event.d.ts @@ -27,6 +27,7 @@ export default class EventWithInternals extends Event { _handledState: HandledState _correlation?: { spanId: string, traceId: string } _session?: Session + _groupingDiscriminator?: string | null toJSON(): { payloadVersion: '4' exceptions: Array @@ -43,6 +44,7 @@ export default class EventWithInternals extends Event { context: string | undefined correlation: { spanId: string, traceId: string } | undefined groupingHash: string | undefined + groupingDiscriminator: string | undefined metaData: { [key: string]: any } user: User session: Session diff --git a/packages/core/event.js b/packages/core/event.js index c093010be4..9db8c8e743 100644 --- a/packages/core/event.js +++ b/packages/core/event.js @@ -33,6 +33,7 @@ class Event { this._user = {} this._session = undefined this._correlation = undefined + this._groupingDiscriminator = undefined this.errors = [ createBugsnagError(errorClass, errorMessage, Event.__type, stacktrace) @@ -62,6 +63,16 @@ class Event { } } + getGroupingDiscriminator () { + return this._groupingDiscriminator + } + + setGroupingDiscriminator (value) { + const previousValue = this._groupingDiscriminator + if (typeof value === 'string' || value === null || value === undefined) this._groupingDiscriminator = value + return previousValue + } + getMetadata (section, key) { return metadataDelegate.get(this._metadata, section, key) } @@ -112,6 +123,7 @@ class Event { breadcrumbs: this.breadcrumbs, context: this.context, groupingHash: this.groupingHash, + groupingDiscriminator: this._groupingDiscriminator, metaData: this._metadata, user: this._user, session: this._session, diff --git a/packages/core/test/event.test.ts b/packages/core/test/event.test.ts index 17e2268bdf..1231fa577f 100644 --- a/packages/core/test/event.test.ts +++ b/packages/core/test/event.test.ts @@ -445,4 +445,28 @@ describe('@bugsnag/core/event', () => { expect(serialized.correlation).toBeUndefined() }) }) + + describe('Event.getGroupingDiscriminator() / Event.setGroupingDiscriminator', () => { + it('sets and retrieves grouping discriminator on event', () => { + const event = new Event('Error', 'test message', []) + + // Initially should be undefined + expect(event.getGroupingDiscriminator()).toBe(undefined) + + // Set a value and retrieve it + const previousValue = event.setGroupingDiscriminator('event-discriminator') + expect(previousValue).toBe(undefined) + expect(event.getGroupingDiscriminator()).toBe('event-discriminator') + + // Update the value + const previousValue2 = event.setGroupingDiscriminator('updated-discriminator') + expect(previousValue2).toBe('event-discriminator') + expect(event.getGroupingDiscriminator()).toBe('updated-discriminator') + + // Clear the value + const previousValue3 = event.setGroupingDiscriminator(undefined) + expect(previousValue3).toBe('updated-discriminator') + expect(event.getGroupingDiscriminator()).toBe(undefined) + }) + }) }) diff --git a/packages/core/test/grouping-discriminator.test.ts b/packages/core/test/grouping-discriminator.test.ts new file mode 100644 index 0000000000..6ea8a4b36b --- /dev/null +++ b/packages/core/test/grouping-discriminator.test.ts @@ -0,0 +1,172 @@ +import Client from '../client' + +describe('@bugsnag/core/grouping discriminator', () => { + describe('Client', () => { + describe('getGroupingDiscriminator() / setGroupingDiscriminator()', () => { + it('sets and retrieves grouping discriminator on client', () => { + const client = new Client({ apiKey: 'API_KEY' }) + + // Initially should be undefined + expect(client.getGroupingDiscriminator()).toBe(undefined) + + // Set a value and retrieve it + const previousValue = client.setGroupingDiscriminator('test-discriminator') + expect(previousValue).toBe(undefined) + expect(client.getGroupingDiscriminator()).toBe('test-discriminator') + + // Update the value + const previousValue2 = client.setGroupingDiscriminator('new-discriminator') + expect(previousValue2).toBe('test-discriminator') + expect(client.getGroupingDiscriminator()).toBe('new-discriminator') + + // Clear the value + const previousValue3 = client.setGroupingDiscriminator(undefined) + expect(previousValue3).toBe('new-discriminator') + expect(client.getGroupingDiscriminator()).toBe(undefined) + }) + }) + }) + + describe('Client notify() integration', () => { + it('uses client grouping discriminator when event has none set', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + client.setGroupingDiscriminator('client-discriminator') + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe('client-discriminator') + + const eventPayload = event.toJSON() + expect(eventPayload.groupingDiscriminator).toBe('client-discriminator') + done() + }, + sendSession: () => {} + })) + + client.notify(new Error('test error')) + }) + + it('uses event grouping discriminator when set, ignoring client discriminator', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + client.setGroupingDiscriminator('client-discriminator') + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe('event-discriminator') + + const eventPayload = event.toJSON() + expect(eventPayload.groupingDiscriminator).toBe('event-discriminator') + done() + }, + sendSession: () => {} + })) + + client.notify(new Error('test error'), (event) => { + event.setGroupingDiscriminator('event-discriminator') + }) + }) + + it('does not set grouping discriminator when neither client nor event has one', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe(undefined) + + const eventPayload = event.toJSON() + expect(eventPayload.groupingDiscriminator).toBe(undefined) + done() + }, + sendSession: () => {} + })) + + client.notify(new Error('test error')) + }) + + it('handles multiple notify calls with different discriminators', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + client.setGroupingDiscriminator('client-discriminator') + + let callCount = 0 + const expectedResults = [ + 'client-discriminator', // First call uses client discriminator + 'custom-discriminator', // Second call has event discriminator set + 'client-discriminator', // Third call uses client discriminator again + undefined // Fourth call has the discriminator cleared + ] + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe(expectedResults[callCount]) + + const eventPayload = event.toJSON() + expect(eventPayload.groupingDiscriminator).toBe(expectedResults[callCount]) + + callCount++ + if (callCount === 4) { + done() + } + }, + sendSession: () => {} + })) + + // First notify - should use client discriminator + client.notify(new Error('test error 1')) + + // Second notify - should use event discriminator + client.notify(new Error('test error 2'), (event) => { + event.setGroupingDiscriminator('custom-discriminator') + }) + + // Third notify - should use client discriminator again + client.notify(new Error('test error 3')) + + // Fourth notify - clear the event discriminator + client.notify(new Error('test error 4'), (event) => { + event.setGroupingDiscriminator(undefined) + }) + }) + + it('allows changing client discriminator between notify calls', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + client.setGroupingDiscriminator('initial-discriminator') + + let callCount = 0 + const expectedResults = [ + 'initial-discriminator', + 'updated-discriminator' + ] + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe(expectedResults[callCount]) + + callCount++ + if (callCount === 2) { + done() + } + }, + sendSession: () => {} + })) + + // First notify + client.notify(new Error('test error 1')) + + // Change client discriminator + client.setGroupingDiscriminator('updated-discriminator') + + // Second notify + client.notify(new Error('test error 2')) + }) + }) +}) diff --git a/packages/core/types/client.d.ts b/packages/core/types/client.d.ts index 98dabdc2ec..2a1c4fafc0 100644 --- a/packages/core/types/client.d.ts +++ b/packages/core/types/client.d.ts @@ -50,6 +50,10 @@ declare class Client { public getContext(): string | undefined; public setContext(c: string): void; + // grouping discriminator + public getGroupingDiscriminator(): string | undefined; + public setGroupingDiscriminator(groupingDiscriminator: string | undefined): string | undefined; + // user public getUser(): User; public setUser(id?: string | null, email?: string | null, name?: string | null): void; diff --git a/packages/core/types/event.d.ts b/packages/core/types/event.d.ts index 2339fb5604..114b0d2a4a 100644 --- a/packages/core/types/event.d.ts +++ b/packages/core/types/event.d.ts @@ -56,6 +56,10 @@ declare class Event { // trace correlation public setTraceCorrelation(traceId: string, spanId?: string): void + + // grouping discriminators + public getGroupingDiscriminator(): string | undefined + public setGroupingDiscriminator(value: string | undefined): string | undefined } interface HandledState { From 973829d947f9dac1b6aa6fac54b3a8651e11ddb0 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 16 Sep 2025 12:10:58 +0100 Subject: [PATCH 02/38] test: :white_check_mark: add groupingDiscriminator tests in browser --- .../grouping_discriminator/script/index.html | 44 +++++++++++++++++++ .../features/grouping_discriminator.feature | 15 +++++++ test/browser/features/steps/browser_steps.rb | 21 +++++++++ 3 files changed, 80 insertions(+) create mode 100644 test/browser/features/fixtures/grouping_discriminator/script/index.html create mode 100644 test/browser/features/grouping_discriminator.feature diff --git a/test/browser/features/fixtures/grouping_discriminator/script/index.html b/test/browser/features/fixtures/grouping_discriminator/script/index.html new file mode 100644 index 0000000000..525a9dde50 --- /dev/null +++ b/test/browser/features/fixtures/grouping_discriminator/script/index.html @@ -0,0 +1,44 @@ + + + + + + + + + + + diff --git a/test/browser/features/grouping_discriminator.feature b/test/browser/features/grouping_discriminator.feature new file mode 100644 index 0000000000..b4b42922c2 --- /dev/null +++ b/test/browser/features/grouping_discriminator.feature @@ -0,0 +1,15 @@ +@grouping_discriminator +Feature: Grouping discriminator functionality + +Scenario: multiple notify() calls with different grouping discriminators + When I navigate to the test URL "/grouping_discriminator/script/index.html" + Then I wait to receive 6 errors + And the error is a valid browser payload for the error reporting API + And the following sets are present in the current error payloads: + | events.0.exceptions.0.message | events.0.groupingDiscriminator | + | no-discriminator | nil | + | client-discriminator | client-discriminator | + | event-discriminator | event-discriminator | + | null-discriminator | nil | + | undefined-discriminator | nil | + | no-discriminator-2 | nil | diff --git a/test/browser/features/steps/browser_steps.rb b/test/browser/features/steps/browser_steps.rb index a339db8526..ed0ae21324 100644 --- a/test/browser/features/steps/browser_steps.rb +++ b/test/browser/features/steps/browser_steps.rb @@ -44,3 +44,24 @@ txt = Maze.driver.find_element(id: 'bugsnag-test-state').text Maze.check.equal('DONE', txt, "Expected #bugsnag-test-state text to be 'DONE'. It was '#{txt}'.") end + +When('the following sets are present in the current {word} payloads:') do |request_type, data_table| + expected_values = data_table.hashes + requests = Maze::Server.list_for(request_type) + Maze.check.equal(expected_values.length, requests.size_all) + payload_values = requests.all.map do |request| + payload_hash = {} + data_table.headers.each_with_object(payload_hash) do |field_path, payload_hash| + payload_hash[field_path] = Maze::Helper.read_key_path(request[:body], field_path) + end + payload_hash + end + expected_values.each do |expected_data| + # if value is 'nil' then the field should not be present in the payload + expected_data.each do |field_path, expected_value| + expected_data[field_path] = nil if expected_value == 'nil' + end + Maze.check.true(payload_values.include?(expected_data), + "#{expected_data} was not found in any of the current payloads") + end +end From 013bd59ac024fad4de629fa161a3bbcda6ce5126 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 16 Sep 2025 12:11:09 +0100 Subject: [PATCH 03/38] docs: :memo: add changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 032b6f8d31..169edda854 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Added + +- Add additional grouping discriminator property to events [#2544](https://github.com/bugsnag/bugsnag-js/pull/2544) + ### Changed - Update bugsnag-cocoa to [v6.33.1](https//github.com/bugsnag/bugsnag-cocoa/releases/tag/v6.33.1) [#2552](https://github.com/bugsnag/bugsnag-js/pull/2552) From 334fa7cac44d71586f64f11a3586c28fd5fd1923 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 16 Sep 2025 14:51:31 +0100 Subject: [PATCH 04/38] feat(react-native): :sparkles: Handle additional grouping discriminator in react-native --- .vscode/settings.json | 3 +- CHANGELOG.md | 1 + packages/delivery-react-native/delivery.js | 1 + .../test/delivery.test.ts | 1 + .../client-sync.js | 10 ++++++ .../test/client-sync.test.ts | 28 ++++++++++++++++ .../android/BugsnagReactNativeImpl.java | 10 ++++++ .../bugsnag/android/NativeBugsnagImpl.java | 5 +++ .../bugsnag/android/BugsnagReactNative.java | 5 +++ .../BugsnagEventDeserializer.m | 1 + .../BugsnagReactNative/BugsnagReactNative.mm | 5 +++ .../BugsnagReactNativeEmitter.m | 9 ++++++ packages/react-native/src/NativeBugsnag.ts | 2 ++ .../GroupingDiscriminatorNativeScenario.kt | 25 +++++++++++++++ .../project.pbxproj | 6 ++++ .../GroupingDiscriminatorNativeScenario.h | 6 ++++ .../GroupingDiscriminatorNativeScenario.m | 15 +++++++++ .../Scenarios/GroupingDiscriminatorScenario.h | 6 ++++ .../Scenarios/GroupingDiscriminatorScenario.m | 11 +++++++ .../GroupingDiscriminatorNativeScenario.js | 18 +++++++++++ .../GroupingDiscriminatorScenario.js | 32 +++++++++++++++++++ .../scenario-launcher/src/scenarios/index.js | 4 +++ .../features/grouping-discriminator.feature | 23 +++++++++++++ .../features/steps/react-native-steps.rb | 4 +++ 24 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 test/react-native/features/fixtures/scenario-launcher/android/src/main/java/com/bugsnag/reactnative/test/scenarios/GroupingDiscriminatorNativeScenario.kt create mode 100644 test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.h create mode 100644 test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.m create mode 100644 test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.h create mode 100644 test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.m create mode 100644 test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorNativeScenario.js create mode 100644 test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorScenario.js create mode 100644 test/react-native/features/grouping-discriminator.feature diff --git a/.vscode/settings.json b/.vscode/settings.json index 3908e21b66..cade008df4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "conventionalCommits.scopes": [ - "core" + "core", + "react-native" ] } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 169edda854..7eaf800579 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Added - Add additional grouping discriminator property to events [#2544](https://github.com/bugsnag/bugsnag-js/pull/2544) +- (react-native) Handle additional grouping discriminator [#2557](https://github.com/bugsnag/bugsnag-js/pull/2557) ### Changed diff --git a/packages/delivery-react-native/delivery.js b/packages/delivery-react-native/delivery.js index 36adcd8ad7..49561f9061 100644 --- a/packages/delivery-react-native/delivery.js +++ b/packages/delivery-react-native/delivery.js @@ -27,6 +27,7 @@ module.exports = (client, NativeClient) => ({ user: event._user, metadata: derecursify(event._metadata), groupingHash: event.groupingHash, + groupingDiscriminator: event._groupingDiscriminator, apiKey: event.apiKey, featureFlags: event.toJSON().featureFlags, nativeStack: nativeStack, diff --git a/packages/delivery-react-native/test/delivery.test.ts b/packages/delivery-react-native/test/delivery.test.ts index 0231241017..27d847cc2d 100644 --- a/packages/delivery-react-native/test/delivery.test.ts +++ b/packages/delivery-react-native/test/delivery.test.ts @@ -27,6 +27,7 @@ type NativeClientEvent = Pick ({ return ret } + const origSetGroupingDiscriminator = client.setGroupingDiscriminator + client.setGroupingDiscriminator = function () { + const ret = origSetGroupingDiscriminator.apply(this, arguments) + NativeClient.updateGroupingDiscriminator(this._groupingDiscriminator) + return ret + } + const origAddMetadata = client.addMetadata client.addMetadata = function (section, key, value) { const ret = origAddMetadata.apply(this, arguments) @@ -99,6 +106,9 @@ module.exports = (NativeClient) => ({ case 'ContextUpdate': origSetContext.call(client, event.data) break + case 'GroupingDiscriminatorUpdate': + origSetGroupingDiscriminator.call(client, event.data) + break case 'AddFeatureFlag': origAddFeatureFlag.call(client, event.data.name, event.data.variant) break 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 e3a97db323..c5c387ce3e 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 @@ -36,6 +36,21 @@ describe('plugin: react native client sync', () => { c.setContext('1234') }) + it('updates grouping discriminator', done => { + const c = new Client({ + apiKey: 'api_key', + plugins: [ + plugin({ + updateGroupingDiscriminator: (update: any) => { + expect(update).toBe('test-discriminator') + done() + } + }) + ] + }) + c.setGroupingDiscriminator('test-discriminator') + }) + it('updates metadata', done => { const c = new Client({ apiKey: 'api_key', @@ -191,6 +206,19 @@ describe('plugin: react native client sync', () => { }, 1) }) + it('silently updates grouping discriminator when an update is received', () => { + MockAddListener.mockImplementation((event: any, listener: (payload: any) => void) => { + setTimeout(() => listener({ type: 'GroupingDiscriminatorUpdate', data: 'new-discriminator' }), 0) + }) + const c = new Client({ apiKey: 'api_key', plugins: [plugin()] }) + expect(MockAddListener).toHaveBeenCalledWith('bugsnag::sync', expect.any(Function)) + expect(c.getGroupingDiscriminator()).toBe(undefined) + + setTimeout(() => { + expect(c.getGroupingDiscriminator()).toBe('new-discriminator') + }, 1) + }) + it('silently updates user when an update is received', () => { MockAddListener.mockImplementation((event: any, listener: (payload: any) => void) => { setTimeout(() => listener({ type: 'UserUpdate', data: { id: '1234', name: 'Ben', email: 'ben@bensnag.be' } }), 0) diff --git a/packages/react-native/android/src/main/java/com/bugsnag/android/BugsnagReactNativeImpl.java b/packages/react-native/android/src/main/java/com/bugsnag/android/BugsnagReactNativeImpl.java index 83d59938b5..91fdab2040 100644 --- a/packages/react-native/android/src/main/java/com/bugsnag/android/BugsnagReactNativeImpl.java +++ b/packages/react-native/android/src/main/java/com/bugsnag/android/BugsnagReactNativeImpl.java @@ -23,6 +23,7 @@ class BugsnagReactNativeImpl { static final String MODULE_NAME = "BugsnagReactNative"; private static final String UPDATE_CONTEXT = "ContextUpdate"; + private static final String UPDATE_GROUPING_DISCRIMINATOR = "GroupingDiscriminatorUpdate"; private static final String UPDATE_USER = "UserUpdate"; private static final String UPDATE_METADATA = "MetadataUpdate"; private static final String ADD_FEATURE_FLAG = "AddFeatureFlag"; @@ -85,6 +86,7 @@ void emitEvent(MessageEvent event) { switch (event.getType()) { case UPDATE_CONTEXT: + case UPDATE_GROUPING_DISCRIMINATOR: map.putString(DATA_KEY, (String) event.getData()); break; case UPDATE_USER: @@ -161,6 +163,14 @@ void updateContext(@Nullable String context) { } } + void updateGroupingDiscriminator(@Nullable String groupingDiscriminator) { + try { + plugin.updateGroupingDiscriminator(groupingDiscriminator); + } catch (Throwable exc) { + logFailure("updateGroupingDiscriminator", exc); + } + } + void addMetadata(@NonNull String section, @Nullable ReadableMap data) { try { plugin.addMetadata(section, data != null ? data.toHashMap() : null); diff --git a/packages/react-native/android/src/newarch/java/com/bugsnag/android/NativeBugsnagImpl.java b/packages/react-native/android/src/newarch/java/com/bugsnag/android/NativeBugsnagImpl.java index 30ba97a0e8..c876390ef6 100644 --- a/packages/react-native/android/src/newarch/java/com/bugsnag/android/NativeBugsnagImpl.java +++ b/packages/react-native/android/src/newarch/java/com/bugsnag/android/NativeBugsnagImpl.java @@ -71,6 +71,11 @@ public void updateContext(@Nullable String context) { impl.updateContext(context); } + @Override + public void updateGroupingDiscriminator(@Nullable String groupingDiscriminator) { + impl.updateGroupingDiscriminator(groupingDiscriminator); + } + @Override public void addMetadata(String section, ReadableMap metadata) { impl.addMetadata(section, metadata); diff --git a/packages/react-native/android/src/oldarch/java/com/bugsnag/android/BugsnagReactNative.java b/packages/react-native/android/src/oldarch/java/com/bugsnag/android/BugsnagReactNative.java index 58acaad285..c1358177b8 100644 --- a/packages/react-native/android/src/oldarch/java/com/bugsnag/android/BugsnagReactNative.java +++ b/packages/react-native/android/src/oldarch/java/com/bugsnag/android/BugsnagReactNative.java @@ -77,6 +77,11 @@ void updateContext(@Nullable String context) { impl.updateContext(context); } + @ReactMethod + void updateGroupingDiscriminator(@Nullable String groupingDiscriminator) { + impl.updateGroupingDiscriminator(groupingDiscriminator); + } + @ReactMethod void addMetadata(@NonNull String section, @Nullable ReadableMap data) { impl.addMetadata(section, data); diff --git a/packages/react-native/ios/BugsnagReactNative/BugsnagEventDeserializer.m b/packages/react-native/ios/BugsnagReactNative/BugsnagEventDeserializer.m index b781b7e87c..38547b6f4e 100644 --- a/packages/react-native/ios/BugsnagReactNative/BugsnagEventDeserializer.m +++ b/packages/react-native/ios/BugsnagReactNative/BugsnagEventDeserializer.m @@ -30,6 +30,7 @@ - (BugsnagEvent *)deserializeEvent:(NSDictionary *)payload { session:nil /* set by -[BugsnagClient notifyInternal:block:] */]; event.context = payload[@"context"]; event.groupingHash = payload[@"groupingHash"]; + event.groupingDiscriminator = payload[@"groupingDiscriminator"]; [event setCorrelationTraceId:correlation[@"traceId"] spanId:correlation[@"spanId"]]; diff --git a/packages/react-native/ios/BugsnagReactNative/BugsnagReactNative.mm b/packages/react-native/ios/BugsnagReactNative/BugsnagReactNative.mm index f0732c3186..6a5faa90a1 100644 --- a/packages/react-native/ios/BugsnagReactNative/BugsnagReactNative.mm +++ b/packages/react-native/ios/BugsnagReactNative/BugsnagReactNative.mm @@ -73,6 +73,11 @@ @implementation BugsnagReactNative BSG_EXPORT_RETURN } +BSG_EXPORT_METHOD(updateGroupingDiscriminator:(NSString *)groupingDiscriminator) { + [Bugsnag setGroupingDiscriminator:groupingDiscriminator]; + BSG_EXPORT_RETURN +} + BSG_EXPORT_METHOD(updateCodeBundleId:(NSString *)codeBundleId) { Bugsnag.client.codeBundleId = codeBundleId; BSG_EXPORT_RETURN diff --git a/packages/react-native/ios/BugsnagReactNative/BugsnagReactNativeEmitter.m b/packages/react-native/ios/BugsnagReactNative/BugsnagReactNativeEmitter.m index bbc933ceef..e41b2e961a 100644 --- a/packages/react-native/ios/BugsnagReactNative/BugsnagReactNativeEmitter.m +++ b/packages/react-native/ios/BugsnagReactNative/BugsnagReactNativeEmitter.m @@ -77,6 +77,15 @@ - (NSDictionary *)serializeClientObserverEvent:(BSGClientObserverEvent)event wit }; } break; + + case BSGClientObserverUpdateGroupingDiscriminator: + if ([value isKindOfClass:[NSString class]] || !value) { + return @{ + @"type": @"GroupingDiscriminatorUpdate", + @"data": value ?: [NSNull null] + }; + } + break; } return nil; diff --git a/packages/react-native/src/NativeBugsnag.ts b/packages/react-native/src/NativeBugsnag.ts index 4dd3b28dce..3b098cac63 100644 --- a/packages/react-native/src/NativeBugsnag.ts +++ b/packages/react-native/src/NativeBugsnag.ts @@ -42,6 +42,8 @@ export interface Spec extends TurboModule { clearFeatureFlag(name: string): void clearFeatureFlags(): void + + updateGroupingDiscriminator(groupingDiscriminator: string | undefined | null): void } // eslint-disable-next-line @typescript-eslint/consistent-type-definitions diff --git a/test/react-native/features/fixtures/scenario-launcher/android/src/main/java/com/bugsnag/reactnative/test/scenarios/GroupingDiscriminatorNativeScenario.kt b/test/react-native/features/fixtures/scenario-launcher/android/src/main/java/com/bugsnag/reactnative/test/scenarios/GroupingDiscriminatorNativeScenario.kt new file mode 100644 index 0000000000..fed3214bc6 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/android/src/main/java/com/bugsnag/reactnative/test/scenarios/GroupingDiscriminatorNativeScenario.kt @@ -0,0 +1,25 @@ +package com.reactnative.scenarios + +import android.content.Context +import com.bugsnag.android.Bugsnag +import com.facebook.react.bridge.Promise + +class GroupingDiscriminatorNativeScenario(context: Context): Scenario(context) { + + override fun run(promise: Promise) { + val exception = RuntimeException("GroupingDiscriminatorScenarioNative") + Bugsnag.notify(exception) + Thread.sleep(500) + Bugsnag.setGroupingDiscriminator("grouping-discriminator-from-native") + // JS layer will be automatically notified via the BugsnagReactNativeEmitter + // when setGroupingDiscriminator is called, which triggers the client observer + } + + override fun runSync(): Boolean { + val exception = RuntimeException("GroupingDiscriminatorScenarioNative") + Bugsnag.notify(exception) + Thread.sleep(500) + Bugsnag.setGroupingDiscriminator("grouping-discriminator-from-native") + return true + } +} diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj b/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj index ce31311634..2b0f5d3fe3 100644 --- a/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj +++ b/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ DA2260AC2E58AD79008384E6 /* BugsnagTestInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA2260AB2E58AD79008384E6 /* BugsnagTestInterface.mm */; }; DA2260D42E58AD99008384E6 /* ContextNativeCustomScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260B42E58AD99008384E6 /* ContextNativeCustomScenario.m */; }; + DA2260D42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260B42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m */; }; DA2260D52E58AD99008384E6 /* MetadataNativeUnhandledScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260C02E58AD99008384E6 /* MetadataNativeUnhandledScenario.m */; }; DA2260D62E58AD99008384E6 /* UserNativeClientScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260D32E58AD99008384E6 /* UserNativeClientScenario.m */; }; DA2260D72E58AD99008384E6 /* StartSessionScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260CF2E58AD99008384E6 /* StartSessionScenario.m */; }; @@ -54,6 +55,8 @@ DA2260B22E58AD99008384E6 /* BreadcrumbsNativeManualScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BreadcrumbsNativeManualScenario.m; path = Scenarios/BreadcrumbsNativeManualScenario.m; sourceTree = ""; }; DA2260B32E58AD99008384E6 /* ContextNativeCustomScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ContextNativeCustomScenario.h; path = Scenarios/ContextNativeCustomScenario.h; sourceTree = ""; }; DA2260B42E58AD99008384E6 /* ContextNativeCustomScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ContextNativeCustomScenario.m; path = Scenarios/ContextNativeCustomScenario.m; sourceTree = ""; }; + DA2260B32E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GroupingDiscriminatorNativeScenario.h; path = Scenarios/GroupingDiscriminatorNativeScenario.h; sourceTree = ""; }; + DA2260B42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GroupingDiscriminatorNativeScenario.m; path = Scenarios/GroupingDiscriminatorNativeScenario.m; sourceTree = ""; }; DA2260B52E58AD99008384E6 /* DeviceNativeHandledScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DeviceNativeHandledScenario.h; path = Scenarios/DeviceNativeHandledScenario.h; sourceTree = ""; }; DA2260B62E58AD99008384E6 /* DeviceNativeHandledScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = DeviceNativeHandledScenario.m; path = Scenarios/DeviceNativeHandledScenario.m; sourceTree = ""; }; DA2260B72E58AD99008384E6 /* DeviceNativeUnhandledScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DeviceNativeUnhandledScenario.h; path = Scenarios/DeviceNativeUnhandledScenario.h; sourceTree = ""; }; @@ -109,6 +112,8 @@ DA2260B22E58AD99008384E6 /* BreadcrumbsNativeManualScenario.m */, DA2260B32E58AD99008384E6 /* ContextNativeCustomScenario.h */, DA2260B42E58AD99008384E6 /* ContextNativeCustomScenario.m */, + DA2260B32E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.h */, + DA2260B42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m */, DA2260B52E58AD99008384E6 /* DeviceNativeHandledScenario.h */, DA2260B62E58AD99008384E6 /* DeviceNativeHandledScenario.m */, DA2260B72E58AD99008384E6 /* DeviceNativeUnhandledScenario.h */, @@ -215,6 +220,7 @@ buildActionMask = 2147483647; files = ( DA2260D42E58AD99008384E6 /* ContextNativeCustomScenario.m in Sources */, + DA2260D42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m in Sources */, DA2260D52E58AD99008384E6 /* MetadataNativeUnhandledScenario.m in Sources */, DA2260D62E58AD99008384E6 /* UserNativeClientScenario.m in Sources */, DA2260D72E58AD99008384E6 /* StartSessionScenario.m in Sources */, diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.h b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.h new file mode 100644 index 0000000000..73d11746ae --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.h @@ -0,0 +1,6 @@ +#import +#import "Scenario.h" + +@interface GroupingDiscriminatorNativeScenario : Scenario + +@end diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.m b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.m new file mode 100644 index 0000000000..91b0e83311 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.m @@ -0,0 +1,15 @@ +#import "GroupingDiscriminatorNativeScenario.h" + +@implementation GroupingDiscriminatorNativeScenario + +- (void)run: (RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + NSException *exception = [[NSException alloc] initWithName:@"NSException" reason:@"GroupingDiscriminatorScenarioNative" userInfo:nil]; + [Bugsnag notify:exception]; + [NSThread sleepForTimeInterval:0.5]; + [Bugsnag setGroupingDiscriminator:@"grouping-discriminator-from-native"]; + // JS layer will be automatically notified via the BugsnagReactNativeEmitter + // when setGroupingDiscriminator is called, which triggers BSGClientObserverUpdateGroupingDiscriminator +} + +@end diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.h b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.h new file mode 100644 index 0000000000..46151229c6 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.h @@ -0,0 +1,6 @@ +#import +#import "Scenario.h" + +@interface GroupingDiscriminatorScenario : Scenario + +@end diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.m b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.m new file mode 100644 index 0000000000..30c23f3925 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.m @@ -0,0 +1,11 @@ +#import "GroupingDiscriminatorScenario.h" + +@implementation GroupingDiscriminatorScenario + +- (void)run: (RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + // This scenario is driven from the JS side + // The native part doesn't need to do anything specific +} + +@end diff --git a/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorNativeScenario.js b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorNativeScenario.js new file mode 100644 index 0000000000..c3792de4ff --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorNativeScenario.js @@ -0,0 +1,18 @@ +import Scenario from './Scenario' +import Bugsnag from '@bugsnag/react-native' +import { NativeInterface } from '../lib/native' + +export class GroupingDiscriminatorNativeScenario extends Scenario { + run () { + // Set initial grouping discriminator in JavaScript + Bugsnag.setGroupingDiscriminator('grouping-discriminator-from-js') + + // Trigger the native scenario which will set the grouping discriminator + setTimeout(async () => { + await NativeInterface.runScenario('GroupingDiscriminatorNativeScenario') + setTimeout(() => { + Bugsnag.notify(new Error('GroupingDiscriminatorScenarioJS')) + }, 100) + }, 100) + } +} diff --git a/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorScenario.js b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorScenario.js new file mode 100644 index 0000000000..cbd0864ef8 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorScenario.js @@ -0,0 +1,32 @@ +import Scenario from './Scenario' +import Bugsnag from '@bugsnag/react-native' + +export class GroupingDiscriminatorScenario extends Scenario { + run () { + // 1. Notify with error that has no discriminator + Bugsnag.notify(new Error('no-discriminator')) + + // 2. Notify with error that should use client discriminator + Bugsnag.setGroupingDiscriminator('client-discriminator') + Bugsnag.notify(new Error('client-discriminator')) + + // 3. Notify with error and set event discriminator + Bugsnag.notify(new Error('event-discriminator'), event => { + event.setGroupingDiscriminator('event-discriminator') + }) + + // 4. Notify with error and explicitly set event discriminator to null + Bugsnag.notify(new Error('null-discriminator'), event => { + event.setGroupingDiscriminator(null) + }) + + // 5. Notify with error and explicitly set event discriminator to undefined + Bugsnag.notify(new Error('undefined-discriminator'), event => { + event.setGroupingDiscriminator(undefined) + }) + + // 6. Clear client grouping discriminator and notify + Bugsnag.setGroupingDiscriminator(undefined) + Bugsnag.notify(new Error('no-discriminator-2')) + } +} diff --git a/test/react-native/features/fixtures/scenario-launcher/src/scenarios/index.js b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/index.js index f9401b51d2..1c0c937efa 100644 --- a/test/react-native/features/fixtures/scenario-launcher/src/scenarios/index.js +++ b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/index.js @@ -81,3 +81,7 @@ export { ReactNavigationBreadcrumbsDisabledScenario } from './ReactNavigationBre // react-native-navigation.feature export { ReactNativeNavigationBreadcrumbsEnabledScenario } from './ReactNativeNavigationBreadcrumbsEnabledScenario' export { ReactNativeNavigationBreadcrumbsDisabledScenario } from './ReactNativeNavigationBreadcrumbsDisabledScenario' + +// grouping-discriminator.feature +export { GroupingDiscriminatorScenario } from './GroupingDiscriminatorScenario' +export { GroupingDiscriminatorNativeScenario } from './GroupingDiscriminatorNativeScenario' diff --git a/test/react-native/features/grouping-discriminator.feature b/test/react-native/features/grouping-discriminator.feature new file mode 100644 index 0000000000..715c58090c --- /dev/null +++ b/test/react-native/features/grouping-discriminator.feature @@ -0,0 +1,23 @@ +@grouping_discriminator +Feature: Grouping discriminator functionality + +Scenario: multiple notify() calls with different grouping discriminators + When I run "GroupingDiscriminatorScenario" + And I wait to receive 6 errors + Then the following sets are present in the current error payloads: + | events.0.exceptions.0.message | events.0.groupingDiscriminator | + | no-discriminator | nil | + | client-discriminator | client-discriminator | + | event-discriminator | event-discriminator | + | null-discriminator | nil | + | undefined-discriminator | nil | + | no-discriminator-2 | nil | + +Scenario: Grouping discriminator set in JavaScript is reflected in native + When I run "GroupingDiscriminatorNativeScenario" + And I wait to receive 2 errors + Then the following sets are present in the current error payloads: + | events.0.exceptions.0.message | events.0.groupingDiscriminator | + | GroupingDiscriminatorScenarioNative | grouping-discriminator-from-js | + | GroupingDiscriminatorScenarioJS | grouping-discriminator-from-native | + \ No newline at end of file diff --git a/test/react-native/features/steps/react-native-steps.rb b/test/react-native/features/steps/react-native-steps.rb index 7eb162318c..76e75b913b 100644 --- a/test/react-native/features/steps/react-native-steps.rb +++ b/test/react-native/features/steps/react-native-steps.rb @@ -129,6 +129,10 @@ def wait_for_app_state(expected_state) payload_hash end expected_values.each do |expected_data| + # if value is 'nil' then the field should not be present in the payload + expected_data.each do |field_path, expected_value| + expected_data[field_path] = nil if expected_value == 'nil' + end Maze.check.true(payload_values.include?(expected_data), "#{expected_data} was not found in any of the current payloads") end From 01a302359365b4058dbd796abd55bef21bcb9594 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 16 Sep 2025 16:30:58 +0100 Subject: [PATCH 05/38] Delete .vscode/settings.json Remove plugin specific configuration --- .vscode/settings.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 3908e21b66..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "conventionalCommits.scopes": [ - "core" - ] -} \ No newline at end of file From 052d0d7a25cf4cf94b966a7b49a5641fab4f833f Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 16 Sep 2025 17:43:56 +0100 Subject: [PATCH 06/38] Delete .vscode/settings.json Remove file specific to plugin configuration --- .vscode/settings.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index cade008df4..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "conventionalCommits.scopes": [ - "core", - "react-native" - ] -} \ No newline at end of file From ced1a7bed1ac525a35865f4e712bcec71f22a426 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 16 Sep 2025 12:13:50 +0100 Subject: [PATCH 07/38] feat: :sparkles: add grouping discriminator to electron --- .../client-state-manager.js | 7 +++++++ .../test/client-state-manager.test.ts | 10 +++++++++ .../client-state-updates.js | 2 ++ .../test/client-state-updates.test.ts | 18 ++++++++++++++++ .../features/grouping-discriminator.feature | 21 +++++++++++++++++++ .../features/support/steps/request-steps.js | 8 +++++++ test/electron/fixtures/app/src/index.html | 4 ++++ test/electron/fixtures/app/src/main.js | 4 ++++ test/electron/fixtures/app/src/preload.js | 3 +++ test/electron/fixtures/app/src/renderer.js | 8 +++++++ 10 files changed, 85 insertions(+) create mode 100644 test/electron/features/grouping-discriminator.feature diff --git a/packages/plugin-electron-client-state-manager/client-state-manager.js b/packages/plugin-electron-client-state-manager/client-state-manager.js index ac0e56dfca..c46bc7e53c 100644 --- a/packages/plugin-electron-client-state-manager/client-state-manager.js +++ b/packages/plugin-electron-client-state-manager/client-state-manager.js @@ -22,6 +22,13 @@ module.exports = { return ret } + const origSetGroupingDiscriminator = client.setGroupingDiscriminator + client.setGroupingDiscriminator = (...args) => { + const ret = origSetGroupingDiscriminator.call(client, ...args) + emitter.emit('GroupingDiscriminatorUpdate', client.getGroupingDiscriminator()) + return ret + } + const origAddMetadata = client.addMetadata client.addMetadata = (...args) => { const ret = origAddMetadata.call(client, ...args) 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 5194080a37..46579f75ef 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 @@ -29,6 +29,16 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { client.setContext('ctx') }) + it('should emit events when grouping discriminator changes', done => { + const client = new Client({ apiKey: '123' }, {}, [stateManager], Notifier) + const { emitter } = client.getPlugin('clientStateManager') + emitter.on('GroupingDiscriminatorUpdate', (groupingDiscriminator: string) => { + expect(groupingDiscriminator).toBe('discriminator') + done() + }) + client.setGroupingDiscriminator('discriminator') + }) + interface MetadataUpdatePayload { section: string values?: Record diff --git a/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js b/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js index 00523bda64..50bf82c850 100644 --- a/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js +++ b/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js @@ -24,6 +24,7 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ client.addFeatureFlags = safeExec(client, BugsnagIpcRenderer, 'addFeatureFlags') client.clearFeatureFlag = safeExec(client, BugsnagIpcRenderer, 'clearFeatureFlag') client.clearFeatureFlags = safeExec(client, BugsnagIpcRenderer, 'clearFeatureFlags') + client.setGroupingDiscriminator = safeExec(client, BugsnagIpcRenderer, 'setGroupingDiscriminator') client.startSession = () => { safeExec(client, BugsnagIpcRenderer, 'startSession')() @@ -64,5 +65,6 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ client.getContext = safeExec(client, BugsnagIpcRenderer, 'getContext') client.getUser = safeExec(client, BugsnagIpcRenderer, 'getUser') client.getMetadata = safeExec(client, BugsnagIpcRenderer, 'getMetadata') + client.getGroupingDiscriminator = safeExec(client, BugsnagIpcRenderer, 'getGroupingDiscriminator') } }) 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 95d493d7c8..f33243ed4c 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 @@ -27,6 +27,24 @@ describe('clientStateUpdatesPlugin', () => { expect(client.getContext()).toBe('ctx') }) + it('propagates grouping discriminator changes', () => { + const mockBugsnagIpcRenderer = { + setGroupingDiscriminator: jest.fn() + } + const client = new Client({ apiKey: '123' }, {}, [clientStateUpdatesPlugin(mockBugsnagIpcRenderer)], Notifier) + + client.setGroupingDiscriminator('discriminator') + expect(mockBugsnagIpcRenderer.setGroupingDiscriminator).toHaveBeenCalledWith('discriminator') + }) + + it('forwards upstream changes to grouping discriminator', () => { + const mockBugsnagIpcRenderer = { + getGroupingDiscriminator: () => 'discriminator' + } + const client = new Client({ apiKey: '123' }, {}, [clientStateUpdatesPlugin(mockBugsnagIpcRenderer)], Notifier) + expect(client.getGroupingDiscriminator()).toBe('discriminator') + }) + it('propagates user changes', () => { const mockBugsnagIpcRenderer = { setUser: jest.fn() diff --git a/test/electron/features/grouping-discriminator.feature b/test/electron/features/grouping-discriminator.feature new file mode 100644 index 0000000000..9fff619e2b --- /dev/null +++ b/test/electron/features/grouping-discriminator.feature @@ -0,0 +1,21 @@ +Feature: Additional grouping discriminator + Grouping discriminator field is included in electron events + and can be passed between renderer and main processes. + + Scenario: Main process grouping discriminator persists across renderer errors + Given I launch an app with configuration: + | bugsnag | default | + When I click "main-process-set-grouping-discriminator" + And I click "renderer-notify" + Then the total requests received by the server matches: + | events | 1 | + And the event "groupingDiscriminator" equals "main-process-discriminator" + + Scenario: Renderer process grouping discriminator persists across main errors + Given I launch an app with configuration: + | bugsnag | default | + When I click "renderer-set-grouping-discriminator" + And I click "main-notify" + Then the total requests received by the server matches: + | events | 1 | + And the event "groupingDiscriminator" equals "renderer-process-discriminator" diff --git a/test/electron/features/support/steps/request-steps.js b/test/electron/features/support/steps/request-steps.js index c35ea8166e..49db7cd3cb 100644 --- a/test/electron/features/support/steps/request-steps.js +++ b/test/electron/features/support/steps/request-steps.js @@ -252,3 +252,11 @@ Then('the event has no feature flags', async () => { expect(payloads[0].events).toHaveLength(1) expect(payloads[0].events[0]).toHaveProperty('featureFlags', []) }) + +Then('the event {string} equals {string}', async (field, expected) => { + const payloads = readPayloads(global.server.uploadsForType('event')) + + expect(payloads).toHaveLength(1) + expect(payloads[0].events).toHaveLength(1) + expect(payloads[0].events[0]).toHaveProperty(field, expected) +}) diff --git a/test/electron/fixtures/app/src/index.html b/test/electron/fixtures/app/src/index.html index 2f3e196380..b522b5293f 100644 --- a/test/electron/fixtures/app/src/index.html +++ b/test/electron/fixtures/app/src/index.html @@ -69,5 +69,9 @@

Actions

  • Make a failed GET request
  • Trigger a network request error
  • + diff --git a/test/electron/fixtures/app/src/main.js b/test/electron/fixtures/app/src/main.js index d7fb23b3ad..6669d4811a 100644 --- a/test/electron/fixtures/app/src/main.js +++ b/test/electron/fixtures/app/src/main.js @@ -148,3 +148,7 @@ ipcMain.on('main-process-get-request', (_event, fail) => { ipcMain.on('main-process-request-error', () => { networkRequestError() }) + +ipcMain.on('main-process-set-grouping-discriminator', (_event, discriminator) => { + Bugsnag.setGroupingDiscriminator(discriminator) +}) diff --git a/test/electron/fixtures/app/src/preload.js b/test/electron/fixtures/app/src/preload.js index fdb79653b5..54f788c07b 100644 --- a/test/electron/fixtures/app/src/preload.js +++ b/test/electron/fixtures/app/src/preload.js @@ -48,5 +48,8 @@ contextBridge.exposeInMainWorld('RunnerAPI', { mainProcessRequestError: () => { ipcRenderer.send('main-process-request-error') }, + mainProcessSetGroupingDiscriminator: (discriminator) => { + ipcRenderer.send('main-process-set-grouping-discriminator', discriminator) + }, preloadStart: Date.now() }) diff --git a/test/electron/fixtures/app/src/renderer.js b/test/electron/fixtures/app/src/renderer.js index 7394fe253e..6b0cfd7a0c 100644 --- a/test/electron/fixtures/app/src/renderer.js +++ b/test/electron/fixtures/app/src/renderer.js @@ -95,3 +95,11 @@ document.getElementById('renderer-clear-context').onclick = () => { document.getElementById('renderer-clear-metadata').onclick = () => { Bugsnag.clearMetadata('renderer') } + +document.getElementById('main-process-set-grouping-discriminator').onclick = () => { + window.RunnerAPI.mainProcessSetGroupingDiscriminator('main-process-discriminator') +} + +document.getElementById('renderer-set-grouping-discriminator').onclick = () => { + Bugsnag.setGroupingDiscriminator('renderer-process-discriminator') +} From a3a3873e707a40f944aa5b84466a6c9c43db2a57 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Wed, 17 Sep 2025 09:34:07 +0100 Subject: [PATCH 08/38] add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7eaf800579..ba354b53d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Add additional grouping discriminator property to events [#2544](https://github.com/bugsnag/bugsnag-js/pull/2544) - (react-native) Handle additional grouping discriminator [#2557](https://github.com/bugsnag/bugsnag-js/pull/2557) +- (electron) Handle additional grouping discriminator [#2561](https://github.com/bugsnag/bugsnag-js/pull/2561) ### Changed From 9a728a79cbd29c53be52d827171906880b1f5268 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Wed, 17 Sep 2025 16:15:16 +0100 Subject: [PATCH 09/38] ensure grouping discriminator is handled across electron packages --- .../client-state-manager.js | 5 +- .../test/client-state-manager.test.ts | 54 ++++++++++++++++++- .../client-state-persistence.js | 8 +++ .../src/api.c | 33 ++++++++++++ ...ugsnag_electron_client_state_persistence.c | 19 +++++++ ...ugsnag_electron_client_state_persistence.h | 7 +++ .../deliver-minidumps.js | 1 + .../event-serialisation.js | 5 ++ .../plugin-electron-ipc/bugsnag-ipc-main.js | 7 ++- .../bugsnag-ipc-renderer.js | 8 +++ .../test/bugsnag-ipc-main.test.ts | 19 +++++++ .../test/bugsnag-ipc-renderer.test.ts | 10 ++++ .../client-state-updates.js | 5 ++ .../renderer-event-data.js | 2 + .../test/renderer-event-data.test.ts | 16 +++++- .../features/grouping-discriminator.feature | 18 +++++++ 16 files changed, 210 insertions(+), 7 deletions(-) diff --git a/packages/plugin-electron-client-state-manager/client-state-manager.js b/packages/plugin-electron-client-state-manager/client-state-manager.js index c46bc7e53c..fe8f0077bb 100644 --- a/packages/plugin-electron-client-state-manager/client-state-manager.js +++ b/packages/plugin-electron-client-state-manager/client-state-manager.js @@ -80,13 +80,16 @@ module.exports = { } // handle a bulk update of initial values from a new renderer - const bulkUpdate = ({ user, context, metadata, features }) => { + const bulkUpdate = ({ user, context, metadata, features, groupingDiscriminator }) => { if (user) { client.setUser(user.id, user.email, user.name) } if (context) { client.setContext(context) } + if (groupingDiscriminator) { + client.setGroupingDiscriminator(groupingDiscriminator) + } if (metadata) { for (const section in metadata) { origAddMetadata.call(client, section, metadata[section]) 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 46579f75ef..9cd6c1cbd4 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 @@ -147,11 +147,13 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { const featuresCb = jest.fn() const contextCb = jest.fn() const userCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() emitter.on('FeatureFlagUpdate', featuresCb) emitter.on('MetadataReplace', metadataCb) emitter.on('ContextUpdate', contextCb) emitter.on('UserUpdate', userCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) // update everything bulkUpdate({ @@ -165,7 +167,8 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { features: [ { name: 'flag name 1', variant: 'variant name 1' }, { name: 'flag name 2', variant: 'variant name 2' } - ] + ], + groupingDiscriminator: 'discriminator' }) expect(featuresCb).toHaveBeenCalledWith([ @@ -176,6 +179,7 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { expect(metadataCb).toHaveBeenCalledWith({ section: { key: 'value' } }) expect(contextCb).toHaveBeenCalledWith('ctx') expect(userCb).toHaveBeenCalledWith({ id: '123', name: 'Jim', email: 'jim@jim.com' }) + expect(groupingDiscriminatorCb).toHaveBeenCalledWith('discriminator') }) it('should support bulk updates (only context)', () => { @@ -185,10 +189,14 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { const metadataCb = jest.fn() const contextCb = jest.fn() const userCb = jest.fn() + const featuresCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() emitter.on('MetadataReplace', metadataCb) emitter.on('ContextUpdate', contextCb) emitter.on('UserUpdate', userCb) + emitter.on('FeatureFlagUpdate', featuresCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) // update just context bulkUpdate({ @@ -198,6 +206,8 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { expect(metadataCb).not.toHaveBeenCalled() expect(contextCb).toHaveBeenCalledWith('ctx') expect(userCb).not.toHaveBeenCalled() + expect(featuresCb).not.toHaveBeenCalled() + expect(groupingDiscriminatorCb).not.toHaveBeenCalled() }) it('should support bulk updates (only user)', () => { @@ -207,10 +217,14 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { const metadataCb = jest.fn() const contextCb = jest.fn() const userCb = jest.fn() + const featuresCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() emitter.on('MetadataReplace', metadataCb) emitter.on('ContextUpdate', contextCb) emitter.on('UserUpdate', userCb) + emitter.on('FeatureFlagUpdate', featuresCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) // update just user bulkUpdate({ @@ -220,6 +234,8 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { expect(metadataCb).not.toHaveBeenCalled() expect(contextCb).not.toHaveBeenCalledWith() expect(userCb).toHaveBeenCalledWith({ id: '123', name: 'Jim', email: 'jim@jim.com' }) + expect(featuresCb).not.toHaveBeenCalledWith() + expect(groupingDiscriminatorCb).not.toHaveBeenCalledWith() }) it('should support bulk updates (only metadata)', () => { @@ -229,11 +245,15 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { const metadataCb = jest.fn() const contextCb = jest.fn() const userCb = jest.fn() + const featuresCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() emitter.on('MetadataReplace', metadataCb) emitter.on('ContextUpdate', contextCb) emitter.on('UserUpdate', userCb) - + emitter.on('FeatureFlagUpdate', featuresCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) + // update just metadata bulkUpdate({ metadata: { @@ -244,5 +264,35 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { expect(metadataCb).toHaveBeenCalledWith({ section: { key: 'value' } }) expect(contextCb).not.toHaveBeenCalled() expect(userCb).not.toHaveBeenCalled() + expect(featuresCb).not.toHaveBeenCalledWith() + expect(groupingDiscriminatorCb).not.toHaveBeenCalledWith() + }) + + it('should support bulk updates (only grouping discriminator)', () => { + const client = new Client({ apiKey: '123' }, {}, [stateManager], Notifier) + const { emitter, bulkUpdate } = client.getPlugin('clientStateManager') + + const metadataCb = jest.fn() + const featuresCb = jest.fn() + const contextCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() + const userCb = jest.fn() + + emitter.on('MetadataReplace', metadataCb) + emitter.on('ContextUpdate', contextCb) + emitter.on('UserUpdate', userCb) + emitter.on('FeatureFlagUpdate', featuresCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) + + // update just context + bulkUpdate({ + groupingDiscriminator: 'discriminator' + }) + + expect(metadataCb).not.toHaveBeenCalled() + expect(contextCb).not.toHaveBeenCalled() + expect(userCb).not.toHaveBeenCalled() + expect(featuresCb).not.toHaveBeenCalled() + expect(groupingDiscriminatorCb).toHaveBeenCalledWith('discriminator') }) }) diff --git a/packages/plugin-electron-client-state-persistence/client-state-persistence.js b/packages/plugin-electron-client-state-persistence/client-state-persistence.js index 42186b4a59..f0ee0c3966 100644 --- a/packages/plugin-electron-client-state-persistence/client-state-persistence.js +++ b/packages/plugin-electron-client-state-persistence/client-state-persistence.js @@ -36,6 +36,14 @@ module.exports = { } }) + clientStateManager.emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminator => { + try { + NativeClient.updateGroupingDiscriminator(groupingDiscriminator) + } catch (e) { + client._logger.error(e) + } + }) + clientStateManager.emitter.on('MetadataUpdate', ({ section, values }) => { try { NativeClient.updateMetadata(section, values) diff --git a/packages/plugin-electron-client-state-persistence/src/api.c b/packages/plugin-electron-client-state-persistence/src/api.c index c6b4299b81..5d6f1fbe72 100644 --- a/packages/plugin-electron-client-state-persistence/src/api.c +++ b/packages/plugin-electron-client-state-persistence/src/api.c @@ -233,6 +233,35 @@ static napi_value UpdateContext(napi_env env, napi_callback_info info) { return NULL; } +static napi_value UpdateGroupingDiscriminator(napi_env env, napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + napi_status status = napi_get_cb_info(env, info, &argc, args, NULL, NULL); + assert(status == napi_ok); + + if (argc < 1) { + napi_throw_type_error(env, NULL, "Wrong number of arguments, expected 1"); + return NULL; + } + + napi_valuetype valuetype0; + status = napi_typeof(env, args[0], &valuetype0); + assert(status == napi_ok); + + if (valuetype0 == napi_string) { + char *grouping_discriminator = read_string_value(env, args[0], false); + throw_error_from_status(env, becsp_set_grouping_discriminator(grouping_discriminator)); + free(grouping_discriminator); + } else if (valuetype0 == napi_null) { + becsp_set_grouping_discriminator(NULL); + } else { + napi_throw_type_error(env, NULL, + "Wrong argument type, expected string or null"); + } + + return NULL; +} + static napi_value UpdateUser(napi_env env, napi_callback_info info) { size_t argc = 3; napi_value args[3]; @@ -475,6 +504,10 @@ napi_value Init(napi_env env, napi_value exports) { status = napi_define_properties(env, exports, 1, &desc); assert(status == napi_ok); + desc = DECLARE_NAPI_METHOD("updateGroupingDiscriminator", UpdateGroupingDiscriminator); + status = napi_define_properties(env, exports, 1, &desc); + assert(status == napi_ok); + desc = DECLARE_NAPI_METHOD("updateUser", UpdateUser); status = napi_define_properties(env, exports, 1, &desc); assert(status == napi_ok); diff --git a/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.c b/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.c index f489ae9655..f286365d33 100644 --- a/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.c +++ b/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.c @@ -43,6 +43,7 @@ static const char *const key_app = "app"; static const char *const key_breadcrumbs = "breadcrumbs"; static const char *const key_context = "context"; static const char *const key_device = "device"; +static const char *const key_grouping_discriminator = "groupingDiscriminator"; static const char *const key_metadata = "metadata"; static const char *const key_feature_flags = "featureFlags"; static const char *const key_session = "session"; @@ -220,6 +221,24 @@ BECSP_STATUS becsp_set_context(const char *context) { return BECSP_STATUS_SUCCESS; } +BECSP_STATUS becsp_set_grouping_discriminator(const char *grouping_discriminator) { + if (!g_context.data) { + return BECSP_STATUS_NOT_INSTALLED; + } + context_lock(); + + JSON_Object *obj = json_value_get_object(g_context.data); + if (grouping_discriminator) { + json_object_set_string(obj, key_grouping_discriminator, grouping_discriminator); + } else { + json_object_remove(obj, key_grouping_discriminator); + } + + serialize_data(); + context_unlock(); + return BECSP_STATUS_SUCCESS; +} + BECSP_STATUS becsp_set_metadata(const char *values) { if (!g_context.data) { return BECSP_STATUS_NOT_INSTALLED; diff --git a/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.h b/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.h index f4b49be445..7019c3dd57 100644 --- a/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.h +++ b/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.h @@ -68,6 +68,13 @@ BECSP_STATUS becsp_add_breadcrumb(const char *val); */ BECSP_STATUS becsp_set_context(const char *context); +/** + * Set the grouping discriminator + * + * @param grouping_discriminator the new grouping discriminator value or NULL to unset + */ +BECSP_STATUS becsp_set_grouping_discriminator(const char *grouping_discriminator); + /** * Set event user * diff --git a/packages/plugin-electron-deliver-minidumps/deliver-minidumps.js b/packages/plugin-electron-deliver-minidumps/deliver-minidumps.js index d58d224408..d8aea81739 100644 --- a/packages/plugin-electron-deliver-minidumps/deliver-minidumps.js +++ b/packages/plugin-electron-deliver-minidumps/deliver-minidumps.js @@ -94,6 +94,7 @@ const takeEventSnapshot = (client) => ({ app: { ...client._app }, breadcrumbs: client._breadcrumbs.slice(), context: client._context, + groupingDiscriminator: client._groupingDiscriminator, device: { ...client._device }, metadata: { ...client._metadata }, featureFlags: featureFlagDelegate.toEventApi(client._features), diff --git a/packages/plugin-electron-deliver-minidumps/event-serialisation.js b/packages/plugin-electron-deliver-minidumps/event-serialisation.js index 15c997a867..59f38286be 100644 --- a/packages/plugin-electron-deliver-minidumps/event-serialisation.js +++ b/packages/plugin-electron-deliver-minidumps/event-serialisation.js @@ -9,6 +9,7 @@ const supportedProperties = [ 'device', 'featureFlags', 'groupingHash', + 'groupingDiscriminator', 'metaData', 'request', 'session', @@ -98,6 +99,10 @@ function deserialiseEvent (json, minidumpPath) { event.context = json.context } + if (hasValueForProperty(json, 'groupingDiscriminator')) { + event.groupingDiscriminator = json.groupingDiscriminator + } + if (hasValueForProperty(json, 'device')) { event.device = json.device } diff --git a/packages/plugin-electron-ipc/bugsnag-ipc-main.js b/packages/plugin-electron-ipc/bugsnag-ipc-main.js index a6b145ed2e..8d8a01a9e9 100644 --- a/packages/plugin-electron-ipc/bugsnag-ipc-main.js +++ b/packages/plugin-electron-ipc/bugsnag-ipc-main.js @@ -103,6 +103,7 @@ module.exports = class BugsnagIpcMain { type: this.client._config.appType } event.context = event.context || this.client._context + event.groupingDiscriminator = event.groupingDiscriminator || this.client._groupingDiscriminator event._metadata = { ...event._metadata, ...this.client._metadata } featureFlagDelegate.merge(event._features, this.client._features, event._featuresIndex) event._user = { ...event._user, ...this.client._user } @@ -115,8 +116,8 @@ module.exports = class BugsnagIpcMain { if (!shouldSend) return resolve({ shouldSend: false }) // extract just the properties we want from the event - const { app, breadcrumbs, context, device, _metadata, _features, _user } = event - resolve({ app, breadcrumbs, context, device, metadata: _metadata, features: _features, user: _user }) + const { app, breadcrumbs, context, device, _metadata, _features, _user, groupingDiscriminator } = event + resolve({ app, breadcrumbs, context, device, metadata: _metadata, features: _features, user: _user, groupingDiscriminator }) }) }) } @@ -159,6 +160,8 @@ module.exports = class BugsnagIpcMain { ['update', this.update.bind(this)], ['getContext', this.client.getContext.bind(this.client)], ['setContext', this.client.setContext.bind(this.client)], + ['getGroupingDiscriminator', this.client.getGroupingDiscriminator.bind(this.client)], + ['setGroupingDiscriminator', this.client.setGroupingDiscriminator.bind(this.client)], ['addMetadata', this.client.addMetadata.bind(this.client)], ['clearMetadata', this.client.clearMetadata.bind(this.client)], ['getMetadata', this.client.getMetadata.bind(this.client)], diff --git a/packages/plugin-electron-ipc/bugsnag-ipc-renderer.js b/packages/plugin-electron-ipc/bugsnag-ipc-renderer.js index febc07885f..b2d112293d 100644 --- a/packages/plugin-electron-ipc/bugsnag-ipc-renderer.js +++ b/packages/plugin-electron-ipc/bugsnag-ipc-renderer.js @@ -25,6 +25,14 @@ const BugsnagIpcRenderer = { return safeInvoke(false, 'setContext', context) }, + getGroupingDiscriminator () { + return safeInvoke(true, 'getGroupingDiscriminator') + }, + + setGroupingDiscriminator (groupingDiscriminator) { + return safeInvoke(false, 'setGroupingDiscriminator', groupingDiscriminator) + }, + addMetadata (...args) { return safeInvoke(false, 'addMetadata', ...args) }, 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 df49c5de3f..4abba5aa06 100644 --- a/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts +++ b/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts @@ -52,6 +52,23 @@ describe('BugsnagIpcMain', () => { expect(event.returnValue).toEqual('today') }) + it('works for updating grouping discriminator', () => { + const client = new Client({ apiKey: '123' }, {}, [mockClientStateManagerPlugin], Notifier) + client.setGroupingDiscriminator = jest.fn() + const bugsnagIpcMain = new BugsnagIpcMain(client) + bugsnagIpcMain.handle({}, 'setGroupingDiscriminator', JSON.stringify('grouping-discriminator')) + expect(client.setGroupingDiscriminator).toHaveBeenCalledWith('grouping-discriminator') + }) + + it('returns the current grouping discriminator', () => { + const client = new Client({ apiKey: '123' }, {}, [mockClientStateManagerPlugin], Notifier) + client.setGroupingDiscriminator('current-grouping-discriminator') + const bugsnagIpcMain = new BugsnagIpcMain(client) + const event = { returnValue: undefined } + bugsnagIpcMain.handleSync(event, 'getGroupingDiscriminator') + expect(event.returnValue).toEqual('current-grouping-discriminator') + }) + it('works for updating user', () => { const client = new Client({ apiKey: '123' }, {}, [mockClientStateManagerPlugin], Notifier) client.setUser = jest.fn() @@ -272,6 +289,7 @@ describe('BugsnagIpcMain', () => { client.leaveBreadcrumb('hi') client.setContext('ctx') + client.setGroupingDiscriminator('grouping-discriminator') client.setUser('123', 'jim@jim.com', 'Jim') client.addFeatureFlags([ { name: 'flag1' }, @@ -297,6 +315,7 @@ describe('BugsnagIpcMain', () => { }, breadcrumbs: client._breadcrumbs, context: 'ctx', + groupingDiscriminator: 'grouping-discriminator', device: { id: '123' }, metadata: { app: { testingMode: 'unit' }, diff --git a/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts b/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts index 4d17ce68dd..6cbb8043f2 100644 --- a/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts +++ b/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts @@ -36,6 +36,16 @@ describe('BugsnagIpcRenderer', () => { expect(electron.ipcRenderer.invoke).toHaveBeenCalledWith(CHANNEL_RENDERER_TO_MAIN, 'setContext', JSON.stringify('ctx')) }) + it('should call ipcRenderer correctly for getGroupingDiscriminator', () => { + BugsnagIpcRenderer.getGroupingDiscriminator() + expect(electron.ipcRenderer.sendSync).toHaveBeenCalledWith(CHANNEL_RENDERER_TO_MAIN_SYNC, 'getGroupingDiscriminator') + }) + + it('should call ipcRenderer correctly for setGroupingDiscriminator', async () => { + await BugsnagIpcRenderer.setGroupingDiscriminator('ctx') + expect(electron.ipcRenderer.invoke).toHaveBeenCalledWith(CHANNEL_RENDERER_TO_MAIN, 'setGroupingDiscriminator', JSON.stringify('ctx')) + }) + it('should call ipcRenderer correctly for getUser', () => { BugsnagIpcRenderer.getUser() expect(electron.ipcRenderer.sendSync).toHaveBeenCalledWith( diff --git a/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js b/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js index 50bf82c850..9361b79a55 100644 --- a/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js +++ b/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js @@ -42,9 +42,13 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ const updates = { metadata: client._metadata, features: client._features } const user = client.getUser() const context = client.getContext() + const groupingDiscriminator = client.getGroupingDiscriminator() if (context && context.length > 0) { updates.context = context } + if (groupingDiscriminator) { + updates.groupingDiscriminator = groupingDiscriminator + } if (Object.keys(user).length > 0) { updates.user = user } @@ -58,6 +62,7 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ client._featuresIndex = {} client._features = [] client._context = undefined + client._groupingDiscriminator = undefined client._user = {} // use main process state once configured properties are synched diff --git a/packages/plugin-electron-renderer-event-data/renderer-event-data.js b/packages/plugin-electron-renderer-event-data/renderer-event-data.js index 2ba001f5d7..2ec0ac5398 100644 --- a/packages/plugin-electron-renderer-event-data/renderer-event-data.js +++ b/packages/plugin-electron-renderer-event-data/renderer-event-data.js @@ -8,6 +8,7 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ app, breadcrumbs, context, + groupingDiscriminator, device, metadata, features, @@ -18,6 +19,7 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ if (shouldSend === false) return false event.context = event.context || context || getDefaultContext() + event._groupingDiscriminator = event._groupingDiscriminator || groupingDiscriminator event.breadcrumbs = breadcrumbs event.app = { ...event.app, ...app, codeBundleId: client._config.codeBundleId } event.device = { ...event.device, ...device } diff --git a/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts b/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts index 723a39646c..17ee8fbec7 100644 --- a/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts +++ b/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts @@ -13,7 +13,7 @@ describe('plugin: electron renderer event data', () => { expect(onError).not.toHaveBeenCalled() }) - it('sets context, breadcrumbs, app, device, user, feature flags and metadata from the main process', async () => { + it('sets context, groupingDiscriminator, breadcrumbs, app, device, user, feature flags and metadata from the main process', async () => { const context = 'abc context xyz' const breadcrumbs = [new Breadcrumb('message', { metadata: true }, 'manual')] const app = { abc: 123 } @@ -21,8 +21,9 @@ describe('plugin: electron renderer event data', () => { const user = { id: '10293847' } const features = [{ name: 'flag1', variant: 'variant1' }] const metadata = { meta: { data: true } } + const groupingDiscriminator = 'test-discriminator' - const { sendEvent } = makeClient({ context, breadcrumbs, app, device, user, features, metadata }) + const { sendEvent } = makeClient({ context, breadcrumbs, app, device, user, features, metadata, groupingDiscriminator }) const event = await sendEvent() @@ -33,6 +34,7 @@ describe('plugin: electron renderer event data', () => { expect(event.getUser()).toStrictEqual(user) expect(event._features).toStrictEqual(features) expect(event.getMetadata('meta')).toStrictEqual(metadata.meta) + expect(event.getGroupingDiscriminator()).toStrictEqual(groupingDiscriminator) }) it('prefers pre-existing context from the event', async () => { @@ -45,6 +47,16 @@ describe('plugin: electron renderer event data', () => { expect(event.context).toBe('hello') }) + it('prefers pre-existing groupingDiscriminator from the event', async () => { + const { client, sendEvent } = makeClient({ groupingDiscriminator: 'goodbye' }) + + client.addOnError(event => { event.setGroupingDiscriminator('hello') }, true) + + const event = await sendEvent() + + expect(event.getGroupingDiscriminator()).toBe('hello') + }) + it('prefers pre-existing user from the event', async () => { const { client, sendEvent } = makeClient({ user: { id: 123 } }) diff --git a/test/electron/features/grouping-discriminator.feature b/test/electron/features/grouping-discriminator.feature index 9fff619e2b..2415f038b0 100644 --- a/test/electron/features/grouping-discriminator.feature +++ b/test/electron/features/grouping-discriminator.feature @@ -2,6 +2,24 @@ Feature: Additional grouping discriminator Grouping discriminator field is included in electron events and can be passed between renderer and main processes. + Scenario: Main process grouping discriminator is sent with main errors + Given I launch an app with configuration: + | bugsnag | default | + When I click "main-process-set-grouping-discriminator" + And I click "main-notify" + Then the total requests received by the server matches: + | events | 1 | + And the event "groupingDiscriminator" equals "main-process-discriminator" + + Scenario: Renderer process grouping discriminator is sent with renderer errors + Given I launch an app with configuration: + | bugsnag | default | + When I click "renderer-set-grouping-discriminator" + And I click "renderer-notify" + Then the total requests received by the server matches: + | events | 1 | + And the event "groupingDiscriminator" equals "renderer-process-discriminator" + Scenario: Main process grouping discriminator persists across renderer errors Given I launch an app with configuration: | bugsnag | default | From 8f645bd8f4cf9bbc3b892acb4d13dd9177a837a6 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Wed, 17 Sep 2025 16:46:45 +0100 Subject: [PATCH 10/38] fix linting issues --- .../test/client-state-manager.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 9cd6c1cbd4..eb78b5530f 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 @@ -253,7 +253,7 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { emitter.on('UserUpdate', userCb) emitter.on('FeatureFlagUpdate', featuresCb) emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) - + // update just metadata bulkUpdate({ metadata: { @@ -268,7 +268,7 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { expect(groupingDiscriminatorCb).not.toHaveBeenCalledWith() }) - it('should support bulk updates (only grouping discriminator)', () => { + it('should support bulk updates (only grouping discriminator)', () => { const client = new Client({ apiKey: '123' }, {}, [stateManager], Notifier) const { emitter, bulkUpdate } = client.getPlugin('clientStateManager') From 42d67e2fa8168d54d704213787e1532933e943ef Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Wed, 17 Sep 2025 16:49:46 +0100 Subject: [PATCH 11/38] Update packages/plugin-electron-client-state-manager/test/client-state-manager.test.ts fix comment in test file Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../test/client-state-manager.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 eb78b5530f..7d7c40794b 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 @@ -284,7 +284,7 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { emitter.on('FeatureFlagUpdate', featuresCb) emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) - // update just context + // update just grouping discriminator bulkUpdate({ groupingDiscriminator: 'discriminator' }) From 9881049863381e0c3eb3405f4f24c06cd1cbb6ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 03:14:45 +0000 Subject: [PATCH 12/38] build(deps): bump ruby/setup-ruby from 1.257.0 to 1.262.0 Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.257.0 to 1.262.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb) - [Commits](https://github.com/ruby/setup-ruby/compare/44511735964dcb71245e7e55f72539531f7bc0eb...cf7216d52fba1017929b4d7162fabe2b30af5b49) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-version: 1.262.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/aws-lambda.yml | 2 +- .github/workflows/update-dependencies.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/aws-lambda.yml b/.github/workflows/aws-lambda.yml index d15a168d1b..56a9d990b0 100644 --- a/.github/workflows/aws-lambda.yml +++ b/.github/workflows/aws-lambda.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 - name: Install Ruby - uses: ruby/setup-ruby@44511735964dcb71245e7e55f72539531f7bc0eb + uses: ruby/setup-ruby@cf7216d52fba1017929b4d7162fabe2b30af5b49 with: ruby-version: '3.1' diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml index c79454e136..d357a6e37a 100644 --- a/.github/workflows/update-dependencies.yml +++ b/.github/workflows/update-dependencies.yml @@ -40,7 +40,7 @@ jobs: - run: git submodule update --init --recursive - name: Install ruby - uses: ruby/setup-ruby@44511735964dcb71245e7e55f72539531f7bc0eb # v1.257.0 + uses: ruby/setup-ruby@cf7216d52fba1017929b4d7162fabe2b30af5b49 # v1.262.0 with: ruby-version: 2.7 From 61553baf6deae433f173766e01c566f7dbc0812b Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Mon, 22 Sep 2025 10:09:56 +0100 Subject: [PATCH 13/38] test: :white_check_mark: refactor strict mode test --- .../fixtures/strict_mode/script/a.html | 33 ------------ .../script/notifier-does-not-error.html | 50 +++++++++++++++++++ test/browser/features/strict_mode.feature | 3 +- 3 files changed, 51 insertions(+), 35 deletions(-) delete mode 100644 test/browser/features/fixtures/strict_mode/script/a.html create mode 100644 test/browser/features/fixtures/strict_mode/script/notifier-does-not-error.html diff --git a/test/browser/features/fixtures/strict_mode/script/a.html b/test/browser/features/fixtures/strict_mode/script/a.html deleted file mode 100644 index df14a60d5e..0000000000 --- a/test/browser/features/fixtures/strict_mode/script/a.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - -
    PENDING
    - - - - - diff --git a/test/browser/features/fixtures/strict_mode/script/notifier-does-not-error.html b/test/browser/features/fixtures/strict_mode/script/notifier-does-not-error.html new file mode 100644 index 0000000000..8a5e2333d3 --- /dev/null +++ b/test/browser/features/fixtures/strict_mode/script/notifier-does-not-error.html @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/test/browser/features/strict_mode.feature b/test/browser/features/strict_mode.feature index 6907eabe8f..e4f63a6643 100644 --- a/test/browser/features/strict_mode.feature +++ b/test/browser/features/strict_mode.feature @@ -2,8 +2,7 @@ Feature: Compatibility with strict mode Scenario: notifier does not error in strict mode - When I navigate to the test URL "/strict_mode/script/a.html" - And the test should run in this browser + When I navigate to the test URL "/strict_mode/script/notifier-does-not-error.html" Then I wait to receive an error And the error is a valid browser payload for the error reporting API And the exception "errorClass" equals "InvalidError" From ae894316fc4215a3b932093608ac5425662be8cb Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Mon, 22 Sep 2025 10:51:07 +0100 Subject: [PATCH 14/38] Fixup pbxproj UUIDs (#2564) * update UUIDs for grouping discriminator scenario * update comment --- .../BugsnagTestInterface.xcodeproj/project.pbxproj | 12 ++++++------ .../features/steps/react-native-steps.rb | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj b/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj index 2b0f5d3fe3..d762a1a2d2 100644 --- a/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj +++ b/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj @@ -9,7 +9,7 @@ /* Begin PBXBuildFile section */ DA2260AC2E58AD79008384E6 /* BugsnagTestInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA2260AB2E58AD79008384E6 /* BugsnagTestInterface.mm */; }; DA2260D42E58AD99008384E6 /* ContextNativeCustomScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260B42E58AD99008384E6 /* ContextNativeCustomScenario.m */; }; - DA2260D42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260B42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m */; }; + DA2260FB2E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3371AC2F69BE8A009495D7 /* GroupingDiscriminatorNativeScenario.m */; }; DA2260D52E58AD99008384E6 /* MetadataNativeUnhandledScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260C02E58AD99008384E6 /* MetadataNativeUnhandledScenario.m */; }; DA2260D62E58AD99008384E6 /* UserNativeClientScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260D32E58AD99008384E6 /* UserNativeClientScenario.m */; }; DA2260D72E58AD99008384E6 /* StartSessionScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260CF2E58AD99008384E6 /* StartSessionScenario.m */; }; @@ -55,8 +55,8 @@ DA2260B22E58AD99008384E6 /* BreadcrumbsNativeManualScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BreadcrumbsNativeManualScenario.m; path = Scenarios/BreadcrumbsNativeManualScenario.m; sourceTree = ""; }; DA2260B32E58AD99008384E6 /* ContextNativeCustomScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ContextNativeCustomScenario.h; path = Scenarios/ContextNativeCustomScenario.h; sourceTree = ""; }; DA2260B42E58AD99008384E6 /* ContextNativeCustomScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ContextNativeCustomScenario.m; path = Scenarios/ContextNativeCustomScenario.m; sourceTree = ""; }; - DA2260B32E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GroupingDiscriminatorNativeScenario.h; path = Scenarios/GroupingDiscriminatorNativeScenario.h; sourceTree = ""; }; - DA2260B42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GroupingDiscriminatorNativeScenario.m; path = Scenarios/GroupingDiscriminatorNativeScenario.m; sourceTree = ""; }; + DA3371AD2F69BE8B009495D8 /* GroupingDiscriminatorNativeScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GroupingDiscriminatorNativeScenario.h; path = Scenarios/GroupingDiscriminatorNativeScenario.h; sourceTree = ""; }; + DA3371AC2F69BE8A009495D7 /* GroupingDiscriminatorNativeScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GroupingDiscriminatorNativeScenario.m; path = Scenarios/GroupingDiscriminatorNativeScenario.m; sourceTree = ""; }; DA2260B52E58AD99008384E6 /* DeviceNativeHandledScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DeviceNativeHandledScenario.h; path = Scenarios/DeviceNativeHandledScenario.h; sourceTree = ""; }; DA2260B62E58AD99008384E6 /* DeviceNativeHandledScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = DeviceNativeHandledScenario.m; path = Scenarios/DeviceNativeHandledScenario.m; sourceTree = ""; }; DA2260B72E58AD99008384E6 /* DeviceNativeUnhandledScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DeviceNativeUnhandledScenario.h; path = Scenarios/DeviceNativeUnhandledScenario.h; sourceTree = ""; }; @@ -112,8 +112,8 @@ DA2260B22E58AD99008384E6 /* BreadcrumbsNativeManualScenario.m */, DA2260B32E58AD99008384E6 /* ContextNativeCustomScenario.h */, DA2260B42E58AD99008384E6 /* ContextNativeCustomScenario.m */, - DA2260B32E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.h */, - DA2260B42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m */, + DA3371AD2F69BE8B009495D8 /* GroupingDiscriminatorNativeScenario.h */, + DA3371AC2F69BE8A009495D7 /* GroupingDiscriminatorNativeScenario.m */, DA2260B52E58AD99008384E6 /* DeviceNativeHandledScenario.h */, DA2260B62E58AD99008384E6 /* DeviceNativeHandledScenario.m */, DA2260B72E58AD99008384E6 /* DeviceNativeUnhandledScenario.h */, @@ -220,7 +220,7 @@ buildActionMask = 2147483647; files = ( DA2260D42E58AD99008384E6 /* ContextNativeCustomScenario.m in Sources */, - DA2260D42E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m in Sources */, + DA2260FB2E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m in Sources */, DA2260D52E58AD99008384E6 /* MetadataNativeUnhandledScenario.m in Sources */, DA2260D62E58AD99008384E6 /* UserNativeClientScenario.m in Sources */, DA2260D72E58AD99008384E6 /* StartSessionScenario.m in Sources */, diff --git a/test/react-native/features/steps/react-native-steps.rb b/test/react-native/features/steps/react-native-steps.rb index 76e75b913b..656bd3ffd4 100644 --- a/test/react-native/features/steps/react-native-steps.rb +++ b/test/react-native/features/steps/react-native-steps.rb @@ -129,7 +129,7 @@ def wait_for_app_state(expected_state) payload_hash end expected_values.each do |expected_data| - # if value is 'nil' then the field should not be present in the payload + # For test data, if the value is the string 'nil', it represents an absent field. expected_data.each do |field_path, expected_value| expected_data[field_path] = nil if expected_value == 'nil' end From be22f70865092f29b927bce0c19b71e38b7226e3 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Wed, 24 Sep 2025 15:06:52 +0100 Subject: [PATCH 15/38] Update version and release date in CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba354b53d9..eca7efdece 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [Unreleased] +## [8.6.0] - 2025-09-25 ### Added From 5c6195e50b7fb03efe4cfd2fa23ba60cc126cf1d Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Thu, 25 Sep 2025 09:23:05 +0000 Subject: [PATCH 16/38] v8.6.0 --- lerna.json | 2 +- package-lock.json | 836 +++++++++--------- packages/browser/package.json | 38 +- packages/core/package.json | 2 +- packages/delivery-electron/package.json | 8 +- packages/delivery-fetch/package.json | 4 +- packages/delivery-node/package.json | 4 +- packages/delivery-react-native/package.json | 4 +- .../delivery-x-domain-request/package.json | 4 +- .../delivery-xml-http-request/package.json | 4 +- packages/electron-network-status/package.json | 6 +- packages/electron-test-helpers/package.json | 4 +- packages/electron/package.json | 60 +- packages/in-flight/package.json | 4 +- packages/js/package.json | 6 +- packages/node/package.json | 30 +- packages/plugin-angular/package.json | 4 +- packages/plugin-app-duration/package.json | 4 +- packages/plugin-aws-lambda/package.json | 8 +- packages/plugin-browser-context/package.json | 4 +- packages/plugin-browser-device/package.json | 4 +- packages/plugin-browser-request/package.json | 4 +- packages/plugin-browser-session/package.json | 4 +- packages/plugin-client-ip/package.json | 4 +- .../plugin-console-breadcrumbs/package.json | 4 +- packages/plugin-contextualize/package.json | 4 +- .../package.json | 6 +- packages/plugin-electron-app/package.json | 6 +- .../package.json | 4 +- .../package.json | 8 +- .../package.json | 6 +- packages/plugin-electron-device/package.json | 6 +- packages/plugin-electron-ipc/package.json | 4 +- .../package.json | 6 +- .../package.json | 4 +- .../package.json | 6 +- .../package.json | 6 +- .../plugin-electron-process-info/package.json | 4 +- .../package.json | 4 +- .../package.json | 8 +- .../package.json | 6 +- .../package.json | 6 +- packages/plugin-electron-session/package.json | 8 +- packages/plugin-express/package.json | 4 +- packages/plugin-hono/package.json | 4 +- .../plugin-inline-script-content/package.json | 4 +- .../package.json | 4 +- packages/plugin-intercept/package.json | 4 +- .../package.json | 4 +- packages/plugin-koa/package.json | 4 +- .../package.json | 4 +- .../plugin-network-breadcrumbs/package.json | 4 +- packages/plugin-node-device/package.json | 4 +- packages/plugin-node-in-project/package.json | 4 +- .../plugin-node-surrounding-code/package.json | 4 +- .../package.json | 4 +- .../package.json | 4 +- .../package.json | 4 +- .../package.json | 4 +- .../package.json | 4 +- .../plugin-react-native-hermes/package.json | 4 +- .../package.json | 4 +- .../package.json | 4 +- .../plugin-react-native-session/package.json | 4 +- .../package.json | 4 +- packages/plugin-react-navigation/package.json | 4 +- packages/plugin-react/package.json | 4 +- packages/plugin-restify/package.json | 4 +- packages/plugin-server-session/package.json | 4 +- packages/plugin-simple-throttle/package.json | 4 +- .../package.json | 4 +- .../plugin-strip-project-root/package.json | 4 +- .../plugin-strip-query-string/package.json | 4 +- packages/plugin-vue/package.json | 4 +- packages/plugin-window-onerror/package.json | 4 +- .../package.json | 4 +- packages/react-native/package.json | 24 +- packages/web-worker/package.json | 16 +- 78 files changed, 665 insertions(+), 665 deletions(-) diff --git a/lerna.json b/lerna.json index daf0f13606..ef91fc39af 100644 --- a/lerna.json +++ b/lerna.json @@ -2,6 +2,6 @@ "packages": [ "packages/*" ], - "version": "8.5.0", + "version": "8.6.0", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 26d53db625..234ffb7ab1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46626,34 +46626,34 @@ }, "packages/browser": { "name": "@bugsnag/browser", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "devDependencies": { - "@bugsnag/delivery-x-domain-request": "^8.4.0", - "@bugsnag/delivery-xml-http-request": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-browser-context": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-request": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-inline-script-content": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-navigation-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-simple-throttle": "^8.4.0", - "@bugsnag/plugin-strip-query-string": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0" + "@bugsnag/delivery-x-domain-request": "^8.6.0", + "@bugsnag/delivery-xml-http-request": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-browser-context": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-request": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-inline-script-content": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-navigation-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-simple-throttle": "^8.6.0", + "@bugsnag/plugin-strip-query-string": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0" } }, "packages/core": { "name": "@bugsnag/core", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/cuid": "^3.0.0", @@ -46665,12 +46665,12 @@ }, "packages/delivery-electron": { "name": "@bugsnag/delivery-electron", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0", @@ -46679,10 +46679,10 @@ }, "packages/delivery-fetch": { "name": "@bugsnag/delivery-fetch", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -46690,10 +46690,10 @@ }, "packages/delivery-node": { "name": "@bugsnag/delivery-node", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -46701,10 +46701,10 @@ }, "packages/delivery-react-native": { "name": "@bugsnag/delivery-react-native", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -46712,10 +46712,10 @@ }, "packages/delivery-x-domain-request": { "name": "@bugsnag/delivery-x-domain-request", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -46723,10 +46723,10 @@ }, "packages/delivery-xml-http-request": { "name": "@bugsnag/delivery-xml-http-request", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -46734,39 +46734,39 @@ }, "packages/electron": { "name": "@bugsnag/electron", - "version": "8.5.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-electron": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-electron": "^8.6.0", "@bugsnag/electron-filestore": "^8.0.0", - "@bugsnag/electron-network-status": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-app": "^8.4.0", - "@bugsnag/plugin-electron-app-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", - "@bugsnag/plugin-electron-client-state-persistence": "^8.4.0", - "@bugsnag/plugin-electron-deliver-minidumps": "^8.5.0", - "@bugsnag/plugin-electron-device": "^8.4.0", - "@bugsnag/plugin-electron-ipc": "^8.5.0", - "@bugsnag/plugin-electron-net-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-preload-error": "^8.4.0", - "@bugsnag/plugin-electron-process-info": "^8.4.0", - "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.4.0", - "@bugsnag/plugin-electron-renderer-event-data": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0", - "@bugsnag/plugin-electron-session": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-internal-callback-marker": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0" + "@bugsnag/electron-network-status": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-app": "^8.6.0", + "@bugsnag/plugin-electron-app-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", + "@bugsnag/plugin-electron-client-state-persistence": "^8.6.0", + "@bugsnag/plugin-electron-deliver-minidumps": "^8.6.0", + "@bugsnag/plugin-electron-device": "^8.6.0", + "@bugsnag/plugin-electron-ipc": "^8.6.0", + "@bugsnag/plugin-electron-net-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-preload-error": "^8.6.0", + "@bugsnag/plugin-electron-process-info": "^8.6.0", + "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.6.0", + "@bugsnag/plugin-electron-renderer-event-data": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0", + "@bugsnag/plugin-electron-session": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-internal-callback-marker": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0" } }, "packages/electron-filestore": { @@ -46776,11 +46776,11 @@ }, "packages/electron-network-status": { "name": "@bugsnag/electron-network-status", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -46788,21 +46788,21 @@ }, "packages/electron-test-helpers": { "name": "@bugsnag/electron-test-helpers", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "packages/in-flight": { "name": "@bugsnag/in-flight", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/cuid": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -46810,11 +46810,11 @@ }, "packages/js": { "name": "@bugsnag/js", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/browser": "^8.4.0", - "@bugsnag/node": "^8.4.0" + "@bugsnag/browser": "^8.6.0", + "@bugsnag/node": "^8.6.0" }, "devDependencies": { "@babel/cli": "^7.0.0" @@ -46822,10 +46822,10 @@ }, "packages/node": { "name": "@bugsnag/node", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "byline": "^5.0.0", "error-stack-parser": "^2.0.3", "iserror": "^0.0.2", @@ -46833,24 +46833,24 @@ "stack-generator": "^2.0.3" }, "devDependencies": { - "@bugsnag/delivery-node": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-contextualize": "^8.4.0", - "@bugsnag/plugin-intercept": "^8.4.0", - "@bugsnag/plugin-node-device": "^8.4.0", - "@bugsnag/plugin-node-in-project": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-server-session": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0" + "@bugsnag/delivery-node": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-contextualize": "^8.6.0", + "@bugsnag/plugin-intercept": "^8.6.0", + "@bugsnag/plugin-node-device": "^8.6.0", + "@bugsnag/plugin-node-in-project": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-server-session": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0" } }, "packages/plugin-angular": { "name": "@bugsnag/plugin-angular", - "version": "8.5.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -46861,7 +46861,7 @@ "@angular/common": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "@angular/core": "^19.0.0", - "@bugsnag/js": "^8.4.0", + "@bugsnag/js": "^8.6.0", "ng-packagr": "^19.1.0", "rxjs": "~7.8.0", "typescript": "~5.6.2", @@ -52891,10 +52891,10 @@ }, "packages/plugin-app-duration": { "name": "@bugsnag/plugin-app-duration", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -52902,14 +52902,14 @@ }, "packages/plugin-aws-lambda": { "name": "@bugsnag/plugin-aws-lambda", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/in-flight": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0" + "@bugsnag/in-flight": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/aws-lambda": "^8.10.76", "@vendia/serverless-express": "^4.10.1", "express": "^4.18.2" @@ -52920,10 +52920,10 @@ }, "packages/plugin-browser-context": { "name": "@bugsnag/plugin-browser-context", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -52931,13 +52931,13 @@ }, "packages/plugin-browser-device": { "name": "@bugsnag/plugin-browser-device", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/cuid": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -52945,10 +52945,10 @@ }, "packages/plugin-browser-request": { "name": "@bugsnag/plugin-browser-request", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -52956,10 +52956,10 @@ }, "packages/plugin-browser-session": { "name": "@bugsnag/plugin-browser-session", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -52967,10 +52967,10 @@ }, "packages/plugin-client-ip": { "name": "@bugsnag/plugin-client-ip", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -52978,10 +52978,10 @@ }, "packages/plugin-console-breadcrumbs": { "name": "@bugsnag/plugin-console-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -52989,10 +52989,10 @@ }, "packages/plugin-contextualize": { "name": "@bugsnag/plugin-contextualize", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53000,14 +53000,14 @@ }, "packages/plugin-electron-app": { "name": "@bugsnag/plugin-electron-app", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "bindings": "^1.5.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53015,14 +53015,14 @@ }, "packages/plugin-electron-app-breadcrumbs": { "name": "@bugsnag/plugin-electron-app-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "lodash.debounce": "^4.0.8" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53030,10 +53030,10 @@ }, "packages/plugin-electron-client-state-manager": { "name": "@bugsnag/plugin-electron-client-state-manager", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53041,15 +53041,15 @@ }, "packages/plugin-electron-client-state-persistence": { "name": "@bugsnag/plugin-electron-client-state-persistence", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "bindings": "^1.5.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", "@types/bindings": "^1.5.0" }, "peerDependencies": { @@ -53058,14 +53058,14 @@ }, "packages/plugin-electron-deliver-minidumps": { "name": "@bugsnag/plugin-electron-deliver-minidumps", - "version": "8.5.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "form-data": "^4.0.4" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0", @@ -53074,11 +53074,11 @@ }, "packages/plugin-electron-device": { "name": "@bugsnag/plugin-electron-device", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53086,13 +53086,13 @@ }, "packages/plugin-electron-ipc": { "name": "@bugsnag/plugin-electron-ipc", - "version": "8.5.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/safe-json-stringify": "^6.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "browserify": "^17.0.0" }, "peerDependencies": { @@ -53188,11 +53188,11 @@ }, "packages/plugin-electron-net-breadcrumbs": { "name": "@bugsnag/plugin-electron-net-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53200,10 +53200,10 @@ }, "packages/plugin-electron-network-status": { "name": "@bugsnag/plugin-electron-network-status", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53211,11 +53211,11 @@ }, "packages/plugin-electron-power-monitor-breadcrumbs": { "name": "@bugsnag/plugin-electron-power-monitor-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53223,11 +53223,11 @@ }, "packages/plugin-electron-preload-error": { "name": "@bugsnag/plugin-electron-preload-error", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53235,10 +53235,10 @@ }, "packages/plugin-electron-process-info": { "name": "@bugsnag/plugin-electron-process-info", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53246,10 +53246,10 @@ }, "packages/plugin-electron-renderer-client-state-updates": { "name": "@bugsnag/plugin-electron-renderer-client-state-updates", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53257,12 +53257,12 @@ }, "packages/plugin-electron-renderer-event-data": { "name": "@bugsnag/plugin-electron-renderer-event-data", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0", @@ -53271,20 +53271,20 @@ }, "packages/plugin-electron-renderer-strip-project-root": { "name": "@bugsnag/plugin-electron-renderer-strip-project-root", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "packages/plugin-electron-screen-breadcrumbs": { "name": "@bugsnag/plugin-electron-screen-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53292,14 +53292,14 @@ }, "packages/plugin-electron-session": { "name": "@bugsnag/plugin-electron-session", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/plugin-browser-session": "^8.4.0" + "@bugsnag/plugin-browser-session": "^8.6.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53307,10 +53307,10 @@ }, "packages/plugin-express": { "name": "@bugsnag/plugin-express", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/express": "4.17.13" }, "peerDependencies": { @@ -53319,10 +53319,10 @@ }, "packages/plugin-hono": { "name": "@bugsnag/plugin-hono", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "hono": "^4.6.3", "typescript": "^5.2.2" }, @@ -53346,10 +53346,10 @@ }, "packages/plugin-inline-script-content": { "name": "@bugsnag/plugin-inline-script-content", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53357,10 +53357,10 @@ }, "packages/plugin-interaction-breadcrumbs": { "name": "@bugsnag/plugin-interaction-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53368,10 +53368,10 @@ }, "packages/plugin-intercept": { "name": "@bugsnag/plugin-intercept", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53379,10 +53379,10 @@ }, "packages/plugin-internal-callback-marker": { "name": "@bugsnag/plugin-internal-callback-marker", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53390,10 +53390,10 @@ }, "packages/plugin-koa": { "name": "@bugsnag/plugin-koa", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/koa": "2.13.4" }, "peerDependencies": { @@ -53402,10 +53402,10 @@ }, "packages/plugin-navigation-breadcrumbs": { "name": "@bugsnag/plugin-navigation-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53413,10 +53413,10 @@ }, "packages/plugin-network-breadcrumbs": { "name": "@bugsnag/plugin-network-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53424,10 +53424,10 @@ }, "packages/plugin-node-device": { "name": "@bugsnag/plugin-node-device", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53435,10 +53435,10 @@ }, "packages/plugin-node-in-project": { "name": "@bugsnag/plugin-node-in-project", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53446,14 +53446,14 @@ }, "packages/plugin-node-surrounding-code": { "name": "@bugsnag/plugin-node-surrounding-code", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "byline": "^5.0.0", "pump": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53461,10 +53461,10 @@ }, "packages/plugin-node-uncaught-exception": { "name": "@bugsnag/plugin-node-uncaught-exception", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53472,10 +53472,10 @@ }, "packages/plugin-node-unhandled-rejection": { "name": "@bugsnag/plugin-node-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53483,10 +53483,10 @@ }, "packages/plugin-react": { "name": "@bugsnag/plugin-react", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53499,10 +53499,10 @@ }, "packages/plugin-react-native-client-sync": { "name": "@bugsnag/plugin-react-native-client-sync", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53510,10 +53510,10 @@ }, "packages/plugin-react-native-event-sync": { "name": "@bugsnag/plugin-react-native-event-sync", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53521,10 +53521,10 @@ }, "packages/plugin-react-native-global-error-handler": { "name": "@bugsnag/plugin-react-native-global-error-handler", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53532,10 +53532,10 @@ }, "packages/plugin-react-native-hermes": { "name": "@bugsnag/plugin-react-native-hermes", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53543,10 +53543,10 @@ }, "packages/plugin-react-native-navigation": { "name": "@bugsnag/plugin-react-native-navigation", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "react-native-navigation": "^7.0.0" }, "peerDependencies": { @@ -53561,10 +53561,10 @@ }, "packages/plugin-react-native-orientation-breadcrumbs": { "name": "@bugsnag/plugin-react-native-orientation-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53572,10 +53572,10 @@ }, "packages/plugin-react-native-session": { "name": "@bugsnag/plugin-react-native-session", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53583,10 +53583,10 @@ }, "packages/plugin-react-native-unhandled-rejection": { "name": "@bugsnag/plugin-react-native-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "promise": "^8.0.2" }, "peerDependencies": { @@ -53595,10 +53595,10 @@ }, "packages/plugin-react-navigation": { "name": "@bugsnag/plugin-react-navigation", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@react-navigation/native": "^5.7.3", "@types/react": "^16.9.49", "@types/react-test-renderer": "^16.9.3", @@ -53617,10 +53617,10 @@ }, "packages/plugin-restify": { "name": "@bugsnag/plugin-restify", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/restify": "^8.4.2" }, "peerDependencies": { @@ -53629,13 +53629,13 @@ }, "packages/plugin-server-session": { "name": "@bugsnag/plugin-server-session", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "backo": "^1.1.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53643,10 +53643,10 @@ }, "packages/plugin-simple-throttle": { "name": "@bugsnag/plugin-simple-throttle", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53654,10 +53654,10 @@ }, "packages/plugin-stackframe-path-normaliser": { "name": "@bugsnag/plugin-stackframe-path-normaliser", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53665,10 +53665,10 @@ }, "packages/plugin-strip-project-root": { "name": "@bugsnag/plugin-strip-project-root", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53676,10 +53676,10 @@ }, "packages/plugin-strip-query-string": { "name": "@bugsnag/plugin-strip-query-string", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53687,10 +53687,10 @@ }, "packages/plugin-vue": { "name": "@bugsnag/plugin-vue", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53703,10 +53703,10 @@ }, "packages/plugin-window-onerror": { "name": "@bugsnag/plugin-window-onerror", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53714,10 +53714,10 @@ }, "packages/plugin-window-unhandled-rejection": { "name": "@bugsnag/plugin-window-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -53725,20 +53725,20 @@ }, "packages/react-native": { "name": "@bugsnag/react-native", - "version": "8.4.0", - "license": "MIT", - "dependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-react-native": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-react": "^8.4.0", - "@bugsnag/plugin-react-native-client-sync": "^8.4.0", - "@bugsnag/plugin-react-native-event-sync": "^8.4.0", - "@bugsnag/plugin-react-native-global-error-handler": "^8.4.0", - "@bugsnag/plugin-react-native-hermes": "^8.4.0", - "@bugsnag/plugin-react-native-session": "^8.4.0", - "@bugsnag/plugin-react-native-unhandled-rejection": "^8.4.0", + "version": "8.6.0", + "license": "MIT", + "dependencies": { + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-react-native": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-react": "^8.6.0", + "@bugsnag/plugin-react-native-client-sync": "^8.6.0", + "@bugsnag/plugin-react-native-event-sync": "^8.6.0", + "@bugsnag/plugin-react-native-global-error-handler": "^8.6.0", + "@bugsnag/plugin-react-native-hermes": "^8.6.0", + "@bugsnag/plugin-react-native-session": "^8.6.0", + "@bugsnag/plugin-react-native-unhandled-rejection": "^8.6.0", "iserror": "^0.0.2" }, "devDependencies": { @@ -53820,16 +53820,16 @@ }, "packages/web-worker": { "name": "@bugsnag/web-worker", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-fetch": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-fetch": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0", "ts-loader": "^9.4.1", "typescript": "^4.9.3", "webpack": "^5.75.0", @@ -55594,24 +55594,24 @@ "@bugsnag/browser": { "version": "file:packages/browser", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-x-domain-request": "^8.4.0", - "@bugsnag/delivery-xml-http-request": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-browser-context": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-request": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-inline-script-content": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-navigation-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-simple-throttle": "^8.4.0", - "@bugsnag/plugin-strip-query-string": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-x-domain-request": "^8.6.0", + "@bugsnag/delivery-xml-http-request": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-browser-context": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-request": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-inline-script-content": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-navigation-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-simple-throttle": "^8.6.0", + "@bugsnag/plugin-strip-query-string": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0" } }, "@bugsnag/core": { @@ -55632,74 +55632,74 @@ "@bugsnag/delivery-electron": { "version": "file:packages/delivery-electron", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" } }, "@bugsnag/delivery-fetch": { "version": "file:packages/delivery-fetch", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/delivery-node": { "version": "file:packages/delivery-node", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/delivery-react-native": { "version": "file:packages/delivery-react-native", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/delivery-x-domain-request": { "version": "file:packages/delivery-x-domain-request", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/delivery-xml-http-request": { "version": "file:packages/delivery-xml-http-request", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/electron": { "version": "file:packages/electron", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-electron": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-electron": "^8.6.0", "@bugsnag/electron-filestore": "^8.0.0", - "@bugsnag/electron-network-status": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-app": "^8.4.0", - "@bugsnag/plugin-electron-app-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", - "@bugsnag/plugin-electron-client-state-persistence": "^8.4.0", - "@bugsnag/plugin-electron-deliver-minidumps": "^8.5.0", - "@bugsnag/plugin-electron-device": "^8.4.0", - "@bugsnag/plugin-electron-ipc": "^8.5.0", - "@bugsnag/plugin-electron-net-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-preload-error": "^8.4.0", - "@bugsnag/plugin-electron-process-info": "^8.4.0", - "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.4.0", - "@bugsnag/plugin-electron-renderer-event-data": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0", - "@bugsnag/plugin-electron-session": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-internal-callback-marker": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0" + "@bugsnag/electron-network-status": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-app": "^8.6.0", + "@bugsnag/plugin-electron-app-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", + "@bugsnag/plugin-electron-client-state-persistence": "^8.6.0", + "@bugsnag/plugin-electron-deliver-minidumps": "^8.6.0", + "@bugsnag/plugin-electron-device": "^8.6.0", + "@bugsnag/plugin-electron-ipc": "^8.6.0", + "@bugsnag/plugin-electron-net-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-preload-error": "^8.6.0", + "@bugsnag/plugin-electron-process-info": "^8.6.0", + "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.6.0", + "@bugsnag/plugin-electron-renderer-event-data": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0", + "@bugsnag/plugin-electron-session": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-internal-callback-marker": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0" } }, "@bugsnag/electron-filestore": { @@ -55708,20 +55708,20 @@ "@bugsnag/electron-network-status": { "version": "file:packages/electron-network-status", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" } }, "@bugsnag/electron-test-helpers": { "version": "file:packages/electron-test-helpers", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/in-flight": { "version": "file:packages/in-flight", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/cuid": "^3.0.0" } }, @@ -55729,27 +55729,27 @@ "version": "file:packages/js", "requires": { "@babel/cli": "^7.0.0", - "@bugsnag/browser": "^8.4.0", - "@bugsnag/node": "^8.4.0" + "@bugsnag/browser": "^8.6.0", + "@bugsnag/node": "^8.6.0" } }, "@bugsnag/node": { "version": "file:packages/node", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-node": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-contextualize": "^8.4.0", - "@bugsnag/plugin-intercept": "^8.4.0", - "@bugsnag/plugin-node-device": "^8.4.0", - "@bugsnag/plugin-node-in-project": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-server-session": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-node": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-contextualize": "^8.6.0", + "@bugsnag/plugin-intercept": "^8.6.0", + "@bugsnag/plugin-node-device": "^8.6.0", + "@bugsnag/plugin-node-in-project": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-server-session": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0", "byline": "^5.0.0", "error-stack-parser": "^2.0.3", "iserror": "^0.0.2", @@ -55765,7 +55765,7 @@ "@angular/common": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "@angular/core": "^19.0.0", - "@bugsnag/js": "^8.4.0", + "@bugsnag/js": "^8.6.0", "ng-packagr": "^19.1.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", @@ -59675,15 +59675,15 @@ "@bugsnag/plugin-app-duration": { "version": "file:packages/plugin-app-duration", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-aws-lambda": { "version": "file:packages/plugin-aws-lambda", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/in-flight": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/in-flight": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", "@types/aws-lambda": "^8.10.76", "@vendia/serverless-express": "^4.10.1", "express": "^4.18.2" @@ -59692,74 +59692,74 @@ "@bugsnag/plugin-browser-context": { "version": "file:packages/plugin-browser-context", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-browser-device": { "version": "file:packages/plugin-browser-device", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/cuid": "^3.0.0" } }, "@bugsnag/plugin-browser-request": { "version": "file:packages/plugin-browser-request", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-browser-session": { "version": "file:packages/plugin-browser-session", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-client-ip": { "version": "file:packages/plugin-client-ip", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-console-breadcrumbs": { "version": "file:packages/plugin-console-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-contextualize": { "version": "file:packages/plugin-contextualize", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-app": { "version": "file:packages/plugin-electron-app", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", "bindings": "^1.5.0" } }, "@bugsnag/plugin-electron-app-breadcrumbs": { "version": "file:packages/plugin-electron-app-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", "lodash.debounce": "^4.0.8" } }, "@bugsnag/plugin-electron-client-state-manager": { "version": "file:packages/plugin-electron-client-state-manager", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-client-state-persistence": { "version": "file:packages/plugin-electron-client-state-persistence", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", "@types/bindings": "^1.5.0", "bindings": "^1.5.0" } @@ -59767,22 +59767,22 @@ "@bugsnag/plugin-electron-deliver-minidumps": { "version": "file:packages/plugin-electron-deliver-minidumps", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0", "form-data": "^4.0.4" } }, "@bugsnag/plugin-electron-device": { "version": "file:packages/plugin-electron-device", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-ipc": { "version": "file:packages/plugin-electron-ipc", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/safe-json-stringify": "^6.0.0", "browserify": "^17.0.0" }, @@ -59873,83 +59873,83 @@ "@bugsnag/plugin-electron-net-breadcrumbs": { "version": "file:packages/plugin-electron-net-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-network-status": { "version": "file:packages/plugin-electron-network-status", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-power-monitor-breadcrumbs": { "version": "file:packages/plugin-electron-power-monitor-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-preload-error": { "version": "file:packages/plugin-electron-preload-error", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-process-info": { "version": "file:packages/plugin-electron-process-info", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-renderer-client-state-updates": { "version": "file:packages/plugin-electron-renderer-client-state-updates", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-renderer-event-data": { "version": "file:packages/plugin-electron-renderer-event-data", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0" } }, "@bugsnag/plugin-electron-renderer-strip-project-root": { "version": "file:packages/plugin-electron-renderer-strip-project-root", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-screen-breadcrumbs": { "version": "file:packages/plugin-electron-screen-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-session": { "version": "file:packages/plugin-electron-session", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0" } }, "@bugsnag/plugin-express": { "version": "file:packages/plugin-express", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/express": "4.17.13" } }, "@bugsnag/plugin-hono": { "version": "file:packages/plugin-hono", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "hono": "^4.6.3", "typescript": "^5.2.2" }, @@ -59965,62 +59965,62 @@ "@bugsnag/plugin-inline-script-content": { "version": "file:packages/plugin-inline-script-content", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-interaction-breadcrumbs": { "version": "file:packages/plugin-interaction-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-intercept": { "version": "file:packages/plugin-intercept", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-internal-callback-marker": { "version": "file:packages/plugin-internal-callback-marker", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-koa": { "version": "file:packages/plugin-koa", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/koa": "2.13.4" } }, "@bugsnag/plugin-navigation-breadcrumbs": { "version": "file:packages/plugin-navigation-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-network-breadcrumbs": { "version": "file:packages/plugin-network-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-node-device": { "version": "file:packages/plugin-node-device", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-node-in-project": { "version": "file:packages/plugin-node-in-project", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-node-surrounding-code": { "version": "file:packages/plugin-node-surrounding-code", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "byline": "^5.0.0", "pump": "^3.0.0" } @@ -60028,75 +60028,75 @@ "@bugsnag/plugin-node-uncaught-exception": { "version": "file:packages/plugin-node-uncaught-exception", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-node-unhandled-rejection": { "version": "file:packages/plugin-node-unhandled-rejection", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react": { "version": "file:packages/plugin-react", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react-native-client-sync": { "version": "file:packages/plugin-react-native-client-sync", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react-native-event-sync": { "version": "file:packages/plugin-react-native-event-sync", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react-native-global-error-handler": { "version": "file:packages/plugin-react-native-global-error-handler", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react-native-hermes": { "version": "file:packages/plugin-react-native-hermes", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react-native-navigation": { "version": "file:packages/plugin-react-native-navigation", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "react-native-navigation": "^7.0.0" } }, "@bugsnag/plugin-react-native-orientation-breadcrumbs": { "version": "file:packages/plugin-react-native-orientation-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react-native-session": { "version": "file:packages/plugin-react-native-session", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react-native-unhandled-rejection": { "version": "file:packages/plugin-react-native-unhandled-rejection", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "promise": "^8.0.2" } }, "@bugsnag/plugin-react-navigation": { "version": "file:packages/plugin-react-navigation", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@react-navigation/native": "^5.7.3", "@types/react": "^16.9.49", "@types/react-test-renderer": "^16.9.3", @@ -60107,74 +60107,74 @@ "@bugsnag/plugin-restify": { "version": "file:packages/plugin-restify", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/restify": "^8.4.2" } }, "@bugsnag/plugin-server-session": { "version": "file:packages/plugin-server-session", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "backo": "^1.1.0" } }, "@bugsnag/plugin-simple-throttle": { "version": "file:packages/plugin-simple-throttle", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-stackframe-path-normaliser": { "version": "file:packages/plugin-stackframe-path-normaliser", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-strip-project-root": { "version": "file:packages/plugin-strip-project-root", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-strip-query-string": { "version": "file:packages/plugin-strip-query-string", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-vue": { "version": "file:packages/plugin-vue", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-window-onerror": { "version": "file:packages/plugin-window-onerror", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-window-unhandled-rejection": { "version": "file:packages/plugin-window-unhandled-rejection", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/react-native": { "version": "file:packages/react-native", "requires": { "@babel/cli": "^7.0.0", - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-react-native": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-react": "^8.4.0", - "@bugsnag/plugin-react-native-client-sync": "^8.4.0", - "@bugsnag/plugin-react-native-event-sync": "^8.4.0", - "@bugsnag/plugin-react-native-global-error-handler": "^8.4.0", - "@bugsnag/plugin-react-native-hermes": "^8.4.0", - "@bugsnag/plugin-react-native-session": "^8.4.0", - "@bugsnag/plugin-react-native-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-react-native": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-react": "^8.6.0", + "@bugsnag/plugin-react-native-client-sync": "^8.6.0", + "@bugsnag/plugin-react-native-event-sync": "^8.6.0", + "@bugsnag/plugin-react-native-global-error-handler": "^8.6.0", + "@bugsnag/plugin-react-native-hermes": "^8.6.0", + "@bugsnag/plugin-react-native-session": "^8.6.0", + "@bugsnag/plugin-react-native-unhandled-rejection": "^8.6.0", "iserror": "^0.0.2", "tslint": "^5.12.1", "typescript": "^3.3.3" @@ -60235,13 +60235,13 @@ "@bugsnag/web-worker": { "version": "file:packages/web-worker", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-fetch": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-fetch": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0", "ts-loader": "^9.4.1", "typescript": "^4.9.3", "webpack": "^5.75.0", diff --git a/packages/browser/package.json b/packages/browser/package.json index a28b7399e2..cfae0b39d0 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/browser", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/bugsnag.js", "types": "types/bugsnag.d.ts", "description": "Bugsnag error reporter for browser JavaScript", @@ -30,25 +30,25 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/delivery-x-domain-request": "^8.4.0", - "@bugsnag/delivery-xml-http-request": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-browser-context": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-request": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-inline-script-content": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-navigation-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-simple-throttle": "^8.4.0", - "@bugsnag/plugin-strip-query-string": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0" + "@bugsnag/delivery-x-domain-request": "^8.6.0", + "@bugsnag/delivery-xml-http-request": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-browser-context": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-request": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-inline-script-content": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-navigation-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-simple-throttle": "^8.6.0", + "@bugsnag/plugin-strip-query-string": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0" }, "dependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } } diff --git a/packages/core/package.json b/packages/core/package.json index 996819b5fa..6cc9c93a50 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "@bugsnag/core", "main": "index.js", - "version": "8.4.0", + "version": "8.6.0", "types": "types/index.d.ts", "description": "Core classes and utilities for Bugsnag notifiers", "homepage": "https://www.bugsnag.com/", diff --git a/packages/delivery-electron/package.json b/packages/delivery-electron/package.json index 10eeb1569b..3f012d10dc 100644 --- a/packages/delivery-electron/package.json +++ b/packages/delivery-electron/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/delivery-electron", - "version": "8.4.0", + "version": "8.6.0", "main": "delivery.js", "description": "@bugsnag/electron delivery mechanism to send events, sessions, and crash dumps from Electron apps", "homepage": "https://www.bugsnag.com/", @@ -17,9 +17,9 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0", diff --git a/packages/delivery-fetch/package.json b/packages/delivery-fetch/package.json index a540d4610c..35498c82ab 100644 --- a/packages/delivery-fetch/package.json +++ b/packages/delivery-fetch/package.json @@ -1,7 +1,7 @@ { "name": "@bugsnag/delivery-fetch", "author": "Bugsnag", - "version": "8.4.0", + "version": "8.6.0", "main": "delivery.js", "description": "@bugsnag/js delivery mechanism using the fetch API", "homepage": "https://www.bugsnag.com/", @@ -14,7 +14,7 @@ }, "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/delivery-node/package.json b/packages/delivery-node/package.json index 8392d86837..2957ea9bfc 100644 --- a/packages/delivery-node/package.json +++ b/packages/delivery-node/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/delivery-node", - "version": "8.4.0", + "version": "8.6.0", "main": "delivery.js", "description": "@bugsnag/node delivery mechanism", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/delivery-react-native/package.json b/packages/delivery-react-native/package.json index 47c6ec45f7..96f2b08878 100644 --- a/packages/delivery-react-native/package.json +++ b/packages/delivery-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/delivery-react-native", - "version": "8.4.0", + "version": "8.6.0", "main": "delivery.js", "description": "@bugsnag/js delivery mechanism for React Native", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/delivery-x-domain-request/package.json b/packages/delivery-x-domain-request/package.json index 1701000e7b..fedbff2195 100644 --- a/packages/delivery-x-domain-request/package.json +++ b/packages/delivery-x-domain-request/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/delivery-x-domain-request", - "version": "8.4.0", + "version": "8.6.0", "main": "delivery.js", "description": "@bugsnag/js delivery mechanism for IE 8, 9 and 10", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/delivery-xml-http-request/package.json b/packages/delivery-xml-http-request/package.json index ff0bf6c6ec..0526d3ec04 100644 --- a/packages/delivery-xml-http-request/package.json +++ b/packages/delivery-xml-http-request/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/delivery-xml-http-request", - "version": "8.4.0", + "version": "8.6.0", "main": "delivery.js", "description": "@bugsnag/js delivery mechanism for most browsers", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/electron-network-status/package.json b/packages/electron-network-status/package.json index 7bfacc8fa2..eda6cdbb81 100644 --- a/packages/electron-network-status/package.json +++ b/packages/electron-network-status/package.json @@ -1,14 +1,14 @@ { "name": "@bugsnag/electron-network-status", - "version": "8.4.0", + "version": "8.6.0", "main": "network-status.js", "description": "@bugsnag/electron package for watching network status", "author": "Bugsnag", "license": "MIT", "homepage": "https://www.bugsnag.com/", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/electron-test-helpers/package.json b/packages/electron-test-helpers/package.json index 3c525ee20b..b6a7628765 100644 --- a/packages/electron-test-helpers/package.json +++ b/packages/electron-test-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/electron-test-helpers", - "version": "8.4.0", + "version": "8.6.0", "main": "helpers.ts", "description": "Test helpers for @bugsnag/electron", "repository": { @@ -15,7 +15,7 @@ "helpers.ts" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "author": "Bugsnag", "license": "MIT" diff --git a/packages/electron/package.json b/packages/electron/package.json index 3749d06c03..3612f1d455 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/electron", - "version": "8.5.0", + "version": "8.6.0", "main": "src/notifier.js", "exports": { ".": { @@ -33,35 +33,35 @@ "author": "Bugsnag", "license": "MIT", "dependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-electron": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-electron": "^8.6.0", "@bugsnag/electron-filestore": "^8.0.0", - "@bugsnag/electron-network-status": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-app": "^8.4.0", - "@bugsnag/plugin-electron-app-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", - "@bugsnag/plugin-electron-client-state-persistence": "^8.4.0", - "@bugsnag/plugin-electron-deliver-minidumps": "^8.5.0", - "@bugsnag/plugin-electron-device": "^8.4.0", - "@bugsnag/plugin-electron-ipc": "^8.5.0", - "@bugsnag/plugin-electron-net-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-preload-error": "^8.4.0", - "@bugsnag/plugin-electron-process-info": "^8.4.0", - "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.4.0", - "@bugsnag/plugin-electron-renderer-event-data": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0", - "@bugsnag/plugin-electron-session": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-internal-callback-marker": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0" + "@bugsnag/electron-network-status": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-app": "^8.6.0", + "@bugsnag/plugin-electron-app-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", + "@bugsnag/plugin-electron-client-state-persistence": "^8.6.0", + "@bugsnag/plugin-electron-deliver-minidumps": "^8.6.0", + "@bugsnag/plugin-electron-device": "^8.6.0", + "@bugsnag/plugin-electron-ipc": "^8.6.0", + "@bugsnag/plugin-electron-net-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-preload-error": "^8.6.0", + "@bugsnag/plugin-electron-process-info": "^8.6.0", + "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.6.0", + "@bugsnag/plugin-electron-renderer-event-data": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0", + "@bugsnag/plugin-electron-session": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-internal-callback-marker": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0" } } diff --git a/packages/in-flight/package.json b/packages/in-flight/package.json index 937d335ea9..24c351f3e1 100644 --- a/packages/in-flight/package.json +++ b/packages/in-flight/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/in-flight", - "version": "8.4.0", + "version": "8.6.0", "main": "src/in-flight.js", "types": "types/bugsnag-in-flight.d.ts", "description": "Internal package to keep track of in-flight requests to Bugsnag", @@ -22,7 +22,7 @@ "@bugsnag/cuid": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/js/package.json b/packages/js/package.json index 5b23647700..2f52241eac 100644 --- a/packages/js/package.json +++ b/packages/js/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/js", - "version": "8.4.0", + "version": "8.6.0", "main": "node/notifier.js", "browser": "browser/notifier.js", "types": "types.d.ts", @@ -33,8 +33,8 @@ "author": "Bugsnag", "license": "MIT", "dependencies": { - "@bugsnag/browser": "^8.4.0", - "@bugsnag/node": "^8.4.0" + "@bugsnag/browser": "^8.6.0", + "@bugsnag/node": "^8.6.0" }, "devDependencies": { "@babel/cli": "^7.0.0" diff --git a/packages/node/package.json b/packages/node/package.json index 6f102c5476..b7636c547b 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/node", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/bugsnag.js", "types": "types/bugsnag.d.ts", "description": "Bugsnag error reporter for Node.js", @@ -24,22 +24,22 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/delivery-node": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-contextualize": "^8.4.0", - "@bugsnag/plugin-intercept": "^8.4.0", - "@bugsnag/plugin-node-device": "^8.4.0", - "@bugsnag/plugin-node-in-project": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-server-session": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0" + "@bugsnag/delivery-node": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-contextualize": "^8.6.0", + "@bugsnag/plugin-intercept": "^8.6.0", + "@bugsnag/plugin-node-device": "^8.6.0", + "@bugsnag/plugin-node-in-project": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-server-session": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0" }, "dependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "byline": "^5.0.0", "error-stack-parser": "^2.0.3", "iserror": "^0.0.2", diff --git a/packages/plugin-angular/package.json b/packages/plugin-angular/package.json index 775b638ed6..018d326a5e 100644 --- a/packages/plugin-angular/package.json +++ b/packages/plugin-angular/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-angular", - "version": "8.5.0", + "version": "8.6.0", "description": "Angular integration for bugsnag-js", "homepage": "https://www.bugsnag.com/", "repository": { @@ -30,7 +30,7 @@ "@angular/common": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "@angular/core": "^19.0.0", - "@bugsnag/js": "^8.4.0", + "@bugsnag/js": "^8.6.0", "ng-packagr": "^19.1.0", "rxjs": "~7.8.0", "typescript": "~5.6.2", diff --git a/packages/plugin-app-duration/package.json b/packages/plugin-app-duration/package.json index 9af0efb32f..e58773d3b1 100644 --- a/packages/plugin-app-duration/package.json +++ b/packages/plugin-app-duration/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-app-duration", - "version": "8.4.0", + "version": "8.6.0", "main": "app.js", "description": "@bugsnag/js plugin to set app duration in browsers and node", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-aws-lambda/package.json b/packages/plugin-aws-lambda/package.json index 6c32bf6d26..b42ded452c 100644 --- a/packages/plugin-aws-lambda/package.json +++ b/packages/plugin-aws-lambda/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-aws-lambda", - "version": "8.4.0", + "version": "8.6.0", "main": "src/index.js", "types": "types/bugsnag-plugin-aws-lambda.d.ts", "description": "AWS Lambda support for @bugsnag/node", @@ -19,11 +19,11 @@ "author": "Bugsnag", "license": "MIT", "dependencies": { - "@bugsnag/in-flight": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0" + "@bugsnag/in-flight": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/aws-lambda": "^8.10.76", "@vendia/serverless-express": "^4.10.1", "express": "^4.18.2" diff --git a/packages/plugin-browser-context/package.json b/packages/plugin-browser-context/package.json index 26a769cd44..979a96f081 100644 --- a/packages/plugin-browser-context/package.json +++ b/packages/plugin-browser-context/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-browser-context", - "version": "8.4.0", + "version": "8.6.0", "main": "context.js", "description": "@bugsnag/js plugin to set event context in browsers", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-browser-device/package.json b/packages/plugin-browser-device/package.json index 9c9b9aab33..2d7eb1159f 100644 --- a/packages/plugin-browser-device/package.json +++ b/packages/plugin-browser-device/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-browser-device", - "version": "8.4.0", + "version": "8.6.0", "main": "device.js", "description": "@bugsnag/js plugin to set device info in browsers", "homepage": "https://www.bugsnag.com/", @@ -20,7 +20,7 @@ "@bugsnag/cuid": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-browser-request/package.json b/packages/plugin-browser-request/package.json index 04c424e8fd..72d91b2ac9 100644 --- a/packages/plugin-browser-request/package.json +++ b/packages/plugin-browser-request/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-browser-request", - "version": "8.4.0", + "version": "8.6.0", "main": "request.js", "description": "@bugsnag/js plugin to set request info in browsers", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-browser-session/package.json b/packages/plugin-browser-session/package.json index d0f02e612a..7e0a104d78 100644 --- a/packages/plugin-browser-session/package.json +++ b/packages/plugin-browser-session/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-browser-session", - "version": "8.4.0", + "version": "8.6.0", "main": "session.js", "description": "@bugsnag/js plugin to enable session tracking in browsers", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-client-ip/package.json b/packages/plugin-client-ip/package.json index 4a807629d2..9aee1f3ca2 100644 --- a/packages/plugin-client-ip/package.json +++ b/packages/plugin-client-ip/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-client-ip", - "version": "8.4.0", + "version": "8.6.0", "main": "client-ip.js", "description": "@bugsnag/js plugin to disable client IP from error reports", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-console-breadcrumbs/package.json b/packages/plugin-console-breadcrumbs/package.json index a0fbd8aeb3..e6c166069b 100644 --- a/packages/plugin-console-breadcrumbs/package.json +++ b/packages/plugin-console-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-console-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "console-breadcrumbs.js", "description": "@bugsnag/js plugin to record console log method calls as breadcrumbs", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-contextualize/package.json b/packages/plugin-contextualize/package.json index 757af50bf0..d66c3de30f 100644 --- a/packages/plugin-contextualize/package.json +++ b/packages/plugin-contextualize/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-contextualize", - "version": "8.4.0", + "version": "8.6.0", "main": "contextualize.js", "description": "@bugsnag/js plugin to add context to unhandled events", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-app-breadcrumbs/package.json b/packages/plugin-electron-app-breadcrumbs/package.json index 17efbb2b3a..4792d058d0 100644 --- a/packages/plugin-electron-app-breadcrumbs/package.json +++ b/packages/plugin-electron-app-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-app-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "app-breadcrumbs.js", "description": "@bugsnag/electron plugin to collect breadcrumbs for app lifecycle events", "repository": { @@ -17,8 +17,8 @@ "lodash.debounce": "^4.0.8" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-app/package.json b/packages/plugin-electron-app/package.json index ebf389d105..2c174b6014 100644 --- a/packages/plugin-electron-app/package.json +++ b/packages/plugin-electron-app/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-app", - "version": "8.4.0", + "version": "8.6.0", "main": "app.js", "description": "@bugsnag/electron plugin to collect app information", "repository": { @@ -25,8 +25,8 @@ "generate-compile-commands": "node-gyp configure --release -- -f gyp.generator.compile_commands_json.py; mv Release/compile_commands.json .; rm -rf Debug Release" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "dependencies": { "bindings": "^1.5.0" diff --git a/packages/plugin-electron-client-state-manager/package.json b/packages/plugin-electron-client-state-manager/package.json index c7c01c3756..659c35008a 100644 --- a/packages/plugin-electron-client-state-manager/package.json +++ b/packages/plugin-electron-client-state-manager/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-client-state-manager", - "version": "8.4.0", + "version": "8.6.0", "main": "client-state-manager.js", "description": "@bugsnag/electron plugin to sync state between various processes", "homepage": "https://www.bugsnag.com/", @@ -19,7 +19,7 @@ "client-state-manager.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-client-state-persistence/package.json b/packages/plugin-electron-client-state-persistence/package.json index 34b53a5605..d378d018ed 100644 --- a/packages/plugin-electron-client-state-persistence/package.json +++ b/packages/plugin-electron-client-state-persistence/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-client-state-persistence", - "version": "8.4.0", + "version": "8.6.0", "main": "client-state-persistence.js", "description": "@bugsnag/electron plugin to sync information between JS and native layer", "homepage": "https://www.bugsnag.com/", @@ -39,9 +39,9 @@ "bindings": "^1.5.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", "@types/bindings": "^1.5.0" }, "peerDependencies": { diff --git a/packages/plugin-electron-deliver-minidumps/package.json b/packages/plugin-electron-deliver-minidumps/package.json index 24d4665b67..73bb2ad636 100644 --- a/packages/plugin-electron-deliver-minidumps/package.json +++ b/packages/plugin-electron-deliver-minidumps/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-deliver-minidumps", - "version": "8.5.0", + "version": "8.6.0", "main": "deliver-minidumps.js", "description": "@bugsnag/electron plugin to deliver minidumps to Bugsnag", "homepage": "https://www.bugsnag.com/", @@ -22,8 +22,8 @@ "form-data": "^4.0.4" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0", diff --git a/packages/plugin-electron-device/package.json b/packages/plugin-electron-device/package.json index da75b9b668..1a39b1ad21 100644 --- a/packages/plugin-electron-device/package.json +++ b/packages/plugin-electron-device/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-device", - "version": "8.4.0", + "version": "8.6.0", "main": "device.js", "description": "@bugsnag/electron plugin to collect device information", "repository": { @@ -14,8 +14,8 @@ "device.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-ipc/package.json b/packages/plugin-electron-ipc/package.json index 1234b8e0c7..8fb7ee34a8 100644 --- a/packages/plugin-electron-ipc/package.json +++ b/packages/plugin-electron-ipc/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-ipc", - "version": "8.5.0", + "version": "8.6.0", "main": "electron-ipc.js", "description": "@bugsnag/electron plugin to create the IPC layer between main and renderer processes", "repository": { @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "browserify": "^17.0.0" }, "dependencies": { diff --git a/packages/plugin-electron-net-breadcrumbs/package.json b/packages/plugin-electron-net-breadcrumbs/package.json index acb43c50a2..b48c8c8064 100644 --- a/packages/plugin-electron-net-breadcrumbs/package.json +++ b/packages/plugin-electron-net-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-net-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "net-breadcrumbs.js", "description": "@bugsnag/electron plugin to collect breadcrumbs from requests made with the net module", "repository": { @@ -14,8 +14,8 @@ "net-breadcrumbs.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-network-status/package.json b/packages/plugin-electron-network-status/package.json index 1b77a9003c..80b2656af6 100644 --- a/packages/plugin-electron-network-status/package.json +++ b/packages/plugin-electron-network-status/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-network-status", - "version": "8.4.0", + "version": "8.6.0", "main": "network-status.js", "description": "@bugsnag/electron plugin to monitor the network status", "repository": { @@ -14,7 +14,7 @@ "network-status.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-power-monitor-breadcrumbs/package.json b/packages/plugin-electron-power-monitor-breadcrumbs/package.json index eda595dea2..881f316a7b 100644 --- a/packages/plugin-electron-power-monitor-breadcrumbs/package.json +++ b/packages/plugin-electron-power-monitor-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-power-monitor-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "power-monitor-breadcrumbs.js", "description": "@bugsnag/electron plugin to collect power state breadcrumbs", "repository": { @@ -14,8 +14,8 @@ "power-monitor-breadcrumbs.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-preload-error/package.json b/packages/plugin-electron-preload-error/package.json index ddf44e43a5..9e077ced0f 100644 --- a/packages/plugin-electron-preload-error/package.json +++ b/packages/plugin-electron-preload-error/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-preload-error", - "version": "8.4.0", + "version": "8.6.0", "main": "preload-error.js", "description": "@bugsnag/electron plugin to handle errors in preload scripts", "repository": { @@ -15,8 +15,8 @@ "preload-error.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-process-info/package.json b/packages/plugin-electron-process-info/package.json index f84add65e6..bbde8ac55a 100644 --- a/packages/plugin-electron-process-info/package.json +++ b/packages/plugin-electron-process-info/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-process-info", - "version": "8.4.0", + "version": "8.6.0", "main": "procinfo.js", "description": "@bugsnag/electron plugin to collect process information for errors", "repository": { @@ -14,7 +14,7 @@ "procinfo.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-renderer-client-state-updates/package.json b/packages/plugin-electron-renderer-client-state-updates/package.json index 728c2137a7..8db2795c4b 100644 --- a/packages/plugin-electron-renderer-client-state-updates/package.json +++ b/packages/plugin-electron-renderer-client-state-updates/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-renderer-client-state-updates", - "version": "8.4.0", + "version": "8.6.0", "main": "client-state-updates.js", "description": "@bugsnag/electron plugin to sync information between JS renderers", "homepage": "https://www.bugsnag.com/", @@ -19,7 +19,7 @@ "client-state-updates.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-renderer-event-data/package.json b/packages/plugin-electron-renderer-event-data/package.json index 47cc3cc176..3ea100da00 100644 --- a/packages/plugin-electron-renderer-event-data/package.json +++ b/packages/plugin-electron-renderer-event-data/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-renderer-event-data", - "version": "8.4.0", + "version": "8.6.0", "main": "renderer-event-data.js", "description": "@bugsnag/electron plugin to get fully populated event data in renderer callbacks", "homepage": "https://www.bugsnag.com/", @@ -19,9 +19,9 @@ "renderer-event-data.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0", diff --git a/packages/plugin-electron-renderer-strip-project-root/package.json b/packages/plugin-electron-renderer-strip-project-root/package.json index 96e1a56451..9260ee0c47 100644 --- a/packages/plugin-electron-renderer-strip-project-root/package.json +++ b/packages/plugin-electron-renderer-strip-project-root/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-renderer-strip-project-root", - "version": "8.4.0", + "version": "8.6.0", "main": "strip-project-root.js", "description": "@bugsnag/electron plugin to strip the project root from stack traces", "homepage": "https://www.bugsnag.com/", @@ -15,8 +15,8 @@ "*.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "author": "Bugsnag", "license": "MIT" diff --git a/packages/plugin-electron-screen-breadcrumbs/package.json b/packages/plugin-electron-screen-breadcrumbs/package.json index 548b9dc236..a30f2989c7 100644 --- a/packages/plugin-electron-screen-breadcrumbs/package.json +++ b/packages/plugin-electron-screen-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-screen-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "screen-breadcrumbs.js", "description": "@bugsnag/electron plugin to collect screen breadcrumbs", "repository": { @@ -14,8 +14,8 @@ "screen-breadcrumbs.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-session/package.json b/packages/plugin-electron-session/package.json index 5c8d9d7c8f..cdc7a03286 100644 --- a/packages/plugin-electron-session/package.json +++ b/packages/plugin-electron-session/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-session", - "version": "8.4.0", + "version": "8.6.0", "main": "session.js", "description": "@bugsnag/electron plugin for sessions", "repository": { @@ -14,11 +14,11 @@ "session.js" ], "dependencies": { - "@bugsnag/plugin-browser-session": "^8.4.0" + "@bugsnag/plugin-browser-session": "^8.6.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-express/package.json b/packages/plugin-express/package.json index bdad235dd1..926cc17074 100644 --- a/packages/plugin-express/package.json +++ b/packages/plugin-express/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-express", - "version": "8.4.0", + "version": "8.6.0", "main": "src/express.js", "types": "types/bugsnag-express.d.ts", "description": "@bugsnag/js error handling middleware for Express (and Connect) web servers", @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/express": "4.17.13" } } diff --git a/packages/plugin-hono/package.json b/packages/plugin-hono/package.json index 689fac1837..344c386363 100644 --- a/packages/plugin-hono/package.json +++ b/packages/plugin-hono/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-hono", - "version": "8.4.0", + "version": "8.6.0", "main": "src/hono.js", "types": "types/bugsnag-hono.d.ts", "description": "@bugsnag/js error handling middleware for Hono web servers", @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "hono": "^4.6.3", "typescript": "^5.2.2" }, diff --git a/packages/plugin-inline-script-content/package.json b/packages/plugin-inline-script-content/package.json index 89d4eb634b..06acb9956e 100644 --- a/packages/plugin-inline-script-content/package.json +++ b/packages/plugin-inline-script-content/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-inline-script-content", - "version": "8.4.0", + "version": "8.6.0", "main": "inline-script-content.js", "description": "@bugsnag/js plugin to attach inline script content to error events", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-interaction-breadcrumbs/package.json b/packages/plugin-interaction-breadcrumbs/package.json index 82ee99e7bc..38843adf19 100644 --- a/packages/plugin-interaction-breadcrumbs/package.json +++ b/packages/plugin-interaction-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-interaction-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "interaction-breadcrumbs.js", "description": "@bugsnag/js plugin to record UI click events as breadcrumbs", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-intercept/package.json b/packages/plugin-intercept/package.json index d7a790b9f5..347fbe2e2f 100644 --- a/packages/plugin-intercept/package.json +++ b/packages/plugin-intercept/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-intercept", - "version": "8.4.0", + "version": "8.6.0", "main": "intercept.js", "description": "@bugsnag/js plugin providing convenience functions for intercepting asynchronous errors", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-internal-callback-marker/package.json b/packages/plugin-internal-callback-marker/package.json index e0a3552d7d..f32d42160f 100644 --- a/packages/plugin-internal-callback-marker/package.json +++ b/packages/plugin-internal-callback-marker/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-internal-callback-marker", - "version": "8.4.0", + "version": "8.6.0", "main": "internal-callback-marker.js", "description": "@bugsnag/js plugin to annotate all OnError callbacks added by internal plugins", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "internal-callback-marker.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-koa/package.json b/packages/plugin-koa/package.json index 6cb16b7427..709b0694a6 100644 --- a/packages/plugin-koa/package.json +++ b/packages/plugin-koa/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-koa", - "version": "8.4.0", + "version": "8.6.0", "main": "src/koa.js", "types": "types/bugsnag-koa.d.ts", "description": "@bugsnag/js error handling middleware for Koa web servers", @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/koa": "2.13.4" } } diff --git a/packages/plugin-navigation-breadcrumbs/package.json b/packages/plugin-navigation-breadcrumbs/package.json index 813994339c..3a437ad098 100644 --- a/packages/plugin-navigation-breadcrumbs/package.json +++ b/packages/plugin-navigation-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-navigation-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "navigation-breadcrumbs.js", "description": "@bugsnag/js plugin to record browser navigation as breadcrumbs", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-network-breadcrumbs/package.json b/packages/plugin-network-breadcrumbs/package.json index 3650888fd7..97254e152a 100644 --- a/packages/plugin-network-breadcrumbs/package.json +++ b/packages/plugin-network-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-network-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "network-breadcrumbs.js", "description": "@bugsnag/js plugin to record browser requests as breadcrumbs", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-node-device/package.json b/packages/plugin-node-device/package.json index 57b2746eb3..10b537d82a 100644 --- a/packages/plugin-node-device/package.json +++ b/packages/plugin-node-device/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-device", - "version": "8.4.0", + "version": "8.6.0", "main": "device.js", "description": "@bugsnag/js plugin to set device info in node", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-node-in-project/package.json b/packages/plugin-node-in-project/package.json index 865a7af0fe..a31977245b 100644 --- a/packages/plugin-node-in-project/package.json +++ b/packages/plugin-node-in-project/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-in-project", - "version": "8.4.0", + "version": "8.6.0", "main": "in-project.js", "description": "@bugsnag/js plugin to mark whether stackframes are 'in-project'", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-node-surrounding-code/package.json b/packages/plugin-node-surrounding-code/package.json index 2f0af18f91..363f07532c 100644 --- a/packages/plugin-node-surrounding-code/package.json +++ b/packages/plugin-node-surrounding-code/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-surrounding-code", - "version": "8.4.0", + "version": "8.6.0", "main": "surrounding-code.js", "description": "@bugsnag/js plugin to load surrounding code in Node stacktraces", "homepage": "https://www.bugsnag.com/", @@ -22,7 +22,7 @@ "pump": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-node-uncaught-exception/package.json b/packages/plugin-node-uncaught-exception/package.json index 7df190b307..021e0dc266 100644 --- a/packages/plugin-node-uncaught-exception/package.json +++ b/packages/plugin-node-uncaught-exception/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-uncaught-exception", - "version": "8.4.0", + "version": "8.6.0", "main": "uncaught-exception.js", "description": "@bugsnag/js plugin to capture and report uncaught exceptions", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-node-unhandled-rejection/package.json b/packages/plugin-node-unhandled-rejection/package.json index 55582d19eb..48686f3479 100644 --- a/packages/plugin-node-unhandled-rejection/package.json +++ b/packages/plugin-node-unhandled-rejection/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "main": "unhandled-rejection.js", "description": "@bugsnag/js plugin to capture and report unhandled rejections", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-react-native-client-sync/package.json b/packages/plugin-react-native-client-sync/package.json index 2963627e0b..10774a2125 100644 --- a/packages/plugin-react-native-client-sync/package.json +++ b/packages/plugin-react-native-client-sync/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-client-sync", - "version": "8.4.0", + "version": "8.6.0", "main": "client-sync.js", "description": "@bugsnag/react-native plugin to sync information between JS and native layer", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-react-native-event-sync/package.json b/packages/plugin-react-native-event-sync/package.json index 539405c906..4c1527ebdc 100644 --- a/packages/plugin-react-native-event-sync/package.json +++ b/packages/plugin-react-native-event-sync/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-event-sync", - "version": "8.4.0", + "version": "8.6.0", "main": "event-sync.js", "description": "@bugsnag/react-native plugin to sync native event information in an onError callbacks", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-react-native-global-error-handler/package.json b/packages/plugin-react-native-global-error-handler/package.json index efcdd92b69..99790a3d78 100644 --- a/packages/plugin-react-native-global-error-handler/package.json +++ b/packages/plugin-react-native-global-error-handler/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-global-error-handler", - "version": "8.4.0", + "version": "8.6.0", "main": "error-handler.js", "description": "@bugsnag/js plugin to report unhandled exceptions in React Native", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-react-native-hermes/package.json b/packages/plugin-react-native-hermes/package.json index 2b50be5f37..f7670ada16 100644 --- a/packages/plugin-react-native-hermes/package.json +++ b/packages/plugin-react-native-hermes/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-hermes", - "version": "8.4.0", + "version": "8.6.0", "main": "hermes.js", "description": "@bugsnag/react-native plugin to support Hermes", "homepage": "https://www.bugsnag.com/", @@ -20,7 +20,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-react-native-navigation/package.json b/packages/plugin-react-native-navigation/package.json index e9070bbbc8..2946b81789 100644 --- a/packages/plugin-react-native-navigation/package.json +++ b/packages/plugin-react-native-navigation/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-navigation", - "version": "8.4.0", + "version": "8.6.0", "main": "react-native-navigation.js", "types": "types/react-native-navigation.d.ts", "description": "@bugsnag/react-native plugin for integration with react-native-navigation", @@ -19,7 +19,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "react-native-navigation": "^7.0.0" }, "peerDependencies": { diff --git a/packages/plugin-react-native-orientation-breadcrumbs/package.json b/packages/plugin-react-native-orientation-breadcrumbs/package.json index e8f06fc284..3d8fda5e53 100644 --- a/packages/plugin-react-native-orientation-breadcrumbs/package.json +++ b/packages/plugin-react-native-orientation-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-orientation-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "orientation.js", "description": "@bugsnag/js plugin to create breadcrumbs when the device orientation changes in a React Native app", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-react-native-session/package.json b/packages/plugin-react-native-session/package.json index b00bd46e74..a8978fb392 100644 --- a/packages/plugin-react-native-session/package.json +++ b/packages/plugin-react-native-session/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-session", - "version": "8.4.0", + "version": "8.6.0", "main": "session.js", "description": "@bugsnag/react-native session implementation (which delegates all functionality to the native client)", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-react-native-unhandled-rejection/package.json b/packages/plugin-react-native-unhandled-rejection/package.json index c287029735..0f9d7d1036 100644 --- a/packages/plugin-react-native-unhandled-rejection/package.json +++ b/packages/plugin-react-native-unhandled-rejection/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "main": "rejection-handler.js", "description": "@bugsnag/js plugin to report unhandled promise rejections in React Native", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "promise": "^8.0.2" }, "peerDependencies": { diff --git a/packages/plugin-react-navigation/package.json b/packages/plugin-react-navigation/package.json index a3cda353ec..1f9dd15b2b 100644 --- a/packages/plugin-react-navigation/package.json +++ b/packages/plugin-react-navigation/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-navigation", - "version": "8.4.0", + "version": "8.6.0", "main": "react-navigation.js", "description": "@bugsnag/react-native plugin to update context and leave breadcrumb when the screen changes", "homepage": "https://www.bugsnag.com/", @@ -22,7 +22,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@react-navigation/native": "^5.7.3", "@types/react": "^16.9.49", "@types/react-test-renderer": "^16.9.3", diff --git a/packages/plugin-react/package.json b/packages/plugin-react/package.json index 8f4893b12f..842838efd5 100644 --- a/packages/plugin-react/package.json +++ b/packages/plugin-react/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/bugsnag-react.js", "description": "React integration for @bugsnag/js", "browser": "dist/bugsnag-react.js", @@ -24,7 +24,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-restify/package.json b/packages/plugin-restify/package.json index 8dc7ef9bc6..2421fdc347 100644 --- a/packages/plugin-restify/package.json +++ b/packages/plugin-restify/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-restify", - "version": "8.4.0", + "version": "8.6.0", "main": "src/restify.js", "types": "types/bugsnag-restify.d.ts", "description": "@bugsnag/js error handling middleware for Restify web servers", @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/restify": "^8.4.2" } } diff --git a/packages/plugin-server-session/package.json b/packages/plugin-server-session/package.json index 1903c6ee77..b1f097480a 100644 --- a/packages/plugin-server-session/package.json +++ b/packages/plugin-server-session/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-server-session", - "version": "8.4.0", + "version": "8.6.0", "main": "session.js", "description": "@bugsnag/js plugin to enable session tracking in server applications", "homepage": "https://www.bugsnag.com/", @@ -20,7 +20,7 @@ "backo": "^1.1.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-simple-throttle/package.json b/packages/plugin-simple-throttle/package.json index c70f3f73c5..50024431fa 100644 --- a/packages/plugin-simple-throttle/package.json +++ b/packages/plugin-simple-throttle/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-simple-throttle", - "version": "8.4.0", + "version": "8.6.0", "main": "throttle.js", "description": "@bugsnag/js plugin to prevent too many events from being sent", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-stackframe-path-normaliser/package.json b/packages/plugin-stackframe-path-normaliser/package.json index 1b607806ee..e8dafa5ebd 100644 --- a/packages/plugin-stackframe-path-normaliser/package.json +++ b/packages/plugin-stackframe-path-normaliser/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-stackframe-path-normaliser", - "version": "8.4.0", + "version": "8.6.0", "main": "path-normaliser.js", "description": "@bugsnag/js plugin to normalise file paths in stackframes", "homepage": "https://www.bugsnag.com/", @@ -17,6 +17,6 @@ "@bugsnag/core": "^8.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } } diff --git a/packages/plugin-strip-project-root/package.json b/packages/plugin-strip-project-root/package.json index d1db090fe8..780d4e5fa9 100644 --- a/packages/plugin-strip-project-root/package.json +++ b/packages/plugin-strip-project-root/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-strip-project-root", - "version": "8.4.0", + "version": "8.6.0", "main": "strip-project-root.js", "description": "@bugsnag/js plugin to remove common project root paths from stacktraces", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-strip-query-string/package.json b/packages/plugin-strip-query-string/package.json index 7eefe3f22f..c5191740b0 100644 --- a/packages/plugin-strip-query-string/package.json +++ b/packages/plugin-strip-query-string/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-strip-query-string", - "version": "8.4.0", + "version": "8.6.0", "main": "strip-query-string.js", "description": "@bugsnag/js plugin to strip query string and document fragment from stackframe filenames", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-vue/package.json b/packages/plugin-vue/package.json index 0e2fcaf668..fe7dabc6e5 100644 --- a/packages/plugin-vue/package.json +++ b/packages/plugin-vue/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-vue", - "version": "8.4.0", + "version": "8.6.0", "description": "Vue.js integration for bugsnag-js", "main": "dist/bugsnag-vue.js", "browser": "dist/bugsnag-vue.js", @@ -24,7 +24,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-window-onerror/package.json b/packages/plugin-window-onerror/package.json index 48dd13c844..4c87d7f213 100644 --- a/packages/plugin-window-onerror/package.json +++ b/packages/plugin-window-onerror/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-window-onerror", - "version": "8.4.0", + "version": "8.6.0", "main": "onerror.js", "description": "@bugsnag/js plugin to report unhandled exceptions in browsers", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-window-unhandled-rejection/package.json b/packages/plugin-window-unhandled-rejection/package.json index 6b4d570e0c..a26e89e3ed 100644 --- a/packages/plugin-window-unhandled-rejection/package.json +++ b/packages/plugin-window-unhandled-rejection/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-window-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "main": "unhandled-rejection.js", "description": "@bugsnag/js plugin to report unhandled promise rejections in browsers", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/react-native/package.json b/packages/react-native/package.json index a3c9323b46..e17bf8f733 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/react-native", - "version": "8.4.0", + "version": "8.6.0", "main": "src/notifier.js", "types": "types/bugsnag.d.ts", "description": "Bugsnag error reporter for React Native applications", @@ -52,17 +52,17 @@ "typescript": "^3.3.3" }, "dependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-react-native": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-react": "^8.4.0", - "@bugsnag/plugin-react-native-client-sync": "^8.4.0", - "@bugsnag/plugin-react-native-event-sync": "^8.4.0", - "@bugsnag/plugin-react-native-global-error-handler": "^8.4.0", - "@bugsnag/plugin-react-native-hermes": "^8.4.0", - "@bugsnag/plugin-react-native-session": "^8.4.0", - "@bugsnag/plugin-react-native-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-react-native": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-react": "^8.6.0", + "@bugsnag/plugin-react-native-client-sync": "^8.6.0", + "@bugsnag/plugin-react-native-event-sync": "^8.6.0", + "@bugsnag/plugin-react-native-global-error-handler": "^8.6.0", + "@bugsnag/plugin-react-native-hermes": "^8.6.0", + "@bugsnag/plugin-react-native-session": "^8.6.0", + "@bugsnag/plugin-react-native-unhandled-rejection": "^8.6.0", "iserror": "^0.0.2" }, "scripts": { diff --git a/packages/web-worker/package.json b/packages/web-worker/package.json index 49746be80c..7ed93d5b8b 100644 --- a/packages/web-worker/package.json +++ b/packages/web-worker/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/web-worker", - "version": "8.4.0", + "version": "8.6.0", "description": "BugSnag error reporter for JavaScript web workers and service workers", "homepage": "https://www.bugsnag.com/", "main": "dist/bugsnag.web-worker.js", @@ -39,13 +39,13 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-fetch": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-fetch": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0", "ts-loader": "^9.4.1", "typescript": "^4.9.3", "webpack": "^5.75.0", From 830f55f1dd03c1fb1900e1359e255e867247d828 Mon Sep 17 00:00:00 2001 From: Bumpsnag bot <> Date: Thu, 25 Sep 2025 18:45:00 +0000 Subject: [PATCH 17/38] Update bugsnag-cocoa to v6.34.0 [full ci] --- CHANGELOG.md | 4 ++++ packages/react-native/ios/vendor/bugsnag-cocoa | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba354b53d9..a94af3396d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ - (plugin-window-onerror) Guard against errors when trying to call previous handler [#2551](https://github.com/bugsnag/bugsnag-js/pull/2551) +### Dependencies + +Update bugsnag-cocoa to [v6.34.0](https//github.com/bugsnag/bugsnag-cocoa/releases/tag/v6.34.0) [#2571](https://github.com/bugsnag/bugsnag-js/pull/2571) + ## [8.5.0] - 2025-09-01 ### Added diff --git a/packages/react-native/ios/vendor/bugsnag-cocoa b/packages/react-native/ios/vendor/bugsnag-cocoa index 8dcc68b843..1f991e92a6 160000 --- a/packages/react-native/ios/vendor/bugsnag-cocoa +++ b/packages/react-native/ios/vendor/bugsnag-cocoa @@ -1 +1 @@ -Subproject commit 8dcc68b843fe38c67075d32e9532be76ee388ed9 +Subproject commit 1f991e92a6e3993c2763d071781d895ca4075a90 From 0af2aa1115816609301a9283b8bb711595605f85 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Fri, 26 Sep 2025 11:50:27 +0100 Subject: [PATCH 18/38] ci: :twisted_rightwards_arrows: add github action to keep next in sync with main --- .github/workflows/branch-sync.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/branch-sync.yml diff --git a/.github/workflows/branch-sync.yml b/.github/workflows/branch-sync.yml new file mode 100644 index 0000000000..9971d40edb --- /dev/null +++ b/.github/workflows/branch-sync.yml @@ -0,0 +1,26 @@ +name: Sync main to next +on: + push: + branches: [main] + +jobs: + sync: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Sync main to next + uses: bugsnag/github-action-branch-sync@v1 + with: + source-branch: main + target-branch: next + labels: automation + reviewers: ${{ secrets.AUTOMATION_REVIEWERS }} + team-reviewers: ${{ secrets.AUTOMATION_TEAM_REVIEWERS }} + github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 7179febf4e286186a70025aa091119c06d7f7356 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 03:40:20 +0000 Subject: [PATCH 19/38] build(deps): bump github/codeql-action from 3.30.3 to 3.30.5 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.3 to 3.30.5. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/192325c86100d080feab897ff886c34abd4c83a3...3599b3baa15b485a2e49ef411a7a4bb2452e7f93) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.30.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/scorecard.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index dfcd880f68..8d0ce6b740 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -47,7 +47,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 + uses: github/codeql-action/init@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -61,7 +61,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 + uses: github/codeql-action/autobuild@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -74,6 +74,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 + uses: github/codeql-action/analyze@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index c432b30f5f..7d50bbf326 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -68,7 +68,7 @@ jobs: # Upload the results to GitHub's code scanning dashboard (optional). # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 + uses: github/codeql-action/upload-sarif@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 with: sarif_file: results.sarif From 9c75772af2559f5bd4e217153f8a95b6e80dd7ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 03:42:01 +0000 Subject: [PATCH 20/38] build(deps): bump actions/cache from 4.2.4 to 4.3.0 Bumps [actions/cache](https://github.com/actions/cache) from 4.2.4 to 4.3.0. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/0400d5f644dc74513175e3cd8d07132dd4860809...0057852bfaa89a56745cba8c7296529d2fc39830) --- updated-dependencies: - dependency-name: actions/cache dependency-version: 4.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/test-electron.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-electron.yml b/.github/workflows/test-electron.yml index 4c61f1f51e..7ebee1bc47 100644 --- a/.github/workflows/test-electron.yml +++ b/.github/workflows/test-electron.yml @@ -30,7 +30,7 @@ jobs: if: ${{ !env.ACT }} run: | echo "::set-output name=dir::$(npm config get cache)" - - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 id: npm-cache if: ${{ !env.ACT }} with: From 51bdf10d59f485690e255c1c27a7524c41a2f34b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 03:44:12 +0000 Subject: [PATCH 21/38] build(deps): bump ruby/setup-ruby from 1.262.0 to 1.263.0 Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.262.0 to 1.263.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb) - [Commits](https://github.com/ruby/setup-ruby/compare/cf7216d52fba1017929b4d7162fabe2b30af5b49...0481980f17b760ef6bca5e8c55809102a0af1e5a) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-version: 1.263.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/aws-lambda.yml | 2 +- .github/workflows/update-dependencies.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/aws-lambda.yml b/.github/workflows/aws-lambda.yml index 56a9d990b0..1e24dcfc37 100644 --- a/.github/workflows/aws-lambda.yml +++ b/.github/workflows/aws-lambda.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 - name: Install Ruby - uses: ruby/setup-ruby@cf7216d52fba1017929b4d7162fabe2b30af5b49 + uses: ruby/setup-ruby@0481980f17b760ef6bca5e8c55809102a0af1e5a with: ruby-version: '3.1' diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml index d357a6e37a..c7b01021f5 100644 --- a/.github/workflows/update-dependencies.yml +++ b/.github/workflows/update-dependencies.yml @@ -40,7 +40,7 @@ jobs: - run: git submodule update --init --recursive - name: Install ruby - uses: ruby/setup-ruby@cf7216d52fba1017929b4d7162fabe2b30af5b49 # v1.262.0 + uses: ruby/setup-ruby@0481980f17b760ef6bca5e8c55809102a0af1e5a # v1.263.0 with: ruby-version: 2.7 From 829d454f52b509e620e783e0c73cad67f4c75943 Mon Sep 17 00:00:00 2001 From: Yousif <74918474+yousif-bugsnag@users.noreply.github.com> Date: Tue, 30 Sep 2025 14:51:01 +0100 Subject: [PATCH 22/38] ci: update expo pipeline for v54 (#2562) --- .buildkite/basic/expo-pipeline.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.buildkite/basic/expo-pipeline.yml b/.buildkite/basic/expo-pipeline.yml index 79c1e71b15..80ab7586b8 100644 --- a/.buildkite/basic/expo-pipeline.yml +++ b/.buildkite/basic/expo-pipeline.yml @@ -8,29 +8,29 @@ steps: depends_on: "publish-js" trigger: "bugsnag-expo" build: - branch: "v53/next" + branch: "v54/next" env: BUGSNAG_JS_BRANCH: "${BUILDKITE_BRANCH}" BUGSNAG_JS_COMMIT: "${BUILDKITE_COMMIT}" # a branch name that's safe to use as a docker cache identifier BUGSNAG_JS_CACHE_SAFE_BRANCH_NAME: "${BRANCH_NAME}" - - label: "@bugsnag/expo v52/next" + - label: "@bugsnag/expo v53/next" depends_on: "publish-js" trigger: "bugsnag-expo" build: - branch: "v52/next" + branch: "v53/next" env: BUGSNAG_JS_BRANCH: "${BUILDKITE_BRANCH}" BUGSNAG_JS_COMMIT: "${BUILDKITE_COMMIT}" # a branch name that's safe to use as a docker cache identifier BUGSNAG_JS_CACHE_SAFE_BRANCH_NAME: "${BRANCH_NAME}" - - label: "@bugsnag/expo v51/next" + - label: "@bugsnag/expo v52/next" depends_on: "publish-js" trigger: "bugsnag-expo" build: - branch: "v51/next" + branch: "v52/next" env: BUGSNAG_JS_BRANCH: "${BUILDKITE_BRANCH}" BUGSNAG_JS_COMMIT: "${BUILDKITE_COMMIT}" From 9db3d94fbf3808e92b8904671453e97513a63232 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Wed, 1 Oct 2025 09:42:12 +0100 Subject: [PATCH 23/38] Merge pull request #2481 from bugsnag/update-e2e-ios-12 Use iOS 12 in browser e2e tests --- .buildkite/basic/browser-pipeline.yml | 2 +- .../features/fixtures/browser_errors.yml | 28 +------------------ test/browser/features/integrity.feature | 2 +- test/browser/features/web_worker.feature | 3 +- 4 files changed, 5 insertions(+), 30 deletions(-) diff --git a/.buildkite/basic/browser-pipeline.yml b/.buildkite/basic/browser-pipeline.yml index 79b596dfd9..1de4d04cb8 100644 --- a/.buildkite/basic/browser-pipeline.yml +++ b/.buildkite/basic/browser-pipeline.yml @@ -50,7 +50,7 @@ steps: # - label: ":browserstack: {{matrix}} non-https tests" matrix: - # - ios_11 - Skipped pending PLAT-14437 + - ios_12 - safari_16 depends_on: "browser-maze-runner-bs" timeout_in_minutes: 30 diff --git a/test/browser/features/fixtures/browser_errors.yml b/test/browser/features/fixtures/browser_errors.yml index 610b2d2227..e3d1e46b42 100644 --- a/test/browser/features/fixtures/browser_errors.yml +++ b/test/browser/features/fixtures/browser_errors.yml @@ -103,33 +103,7 @@ safari_16: lineNumber: 18 columnNumber: 25 -ios_10: - handled: - errorClass: 'ReferenceError' - errorMessage: "Can't find variable: foo" - unhandled_syntax: - errorClass: 'SyntaxError' - errorMessage: "Unexpected token '!'. Parse error." - lineNumber: 18 - columnNumber: 0 - file: '/unhandled/script/a.html' - unhandled_thrown: - errorClass: 'Error' - errorMessage: "bad things" - lineNumber: 18 - columnNumber: 22 - unhandled_undefined_function: - errorClass: 'ReferenceError' - errorMessage: "Can't find variable: nevergoingtoexist_notinamillionyears" - lineNumber: 18 - columnNumber: 43 - unhandled_malformed_uri: - errorClass: 'URIError' - errorMessage: URI error - lineNumber: 18 - columnNumber: 25 - -ios_11: +ios_12: handled: errorClass: 'ReferenceError' errorMessage: "Can't find variable: foo" diff --git a/test/browser/features/integrity.feature b/test/browser/features/integrity.feature index 1e5eba9994..009fa26811 100644 --- a/test/browser/features/integrity.feature +++ b/test/browser/features/integrity.feature @@ -1,4 +1,4 @@ -@skip_ie_11 @skip_ios_10 @skip_safari_10 @skip_safari_16 @skip_edge_17 @skip_chrome_43 @skip_http +@skip_ie_11 @skip_safari_10 @skip_safari_16 @skip_edge_17 @skip_chrome_43 @skip_http Feature: Bugsnag-Integrity header Scenario: Integrity headers are set when setPayloadChecksums is true diff --git a/test/browser/features/web_worker.feature b/test/browser/features/web_worker.feature index 36bb588f62..8d59e23aec 100644 --- a/test/browser/features/web_worker.feature +++ b/test/browser/features/web_worker.feature @@ -47,7 +47,8 @@ Feature: worker notifier And I wait to receive a session Then the session is a valid browser payload for the session tracking API - @skip_safari_16 + # Not supported on Safari https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Integrity-Policy#browser_compatibility + @skip_safari_16 @skip_ios_12 Scenario: Integrity headers are set when setPayloadChecksums is true When I navigate to the test URL "/web_worker/integrity" And I wait to receive an error From 9d9ebdc46d86396bca3a1df6e4a9db53d1580a4e Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Wed, 1 Oct 2025 16:42:39 +0100 Subject: [PATCH 24/38] Merge branch 'next' into integration/typescript --- .buildkite/basic/browser-pipeline.yml | 2 +- .buildkite/basic/expo-pipeline.yml | 10 +- .github/workflows/aws-lambda.yml | 2 +- .github/workflows/branch-sync.yml | 26 + .github/workflows/codeql.yml | 6 +- .github/workflows/scorecard.yml | 2 +- .github/workflows/test-electron.yml | 2 +- .github/workflows/update-dependencies.yml | 2 +- CHANGELOG.md | 12 +- lerna.json | 2 +- package-lock.json | 818 +++++++++--------- packages/browser/package.json | 38 +- packages/core/package.json | 2 +- packages/core/src/client.ts | 14 + packages/core/src/event.ts | 13 + packages/core/test/event.test.ts | 24 + .../core/test/grouping-discriminator.test.ts | 172 ++++ packages/delivery-electron/package.json | 8 +- packages/delivery-fetch/package.json | 7 +- packages/delivery-node/package.json | 4 +- packages/delivery-react-native/package.json | 9 +- .../delivery-react-native/src/delivery.js | 1 + .../test/delivery.test.ts | 1 + .../delivery-xml-http-request/package.json | 4 +- packages/derecursify/package.json | 6 +- packages/electron-network-status/package.json | 6 +- packages/electron-test-helpers/package.json | 4 +- packages/electron/package.json | 56 +- packages/in-flight/package.json | 4 +- packages/js/package.json | 6 +- packages/node/package.json | 30 +- packages/plugin-angular/package.json | 4 +- packages/plugin-app-duration/package.json | 4 +- packages/plugin-aws-lambda/package.json | 8 +- packages/plugin-browser-context/package.json | 4 +- packages/plugin-browser-device/package.json | 4 +- packages/plugin-browser-request/package.json | 4 +- packages/plugin-browser-session/package.json | 4 +- packages/plugin-client-ip/package.json | 4 +- .../plugin-console-breadcrumbs/package.json | 4 +- packages/plugin-contextualize/package.json | 4 +- .../package.json | 6 +- packages/plugin-electron-app/package.json | 6 +- .../client-state-manager.js | 12 +- .../package.json | 4 +- .../test/client-state-manager.test.ts | 62 +- .../client-state-persistence.js | 8 + .../package.json | 8 +- .../src/api.c | 33 + ...ugsnag_electron_client_state_persistence.c | 19 + ...ugsnag_electron_client_state_persistence.h | 7 + .../deliver-minidumps.js | 1 + .../event-serialisation.js | 5 + .../package.json | 6 +- packages/plugin-electron-device/package.json | 6 +- .../plugin-electron-ipc/bugsnag-ipc-main.js | 7 +- .../bugsnag-ipc-renderer.js | 8 + packages/plugin-electron-ipc/package.json | 4 +- .../test/bugsnag-ipc-main.test.ts | 19 + .../test/bugsnag-ipc-renderer.test.ts | 10 + .../package.json | 6 +- .../package.json | 4 +- .../package.json | 6 +- .../package.json | 4 +- .../plugin-electron-process-info/package.json | 4 +- .../client-state-updates.js | 7 + .../package.json | 4 +- .../test/client-state-updates.test.ts | 18 + .../package.json | 8 +- .../renderer-event-data.js | 2 + .../test/renderer-event-data.test.ts | 16 +- .../package.json | 6 +- .../package.json | 6 +- packages/plugin-electron-session/package.json | 8 +- packages/plugin-express/package.json | 4 +- packages/plugin-hono/package.json | 4 +- .../plugin-inline-script-content/package.json | 4 +- .../package.json | 4 +- packages/plugin-intercept/package.json | 4 +- .../package.json | 4 +- packages/plugin-koa/package.json | 4 +- .../package.json | 4 +- .../plugin-network-breadcrumbs/package.json | 4 +- packages/plugin-node-device/package.json | 4 +- packages/plugin-node-in-project/package.json | 2 +- .../plugin-node-surrounding-code/package.json | 4 +- .../package.json | 4 +- .../package.json | 4 +- .../package.json | 11 +- .../src/client-sync.js | 10 + .../test/client-sync.test.ts | 28 + .../package.json | 4 +- .../package.json | 4 +- .../plugin-react-native-hermes/package.json | 4 +- .../package.json | 4 +- .../package.json | 4 +- .../plugin-react-native-session/package.json | 4 +- .../package.json | 4 +- packages/plugin-react-navigation/package.json | 4 +- packages/plugin-react/package.json | 4 +- packages/plugin-restify/package.json | 4 +- packages/plugin-server-session/package.json | 4 +- packages/plugin-simple-throttle/package.json | 4 +- .../package.json | 4 +- .../plugin-strip-project-root/package.json | 2 +- .../plugin-strip-query-string/package.json | 4 +- packages/plugin-vue/package.json | 4 +- packages/plugin-window-onerror/package.json | 4 +- .../package.json | 4 +- .../android/BugsnagReactNativeImpl.java | 10 + .../bugsnag/android/NativeBugsnagImpl.java | 5 + .../bugsnag/android/BugsnagReactNative.java | 5 + .../BugsnagEventDeserializer.m | 1 + .../BugsnagReactNative/BugsnagReactNative.mm | 5 + .../BugsnagReactNativeEmitter.m | 9 + packages/react-native/package.json | 24 +- packages/react-native/src/NativeBugsnag.ts | 2 + packages/web-worker/package.json | 16 +- scripts/generate-react-native-fixture.js | 1 + .../features/fixtures/browser_errors.yml | 28 +- .../grouping_discriminator/script/index.html | 44 + .../fixtures/strict_mode/script/a.html | 33 - .../script/notifier-does-not-error.html | 50 ++ .../features/grouping_discriminator.feature | 15 + test/browser/features/integrity.feature | 2 +- test/browser/features/steps/browser_steps.rb | 21 + test/browser/features/strict_mode.feature | 3 +- test/browser/features/web_worker.feature | 3 +- .../features/grouping-discriminator.feature | 39 + .../features/support/steps/request-steps.js | 8 + test/electron/fixtures/app/src/index.html | 4 + test/electron/fixtures/app/src/main.js | 4 + test/electron/fixtures/app/src/preload.js | 3 + test/electron/fixtures/app/src/renderer.js | 8 + .../GroupingDiscriminatorNativeScenario.kt | 25 + .../project.pbxproj | 6 + .../GroupingDiscriminatorNativeScenario.h | 6 + .../GroupingDiscriminatorNativeScenario.m | 15 + .../Scenarios/GroupingDiscriminatorScenario.h | 6 + .../Scenarios/GroupingDiscriminatorScenario.m | 11 + .../GroupingDiscriminatorNativeScenario.js | 18 + .../GroupingDiscriminatorScenario.js | 32 + .../scenario-launcher/src/scenarios/index.js | 4 + .../features/grouping-discriminator.feature | 23 + .../features/steps/react-native-steps.rb | 4 + 145 files changed, 1592 insertions(+), 741 deletions(-) create mode 100644 .github/workflows/branch-sync.yml create mode 100644 packages/core/test/grouping-discriminator.test.ts create mode 100644 test/browser/features/fixtures/grouping_discriminator/script/index.html delete mode 100644 test/browser/features/fixtures/strict_mode/script/a.html create mode 100644 test/browser/features/fixtures/strict_mode/script/notifier-does-not-error.html create mode 100644 test/browser/features/grouping_discriminator.feature create mode 100644 test/electron/features/grouping-discriminator.feature create mode 100644 test/react-native/features/fixtures/scenario-launcher/android/src/main/java/com/bugsnag/reactnative/test/scenarios/GroupingDiscriminatorNativeScenario.kt create mode 100644 test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.h create mode 100644 test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.m create mode 100644 test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.h create mode 100644 test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.m create mode 100644 test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorNativeScenario.js create mode 100644 test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorScenario.js create mode 100644 test/react-native/features/grouping-discriminator.feature diff --git a/.buildkite/basic/browser-pipeline.yml b/.buildkite/basic/browser-pipeline.yml index 9501b414ce..71543d44cf 100644 --- a/.buildkite/basic/browser-pipeline.yml +++ b/.buildkite/basic/browser-pipeline.yml @@ -50,7 +50,7 @@ steps: # - label: ":browserstack: {{matrix}} non-https tests" matrix: - # - ios_11 Skipped pending PLAT-14437 + - ios_12 - safari_16 depends_on: "browser-maze-runner-bs" timeout_in_minutes: 30 diff --git a/.buildkite/basic/expo-pipeline.yml b/.buildkite/basic/expo-pipeline.yml index 79c1e71b15..80ab7586b8 100644 --- a/.buildkite/basic/expo-pipeline.yml +++ b/.buildkite/basic/expo-pipeline.yml @@ -8,29 +8,29 @@ steps: depends_on: "publish-js" trigger: "bugsnag-expo" build: - branch: "v53/next" + branch: "v54/next" env: BUGSNAG_JS_BRANCH: "${BUILDKITE_BRANCH}" BUGSNAG_JS_COMMIT: "${BUILDKITE_COMMIT}" # a branch name that's safe to use as a docker cache identifier BUGSNAG_JS_CACHE_SAFE_BRANCH_NAME: "${BRANCH_NAME}" - - label: "@bugsnag/expo v52/next" + - label: "@bugsnag/expo v53/next" depends_on: "publish-js" trigger: "bugsnag-expo" build: - branch: "v52/next" + branch: "v53/next" env: BUGSNAG_JS_BRANCH: "${BUILDKITE_BRANCH}" BUGSNAG_JS_COMMIT: "${BUILDKITE_COMMIT}" # a branch name that's safe to use as a docker cache identifier BUGSNAG_JS_CACHE_SAFE_BRANCH_NAME: "${BRANCH_NAME}" - - label: "@bugsnag/expo v51/next" + - label: "@bugsnag/expo v52/next" depends_on: "publish-js" trigger: "bugsnag-expo" build: - branch: "v51/next" + branch: "v52/next" env: BUGSNAG_JS_BRANCH: "${BUILDKITE_BRANCH}" BUGSNAG_JS_COMMIT: "${BUILDKITE_COMMIT}" diff --git a/.github/workflows/aws-lambda.yml b/.github/workflows/aws-lambda.yml index d15a168d1b..1e24dcfc37 100644 --- a/.github/workflows/aws-lambda.yml +++ b/.github/workflows/aws-lambda.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 - name: Install Ruby - uses: ruby/setup-ruby@44511735964dcb71245e7e55f72539531f7bc0eb + uses: ruby/setup-ruby@0481980f17b760ef6bca5e8c55809102a0af1e5a with: ruby-version: '3.1' diff --git a/.github/workflows/branch-sync.yml b/.github/workflows/branch-sync.yml new file mode 100644 index 0000000000..9971d40edb --- /dev/null +++ b/.github/workflows/branch-sync.yml @@ -0,0 +1,26 @@ +name: Sync main to next +on: + push: + branches: [main] + +jobs: + sync: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Sync main to next + uses: bugsnag/github-action-branch-sync@v1 + with: + source-branch: main + target-branch: next + labels: automation + reviewers: ${{ secrets.AUTOMATION_REVIEWERS }} + team-reviewers: ${{ secrets.AUTOMATION_TEAM_REVIEWERS }} + github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 3ad2509a1d..6f71998bd2 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -47,7 +47,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 + uses: github/codeql-action/init@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -61,7 +61,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 + uses: github/codeql-action/autobuild@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -74,6 +74,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 + uses: github/codeql-action/analyze@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index c432b30f5f..7d50bbf326 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -68,7 +68,7 @@ jobs: # Upload the results to GitHub's code scanning dashboard (optional). # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@192325c86100d080feab897ff886c34abd4c83a3 # v3.30.3 + uses: github/codeql-action/upload-sarif@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 with: sarif_file: results.sarif diff --git a/.github/workflows/test-electron.yml b/.github/workflows/test-electron.yml index d019f04070..b6cbaaefa9 100644 --- a/.github/workflows/test-electron.yml +++ b/.github/workflows/test-electron.yml @@ -30,7 +30,7 @@ jobs: if: ${{ !env.ACT }} run: | echo "::set-output name=dir::$(npm config get cache)" - - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 id: npm-cache if: ${{ !env.ACT }} with: diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml index c79454e136..c7b01021f5 100644 --- a/.github/workflows/update-dependencies.yml +++ b/.github/workflows/update-dependencies.yml @@ -40,7 +40,7 @@ jobs: - run: git submodule update --init --recursive - name: Install ruby - uses: ruby/setup-ruby@44511735964dcb71245e7e55f72539531f7bc0eb # v1.257.0 + uses: ruby/setup-ruby@0481980f17b760ef6bca5e8c55809102a0af1e5a # v1.263.0 with: ruby-version: 2.7 diff --git a/CHANGELOG.md b/CHANGELOG.md index 032b6f8d31..d2935cbcad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog -## [Unreleased] +## [8.6.0] - 2025-09-25 + +### Added + +- Add additional grouping discriminator property to events [#2544](https://github.com/bugsnag/bugsnag-js/pull/2544) +- (react-native) Handle additional grouping discriminator [#2557](https://github.com/bugsnag/bugsnag-js/pull/2557) +- (electron) Handle additional grouping discriminator [#2561](https://github.com/bugsnag/bugsnag-js/pull/2561) ### Changed @@ -11,6 +17,10 @@ - (plugin-window-onerror) Guard against errors when trying to call previous handler [#2551](https://github.com/bugsnag/bugsnag-js/pull/2551) +### Dependencies + +Update bugsnag-cocoa to [v6.34.0](https//github.com/bugsnag/bugsnag-cocoa/releases/tag/v6.34.0) [#2571](https://github.com/bugsnag/bugsnag-js/pull/2571) + ## [8.5.0] - 2025-09-01 ### Added diff --git a/lerna.json b/lerna.json index daf0f13606..ef91fc39af 100644 --- a/lerna.json +++ b/lerna.json @@ -2,6 +2,6 @@ "packages": [ "packages/*" ], - "version": "8.5.0", + "version": "8.6.0", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6488ac64bc..6a78938190 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44110,28 +44110,28 @@ }, "packages/browser": { "name": "@bugsnag/browser", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "devDependencies": { - "@bugsnag/delivery-xml-http-request": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-browser-context": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-request": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-inline-script-content": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-navigation-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-simple-throttle": "^8.4.0", - "@bugsnag/plugin-strip-query-string": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0", + "@bugsnag/delivery-xml-http-request": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-browser-context": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-request": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-inline-script-content": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-navigation-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-simple-throttle": "^8.6.0", + "@bugsnag/plugin-strip-query-string": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", @@ -44176,7 +44176,7 @@ }, "packages/core": { "name": "@bugsnag/core", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/cuid": "^3.0.0", @@ -44323,15 +44323,15 @@ }, "packages/delivery-electron": { "name": "@bugsnag/delivery-electron", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/json-payload": "^8.4.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" }, "peerDependencies": { "@bugsnag/electron-network-status": "^8.0.0" @@ -44339,32 +44339,35 @@ }, "packages/delivery-fetch": { "name": "@bugsnag/delivery-fetch", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/json-payload": "^8.4.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0" } }, "packages/delivery-node": { "name": "@bugsnag/delivery-node", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/json-payload": "^8.4.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "packages/delivery-react-native": { "name": "@bugsnag/delivery-react-native", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/derecursify": "^8.4.0" }, "peerDependencies": { @@ -44373,11 +44376,11 @@ }, "packages/delivery-x-domain-request": { "name": "@bugsnag/delivery-x-domain-request", - "version": "8.4.0", + "version": "8.6.0", "extraneous": true, "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -44385,13 +44388,13 @@ }, "packages/delivery-xml-http-request": { "name": "@bugsnag/delivery-xml-http-request", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/json-payload": "^8.4.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "packages/derecursify": { @@ -44401,40 +44404,40 @@ }, "packages/electron": { "name": "@bugsnag/electron", - "version": "8.5.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-electron": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-electron": "^8.6.0", "@bugsnag/electron-filestore": "^8.0.0", - "@bugsnag/electron-network-status": "^8.4.0", + "@bugsnag/electron-network-status": "^8.6.0", "@bugsnag/path-normalizer": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-app": "^8.4.0", - "@bugsnag/plugin-electron-app-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", - "@bugsnag/plugin-electron-client-state-persistence": "^8.4.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-app": "^8.6.0", + "@bugsnag/plugin-electron-app-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", + "@bugsnag/plugin-electron-client-state-persistence": "^8.6.0", "@bugsnag/plugin-electron-deliver-minidumps": "^8.5.0", - "@bugsnag/plugin-electron-device": "^8.4.0", + "@bugsnag/plugin-electron-device": "^8.6.0", "@bugsnag/plugin-electron-ipc": "^8.5.0", - "@bugsnag/plugin-electron-net-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-preload-error": "^8.4.0", - "@bugsnag/plugin-electron-process-info": "^8.4.0", - "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.4.0", - "@bugsnag/plugin-electron-renderer-event-data": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0", - "@bugsnag/plugin-electron-session": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-internal-callback-marker": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0" + "@bugsnag/plugin-electron-net-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-preload-error": "^8.6.0", + "@bugsnag/plugin-electron-process-info": "^8.6.0", + "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.6.0", + "@bugsnag/plugin-electron-renderer-event-data": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0", + "@bugsnag/plugin-electron-session": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-internal-callback-marker": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0" } }, "packages/electron-filestore": { @@ -44444,11 +44447,11 @@ }, "packages/electron-network-status": { "name": "@bugsnag/electron-network-status", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -44456,21 +44459,21 @@ }, "packages/electron-test-helpers": { "name": "@bugsnag/electron-test-helpers", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "packages/in-flight": { "name": "@bugsnag/in-flight", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/cuid": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -44478,11 +44481,11 @@ }, "packages/js": { "name": "@bugsnag/js", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/browser": "^8.4.0", - "@bugsnag/node": "^8.4.0" + "@bugsnag/browser": "^8.6.0", + "@bugsnag/node": "^8.6.0" }, "devDependencies": { "@babel/cli": "^7.0.0" @@ -44543,29 +44546,29 @@ }, "packages/node": { "name": "@bugsnag/node", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "byline": "^5.0.0", "error-stack-parser": "^2.0.3", "pump": "^3.0.0", "stack-generator": "^2.0.3" }, "devDependencies": { - "@bugsnag/delivery-node": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-contextualize": "^8.4.0", - "@bugsnag/plugin-intercept": "^8.4.0", - "@bugsnag/plugin-node-device": "^8.4.0", - "@bugsnag/plugin-node-in-project": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-server-session": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0", + "@bugsnag/delivery-node": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-contextualize": "^8.6.0", + "@bugsnag/plugin-intercept": "^8.6.0", + "@bugsnag/plugin-node-device": "^8.6.0", + "@bugsnag/plugin-node-in-project": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-server-session": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0", "@types/node": "^18.19.74" } }, @@ -44618,7 +44621,7 @@ }, "packages/plugin-angular": { "name": "@bugsnag/plugin-angular", - "version": "8.5.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -44631,7 +44634,7 @@ "@angular/compiler": "^19.2.2", "@angular/compiler-cli": "^19.2.2", "@angular/core": "^19.0.0", - "@bugsnag/js": "^8.4.0", + "@bugsnag/js": "^8.6.0", "ng-packagr": "^19.1.0", "rxjs": "~7.8.0", "typescript": "~5.6.2", @@ -47750,10 +47753,10 @@ }, "packages/plugin-app-duration": { "name": "@bugsnag/plugin-app-duration", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47761,14 +47764,14 @@ }, "packages/plugin-aws-lambda": { "name": "@bugsnag/plugin-aws-lambda", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/in-flight": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0" + "@bugsnag/in-flight": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/aws-lambda": "^8.10.76", "@vendia/serverless-express": "^4.10.1", "express": "^4.18.2" @@ -47779,10 +47782,10 @@ }, "packages/plugin-browser-context": { "name": "@bugsnag/plugin-browser-context", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47790,13 +47793,13 @@ }, "packages/plugin-browser-device": { "name": "@bugsnag/plugin-browser-device", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/cuid": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47804,10 +47807,10 @@ }, "packages/plugin-browser-request": { "name": "@bugsnag/plugin-browser-request", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47815,10 +47818,10 @@ }, "packages/plugin-browser-session": { "name": "@bugsnag/plugin-browser-session", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47826,10 +47829,10 @@ }, "packages/plugin-client-ip": { "name": "@bugsnag/plugin-client-ip", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47837,10 +47840,10 @@ }, "packages/plugin-console-breadcrumbs": { "name": "@bugsnag/plugin-console-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47848,10 +47851,10 @@ }, "packages/plugin-contextualize": { "name": "@bugsnag/plugin-contextualize", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47859,15 +47862,15 @@ }, "packages/plugin-electron-app": { "name": "@bugsnag/plugin-electron-app", - "version": "8.4.0", + "version": "8.6.0", "hasInstallScript": true, "license": "MIT", "dependencies": { "bindings": "^1.5.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47875,14 +47878,14 @@ }, "packages/plugin-electron-app-breadcrumbs": { "name": "@bugsnag/plugin-electron-app-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "lodash.debounce": "^4.0.8" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47890,10 +47893,10 @@ }, "packages/plugin-electron-client-state-manager": { "name": "@bugsnag/plugin-electron-client-state-manager", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47901,16 +47904,16 @@ }, "packages/plugin-electron-client-state-persistence": { "name": "@bugsnag/plugin-electron-client-state-persistence", - "version": "8.4.0", + "version": "8.6.0", "hasInstallScript": true, "license": "MIT", "dependencies": { "bindings": "^1.5.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", "@types/bindings": "^1.5.0" }, "peerDependencies": { @@ -47919,15 +47922,15 @@ }, "packages/plugin-electron-deliver-minidumps": { "name": "@bugsnag/plugin-electron-deliver-minidumps", - "version": "8.5.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/json-payload": "^8.4.0", "form-data": "^4.0.4" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0" }, "peerDependencies": { "@bugsnag/electron-network-status": "^8.0.0" @@ -47935,11 +47938,11 @@ }, "packages/plugin-electron-device": { "name": "@bugsnag/plugin-electron-device", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -47947,13 +47950,13 @@ }, "packages/plugin-electron-ipc": { "name": "@bugsnag/plugin-electron-ipc", - "version": "8.5.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/safe-json-stringify": "^6.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "browserify": "^17.0.0" }, "peerDependencies": { @@ -48049,11 +48052,11 @@ }, "packages/plugin-electron-net-breadcrumbs": { "name": "@bugsnag/plugin-electron-net-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48061,10 +48064,10 @@ }, "packages/plugin-electron-network-status": { "name": "@bugsnag/plugin-electron-network-status", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48072,11 +48075,11 @@ }, "packages/plugin-electron-power-monitor-breadcrumbs": { "name": "@bugsnag/plugin-electron-power-monitor-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48084,21 +48087,21 @@ }, "packages/plugin-electron-preload-error": { "name": "@bugsnag/plugin-electron-preload-error", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/path-normalizer": "^8.4.0" }, "devDependencies": { - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "packages/plugin-electron-process-info": { "name": "@bugsnag/plugin-electron-process-info", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48106,10 +48109,10 @@ }, "packages/plugin-electron-renderer-client-state-updates": { "name": "@bugsnag/plugin-electron-renderer-client-state-updates", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48117,12 +48120,12 @@ }, "packages/plugin-electron-renderer-event-data": { "name": "@bugsnag/plugin-electron-renderer-event-data", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0", @@ -48131,20 +48134,20 @@ }, "packages/plugin-electron-renderer-strip-project-root": { "name": "@bugsnag/plugin-electron-renderer-strip-project-root", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "packages/plugin-electron-screen-breadcrumbs": { "name": "@bugsnag/plugin-electron-screen-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48152,14 +48155,14 @@ }, "packages/plugin-electron-session": { "name": "@bugsnag/plugin-electron-session", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { - "@bugsnag/plugin-browser-session": "^8.4.0" + "@bugsnag/plugin-browser-session": "^8.6.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48167,10 +48170,10 @@ }, "packages/plugin-express": { "name": "@bugsnag/plugin-express", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/express": "4.17.13" }, "peerDependencies": { @@ -48179,10 +48182,10 @@ }, "packages/plugin-hono": { "name": "@bugsnag/plugin-hono", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "hono": "^4.6.3", "typescript": "^5.2.2" }, @@ -48206,10 +48209,10 @@ }, "packages/plugin-inline-script-content": { "name": "@bugsnag/plugin-inline-script-content", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48217,10 +48220,10 @@ }, "packages/plugin-interaction-breadcrumbs": { "name": "@bugsnag/plugin-interaction-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48228,10 +48231,10 @@ }, "packages/plugin-intercept": { "name": "@bugsnag/plugin-intercept", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48239,10 +48242,10 @@ }, "packages/plugin-internal-callback-marker": { "name": "@bugsnag/plugin-internal-callback-marker", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48250,10 +48253,10 @@ }, "packages/plugin-koa": { "name": "@bugsnag/plugin-koa", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/koa": "2.13.4" }, "peerDependencies": { @@ -48262,10 +48265,10 @@ }, "packages/plugin-navigation-breadcrumbs": { "name": "@bugsnag/plugin-navigation-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48273,10 +48276,10 @@ }, "packages/plugin-network-breadcrumbs": { "name": "@bugsnag/plugin-network-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48284,10 +48287,10 @@ }, "packages/plugin-node-device": { "name": "@bugsnag/plugin-node-device", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48295,7 +48298,7 @@ }, "packages/plugin-node-in-project": { "name": "@bugsnag/plugin-node-in-project", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/path-normalizer": "^8.4.0" @@ -48303,14 +48306,14 @@ }, "packages/plugin-node-surrounding-code": { "name": "@bugsnag/plugin-node-surrounding-code", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "byline": "^5.0.0", "pump": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48318,10 +48321,10 @@ }, "packages/plugin-node-uncaught-exception": { "name": "@bugsnag/plugin-node-uncaught-exception", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48329,10 +48332,10 @@ }, "packages/plugin-node-unhandled-rejection": { "name": "@bugsnag/plugin-node-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48340,10 +48343,10 @@ }, "packages/plugin-react": { "name": "@bugsnag/plugin-react", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48356,22 +48359,21 @@ }, "packages/plugin-react-native-client-sync": { "name": "@bugsnag/plugin-react-native-client-sync", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.4.0", + "dependencies": { "@bugsnag/derecursify": "^8.4.0" }, - "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "devDependencies": { + "@bugsnag/core": "^8.6.0" } }, "packages/plugin-react-native-event-sync": { "name": "@bugsnag/plugin-react-native-event-sync", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48379,10 +48381,10 @@ }, "packages/plugin-react-native-global-error-handler": { "name": "@bugsnag/plugin-react-native-global-error-handler", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" }, "peerDependencies": { @@ -48391,10 +48393,10 @@ }, "packages/plugin-react-native-hermes": { "name": "@bugsnag/plugin-react-native-hermes", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" }, "peerDependencies": { @@ -48403,10 +48405,10 @@ }, "packages/plugin-react-native-navigation": { "name": "@bugsnag/plugin-react-native-navigation", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "react-native-navigation": "^7.0.0" }, "peerDependencies": { @@ -48421,10 +48423,10 @@ }, "packages/plugin-react-native-orientation-breadcrumbs": { "name": "@bugsnag/plugin-react-native-orientation-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" }, "peerDependencies": { @@ -48433,10 +48435,10 @@ }, "packages/plugin-react-native-session": { "name": "@bugsnag/plugin-react-native-session", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" }, "peerDependencies": { @@ -48445,10 +48447,10 @@ }, "packages/plugin-react-native-unhandled-rejection": { "name": "@bugsnag/plugin-react-native-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "promise": "^8.0.2" }, "peerDependencies": { @@ -48457,10 +48459,10 @@ }, "packages/plugin-react-navigation": { "name": "@bugsnag/plugin-react-navigation", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@react-navigation/native": "^5.7.3", "@types/react": "^16.9.49", "@types/react-test-renderer": "^16.9.3", @@ -48479,10 +48481,10 @@ }, "packages/plugin-restify": { "name": "@bugsnag/plugin-restify", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/restify": "^8.4.2" }, "peerDependencies": { @@ -48491,13 +48493,13 @@ }, "packages/plugin-server-session": { "name": "@bugsnag/plugin-server-session", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "backo": "^1.1.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48505,10 +48507,10 @@ }, "packages/plugin-simple-throttle": { "name": "@bugsnag/plugin-simple-throttle", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48516,10 +48518,10 @@ }, "packages/plugin-stackframe-path-normaliser": { "name": "@bugsnag/plugin-stackframe-path-normaliser", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48527,7 +48529,7 @@ }, "packages/plugin-strip-project-root": { "name": "@bugsnag/plugin-strip-project-root", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "dependencies": { "@bugsnag/path-normalizer": "^8.4.0" @@ -48535,10 +48537,10 @@ }, "packages/plugin-strip-query-string": { "name": "@bugsnag/plugin-strip-query-string", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48546,10 +48548,10 @@ }, "packages/plugin-vue": { "name": "@bugsnag/plugin-vue", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48562,10 +48564,10 @@ }, "packages/plugin-window-onerror": { "name": "@bugsnag/plugin-window-onerror", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48573,10 +48575,10 @@ }, "packages/plugin-window-unhandled-rejection": { "name": "@bugsnag/plugin-window-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" @@ -48584,20 +48586,20 @@ }, "packages/react-native": { "name": "@bugsnag/react-native", - "version": "8.4.0", - "license": "MIT", - "dependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-react-native": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-react": "^8.4.0", - "@bugsnag/plugin-react-native-client-sync": "^8.4.0", - "@bugsnag/plugin-react-native-event-sync": "^8.4.0", - "@bugsnag/plugin-react-native-global-error-handler": "^8.4.0", - "@bugsnag/plugin-react-native-hermes": "^8.4.0", - "@bugsnag/plugin-react-native-session": "^8.4.0", - "@bugsnag/plugin-react-native-unhandled-rejection": "^8.4.0", + "version": "8.6.0", + "license": "MIT", + "dependencies": { + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-react-native": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-react": "^8.6.0", + "@bugsnag/plugin-react-native-client-sync": "^8.6.0", + "@bugsnag/plugin-react-native-event-sync": "^8.6.0", + "@bugsnag/plugin-react-native-global-error-handler": "^8.6.0", + "@bugsnag/plugin-react-native-hermes": "^8.6.0", + "@bugsnag/plugin-react-native-session": "^8.6.0", + "@bugsnag/plugin-react-native-unhandled-rejection": "^8.6.0", "iserror": "^0.0.2" }, "devDependencies": { @@ -48695,16 +48697,16 @@ }, "packages/web-worker": { "name": "@bugsnag/web-worker", - "version": "8.4.0", + "version": "8.6.0", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-fetch": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-fetch": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", @@ -50382,23 +50384,23 @@ "@bugsnag/browser": { "version": "file:packages/browser", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-xml-http-request": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-browser-context": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-request": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-inline-script-content": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-navigation-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-simple-throttle": "^8.4.0", - "@bugsnag/plugin-strip-query-string": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-xml-http-request": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-browser-context": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-request": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-inline-script-content": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-navigation-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-simple-throttle": "^8.6.0", + "@bugsnag/plugin-strip-query-string": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", @@ -50531,37 +50533,37 @@ "@bugsnag/delivery-electron": { "version": "file:packages/delivery-electron", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0", "@bugsnag/json-payload": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" } }, "@bugsnag/delivery-fetch": { "version": "file:packages/delivery-fetch", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/json-payload": "^8.4.0" } }, "@bugsnag/delivery-node": { "version": "file:packages/delivery-node", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/json-payload": "^8.4.0" } }, "@bugsnag/delivery-react-native": { "version": "file:packages/delivery-react-native", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/derecursify": "^8.4.0" } }, "@bugsnag/delivery-xml-http-request": { "version": "file:packages/delivery-xml-http-request", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/json-payload": "^8.4.0" } }, @@ -50571,37 +50573,37 @@ "@bugsnag/electron": { "version": "file:packages/electron", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-electron": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-electron": "^8.6.0", "@bugsnag/electron-filestore": "^8.0.0", - "@bugsnag/electron-network-status": "^8.4.0", + "@bugsnag/electron-network-status": "^8.6.0", "@bugsnag/path-normalizer": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-app": "^8.4.0", - "@bugsnag/plugin-electron-app-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", - "@bugsnag/plugin-electron-client-state-persistence": "^8.4.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-app": "^8.6.0", + "@bugsnag/plugin-electron-app-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", + "@bugsnag/plugin-electron-client-state-persistence": "^8.6.0", "@bugsnag/plugin-electron-deliver-minidumps": "^8.5.0", - "@bugsnag/plugin-electron-device": "^8.4.0", + "@bugsnag/plugin-electron-device": "^8.6.0", "@bugsnag/plugin-electron-ipc": "^8.5.0", - "@bugsnag/plugin-electron-net-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-preload-error": "^8.4.0", - "@bugsnag/plugin-electron-process-info": "^8.4.0", - "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.4.0", - "@bugsnag/plugin-electron-renderer-event-data": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0", - "@bugsnag/plugin-electron-session": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-internal-callback-marker": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0" + "@bugsnag/plugin-electron-net-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-preload-error": "^8.6.0", + "@bugsnag/plugin-electron-process-info": "^8.6.0", + "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.6.0", + "@bugsnag/plugin-electron-renderer-event-data": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0", + "@bugsnag/plugin-electron-session": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-internal-callback-marker": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0" } }, "@bugsnag/electron-filestore": { @@ -50610,20 +50612,20 @@ "@bugsnag/electron-network-status": { "version": "file:packages/electron-network-status", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" } }, "@bugsnag/electron-test-helpers": { "version": "file:packages/electron-test-helpers", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/in-flight": { "version": "file:packages/in-flight", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/cuid": "^3.0.0" } }, @@ -50631,8 +50633,8 @@ "version": "file:packages/js", "requires": { "@babel/cli": "^7.0.0", - "@bugsnag/browser": "^8.4.0", - "@bugsnag/node": "^8.4.0" + "@bugsnag/browser": "^8.6.0", + "@bugsnag/node": "^8.6.0" } }, "@bugsnag/json-payload": { @@ -50673,20 +50675,20 @@ "@bugsnag/node": { "version": "file:packages/node", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-node": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-contextualize": "^8.4.0", - "@bugsnag/plugin-intercept": "^8.4.0", - "@bugsnag/plugin-node-device": "^8.4.0", - "@bugsnag/plugin-node-in-project": "^8.4.0", - "@bugsnag/plugin-node-surrounding-code": "^8.4.0", - "@bugsnag/plugin-node-uncaught-exception": "^8.4.0", - "@bugsnag/plugin-node-unhandled-rejection": "^8.4.0", - "@bugsnag/plugin-server-session": "^8.4.0", - "@bugsnag/plugin-stackframe-path-normaliser": "^8.4.0", - "@bugsnag/plugin-strip-project-root": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-node": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-contextualize": "^8.6.0", + "@bugsnag/plugin-intercept": "^8.6.0", + "@bugsnag/plugin-node-device": "^8.6.0", + "@bugsnag/plugin-node-in-project": "^8.6.0", + "@bugsnag/plugin-node-surrounding-code": "^8.6.0", + "@bugsnag/plugin-node-uncaught-exception": "^8.6.0", + "@bugsnag/plugin-node-unhandled-rejection": "^8.6.0", + "@bugsnag/plugin-server-session": "^8.6.0", + "@bugsnag/plugin-stackframe-path-normaliser": "^8.6.0", + "@bugsnag/plugin-strip-project-root": "^8.6.0", "@types/node": "^18.19.74", "byline": "^5.0.0", "error-stack-parser": "^2.0.3", @@ -50735,7 +50737,7 @@ "@angular/compiler": "^19.2.2", "@angular/compiler-cli": "^19.2.2", "@angular/core": "^19.0.0", - "@bugsnag/js": "^8.4.0", + "@bugsnag/js": "^8.6.0", "ng-packagr": "^19.1.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", @@ -52632,15 +52634,15 @@ "@bugsnag/plugin-app-duration": { "version": "file:packages/plugin-app-duration", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-aws-lambda": { "version": "file:packages/plugin-aws-lambda", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/in-flight": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/in-flight": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", "@types/aws-lambda": "^8.10.76", "@vendia/serverless-express": "^4.10.1", "express": "^4.18.2" @@ -52649,74 +52651,74 @@ "@bugsnag/plugin-browser-context": { "version": "file:packages/plugin-browser-context", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-browser-device": { "version": "file:packages/plugin-browser-device", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/cuid": "^3.0.0" } }, "@bugsnag/plugin-browser-request": { "version": "file:packages/plugin-browser-request", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-browser-session": { "version": "file:packages/plugin-browser-session", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-client-ip": { "version": "file:packages/plugin-client-ip", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-console-breadcrumbs": { "version": "file:packages/plugin-console-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-contextualize": { "version": "file:packages/plugin-contextualize", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-app": { "version": "file:packages/plugin-electron-app", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", "bindings": "^1.5.0" } }, "@bugsnag/plugin-electron-app-breadcrumbs": { "version": "file:packages/plugin-electron-app-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", "lodash.debounce": "^4.0.8" } }, "@bugsnag/plugin-electron-client-state-manager": { "version": "file:packages/plugin-electron-client-state-manager", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-client-state-persistence": { "version": "file:packages/plugin-electron-client-state-persistence", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", "@types/bindings": "^1.5.0", "bindings": "^1.5.0" } @@ -52724,8 +52726,8 @@ "@bugsnag/plugin-electron-deliver-minidumps": { "version": "file:packages/plugin-electron-deliver-minidumps", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0", "@bugsnag/json-payload": "^8.4.0", "form-data": "^4.0.4" } @@ -52733,14 +52735,14 @@ "@bugsnag/plugin-electron-device": { "version": "file:packages/plugin-electron-device", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-ipc": { "version": "file:packages/plugin-electron-ipc", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/safe-json-stringify": "^6.0.0", "browserify": "^17.0.0" }, @@ -52831,83 +52833,83 @@ "@bugsnag/plugin-electron-net-breadcrumbs": { "version": "file:packages/plugin-electron-net-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-network-status": { "version": "file:packages/plugin-electron-network-status", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-power-monitor-breadcrumbs": { "version": "file:packages/plugin-electron-power-monitor-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-preload-error": { "version": "file:packages/plugin-electron-preload-error", "requires": { - "@bugsnag/electron-test-helpers": "^8.4.0", + "@bugsnag/electron-test-helpers": "^8.6.0", "@bugsnag/path-normalizer": "^8.4.0" } }, "@bugsnag/plugin-electron-process-info": { "version": "file:packages/plugin-electron-process-info", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-renderer-client-state-updates": { "version": "file:packages/plugin-electron-renderer-client-state-updates", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-electron-renderer-event-data": { "version": "file:packages/plugin-electron-renderer-event-data", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0" } }, "@bugsnag/plugin-electron-renderer-strip-project-root": { "version": "file:packages/plugin-electron-renderer-strip-project-root", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-screen-breadcrumbs": { "version": "file:packages/plugin-electron-screen-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" } }, "@bugsnag/plugin-electron-session": { "version": "file:packages/plugin-electron-session", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0" } }, "@bugsnag/plugin-express": { "version": "file:packages/plugin-express", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/express": "4.17.13" } }, "@bugsnag/plugin-hono": { "version": "file:packages/plugin-hono", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "hono": "^4.6.3", "typescript": "^5.2.2" }, @@ -52923,50 +52925,50 @@ "@bugsnag/plugin-inline-script-content": { "version": "file:packages/plugin-inline-script-content", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-interaction-breadcrumbs": { "version": "file:packages/plugin-interaction-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-intercept": { "version": "file:packages/plugin-intercept", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-internal-callback-marker": { "version": "file:packages/plugin-internal-callback-marker", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-koa": { "version": "file:packages/plugin-koa", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/koa": "2.13.4" } }, "@bugsnag/plugin-navigation-breadcrumbs": { "version": "file:packages/plugin-navigation-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-network-breadcrumbs": { "version": "file:packages/plugin-network-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-node-device": { "version": "file:packages/plugin-node-device", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-node-in-project": { @@ -52978,7 +52980,7 @@ "@bugsnag/plugin-node-surrounding-code": { "version": "file:packages/plugin-node-surrounding-code", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "byline": "^5.0.0", "pump": "^3.0.0" } @@ -52986,80 +52988,80 @@ "@bugsnag/plugin-node-uncaught-exception": { "version": "file:packages/plugin-node-uncaught-exception", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-node-unhandled-rejection": { "version": "file:packages/plugin-node-unhandled-rejection", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react": { "version": "file:packages/plugin-react", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react-native-client-sync": { "version": "file:packages/plugin-react-native-client-sync", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@bugsnag/derecursify": "^8.4.0" } }, "@bugsnag/plugin-react-native-event-sync": { "version": "file:packages/plugin-react-native-event-sync", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-react-native-global-error-handler": { "version": "file:packages/plugin-react-native-global-error-handler", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" } }, "@bugsnag/plugin-react-native-hermes": { "version": "file:packages/plugin-react-native-hermes", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" } }, "@bugsnag/plugin-react-native-navigation": { "version": "file:packages/plugin-react-native-navigation", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "react-native-navigation": "^7.0.0" } }, "@bugsnag/plugin-react-native-orientation-breadcrumbs": { "version": "file:packages/plugin-react-native-orientation-breadcrumbs", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" } }, "@bugsnag/plugin-react-native-session": { "version": "file:packages/plugin-react-native-session", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" } }, "@bugsnag/plugin-react-native-unhandled-rejection": { "version": "file:packages/plugin-react-native-unhandled-rejection", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "promise": "^8.0.2" } }, "@bugsnag/plugin-react-navigation": { "version": "file:packages/plugin-react-navigation", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@react-navigation/native": "^5.7.3", "@types/react": "^16.9.49", "@types/react-test-renderer": "^16.9.3", @@ -53070,27 +53072,27 @@ "@bugsnag/plugin-restify": { "version": "file:packages/plugin-restify", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/restify": "^8.4.2" } }, "@bugsnag/plugin-server-session": { "version": "file:packages/plugin-server-session", "requires": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "backo": "^1.1.0" } }, "@bugsnag/plugin-simple-throttle": { "version": "file:packages/plugin-simple-throttle", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-stackframe-path-normaliser": { "version": "file:packages/plugin-stackframe-path-normaliser", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-strip-project-root": { @@ -53102,42 +53104,42 @@ "@bugsnag/plugin-strip-query-string": { "version": "file:packages/plugin-strip-query-string", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-vue": { "version": "file:packages/plugin-vue", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-window-onerror": { "version": "file:packages/plugin-window-onerror", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/plugin-window-unhandled-rejection": { "version": "file:packages/plugin-window-unhandled-rejection", "requires": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } }, "@bugsnag/react-native": { "version": "file:packages/react-native", "requires": { "@babel/cli": "^7.0.0", - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-react-native": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-react": "^8.4.0", - "@bugsnag/plugin-react-native-client-sync": "^8.4.0", - "@bugsnag/plugin-react-native-event-sync": "^8.4.0", - "@bugsnag/plugin-react-native-global-error-handler": "^8.4.0", - "@bugsnag/plugin-react-native-hermes": "^8.4.0", - "@bugsnag/plugin-react-native-session": "^8.4.0", - "@bugsnag/plugin-react-native-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-react-native": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-react": "^8.6.0", + "@bugsnag/plugin-react-native-client-sync": "^8.6.0", + "@bugsnag/plugin-react-native-event-sync": "^8.6.0", + "@bugsnag/plugin-react-native-global-error-handler": "^8.6.0", + "@bugsnag/plugin-react-native-hermes": "^8.6.0", + "@bugsnag/plugin-react-native-session": "^8.6.0", + "@bugsnag/plugin-react-native-unhandled-rejection": "^8.6.0", "@types/react-native": "0.67.8", "iserror": "^0.0.2", "react-native": "^0.63.4", @@ -53208,13 +53210,13 @@ "@bugsnag/web-worker": { "version": "file:packages/web-worker", "requires": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-fetch": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-fetch": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", diff --git a/packages/browser/package.json b/packages/browser/package.json index 97961ee550..57217c1fed 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/browser", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/index-cjs.cjs", "types": "dist/types/index-es.d.ts", "browser": "./dist/bugsnag.js", @@ -34,29 +34,29 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/delivery-xml-http-request": "^8.4.0", - "@bugsnag/plugin-app-duration": "^8.4.0", - "@bugsnag/plugin-browser-context": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-request": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-inline-script-content": "^8.4.0", - "@bugsnag/plugin-interaction-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-navigation-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-simple-throttle": "^8.4.0", - "@bugsnag/plugin-strip-query-string": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-replace": "^6.0.2", - "@rollup/plugin-terser": "^0.4.4" + "@rollup/plugin-terser": "^0.4.4", + "@bugsnag/delivery-xml-http-request": "^8.6.0", + "@bugsnag/plugin-app-duration": "^8.6.0", + "@bugsnag/plugin-browser-context": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-request": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-inline-script-content": "^8.6.0", + "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-navigation-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-simple-throttle": "^8.6.0", + "@bugsnag/plugin-strip-query-string": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0" }, "dependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } } diff --git a/packages/core/package.json b/packages/core/package.json index d651c286ab..7f7a60311f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/core", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/index.cjs", "types": "dist/types/index.d.ts", "exports": { diff --git a/packages/core/src/client.ts b/packages/core/src/client.ts index 1067744179..4f60ef378e 100644 --- a/packages/core/src/client.ts +++ b/packages/core/src/client.ts @@ -26,6 +26,7 @@ export default class Client { public _metadata: { [key: string]: any } public _featuresIndex: { [key: string]: number } public _features: Array + public _groupingDiscriminator?: string | null private _context: string | undefined @@ -71,6 +72,7 @@ export default class Client { this._features = [] this._context = undefined this._user = {} + this._groupingDiscriminator = undefined // callbacks: // e: onError @@ -153,6 +155,17 @@ export default class Client { this._context = c } + getGroupingDiscriminator () { + return this._groupingDiscriminator + } + + setGroupingDiscriminator (value: string | null | undefined) { + const previousValue = this._groupingDiscriminator + if (typeof value === 'string' || value === null || value === undefined) this._groupingDiscriminator = value + return previousValue + } + + _configure (opts: T, internalPlugins: Plugin[]) { const schema = internalPlugins.reduce((schema, plugin) => { if (plugin && plugin.configSchema) return Object.assign({}, schema, plugin.configSchema) @@ -350,6 +363,7 @@ export default class Client { event._user = Object.assign({}, event._user, this._user) event.breadcrumbs = this._breadcrumbs.slice() featureFlagDelegate.merge(event._features, this._features, event._featuresIndex) + event.setGroupingDiscriminator(this._groupingDiscriminator) // exit early if events should not be sent on the current releaseStage if (this._config.enabledReleaseStages !== null && this._config.enabledReleaseStages.indexOf(this._config.releaseStage) === -1) { diff --git a/packages/core/src/event.ts b/packages/core/src/event.ts index d17c12af4e..f4a7b7935a 100644 --- a/packages/core/src/event.ts +++ b/packages/core/src/event.ts @@ -35,6 +35,7 @@ export default class Event { public _metadata: { [key: string]: any } public _features: (FeatureFlag | null)[] public _featuresIndex: { [key: string]: number } + public _groupingDiscriminator: string | null | undefined public _user: User private _correlation?: { spanId?: string, traceId: string } @@ -71,6 +72,7 @@ export default class Event { this._user = {} this._session = undefined this._correlation = undefined + this._groupingDiscriminator = undefined this.errors = [ createBugsnagError(errorClass, errorMessage, Event.__type, stacktrace) @@ -100,6 +102,16 @@ export default class Event { } } + getGroupingDiscriminator () { + return this._groupingDiscriminator + } + + setGroupingDiscriminator (value: string | null | undefined) { + const previousValue = this._groupingDiscriminator + if (typeof value === 'string' || value === null || value === undefined) this._groupingDiscriminator = value + return previousValue + } + getMetadata (section: string, key?: string) { return metadataDelegate.get(this._metadata, section, key) } @@ -150,6 +162,7 @@ export default class Event { breadcrumbs: this.breadcrumbs, context: this.context, groupingHash: this.groupingHash, + groupingDiscriminator: this._groupingDiscriminator, metaData: this._metadata, user: this._user, session: this._session, diff --git a/packages/core/test/event.test.ts b/packages/core/test/event.test.ts index dd3863ed6b..18518d16d7 100644 --- a/packages/core/test/event.test.ts +++ b/packages/core/test/event.test.ts @@ -445,4 +445,28 @@ describe('Event', () => { expect(serialized.correlation).toBeUndefined() }) }) + + describe('Event.getGroupingDiscriminator() / Event.setGroupingDiscriminator', () => { + it('sets and retrieves grouping discriminator on event', () => { + const event = new Event('Error', 'test message', []) + + // Initially should be undefined + expect(event.getGroupingDiscriminator()).toBe(undefined) + + // Set a value and retrieve it + const previousValue = event.setGroupingDiscriminator('event-discriminator') + expect(previousValue).toBe(undefined) + expect(event.getGroupingDiscriminator()).toBe('event-discriminator') + + // Update the value + const previousValue2 = event.setGroupingDiscriminator('updated-discriminator') + expect(previousValue2).toBe('event-discriminator') + expect(event.getGroupingDiscriminator()).toBe('updated-discriminator') + + // Clear the value + const previousValue3 = event.setGroupingDiscriminator(undefined) + expect(previousValue3).toBe('updated-discriminator') + expect(event.getGroupingDiscriminator()).toBe(undefined) + }) + }) }) diff --git a/packages/core/test/grouping-discriminator.test.ts b/packages/core/test/grouping-discriminator.test.ts new file mode 100644 index 0000000000..e53a7463b4 --- /dev/null +++ b/packages/core/test/grouping-discriminator.test.ts @@ -0,0 +1,172 @@ +import Client from '../src/client' + +describe('@bugsnag/core/grouping discriminator', () => { + describe('Client', () => { + describe('getGroupingDiscriminator() / setGroupingDiscriminator()', () => { + it('sets and retrieves grouping discriminator on client', () => { + const client = new Client({ apiKey: 'API_KEY' }) + + // Initially should be undefined + expect(client.getGroupingDiscriminator()).toBe(undefined) + + // Set a value and retrieve it + const previousValue = client.setGroupingDiscriminator('test-discriminator') + expect(previousValue).toBe(undefined) + expect(client.getGroupingDiscriminator()).toBe('test-discriminator') + + // Update the value + const previousValue2 = client.setGroupingDiscriminator('new-discriminator') + expect(previousValue2).toBe('test-discriminator') + expect(client.getGroupingDiscriminator()).toBe('new-discriminator') + + // Clear the value + const previousValue3 = client.setGroupingDiscriminator(undefined) + expect(previousValue3).toBe('new-discriminator') + expect(client.getGroupingDiscriminator()).toBe(undefined) + }) + }) + }) + + describe('Client notify() integration', () => { + it('uses client grouping discriminator when event has none set', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + client.setGroupingDiscriminator('client-discriminator') + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe('client-discriminator') + + const eventPayload = event.toJSON() + expect(eventPayload.groupingDiscriminator).toBe('client-discriminator') + done() + }, + sendSession: () => {} + })) + + client.notify(new Error('test error')) + }) + + it('uses event grouping discriminator when set, ignoring client discriminator', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + client.setGroupingDiscriminator('client-discriminator') + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe('event-discriminator') + + const eventPayload = event.toJSON() + expect(eventPayload.groupingDiscriminator).toBe('event-discriminator') + done() + }, + sendSession: () => {} + })) + + client.notify(new Error('test error'), (event) => { + event.setGroupingDiscriminator('event-discriminator') + }) + }) + + it('does not set grouping discriminator when neither client nor event has one', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe(undefined) + + const eventPayload = event.toJSON() + expect(eventPayload.groupingDiscriminator).toBe(undefined) + done() + }, + sendSession: () => {} + })) + + client.notify(new Error('test error')) + }) + + it('handles multiple notify calls with different discriminators', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + client.setGroupingDiscriminator('client-discriminator') + + let callCount = 0 + const expectedResults = [ + 'client-discriminator', // First call uses client discriminator + 'custom-discriminator', // Second call has event discriminator set + 'client-discriminator', // Third call uses client discriminator again + undefined // Fourth call has the discriminator cleared + ] + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe(expectedResults[callCount]) + + const eventPayload = event.toJSON() + expect(eventPayload.groupingDiscriminator).toBe(expectedResults[callCount]) + + callCount++ + if (callCount === 4) { + done() + } + }, + sendSession: () => {} + })) + + // First notify - should use client discriminator + client.notify(new Error('test error 1')) + + // Second notify - should use event discriminator + client.notify(new Error('test error 2'), (event) => { + event.setGroupingDiscriminator('custom-discriminator') + }) + + // Third notify - should use client discriminator again + client.notify(new Error('test error 3')) + + // Fourth notify - clear the event discriminator + client.notify(new Error('test error 4'), (event) => { + event.setGroupingDiscriminator(undefined) + }) + }) + + it('allows changing client discriminator between notify calls', (done) => { + const client = new Client({ apiKey: 'API_KEY' }) + client.setGroupingDiscriminator('initial-discriminator') + + let callCount = 0 + const expectedResults = [ + 'initial-discriminator', + 'updated-discriminator' + ] + + client._setDelivery(client => ({ + sendEvent: (payload) => { + expect(payload.events).toHaveLength(1) + const event = payload.events[0] + expect(event.getGroupingDiscriminator()).toBe(expectedResults[callCount]) + + callCount++ + if (callCount === 2) { + done() + } + }, + sendSession: () => {} + })) + + // First notify + client.notify(new Error('test error 1')) + + // Change client discriminator + client.setGroupingDiscriminator('updated-discriminator') + + // Second notify + client.notify(new Error('test error 2')) + }) + }) +}) diff --git a/packages/delivery-electron/package.json b/packages/delivery-electron/package.json index d617d382e6..8ab81e1c68 100644 --- a/packages/delivery-electron/package.json +++ b/packages/delivery-electron/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/delivery-electron", - "version": "8.4.0", + "version": "8.6.0", "main": "delivery.js", "description": "@bugsnag/electron delivery mechanism to send events, sessions, and crash dumps from Electron apps", "homepage": "https://www.bugsnag.com/", @@ -17,9 +17,9 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0" }, "dependencies": { "@bugsnag/json-payload": "^8.4.0" diff --git a/packages/delivery-fetch/package.json b/packages/delivery-fetch/package.json index 77ac54aa2a..5878d09373 100644 --- a/packages/delivery-fetch/package.json +++ b/packages/delivery-fetch/package.json @@ -1,7 +1,7 @@ { "name": "@bugsnag/delivery-fetch", "author": "Bugsnag", - "version": "8.4.0", + "version": "8.6.0", "main": "delivery.js", "description": "@bugsnag/js delivery mechanism using the fetch API", "homepage": "https://www.bugsnag.com/", @@ -17,6 +17,9 @@ "@bugsnag/json-payload": "^8.4.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" + }, + "peerDependencies": { + "@bugsnag/core": "^8.0.0" } } diff --git a/packages/delivery-node/package.json b/packages/delivery-node/package.json index 3c38648429..2884901ce2 100644 --- a/packages/delivery-node/package.json +++ b/packages/delivery-node/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/delivery-node", - "version": "8.4.0", + "version": "8.6.0", "main": "delivery.js", "description": "@bugsnag/node delivery mechanism", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "dependencies": { "@bugsnag/json-payload": "^8.4.0" diff --git a/packages/delivery-react-native/package.json b/packages/delivery-react-native/package.json index e65501c3ec..657577f6c7 100644 --- a/packages/delivery-react-native/package.json +++ b/packages/delivery-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/delivery-react-native", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/delivery.js", "description": "@bugsnag/js delivery mechanism for React Native", "homepage": "https://www.bugsnag.com/", @@ -19,11 +19,10 @@ }, "author": "Bugsnag", "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.4.0", + "dependencies": { "@bugsnag/derecursify": "^8.4.0" }, - "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "devDependencies": { + "@bugsnag/core": "^8.6.0" } } diff --git a/packages/delivery-react-native/src/delivery.js b/packages/delivery-react-native/src/delivery.js index e93a7d7bcd..d6c6791c8f 100644 --- a/packages/delivery-react-native/src/delivery.js +++ b/packages/delivery-react-native/src/delivery.js @@ -27,6 +27,7 @@ module.exports = (client, NativeClient) => ({ user: event._user, metadata: derecursify(event._metadata), groupingHash: event.groupingHash, + groupingDiscriminator: event._groupingDiscriminator, apiKey: event.apiKey, featureFlags: event.toJSON().featureFlags, nativeStack: nativeStack, diff --git a/packages/delivery-react-native/test/delivery.test.ts b/packages/delivery-react-native/test/delivery.test.ts index 8acddd35e9..1d6568933f 100644 --- a/packages/delivery-react-native/test/delivery.test.ts +++ b/packages/delivery-react-native/test/delivery.test.ts @@ -26,6 +26,7 @@ type NativeClientEvent = Pick { + const ret = origSetGroupingDiscriminator.call(client, ...args) + emitter.emit('GroupingDiscriminatorUpdate', client.getGroupingDiscriminator()) + return ret + } + const origAddMetadata = client.addMetadata client.addMetadata = (...args) => { const ret = origAddMetadata.call(client, ...args) @@ -73,13 +80,16 @@ module.exports = { } // handle a bulk update of initial values from a new renderer - const bulkUpdate = ({ user, context, metadata, features }) => { + const bulkUpdate = ({ user, context, metadata, features, groupingDiscriminator }) => { if (user) { client.setUser(user.id, user.email, user.name) } if (context) { client.setContext(context) } + if (groupingDiscriminator) { + client.setGroupingDiscriminator(groupingDiscriminator) + } if (metadata) { for (const section in metadata) { origAddMetadata.call(client, section, metadata[section]) diff --git a/packages/plugin-electron-client-state-manager/package.json b/packages/plugin-electron-client-state-manager/package.json index c7c01c3756..659c35008a 100644 --- a/packages/plugin-electron-client-state-manager/package.json +++ b/packages/plugin-electron-client-state-manager/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-client-state-manager", - "version": "8.4.0", + "version": "8.6.0", "main": "client-state-manager.js", "description": "@bugsnag/electron plugin to sync state between various processes", "homepage": "https://www.bugsnag.com/", @@ -19,7 +19,7 @@ "client-state-manager.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" 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 a8f7e276f2..dd070cc68b 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 @@ -29,6 +29,16 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { client.setContext('ctx') }) + it('should emit events when grouping discriminator changes', done => { + const client = new Client({ apiKey: '123' }, {}, [stateManager], Notifier) + const { emitter } = client.getPlugin('clientStateManager') + emitter.on('GroupingDiscriminatorUpdate', (groupingDiscriminator: string) => { + expect(groupingDiscriminator).toBe('discriminator') + done() + }) + client.setGroupingDiscriminator('discriminator') + }) + interface MetadataUpdatePayload { section: string values?: Record @@ -137,11 +147,13 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { const featuresCb = jest.fn() const contextCb = jest.fn() const userCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() emitter.on('FeatureFlagUpdate', featuresCb) emitter.on('MetadataReplace', metadataCb) emitter.on('ContextUpdate', contextCb) emitter.on('UserUpdate', userCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) // update everything bulkUpdate({ @@ -155,7 +167,8 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { features: [ { name: 'flag name 1', variant: 'variant name 1' }, { name: 'flag name 2', variant: 'variant name 2' } - ] + ], + groupingDiscriminator: 'discriminator' }) expect(featuresCb).toHaveBeenCalledWith([ @@ -166,6 +179,7 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { expect(metadataCb).toHaveBeenCalledWith({ section: { key: 'value' } }) expect(contextCb).toHaveBeenCalledWith('ctx') expect(userCb).toHaveBeenCalledWith({ id: '123', name: 'Jim', email: 'jim@jim.com' }) + expect(groupingDiscriminatorCb).toHaveBeenCalledWith('discriminator') }) it('should support bulk updates (only context)', () => { @@ -175,10 +189,14 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { const metadataCb = jest.fn() const contextCb = jest.fn() const userCb = jest.fn() + const featuresCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() emitter.on('MetadataReplace', metadataCb) emitter.on('ContextUpdate', contextCb) emitter.on('UserUpdate', userCb) + emitter.on('FeatureFlagUpdate', featuresCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) // update just context bulkUpdate({ @@ -188,6 +206,8 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { expect(metadataCb).not.toHaveBeenCalled() expect(contextCb).toHaveBeenCalledWith('ctx') expect(userCb).not.toHaveBeenCalled() + expect(featuresCb).not.toHaveBeenCalled() + expect(groupingDiscriminatorCb).not.toHaveBeenCalled() }) it('should support bulk updates (only user)', () => { @@ -197,10 +217,14 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { const metadataCb = jest.fn() const contextCb = jest.fn() const userCb = jest.fn() + const featuresCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() emitter.on('MetadataReplace', metadataCb) emitter.on('ContextUpdate', contextCb) emitter.on('UserUpdate', userCb) + emitter.on('FeatureFlagUpdate', featuresCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) // update just user bulkUpdate({ @@ -210,6 +234,8 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { expect(metadataCb).not.toHaveBeenCalled() expect(contextCb).not.toHaveBeenCalledWith() expect(userCb).toHaveBeenCalledWith({ id: '123', name: 'Jim', email: 'jim@jim.com' }) + expect(featuresCb).not.toHaveBeenCalledWith() + expect(groupingDiscriminatorCb).not.toHaveBeenCalledWith() }) it('should support bulk updates (only metadata)', () => { @@ -219,10 +245,14 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { const metadataCb = jest.fn() const contextCb = jest.fn() const userCb = jest.fn() + const featuresCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() emitter.on('MetadataReplace', metadataCb) emitter.on('ContextUpdate', contextCb) emitter.on('UserUpdate', userCb) + emitter.on('FeatureFlagUpdate', featuresCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) // update just metadata bulkUpdate({ @@ -234,5 +264,35 @@ describe('@bugsnag/plugin-electron-client-state-manager', () => { expect(metadataCb).toHaveBeenCalledWith({ section: { key: 'value' } }) expect(contextCb).not.toHaveBeenCalled() expect(userCb).not.toHaveBeenCalled() + expect(featuresCb).not.toHaveBeenCalledWith() + expect(groupingDiscriminatorCb).not.toHaveBeenCalledWith() + }) + + it('should support bulk updates (only grouping discriminator)', () => { + const client = new Client({ apiKey: '123' }, {}, [stateManager], Notifier) + const { emitter, bulkUpdate } = client.getPlugin('clientStateManager') + + const metadataCb = jest.fn() + const featuresCb = jest.fn() + const contextCb = jest.fn() + const groupingDiscriminatorCb = jest.fn() + const userCb = jest.fn() + + emitter.on('MetadataReplace', metadataCb) + emitter.on('ContextUpdate', contextCb) + emitter.on('UserUpdate', userCb) + emitter.on('FeatureFlagUpdate', featuresCb) + emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminatorCb) + + // update just grouping discriminator + bulkUpdate({ + groupingDiscriminator: 'discriminator' + }) + + expect(metadataCb).not.toHaveBeenCalled() + expect(contextCb).not.toHaveBeenCalled() + expect(userCb).not.toHaveBeenCalled() + expect(featuresCb).not.toHaveBeenCalled() + expect(groupingDiscriminatorCb).toHaveBeenCalledWith('discriminator') }) }) diff --git a/packages/plugin-electron-client-state-persistence/client-state-persistence.js b/packages/plugin-electron-client-state-persistence/client-state-persistence.js index 49d557dc21..46279dd904 100644 --- a/packages/plugin-electron-client-state-persistence/client-state-persistence.js +++ b/packages/plugin-electron-client-state-persistence/client-state-persistence.js @@ -36,6 +36,14 @@ module.exports = { } }) + clientStateManager.emitter.on('GroupingDiscriminatorUpdate', groupingDiscriminator => { + try { + NativeClient.updateGroupingDiscriminator(groupingDiscriminator) + } catch (e) { + client._logger.error(e) + } + }) + clientStateManager.emitter.on('MetadataUpdate', ({ section, values }) => { try { NativeClient.updateMetadata(section, values) diff --git a/packages/plugin-electron-client-state-persistence/package.json b/packages/plugin-electron-client-state-persistence/package.json index 34b53a5605..d378d018ed 100644 --- a/packages/plugin-electron-client-state-persistence/package.json +++ b/packages/plugin-electron-client-state-persistence/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-client-state-persistence", - "version": "8.4.0", + "version": "8.6.0", "main": "client-state-persistence.js", "description": "@bugsnag/electron plugin to sync information between JS and native layer", "homepage": "https://www.bugsnag.com/", @@ -39,9 +39,9 @@ "bindings": "^1.5.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-client-state-manager": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", "@types/bindings": "^1.5.0" }, "peerDependencies": { diff --git a/packages/plugin-electron-client-state-persistence/src/api.c b/packages/plugin-electron-client-state-persistence/src/api.c index c6b4299b81..5d6f1fbe72 100644 --- a/packages/plugin-electron-client-state-persistence/src/api.c +++ b/packages/plugin-electron-client-state-persistence/src/api.c @@ -233,6 +233,35 @@ static napi_value UpdateContext(napi_env env, napi_callback_info info) { return NULL; } +static napi_value UpdateGroupingDiscriminator(napi_env env, napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + napi_status status = napi_get_cb_info(env, info, &argc, args, NULL, NULL); + assert(status == napi_ok); + + if (argc < 1) { + napi_throw_type_error(env, NULL, "Wrong number of arguments, expected 1"); + return NULL; + } + + napi_valuetype valuetype0; + status = napi_typeof(env, args[0], &valuetype0); + assert(status == napi_ok); + + if (valuetype0 == napi_string) { + char *grouping_discriminator = read_string_value(env, args[0], false); + throw_error_from_status(env, becsp_set_grouping_discriminator(grouping_discriminator)); + free(grouping_discriminator); + } else if (valuetype0 == napi_null) { + becsp_set_grouping_discriminator(NULL); + } else { + napi_throw_type_error(env, NULL, + "Wrong argument type, expected string or null"); + } + + return NULL; +} + static napi_value UpdateUser(napi_env env, napi_callback_info info) { size_t argc = 3; napi_value args[3]; @@ -475,6 +504,10 @@ napi_value Init(napi_env env, napi_value exports) { status = napi_define_properties(env, exports, 1, &desc); assert(status == napi_ok); + desc = DECLARE_NAPI_METHOD("updateGroupingDiscriminator", UpdateGroupingDiscriminator); + status = napi_define_properties(env, exports, 1, &desc); + assert(status == napi_ok); + desc = DECLARE_NAPI_METHOD("updateUser", UpdateUser); status = napi_define_properties(env, exports, 1, &desc); assert(status == napi_ok); diff --git a/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.c b/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.c index f489ae9655..f286365d33 100644 --- a/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.c +++ b/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.c @@ -43,6 +43,7 @@ static const char *const key_app = "app"; static const char *const key_breadcrumbs = "breadcrumbs"; static const char *const key_context = "context"; static const char *const key_device = "device"; +static const char *const key_grouping_discriminator = "groupingDiscriminator"; static const char *const key_metadata = "metadata"; static const char *const key_feature_flags = "featureFlags"; static const char *const key_session = "session"; @@ -220,6 +221,24 @@ BECSP_STATUS becsp_set_context(const char *context) { return BECSP_STATUS_SUCCESS; } +BECSP_STATUS becsp_set_grouping_discriminator(const char *grouping_discriminator) { + if (!g_context.data) { + return BECSP_STATUS_NOT_INSTALLED; + } + context_lock(); + + JSON_Object *obj = json_value_get_object(g_context.data); + if (grouping_discriminator) { + json_object_set_string(obj, key_grouping_discriminator, grouping_discriminator); + } else { + json_object_remove(obj, key_grouping_discriminator); + } + + serialize_data(); + context_unlock(); + return BECSP_STATUS_SUCCESS; +} + BECSP_STATUS becsp_set_metadata(const char *values) { if (!g_context.data) { return BECSP_STATUS_NOT_INSTALLED; diff --git a/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.h b/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.h index f4b49be445..7019c3dd57 100644 --- a/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.h +++ b/packages/plugin-electron-client-state-persistence/src/bugsnag_electron_client_state_persistence.h @@ -68,6 +68,13 @@ BECSP_STATUS becsp_add_breadcrumb(const char *val); */ BECSP_STATUS becsp_set_context(const char *context); +/** + * Set the grouping discriminator + * + * @param grouping_discriminator the new grouping discriminator value or NULL to unset + */ +BECSP_STATUS becsp_set_grouping_discriminator(const char *grouping_discriminator); + /** * Set event user * diff --git a/packages/plugin-electron-deliver-minidumps/deliver-minidumps.js b/packages/plugin-electron-deliver-minidumps/deliver-minidumps.js index e2f60c88eb..39b3e8972d 100644 --- a/packages/plugin-electron-deliver-minidumps/deliver-minidumps.js +++ b/packages/plugin-electron-deliver-minidumps/deliver-minidumps.js @@ -94,6 +94,7 @@ const takeEventSnapshot = (client) => ({ app: { ...client._app }, breadcrumbs: client._breadcrumbs.slice(), context: client._context, + groupingDiscriminator: client._groupingDiscriminator, device: { ...client._device }, metadata: { ...client._metadata }, featureFlags: featureFlagDelegate.toEventApi(client._features), diff --git a/packages/plugin-electron-deliver-minidumps/event-serialisation.js b/packages/plugin-electron-deliver-minidumps/event-serialisation.js index e0ea83e5fa..d838bfcba6 100644 --- a/packages/plugin-electron-deliver-minidumps/event-serialisation.js +++ b/packages/plugin-electron-deliver-minidumps/event-serialisation.js @@ -7,6 +7,7 @@ const supportedProperties = [ 'device', 'featureFlags', 'groupingHash', + 'groupingDiscriminator', 'metaData', 'request', 'session', @@ -96,6 +97,10 @@ function deserialiseEvent (json, minidumpPath) { event.context = json.context } + if (hasValueForProperty(json, 'groupingDiscriminator')) { + event.groupingDiscriminator = json.groupingDiscriminator + } + if (hasValueForProperty(json, 'device')) { event.device = json.device } diff --git a/packages/plugin-electron-deliver-minidumps/package.json b/packages/plugin-electron-deliver-minidumps/package.json index c25170b296..17c39881c5 100644 --- a/packages/plugin-electron-deliver-minidumps/package.json +++ b/packages/plugin-electron-deliver-minidumps/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-deliver-minidumps", - "version": "8.5.0", + "version": "8.6.0", "main": "deliver-minidumps.js", "description": "@bugsnag/electron plugin to deliver minidumps to Bugsnag", "homepage": "https://www.bugsnag.com/", @@ -23,8 +23,8 @@ "form-data": "^4.0.4" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-network-status": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-network-status": "^8.6.0" }, "peerDependencies": { "@bugsnag/electron-network-status": "^8.0.0" diff --git a/packages/plugin-electron-device/package.json b/packages/plugin-electron-device/package.json index da75b9b668..1a39b1ad21 100644 --- a/packages/plugin-electron-device/package.json +++ b/packages/plugin-electron-device/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-device", - "version": "8.4.0", + "version": "8.6.0", "main": "device.js", "description": "@bugsnag/electron plugin to collect device information", "repository": { @@ -14,8 +14,8 @@ "device.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-ipc/bugsnag-ipc-main.js b/packages/plugin-electron-ipc/bugsnag-ipc-main.js index 3f01d05cec..4064aedd1f 100644 --- a/packages/plugin-electron-ipc/bugsnag-ipc-main.js +++ b/packages/plugin-electron-ipc/bugsnag-ipc-main.js @@ -100,6 +100,7 @@ module.exports = class BugsnagIpcMain { type: this.client._config.appType } event.context = event.context || this.client._context + event.groupingDiscriminator = event.groupingDiscriminator || this.client._groupingDiscriminator event._metadata = { ...event._metadata, ...this.client._metadata } featureFlagDelegate.merge(event._features, this.client._features, event._featuresIndex) event._user = { ...event._user, ...this.client._user } @@ -112,8 +113,8 @@ module.exports = class BugsnagIpcMain { if (!shouldSend) return resolve({ shouldSend: false }) // extract just the properties we want from the event - const { app, breadcrumbs, context, device, _metadata, _features, _user } = event - resolve({ app, breadcrumbs, context, device, metadata: _metadata, features: _features, user: _user }) + const { app, breadcrumbs, context, device, _metadata, _features, _user, groupingDiscriminator } = event + resolve({ app, breadcrumbs, context, device, metadata: _metadata, features: _features, user: _user, groupingDiscriminator }) }) }) } @@ -156,6 +157,8 @@ module.exports = class BugsnagIpcMain { ['update', this.update.bind(this)], ['getContext', this.client.getContext.bind(this.client)], ['setContext', this.client.setContext.bind(this.client)], + ['getGroupingDiscriminator', this.client.getGroupingDiscriminator.bind(this.client)], + ['setGroupingDiscriminator', this.client.setGroupingDiscriminator.bind(this.client)], ['addMetadata', this.client.addMetadata.bind(this.client)], ['clearMetadata', this.client.clearMetadata.bind(this.client)], ['getMetadata', this.client.getMetadata.bind(this.client)], diff --git a/packages/plugin-electron-ipc/bugsnag-ipc-renderer.js b/packages/plugin-electron-ipc/bugsnag-ipc-renderer.js index febc07885f..b2d112293d 100644 --- a/packages/plugin-electron-ipc/bugsnag-ipc-renderer.js +++ b/packages/plugin-electron-ipc/bugsnag-ipc-renderer.js @@ -25,6 +25,14 @@ const BugsnagIpcRenderer = { return safeInvoke(false, 'setContext', context) }, + getGroupingDiscriminator () { + return safeInvoke(true, 'getGroupingDiscriminator') + }, + + setGroupingDiscriminator (groupingDiscriminator) { + return safeInvoke(false, 'setGroupingDiscriminator', groupingDiscriminator) + }, + addMetadata (...args) { return safeInvoke(false, 'addMetadata', ...args) }, diff --git a/packages/plugin-electron-ipc/package.json b/packages/plugin-electron-ipc/package.json index 1234b8e0c7..8fb7ee34a8 100644 --- a/packages/plugin-electron-ipc/package.json +++ b/packages/plugin-electron-ipc/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-ipc", - "version": "8.5.0", + "version": "8.6.0", "main": "electron-ipc.js", "description": "@bugsnag/electron plugin to create the IPC layer between main and renderer processes", "repository": { @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "browserify": "^17.0.0" }, "dependencies": { 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 44f88679c2..54bf50cb83 100644 --- a/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts +++ b/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts @@ -54,6 +54,23 @@ describe('BugsnagIpcMain', () => { expect(event.returnValue).toEqual('today') }) + it('works for updating grouping discriminator', () => { + const client = new Client({ apiKey: '123' }, {}, [mockClientStateManagerPlugin], Notifier) + client.setGroupingDiscriminator = jest.fn() + const bugsnagIpcMain = new BugsnagIpcMain(client) + bugsnagIpcMain.handle({}, 'setGroupingDiscriminator', JSON.stringify('grouping-discriminator')) + expect(client.setGroupingDiscriminator).toHaveBeenCalledWith('grouping-discriminator') + }) + + it('returns the current grouping discriminator', () => { + const client = new Client({ apiKey: '123' }, {}, [mockClientStateManagerPlugin], Notifier) + client.setGroupingDiscriminator('current-grouping-discriminator') + const bugsnagIpcMain = new BugsnagIpcMain(client) + const event = { returnValue: undefined } + bugsnagIpcMain.handleSync(event, 'getGroupingDiscriminator') + expect(event.returnValue).toEqual('current-grouping-discriminator') + }) + it('works for updating user', () => { const client = new Client({ apiKey: '123' }, testSchema, [mockClientStateManagerPlugin], Notifier) client.setUser = jest.fn() @@ -274,6 +291,7 @@ describe('BugsnagIpcMain', () => { client.leaveBreadcrumb('hi') client.setContext('ctx') + client.setGroupingDiscriminator('grouping-discriminator') client.setUser('123', 'jim@jim.com', 'Jim') client.addFeatureFlags([ { name: 'flag1' }, @@ -299,6 +317,7 @@ describe('BugsnagIpcMain', () => { }, breadcrumbs: client._breadcrumbs, context: 'ctx', + groupingDiscriminator: 'grouping-discriminator', device: { id: '123' }, metadata: { app: { testingMode: 'unit' }, diff --git a/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts b/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts index c18d71eec5..f1ae7b7a4b 100644 --- a/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts +++ b/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts @@ -36,6 +36,16 @@ describe('BugsnagIpcRenderer', () => { expect(electron.ipcRenderer.invoke).toHaveBeenCalledWith(CHANNEL_RENDERER_TO_MAIN, 'setContext', JSON.stringify('ctx')) }) + it('should call ipcRenderer correctly for getGroupingDiscriminator', () => { + BugsnagIpcRenderer.getGroupingDiscriminator() + expect(electron.ipcRenderer.sendSync).toHaveBeenCalledWith(CHANNEL_RENDERER_TO_MAIN_SYNC, 'getGroupingDiscriminator') + }) + + it('should call ipcRenderer correctly for setGroupingDiscriminator', async () => { + await BugsnagIpcRenderer.setGroupingDiscriminator('ctx') + expect(electron.ipcRenderer.invoke).toHaveBeenCalledWith(CHANNEL_RENDERER_TO_MAIN, 'setGroupingDiscriminator', JSON.stringify('ctx')) + }) + it('should call ipcRenderer correctly for getUser', () => { BugsnagIpcRenderer.getUser() expect(electron.ipcRenderer.sendSync).toHaveBeenCalledWith( diff --git a/packages/plugin-electron-net-breadcrumbs/package.json b/packages/plugin-electron-net-breadcrumbs/package.json index acb43c50a2..b48c8c8064 100644 --- a/packages/plugin-electron-net-breadcrumbs/package.json +++ b/packages/plugin-electron-net-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-net-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "net-breadcrumbs.js", "description": "@bugsnag/electron plugin to collect breadcrumbs from requests made with the net module", "repository": { @@ -14,8 +14,8 @@ "net-breadcrumbs.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-network-status/package.json b/packages/plugin-electron-network-status/package.json index 1b77a9003c..80b2656af6 100644 --- a/packages/plugin-electron-network-status/package.json +++ b/packages/plugin-electron-network-status/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-network-status", - "version": "8.4.0", + "version": "8.6.0", "main": "network-status.js", "description": "@bugsnag/electron plugin to monitor the network status", "repository": { @@ -14,7 +14,7 @@ "network-status.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-power-monitor-breadcrumbs/package.json b/packages/plugin-electron-power-monitor-breadcrumbs/package.json index eda595dea2..881f316a7b 100644 --- a/packages/plugin-electron-power-monitor-breadcrumbs/package.json +++ b/packages/plugin-electron-power-monitor-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-power-monitor-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "power-monitor-breadcrumbs.js", "description": "@bugsnag/electron plugin to collect power state breadcrumbs", "repository": { @@ -14,8 +14,8 @@ "power-monitor-breadcrumbs.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-preload-error/package.json b/packages/plugin-electron-preload-error/package.json index ef8a2501f0..faea0497ba 100644 --- a/packages/plugin-electron-preload-error/package.json +++ b/packages/plugin-electron-preload-error/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-preload-error", - "version": "8.4.0", + "version": "8.6.0", "main": "preload-error.js", "description": "@bugsnag/electron plugin to handle errors in preload scripts", "repository": { @@ -15,7 +15,7 @@ "preload-error.js" ], "devDependencies": { - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/electron-test-helpers": "^8.6.0" }, "dependencies": { "@bugsnag/path-normalizer": "^8.4.0" diff --git a/packages/plugin-electron-process-info/package.json b/packages/plugin-electron-process-info/package.json index f84add65e6..bbde8ac55a 100644 --- a/packages/plugin-electron-process-info/package.json +++ b/packages/plugin-electron-process-info/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-process-info", - "version": "8.4.0", + "version": "8.6.0", "main": "procinfo.js", "description": "@bugsnag/electron plugin to collect process information for errors", "repository": { @@ -14,7 +14,7 @@ "procinfo.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js b/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js index 00523bda64..9361b79a55 100644 --- a/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js +++ b/packages/plugin-electron-renderer-client-state-updates/client-state-updates.js @@ -24,6 +24,7 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ client.addFeatureFlags = safeExec(client, BugsnagIpcRenderer, 'addFeatureFlags') client.clearFeatureFlag = safeExec(client, BugsnagIpcRenderer, 'clearFeatureFlag') client.clearFeatureFlags = safeExec(client, BugsnagIpcRenderer, 'clearFeatureFlags') + client.setGroupingDiscriminator = safeExec(client, BugsnagIpcRenderer, 'setGroupingDiscriminator') client.startSession = () => { safeExec(client, BugsnagIpcRenderer, 'startSession')() @@ -41,9 +42,13 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ const updates = { metadata: client._metadata, features: client._features } const user = client.getUser() const context = client.getContext() + const groupingDiscriminator = client.getGroupingDiscriminator() if (context && context.length > 0) { updates.context = context } + if (groupingDiscriminator) { + updates.groupingDiscriminator = groupingDiscriminator + } if (Object.keys(user).length > 0) { updates.user = user } @@ -57,6 +62,7 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ client._featuresIndex = {} client._features = [] client._context = undefined + client._groupingDiscriminator = undefined client._user = {} // use main process state once configured properties are synched @@ -64,5 +70,6 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ client.getContext = safeExec(client, BugsnagIpcRenderer, 'getContext') client.getUser = safeExec(client, BugsnagIpcRenderer, 'getUser') client.getMetadata = safeExec(client, BugsnagIpcRenderer, 'getMetadata') + client.getGroupingDiscriminator = safeExec(client, BugsnagIpcRenderer, 'getGroupingDiscriminator') } }) diff --git a/packages/plugin-electron-renderer-client-state-updates/package.json b/packages/plugin-electron-renderer-client-state-updates/package.json index 728c2137a7..8db2795c4b 100644 --- a/packages/plugin-electron-renderer-client-state-updates/package.json +++ b/packages/plugin-electron-renderer-client-state-updates/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-renderer-client-state-updates", - "version": "8.4.0", + "version": "8.6.0", "main": "client-state-updates.js", "description": "@bugsnag/electron plugin to sync information between JS renderers", "homepage": "https://www.bugsnag.com/", @@ -19,7 +19,7 @@ "client-state-updates.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" 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 a74e6c0635..4b51c6af1b 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 @@ -27,6 +27,24 @@ describe('clientStateUpdatesPlugin', () => { expect(client.getContext()).toBe('ctx') }) + it('propagates grouping discriminator changes', () => { + const mockBugsnagIpcRenderer = { + setGroupingDiscriminator: jest.fn() + } + const client = new Client({ apiKey: '123' }, {}, [clientStateUpdatesPlugin(mockBugsnagIpcRenderer)], Notifier) + + client.setGroupingDiscriminator('discriminator') + expect(mockBugsnagIpcRenderer.setGroupingDiscriminator).toHaveBeenCalledWith('discriminator') + }) + + it('forwards upstream changes to grouping discriminator', () => { + const mockBugsnagIpcRenderer = { + getGroupingDiscriminator: () => 'discriminator' + } + const client = new Client({ apiKey: '123' }, {}, [clientStateUpdatesPlugin(mockBugsnagIpcRenderer)], Notifier) + expect(client.getGroupingDiscriminator()).toBe('discriminator') + }) + it('propagates user changes', () => { const mockBugsnagIpcRenderer = { setUser: jest.fn() diff --git a/packages/plugin-electron-renderer-event-data/package.json b/packages/plugin-electron-renderer-event-data/package.json index 47cc3cc176..3ea100da00 100644 --- a/packages/plugin-electron-renderer-event-data/package.json +++ b/packages/plugin-electron-renderer-event-data/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-renderer-event-data", - "version": "8.4.0", + "version": "8.6.0", "main": "renderer-event-data.js", "description": "@bugsnag/electron plugin to get fully populated event data in renderer callbacks", "homepage": "https://www.bugsnag.com/", @@ -19,9 +19,9 @@ "renderer-event-data.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0", - "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0", + "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0", diff --git a/packages/plugin-electron-renderer-event-data/renderer-event-data.js b/packages/plugin-electron-renderer-event-data/renderer-event-data.js index e20b03dfd9..452f82154a 100644 --- a/packages/plugin-electron-renderer-event-data/renderer-event-data.js +++ b/packages/plugin-electron-renderer-event-data/renderer-event-data.js @@ -8,6 +8,7 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ app, breadcrumbs, context, + groupingDiscriminator, device, metadata, features, @@ -18,6 +19,7 @@ module.exports = (BugsnagIpcRenderer = window.__bugsnag_ipc__) => ({ if (shouldSend === false) return false event.context = event.context || context || getDefaultContext() + event._groupingDiscriminator = event._groupingDiscriminator || groupingDiscriminator event.breadcrumbs = breadcrumbs event.app = { ...event.app, ...app, codeBundleId: client._config.codeBundleId } event.device = { ...event.device, ...device } diff --git a/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts b/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts index d33e00431c..201f868410 100644 --- a/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts +++ b/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts @@ -13,7 +13,7 @@ describe('plugin: electron renderer event data', () => { expect(onError).not.toHaveBeenCalled() }) - it('sets context, breadcrumbs, app, device, user, feature flags and metadata from the main process', async () => { + it('sets context, groupingDiscriminator, breadcrumbs, app, device, user, feature flags and metadata from the main process', async () => { const context = 'abc context xyz' const breadcrumbs = [new Breadcrumb('message', { metadata: true }, 'manual')] const app = { abc: 123 } @@ -21,8 +21,9 @@ describe('plugin: electron renderer event data', () => { const user = { id: '10293847' } const features = [{ name: 'flag1', variant: 'variant1' }] const metadata = { meta: { data: true } } + const groupingDiscriminator = 'test-discriminator' - const { sendEvent } = makeClient({ context, breadcrumbs, app, device, user, features, metadata }) + const { sendEvent } = makeClient({ context, breadcrumbs, app, device, user, features, metadata, groupingDiscriminator }) const event = await sendEvent() @@ -33,6 +34,7 @@ describe('plugin: electron renderer event data', () => { expect(event.getUser()).toStrictEqual(user) expect(event._features).toStrictEqual(features) expect(event.getMetadata('meta')).toStrictEqual(metadata.meta) + expect(event.getGroupingDiscriminator()).toStrictEqual(groupingDiscriminator) }) it('prefers pre-existing context from the event', async () => { @@ -45,6 +47,16 @@ describe('plugin: electron renderer event data', () => { expect(event.context).toBe('hello') }) + it('prefers pre-existing groupingDiscriminator from the event', async () => { + const { client, sendEvent } = makeClient({ groupingDiscriminator: 'goodbye' }) + + client.addOnError(event => { event.setGroupingDiscriminator('hello') }, true) + + const event = await sendEvent() + + expect(event.getGroupingDiscriminator()).toBe('hello') + }) + it('prefers pre-existing user from the event', async () => { const { client, sendEvent } = makeClient({ user: { id: 123 } }) diff --git a/packages/plugin-electron-renderer-strip-project-root/package.json b/packages/plugin-electron-renderer-strip-project-root/package.json index 96e1a56451..9260ee0c47 100644 --- a/packages/plugin-electron-renderer-strip-project-root/package.json +++ b/packages/plugin-electron-renderer-strip-project-root/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-renderer-strip-project-root", - "version": "8.4.0", + "version": "8.6.0", "main": "strip-project-root.js", "description": "@bugsnag/electron plugin to strip the project root from stack traces", "homepage": "https://www.bugsnag.com/", @@ -15,8 +15,8 @@ "*.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "author": "Bugsnag", "license": "MIT" diff --git a/packages/plugin-electron-screen-breadcrumbs/package.json b/packages/plugin-electron-screen-breadcrumbs/package.json index 548b9dc236..a30f2989c7 100644 --- a/packages/plugin-electron-screen-breadcrumbs/package.json +++ b/packages/plugin-electron-screen-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-screen-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "screen-breadcrumbs.js", "description": "@bugsnag/electron plugin to collect screen breadcrumbs", "repository": { @@ -14,8 +14,8 @@ "screen-breadcrumbs.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-electron-session/package.json b/packages/plugin-electron-session/package.json index 5c8d9d7c8f..cdc7a03286 100644 --- a/packages/plugin-electron-session/package.json +++ b/packages/plugin-electron-session/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-session", - "version": "8.4.0", + "version": "8.6.0", "main": "session.js", "description": "@bugsnag/electron plugin for sessions", "repository": { @@ -14,11 +14,11 @@ "session.js" ], "dependencies": { - "@bugsnag/plugin-browser-session": "^8.4.0" + "@bugsnag/plugin-browser-session": "^8.6.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/electron-test-helpers": "^8.4.0" + "@bugsnag/core": "^8.6.0", + "@bugsnag/electron-test-helpers": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-express/package.json b/packages/plugin-express/package.json index 747566e850..a240e5368f 100644 --- a/packages/plugin-express/package.json +++ b/packages/plugin-express/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-express", - "version": "8.4.0", + "version": "8.6.0", "main": "src/express.js", "types": "types/bugsnag-express.d.ts", "description": "@bugsnag/js error handling middleware for Express (and Connect) web servers", @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.2.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/express": "4.17.13" } } diff --git a/packages/plugin-hono/package.json b/packages/plugin-hono/package.json index 689fac1837..344c386363 100644 --- a/packages/plugin-hono/package.json +++ b/packages/plugin-hono/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-hono", - "version": "8.4.0", + "version": "8.6.0", "main": "src/hono.js", "types": "types/bugsnag-hono.d.ts", "description": "@bugsnag/js error handling middleware for Hono web servers", @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "hono": "^4.6.3", "typescript": "^5.2.2" }, diff --git a/packages/plugin-inline-script-content/package.json b/packages/plugin-inline-script-content/package.json index 14c5e8d170..24fb29208a 100644 --- a/packages/plugin-inline-script-content/package.json +++ b/packages/plugin-inline-script-content/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-inline-script-content", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/inline-script-content.js", "types": "dist/types/inline-script-content.d.ts", "exports": { @@ -30,7 +30,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-interaction-breadcrumbs/package.json b/packages/plugin-interaction-breadcrumbs/package.json index 4e842012c5..3955ce69a7 100644 --- a/packages/plugin-interaction-breadcrumbs/package.json +++ b/packages/plugin-interaction-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-interaction-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/interaction-breadcrumbs.js", "types": "dist/types/interaction-breadcrumbs.d.ts", "exports": { @@ -30,7 +30,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-intercept/package.json b/packages/plugin-intercept/package.json index d7a790b9f5..347fbe2e2f 100644 --- a/packages/plugin-intercept/package.json +++ b/packages/plugin-intercept/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-intercept", - "version": "8.4.0", + "version": "8.6.0", "main": "intercept.js", "description": "@bugsnag/js plugin providing convenience functions for intercepting asynchronous errors", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-internal-callback-marker/package.json b/packages/plugin-internal-callback-marker/package.json index e0a3552d7d..f32d42160f 100644 --- a/packages/plugin-internal-callback-marker/package.json +++ b/packages/plugin-internal-callback-marker/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-internal-callback-marker", - "version": "8.4.0", + "version": "8.6.0", "main": "internal-callback-marker.js", "description": "@bugsnag/js plugin to annotate all OnError callbacks added by internal plugins", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "internal-callback-marker.js" ], "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-koa/package.json b/packages/plugin-koa/package.json index 5f033053fe..d6f6e582ce 100644 --- a/packages/plugin-koa/package.json +++ b/packages/plugin-koa/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-koa", - "version": "8.4.0", + "version": "8.6.0", "main": "src/koa.js", "types": "types/bugsnag-koa.d.ts", "description": "@bugsnag/js error handling middleware for Koa web servers", @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.2.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/koa": "2.13.4" } } diff --git a/packages/plugin-navigation-breadcrumbs/package.json b/packages/plugin-navigation-breadcrumbs/package.json index 8f02d5dc63..a295a68683 100644 --- a/packages/plugin-navigation-breadcrumbs/package.json +++ b/packages/plugin-navigation-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-navigation-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/navigation-breadcrumbs.js", "types": "dist/types/navigation-breadcrumbs.d.ts", "exports": { @@ -30,7 +30,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-network-breadcrumbs/package.json b/packages/plugin-network-breadcrumbs/package.json index 026524a00f..bebb2cd681 100644 --- a/packages/plugin-network-breadcrumbs/package.json +++ b/packages/plugin-network-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-network-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/network-breadcrumbs.js", "types": "dist/types/network-breadcrumbs.d.ts", "exports": { @@ -25,7 +25,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-node-device/package.json b/packages/plugin-node-device/package.json index 57b2746eb3..10b537d82a 100644 --- a/packages/plugin-node-device/package.json +++ b/packages/plugin-node-device/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-device", - "version": "8.4.0", + "version": "8.6.0", "main": "device.js", "description": "@bugsnag/js plugin to set device info in node", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-node-in-project/package.json b/packages/plugin-node-in-project/package.json index 717c9de9a9..871cb36d60 100644 --- a/packages/plugin-node-in-project/package.json +++ b/packages/plugin-node-in-project/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-in-project", - "version": "8.4.0", + "version": "8.6.0", "main": "in-project.js", "description": "@bugsnag/js plugin to mark whether stackframes are 'in-project'", "homepage": "https://www.bugsnag.com/", diff --git a/packages/plugin-node-surrounding-code/package.json b/packages/plugin-node-surrounding-code/package.json index 2f0af18f91..363f07532c 100644 --- a/packages/plugin-node-surrounding-code/package.json +++ b/packages/plugin-node-surrounding-code/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-surrounding-code", - "version": "8.4.0", + "version": "8.6.0", "main": "surrounding-code.js", "description": "@bugsnag/js plugin to load surrounding code in Node stacktraces", "homepage": "https://www.bugsnag.com/", @@ -22,7 +22,7 @@ "pump": "^3.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-node-uncaught-exception/package.json b/packages/plugin-node-uncaught-exception/package.json index 7df190b307..021e0dc266 100644 --- a/packages/plugin-node-uncaught-exception/package.json +++ b/packages/plugin-node-uncaught-exception/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-uncaught-exception", - "version": "8.4.0", + "version": "8.6.0", "main": "uncaught-exception.js", "description": "@bugsnag/js plugin to capture and report uncaught exceptions", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-node-unhandled-rejection/package.json b/packages/plugin-node-unhandled-rejection/package.json index 55582d19eb..48686f3479 100644 --- a/packages/plugin-node-unhandled-rejection/package.json +++ b/packages/plugin-node-unhandled-rejection/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-node-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "main": "unhandled-rejection.js", "description": "@bugsnag/js plugin to capture and report unhandled rejections", "homepage": "https://www.bugsnag.com/", @@ -18,7 +18,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-react-native-client-sync/package.json b/packages/plugin-react-native-client-sync/package.json index 747381ad56..b75de10f8f 100644 --- a/packages/plugin-react-native-client-sync/package.json +++ b/packages/plugin-react-native-client-sync/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-client-sync", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/client-sync.js", "description": "@bugsnag/react-native plugin to sync information between JS and native layer", "homepage": "https://www.bugsnag.com/", @@ -16,12 +16,11 @@ ], "author": "Bugsnag", "license": "MIT", - "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/derecursify": "^8.4.0" + "dependencies": { + "@bugsnag/derecursify": "^8.6.0" }, - "peerDependencies": { - "@bugsnag/core": "^8.0.0" + "devDependencies": { + "@bugsnag/core": "^8.6.0" }, "scripts": { "build": "rollup --config rollup.config.js", diff --git a/packages/plugin-react-native-client-sync/src/client-sync.js b/packages/plugin-react-native-client-sync/src/client-sync.js index ca95b53ce0..0300b0c2e1 100644 --- a/packages/plugin-react-native-client-sync/src/client-sync.js +++ b/packages/plugin-react-native-client-sync/src/client-sync.js @@ -25,6 +25,13 @@ module.exports = (NativeClient) => ({ return ret } + const origSetGroupingDiscriminator = client.setGroupingDiscriminator + client.setGroupingDiscriminator = function () { + const ret = origSetGroupingDiscriminator.apply(this, arguments) + NativeClient.updateGroupingDiscriminator(this._groupingDiscriminator) + return ret + } + const origAddMetadata = client.addMetadata client.addMetadata = function (section, key, value) { const ret = origAddMetadata.apply(this, arguments) @@ -99,6 +106,9 @@ module.exports = (NativeClient) => ({ case 'ContextUpdate': origSetContext.call(client, event.data) break + case 'GroupingDiscriminatorUpdate': + origSetGroupingDiscriminator.call(client, event.data) + break case 'AddFeatureFlag': origAddFeatureFlag.call(client, event.data.name, event.data.variant) break 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 4c4c7e5406..8a85dff866 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 @@ -31,6 +31,21 @@ describe('plugin: react native client sync', () => { c.setContext('1234') }) + it('updates grouping discriminator', done => { + const c = new Client({ + apiKey: 'api_key', + plugins: [ + plugin({ + updateGroupingDiscriminator: (update: any) => { + expect(update).toBe('test-discriminator') + done() + } + }) + ] + }) + c.setGroupingDiscriminator('test-discriminator') + }) + it('updates metadata', done => { const c = new Client({ apiKey: 'api_key', @@ -186,6 +201,19 @@ describe('plugin: react native client sync', () => { }, 1) }) + it('silently updates grouping discriminator when an update is received', () => { + MockAddListener.mockImplementation((event: any, listener: (payload: any) => void) => { + setTimeout(() => listener({ type: 'GroupingDiscriminatorUpdate', data: 'new-discriminator' }), 0) + }) + const c = new Client({ apiKey: 'api_key', plugins: [plugin()] }) + expect(MockAddListener).toHaveBeenCalledWith('bugsnag::sync', expect.any(Function)) + expect(c.getGroupingDiscriminator()).toBe(undefined) + + setTimeout(() => { + expect(c.getGroupingDiscriminator()).toBe('new-discriminator') + }, 1) + }) + it('silently updates user when an update is received', () => { MockAddListener.mockImplementation((event: any, listener: (payload: any) => void) => { setTimeout(() => listener({ type: 'UserUpdate', data: { id: '1234', name: 'Ben', email: 'ben@bensnag.be' } }), 0) diff --git a/packages/plugin-react-native-event-sync/package.json b/packages/plugin-react-native-event-sync/package.json index 539405c906..4c1527ebdc 100644 --- a/packages/plugin-react-native-event-sync/package.json +++ b/packages/plugin-react-native-event-sync/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-event-sync", - "version": "8.4.0", + "version": "8.6.0", "main": "event-sync.js", "description": "@bugsnag/react-native plugin to sync native event information in an onError callbacks", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-react-native-global-error-handler/package.json b/packages/plugin-react-native-global-error-handler/package.json index b15aea033e..a5a8173ff7 100644 --- a/packages/plugin-react-native-global-error-handler/package.json +++ b/packages/plugin-react-native-global-error-handler/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-global-error-handler", - "version": "8.4.0", + "version": "8.6.0", "main": "error-handler.js", "description": "@bugsnag/js plugin to report unhandled exceptions in React Native", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" }, "peerDependencies": { diff --git a/packages/plugin-react-native-hermes/package.json b/packages/plugin-react-native-hermes/package.json index f254e8f978..fa1efc591f 100644 --- a/packages/plugin-react-native-hermes/package.json +++ b/packages/plugin-react-native-hermes/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-hermes", - "version": "8.4.0", + "version": "8.6.0", "main": "hermes.js", "description": "@bugsnag/react-native plugin to support Hermes", "homepage": "https://www.bugsnag.com/", @@ -20,7 +20,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" }, "peerDependencies": { diff --git a/packages/plugin-react-native-navigation/package.json b/packages/plugin-react-native-navigation/package.json index e9070bbbc8..2946b81789 100644 --- a/packages/plugin-react-native-navigation/package.json +++ b/packages/plugin-react-native-navigation/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-navigation", - "version": "8.4.0", + "version": "8.6.0", "main": "react-native-navigation.js", "types": "types/react-native-navigation.d.ts", "description": "@bugsnag/react-native plugin for integration with react-native-navigation", @@ -19,7 +19,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "react-native-navigation": "^7.0.0" }, "peerDependencies": { diff --git a/packages/plugin-react-native-orientation-breadcrumbs/package.json b/packages/plugin-react-native-orientation-breadcrumbs/package.json index c142c6557f..e4468f106e 100644 --- a/packages/plugin-react-native-orientation-breadcrumbs/package.json +++ b/packages/plugin-react-native-orientation-breadcrumbs/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-orientation-breadcrumbs", - "version": "8.4.0", + "version": "8.6.0", "main": "orientation.js", "description": "@bugsnag/js plugin to create breadcrumbs when the device orientation changes in a React Native app", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" }, "peerDependencies": { diff --git a/packages/plugin-react-native-session/package.json b/packages/plugin-react-native-session/package.json index 3c347141a9..9988f81e8d 100644 --- a/packages/plugin-react-native-session/package.json +++ b/packages/plugin-react-native-session/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-session", - "version": "8.4.0", + "version": "8.6.0", "main": "session.js", "description": "@bugsnag/react-native session implementation (which delegates all functionality to the native client)", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/react-native": "0.67.8" }, "peerDependencies": { diff --git a/packages/plugin-react-native-unhandled-rejection/package.json b/packages/plugin-react-native-unhandled-rejection/package.json index c287029735..0f9d7d1036 100644 --- a/packages/plugin-react-native-unhandled-rejection/package.json +++ b/packages/plugin-react-native-unhandled-rejection/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-native-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "main": "rejection-handler.js", "description": "@bugsnag/js plugin to report unhandled promise rejections in React Native", "homepage": "https://www.bugsnag.com/", @@ -17,7 +17,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "promise": "^8.0.2" }, "peerDependencies": { diff --git a/packages/plugin-react-navigation/package.json b/packages/plugin-react-navigation/package.json index a3cda353ec..1f9dd15b2b 100644 --- a/packages/plugin-react-navigation/package.json +++ b/packages/plugin-react-navigation/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-react-navigation", - "version": "8.4.0", + "version": "8.6.0", "main": "react-navigation.js", "description": "@bugsnag/react-native plugin to update context and leave breadcrumb when the screen changes", "homepage": "https://www.bugsnag.com/", @@ -22,7 +22,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@react-navigation/native": "^5.7.3", "@types/react": "^16.9.49", "@types/react-test-renderer": "^16.9.3", diff --git a/packages/plugin-react/package.json b/packages/plugin-react/package.json index 4285647f9f..66a3bcd098 100644 --- a/packages/plugin-react/package.json +++ b/packages/plugin-react/package.json @@ -1,7 +1,7 @@ { "name": "@bugsnag/plugin-react", "description": "React integration for @bugsnag/js", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/index-cjs.cjs", "types": "dist/types/index-es.d.ts", "browser": "dist/bugsnag-react.js", @@ -31,7 +31,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-restify/package.json b/packages/plugin-restify/package.json index 19f22ad447..8ec2e3a633 100644 --- a/packages/plugin-restify/package.json +++ b/packages/plugin-restify/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-restify", - "version": "8.4.0", + "version": "8.6.0", "main": "src/restify.js", "types": "types/bugsnag-restify.d.ts", "description": "@bugsnag/js error handling middleware for Restify web servers", @@ -22,7 +22,7 @@ "@bugsnag/core": "^8.2.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0", + "@bugsnag/core": "^8.6.0", "@types/restify": "^8.4.2" } } diff --git a/packages/plugin-server-session/package.json b/packages/plugin-server-session/package.json index 1903c6ee77..b1f097480a 100644 --- a/packages/plugin-server-session/package.json +++ b/packages/plugin-server-session/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-server-session", - "version": "8.4.0", + "version": "8.6.0", "main": "session.js", "description": "@bugsnag/js plugin to enable session tracking in server applications", "homepage": "https://www.bugsnag.com/", @@ -20,7 +20,7 @@ "backo": "^1.1.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-simple-throttle/package.json b/packages/plugin-simple-throttle/package.json index 87195b99e0..5680d3c880 100644 --- a/packages/plugin-simple-throttle/package.json +++ b/packages/plugin-simple-throttle/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-simple-throttle", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/throttle.js", "types": "dist/types/throttle.d.ts", "exports": { @@ -25,7 +25,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-stackframe-path-normaliser/package.json b/packages/plugin-stackframe-path-normaliser/package.json index 1b607806ee..e8dafa5ebd 100644 --- a/packages/plugin-stackframe-path-normaliser/package.json +++ b/packages/plugin-stackframe-path-normaliser/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-stackframe-path-normaliser", - "version": "8.4.0", + "version": "8.6.0", "main": "path-normaliser.js", "description": "@bugsnag/js plugin to normalise file paths in stackframes", "homepage": "https://www.bugsnag.com/", @@ -17,6 +17,6 @@ "@bugsnag/core": "^8.0.0" }, "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" } } diff --git a/packages/plugin-strip-project-root/package.json b/packages/plugin-strip-project-root/package.json index 4c8b68b64c..9ee18354dc 100644 --- a/packages/plugin-strip-project-root/package.json +++ b/packages/plugin-strip-project-root/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-strip-project-root", - "version": "8.4.0", + "version": "8.6.0", "main": "strip-project-root.js", "description": "@bugsnag/js plugin to remove common project root paths from stacktraces", "homepage": "https://www.bugsnag.com/", diff --git a/packages/plugin-strip-query-string/package.json b/packages/plugin-strip-query-string/package.json index 286bee8a03..40ee0ce0f7 100644 --- a/packages/plugin-strip-query-string/package.json +++ b/packages/plugin-strip-query-string/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-strip-query-string", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/strip-query-string.js", "types": "dist/types/strip-query-string.d.ts", "exports": { @@ -25,7 +25,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-vue/package.json b/packages/plugin-vue/package.json index e54a1f28e2..3d4889f9eb 100644 --- a/packages/plugin-vue/package.json +++ b/packages/plugin-vue/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-vue", - "version": "8.4.0", + "version": "8.6.0", "description": "Vue.js integration for bugsnag-js", "main": "dist/index.cjs", "types": "dist/types/index.d.ts", @@ -31,7 +31,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-window-onerror/package.json b/packages/plugin-window-onerror/package.json index 00d7d37fab..2c0f1eb244 100644 --- a/packages/plugin-window-onerror/package.json +++ b/packages/plugin-window-onerror/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-window-onerror", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/onerror.js", "types": "dist/types/onerror.d.ts", "exports": { @@ -25,7 +25,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/plugin-window-unhandled-rejection/package.json b/packages/plugin-window-unhandled-rejection/package.json index c9b1ec7a70..c5074dc140 100644 --- a/packages/plugin-window-unhandled-rejection/package.json +++ b/packages/plugin-window-unhandled-rejection/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-window-unhandled-rejection", - "version": "8.4.0", + "version": "8.6.0", "main": "dist/unhandled-rejection.js", "types": "dist/types/unhandled-rejection.d.ts", "exports": { @@ -25,7 +25,7 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0" + "@bugsnag/core": "^8.6.0" }, "peerDependencies": { "@bugsnag/core": "^8.0.0" diff --git a/packages/react-native/android/src/main/java/com/bugsnag/android/BugsnagReactNativeImpl.java b/packages/react-native/android/src/main/java/com/bugsnag/android/BugsnagReactNativeImpl.java index 83d59938b5..91fdab2040 100644 --- a/packages/react-native/android/src/main/java/com/bugsnag/android/BugsnagReactNativeImpl.java +++ b/packages/react-native/android/src/main/java/com/bugsnag/android/BugsnagReactNativeImpl.java @@ -23,6 +23,7 @@ class BugsnagReactNativeImpl { static final String MODULE_NAME = "BugsnagReactNative"; private static final String UPDATE_CONTEXT = "ContextUpdate"; + private static final String UPDATE_GROUPING_DISCRIMINATOR = "GroupingDiscriminatorUpdate"; private static final String UPDATE_USER = "UserUpdate"; private static final String UPDATE_METADATA = "MetadataUpdate"; private static final String ADD_FEATURE_FLAG = "AddFeatureFlag"; @@ -85,6 +86,7 @@ void emitEvent(MessageEvent event) { switch (event.getType()) { case UPDATE_CONTEXT: + case UPDATE_GROUPING_DISCRIMINATOR: map.putString(DATA_KEY, (String) event.getData()); break; case UPDATE_USER: @@ -161,6 +163,14 @@ void updateContext(@Nullable String context) { } } + void updateGroupingDiscriminator(@Nullable String groupingDiscriminator) { + try { + plugin.updateGroupingDiscriminator(groupingDiscriminator); + } catch (Throwable exc) { + logFailure("updateGroupingDiscriminator", exc); + } + } + void addMetadata(@NonNull String section, @Nullable ReadableMap data) { try { plugin.addMetadata(section, data != null ? data.toHashMap() : null); diff --git a/packages/react-native/android/src/newarch/java/com/bugsnag/android/NativeBugsnagImpl.java b/packages/react-native/android/src/newarch/java/com/bugsnag/android/NativeBugsnagImpl.java index 30ba97a0e8..c876390ef6 100644 --- a/packages/react-native/android/src/newarch/java/com/bugsnag/android/NativeBugsnagImpl.java +++ b/packages/react-native/android/src/newarch/java/com/bugsnag/android/NativeBugsnagImpl.java @@ -71,6 +71,11 @@ public void updateContext(@Nullable String context) { impl.updateContext(context); } + @Override + public void updateGroupingDiscriminator(@Nullable String groupingDiscriminator) { + impl.updateGroupingDiscriminator(groupingDiscriminator); + } + @Override public void addMetadata(String section, ReadableMap metadata) { impl.addMetadata(section, metadata); diff --git a/packages/react-native/android/src/oldarch/java/com/bugsnag/android/BugsnagReactNative.java b/packages/react-native/android/src/oldarch/java/com/bugsnag/android/BugsnagReactNative.java index 58acaad285..c1358177b8 100644 --- a/packages/react-native/android/src/oldarch/java/com/bugsnag/android/BugsnagReactNative.java +++ b/packages/react-native/android/src/oldarch/java/com/bugsnag/android/BugsnagReactNative.java @@ -77,6 +77,11 @@ void updateContext(@Nullable String context) { impl.updateContext(context); } + @ReactMethod + void updateGroupingDiscriminator(@Nullable String groupingDiscriminator) { + impl.updateGroupingDiscriminator(groupingDiscriminator); + } + @ReactMethod void addMetadata(@NonNull String section, @Nullable ReadableMap data) { impl.addMetadata(section, data); diff --git a/packages/react-native/ios/BugsnagReactNative/BugsnagEventDeserializer.m b/packages/react-native/ios/BugsnagReactNative/BugsnagEventDeserializer.m index b781b7e87c..38547b6f4e 100644 --- a/packages/react-native/ios/BugsnagReactNative/BugsnagEventDeserializer.m +++ b/packages/react-native/ios/BugsnagReactNative/BugsnagEventDeserializer.m @@ -30,6 +30,7 @@ - (BugsnagEvent *)deserializeEvent:(NSDictionary *)payload { session:nil /* set by -[BugsnagClient notifyInternal:block:] */]; event.context = payload[@"context"]; event.groupingHash = payload[@"groupingHash"]; + event.groupingDiscriminator = payload[@"groupingDiscriminator"]; [event setCorrelationTraceId:correlation[@"traceId"] spanId:correlation[@"spanId"]]; diff --git a/packages/react-native/ios/BugsnagReactNative/BugsnagReactNative.mm b/packages/react-native/ios/BugsnagReactNative/BugsnagReactNative.mm index f0732c3186..6a5faa90a1 100644 --- a/packages/react-native/ios/BugsnagReactNative/BugsnagReactNative.mm +++ b/packages/react-native/ios/BugsnagReactNative/BugsnagReactNative.mm @@ -73,6 +73,11 @@ @implementation BugsnagReactNative BSG_EXPORT_RETURN } +BSG_EXPORT_METHOD(updateGroupingDiscriminator:(NSString *)groupingDiscriminator) { + [Bugsnag setGroupingDiscriminator:groupingDiscriminator]; + BSG_EXPORT_RETURN +} + BSG_EXPORT_METHOD(updateCodeBundleId:(NSString *)codeBundleId) { Bugsnag.client.codeBundleId = codeBundleId; BSG_EXPORT_RETURN diff --git a/packages/react-native/ios/BugsnagReactNative/BugsnagReactNativeEmitter.m b/packages/react-native/ios/BugsnagReactNative/BugsnagReactNativeEmitter.m index bbc933ceef..e41b2e961a 100644 --- a/packages/react-native/ios/BugsnagReactNative/BugsnagReactNativeEmitter.m +++ b/packages/react-native/ios/BugsnagReactNative/BugsnagReactNativeEmitter.m @@ -77,6 +77,15 @@ - (NSDictionary *)serializeClientObserverEvent:(BSGClientObserverEvent)event wit }; } break; + + case BSGClientObserverUpdateGroupingDiscriminator: + if ([value isKindOfClass:[NSString class]] || !value) { + return @{ + @"type": @"GroupingDiscriminatorUpdate", + @"data": value ?: [NSNull null] + }; + } + break; } return nil; diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 4082758a57..94a4fb19b5 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/react-native", - "version": "8.4.0", + "version": "8.6.0", "main": "src/notifier.js", "types": "types/bugsnag.d.ts", "description": "Bugsnag error reporter for React Native applications", @@ -54,17 +54,17 @@ "typescript": "^3.3.3" }, "dependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-react-native": "^8.4.0", - "@bugsnag/plugin-console-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-network-breadcrumbs": "^8.4.0", - "@bugsnag/plugin-react": "^8.4.0", - "@bugsnag/plugin-react-native-client-sync": "^8.4.0", - "@bugsnag/plugin-react-native-event-sync": "^8.4.0", - "@bugsnag/plugin-react-native-global-error-handler": "^8.4.0", - "@bugsnag/plugin-react-native-hermes": "^8.4.0", - "@bugsnag/plugin-react-native-session": "^8.4.0", - "@bugsnag/plugin-react-native-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-react-native": "^8.6.0", + "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-network-breadcrumbs": "^8.6.0", + "@bugsnag/plugin-react": "^8.6.0", + "@bugsnag/plugin-react-native-client-sync": "^8.6.0", + "@bugsnag/plugin-react-native-event-sync": "^8.6.0", + "@bugsnag/plugin-react-native-global-error-handler": "^8.6.0", + "@bugsnag/plugin-react-native-hermes": "^8.6.0", + "@bugsnag/plugin-react-native-session": "^8.6.0", + "@bugsnag/plugin-react-native-unhandled-rejection": "^8.6.0", "iserror": "^0.0.2" }, "scripts": { diff --git a/packages/react-native/src/NativeBugsnag.ts b/packages/react-native/src/NativeBugsnag.ts index 118b024ee9..dd50022156 100644 --- a/packages/react-native/src/NativeBugsnag.ts +++ b/packages/react-native/src/NativeBugsnag.ts @@ -42,6 +42,8 @@ export interface Spec extends TurboModule { clearFeatureFlag(name: string): void clearFeatureFlags(): void + + updateGroupingDiscriminator(groupingDiscriminator: string | undefined | null): void } diff --git a/packages/web-worker/package.json b/packages/web-worker/package.json index 045a7ad629..78a247ee10 100644 --- a/packages/web-worker/package.json +++ b/packages/web-worker/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/web-worker", - "version": "8.4.0", + "version": "8.6.0", "description": "BugSnag error reporter for JavaScript web workers and service workers", "homepage": "https://www.bugsnag.com/", "main": "dist/index.js", @@ -42,13 +42,13 @@ "author": "Bugsnag", "license": "MIT", "devDependencies": { - "@bugsnag/core": "^8.4.0", - "@bugsnag/delivery-fetch": "^8.4.0", - "@bugsnag/plugin-browser-device": "^8.4.0", - "@bugsnag/plugin-browser-session": "^8.4.0", - "@bugsnag/plugin-client-ip": "^8.4.0", - "@bugsnag/plugin-window-onerror": "^8.4.0", - "@bugsnag/plugin-window-unhandled-rejection": "^8.4.0", + "@bugsnag/core": "^8.6.0", + "@bugsnag/delivery-fetch": "^8.6.0", + "@bugsnag/plugin-browser-device": "^8.6.0", + "@bugsnag/plugin-browser-session": "^8.6.0", + "@bugsnag/plugin-client-ip": "^8.6.0", + "@bugsnag/plugin-window-onerror": "^8.6.0", + "@bugsnag/plugin-window-unhandled-rejection": "^8.6.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-node-resolve": "^16.0.0", diff --git a/scripts/generate-react-native-fixture.js b/scripts/generate-react-native-fixture.js index de9feaa11a..597fe32d53 100644 --- a/scripts/generate-react-native-fixture.js +++ b/scripts/generate-react-native-fixture.js @@ -40,6 +40,7 @@ const replacementFilesDir = resolve(ROOT_DIR, 'test/react-native/features/fixtur const INTERNAL_DEPENDENCIES = [ '@bugsnag/react-native', + '@bugsnag/derecursify', '@bugsnag/plugin-react-navigation', '@bugsnag/plugin-react-native-navigation' ] diff --git a/test/browser/features/fixtures/browser_errors.yml b/test/browser/features/fixtures/browser_errors.yml index 610b2d2227..e3d1e46b42 100644 --- a/test/browser/features/fixtures/browser_errors.yml +++ b/test/browser/features/fixtures/browser_errors.yml @@ -103,33 +103,7 @@ safari_16: lineNumber: 18 columnNumber: 25 -ios_10: - handled: - errorClass: 'ReferenceError' - errorMessage: "Can't find variable: foo" - unhandled_syntax: - errorClass: 'SyntaxError' - errorMessage: "Unexpected token '!'. Parse error." - lineNumber: 18 - columnNumber: 0 - file: '/unhandled/script/a.html' - unhandled_thrown: - errorClass: 'Error' - errorMessage: "bad things" - lineNumber: 18 - columnNumber: 22 - unhandled_undefined_function: - errorClass: 'ReferenceError' - errorMessage: "Can't find variable: nevergoingtoexist_notinamillionyears" - lineNumber: 18 - columnNumber: 43 - unhandled_malformed_uri: - errorClass: 'URIError' - errorMessage: URI error - lineNumber: 18 - columnNumber: 25 - -ios_11: +ios_12: handled: errorClass: 'ReferenceError' errorMessage: "Can't find variable: foo" diff --git a/test/browser/features/fixtures/grouping_discriminator/script/index.html b/test/browser/features/fixtures/grouping_discriminator/script/index.html new file mode 100644 index 0000000000..525a9dde50 --- /dev/null +++ b/test/browser/features/fixtures/grouping_discriminator/script/index.html @@ -0,0 +1,44 @@ + + + + + + + + + + + diff --git a/test/browser/features/fixtures/strict_mode/script/a.html b/test/browser/features/fixtures/strict_mode/script/a.html deleted file mode 100644 index df14a60d5e..0000000000 --- a/test/browser/features/fixtures/strict_mode/script/a.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - -
    PENDING
    - - - - - diff --git a/test/browser/features/fixtures/strict_mode/script/notifier-does-not-error.html b/test/browser/features/fixtures/strict_mode/script/notifier-does-not-error.html new file mode 100644 index 0000000000..8a5e2333d3 --- /dev/null +++ b/test/browser/features/fixtures/strict_mode/script/notifier-does-not-error.html @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/test/browser/features/grouping_discriminator.feature b/test/browser/features/grouping_discriminator.feature new file mode 100644 index 0000000000..b4b42922c2 --- /dev/null +++ b/test/browser/features/grouping_discriminator.feature @@ -0,0 +1,15 @@ +@grouping_discriminator +Feature: Grouping discriminator functionality + +Scenario: multiple notify() calls with different grouping discriminators + When I navigate to the test URL "/grouping_discriminator/script/index.html" + Then I wait to receive 6 errors + And the error is a valid browser payload for the error reporting API + And the following sets are present in the current error payloads: + | events.0.exceptions.0.message | events.0.groupingDiscriminator | + | no-discriminator | nil | + | client-discriminator | client-discriminator | + | event-discriminator | event-discriminator | + | null-discriminator | nil | + | undefined-discriminator | nil | + | no-discriminator-2 | nil | diff --git a/test/browser/features/integrity.feature b/test/browser/features/integrity.feature index 1e5eba9994..009fa26811 100644 --- a/test/browser/features/integrity.feature +++ b/test/browser/features/integrity.feature @@ -1,4 +1,4 @@ -@skip_ie_11 @skip_ios_10 @skip_safari_10 @skip_safari_16 @skip_edge_17 @skip_chrome_43 @skip_http +@skip_ie_11 @skip_safari_10 @skip_safari_16 @skip_edge_17 @skip_chrome_43 @skip_http Feature: Bugsnag-Integrity header Scenario: Integrity headers are set when setPayloadChecksums is true diff --git a/test/browser/features/steps/browser_steps.rb b/test/browser/features/steps/browser_steps.rb index a339db8526..ed0ae21324 100644 --- a/test/browser/features/steps/browser_steps.rb +++ b/test/browser/features/steps/browser_steps.rb @@ -44,3 +44,24 @@ txt = Maze.driver.find_element(id: 'bugsnag-test-state').text Maze.check.equal('DONE', txt, "Expected #bugsnag-test-state text to be 'DONE'. It was '#{txt}'.") end + +When('the following sets are present in the current {word} payloads:') do |request_type, data_table| + expected_values = data_table.hashes + requests = Maze::Server.list_for(request_type) + Maze.check.equal(expected_values.length, requests.size_all) + payload_values = requests.all.map do |request| + payload_hash = {} + data_table.headers.each_with_object(payload_hash) do |field_path, payload_hash| + payload_hash[field_path] = Maze::Helper.read_key_path(request[:body], field_path) + end + payload_hash + end + expected_values.each do |expected_data| + # if value is 'nil' then the field should not be present in the payload + expected_data.each do |field_path, expected_value| + expected_data[field_path] = nil if expected_value == 'nil' + end + Maze.check.true(payload_values.include?(expected_data), + "#{expected_data} was not found in any of the current payloads") + end +end diff --git a/test/browser/features/strict_mode.feature b/test/browser/features/strict_mode.feature index 6907eabe8f..e4f63a6643 100644 --- a/test/browser/features/strict_mode.feature +++ b/test/browser/features/strict_mode.feature @@ -2,8 +2,7 @@ Feature: Compatibility with strict mode Scenario: notifier does not error in strict mode - When I navigate to the test URL "/strict_mode/script/a.html" - And the test should run in this browser + When I navigate to the test URL "/strict_mode/script/notifier-does-not-error.html" Then I wait to receive an error And the error is a valid browser payload for the error reporting API And the exception "errorClass" equals "InvalidError" diff --git a/test/browser/features/web_worker.feature b/test/browser/features/web_worker.feature index d1d4ad9538..857d6ee542 100644 --- a/test/browser/features/web_worker.feature +++ b/test/browser/features/web_worker.feature @@ -44,7 +44,8 @@ Feature: worker notifier And I wait to receive a session Then the session is a valid browser payload for the session tracking API - @skip_safari_16 + # Not supported on Safari https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Integrity-Policy#browser_compatibility + @skip_safari_16 @skip_ios_12 Scenario: Integrity headers are set when setPayloadChecksums is true When I navigate to the test URL "/web_worker/integrity" And I wait to receive an error diff --git a/test/electron/features/grouping-discriminator.feature b/test/electron/features/grouping-discriminator.feature new file mode 100644 index 0000000000..2415f038b0 --- /dev/null +++ b/test/electron/features/grouping-discriminator.feature @@ -0,0 +1,39 @@ +Feature: Additional grouping discriminator + Grouping discriminator field is included in electron events + and can be passed between renderer and main processes. + + Scenario: Main process grouping discriminator is sent with main errors + Given I launch an app with configuration: + | bugsnag | default | + When I click "main-process-set-grouping-discriminator" + And I click "main-notify" + Then the total requests received by the server matches: + | events | 1 | + And the event "groupingDiscriminator" equals "main-process-discriminator" + + Scenario: Renderer process grouping discriminator is sent with renderer errors + Given I launch an app with configuration: + | bugsnag | default | + When I click "renderer-set-grouping-discriminator" + And I click "renderer-notify" + Then the total requests received by the server matches: + | events | 1 | + And the event "groupingDiscriminator" equals "renderer-process-discriminator" + + Scenario: Main process grouping discriminator persists across renderer errors + Given I launch an app with configuration: + | bugsnag | default | + When I click "main-process-set-grouping-discriminator" + And I click "renderer-notify" + Then the total requests received by the server matches: + | events | 1 | + And the event "groupingDiscriminator" equals "main-process-discriminator" + + Scenario: Renderer process grouping discriminator persists across main errors + Given I launch an app with configuration: + | bugsnag | default | + When I click "renderer-set-grouping-discriminator" + And I click "main-notify" + Then the total requests received by the server matches: + | events | 1 | + And the event "groupingDiscriminator" equals "renderer-process-discriminator" diff --git a/test/electron/features/support/steps/request-steps.js b/test/electron/features/support/steps/request-steps.js index c35ea8166e..49db7cd3cb 100644 --- a/test/electron/features/support/steps/request-steps.js +++ b/test/electron/features/support/steps/request-steps.js @@ -252,3 +252,11 @@ Then('the event has no feature flags', async () => { expect(payloads[0].events).toHaveLength(1) expect(payloads[0].events[0]).toHaveProperty('featureFlags', []) }) + +Then('the event {string} equals {string}', async (field, expected) => { + const payloads = readPayloads(global.server.uploadsForType('event')) + + expect(payloads).toHaveLength(1) + expect(payloads[0].events).toHaveLength(1) + expect(payloads[0].events[0]).toHaveProperty(field, expected) +}) diff --git a/test/electron/fixtures/app/src/index.html b/test/electron/fixtures/app/src/index.html index 2f3e196380..b522b5293f 100644 --- a/test/electron/fixtures/app/src/index.html +++ b/test/electron/fixtures/app/src/index.html @@ -69,5 +69,9 @@

    Actions

  • Make a failed GET request
  • Trigger a network request error
  • + diff --git a/test/electron/fixtures/app/src/main.js b/test/electron/fixtures/app/src/main.js index d7fb23b3ad..6669d4811a 100644 --- a/test/electron/fixtures/app/src/main.js +++ b/test/electron/fixtures/app/src/main.js @@ -148,3 +148,7 @@ ipcMain.on('main-process-get-request', (_event, fail) => { ipcMain.on('main-process-request-error', () => { networkRequestError() }) + +ipcMain.on('main-process-set-grouping-discriminator', (_event, discriminator) => { + Bugsnag.setGroupingDiscriminator(discriminator) +}) diff --git a/test/electron/fixtures/app/src/preload.js b/test/electron/fixtures/app/src/preload.js index fdb79653b5..54f788c07b 100644 --- a/test/electron/fixtures/app/src/preload.js +++ b/test/electron/fixtures/app/src/preload.js @@ -48,5 +48,8 @@ contextBridge.exposeInMainWorld('RunnerAPI', { mainProcessRequestError: () => { ipcRenderer.send('main-process-request-error') }, + mainProcessSetGroupingDiscriminator: (discriminator) => { + ipcRenderer.send('main-process-set-grouping-discriminator', discriminator) + }, preloadStart: Date.now() }) diff --git a/test/electron/fixtures/app/src/renderer.js b/test/electron/fixtures/app/src/renderer.js index 7394fe253e..6b0cfd7a0c 100644 --- a/test/electron/fixtures/app/src/renderer.js +++ b/test/electron/fixtures/app/src/renderer.js @@ -95,3 +95,11 @@ document.getElementById('renderer-clear-context').onclick = () => { document.getElementById('renderer-clear-metadata').onclick = () => { Bugsnag.clearMetadata('renderer') } + +document.getElementById('main-process-set-grouping-discriminator').onclick = () => { + window.RunnerAPI.mainProcessSetGroupingDiscriminator('main-process-discriminator') +} + +document.getElementById('renderer-set-grouping-discriminator').onclick = () => { + Bugsnag.setGroupingDiscriminator('renderer-process-discriminator') +} diff --git a/test/react-native/features/fixtures/scenario-launcher/android/src/main/java/com/bugsnag/reactnative/test/scenarios/GroupingDiscriminatorNativeScenario.kt b/test/react-native/features/fixtures/scenario-launcher/android/src/main/java/com/bugsnag/reactnative/test/scenarios/GroupingDiscriminatorNativeScenario.kt new file mode 100644 index 0000000000..fed3214bc6 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/android/src/main/java/com/bugsnag/reactnative/test/scenarios/GroupingDiscriminatorNativeScenario.kt @@ -0,0 +1,25 @@ +package com.reactnative.scenarios + +import android.content.Context +import com.bugsnag.android.Bugsnag +import com.facebook.react.bridge.Promise + +class GroupingDiscriminatorNativeScenario(context: Context): Scenario(context) { + + override fun run(promise: Promise) { + val exception = RuntimeException("GroupingDiscriminatorScenarioNative") + Bugsnag.notify(exception) + Thread.sleep(500) + Bugsnag.setGroupingDiscriminator("grouping-discriminator-from-native") + // JS layer will be automatically notified via the BugsnagReactNativeEmitter + // when setGroupingDiscriminator is called, which triggers the client observer + } + + override fun runSync(): Boolean { + val exception = RuntimeException("GroupingDiscriminatorScenarioNative") + Bugsnag.notify(exception) + Thread.sleep(500) + Bugsnag.setGroupingDiscriminator("grouping-discriminator-from-native") + return true + } +} diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj b/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj index ce31311634..d762a1a2d2 100644 --- a/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj +++ b/test/react-native/features/fixtures/scenario-launcher/ios/BugsnagTestInterface.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ DA2260AC2E58AD79008384E6 /* BugsnagTestInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA2260AB2E58AD79008384E6 /* BugsnagTestInterface.mm */; }; DA2260D42E58AD99008384E6 /* ContextNativeCustomScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260B42E58AD99008384E6 /* ContextNativeCustomScenario.m */; }; + DA2260FB2E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3371AC2F69BE8A009495D7 /* GroupingDiscriminatorNativeScenario.m */; }; DA2260D52E58AD99008384E6 /* MetadataNativeUnhandledScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260C02E58AD99008384E6 /* MetadataNativeUnhandledScenario.m */; }; DA2260D62E58AD99008384E6 /* UserNativeClientScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260D32E58AD99008384E6 /* UserNativeClientScenario.m */; }; DA2260D72E58AD99008384E6 /* StartSessionScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2260CF2E58AD99008384E6 /* StartSessionScenario.m */; }; @@ -54,6 +55,8 @@ DA2260B22E58AD99008384E6 /* BreadcrumbsNativeManualScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BreadcrumbsNativeManualScenario.m; path = Scenarios/BreadcrumbsNativeManualScenario.m; sourceTree = ""; }; DA2260B32E58AD99008384E6 /* ContextNativeCustomScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ContextNativeCustomScenario.h; path = Scenarios/ContextNativeCustomScenario.h; sourceTree = ""; }; DA2260B42E58AD99008384E6 /* ContextNativeCustomScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ContextNativeCustomScenario.m; path = Scenarios/ContextNativeCustomScenario.m; sourceTree = ""; }; + DA3371AD2F69BE8B009495D8 /* GroupingDiscriminatorNativeScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GroupingDiscriminatorNativeScenario.h; path = Scenarios/GroupingDiscriminatorNativeScenario.h; sourceTree = ""; }; + DA3371AC2F69BE8A009495D7 /* GroupingDiscriminatorNativeScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GroupingDiscriminatorNativeScenario.m; path = Scenarios/GroupingDiscriminatorNativeScenario.m; sourceTree = ""; }; DA2260B52E58AD99008384E6 /* DeviceNativeHandledScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DeviceNativeHandledScenario.h; path = Scenarios/DeviceNativeHandledScenario.h; sourceTree = ""; }; DA2260B62E58AD99008384E6 /* DeviceNativeHandledScenario.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = DeviceNativeHandledScenario.m; path = Scenarios/DeviceNativeHandledScenario.m; sourceTree = ""; }; DA2260B72E58AD99008384E6 /* DeviceNativeUnhandledScenario.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DeviceNativeUnhandledScenario.h; path = Scenarios/DeviceNativeUnhandledScenario.h; sourceTree = ""; }; @@ -109,6 +112,8 @@ DA2260B22E58AD99008384E6 /* BreadcrumbsNativeManualScenario.m */, DA2260B32E58AD99008384E6 /* ContextNativeCustomScenario.h */, DA2260B42E58AD99008384E6 /* ContextNativeCustomScenario.m */, + DA3371AD2F69BE8B009495D8 /* GroupingDiscriminatorNativeScenario.h */, + DA3371AC2F69BE8A009495D7 /* GroupingDiscriminatorNativeScenario.m */, DA2260B52E58AD99008384E6 /* DeviceNativeHandledScenario.h */, DA2260B62E58AD99008384E6 /* DeviceNativeHandledScenario.m */, DA2260B72E58AD99008384E6 /* DeviceNativeUnhandledScenario.h */, @@ -215,6 +220,7 @@ buildActionMask = 2147483647; files = ( DA2260D42E58AD99008384E6 /* ContextNativeCustomScenario.m in Sources */, + DA2260FB2E58AD99008384E6 /* GroupingDiscriminatorNativeScenario.m in Sources */, DA2260D52E58AD99008384E6 /* MetadataNativeUnhandledScenario.m in Sources */, DA2260D62E58AD99008384E6 /* UserNativeClientScenario.m in Sources */, DA2260D72E58AD99008384E6 /* StartSessionScenario.m in Sources */, diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.h b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.h new file mode 100644 index 0000000000..73d11746ae --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.h @@ -0,0 +1,6 @@ +#import +#import "Scenario.h" + +@interface GroupingDiscriminatorNativeScenario : Scenario + +@end diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.m b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.m new file mode 100644 index 0000000000..91b0e83311 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorNativeScenario.m @@ -0,0 +1,15 @@ +#import "GroupingDiscriminatorNativeScenario.h" + +@implementation GroupingDiscriminatorNativeScenario + +- (void)run: (RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + NSException *exception = [[NSException alloc] initWithName:@"NSException" reason:@"GroupingDiscriminatorScenarioNative" userInfo:nil]; + [Bugsnag notify:exception]; + [NSThread sleepForTimeInterval:0.5]; + [Bugsnag setGroupingDiscriminator:@"grouping-discriminator-from-native"]; + // JS layer will be automatically notified via the BugsnagReactNativeEmitter + // when setGroupingDiscriminator is called, which triggers BSGClientObserverUpdateGroupingDiscriminator +} + +@end diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.h b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.h new file mode 100644 index 0000000000..46151229c6 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.h @@ -0,0 +1,6 @@ +#import +#import "Scenario.h" + +@interface GroupingDiscriminatorScenario : Scenario + +@end diff --git a/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.m b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.m new file mode 100644 index 0000000000..30c23f3925 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/ios/Scenarios/GroupingDiscriminatorScenario.m @@ -0,0 +1,11 @@ +#import "GroupingDiscriminatorScenario.h" + +@implementation GroupingDiscriminatorScenario + +- (void)run: (RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + // This scenario is driven from the JS side + // The native part doesn't need to do anything specific +} + +@end diff --git a/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorNativeScenario.js b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorNativeScenario.js new file mode 100644 index 0000000000..c3792de4ff --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorNativeScenario.js @@ -0,0 +1,18 @@ +import Scenario from './Scenario' +import Bugsnag from '@bugsnag/react-native' +import { NativeInterface } from '../lib/native' + +export class GroupingDiscriminatorNativeScenario extends Scenario { + run () { + // Set initial grouping discriminator in JavaScript + Bugsnag.setGroupingDiscriminator('grouping-discriminator-from-js') + + // Trigger the native scenario which will set the grouping discriminator + setTimeout(async () => { + await NativeInterface.runScenario('GroupingDiscriminatorNativeScenario') + setTimeout(() => { + Bugsnag.notify(new Error('GroupingDiscriminatorScenarioJS')) + }, 100) + }, 100) + } +} diff --git a/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorScenario.js b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorScenario.js new file mode 100644 index 0000000000..cbd0864ef8 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/GroupingDiscriminatorScenario.js @@ -0,0 +1,32 @@ +import Scenario from './Scenario' +import Bugsnag from '@bugsnag/react-native' + +export class GroupingDiscriminatorScenario extends Scenario { + run () { + // 1. Notify with error that has no discriminator + Bugsnag.notify(new Error('no-discriminator')) + + // 2. Notify with error that should use client discriminator + Bugsnag.setGroupingDiscriminator('client-discriminator') + Bugsnag.notify(new Error('client-discriminator')) + + // 3. Notify with error and set event discriminator + Bugsnag.notify(new Error('event-discriminator'), event => { + event.setGroupingDiscriminator('event-discriminator') + }) + + // 4. Notify with error and explicitly set event discriminator to null + Bugsnag.notify(new Error('null-discriminator'), event => { + event.setGroupingDiscriminator(null) + }) + + // 5. Notify with error and explicitly set event discriminator to undefined + Bugsnag.notify(new Error('undefined-discriminator'), event => { + event.setGroupingDiscriminator(undefined) + }) + + // 6. Clear client grouping discriminator and notify + Bugsnag.setGroupingDiscriminator(undefined) + Bugsnag.notify(new Error('no-discriminator-2')) + } +} diff --git a/test/react-native/features/fixtures/scenario-launcher/src/scenarios/index.js b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/index.js index f9401b51d2..1c0c937efa 100644 --- a/test/react-native/features/fixtures/scenario-launcher/src/scenarios/index.js +++ b/test/react-native/features/fixtures/scenario-launcher/src/scenarios/index.js @@ -81,3 +81,7 @@ export { ReactNavigationBreadcrumbsDisabledScenario } from './ReactNavigationBre // react-native-navigation.feature export { ReactNativeNavigationBreadcrumbsEnabledScenario } from './ReactNativeNavigationBreadcrumbsEnabledScenario' export { ReactNativeNavigationBreadcrumbsDisabledScenario } from './ReactNativeNavigationBreadcrumbsDisabledScenario' + +// grouping-discriminator.feature +export { GroupingDiscriminatorScenario } from './GroupingDiscriminatorScenario' +export { GroupingDiscriminatorNativeScenario } from './GroupingDiscriminatorNativeScenario' diff --git a/test/react-native/features/grouping-discriminator.feature b/test/react-native/features/grouping-discriminator.feature new file mode 100644 index 0000000000..715c58090c --- /dev/null +++ b/test/react-native/features/grouping-discriminator.feature @@ -0,0 +1,23 @@ +@grouping_discriminator +Feature: Grouping discriminator functionality + +Scenario: multiple notify() calls with different grouping discriminators + When I run "GroupingDiscriminatorScenario" + And I wait to receive 6 errors + Then the following sets are present in the current error payloads: + | events.0.exceptions.0.message | events.0.groupingDiscriminator | + | no-discriminator | nil | + | client-discriminator | client-discriminator | + | event-discriminator | event-discriminator | + | null-discriminator | nil | + | undefined-discriminator | nil | + | no-discriminator-2 | nil | + +Scenario: Grouping discriminator set in JavaScript is reflected in native + When I run "GroupingDiscriminatorNativeScenario" + And I wait to receive 2 errors + Then the following sets are present in the current error payloads: + | events.0.exceptions.0.message | events.0.groupingDiscriminator | + | GroupingDiscriminatorScenarioNative | grouping-discriminator-from-js | + | GroupingDiscriminatorScenarioJS | grouping-discriminator-from-native | + \ No newline at end of file diff --git a/test/react-native/features/steps/react-native-steps.rb b/test/react-native/features/steps/react-native-steps.rb index 7eb162318c..656bd3ffd4 100644 --- a/test/react-native/features/steps/react-native-steps.rb +++ b/test/react-native/features/steps/react-native-steps.rb @@ -129,6 +129,10 @@ def wait_for_app_state(expected_state) payload_hash end expected_values.each do |expected_data| + # For test data, if the value is the string 'nil', it represents an absent field. + expected_data.each do |field_path, expected_value| + expected_data[field_path] = nil if expected_value == 'nil' + end Maze.check.true(payload_values.include?(expected_data), "#{expected_data} was not found in any of the current payloads") end From d9a21d798d4a420cbf4da93ea6f6841d5a59241c Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 7 Oct 2025 13:59:42 +0100 Subject: [PATCH 25/38] Merge pull request #2577 from bugsnag/PLAT-14963/electron-code-bundle-id Add `codeBundleId` config option to main process --- CHANGELOG.md | 6 + package-lock.json | 2 + packages/electron/src/config/main.js | 5 + packages/electron/types/notifier.d.ts | 1 + packages/plugin-electron-app/app.js | 3 +- packages/plugin-electron-app/test/app.test.ts | 19 ++++ .../plugin-electron-ipc/bugsnag-ipc-main.js | 3 +- .../test/bugsnag-ipc-main.test.ts | 32 +++++- .../test/bugsnag-ipc-renderer.test.ts | 32 ++++++ .../test/renderer-event-data.test.ts | 44 +++++++- test/electron/features/error-handling.feature | 12 ++ .../electron/features/renderer-config.feature | 14 ++- .../features/support/steps/request-steps.js | 12 ++ .../app/src/configs/complex-config.js | 1 + .../app/src/configs/mixed-codebundleid.js | 14 +++ .../events/app-launch/complex-config.json | 1 + .../main/breadcrumbs/complex-config.json | 1 + .../main/handled-error/complex-config.json | 1 + .../handled-error/mixed-codebundleid.json | 101 +++++++++++++++++ .../uncaught-exception/complex-config.json | 1 + .../unhandled-rejection/complex-config.json | 1 + .../events/on-error/complex-config.json | 1 + .../renderer/config/mixed-codebundleid.json | 105 ++++++++++++++++++ .../page-title-clear-complex-config.json | 1 + .../page-title-update-complex-config.json | 1 + .../handled-error/complex-config.json | 1 + .../uncaught-exception/complex-config.json | 1 + .../unhandled-rejection/complex-config.json | 1 + .../events/sessions/complex-config.json | 1 + 29 files changed, 411 insertions(+), 7 deletions(-) create mode 100644 test/electron/fixtures/app/src/configs/mixed-codebundleid.js create mode 100644 test/electron/fixtures/events/main/handled-error/mixed-codebundleid.json create mode 100644 test/electron/fixtures/events/renderer/config/mixed-codebundleid.json diff --git a/CHANGELOG.md b/CHANGELOG.md index d2935cbcad..ee3a6adfbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [Unreleased] + +### Added + +- Add `codeBundleId` config option to main process [#2577](https://github.com/bugsnag/bugsnag-js/pull/2577) + ## [8.6.0] - 2025-09-25 ### Added diff --git a/package-lock.json b/package-lock.json index 234ffb7ab1..9488cfd1f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53001,6 +53001,7 @@ "packages/plugin-electron-app": { "name": "@bugsnag/plugin-electron-app", "version": "8.6.0", + "hasInstallScript": true, "license": "MIT", "dependencies": { "bindings": "^1.5.0" @@ -53042,6 +53043,7 @@ "packages/plugin-electron-client-state-persistence": { "name": "@bugsnag/plugin-electron-client-state-persistence", "version": "8.6.0", + "hasInstallScript": true, "license": "MIT", "dependencies": { "bindings": "^1.5.0" diff --git a/packages/electron/src/config/main.js b/packages/electron/src/config/main.js index 932e083de8..737eee5161 100644 --- a/packages/electron/src/config/main.js +++ b/packages/electron/src/config/main.js @@ -35,6 +35,11 @@ module.exports.schema = { validate: value => value === null || stringWithLength(value), message: 'should be string' }, + codeBundleId: { + defaultValue: () => undefined, + message: 'should be a string', + validate: val => (val === undefined || stringWithLength(val)) + }, releaseStage: { ...schema.releaseStage, defaultValue: () => app.isPackaged ? 'production' : 'development' diff --git a/packages/electron/types/notifier.d.ts b/packages/electron/types/notifier.d.ts index bd680fa6d9..aa10630ec0 100644 --- a/packages/electron/types/notifier.d.ts +++ b/packages/electron/types/notifier.d.ts @@ -26,6 +26,7 @@ interface MainConfig extends Config { projectRoot?: string launchDurationMillis?: number sendCode?: boolean + codeBundleId?: string } // a renderer is only allowed a subset of properties from Config diff --git a/packages/plugin-electron-app/app.js b/packages/plugin-electron-app/app.js index d01b68dbf5..4d2ee9e960 100644 --- a/packages/plugin-electron-app/app.js +++ b/packages/plugin-electron-app/app.js @@ -106,7 +106,8 @@ module.exports = (NativeClient, process, electronApp, BrowserWindow, filestore, isLaunching: true, releaseStage: client._config.releaseStage, type: client._config.appType || osToAppType.get(process.platform), - version: client._config.appVersion + version: client._config.appVersion, + codeBundleId: client._config.codeBundleId }) client.addMetadata('app', { diff --git a/packages/plugin-electron-app/test/app.test.ts b/packages/plugin-electron-app/test/app.test.ts index 3ca4e56633..d5b995b5ef 100644 --- a/packages/plugin-electron-app/test/app.test.ts +++ b/packages/plugin-electron-app/test/app.test.ts @@ -13,6 +13,7 @@ const makeExpectedSessionApp = (customisations = {}) => ({ releaseStage: 'production', type: undefined, version: '1.2.3', + codeBundleId: undefined, ...customisations }) @@ -181,6 +182,19 @@ describe('plugin: electron app info', () => { expect(session.app).toEqual(makeExpectedSessionApp()) }) + it('reports app.codeBundleId when configured', async () => { + const config = { codeBundleId: 'test-bundle-123' } + + const { sendEvent, sendSession } = makeClient({ config }) + + const event = await sendEvent() + expect(event.app).toEqual(makeExpectedEventApp({ codeBundleId: 'test-bundle-123' })) + expect(event.getMetadata('app')).toEqual(makeExpectedMetadataApp()) + + const session = await sendSession() + expect(session.app).toEqual(makeExpectedSessionApp({ codeBundleId: 'test-bundle-123' })) + }) + it('tracks focus and blur events for inForeground', async () => { const BrowserWindow = makeBrowserWindow() const electronApp = makeElectronApp({ BrowserWindow }) @@ -801,6 +815,11 @@ const schema = { }), allowPartialObject: true, validate: value => true + }, + codeBundleId: { + defaultValue: () => undefined, + message: 'should be a string', + validate: val => (val === undefined || typeof val === 'string') } } diff --git a/packages/plugin-electron-ipc/bugsnag-ipc-main.js b/packages/plugin-electron-ipc/bugsnag-ipc-main.js index 8d8a01a9e9..64656d2f2e 100644 --- a/packages/plugin-electron-ipc/bugsnag-ipc-main.js +++ b/packages/plugin-electron-ipc/bugsnag-ipc-main.js @@ -100,7 +100,8 @@ module.exports = class BugsnagIpcMain { ...event.app, releaseStage: this.client._config.releaseStage, version: this.client._config.appVersion, - type: this.client._config.appType + type: this.client._config.appType, + codeBundleId: this.client._config.codeBundleId } event.context = event.context || this.client._context event.groupingDiscriminator = event.groupingDiscriminator || this.client._groupingDiscriminator 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 4abba5aa06..c75075256e 100644 --- a/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts +++ b/packages/plugin-electron-ipc/test/bugsnag-ipc-main.test.ts @@ -311,7 +311,8 @@ describe('BugsnagIpcMain', () => { releaseStage: 'production', name: 'testApp', type: 'test', - version: undefined + version: undefined, + codeBundleId: undefined }, breadcrumbs: client._breadcrumbs, context: 'ctx', @@ -335,6 +336,35 @@ describe('BugsnagIpcMain', () => { }) }) + it('should include codeBundleId in app object when configured', async () => { + const schema = { + codeBundleId: { + defaultValue: () => undefined, + message: 'should be a string', + validate: (val: unknown) => (val === undefined || typeof val === 'string') + }, + releaseStage: { + defaultValue: () => 'production', + message: 'should be a string', + validate: (val: unknown) => typeof val === 'string' + } + } + const client = new Client({ + apiKey: '123', + codeBundleId: 'test-bundle-456' + }, schema, [mockClientStateManagerPlugin], Notifier) + + const bugsnagIpcMain = new BugsnagIpcMain(client) + const payloadInfo = await bugsnagIpcMain.getPayloadInfo() + + expect(payloadInfo.app).toEqual({ + releaseStage: 'production', + version: undefined, + type: undefined, + codeBundleId: 'test-bundle-456' + }) + }) + it('should return shouldSend=false when a callback returns false', async () => { const cb = jest.fn(() => false) // @ts-expect-error _internal is not a property of jest mocks but if we diff --git a/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts b/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts index 6cbb8043f2..3cacb8c581 100644 --- a/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts +++ b/packages/plugin-electron-ipc/test/bugsnag-ipc-renderer.test.ts @@ -156,4 +156,36 @@ describe('BugsnagIpcRenderer', () => { await BugsnagIpcRenderer.dispatch(event) expect(electron.ipcRenderer.invoke).toHaveBeenCalledWith(CHANNEL_RENDERER_TO_MAIN, 'dispatch', JSON.stringify(event)) }) + + it('should receive main process codeBundleId via getPayloadInfo but not use it when renderer has no codeBundleId', async () => { + // Mock the electron.ipcRenderer.invoke to return payload info with main's codeBundleId + const mockPayloadInfo = { + app: { + releaseStage: 'production', + version: '1.0.0', + type: 'electron', + codeBundleId: 'main-bundle-abc123' + }, + breadcrumbs: [], + context: null, + device: {}, + metadata: {}, + features: [], + user: {}, + groupingDiscriminator: null + }; + + (electron.ipcRenderer.invoke as jest.Mock).mockResolvedValueOnce(mockPayloadInfo) + + // Verify that getPayloadInfo returns the main's codeBundleId + const result = await BugsnagIpcRenderer.getPayloadInfo() + + expect(electron.ipcRenderer.invoke).toHaveBeenCalledWith(CHANNEL_RENDERER_TO_MAIN, 'getPayloadInfo') + expect(result.app.codeBundleId).toBe('main-bundle-abc123') + + // Note: This test verifies the IPC transport mechanism works correctly. + // The actual isolation behavior (preventing main's codeBundleId from being used + // when renderer has no codeBundleId) is enforced by the renderer-event-data plugin + // which explicitly sets codeBundleId from the renderer's own config. + }) }) diff --git a/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts b/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts index 17ee8fbec7..fb52bd3aed 100644 --- a/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts +++ b/packages/plugin-electron-renderer-event-data/test/renderer-event-data.test.ts @@ -22,8 +22,9 @@ describe('plugin: electron renderer event data', () => { const features = [{ name: 'flag1', variant: 'variant1' }] const metadata = { meta: { data: true } } const groupingDiscriminator = 'test-discriminator' + const codeBundleId = 'main-bundle-123' - const { sendEvent } = makeClient({ context, breadcrumbs, app, device, user, features, metadata, groupingDiscriminator }) + const { sendEvent } = makeClient({ context, breadcrumbs, app, device, user, features, metadata, groupingDiscriminator, codeBundleId }) const event = await sendEvent() @@ -66,7 +67,44 @@ describe('plugin: electron renderer event data', () => { expect(event.getUser()).toStrictEqual({ id: 456, email: 'abc@example.com', name: 'abc' }) }) + + it('does not use main process codeBundleId when renderer has no codeBundleId set', async () => { + // Simulate main process having a codeBundleId but renderer config having undefined + const mainProcessPayload = { + app: { + releaseStage: 'production', + version: '1.0.0', + type: 'electron', + codeBundleId: 'main-bundle-abc123' // This should NOT be used by renderer + }, + breadcrumbs: [], + context: null, + device: {}, + metadata: {}, + features: [], + user: {}, + groupingDiscriminator: null + } + + // Create client with no codeBundleId in renderer config (undefined) + const { sendEvent } = makeClientForPlugin({ + plugins: [plugin(makeIpcRenderer(mainProcessPayload))], + config: { + // Explicitly omit codeBundleId to simulate renderer with no codeBundleId config + } + }) + + const event = await sendEvent() + + // The renderer should use its own config value (undefined), not the main process value + expect(event.app.codeBundleId).toBeUndefined() + + // Verify other app properties from main process are still applied + expect(event.app.releaseStage).toBe('production') + expect(event.app.version).toBe('1.0.0') + expect(event.app.type).toBe('electron') + }) }) -const makeClient = payloadInfo => makeClientForPlugin({ plugins: [plugin(makeIpcRenderer(payloadInfo))] }) -const makeIpcRenderer = payloadInfo => ({ getPayloadInfo: async () => payloadInfo }) +const makeClient = (payloadInfo: any) => makeClientForPlugin({ plugins: [plugin(makeIpcRenderer(payloadInfo))] }) +const makeIpcRenderer = (payloadInfo: any) => ({ getPayloadInfo: async () => payloadInfo }) diff --git a/test/electron/features/error-handling.feature b/test/electron/features/error-handling.feature index eb7a7065f9..9a1008913a 100644 --- a/test/electron/features/error-handling.feature +++ b/test/electron/features/error-handling.feature @@ -105,3 +105,15 @@ Feature: Detecting and reporting errors | config | | default | | complex-config | + + Scenario: Main process uses main codeBundleId when different from renderer + Given I launch an app with configuration: + | bugsnag | mixed-codebundleid | + When I click "main-notify" + Then the total requests received by the server matches: + | events | 1 | + Then the headers of every event request contains: + | Bugsnag-API-Key | 6425093c6530f554a9897d2d7d38e248 | + | Content-Type | application/json | + | Bugsnag-Integrity | {BODY_SHA1} | + Then the contents of an event request matches "main/handled-error/mixed-codebundleid.json" diff --git a/test/electron/features/renderer-config.feature b/test/electron/features/renderer-config.feature index d8ede118ca..3c6553bc93 100644 --- a/test/electron/features/renderer-config.feature +++ b/test/electron/features/renderer-config.feature @@ -37,4 +37,16 @@ Feature: Setting config options in renderers | property | config | | clear-user | { "user": { "id": "3", "name": "Bugs Nag", "email": "bugs.nag@bugsnag.com" } } | | clear-context | { "context": "renderer context" } | - | clear-metadata | { "metadata": { "renderer": { "key": "value" } } } | \ No newline at end of file + | clear-metadata | { "metadata": { "renderer": { "key": "value" } } } | + + Scenario: Different codeBundleId values in main and renderer processes + Given I launch an app with configuration: + | bugsnag | mixed-codebundleid | + And I click "renderer-notify" + Then the total requests received by the server matches: + | events | 1 | + Then the headers of every event request contains: + | Bugsnag-API-Key | 6425093c6530f554a9897d2d7d38e248 | + | Content-Type | application/json | + | Bugsnag-Integrity | {BODY_SHA1} | + Then the contents of an event request matches "renderer/config/mixed-codebundleid.json" \ No newline at end of file diff --git a/test/electron/features/support/steps/request-steps.js b/test/electron/features/support/steps/request-steps.js index 49db7cd3cb..ffaeab856e 100644 --- a/test/electron/features/support/steps/request-steps.js +++ b/test/electron/features/support/steps/request-steps.js @@ -41,6 +41,18 @@ Given('I launch an app with configuration:', launchConfig, (data) => { setup[key] = config }) + // If no explicit renderer_config was provided, check if the bugsnag config file has a renderer export + if (setup.renderer_config === '{}' && setup.bugsnag !== 'default') { + try { + const configModule = require(`../../../fixtures/app/src/configs/${setup.bugsnag}.js`) + if (typeof configModule.renderer === 'function') { + setup.renderer_config = JSON.stringify(configModule.renderer()) + } + } catch (e) { + // If the config file doesn't exist or doesn't have a renderer export, use the default + } + } + return global.automator.start({ BUGSNAG_CONFIG: setup.bugsnag, BUGSNAG_PRELOAD: setup.preload, diff --git a/test/electron/fixtures/app/src/configs/complex-config.js b/test/electron/fixtures/app/src/configs/complex-config.js index 540a85f7af..c49cc3b6b9 100644 --- a/test/electron/fixtures/app/src/configs/complex-config.js +++ b/test/electron/fixtures/app/src/configs/complex-config.js @@ -2,6 +2,7 @@ module.exports = () => { return { appType: 'complicated', appVersion: '2.0.83-beta3', + codeBundleId: '2.0.83-beta3-r456', context: 'shopping cart', user: { id: '3', diff --git a/test/electron/fixtures/app/src/configs/mixed-codebundleid.js b/test/electron/fixtures/app/src/configs/mixed-codebundleid.js new file mode 100644 index 0000000000..399b68f084 --- /dev/null +++ b/test/electron/fixtures/app/src/configs/mixed-codebundleid.js @@ -0,0 +1,14 @@ +module.exports = () => { + return { + appType: 'mixed-bundle', + appVersion: '1.0.0', + codeBundleId: 'main-bundle-abc123', + releaseStage: 'test' + } +} + +module.exports.renderer = () => { + return { + codeBundleId: 'renderer-bundle-xyz789' + } +} diff --git a/test/electron/fixtures/events/app-launch/complex-config.json b/test/electron/fixtures/events/app-launch/complex-config.json index 8911ca9a67..d893ba84f2 100644 --- a/test/electron/fixtures/events/app-launch/complex-config.json +++ b/test/electron/fixtures/events/app-launch/complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/main/breadcrumbs/complex-config.json b/test/electron/fixtures/events/main/breadcrumbs/complex-config.json index 48b6d860b5..55c605e331 100644 --- a/test/electron/fixtures/events/main/breadcrumbs/complex-config.json +++ b/test/electron/fixtures/events/main/breadcrumbs/complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/main/handled-error/complex-config.json b/test/electron/fixtures/events/main/handled-error/complex-config.json index d3606af6cb..3b8acdcb17 100644 --- a/test/electron/fixtures/events/main/handled-error/complex-config.json +++ b/test/electron/fixtures/events/main/handled-error/complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/main/handled-error/mixed-codebundleid.json b/test/electron/fixtures/events/main/handled-error/mixed-codebundleid.json new file mode 100644 index 0000000000..48d219fc55 --- /dev/null +++ b/test/electron/fixtures/events/main/handled-error/mixed-codebundleid.json @@ -0,0 +1,101 @@ +{ + "apiKey": "6425093c6530f554a9897d2d7d38e248", + "notifier": { + "name": "Bugsnag Electron", + "url": "https://github.com/bugsnag/bugsnag-electron", + "version": "{REGEX:^200\\.1\\.0-canary\\.[0-9a-f]{24}$}" + }, + "events": [ + { + "payloadVersion": "4", + "app": { + "codeBundleId": "main-bundle-abc123", + "duration": "{TYPE:number}", + "releaseStage": "test", + "inForeground": "{TYPE:boolean}", + "isLaunching": "{TYPE:boolean}", + "type": "mixed-bundle", + "version": "1.0.0" + }, + "device": { + "runtimeVersions": { + "node": "{TYPE:string}", + "chrome": "{TYPE:string}", + "electron": "{TYPE:string}" + }, + "id": "{REGEX:[0-9a-f]{64}}", + "freeMemory": "{TYPE:number}", + "time": "{TIMESTAMP}", + "totalMemory": "{TYPE:number}", + "osVersion": "{REGEX:\\d+\\.\\d+}" + }, + "metaData": { + "app": { + "name": "Runner", + "CFBundleVersion": "{PLATFORM_MACOS:1.0.2}" + }, + "device": { + "online": "{TYPE:boolean}", + "idleTime": "{TYPE:number}", + "screenResolution": { + "width": "{TYPE:number}", + "height": "{TYPE:number}" + } + }, + "process": { + "type": "browser", + "heapStatistics": {} + } + }, + "severity": "warning", + "unhandled": false, + "severityReason": { + "type": "handledException" + }, + "breadcrumbs": [ + { + "type": "state", + "name": "Bugsnag loaded", + "timestamp": "{TIMESTAMP}", + "metaData": {} + }, + { + "type": "state", + "name": "App became ready", + "timestamp": "{TIMESTAMP}" + }, + { + "type": "state", + "name": "Browser window 1 created", + "timestamp": "{TIMESTAMP}", + "metaData": { + "id": 1 + } + }, + { + "type": "state", + "name": "Browser window 1 was shown", + "timestamp": "{TIMESTAMP}", + "metaData": { + "id": 1, + "title": "Runner" + } + } + ], + "exceptions": [ + { + "errorMessage": "something bad", + "errorClass": "ReferenceError", + "stacktrace": [{ + "file": ".webpack/main/index.js", + "lineNumber": 2, + "code": { + "1": "{TYPE:string}" + } + }], + "type": "electronnodejs" + } + ] + } + ] +} \ No newline at end of file diff --git a/test/electron/fixtures/events/main/uncaught-exception/complex-config.json b/test/electron/fixtures/events/main/uncaught-exception/complex-config.json index 20f1f34d64..5b4fbd9134 100644 --- a/test/electron/fixtures/events/main/uncaught-exception/complex-config.json +++ b/test/electron/fixtures/events/main/uncaught-exception/complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/main/unhandled-rejection/complex-config.json b/test/electron/fixtures/events/main/unhandled-rejection/complex-config.json index b1dc77bc44..2cd2f0d531 100644 --- a/test/electron/fixtures/events/main/unhandled-rejection/complex-config.json +++ b/test/electron/fixtures/events/main/unhandled-rejection/complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/on-error/complex-config.json b/test/electron/fixtures/events/on-error/complex-config.json index 1af891d6b2..cf06bbf866 100644 --- a/test/electron/fixtures/events/on-error/complex-config.json +++ b/test/electron/fixtures/events/on-error/complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/renderer/config/mixed-codebundleid.json b/test/electron/fixtures/events/renderer/config/mixed-codebundleid.json new file mode 100644 index 0000000000..e6226bf41d --- /dev/null +++ b/test/electron/fixtures/events/renderer/config/mixed-codebundleid.json @@ -0,0 +1,105 @@ +{ + "apiKey": "6425093c6530f554a9897d2d7d38e248", + "notifier": { + "name": "Bugsnag Electron", + "url": "https://github.com/bugsnag/bugsnag-electron", + "version": "{REGEX:^200\\.1\\.0-canary\\.[0-9a-f]{24}$}" + }, + "events": [ + { + "payloadVersion": "4", + "app": { + "codeBundleId": "renderer-bundle-xyz789", + "duration": "{TYPE:number}", + "releaseStage": "test", + "inForeground": "{TYPE:boolean}", + "isLaunching": "{TYPE:boolean}", + "type": "mixed-bundle", + "version": "1.0.0" + }, + "device": { + "runtimeVersions": { + "node": "{TYPE:string}", + "chrome": "{TYPE:string}", + "electron": "{TYPE:string}" + }, + "id": "{REGEX:[0-9a-f]{64}}", + "freeMemory": "{TYPE:number}", + "time": "{TIMESTAMP}", + "totalMemory": "{TYPE:number}", + "osVersion": "{REGEX:\\d+\\.\\d+}" + }, + "metaData": { + "app": { + "name": "Runner", + "CFBundleVersion": "{PLATFORM_MACOS:1.0.2}" + }, + "device": { + "online": "{TYPE:boolean}", + "idleTime": "{TYPE:number}", + "screenResolution": { + "width": "{TYPE:number}", + "height": "{TYPE:number}" + } + }, + "process": { + "type": "renderer", + "sandboxed": true, + "isMainFrame": true, + "heapStatistics": {} + } + }, + "severity": "warning", + "unhandled": false, + "severityReason": { + "type": "handledException" + }, + "breadcrumbs": [ + { + "type": "state", + "name": "Bugsnag loaded", + "timestamp": "{TIMESTAMP}", + "metaData": {} + }, + { + "type": "state", + "name": "App became ready", + "timestamp": "{TIMESTAMP}" + }, + { + "type": "state", + "name": "Browser window 1 created", + "timestamp": "{TIMESTAMP}", + "metaData": { + "id": 1 + } + }, + { + "type": "state", + "name": "Browser window 1 was shown", + "timestamp": "{TIMESTAMP}", + "metaData": { + "id": 1, + "title": "Runner" + } + } + ], + "exceptions": [ + { + "errorMessage": "{REGEX:ALERT!$}", + "errorClass": "Error", + "stacktrace": [ + { + "lineNumber": 1, + "file": ".webpack/renderer/main_window/index.js", + "code": { + "1": "{TYPE:string}" + } + } + ], + "type": "electronrendererjs" + } + ] + } + ] +} \ No newline at end of file diff --git a/test/electron/fixtures/events/renderer/context/page-title-clear-complex-config.json b/test/electron/fixtures/events/renderer/context/page-title-clear-complex-config.json index 7b9ba19a1d..2a0919a77e 100644 --- a/test/electron/fixtures/events/renderer/context/page-title-clear-complex-config.json +++ b/test/electron/fixtures/events/renderer/context/page-title-clear-complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/renderer/context/page-title-update-complex-config.json b/test/electron/fixtures/events/renderer/context/page-title-update-complex-config.json index 7b9ba19a1d..2a0919a77e 100644 --- a/test/electron/fixtures/events/renderer/context/page-title-update-complex-config.json +++ b/test/electron/fixtures/events/renderer/context/page-title-update-complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/renderer/handled-error/complex-config.json b/test/electron/fixtures/events/renderer/handled-error/complex-config.json index bb1cc772ef..645e2f3260 100644 --- a/test/electron/fixtures/events/renderer/handled-error/complex-config.json +++ b/test/electron/fixtures/events/renderer/handled-error/complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/renderer/uncaught-exception/complex-config.json b/test/electron/fixtures/events/renderer/uncaught-exception/complex-config.json index b8f43f2427..52e6ff0544 100644 --- a/test/electron/fixtures/events/renderer/uncaught-exception/complex-config.json +++ b/test/electron/fixtures/events/renderer/uncaught-exception/complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/renderer/unhandled-rejection/complex-config.json b/test/electron/fixtures/events/renderer/unhandled-rejection/complex-config.json index 3fc34940a4..48405c43f2 100644 --- a/test/electron/fixtures/events/renderer/unhandled-rejection/complex-config.json +++ b/test/electron/fixtures/events/renderer/unhandled-rejection/complex-config.json @@ -9,6 +9,7 @@ { "payloadVersion": "4", "app": { + "codeBundleId": "2.0.83-beta3-r456", "duration": "{TYPE:number}", "releaseStage": "beta", "inForeground": "{TYPE:boolean}", diff --git a/test/electron/fixtures/events/sessions/complex-config.json b/test/electron/fixtures/events/sessions/complex-config.json index 0a2328a0c7..6dc4ef5759 100644 --- a/test/electron/fixtures/events/sessions/complex-config.json +++ b/test/electron/fixtures/events/sessions/complex-config.json @@ -17,6 +17,7 @@ } }, "app": { + "codeBundleId": "2.0.83-beta3-r456", "releaseStage": "beta", "version": "2.0.83-beta3", "type": "complicated" From a5fc9f00051842f63f5eef5edf401eaff6efe66d Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Thu, 9 Oct 2025 17:11:56 +0100 Subject: [PATCH 26/38] test: :white_check_mark: skip failing react native navigation tests on android (#2585) --- .buildkite/basic/react-native-android-full-pipeline.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.buildkite/basic/react-native-android-full-pipeline.yml b/.buildkite/basic/react-native-android-full-pipeline.yml index 2148c45aeb..a46747f7e7 100644 --- a/.buildkite/basic/react-native-android-full-pipeline.yml +++ b/.buildkite/basic/react-native-android-full-pipeline.yml @@ -74,6 +74,7 @@ steps: - "0.79" - label: ':android: Build react-native-navigation {{matrix}} test fixture APK (Old Arch)' + skip: true # Skipped pending PLAT-15027 key: "build-react-native-navigation-android-fixture-old-arch" timeout_in_minutes: 30 agents: @@ -98,6 +99,7 @@ steps: limit: 1 - label: ':android: Build react-native-navigation {{matrix}} test fixture APK (New Arch)' + skip: true # Skipped pending PLAT-15027 key: "build-react-native-navigation-android-fixture-new-arch" timeout_in_minutes: 30 agents: @@ -216,6 +218,7 @@ steps: - "0.79" - label: ":bitbar: :android: react-native-navigation {{matrix}} Android 12 (Old Arch) end-to-end tests" + skip: true # Skipped pending PLAT-15027 depends_on: "build-react-native-navigation-android-fixture-old-arch" timeout_in_minutes: 10 plugins: @@ -257,6 +260,7 @@ steps: - "0.72" - label: ":bitbar: :android: react-native-navigation {{matrix}} Android 12 (New Arch) end-to-end tests" + skip: true # Skipped pending PLAT-15027 depends_on: "build-react-native-navigation-android-fixture-new-arch" timeout_in_minutes: 10 plugins: From d13ed539962c03271a34774e644a92693979c49d Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Fri, 10 Oct 2025 14:49:21 +0100 Subject: [PATCH 27/38] Revert browserstack non-https tests to ios_11 (#2586) * revert browserstack non-https tests to ios_11 * add android 9 test device * reinstate ios_11 browser error code assertions --- .buildkite/basic/browser-pipeline.yml | 7 ++--- .../features/fixtures/browser_errors.yml | 28 ++++++++++++++++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/.buildkite/basic/browser-pipeline.yml b/.buildkite/basic/browser-pipeline.yml index 1de4d04cb8..b9eacee12b 100644 --- a/.buildkite/basic/browser-pipeline.yml +++ b/.buildkite/basic/browser-pipeline.yml @@ -50,7 +50,7 @@ steps: # - label: ":browserstack: {{matrix}} non-https tests" matrix: - - ios_12 + - ios_11 - safari_16 depends_on: "browser-maze-runner-bs" timeout_in_minutes: 30 @@ -82,7 +82,7 @@ steps: - edge_17 - safari_10 - ios_15 - - android_8 + - android_9 - chrome_43 - chrome_72 - firefox_78 @@ -109,7 +109,6 @@ steps: concurrency_group: "browserstack" concurrency_method: eager - # # BitBar tests # @@ -170,4 +169,4 @@ steps: concurrency_group: "bitbar" concurrency_method: eager env: - HOST: "localhost" # IE11 needs the host set to localhost for some reason + HOST: "localhost" # IE11 needs the host set to localhost diff --git a/test/browser/features/fixtures/browser_errors.yml b/test/browser/features/fixtures/browser_errors.yml index e3d1e46b42..77a30e4cc0 100644 --- a/test/browser/features/fixtures/browser_errors.yml +++ b/test/browser/features/fixtures/browser_errors.yml @@ -103,7 +103,7 @@ safari_16: lineNumber: 18 columnNumber: 25 -ios_12: +ios_11: handled: errorClass: 'ReferenceError' errorMessage: "Can't find variable: foo" @@ -259,6 +259,32 @@ android_8: lineNumber: 18 columnNumber: 7 +android_9: + handled: + errorClass: 'ReferenceError' + errorMessage: 'foo is not defined' + unhandled_syntax: + errorClass: 'SyntaxError' + errorMessage: "Unexpected token '!'" + lineNumber: 18 + columnNumber: 13 + file: '/unhandled/script/a.html' + unhandled_thrown: + errorClass: 'Error' + errorMessage: "bad things" + lineNumber: 18 + columnNumber: 13 + unhandled_undefined_function: + errorClass: 'ReferenceError' + errorMessage: nevergoingtoexist_notinamillionyears is not defined + lineNumber: 18 + columnNumber: 7 + unhandled_malformed_uri: + errorClass: 'URIError' + errorMessage: URI malformed + lineNumber: 18 + columnNumber: 7 + firefox_78: handled: errorClass: 'ReferenceError' From ce61cb0c089ba02b8299e9981e0f6a0a3471c59f Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Wed, 8 Oct 2025 17:40:11 +0100 Subject: [PATCH 28/38] update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee3a6adfbe..e3cb87e79c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [Unreleased] +## [8.7.0] - 2025-10-09 ### Added From 5b37ac5df0b934bb9c8c16a5e40fccb90bebc4ba Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Thu, 9 Oct 2025 10:25:56 +0100 Subject: [PATCH 29/38] Update CHANGELOG.md Update scope of changelog entry to electron Co-authored-by: Yousif Ahmed <74918474+yousif-bugsnag@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3cb87e79c..c79293e4e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ### Added -- Add `codeBundleId` config option to main process [#2577](https://github.com/bugsnag/bugsnag-js/pull/2577) +- (electron) Add `codeBundleId` config option to main process [#2577](https://github.com/bugsnag/bugsnag-js/pull/2577) ## [8.6.0] - 2025-09-25 From 4673d6175817be8711ecf6ffb56ee84eaeb12ea2 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Thu, 9 Oct 2025 17:14:05 +0100 Subject: [PATCH 30/38] docs: :memo: update CHANGELOG.md --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c79293e4e3..6b10119082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ - (electron) Add `codeBundleId` config option to main process [#2577](https://github.com/bugsnag/bugsnag-js/pull/2577) +### Changed + +- Update bugsnag-cocoa to [v6.34.0](https//github.com/bugsnag/bugsnag-cocoa/releases/tag/v6.34.0) [#2571](https://github.com/bugsnag/bugsnag-js/pull/2571) + ## [8.6.0] - 2025-09-25 ### Added @@ -23,10 +27,6 @@ - (plugin-window-onerror) Guard against errors when trying to call previous handler [#2551](https://github.com/bugsnag/bugsnag-js/pull/2551) -### Dependencies - -Update bugsnag-cocoa to [v6.34.0](https//github.com/bugsnag/bugsnag-cocoa/releases/tag/v6.34.0) [#2571](https://github.com/bugsnag/bugsnag-js/pull/2571) - ## [8.5.0] - 2025-09-01 ### Added From 5549682546669ac57ee1d0c0e48621fd690a7a15 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Fri, 10 Oct 2025 14:53:10 +0100 Subject: [PATCH 31/38] update release date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b10119082..dc654be444 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [8.7.0] - 2025-10-09 +## [8.7.0] - 2025-10-13 ### Added From 0b6bf6ba58018d205156ede87736482e18e7db44 Mon Sep 17 00:00:00 2001 From: Steve Kirkland Date: Sun, 12 Oct 2025 13:30:49 +0100 Subject: [PATCH 32/38] Use Maze Runner v10 [full ci] --- docker-compose.yml | 4 ++-- dockerfiles/Dockerfile.browser | 2 +- dockerfiles/Dockerfile.node | 2 +- test/aws-lambda/Gemfile | 2 +- test/browser/Gemfile | 2 +- test/node/Gemfile | 2 +- test/react-native-cli/Gemfile | 2 +- test/react-native/Gemfile | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 800cf12031..550a97d8b0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -115,7 +115,7 @@ services: - ./reports/:/app/test/node/reports/ react-native-maze-runner: - image: 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-v9-cli + image: 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-v10-cli environment: <<: *common-environment BITBAR_USERNAME: @@ -139,7 +139,7 @@ services: - ./reports/:/app/reports react-native-cli-maze-runner: - image: 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-v9-cli + image: 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-v10-cli environment: <<: *common-environment BITBAR_USERNAME: diff --git a/dockerfiles/Dockerfile.browser b/dockerfiles/Dockerfile.browser index 251d42028d..f249209a51 100644 --- a/dockerfiles/Dockerfile.browser +++ b/dockerfiles/Dockerfile.browser @@ -55,7 +55,7 @@ RUN find . -name package.json -type f -mindepth 2 -maxdepth 3 ! -path "./node_mo RUN rm -fr **/*/node_modules/ # The maze-runner browser tests (W3C protocol) -FROM 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-v9-cli AS browser-maze-runner +FROM 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-v10-cli AS browser-maze-runner COPY --from=browser-feature-builder /app/test/browser /app/test/browser/ WORKDIR /app/test/browser diff --git a/dockerfiles/Dockerfile.node b/dockerfiles/Dockerfile.node index 09275fa94b..1b09c18c2c 100644 --- a/dockerfiles/Dockerfile.node +++ b/dockerfiles/Dockerfile.node @@ -22,7 +22,7 @@ RUN npm pack --verbose packages/plugin-restify/ RUN npm pack --verbose packages/plugin-hono/ # The maze-runner node tests -FROM 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-v9-cli as node-maze-runner +FROM 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-v10-cli as node-maze-runner WORKDIR /app/ COPY packages/node/ . COPY test/node/features test/node/features diff --git a/test/aws-lambda/Gemfile b/test/aws-lambda/Gemfile index 2c6a8f9ddf..3be2e6f61c 100644 --- a/test/aws-lambda/Gemfile +++ b/test/aws-lambda/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'bugsnag-maze-runner', '~>9.0' +gem 'bugsnag-maze-runner', '~>10.0' # Use a branch of Maze Runner # gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner', branch: 'tms/use-maze-check' diff --git a/test/browser/Gemfile b/test/browser/Gemfile index c1ff00ee7b..5066a995c9 100644 --- a/test/browser/Gemfile +++ b/test/browser/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'bugsnag-maze-runner', '~> 9.0' +gem 'bugsnag-maze-runner', '~> 10.0' # Use a branch of Maze Runner #gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner', branch: 'tms/use-maze-check' diff --git a/test/node/Gemfile b/test/node/Gemfile index 29d3f3cccb..a911459674 100644 --- a/test/node/Gemfile +++ b/test/node/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'bugsnag-maze-runner', '~>8.0' +gem 'bugsnag-maze-runner', '~>10.0' # Use a branch of Maze Runner #gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner', branch: 'tms/use-maze-check' diff --git a/test/react-native-cli/Gemfile b/test/react-native-cli/Gemfile index 9eb0d7678d..44c25e95eb 100644 --- a/test/react-native-cli/Gemfile +++ b/test/react-native-cli/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' gem 'cocoapods' gem 'xcodeproj', '< 1.26.0' -gem 'bugsnag-maze-runner', '~>9.0' +gem 'bugsnag-maze-runner', '~>10.0' # Use a branch of Maze Runner #gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner', branch: 'tms/use-maze-check' diff --git a/test/react-native/Gemfile b/test/react-native/Gemfile index 206ecd5fde..2c9de72294 100644 --- a/test/react-native/Gemfile +++ b/test/react-native/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' gem 'cocoapods' gem 'xcodeproj', '< 1.26.0' -gem 'bugsnag-maze-runner', '~>9.0' +gem 'bugsnag-maze-runner', '~>10.0' # Use a branch of Maze Runner #gem 'bugsnag-maze-runner', git: 'https://github.com/bugsnag/maze-runner', branch: 'tms/use-maze-check' From a0d2fbdfa6126de40958832c789a54263aeaba8e Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Mon, 13 Oct 2025 09:04:01 +0100 Subject: [PATCH 33/38] fix: use common.determineVersion instead of common.getCommitId when installing cli --- scripts/generate-react-native-cli-fixture.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/generate-react-native-cli-fixture.js b/scripts/generate-react-native-cli-fixture.js index 90983cba43..010acd2520 100644 --- a/scripts/generate-react-native-cli-fixture.js +++ b/scripts/generate-react-native-cli-fixture.js @@ -22,7 +22,7 @@ if (!process.env.RCT_NEW_ARCH_ENABLED || (process.env.RCT_NEW_ARCH_ENABLED !== ' process.exit(1) } -const notifierVersion = process.env.NOTIFIER_VERSION || common.getCommitId() +const notifierVersion = process.env.NOTIFIER_VERSION || common.determineVersion() const reactNativeVersion = process.env.RN_VERSION const ROOT_DIR = resolve(__dirname, '../') From b95a30dbb57e72f9f5281c0905005b2ec6b8d6dc Mon Sep 17 00:00:00 2001 From: Milo Clack Date: Mon, 13 Oct 2025 10:19:25 +0100 Subject: [PATCH 34/38] Fix `undefined is not a function` for `String.prototype.startsWith` (#2568) * Fix `undefined is not a function` for `String.prototype.startsWith` * Changelog entry added --------- Co-authored-by: Romain Menke <11521496+romainmenke@users.noreply.github.com> --- CHANGELOG.md | 1 + packages/core/client.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee3a6adfbe..8482cfd9dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - Update bugsnag-cocoa to [v6.33.1](https//github.com/bugsnag/bugsnag-cocoa/releases/tag/v6.33.1) [#2552](https://github.com/bugsnag/bugsnag-js/pull/2552) - Update bugsnag-android to [v6.18.0](https//github.com/bugsnag/bugsnag-android/releases/tag/v6.18.0) [#2556](https://github.com/bugsnag/bugsnag-js/pull/2556) +- (core): Change `startsWith()` to `indexOf() === 0` to support older browsers [#2568](https://github.com/bugsnag/bugsnag-js/pull/2568) ### Fixed diff --git a/packages/core/client.js b/packages/core/client.js index bb58111b95..04ec54eabc 100644 --- a/packages/core/client.js +++ b/packages/core/client.js @@ -169,7 +169,7 @@ class Client { // warn about an apikey that is not of the expected format if (!/^[0-9a-f]{32}$/i.test(config.apiKey)) errors.apiKey = 'should be a string of 32 hexadecimal characters' - if (opts.endpoints === undefined && config.apiKey.startsWith(HUB_PREFIX)) { + if (opts.endpoints === undefined && config.apiKey.indexOf(HUB_PREFIX) === 0) { config.endpoints = { notify: HUB_NOTIFY, sessions: HUB_SESSION From 09b0b9d3d29e59113f801bf7ed714a81c313c9d5 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Mon, 13 Oct 2025 10:50:03 +0000 Subject: [PATCH 35/38] v8.7.0 --- lerna.json | 2 +- package-lock.json | 24 +++++++++---------- packages/electron/package.json | 8 +++---- packages/plugin-electron-app/package.json | 2 +- packages/plugin-electron-ipc/package.json | 2 +- .../package.json | 2 +- packages/react-native/package.json | 2 +- 7 files changed, 20 insertions(+), 22 deletions(-) diff --git a/lerna.json b/lerna.json index ef91fc39af..eac802f781 100644 --- a/lerna.json +++ b/lerna.json @@ -2,6 +2,6 @@ "packages": [ "packages/*" ], - "version": "8.6.0", + "version": "8.7.0", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9488cfd1f2..512e83c126 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46734,7 +46734,7 @@ }, "packages/electron": { "name": "@bugsnag/electron", - "version": "8.6.0", + "version": "8.7.0", "license": "MIT", "dependencies": { "@bugsnag/core": "^8.6.0", @@ -46742,19 +46742,19 @@ "@bugsnag/electron-filestore": "^8.0.0", "@bugsnag/electron-network-status": "^8.6.0", "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", - "@bugsnag/plugin-electron-app": "^8.6.0", + "@bugsnag/plugin-electron-app": "^8.7.0", "@bugsnag/plugin-electron-app-breadcrumbs": "^8.6.0", "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", "@bugsnag/plugin-electron-client-state-persistence": "^8.6.0", "@bugsnag/plugin-electron-deliver-minidumps": "^8.6.0", "@bugsnag/plugin-electron-device": "^8.6.0", - "@bugsnag/plugin-electron-ipc": "^8.6.0", + "@bugsnag/plugin-electron-ipc": "^8.7.0", "@bugsnag/plugin-electron-net-breadcrumbs": "^8.6.0", "@bugsnag/plugin-electron-network-status": "^8.6.0", "@bugsnag/plugin-electron-preload-error": "^8.6.0", "@bugsnag/plugin-electron-process-info": "^8.6.0", "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.6.0", - "@bugsnag/plugin-electron-renderer-event-data": "^8.6.0", + "@bugsnag/plugin-electron-renderer-event-data": "^8.7.0", "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0", "@bugsnag/plugin-electron-session": "^8.6.0", "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", @@ -53000,8 +53000,7 @@ }, "packages/plugin-electron-app": { "name": "@bugsnag/plugin-electron-app", - "version": "8.6.0", - "hasInstallScript": true, + "version": "8.7.0", "license": "MIT", "dependencies": { "bindings": "^1.5.0" @@ -53043,7 +53042,6 @@ "packages/plugin-electron-client-state-persistence": { "name": "@bugsnag/plugin-electron-client-state-persistence", "version": "8.6.0", - "hasInstallScript": true, "license": "MIT", "dependencies": { "bindings": "^1.5.0" @@ -53088,7 +53086,7 @@ }, "packages/plugin-electron-ipc": { "name": "@bugsnag/plugin-electron-ipc", - "version": "8.6.0", + "version": "8.7.0", "license": "MIT", "dependencies": { "@bugsnag/safe-json-stringify": "^6.0.0" @@ -53259,7 +53257,7 @@ }, "packages/plugin-electron-renderer-event-data": { "name": "@bugsnag/plugin-electron-renderer-event-data", - "version": "8.6.0", + "version": "8.7.0", "license": "MIT", "devDependencies": { "@bugsnag/core": "^8.6.0", @@ -53727,7 +53725,7 @@ }, "packages/react-native": { "name": "@bugsnag/react-native", - "version": "8.6.0", + "version": "8.7.0", "license": "MIT", "dependencies": { "@bugsnag/core": "^8.6.0", @@ -55677,19 +55675,19 @@ "@bugsnag/electron-filestore": "^8.0.0", "@bugsnag/electron-network-status": "^8.6.0", "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", - "@bugsnag/plugin-electron-app": "^8.6.0", + "@bugsnag/plugin-electron-app": "^8.7.0", "@bugsnag/plugin-electron-app-breadcrumbs": "^8.6.0", "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", "@bugsnag/plugin-electron-client-state-persistence": "^8.6.0", "@bugsnag/plugin-electron-deliver-minidumps": "^8.6.0", "@bugsnag/plugin-electron-device": "^8.6.0", - "@bugsnag/plugin-electron-ipc": "^8.6.0", + "@bugsnag/plugin-electron-ipc": "^8.7.0", "@bugsnag/plugin-electron-net-breadcrumbs": "^8.6.0", "@bugsnag/plugin-electron-network-status": "^8.6.0", "@bugsnag/plugin-electron-preload-error": "^8.6.0", "@bugsnag/plugin-electron-process-info": "^8.6.0", "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.6.0", - "@bugsnag/plugin-electron-renderer-event-data": "^8.6.0", + "@bugsnag/plugin-electron-renderer-event-data": "^8.7.0", "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0", "@bugsnag/plugin-electron-session": "^8.6.0", "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", diff --git a/packages/electron/package.json b/packages/electron/package.json index 3612f1d455..6828f5f96f 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/electron", - "version": "8.6.0", + "version": "8.7.0", "main": "src/notifier.js", "exports": { ".": { @@ -38,19 +38,19 @@ "@bugsnag/electron-filestore": "^8.0.0", "@bugsnag/electron-network-status": "^8.6.0", "@bugsnag/plugin-console-breadcrumbs": "^8.6.0", - "@bugsnag/plugin-electron-app": "^8.6.0", + "@bugsnag/plugin-electron-app": "^8.7.0", "@bugsnag/plugin-electron-app-breadcrumbs": "^8.6.0", "@bugsnag/plugin-electron-client-state-manager": "^8.6.0", "@bugsnag/plugin-electron-client-state-persistence": "^8.6.0", "@bugsnag/plugin-electron-deliver-minidumps": "^8.6.0", "@bugsnag/plugin-electron-device": "^8.6.0", - "@bugsnag/plugin-electron-ipc": "^8.6.0", + "@bugsnag/plugin-electron-ipc": "^8.7.0", "@bugsnag/plugin-electron-net-breadcrumbs": "^8.6.0", "@bugsnag/plugin-electron-network-status": "^8.6.0", "@bugsnag/plugin-electron-preload-error": "^8.6.0", "@bugsnag/plugin-electron-process-info": "^8.6.0", "@bugsnag/plugin-electron-renderer-client-state-updates": "^8.6.0", - "@bugsnag/plugin-electron-renderer-event-data": "^8.6.0", + "@bugsnag/plugin-electron-renderer-event-data": "^8.7.0", "@bugsnag/plugin-electron-renderer-strip-project-root": "^8.6.0", "@bugsnag/plugin-electron-session": "^8.6.0", "@bugsnag/plugin-interaction-breadcrumbs": "^8.6.0", diff --git a/packages/plugin-electron-app/package.json b/packages/plugin-electron-app/package.json index 2c174b6014..66e46415e0 100644 --- a/packages/plugin-electron-app/package.json +++ b/packages/plugin-electron-app/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-app", - "version": "8.6.0", + "version": "8.7.0", "main": "app.js", "description": "@bugsnag/electron plugin to collect app information", "repository": { diff --git a/packages/plugin-electron-ipc/package.json b/packages/plugin-electron-ipc/package.json index 8fb7ee34a8..63e1dc09a8 100644 --- a/packages/plugin-electron-ipc/package.json +++ b/packages/plugin-electron-ipc/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-ipc", - "version": "8.6.0", + "version": "8.7.0", "main": "electron-ipc.js", "description": "@bugsnag/electron plugin to create the IPC layer between main and renderer processes", "repository": { diff --git a/packages/plugin-electron-renderer-event-data/package.json b/packages/plugin-electron-renderer-event-data/package.json index 3ea100da00..98a516a58d 100644 --- a/packages/plugin-electron-renderer-event-data/package.json +++ b/packages/plugin-electron-renderer-event-data/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/plugin-electron-renderer-event-data", - "version": "8.6.0", + "version": "8.7.0", "main": "renderer-event-data.js", "description": "@bugsnag/electron plugin to get fully populated event data in renderer callbacks", "homepage": "https://www.bugsnag.com/", diff --git a/packages/react-native/package.json b/packages/react-native/package.json index e17bf8f733..9bb40047fa 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/react-native", - "version": "8.6.0", + "version": "8.7.0", "main": "src/notifier.js", "types": "types/bugsnag.d.ts", "description": "Bugsnag error reporter for React Native applications", From db43e26246acdc418613297adfb2c5c46db4ec97 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 14 Oct 2025 15:27:17 +0100 Subject: [PATCH 36/38] remove branch sync action --- .github/workflows/branch-sync.yml | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 .github/workflows/branch-sync.yml diff --git a/.github/workflows/branch-sync.yml b/.github/workflows/branch-sync.yml deleted file mode 100644 index 9971d40edb..0000000000 --- a/.github/workflows/branch-sync.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Sync main to next -on: - push: - branches: [main] - -jobs: - sync: - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Sync main to next - uses: bugsnag/github-action-branch-sync@v1 - with: - source-branch: main - target-branch: next - labels: automation - reviewers: ${{ secrets.AUTOMATION_REVIEWERS }} - team-reviewers: ${{ secrets.AUTOMATION_TEAM_REVIEWERS }} - github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 5edab47e4b5ed2a83651cb1b18ed06c40d7cea64 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Tue, 14 Oct 2025 17:13:41 +0100 Subject: [PATCH 37/38] pin @inquirer/figures to 1.0.13 --- package-lock.json | 2 ++ package.json | 1 + 2 files changed, 3 insertions(+) diff --git a/package-lock.json b/package-lock.json index 512e83c126..b7ae8e6d9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53001,6 +53001,7 @@ "packages/plugin-electron-app": { "name": "@bugsnag/plugin-electron-app", "version": "8.7.0", + "hasInstallScript": true, "license": "MIT", "dependencies": { "bindings": "^1.5.0" @@ -53042,6 +53043,7 @@ "packages/plugin-electron-client-state-persistence": { "name": "@bugsnag/plugin-electron-client-state-persistence", "version": "8.6.0", + "hasInstallScript": true, "license": "MIT", "dependencies": { "bindings": "^1.5.0" diff --git a/package.json b/package.json index dc66982fea..84964698f9 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "test:electron": "xvfb-maybe --auto-servernum -- cucumber-js test/electron/features --retry 3 --retry-tag-filter @flaky" }, "overrides": { + "@inquirer/figures": "1.0.13", "@jest-runner/electron": { "form-data": "^3.0.3" }, From b52f167565897a66a617de966129d7f98b41c427 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Wed, 15 Oct 2025 16:42:53 +0100 Subject: [PATCH 38/38] skip ie_11 tests --- .buildkite/basic/browser-pipeline.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.buildkite/basic/browser-pipeline.yml b/.buildkite/basic/browser-pipeline.yml index b9eacee12b..49962e10bc 100644 --- a/.buildkite/basic/browser-pipeline.yml +++ b/.buildkite/basic/browser-pipeline.yml @@ -144,6 +144,7 @@ steps: concurrency_method: eager - label: ":bitbar: ie_11 Browser tests" + skip: true # Skipped due to incompatibility depends_on: "browser-maze-runner-bb" timeout_in_minutes: 30 plugins: