Skip to content

Commit

Permalink
Merge pull request #610 from bugsnag/expo-sdk-34-support
Browse files Browse the repository at this point in the history
Expo SDK 34 support
  • Loading branch information
bengourley committed Aug 12, 2019
2 parents ad0d6cf + 9bd8237 commit b08c936
Show file tree
Hide file tree
Showing 26 changed files with 4,516 additions and 3,846 deletions.
4 changes: 2 additions & 2 deletions dockerfiles/Dockerfile.expo-android-builder
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

RUN apt-get update
RUN apt-get install -y nodejs make g++ yarn
RUN apt-get install -y nodejs make g++ yarn rsync

WORKDIR /app/test/expo/features/fixtures/test-app

RUN mkdir -p /app/test/expo/features/fixures/build

RUN yarn global add gulp-cli node-gyp
RUN yarn add bunyan turtle-cli@0.8.6
RUN yarn add bunyan rsync turtle-cli@0.11.1

RUN node_modules/.bin/turtle setup:android

Expand Down
5 changes: 4 additions & 1 deletion examples/expo/App.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import bugsnagClient from './lib/bugsnag';
import React from 'react';
import { Platform, StatusBar, StyleSheet, View } from 'react-native';
import { AppLoading, Asset, Font, Icon } from 'expo';
import { AppLoading } from 'expo';
import * as Font from 'expo-font';
import { Asset } from 'expo-asset';
import * as Icon from '@expo/vector-icons';
import AppNavigator from './navigation/AppNavigator';
import ErrorFallback from './components/ErrorFallback';

Expand Down
2 changes: 1 addition & 1 deletion examples/expo/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "Bugsnag Expo Example",
"slug": "bugsnag-expo-example",
"privacy": "unlisted",
"sdkVersion": "32.0.0",
"sdkVersion": "34.0.0",
"platforms": [
"ios",
"android"
Expand Down
4 changes: 2 additions & 2 deletions examples/expo/components/TabBarIcon.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react';
import { Icon } from 'expo';
import * as Icon from '@expo/vector-icons';

import Colors from '../constants/Colors';

Expand All @@ -14,4 +14,4 @@ export default class TabBarIcon extends React.Component {
/>
);
}
}
}
15 changes: 10 additions & 5 deletions examples/expo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,17 @@
"preset": "jest-expo"
},
"dependencies": {
"@bugsnag/expo": "^6.3.0",
"@bugsnag/expo": "6.4.0-alpha.0",
"@expo/samples": "2.1.1",
"expo": "^32.0.0",
"react": "16.5.0",
"react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
"react-navigation": "^3.0.9"
"@expo/vector-icons": "^10.0.4",
"expo": "^34.0.1",
"expo-asset": "^6.0.0",
"expo-font": "^6.0.1",
"react": "16.8.3",
"react-native": "https://github.com/expo/react-native/archive/sdk-34.0.0.tar.gz",
"react-native-gesture-handler": "^1.3.0",
"react-native-reanimated": "^1.2.0",
"react-navigation": "^3.11.1"
},
"devDependencies": {
"babel-preset-expo": "^5.0.0",
Expand Down
2,142 changes: 921 additions & 1,221 deletions examples/expo/yarn.lock

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion packages/delivery-expo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
"author": "Bugsnag",
"license": "MIT",
"dependencies": {
"@bugsnag/core": "^7.0.0-pre-alpha-ben.6"
"@bugsnag/core": "^6.3.0",
"expo-file-system": "^6.0.2"
},
"devDependencies": {
"jasmine": "3.1.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/delivery-expo/queue.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { FileSystem } = require('expo')
const FileSystem = require('expo-file-system')

const MAX_ITEMS = 64
const PAYLOAD_PATH = `${FileSystem.cacheDirectory}bugsnag`
Expand Down
28 changes: 14 additions & 14 deletions packages/delivery-expo/test/queue.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff')
expect(await q.peek()).toBe(null)
Expand All @@ -37,7 +37,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff')
expect(await q.peek()).toBe(null)
Expand Down Expand Up @@ -65,7 +65,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: async () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff')
const req = await q.peek()
Expand All @@ -90,7 +90,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff', err => {
expect(err).not.toBe(null)
Expand Down Expand Up @@ -119,7 +119,7 @@ describe('delivery: expo -> queue', () => {
}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
files.push(Queue.generateFilename('stuff'))
const q = new Queue('stuff')
Expand Down Expand Up @@ -148,7 +148,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff', err => expect(err).toBe(null))
await q.enqueue()
Expand Down Expand Up @@ -177,7 +177,7 @@ describe('delivery: expo -> queue', () => {
}

const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff', err => expect(err).toBe(null))
await q.enqueue({})
Expand All @@ -197,7 +197,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff', err => expect(err).not.toBe(null))
await q.enqueue({})
Expand All @@ -221,7 +221,7 @@ describe('delivery: expo -> queue', () => {
}
const deleteSpy = spyOn(MockFileSystem, 'deleteAsync')
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff')
await q.enqueue({})
Expand Down Expand Up @@ -249,7 +249,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff')
await q.update('file://var/data/foo.bar.app/bugsnag/stuff/bugsnag-stuff-1234.json', {
Expand Down Expand Up @@ -277,7 +277,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff')
const proms = []
Expand Down Expand Up @@ -317,7 +317,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff')
await q.init()
Expand All @@ -341,7 +341,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff')
let didErr = false
Expand Down Expand Up @@ -373,7 +373,7 @@ describe('delivery: expo -> queue', () => {
deleteAsync: () => {}
}
const Queue = proxyquire('../queue', {
'expo': { FileSystem: MockFileSystem }
'expo-file-system': MockFileSystem
})
const q = new Queue('stuff')
let errs = []
Expand Down
29 changes: 28 additions & 1 deletion packages/expo-cli/commands/install.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,17 @@ const { join } = require('path')
const install = require('../lib/install')
const { onCancel } = require('../lib/utils')
const { blue } = require('kleur')
const semver = require('semver')

module.exports = async (argv, globalOpts) => {
const projectRoot = globalOpts['project-root']
const alreadyInstalled = await checkManifest(projectRoot)
const isWanted = await confirmWanted(alreadyInstalled, projectRoot)
if (isWanted) {
const version = await selectVersion(projectRoot)
const tool = await withTool(projectRoot)
console.log(blue(`> Installing @bugsnag/expo with ${tool}. This could take a while!`))
await install(tool)
await install(tool, version, projectRoot)
}
}

Expand Down Expand Up @@ -63,6 +65,31 @@ const checkManifest = async (dir) => {
}
}

const selectVersion = async (dir) => {
try {
const pkg = JSON.parse(await promisify(readFile)(join(dir, 'package.json'), 'utf8'))
const expoVersion = pkg.dependencies.expo
const isPre33 = (expoVersion && !semver.gte(semver.minVersion(expoVersion), '33.0.0'))
const { version } = await prompts({
type: 'text',
name: 'version',
message: isPre33
? 'It looks like you’re using a version of Expo SDK <33. The latest version of Bugsnag works with SDK >= 33 so it’s recommended that you install the last version of Bugsnag that supported your Expo version: v6.3.0'
: 'If you want the latest version of @bugsnag/expo hit enter, otherwise type the version you want',
initial: isPre33 ? '6.3.0' : 'latest',
validate: str => {
if (str === 'latest') return true
if (semver.valid(str)) return true
if (semver.validRange(str)) return true
return 'Version must be: a valid semver version/range or "latest"'
}
}, { onCancel })
return version
} catch (e) {
throw new Error(`Could not detect Expo version in package.json: ${e.message}`)
}
}

const npmOrYarn = async (dir) => {
try {
await promisify(readFile)(join(dir, 'yarn.lock'))
Expand Down
10 changes: 5 additions & 5 deletions packages/expo-cli/lib/install.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const { spawn } = require('child_process')

module.exports = (packageManager, projectRoot) => {
module.exports = (packageManager, version, projectRoot) => {
return new Promise((resolve, reject) => {
const cmd = commands.get(packageManager)
const cmd = commands(version).get(packageManager)
if (!cmd) return reject(new Error(`Don’t know what command to use for ${packageManager}`))
const proc = spawn(cmd[0], cmd[1], { cwd: projectRoot })

Expand All @@ -27,7 +27,7 @@ module.exports = (packageManager, projectRoot) => {
})
}

const commands = new Map([
[ 'yarn', [ 'yarn', [ 'add', '@bugsnag/expo' ] ] ],
[ 'npm', [ 'npm', [ 'install', '@bugsnag/expo' ] ] ]
const commands = version => new Map([
[ 'yarn', [ 'yarn', [ 'add', `@bugsnag/expo@${version}` ] ] ],
[ 'npm', [ 'npm', [ 'install', `@bugsnag/expo@${version}` ] ] ]
])
14 changes: 7 additions & 7 deletions packages/expo-cli/lib/test/install.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ describe('expo-cli: install', () => {

const spawn = (cmd, args, opts) => {
expect(cmd).toBe('npm')
expect(args).toEqual([ 'install', '@bugsnag/expo' ])
expect(args).toEqual([ 'install', '@bugsnag/expo@latest' ])
expect(opts).toEqual({ cwd: projectRoot })
const proc = new EventEmitter()
proc.stdout = new Readable({
Expand All @@ -31,7 +31,7 @@ describe('expo-cli: install', () => {
}

const install = proxyquire('../install', { 'child_process': { spawn } })
const msg = await install('npm', projectRoot)
const msg = await install('npm', 'latest', projectRoot)
expect(msg).toBe(undefined)
})

Expand All @@ -40,7 +40,7 @@ describe('expo-cli: install', () => {

const spawn = (cmd, args, opts) => {
expect(cmd).toBe('yarn')
expect(args).toEqual([ 'add', '@bugsnag/expo' ])
expect(args).toEqual([ 'add', '@bugsnag/expo@6.3.1' ])
expect(opts).toEqual({ cwd: projectRoot })
const proc = new EventEmitter()
proc.stdout = new Readable({
Expand All @@ -60,7 +60,7 @@ describe('expo-cli: install', () => {
}

const install = proxyquire('../install', { 'child_process': { spawn } })
const msg = await install('yarn', projectRoot)
const msg = await install('yarn', '6.3.1', projectRoot)
expect(msg).toBe(undefined)
})

Expand All @@ -87,7 +87,7 @@ describe('expo-cli: install', () => {

const install = proxyquire('../install', { 'child_process': { spawn } })
try {
await install('yarn', projectRoot)
await install('yarn', 'latest', projectRoot)
expect('should not be here').toBe(false)
} catch (e) {
expect(e.message).toMatch(/Command exited with non-zero exit code/)
Expand Down Expand Up @@ -119,7 +119,7 @@ describe('expo-cli: install', () => {

const install = proxyquire('../install', { 'child_process': { spawn } })
try {
await install('yarn', projectRoot)
await install('yarn', 'latest', projectRoot)
expect('should not be here').toBe(false)
} catch (e) {
expect(e.message).toMatch(/floop/)
Expand All @@ -133,7 +133,7 @@ describe('expo-cli: install', () => {

const install = proxyquire('../install', { 'child_process': { spawn } })
try {
await install(undefined, projectRoot)
await install(undefined, 'latest', projectRoot)
expect('should not be here').toBe(false)
} catch (e) {
expect(e.message).toMatch(/Don’t know what command to use for /)
Expand Down
3 changes: 2 additions & 1 deletion packages/expo-cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"dependencies": {
"command-line-args": "^5.0.2",
"kleur": "^3.0.2",
"prompts": "^2.0.4"
"prompts": "^2.0.4",
"semver": "^6.3.0"
}
}
5 changes: 3 additions & 2 deletions packages/expo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,11 @@
"@bugsnag/plugin-react-native-orientation-breadcrumbs": "^6.3.0",
"@bugsnag/plugin-react-native-unhandled-rejection": "^6.2.0",
"bugsnag-build-reporter": "^1.0.1",
"bugsnag-sourcemaps": "^1.1.0"
"bugsnag-sourcemaps": "^1.1.0",
"expo-constants": "^6.0.0"
},
"peerDependencies": {
"expo": "*",
"expo": ">=33.0.0",
"react": "*"
}
}
2 changes: 1 addition & 1 deletion packages/expo/src/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const { schema } = require('@bugsnag/core/config')
const { reduce } = require('@bugsnag/core/lib/es-utils')
const { Constants } = require('expo')
const Constants = require('expo-constants').default

// If the developer property is not present in the manifest, it means the app is
// not connected to a development tool and is either a published app running in
Expand Down
2 changes: 1 addition & 1 deletion packages/expo/src/notifier.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const { version } = require('../package.json')
const url = 'https://github.com/bugsnag/bugsnag-js'

const React = require('react')
const { Constants } = require('expo')
const Constants = require('expo-constants').default

const Client = require('@bugsnag/core/client')

Expand Down
2 changes: 1 addition & 1 deletion packages/plugin-expo-app/app.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { Constants } = require('expo')
const Constants = require('expo-constants').default
const { AppState } = require('react-native')

const appStart = new Date()
Expand Down
Loading

0 comments on commit b08c936

Please sign in to comment.