diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..10eff64 --- /dev/null +++ b/.env.development @@ -0,0 +1,5 @@ +API_URI=http://localhost:8080/graphql +RAW_API_URL=localhost +WEBSITE=http://localhost:3000 +CONTACT_EMAIL=contact@localhost +CDN_URL=http://localhost:9000 diff --git a/.gitignore b/.gitignore index faa3b5a..b2311fd 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,7 @@ buck-out/ remote-schema.graphql upload.jks google-services.json + +sentry.properties + +.env.production diff --git a/android/app/build.gradle b/android/app/build.gradle index 705be88..7061738 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.android.application" +apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" import com.android.build.OutputFile @@ -82,6 +83,7 @@ project.ext.react = [ ] apply from: "../../node_modules/react-native/react.gradle" +apply from: "../../node_modules/@sentry/react-native/sentry.gradle" /** * Set this to true to create two separate APKs instead of one: diff --git a/ios/ZdamEgzaminZawodowy.xcodeproj/project.pbxproj b/ios/ZdamEgzaminZawodowy.xcodeproj/project.pbxproj index 6acf3c4..b759f62 100644 --- a/ios/ZdamEgzaminZawodowy.xcodeproj/project.pbxproj +++ b/ios/ZdamEgzaminZawodowy.xcodeproj/project.pbxproj @@ -154,6 +154,7 @@ 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 9A7A0868A2864CFB852897D6 /* Upload Debug Symbols to Sentry */, ); buildRules = ( ); @@ -232,7 +233,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\n\nexport NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; + shellScript = "export SENTRY_PROPERTIES=sentry.properties\nexport EXTRA_PACKAGER_ARGS=\"--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map\"\nset -e\n\nexport NODE_BINARY=node\n../node_modules/@sentry/cli/bin/sentry-cli react-native xcode ../node_modules/react-native/scripts/react-native-xcode.sh\n"; }; FD10A7F022414F080027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; @@ -253,6 +254,20 @@ shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; showEnvVarsInLog = 0; }; + 9A7A0868A2864CFB852897D6 /* Upload Debug Symbols to Sentry */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + name = "Upload Debug Symbols to Sentry"; + inputPaths = ( + ); + outputPaths = ( + ); + shellPath = /bin/sh; + shellScript = "export SENTRY_PROPERTIES=sentry.properties\n../node_modules/@sentry/cli/bin/sentry-cli upload-dsym"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/package.json b/package.json index 26a02f6..956839c 100644 --- a/package.json +++ b/package.json @@ -4,15 +4,15 @@ "private": true, "scripts": { "postinstall": "patch-package", - "android": "react-native run-android", - "android:release": "react-native run-android --variant=release", + "android": "ENVFILE=.env.development react-native run-android", + "android:release": "ENVFILE=.env.production react-native run-android --variant=release", + "android:bundle-release": "cd android && ENVFILE=.env.production ./gradlew bundleRelease && cd ..", "ios": "react-native run-ios", "start": "react-native start", "test": "jest", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "codegen": "graphql-codegen", - "adb": "adb reverse tcp:8080 tcp:8080 && adb reverse tcp:3000 tcp:3000", - "bundle-release": "cd android && ./gradlew bundleRelease && cd .." + "adb": "adb reverse tcp:8080 tcp:8080 && adb reverse tcp:3000 tcp:3000" }, "dependencies": { "@apollo/client": "^3.3.13", @@ -21,6 +21,7 @@ "@react-native-picker/picker": "^1.14.0", "@react-navigation/native": "^5.9.4", "@react-navigation/stack": "^5.14.4", + "@sentry/react-native": "^3.2.3", "date-fns": "^2.19.0", "graphql": "^15.5.0", "lodash": "^4.17.21", @@ -31,6 +32,7 @@ "react": "17.0.2", "react-native": "0.66.1", "react-native-bootsplash": "^3.2.0", + "react-native-config": "^1.4.5", "react-native-gesture-handler": "^1.10.3", "react-native-reanimated": "^2.1.0", "react-native-safe-area-context": "^3.2.0", diff --git a/src/common/Menu/Menu.tsx b/src/common/Menu/Menu.tsx index 52e8b0d..08c09f0 100644 --- a/src/common/Menu/Menu.tsx +++ b/src/common/Menu/Menu.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { EMAIL, WEBSITE } from 'config/app'; +import Config from 'react-native-config'; import buildURL from 'utils/buildURL'; import { Linking, StyleSheet } from 'react-native'; @@ -24,10 +24,10 @@ const Menu = ({ style, ...rest }: MenuProps) => { index => { switch (index) { case OptionIndex.WEBSITE: - Linking.openURL(WEBSITE); + Linking.openURL(Config.WEBSITE); break; case OptionIndex.CONTACT: - Linking.openURL(buildURL('email', EMAIL)); + Linking.openURL(buildURL('email', Config.CONTACT_EMAIL)); break; } }, diff --git a/src/config/analytics.ts b/src/config/analytics.ts deleted file mode 100644 index 6a6cfcc..0000000 --- a/src/config/analytics.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum Event { - SAVE_QUALIFICATION = 'save_qualification', - UNSAVE_QUALIFICATION = 'unsave_qualification', - START_TEST = 'start_test', - FINISH_TEST = 'finish_test', - SELECT_ANSWER = 'select_answer', -} diff --git a/src/config/api.ts b/src/config/api.ts deleted file mode 100644 index 9a2f3c2..0000000 --- a/src/config/api.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const API_URI = __DEV__ - ? 'http://localhost:8080/graphql' - : 'https://api.zdamegzaminzawodowy.pl/graphql'; diff --git a/src/config/app.ts b/src/config/app.ts index 3ea6ddd..4e98c61 100644 --- a/src/config/app.ts +++ b/src/config/app.ts @@ -1,7 +1 @@ -export const WEBSITE = __DEV__ - ? 'http://localhost:3000' - : 'https://zdamegzaminzawodowy.pl'; - -export const EMAIL = 'kontakt@zdamegzaminzawodowy.pl'; - export const QUESTIONS = [1, 40]; diff --git a/src/config/cdn.ts b/src/config/cdn.ts deleted file mode 100644 index 6d2ff3a..0000000 --- a/src/config/cdn.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { WEBSITE } from './app'; - -export const CDN_URI = __DEV__ - ? 'http://localhost:9000/' - : 'https://cdn.zdamegzaminzawodowy.pl/'; - -export const IMAGE_RESIZING_SERVICE = `${WEBSITE}/_next/image`; diff --git a/src/libs/sentry/initSentry.ts b/src/libs/sentry/initSentry.ts new file mode 100644 index 0000000..10caab1 --- /dev/null +++ b/src/libs/sentry/initSentry.ts @@ -0,0 +1,25 @@ +import * as Sentry from '@sentry/react-native'; +import Config from 'react-native-config'; + +export const routingInstrumentation = new Sentry.ReactNavigationInstrumentation(); + +const initSentry = () => { + if (!Config.SENTRY_DSN) { + return; + } + + Sentry.init({ + dsn: Config.SENTRY_DSN, + environment: __DEV__ ? 'development' : 'production', + integrations: [ + new Sentry.ReactNativeTracing({ + tracingOrigins: [Config.RAW_API_URL], + routingInstrumentation, + }), + ], + tracesSampleRate: 1.0, + release: __DEV__ ? 'development' : undefined, + }); +}; + +export default initSentry; diff --git a/src/screens/App.tsx b/src/screens/App.tsx index f09f19a..cc3a748 100644 --- a/src/screens/App.tsx +++ b/src/screens/App.tsx @@ -1,17 +1,22 @@ import 'react-native-gesture-handler'; -import React, { useEffect, useMemo, useRef } from 'react'; +import React, { useEffect, useMemo } from 'react'; +import * as Sentry from '@sentry/react-native'; import { ApolloProvider } from '@apollo/client'; import RNBootSplash from 'react-native-bootsplash'; import { Root, StyleProvider } from 'native-base'; import { createClient } from 'libs/graphql'; -import { API_URI } from 'config/api'; +import Config from 'react-native-config'; import Navigation from './Navigation'; import { createTheme, variables } from '../libs/native-base'; import { SavedQualificationsProvider } from '../libs/savedqualifications'; +import initSentry from '../libs/sentry/initSentry'; + +initSentry(); const BaseApp = () => { useEffect(() => { RNBootSplash.hide({ fade: true }); + Sentry.nativeCrash(); }, []); return ; @@ -22,7 +27,7 @@ const App = () => { return createTheme(variables); }, []); const client = useMemo(() => { - return createClient(API_URI); + return createClient(Config.API_URI); }, []); return ( @@ -38,4 +43,4 @@ const App = () => { ); }; -export default App; +export default Sentry.wrap(App); diff --git a/src/screens/HomeScreen/components/Professions/NetworkConnectionAlert.tsx b/src/screens/HomeScreen/components/Professions/NetworkConnectionAlert.tsx index bae814a..897cb30 100644 --- a/src/screens/HomeScreen/components/Professions/NetworkConnectionAlert.tsx +++ b/src/screens/HomeScreen/components/Professions/NetworkConnectionAlert.tsx @@ -1,8 +1,8 @@ import { ApolloError } from '@apollo/client'; import { useUpdateEffect } from 'react-use'; import { Alert, Linking } from 'react-native'; +import Config from 'react-native-config'; import buildURL from 'utils/buildURL'; -import { EMAIL } from 'config/app'; export type NetworkConnectionAlertProps = { error?: ApolloError; @@ -20,7 +20,8 @@ const NetworkConnectionAlert = ({ error }: NetworkConnectionAlertProps) => { [ { text: 'Zgłoś problem', - onPress: () => Linking.openURL(buildURL('email', EMAIL)), + onPress: () => + Linking.openURL(buildURL('email', Config.CONTACT_EMAIL)), }, { text: 'OK' }, ], diff --git a/src/screens/Navigation.tsx b/src/screens/Navigation.tsx index d31e4ac..b5edd46 100644 --- a/src/screens/Navigation.tsx +++ b/src/screens/Navigation.tsx @@ -1,7 +1,11 @@ -import React from 'react'; +import React, { useRef } from 'react'; +import { routingInstrumentation } from '../libs/sentry/initSentry'; import { AppStackParamList, Screen } from 'config/routing'; -import { NavigationContainer } from '@react-navigation/native'; +import { + NavigationContainer, + NavigationContainerRef, +} from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; import HomeScreen from './HomeScreen/HomeScreen'; import TestScreen from './TestScreen/TestScreen'; @@ -9,16 +13,24 @@ import TestScreen from './TestScreen/TestScreen'; const Stack = createStackNavigator(); const AppStack = createStackNavigator(); -const AppScreens = () => ( - - - - -); +const AppScreens = () => { + return ( + + + + + ); +}; const Navigation = () => { + const navigation = useRef(null); + + const handleReady = () => { + routingInstrumentation.registerNavigationContainer(navigation); + }; + return ( - + ); diff --git a/src/screens/TestScreen/components/Test/Question.tsx b/src/screens/TestScreen/components/Test/Question.tsx index c39e4f8..0e88644 100644 --- a/src/screens/TestScreen/components/Test/Question.tsx +++ b/src/screens/TestScreen/components/Test/Question.tsx @@ -1,7 +1,7 @@ import React, { Fragment } from 'react'; +import Config from 'react-native-config'; import { Answer, Question as QuestionT } from 'libs/graphql'; import { useVariables } from 'libs/native-base'; -import { EMAIL } from 'config/app'; import buildURL from 'utils/buildURL'; import { Linking, StyleSheet } from 'react-native'; @@ -37,7 +37,9 @@ const Question = ({ diff --git a/src/utils/buildURL.ts b/src/utils/buildURL.ts index 5b78fa2..942438c 100644 --- a/src/utils/buildURL.ts +++ b/src/utils/buildURL.ts @@ -1,14 +1,13 @@ -import { CDN_URI, IMAGE_RESIZING_SERVICE } from 'config/cdn'; +import Config from 'react-native-config'; const buildURL = (type: 'cdn' | 'cdnimg' | 'email', path: string): string => { switch (type) { case 'cdn': - return CDN_URI + path; + return Config.CDN_URL + '/' + path; case 'cdnimg': - return ( - IMAGE_RESIZING_SERVICE + - `?url=${CDN_URI + encodeURIComponent(path)}&w=640&q=75` - ); + return `${Config.WEBSITE}/_next/image?url=${ + Config.CDN_URL + '/' + encodeURIComponent(path) + }&w=640&q=75`; case 'email': return `mailto:${path}`; } diff --git a/yarn.lock b/yarn.lock index aa4beda..aa5634e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2166,6 +2166,118 @@ dependencies: any-observable "^0.3.0" +"@sentry/browser@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.12.0.tgz#970cd68fa117a1e1336fdb373e3b1fa76cd63e2d" + integrity sha512-wsJi1NLOmfwtPNYxEC50dpDcVY7sdYckzwfqz1/zHrede1mtxpqSw+7iP4bHADOJXuF+ObYYTHND0v38GSXznQ== + dependencies: + "@sentry/core" "6.12.0" + "@sentry/types" "6.12.0" + "@sentry/utils" "6.12.0" + tslib "^1.9.3" + +"@sentry/cli@^1.68.0": + version "1.71.0" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.71.0.tgz#1e33e05d7651b68f501764ab24dce3d5932b195d" + integrity sha512-Z8TzH7PkiRfjWSzjXOfPWWp6wxjr+n39Jdrt26OcInVQZM1sx/gZULrDiQZ1L2dy9Fe9AR4SF4nt2/7h2GmLQQ== + dependencies: + https-proxy-agent "^5.0.0" + mkdirp "^0.5.5" + node-fetch "^2.6.0" + npmlog "^4.1.2" + progress "^2.0.3" + proxy-from-env "^1.1.0" + +"@sentry/core@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.12.0.tgz#bc7c5f0785b6a392d9ad47bd9b1fae3f5389996c" + integrity sha512-mU/zdjlzFHzdXDZCPZm8OeCw7c9xsbL49Mq0TrY0KJjLt4CJBkiq5SDTGfRsenBLgTedYhe5Z/J8Z+xVVq+MfQ== + dependencies: + "@sentry/hub" "6.12.0" + "@sentry/minimal" "6.12.0" + "@sentry/types" "6.12.0" + "@sentry/utils" "6.12.0" + tslib "^1.9.3" + +"@sentry/hub@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.12.0.tgz#29e323ab6a95e178fb14fffb684aa0e09707197f" + integrity sha512-yR/UQVU+ukr42bSYpeqvb989SowIXlKBanU0cqLFDmv5LPCnaQB8PGeXwJAwWhQgx44PARhmB82S6Xor8gYNxg== + dependencies: + "@sentry/types" "6.12.0" + "@sentry/utils" "6.12.0" + tslib "^1.9.3" + +"@sentry/integrations@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.12.0.tgz#d900e89c588fbe6ce1b89ce74c042574daf638bb" + integrity sha512-M9gsVdWZp5fAFFpTjK2IBuWzW4SBxGAI3tVbYZvVx16S/BY0GsPC1dYpjJx9OTBS/8CmCWdGxnUmjACo/8w1LA== + dependencies: + "@sentry/types" "6.12.0" + "@sentry/utils" "6.12.0" + localforage "^1.8.1" + tslib "^1.9.3" + +"@sentry/minimal@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.12.0.tgz#cbe20e95056cedb9709d7d5b2119ef95206a9f8c" + integrity sha512-r3C54Q1KN+xIqUvcgX9DlcoWE7ezWvFk2pSu1Ojx9De81hVqR9u5T3sdSAP2Xma+um0zr6coOtDJG4WtYlOtsw== + dependencies: + "@sentry/hub" "6.12.0" + "@sentry/types" "6.12.0" + tslib "^1.9.3" + +"@sentry/react-native@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-3.2.3.tgz#39faf729a152f8cc9699b1d427ed0e8d095042a8" + integrity sha512-1d7RpprRDZ6WG53VhP1vhGllxlk3weZ1nbsTx3rHPuFXehhUsc8+W3M+WoVB4SHIUn9LWIHe01E9XnKZX/BSoQ== + dependencies: + "@sentry/browser" "6.12.0" + "@sentry/cli" "^1.68.0" + "@sentry/core" "6.12.0" + "@sentry/hub" "6.12.0" + "@sentry/integrations" "6.12.0" + "@sentry/react" "6.12.0" + "@sentry/tracing" "6.12.0" + "@sentry/types" "6.12.0" + "@sentry/utils" "6.12.0" + +"@sentry/react@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.12.0.tgz#8ae2680d226fafb0da0f3d8366bb285004ba6c2e" + integrity sha512-E8Nw9PPzP/EyMy64ksr9xcyYYlBmUA5ROnkPQp7o5wF0xf5/J+nMS1tQdyPnLQe2KUgHlN4kVs2HHft1m7mSYQ== + dependencies: + "@sentry/browser" "6.12.0" + "@sentry/minimal" "6.12.0" + "@sentry/types" "6.12.0" + "@sentry/utils" "6.12.0" + hoist-non-react-statics "^3.3.2" + tslib "^1.9.3" + +"@sentry/tracing@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.12.0.tgz#a05c8985ee7fed7310b029b147d8f9f14f2a2e67" + integrity sha512-u10QHNknPBzbWSUUNMkvuH53sQd5NaBo6YdNPj4p5b7sE7445Sh0PwBpRbY3ZiUUiwyxV59fx9UQ4yVnPGxZQA== + dependencies: + "@sentry/hub" "6.12.0" + "@sentry/minimal" "6.12.0" + "@sentry/types" "6.12.0" + "@sentry/utils" "6.12.0" + tslib "^1.9.3" + +"@sentry/types@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.12.0.tgz#b7395688a79403c6df8d8bb8d81deb8222519853" + integrity sha512-urtgLzE4EDMAYQHYdkgC0Ei9QvLajodK1ntg71bGn0Pm84QUpaqpPDfHRU+i6jLeteyC7kWwa5O5W1m/jrjGXA== + +"@sentry/utils@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.12.0.tgz#3de261e8d11bdfdc7add64a3065d43517802e975" + integrity sha512-oRHQ7TH5TSsJqoP9Gqq25Jvn9LKexXfAh/OoKwjMhYCGKGhqpDNUIZVgl9DWsGw5A5N5xnQyLOxDfyRV5RshdA== + dependencies: + "@sentry/types" "6.12.0" + tslib "^1.9.3" + "@sideway/address@^4.1.0": version "4.1.1" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.1.tgz#9e321e74310963fdf8eebfbee09c7bd69972de4d" @@ -2653,6 +2765,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^2.1.0, ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2703,6 +2820,19 @@ appdirsjs@^1.2.4: resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.4.tgz#3ab582acc9fdfaaa0c1f81b3a25422ad4d95f9d4" integrity sha512-WO5StDORR6JF/xYnXk/Fm0yu+iULaV5ULKuUw0Tu+jbgiTlSquaWBCgbpnsHLMXldf+fM3Gxn5p7vjond7He6w== +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -3673,6 +3803,11 @@ connect@^3.6.5: parseurl "~1.3.3" utils-merge "1.0.1" +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + constant-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" @@ -3983,6 +4118,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" @@ -4909,6 +5049,20 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -5145,6 +5299,11 @@ has-symbols@^1.0.1, has-symbols@^1.0.2: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -5321,6 +5480,11 @@ image-size@^0.6.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + immutable@~3.7.6: version "3.7.6" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" @@ -6566,6 +6730,13 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= + dependencies: + immediate "~3.0.5" + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -6629,6 +6800,13 @@ load-bmfont@^1.3.1, load-bmfont@^1.4.0: xhr "^2.0.1" xtend "^4.0.0" +localforage@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -7255,7 +7433,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.1: +mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -7491,6 +7669,16 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -8094,7 +8282,7 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0: +progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -8130,6 +8318,11 @@ prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -8231,6 +8424,11 @@ react-native-codegen@^0.0.7: jscodeshift "^0.11.0" nullthrows "^1.1.1" +react-native-config@^1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/react-native-config/-/react-native-config-1.4.5.tgz#6fe5895410b75e44fe4f4bf00caaf894a0981f3a" + integrity sha512-5oiAsoW88SOYDg/0cleJ2vJDqv98FJUbFQYEnH4sdMtEn3AAT3lb7BkTGW8HO/t3Vk9VOruwxUUnO4tzuxzCsw== + react-native-drawer@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/react-native-drawer/-/react-native-drawer-2.5.1.tgz#08b9314184f48c724f1b467f8859797369798654" @@ -8441,7 +8639,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@~2.3.6: +readable-stream@^2.0.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -8958,7 +9156,7 @@ serve-static@^1.13.1: parseurl "~1.3.3" send "0.17.1" -set-blocking@^2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -9355,6 +9553,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -9436,6 +9643,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -9748,7 +9962,7 @@ ts-node@^9: source-map-support "^0.5.17" yn "3.1.1" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -10166,6 +10380,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"