From bf65d09834f44b781f2af7a70ba3bf1fe7fe2306 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Mon, 17 Feb 2020 10:36:38 -0400 Subject: [PATCH] Add Sentry reporting Errors are reported using `captureException`, and non-errors are added as breadcrumbs. This means the non-error events won't be directly sent to Sentry, but they will be included as context for any errors that do occur. The sentry configuration is mainly in the `sentry.debug.properties` file. The only config outside of that file is the DSN used for reporting errors, which is hard-coded in the `setupSentry.js` module. There are three separate sets of config: default, debug, and release. The default config is missing the auth token, so it can't be used to publish source maps. However, builds that use the default config will still correctly report errors to the `test-metamask-mobile` Sentry project. The debug config is identical to the default config except that it includes the auth token. The debug config is for publishing any non-production builds (e.g. testing, pre-releases). The release configuration is to be used for production builds only. This is the only config that sends errors to the `metemask-mobile` Sentry project. The debug and release config files have not been added to the repo. They are automatically instantiated from the example files if the `MM_SENTRY_AUTH_TOKEN` environment variable is set. Setting this environment variable in CI should allow publishing from CI. Closes #1321 --- .gitignore | 4 + android/app/build.gradle | 8 + .../java/io/metamask/MainApplication.java | 56 ++-- android/settings.gradle | 2 + app/util/Logger.js | 8 +- app/util/setupSentry.js | 18 ++ index.js | 4 + ios/MetaMask.xcodeproj/project.pbxproj | 47 +++- package.json | 4 +- scripts/build.sh | 32 +++ sentry.debug.properties.example | 5 + sentry.properties | 5 + sentry.release.properties.example | 5 + yarn.lock | 257 +++++++++++++++++- 14 files changed, 415 insertions(+), 40 deletions(-) create mode 100644 app/util/setupSentry.js create mode 100644 sentry.debug.properties.example create mode 100644 sentry.properties create mode 100644 sentry.release.properties.example diff --git a/.gitignore b/.gitignore index 6e83232165a..a05a99063de 100644 --- a/.gitignore +++ b/.gitignore @@ -63,5 +63,9 @@ coverage .ios.env .android.env +# Sentry +/sentry.debug.properties +/sentry.release.properties + # editor .vscode diff --git a/android/app/build.gradle b/android/app/build.gradle index 60d75293cd2..3210475a0d9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -104,6 +104,13 @@ project.ext.react = [ apply from: "../../node_modules/react-native/react.gradle" +project.ext.sentryCli = [ + logLevel: "debug", + sentryProperties: System.getenv('SENTRY_PROPERTIES') ? System.getenv('SENTRY_PROPERTIES') : '../../sentry.properties' +] + +apply from: "../../node_modules/@sentry/react-native/sentry.gradle" + /** * Set this to true to create two separate APKs instead of one: * - An APK that only works on ARM devices @@ -208,6 +215,7 @@ android { } dependencies { + implementation project(':@sentry_react-native') implementation project(':react-native-sensors') implementation project(':react-native-reanimated') implementation project(':react-native-webview') diff --git a/android/app/src/main/java/io/metamask/MainApplication.java b/android/app/src/main/java/io/metamask/MainApplication.java index 226c041740e..6c0d06dc6b1 100644 --- a/android/app/src/main/java/io/metamask/MainApplication.java +++ b/android/app/src/main/java/io/metamask/MainApplication.java @@ -1,6 +1,7 @@ package io.metamask; import com.facebook.react.ReactApplication; +import io.sentry.RNSentryPackage; import com.sensors.RNSensorsPackage; import com.swmansion.reanimated.ReanimatedPackage; import com.reactnativecommunity.webview.RNCWebViewPackage; @@ -47,33 +48,34 @@ public boolean getUseDeveloperSupport() { @Override protected List getPackages() { - return Arrays.asList( - new MainReactPackage(), - new RNSensorsPackage(), - new ReanimatedPackage(), - new RNCWebViewPackage(), - new NetInfoPackage(), - new RNViewShotPackage(), - new LottiePackage(), - new AsyncStoragePackage(), - new ReactNativePushNotificationPackage(), - new BackgroundTimerPackage(), - new RNDeviceInfo(), - new SvgPackage(), - new RNGestureHandlerPackage(), - new RNScreensPackage(), - new RNBranchPackage(), - new KeychainPackage(), - new RandomBytesPackage(), - new RCTAesPackage(), - new RNCameraPackage(), - new RNFSPackage(), - new RNI18nPackage(), - new RNOSModule(), - new RNSharePackage(), - new VectorIconsPackage(), - new RCTAnalyticsPackage() - ); + return Arrays.asList( + new MainReactPackage(), + new RNSentryPackage(), + new RNSensorsPackage(), + new ReanimatedPackage(), + new RNCWebViewPackage(), + new NetInfoPackage(), + new RNViewShotPackage(), + new LottiePackage(), + new AsyncStoragePackage(), + new ReactNativePushNotificationPackage(), + new BackgroundTimerPackage(), + new RNDeviceInfo(), + new SvgPackage(), + new RNGestureHandlerPackage(), + new RNScreensPackage(), + new RNBranchPackage(), + new KeychainPackage(), + new RandomBytesPackage(), + new RCTAesPackage(), + new RNCameraPackage(), + new RNFSPackage(), + new RNI18nPackage(), + new RNOSModule(), + new RNSharePackage(), + new VectorIconsPackage(), + new RCTAnalyticsPackage() + ); } @Override diff --git a/android/settings.gradle b/android/settings.gradle index 70d2c02a118..51af3780f83 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,6 @@ rootProject.name = 'MetaMask' +include ':@sentry_react-native' +project(':@sentry_react-native').projectDir = new File(rootProject.projectDir, '../node_modules/@sentry/react-native/android') include ':react-native-sensors' project(':react-native-sensors').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sensors/android') include ':react-native-reanimated' diff --git a/app/util/Logger.js b/app/util/Logger.js index 49efaa3b086..e33d3223643 100644 --- a/app/util/Logger.js +++ b/app/util/Logger.js @@ -1,4 +1,6 @@ 'use strict'; + +import { addBreadcrumb, captureException } from '@sentry/react-native'; import AsyncStorage from '@react-native-community/async-storage'; /** @@ -21,7 +23,9 @@ export default class Logger { args.unshift('[MetaMask DEBUG]:'); console.log.apply(null, args); // eslint-disable-line no-console } else if (metricsOptIn === 'agreed') { - console.log(args); + addBreadcrumb({ + message: JSON.stringify(args) + }); } } @@ -38,7 +42,7 @@ export default class Logger { args.unshift('[MetaMask DEBUG]:'); console.warn(args); // eslint-disable-line no-console } else if (metricsOptIn === 'agreed') { - console.log(args); + captureException(args); } } } diff --git a/app/util/setupSentry.js b/app/util/setupSentry.js new file mode 100644 index 00000000000..adddd9585bf --- /dev/null +++ b/app/util/setupSentry.js @@ -0,0 +1,18 @@ +import { init } from '@sentry/react-native'; +import { Dedupe, ExtraErrorData } from '@sentry/integrations'; + +const METAMASK_ENVIRONMENT = process.env['METAMASK_ENVIRONMENT']; // eslint-disable-line dot-notation +const SENTRY_DSN_PROD = 'https://ae39e4b08d464bba9fbf121c85ccfca0@sentry.io/2299799'; // metamask-mobile +const SENTRY_DSN_DEV = 'https://332890de43e44fe2bc070bb18d0934ea@sentry.io/2651591'; // test-metamask-mobile + +// Setup sentry remote error reporting +export default function setupSentry() { + const environment = __DEV__ || !METAMASK_ENVIRONMENT ? 'development' : METAMASK_ENVIRONMENT; + const dsn = environment === 'production' ? SENTRY_DSN_PROD : SENTRY_DSN_DEV; + init({ + dsn, + debug: __DEV__, + environment, + integrations: [new Dedupe(), new ExtraErrorData()] + }); +} diff --git a/index.js b/index.js index 8d3d452af69..c2297fbb29e 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,10 @@ import './shim.js'; import crypto from 'crypto'; // eslint-disable-line import/no-nodejs-modules, no-unused-vars require('react-native-browser-polyfill'); // eslint-disable-line import/no-commonjs + +import setupSentry from './app/util/setupSentry'; +setupSentry(); + import { AppRegistry, YellowBox } from 'react-native'; import Root from './app/components/Views/Root'; import { name } from './app.json'; diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index d470423cd66..1c4023f1e5c 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -5,7 +5,6 @@ }; objectVersion = 46; objects = { - /* Begin PBXBuildFile section */ 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; @@ -96,6 +95,8 @@ FD9BDCD5059C483EAE9C0160 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 70BCC86172F14AB2BF4DDA97 /* libRNVectorIcons.a */; }; FEA573B66E7541C5A06F7EE1 /* libRNCAsyncStorage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 512F0EF98E9D4D0185343707 /* libRNCAsyncStorage.a */; }; 2A27FC9EEF1F4FD18E658544 /* config.json in Resources */ = {isa = PBXBuildFile; fileRef = EF1C01B7F08047F9B8ADCFBA /* config.json */; }; + 1F350AF8ECD04C04A76C92C0 /* libRNSentry.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E1888C6B981243669BA00002 /* libRNSentry.a */; }; + E3F09DA4B9F147B8811B78BE /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = F19825C44D9D49838B8B39D4 /* libz.tbd */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -853,6 +854,9 @@ F9DFF7AC557B46B6BEFAA1C1 /* libRNShakeEvent.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNShakeEvent.a; sourceTree = ""; }; FE3C9A2458A1416290DEDAD4 /* branch.json */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = branch.json; path = ../branch.json; sourceTree = ""; }; EF1C01B7F08047F9B8ADCFBA /* config.json */ = {isa = PBXFileReference; name = "config.json"; path = "../app/fonts/config.json"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 70988A2A19B140A89BF69948 /* RNSentry.xcodeproj */ = {isa = PBXFileReference; name = "RNSentry.xcodeproj"; path = "../node_modules/@sentry/react-native/ios/RNSentry.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; + E1888C6B981243669BA00002 /* libRNSentry.a */ = {isa = PBXFileReference; name = "libRNSentry.a"; path = "libRNSentry.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; + F19825C44D9D49838B8B39D4 /* libz.tbd */ = {isa = PBXFileReference; name = "libz.tbd"; path = "usr/lib/libz.tbd"; sourceTree = SDKROOT; fileEncoding = undefined; lastKnownFileType = sourcecode.text-based-dylib-definition; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -899,6 +903,8 @@ CCD42AFF04EE46C481A5715C /* libRNCWebView.a in Frameworks */, 8F038E7D26A045499C0C2CDC /* libRNReanimated.a in Frameworks */, 0DAA03955C324BF9813B14EE /* libRNSensors.a in Frameworks */, + 1F350AF8ECD04C04A76C92C0 /* libRNSentry.a in Frameworks */, + E3F09DA4B9F147B8811B78BE /* libz.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1327,6 +1333,7 @@ children = ( 153C1A742217BCDC0088EFE0 /* JavaScriptCore.framework */, 2D16E6891FA4F8E400B85C8A /* libReact.a */, + F19825C44D9D49838B8B39D4 /* libz.tbd */, ); name = Frameworks; sourceTree = ""; @@ -1436,6 +1443,7 @@ 243DFD20AE7F45D5BBB115E2 /* RNCWebView.xcodeproj */, 3F524C43670B4F7DBBBB4B5C /* RNReanimated.xcodeproj */, CBAA0A8C106D459EA02E314B /* RNSensors.xcodeproj */, + 70988A2A19B140A89BF69948 /* RNSentry.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -1484,6 +1492,22 @@ name = Products; sourceTree = ""; }; + 57D0091455694796AAA21539 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + path = Application; + sourceTree = ""; + }; + 45C45F6CAB7F4405944D88B2 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + path = Application; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1497,6 +1521,7 @@ 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 15ACCA0022655C3A0063978B /* Embed Frameworks */, + A3FF5283B2184432BFF814EE /* Upload Debug Symbols to Sentry */, ); buildRules = ( ); @@ -2372,7 +2397,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#if [ \"${CONFIGURATION}\" == \"Debug\" ]; then\n# export SKIP_BUNDLING=true\n#fi\n\nexport NODE_BINARY=${which node}\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; + shellScript = "if [ ! -e \"${SENTRY_PROPERTIES}\" ]; then\n export SENTRY_PROPERTIES=../sentry.properties\nfi\n#if [ \"${CONFIGURATION}\" == \"Debug\" ]; then\n# export SKIP_BUNDLING=true\n#fi\n\nexport NODE_BINARY=${which node}\n../node_modules/@sentry/cli/bin/sentry-cli react-native xcode ../node_modules/react-native/scripts/react-native-xcode.sh\n"; }; 15FDD86321B76696006B7C35 /* Override xcconfig files */ = { isa = PBXShellScriptBuildPhase; @@ -2392,6 +2417,20 @@ shellPath = /bin/sh; shellScript = "if [ -e ../.ios.env ]\nthen\n cp -rf ../.ios.env debug.xcconfig\n cp -rf ../.ios.env release.xcconfig\nelse\n cp -rf ../.ios.env.example debug.xcconfig\n cp -rf ../.ios.env.example release.xcconfig\nfi\n\n"; }; + A3FF5283B2184432BFF814EE /* Upload Debug Symbols to Sentry */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + name = "Upload Debug Symbols to Sentry"; + inputPaths = ( + ); + outputPaths = ( + ); + shellPath = /bin/sh; + shellScript = "if [ ! -e \"${SENTRY_PROPERTIES}\" ]; then\n export SENTRY_PROPERTIES=../sentry.properties\nfi\n../node_modules/@sentry/cli/bin/sentry-cli upload-dsym"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -2490,6 +2529,7 @@ "$(SRCROOT)/../node_modules/react-native-webview/ios", "$(SRCROOT)/../node_modules/react-native-reanimated/ios/**", "$(SRCROOT)/../node_modules/react-native-sensors/ios/**", + "$(SRCROOT)/../node_modules/@sentry/react-native/ios/**", ); INFOPLIST_FILE = MetaMask/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -2498,6 +2538,7 @@ "$(inherited)", "\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"", "\"$(SRCROOT)/MetaMask\"", + "\"$(SRCROOT)/MetaMask\"", ); LLVM_LTO = YES; MARKETING_VERSION = 0.2.13; @@ -2562,6 +2603,7 @@ "$(SRCROOT)/../node_modules/react-native-webview/ios", "$(SRCROOT)/../node_modules/react-native-reanimated/ios/**", "$(SRCROOT)/../node_modules/react-native-sensors/ios/**", + "$(SRCROOT)/../node_modules/@sentry/react-native/ios/**", ); INFOPLIST_FILE = MetaMask/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -2570,6 +2612,7 @@ "$(inherited)", "\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"", "\"$(SRCROOT)/MetaMask\"", + "\"$(SRCROOT)/MetaMask\"", ); LLVM_LTO = YES; MARKETING_VERSION = 0.2.13; diff --git a/package.json b/package.json index 5b40c943e9d..d15a8e516f5 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,8 @@ "dependencies": { "@react-native-community/async-storage": "1.2.0", "@react-native-community/netinfo": "4.1.5", + "@sentry/integrations": "^5.11.1", + "@sentry/react-native": "1.2.2", "@tradle/react-native-http": "2.0.1", "@walletconnect/react-native": "1.0.0-beta.37", "asyncstorage-down": "4.2.0", @@ -273,7 +275,7 @@ "^.+\\.js$": "jest.preprocessor.js" }, "transformIgnorePatterns": [ - "node_modules/(?!(jest-)?react-native|@react-navigation|@react-native-community|react-navigation|react-navigation-redux-helpers)" + "node_modules/(?!(jest-)?react-native|@react-navigation|@react-native-community|react-navigation|react-navigation-redux-helpers|@sentry)" ], "snapshotSerializers": [ "enzyme-to-json/serializer" diff --git a/scripts/build.sh b/scripts/build.sh index 8bab14ec542..e550b4bd268 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -233,6 +233,38 @@ checkParameters "$@" printTitle +if [ "$MODE" == "release" ]; then + if [ "$PRE_RELEASE" = false ]; then + if [ ! -e ./sentry.release.properties ]; then + if [ -n "${MM_SENTRY_AUTH_TOKEN}" ]; then + cp ./sentry.release.properties.example ./sentry.release.properties + else + printError "Missing 'sentry.release.properties' file (see 'sentry.release.properties.example')" + exit 1 + fi + fi + if [ -n "${MM_SENTRY_AUTH_TOKEN}" ]; then + sed -i'' -e "s/auth.token.*/auth.token=${MM_SENTRY_AUTH_TOKEN}/" ./sentry.release.properties; + fi + export SENTRY_PROPERTIES='../../sentry.release.properties' + export METAMASK_ENVIRONMENT='production' + else + if [ ! -e ./sentry.debug.properties ]; then + if [ -n "${MM_SENTRY_AUTH_TOKEN}" ]; then + cp ./sentry.debug.properties.example ./sentry.debug.properties + else + printError "Missing 'sentry.debug.properties' file (see 'sentry.debug.properties.example')" + exit 1 + fi + fi + if [ -n "${MM_SENTRY_AUTH_TOKEN}" ]; then + sed -i'' -e "s/auth.token.*/auth.token=${MM_SENTRY_AUTH_TOKEN}/" ./sentry.debug.properties; + fi + export SENTRY_PROPERTIES='../../sentry.debug.properties' + export METAMASK_ENVIRONMENT='prerelease' + fi +fi + if [ "$PLATFORM" == "ios" ]; then # we don't care about env file in CI if [ -f "$IOS_ENV_FILE" ] || [ "$CI" = true ]; then diff --git a/sentry.debug.properties.example b/sentry.debug.properties.example new file mode 100644 index 00000000000..32e0ebfeb54 --- /dev/null +++ b/sentry.debug.properties.example @@ -0,0 +1,5 @@ +defaults.url=https://sentry.io/ +defaults.org=metamask +defaults.project=test-metamask-mobile +auth.token= +cli.executable=node_modules/@sentry/cli/bin/sentry-cli diff --git a/sentry.properties b/sentry.properties new file mode 100644 index 00000000000..32e0ebfeb54 --- /dev/null +++ b/sentry.properties @@ -0,0 +1,5 @@ +defaults.url=https://sentry.io/ +defaults.org=metamask +defaults.project=test-metamask-mobile +auth.token= +cli.executable=node_modules/@sentry/cli/bin/sentry-cli diff --git a/sentry.release.properties.example b/sentry.release.properties.example new file mode 100644 index 00000000000..9794dd14fd9 --- /dev/null +++ b/sentry.release.properties.example @@ -0,0 +1,5 @@ +defaults.url=https://sentry.io/ +defaults.org=metamask +defaults.project=metamask-mobile +auth.token= +cli.executable=node_modules/@sentry/cli/bin/sentry-cli diff --git a/yarn.lock b/yarn.lock index 578d3aa23ed..3e9fc98ebf4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -985,6 +985,107 @@ dependencies: any-observable "^0.3.0" +"@sentry/browser@^5.11.1": + version "5.12.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.12.1.tgz#dc1f268595269fb7277f55eb625c7e92d76dc01b" + integrity sha512-Zl7VdppUxctyaoqMSEhnDJp2rrupx8n8N2n3PSooH74yhB2Z91nt84mouczprBsw3JU1iggGyUw9seRFzDI1hw== + dependencies: + "@sentry/core" "5.12.0" + "@sentry/types" "5.12.0" + "@sentry/utils" "5.12.0" + tslib "^1.9.3" + +"@sentry/cli@^1.48.0": + version "1.49.0" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.49.0.tgz#174152978acbe6023986a8fb0b247cf58b4653d8" + integrity sha512-Augz7c42Cxz/xWQ/NOVjUGePKVA370quvskWbCICMUwxcTvKnCLI+7KDdzEoCexj4MSuxFfBzLnrrn4w2+c9TQ== + dependencies: + fs-copy-file-sync "^1.1.1" + https-proxy-agent "^3.0.0" + mkdirp "^0.5.1" + node-fetch "^2.1.2" + progress "2.0.0" + proxy-from-env "^1.0.0" + +"@sentry/core@5.12.0", "@sentry/core@^5.11.1": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.12.0.tgz#d6380c4ef7beee5f418ac1d0e5be86a2de2af449" + integrity sha512-wY4rsoX71QsGpcs9tF+OxKgDPKzIFMRvFiSRcJoPMfhFsTilQ/CBMn/c3bDtWQd9Bnr/ReQIL6NbnIjUsPHA4Q== + dependencies: + "@sentry/hub" "5.12.0" + "@sentry/minimal" "5.12.0" + "@sentry/types" "5.12.0" + "@sentry/utils" "5.12.0" + tslib "^1.9.3" + +"@sentry/hub@5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.12.0.tgz#5e8c8f249f5bdbeb8cc4ec02c2ccc53a67f2cc02" + integrity sha512-3k7yE8BEVJsKx8mR4LcI4IN0O8pngmq44OcJ/fRUUBAPqsT38jsJdP2CaWhdlM1jiNUzUDB1ktBv6/lY+VgcoQ== + dependencies: + "@sentry/types" "5.12.0" + "@sentry/utils" "5.12.0" + tslib "^1.9.3" + +"@sentry/integrations@^5.11.1": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-5.12.0.tgz#4d735abf2989049ef860e3eaad0883b63d8274e6" + integrity sha512-4G/TvCEP9M6xgY61r46UE4ruSgF42rZnvO0ZfIBI/240DNYMTpHLvjU3Xvrv3wDl3emCvy4QgAIceI/zj8nPjw== + dependencies: + "@sentry/types" "5.12.0" + "@sentry/utils" "5.12.0" + tslib "^1.9.3" + +"@sentry/minimal@5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.12.0.tgz#2611e2aa520c1edb7999e6de51bd65ec66341757" + integrity sha512-fk73meyz4k4jCg9yzbma+WkggsfEIQWI2e2TWfYsRGcrV3RnlSrXyM4D91/A8Bjx10SNezHPUFHjasjlHXOkyA== + dependencies: + "@sentry/hub" "5.12.0" + "@sentry/types" "5.12.0" + tslib "^1.9.3" + +"@sentry/react-native@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-1.2.2.tgz#1452db82efc3f6b7464a1986174e71d4e893bd91" + integrity sha512-dnGPQPbqDHUizuxls/10bvXnBoe9JZyjAtozQc0fFpO6EqmQvbaluwtqFlrls0no50v1GdS67H3AqA4lFVCoRw== + dependencies: + "@sentry/browser" "^5.11.1" + "@sentry/core" "^5.11.1" + "@sentry/integrations" "^5.11.1" + "@sentry/types" "^5.11.0" + "@sentry/utils" "^5.11.1" + "@sentry/wizard" "^1.0.2" + +"@sentry/types@5.12.0", "@sentry/types@^5.11.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.12.0.tgz#5367e53c74261beea01502e3f7b6f3d822682a31" + integrity sha512-aZbBouBLrKB8wXlztriIagZNmsB+wegk1Jkl6eprqRW/w24Sl/47tiwH8c5S4jYTxdAiJk+SAR10AAuYmIN3zg== + +"@sentry/utils@5.12.0", "@sentry/utils@^5.11.1": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.12.0.tgz#62967f934a3ee6d21472eac0219084e37225933e" + integrity sha512-fYUadGLbfTCbs4OG5hKCOtv2jrNE4/8LHNABy9DwNJ/t5DVtGqWAZBnxsC+FG6a3nVqCpxjFI9AHlYsJ2wsf7Q== + dependencies: + "@sentry/types" "5.12.0" + tslib "^1.9.3" + +"@sentry/wizard@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@sentry/wizard/-/wizard-1.0.2.tgz#346d1ecbeef7b765120ec8627053443456660f0d" + integrity sha512-/mS9SWcgc8uqrOhiwyGqusGnWXf4hvIiYpUGJGw4vxL8gZ3k+UMSKaEw46p+ND1X8y2RRgFJh7h7q2dtXa8QvQ== + dependencies: + "@sentry/cli" "^1.48.0" + chalk "^2.4.1" + glob "^7.1.3" + inquirer "^6.2.0" + lodash "^4.17.15" + opn "^5.4.0" + r2 "^2.0.1" + read-env "^1.3.0" + xcode "2.0.0" + yargs "^12.0.2" + "@tradle/react-native-http@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@tradle/react-native-http/-/react-native-http-2.0.1.tgz#af19e240e1e580bfa249563924d1be472686f48b" @@ -2194,6 +2295,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -2228,7 +2334,7 @@ capture-stack-trace@^1.0.0: resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== -caseless@~0.12.0: +caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= @@ -2373,6 +2479,15 @@ cliui@^3.0.3, cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -4738,6 +4853,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +fs-copy-file-sync@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" + integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ== + fs-extra@^0.22.1: version "0.22.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.22.1.tgz#5fd6f8049dc976ca19eb2355d658173cabcce056" @@ -5302,6 +5422,14 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" +https-proxy-agent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" + integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + human-standard-collectible-abi@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/human-standard-collectible-abi/-/human-standard-collectible-abi-1.0.2.tgz#077bae9ed1b0b0b82bc46932104b4b499c941aa0" @@ -5485,7 +5613,7 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" -inquirer@^6.2.2, inquirer@^6.4.1: +inquirer@^6.2.0, inquirer@^6.2.2, inquirer@^6.4.1: version "6.5.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== @@ -5516,6 +5644,11 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + ip-regex@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" @@ -5840,7 +5973,7 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -6615,6 +6748,13 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" @@ -6927,7 +7067,7 @@ lodash.toarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= -lodash@4.x.x, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1: +lodash@4.x.x, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -7021,6 +7161,13 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -7066,6 +7213,15 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" @@ -7721,6 +7877,11 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -7977,7 +8138,7 @@ node-fetch@^1.0.1, node-fetch@~1.7.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.2.0: +node-fetch@^2.0.0-alpha.8, node-fetch@^2.1.2, node-fetch@^2.2.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== @@ -8324,6 +8485,13 @@ opn@^3.0.2: dependencies: object-assign "^4.0.1" +opn@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -8370,6 +8538,15 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -8383,6 +8560,11 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + p-each-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" @@ -8395,6 +8577,11 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -8826,6 +9013,11 @@ process@~0.5.1: resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= +progress@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -9035,6 +9227,15 @@ querystringify@^2.0.0: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== +r2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/r2/-/r2-2.0.1.tgz#94cd802ecfce9a622549c8182032d8e4a2b2e612" + integrity sha512-EEmxoxYCe3LHzAUhRIRxdCKERpeRNmlLj6KLUSORqnK6dWl/K5ShmDGZqM2lRZQeqJgF+wyqk0s1M7SWUveNOQ== + dependencies: + caseless "^0.12.0" + node-fetch "^2.0.0-alpha.8" + typedarray-to-buffer "^3.1.2" + raf@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -9615,6 +9816,13 @@ react@16.8.3: prop-types "^15.6.2" scheduler "^0.13.3" +read-env@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/read-env/-/read-env-1.3.0.tgz#e26e1e446992b3216e9a3c6f6ac51064fe91fdff" + integrity sha512-DbCgZ8oHwZreK/E2E27RGk3EUPapMhYGSGIt02k9sX6R3tCFc4u4tkltKvkCvzEQ3SOLUaiYHAnGb+TdsnPp0A== + dependencies: + camelcase "5.0.0" + read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -11177,7 +11385,7 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -tslib@^1.9.0: +tslib@^1.9.0, tslib@^1.9.3: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== @@ -11216,6 +11424,13 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +typedarray-to-buffer@^3.1.2: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -11777,7 +11992,7 @@ ws@^7.0.0: dependencies: async-limiter "^1.0.0" -xcode@^2.0.0: +xcode@2.0.0, xcode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.0.0.tgz#134f1f94c26fbfe8a9aaa9724bfb2772419da1a2" integrity sha512-5xF6RCjAdDEiEsbbZaS/gBRt3jZ/177otZcpoLCjGN/u1LrfgH7/Sgeeavpr/jELpyDqN2im3AKosl2G2W8hfw== @@ -11884,7 +12099,7 @@ y18n@^3.2.0, y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= -y18n@^4.0.0: +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== @@ -11899,6 +12114,14 @@ yallist@^3.0.0, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^13.0.0, yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" @@ -11914,6 +12137,24 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" +yargs@^12.0.2: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + yargs@^13.0.0, yargs@^13.2.2, yargs@^13.2.4, yargs@^13.3.0: version "13.3.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"