From 03b18d18172180a2260bcf5d2580105f72c58b2e Mon Sep 17 00:00:00 2001 From: Ben Gourley Date: Thu, 21 May 2020 12:04:24 +0100 Subject: [PATCH 1/6] fix(expo-cli): Ensure version detection logic for @bugsnag/expo is correct --- packages/expo-cli/lib/insert.js | 2 +- .../test/fixtures/already-installed-01/App.js | 21 ++++++++++ .../fixtures/already-installed-01/app.json | 39 +++++++++++++++++++ .../already-installed-01/package.json | 8 ++++ packages/expo-cli/lib/test/insert.test.js | 8 ++++ 5 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 packages/expo-cli/lib/test/fixtures/already-installed-01/App.js create mode 100644 packages/expo-cli/lib/test/fixtures/already-installed-01/app.json create mode 100644 packages/expo-cli/lib/test/fixtures/already-installed-01/package.json diff --git a/packages/expo-cli/lib/insert.js b/packages/expo-cli/lib/insert.js index 24525f3309..df04bbb462 100644 --- a/packages/expo-cli/lib/insert.js +++ b/packages/expo-cli/lib/insert.js @@ -35,7 +35,7 @@ Bugsnag.start(); const getCode = async (projectRoot) => { const manifestRange = await detectInstalled(projectRoot) - const isPostV7 = !manifestRange || semver.satisfies('7.0.0', manifestRange) + const isPostV7 = !manifestRange || semver.ltr('6.99.99', manifestRange) return code[isPostV7 ? 'postV7' : 'preV7'] } diff --git a/packages/expo-cli/lib/test/fixtures/already-installed-01/App.js b/packages/expo-cli/lib/test/fixtures/already-installed-01/App.js new file mode 100644 index 0000000000..f6e6fead5e --- /dev/null +++ b/packages/expo-cli/lib/test/fixtures/already-installed-01/App.js @@ -0,0 +1,21 @@ +const React = require('react') +const { StyleSheet, Text, View } = require('react-native') + +export default class App extends React.Component { + render () { + return ( + + Hello Expo! + + ) + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#fff', + alignItems: 'center', + justifyContent: 'center' + } +}) diff --git a/packages/expo-cli/lib/test/fixtures/already-installed-01/app.json b/packages/expo-cli/lib/test/fixtures/already-installed-01/app.json new file mode 100644 index 0000000000..e22e88e72c --- /dev/null +++ b/packages/expo-cli/lib/test/fixtures/already-installed-01/app.json @@ -0,0 +1,39 @@ +{ + "expo": { + "name": "Bugsnag test fixture", + "slug": "bugsnag-test-fixture", + "privacy": "unlisted", + "sdkVersion": "32.0.0", + "platforms": [ + "ios", + "android" + ], + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/icon.png", + "splash": { + "image": "./assets/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "updates": { + "fallbackToCacheTimeout": 0 + }, + "assetBundlePatterns": [ + "**/*" + ], + "extra": { + "bugsnag": { + "apiKey": "XoXoXoXoXoXo" + } + }, + "hooks": { + "postPublish": [ + { + "file": "@bugsnag/expo/hooks/post-publish.js", + "config": {} + } + ] + } + } +} diff --git a/packages/expo-cli/lib/test/fixtures/already-installed-01/package.json b/packages/expo-cli/lib/test/fixtures/already-installed-01/package.json new file mode 100644 index 0000000000..dc05a060b8 --- /dev/null +++ b/packages/expo-cli/lib/test/fixtures/already-installed-01/package.json @@ -0,0 +1,8 @@ +{ + "name": "bugsnag-test-fixture-03", + "private": "true", + "version": "0.0.0", + "dependencies": { + "@bugsnag/expo": "^7.0.1" + } +} diff --git a/packages/expo-cli/lib/test/insert.test.js b/packages/expo-cli/lib/test/insert.test.js index b3dad7c388..ec34edd363 100644 --- a/packages/expo-cli/lib/test/insert.test.js +++ b/packages/expo-cli/lib/test/insert.test.js @@ -58,4 +58,12 @@ describe('expo-cli: insert', () => { const appJs = await promisify(readFile)(`${projectRoot}/App.js`, 'utf8') expect(appJs).toMatch(/^import bugsnag from '@bugsnag\/expo';\sconst bugsnagClient = bugsnag\(\);\s/) }) + + it('inserts correct code for post v7.0.0 versions of Bugsnag', async () => { + const projectRoot = await prepareFixture('already-installed-01') + const msg = await insert(projectRoot) + expect(msg).toBe(undefined) + const appJs = await promisify(readFile)(`${projectRoot}/App.js`, 'utf8') + expect(appJs).toMatch(/^import Bugsnag from '@bugsnag\/expo';\sBugsnag\.start\(\);\s/) + }) }) From 644a6e1f5e58e88929d838d6600defffd176e4d5 Mon Sep 17 00:00:00 2001 From: Joe Haines Date: Thu, 21 May 2020 11:45:25 +0100 Subject: [PATCH 2/6] Allow onX callbacks with no arguments Previously a callback like '() => false' would never be called due to the length check; it had to be written as '_ => false' instead --- packages/core/client.js | 6 ++--- packages/core/test/client.test.ts | 40 ++++++++++++++++++++++++------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/packages/core/client.js b/packages/core/client.js index d9788ac9b1..93e5b009f7 100644 --- a/packages/core/client.js +++ b/packages/core/client.js @@ -138,9 +138,9 @@ class Client { if (config.logger) this._logger = config.logger // add callbacks - if (config.onError && config.onError.length) this._cbs.e = this._cbs.e.concat(config.onError) - if (config.onBreadcrumb && config.onBreadcrumb.length) this._cbs.b = this._cbs.b.concat(config.onBreadcrumb) - if (config.onSession && config.onSession.length) this._cbs.s = this._cbs.s.concat(config.onSession) + if (config.onError) this._cbs.e = this._cbs.e.concat(config.onError) + if (config.onBreadcrumb) this._cbs.b = this._cbs.b.concat(config.onBreadcrumb) + if (config.onSession) this._cbs.s = this._cbs.s.concat(config.onSession) // finally warn about any invalid config where we fell back to the default if (keys(errors).length) { diff --git a/packages/core/test/client.test.ts b/packages/core/test/client.test.ts index bf6c85046f..4fa23c3213 100644 --- a/packages/core/test/client.test.ts +++ b/packages/core/test/client.test.ts @@ -159,8 +159,28 @@ describe('@bugsnag/core/client', () => { }) }) // eslint-disable-next-line jest/expect-expect - it('supports preventing send by returning false', done => { + it('supports preventing send by returning false in onError callback', done => { + const client = new Client({ + apiKey: 'API_KEY_YEAH', + onError: () => false + }) + + client._setDelivery(client => ({ + sendEvent: (payload) => { + done('sendEvent() should not be called') + }, + sendSession: () => {} + })) + + client.notify(new Error('oh em gee')) + + // give the event loop a tick to see if the event gets sent + process.nextTick(() => done()) + }) + // eslint-disable-next-line jest/expect-expect + it('supports preventing send by returning false in notify callback', done => { const client = new Client({ apiKey: 'API_KEY_YEAH' }) + client._setDelivery(client => ({ sendEvent: (payload) => { done('sendEvent() should not be called') @@ -168,7 +188,7 @@ describe('@bugsnag/core/client', () => { sendSession: () => {} })) - client.notify(new Error('oh em gee'), event => false) + client.notify(new Error('oh em gee'), () => false) // give the event loop a tick to see if the event gets sent process.nextTick(() => done()) @@ -362,10 +382,12 @@ describe('@bugsnag/core/client', () => { it('should call the callback even if the event doesn’t send (enabledReleaseStages)', done => { const client = new Client({ apiKey: 'API_KEY', enabledReleaseStages: ['production'], releaseStage: 'development' }) + client._setDelivery(client => ({ sendSession: () => {}, - sendEvent: (payload, cb) => cb(null) + sendEvent: () => { done('sendEvent() should not be called') } })) + // @ts-ignore client.notify(new Error('111'), {}, (err, event) => { expect(err).toBe(null) @@ -377,10 +399,12 @@ describe('@bugsnag/core/client', () => { it('should call the callback even if the event doesn’t send (onError)', done => { const client = new Client({ apiKey: 'API_KEY', onError: () => false }) + client._setDelivery(client => ({ sendSession: () => {}, - sendEvent: (payload, cb) => cb(null) + sendEvent: () => { done('sendEvent() should not be called') } })) + // @ts-ignore client.notify(new Error('111'), {}, (err, event) => { expect(err).toBe(null) @@ -462,7 +486,7 @@ describe('@bugsnag/core/client', () => { let calls = 0 const client = new Client({ apiKey: 'API_KEY_YEAH', - onBreadcrumb: b => { + onBreadcrumb: () => { calls++ return false } @@ -476,7 +500,7 @@ describe('@bugsnag/core/client', () => { let calls = 0 const client = new Client({ apiKey: 'API_KEY_YEAH', - onBreadcrumb: b => { + onBreadcrumb: () => { calls++ throw new Error('uh oh') } @@ -560,7 +584,7 @@ describe('@bugsnag/core/client', () => { }) it('does not start the session if onSession returns false', () => { - const client = new Client({ apiKey: 'API_KEY', onSession: s => false }) + const client = new Client({ apiKey: 'API_KEY', onSession: () => false }) const sessionDelegate = { startSession: () => {}, pauseSession: () => {}, @@ -577,7 +601,7 @@ describe('@bugsnag/core/client', () => { it('tolerates errors in onSession callbacks', () => { const client = new Client({ apiKey: 'API_KEY', - onSession: s => { + onSession: () => { throw new Error('oh no') } }) From 46fb9697dff53f7aee43f5523b2040a834b91e6e Mon Sep 17 00:00:00 2001 From: Kevin Liddle Date: Thu, 21 May 2020 16:10:16 -0500 Subject: [PATCH 3/6] [plugin-express] use proper TypeScript namespace importing for express --- packages/plugin-express/types/bugsnag-express.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-express/types/bugsnag-express.d.ts b/packages/plugin-express/types/bugsnag-express.d.ts index 4fb404dd00..d1625cfb20 100644 --- a/packages/plugin-express/types/bugsnag-express.d.ts +++ b/packages/plugin-express/types/bugsnag-express.d.ts @@ -1,5 +1,5 @@ import { Plugin, Client } from '@bugsnag/core' -import express from 'express' +import * as express from 'express' declare const bugsnagPluginExpress: Plugin export default bugsnagPluginExpress From 21c7c42cfd6fbf2a1ad24010b10aa20022ff14b3 Mon Sep 17 00:00:00 2001 From: Ben Gourley Date: Thu, 21 May 2020 14:38:19 +0100 Subject: [PATCH 4/6] test(expo): Fix tests by selecting a different package name --- .../lib/test/fixtures/already-installed-01/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/expo-cli/lib/test/fixtures/already-installed-01/package.json b/packages/expo-cli/lib/test/fixtures/already-installed-01/package.json index dc05a060b8..eb55ac6f22 100644 --- a/packages/expo-cli/lib/test/fixtures/already-installed-01/package.json +++ b/packages/expo-cli/lib/test/fixtures/already-installed-01/package.json @@ -1,5 +1,5 @@ { - "name": "bugsnag-test-fixture-03", + "name": "bugsnag-test-fixture-05", "private": "true", "version": "0.0.0", "dependencies": { From 7538bc0290ac72b9dde6268d032ab0a27bbae6c6 Mon Sep 17 00:00:00 2001 From: Ben Gourley Date: Tue, 26 May 2020 14:17:10 +0100 Subject: [PATCH 5/6] chore: Prep changelog for release --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 004f104955..4042e0cd9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog + +## 7.1.1 (2020-05-26) + +### Fixed + +- (plugin-express): Use import syntax that works without TypeScript's `esModuleInterop` compiler flag [#866](https://github.com/bugsnag/bugsnag-js/pull/866) +- (expo-cli): Ensure version detection logic for @bugsnag/expo works after v7.0.0 [#865](https://github.com/bugsnag/bugsnag-js/pull/865) +- (core): Ensure callbacks supplied in config permit no named arguments [#863](https://github.com/bugsnag/bugsnag-js/pull/863) + + ## 7.1.0 (2020-05-21) This update contains some substantial changes to plugin type definitions. If you are using TypeScript alongside a framework, you may need to make changes to your app. Please refer to the [upgrade guide](./UPGRADING.md). From f3a2a7eb7b7d0b783a46a41fdffece1a643006dc Mon Sep 17 00:00:00 2001 From: Ben Gourley Date: Tue, 26 May 2020 14:21:36 +0100 Subject: [PATCH 6/6] chore: Update changelog wording --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4042e0cd9c..24e69c5d2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ - (plugin-express): Use import syntax that works without TypeScript's `esModuleInterop` compiler flag [#866](https://github.com/bugsnag/bugsnag-js/pull/866) - (expo-cli): Ensure version detection logic for @bugsnag/expo works after v7.0.0 [#865](https://github.com/bugsnag/bugsnag-js/pull/865) -- (core): Ensure callbacks supplied in config permit no named arguments [#863](https://github.com/bugsnag/bugsnag-js/pull/863) +- (core): Ensure callbacks supplied in config permit functions with no named arguments [#863](https://github.com/bugsnag/bugsnag-js/pull/863) ## 7.1.0 (2020-05-21)