diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 1896997..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - root: true, - extends: '@react-native-community', - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], -}; diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index 5c4de1a..0000000 --- a/.prettierrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - bracketSpacing: false, - jsxBracketSameLine: true, - singleQuote: true, - trailingComma: 'all', -}; diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5d44ce6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "i18n-ally.localesPaths": "locales", + "i18n-ally.keystyle": "nested" +} \ No newline at end of file diff --git a/App.tsx b/App.tsx index b8e5f0d..234895d 100644 --- a/App.tsx +++ b/App.tsx @@ -17,13 +17,13 @@ * along with Campus INSAT. If not, see . */ -import * as React from 'react'; -import {LogBox, Platform, SafeAreaView, View} from 'react-native'; -import {NavigationContainer} from '@react-navigation/native'; -import {Provider as PaperProvider} from 'react-native-paper'; -import {setSafeBounceHeight} from 'react-navigation-collapsible'; +import React from 'react'; +import { LogBox, Platform, SafeAreaView, View } from 'react-native'; +import { NavigationContainer } from '@react-navigation/native'; +import { Provider as PaperProvider } from 'react-native-paper'; +import { setSafeBounceHeight } from 'react-navigation-collapsible'; import SplashScreen from 'react-native-splash-screen'; -import {OverflowMenuProvider} from 'react-navigation-header-buttons'; +import { OverflowMenuProvider } from 'react-navigation-header-buttons'; import AsyncStorageManager from './src/managers/AsyncStorageManager'; import CustomIntroSlider from './src/components/Overrides/CustomIntroSlider'; import ThemeManager from './src/managers/ThemeManager'; @@ -31,11 +31,12 @@ import MainNavigator from './src/navigation/MainNavigator'; import AprilFoolsManager from './src/managers/AprilFoolsManager'; import Update from './src/constants/Update'; import ConnectionManager from './src/managers/ConnectionManager'; -import type {ParsedUrlDataType} from './src/utils/URLHandler'; +import type { ParsedUrlDataType } from './src/utils/URLHandler'; import URLHandler from './src/utils/URLHandler'; -import {setupStatusBar} from './src/utils/Utils'; +import { setupStatusBar } from './src/utils/Utils'; import initLocales from './src/utils/Locales'; -import {NavigationContainerRef} from '@react-navigation/core'; +import { NavigationContainerRef } from '@react-navigation/core'; +import GENERAL_STYLES from './src/constants/Styles'; // Native optimizations https://reactnavigation.org/docs/react-native-screens // Crashes app when navigating away from webview on android 9+ @@ -56,11 +57,11 @@ type StateType = { }; export default class App extends React.Component<{}, StateType> { - navigatorRef: {current: null | NavigationContainerRef}; + navigatorRef: { current: null | NavigationContainerRef }; defaultHomeRoute: string | null; - defaultHomeData: {[key: string]: string}; + defaultHomeData: { [key: string]: string }; urlHandler: URLHandler; @@ -106,7 +107,7 @@ export default class App extends React.Component<{}, StateType> { if (nav != null) { nav.navigate('home', { screen: 'index', - params: {nextScreen: parsedData.route, data: parsedData.data}, + params: { nextScreen: parsedData.route, data: parsedData.data }, }); } }; @@ -132,15 +133,15 @@ export default class App extends React.Component<{}, StateType> { }); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.showIntro.key, - false, + false ); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.updateNumber.key, - Update.number, + Update.number ); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.showAprilFoolsStart.key, - false, + false ); }; @@ -161,16 +162,16 @@ export default class App extends React.Component<{}, StateType> { isLoading: false, currentTheme: ThemeManager.getCurrentTheme(), showIntro: AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.showIntro.key, + AsyncStorageManager.PREFERENCES.showIntro.key ), showUpdate: AsyncStorageManager.getNumber( - AsyncStorageManager.PREFERENCES.updateNumber.key, + AsyncStorageManager.PREFERENCES.updateNumber.key ) !== Update.number, showAprilFools: AprilFoolsManager.getInstance().isAprilFoolsEnabled() && AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.showAprilFoolsStart.key, + AsyncStorageManager.PREFERENCES.showAprilFoolsStart.key ), }); SplashScreen.hide(); @@ -194,7 +195,7 @@ export default class App extends React.Component<{}, StateType> { * Renders the app based on loading state */ render() { - const {state} = this; + const { state } = this; if (state.isLoading) { return null; } @@ -213,12 +214,14 @@ export default class App extends React.Component<{}, StateType> { - + ...GENERAL_STYLES.flex, + }} + > + + ref={this.navigatorRef} + > { }); }); return expect(c.connect('email', 'password')).rejects.toBe( - ERROR_TYPE.BAD_CREDENTIALS, + ERROR_TYPE.BAD_CREDENTIALS ); }); @@ -54,7 +52,7 @@ test('connect good credentials', () => { json: () => { return { error: ERROR_TYPE.SUCCESS, - data: {token: 'token'}, + data: { token: 'token' }, }; }, }); @@ -79,7 +77,7 @@ test('connect good credentials no consent', () => { }); }); return expect(c.connect('email', 'password')).rejects.toBe( - ERROR_TYPE.NO_CONSENT, + ERROR_TYPE.NO_CONSENT ); }); @@ -89,7 +87,7 @@ test('connect good credentials, fail save token', () => { json: () => { return { error: ERROR_TYPE.SUCCESS, - data: {token: 'token'}, + data: { token: 'token' }, }; }, }); @@ -100,7 +98,7 @@ test('connect good credentials, fail save token', () => { return Promise.reject(false); }); return expect(c.connect('email', 'password')).rejects.toBe( - ERROR_TYPE.TOKEN_SAVE, + ERROR_TYPE.TOKEN_SAVE ); }); @@ -109,7 +107,7 @@ test('connect connection error', () => { return Promise.reject(); }); return expect(c.connect('email', 'password')).rejects.toBe( - ERROR_TYPE.CONNECTION_ERROR, + ERROR_TYPE.CONNECTION_ERROR ); }); @@ -125,7 +123,7 @@ test('connect bogus response 1', () => { }); }); return expect(c.connect('email', 'password')).rejects.toBe( - ERROR_TYPE.SERVER_ERROR, + ERROR_TYPE.SERVER_ERROR ); }); @@ -140,14 +138,14 @@ test('authenticatedRequest success', () => { json: () => { return { error: ERROR_TYPE.SUCCESS, - data: {coucou: 'toi'}, + data: { coucou: 'toi' }, }; }, }); }); return expect( - c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check'), - ).resolves.toStrictEqual({coucou: 'toi'}); + c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check') + ).resolves.toStrictEqual({ coucou: 'toi' }); }); test('authenticatedRequest error wrong token', () => { @@ -167,7 +165,7 @@ test('authenticatedRequest error wrong token', () => { }); }); return expect( - c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check'), + c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check') ).rejects.toBe(ERROR_TYPE.BAD_TOKEN); }); @@ -187,7 +185,7 @@ test('authenticatedRequest error bogus response', () => { }); }); return expect( - c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check'), + c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check') ).rejects.toBe(ERROR_TYPE.SERVER_ERROR); }); @@ -201,7 +199,7 @@ test('authenticatedRequest connection error', () => { return Promise.reject(); }); return expect( - c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check'), + c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check') ).rejects.toBe(ERROR_TYPE.CONNECTION_ERROR); }); @@ -212,6 +210,6 @@ test('authenticatedRequest error no token', () => { return null; }); return expect( - c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check'), + c.authenticatedRequest('https://www.amicale-insat.fr/api/token/check') ).rejects.toBe(ERROR_TYPE.TOKEN_RETRIEVE); }); diff --git a/__tests__/utils/EquipmentBooking.test.js b/__tests__/utils/EquipmentBooking.test.js index 1405ed3..eba4c9a 100644 --- a/__tests__/utils/EquipmentBooking.test.js +++ b/__tests__/utils/EquipmentBooking.test.js @@ -1,6 +1,3 @@ -/* eslint-disable */ - -import React from 'react'; import * as EquipmentBooking from '../../src/utils/EquipmentBooking'; import i18n from 'i18n-js'; @@ -18,7 +15,7 @@ test('getCurrentDay', () => { .spyOn(Date, 'now') .mockImplementation(() => new Date('2020-01-14 14:50:35').getTime()); expect(EquipmentBooking.getCurrentDay().getTime()).toBe( - new Date('2020-01-14').getTime(), + new Date('2020-01-14').getTime() ); }); @@ -30,19 +27,19 @@ test('isEquipmentAvailable', () => { id: 1, name: 'Petit barbecue', caution: 100, - booked_at: [{begin: '2020-07-07', end: '2020-07-10'}], + booked_at: [{ begin: '2020-07-07', end: '2020-07-10' }], }; expect(EquipmentBooking.isEquipmentAvailable(testDevice)).toBeFalse(); - testDevice.booked_at = [{begin: '2020-07-07', end: '2020-07-09'}]; + testDevice.booked_at = [{ begin: '2020-07-07', end: '2020-07-09' }]; expect(EquipmentBooking.isEquipmentAvailable(testDevice)).toBeFalse(); - testDevice.booked_at = [{begin: '2020-07-09', end: '2020-07-10'}]; + testDevice.booked_at = [{ begin: '2020-07-09', end: '2020-07-10' }]; expect(EquipmentBooking.isEquipmentAvailable(testDevice)).toBeFalse(); testDevice.booked_at = [ - {begin: '2020-07-07', end: '2020-07-8'}, - {begin: '2020-07-10', end: '2020-07-12'}, + { begin: '2020-07-07', end: '2020-07-8' }, + { begin: '2020-07-10', end: '2020-07-12' }, ]; expect(EquipmentBooking.isEquipmentAvailable(testDevice)).toBeTrue(); }); @@ -55,29 +52,29 @@ test('getFirstEquipmentAvailability', () => { id: 1, name: 'Petit barbecue', caution: 100, - booked_at: [{begin: '2020-07-07', end: '2020-07-10'}], + booked_at: [{ begin: '2020-07-07', end: '2020-07-10' }], }; expect( - EquipmentBooking.getFirstEquipmentAvailability(testDevice).getTime(), + EquipmentBooking.getFirstEquipmentAvailability(testDevice).getTime() ).toBe(new Date('2020-07-11').getTime()); - testDevice.booked_at = [{begin: '2020-07-07', end: '2020-07-09'}]; + testDevice.booked_at = [{ begin: '2020-07-07', end: '2020-07-09' }]; expect( - EquipmentBooking.getFirstEquipmentAvailability(testDevice).getTime(), + EquipmentBooking.getFirstEquipmentAvailability(testDevice).getTime() ).toBe(new Date('2020-07-10').getTime()); testDevice.booked_at = [ - {begin: '2020-07-07', end: '2020-07-09'}, - {begin: '2020-07-10', end: '2020-07-16'}, + { begin: '2020-07-07', end: '2020-07-09' }, + { begin: '2020-07-10', end: '2020-07-16' }, ]; expect( - EquipmentBooking.getFirstEquipmentAvailability(testDevice).getTime(), + EquipmentBooking.getFirstEquipmentAvailability(testDevice).getTime() ).toBe(new Date('2020-07-17').getTime()); testDevice.booked_at = [ - {begin: '2020-07-07', end: '2020-07-09'}, - {begin: '2020-07-10', end: '2020-07-12'}, - {begin: '2020-07-14', end: '2020-07-16'}, + { begin: '2020-07-07', end: '2020-07-09' }, + { begin: '2020-07-10', end: '2020-07-12' }, + { begin: '2020-07-14', end: '2020-07-16' }, ]; expect( - EquipmentBooking.getFirstEquipmentAvailability(testDevice).getTime(), + EquipmentBooking.getFirstEquipmentAvailability(testDevice).getTime() ).toBe(new Date('2020-07-13').getTime()); }); @@ -85,7 +82,7 @@ test('getRelativeDateString', () => { jest .spyOn(Date, 'now') .mockImplementation(() => new Date('2020-07-09').getTime()); - jest.spyOn(i18n, 't').mockImplementation((translationString: string) => { + jest.spyOn(i18n, 't').mockImplementation((translationString) => { const prefix = 'screens.equipment.'; if (translationString === prefix + 'otherYear') return '0'; else if (translationString === prefix + 'otherMonth') return '1'; @@ -95,25 +92,25 @@ test('getRelativeDateString', () => { else return null; }); expect(EquipmentBooking.getRelativeDateString(new Date('2020-07-09'))).toBe( - '4', + '4' ); expect(EquipmentBooking.getRelativeDateString(new Date('2020-07-10'))).toBe( - '3', + '3' ); expect(EquipmentBooking.getRelativeDateString(new Date('2020-07-11'))).toBe( - '2', + '2' ); expect(EquipmentBooking.getRelativeDateString(new Date('2020-07-30'))).toBe( - '2', + '2' ); expect(EquipmentBooking.getRelativeDateString(new Date('2020-08-30'))).toBe( - '1', + '1' ); expect(EquipmentBooking.getRelativeDateString(new Date('2020-11-10'))).toBe( - '1', + '1' ); expect(EquipmentBooking.getRelativeDateString(new Date('2021-11-10'))).toBe( - '0', + '0' ); }); @@ -122,7 +119,7 @@ test('getValidRange', () => { id: 1, name: 'Petit barbecue', caution: 100, - booked_at: [{begin: '2020-07-07', end: '2020-07-10'}], + booked_at: [{ begin: '2020-07-07', end: '2020-07-10' }], }; let start = new Date('2020-07-11'); let end = new Date('2020-07-15'); @@ -134,62 +131,62 @@ test('getValidRange', () => { '2020-07-15', ]; expect(EquipmentBooking.getValidRange(start, end, testDevice)).toStrictEqual( - result, + result ); testDevice.booked_at = [ - {begin: '2020-07-07', end: '2020-07-10'}, - {begin: '2020-07-13', end: '2020-07-15'}, + { begin: '2020-07-07', end: '2020-07-10' }, + { begin: '2020-07-13', end: '2020-07-15' }, ]; result = ['2020-07-11', '2020-07-12']; expect(EquipmentBooking.getValidRange(start, end, testDevice)).toStrictEqual( - result, + result ); - testDevice.booked_at = [{begin: '2020-07-12', end: '2020-07-13'}]; + testDevice.booked_at = [{ begin: '2020-07-12', end: '2020-07-13' }]; result = ['2020-07-11']; expect(EquipmentBooking.getValidRange(start, end, testDevice)).toStrictEqual( - result, + result ); - testDevice.booked_at = [{begin: '2020-07-07', end: '2020-07-12'}]; + testDevice.booked_at = [{ begin: '2020-07-07', end: '2020-07-12' }]; result = ['2020-07-13', '2020-07-14', '2020-07-15']; expect(EquipmentBooking.getValidRange(end, start, testDevice)).toStrictEqual( - result, + result ); start = new Date('2020-07-14'); end = new Date('2020-07-14'); result = ['2020-07-14']; expect( - EquipmentBooking.getValidRange(start, start, testDevice), + EquipmentBooking.getValidRange(start, start, testDevice) ).toStrictEqual(result); expect(EquipmentBooking.getValidRange(end, start, testDevice)).toStrictEqual( - result, + result ); expect(EquipmentBooking.getValidRange(start, end, null)).toStrictEqual( - result, + result ); start = new Date('2020-07-14'); end = new Date('2020-07-17'); result = ['2020-07-14', '2020-07-15', '2020-07-16', '2020-07-17']; expect(EquipmentBooking.getValidRange(start, end, null)).toStrictEqual( - result, + result ); - testDevice.booked_at = [{begin: '2020-07-17', end: '2020-07-17'}]; + testDevice.booked_at = [{ begin: '2020-07-17', end: '2020-07-17' }]; result = ['2020-07-14', '2020-07-15', '2020-07-16']; expect(EquipmentBooking.getValidRange(start, end, testDevice)).toStrictEqual( - result, + result ); testDevice.booked_at = [ - {begin: '2020-07-12', end: '2020-07-13'}, - {begin: '2020-07-15', end: '2020-07-20'}, + { begin: '2020-07-12', end: '2020-07-13' }, + { begin: '2020-07-15', end: '2020-07-20' }, ]; start = new Date('2020-07-11'); end = new Date('2020-07-23'); result = ['2020-07-21', '2020-07-22', '2020-07-23']; expect(EquipmentBooking.getValidRange(end, start, testDevice)).toStrictEqual( - result, + result ); }); @@ -205,7 +202,7 @@ test('generateMarkedDates', () => { id: 1, name: 'Petit barbecue', caution: 100, - booked_at: [{begin: '2020-07-07', end: '2020-07-10'}], + booked_at: [{ begin: '2020-07-07', end: '2020-07-10' }], }; let start = new Date('2020-07-11'); let end = new Date('2020-07-13'); @@ -228,7 +225,7 @@ test('generateMarkedDates', () => { }, }; expect( - EquipmentBooking.generateMarkedDates(true, theme, range), + EquipmentBooking.generateMarkedDates(true, theme, range) ).toStrictEqual(result); result = { '2020-07-11': { @@ -248,7 +245,7 @@ test('generateMarkedDates', () => { }, }; expect( - EquipmentBooking.generateMarkedDates(false, theme, range), + EquipmentBooking.generateMarkedDates(false, theme, range) ).toStrictEqual(result); result = { '2020-07-11': { @@ -269,10 +266,10 @@ test('generateMarkedDates', () => { }; range = EquipmentBooking.getValidRange(end, start, testDevice); expect( - EquipmentBooking.generateMarkedDates(false, theme, range), + EquipmentBooking.generateMarkedDates(false, theme, range) ).toStrictEqual(result); - testDevice.booked_at = [{begin: '2020-07-13', end: '2020-07-15'}]; + testDevice.booked_at = [{ begin: '2020-07-13', end: '2020-07-15' }]; result = { '2020-07-11': { startingDay: true, @@ -287,10 +284,10 @@ test('generateMarkedDates', () => { }; range = EquipmentBooking.getValidRange(start, end, testDevice); expect( - EquipmentBooking.generateMarkedDates(true, theme, range), + EquipmentBooking.generateMarkedDates(true, theme, range) ).toStrictEqual(result); - testDevice.booked_at = [{begin: '2020-07-12', end: '2020-07-13'}]; + testDevice.booked_at = [{ begin: '2020-07-12', end: '2020-07-13' }]; result = { '2020-07-11': { startingDay: true, @@ -300,12 +297,12 @@ test('generateMarkedDates', () => { }; range = EquipmentBooking.getValidRange(start, end, testDevice); expect( - EquipmentBooking.generateMarkedDates(true, theme, range), + EquipmentBooking.generateMarkedDates(true, theme, range) ).toStrictEqual(result); testDevice.booked_at = [ - {begin: '2020-07-12', end: '2020-07-13'}, - {begin: '2020-07-15', end: '2020-07-20'}, + { begin: '2020-07-12', end: '2020-07-13' }, + { begin: '2020-07-15', end: '2020-07-20' }, ]; start = new Date('2020-07-11'); end = new Date('2020-07-23'); @@ -318,7 +315,7 @@ test('generateMarkedDates', () => { }; range = EquipmentBooking.getValidRange(start, end, testDevice); expect( - EquipmentBooking.generateMarkedDates(true, theme, range), + EquipmentBooking.generateMarkedDates(true, theme, range) ).toStrictEqual(result); result = { @@ -340,6 +337,6 @@ test('generateMarkedDates', () => { }; range = EquipmentBooking.getValidRange(end, start, testDevice); expect( - EquipmentBooking.generateMarkedDates(true, theme, range), + EquipmentBooking.generateMarkedDates(true, theme, range) ).toStrictEqual(result); }); diff --git a/__tests__/utils/PlanningEventManager.test.js b/__tests__/utils/PlanningEventManager.test.js index ad57c6e..8650ae8 100644 --- a/__tests__/utils/PlanningEventManager.test.js +++ b/__tests__/utils/PlanningEventManager.test.js @@ -1,6 +1,3 @@ -/* eslint-disable */ - -import React from 'react'; import * as Planning from '../../src/utils/Planning'; test('isDescriptionEmpty', () => { @@ -24,7 +21,7 @@ test('isEventDateStringFormatValid', () => { expect(Planning.isEventDateStringFormatValid('3214-64-12 01:16')).toBeTrue(); expect( - Planning.isEventDateStringFormatValid('3214-64-12 01:16:00'), + Planning.isEventDateStringFormatValid('3214-64-12 01:16:00') ).toBeFalse(); expect(Planning.isEventDateStringFormatValid('3214-64-12 1:16')).toBeFalse(); expect(Planning.isEventDateStringFormatValid('3214-f4-12 01:16')).toBeFalse(); @@ -32,7 +29,7 @@ test('isEventDateStringFormatValid', () => { expect(Planning.isEventDateStringFormatValid('2020-03-21')).toBeFalse(); expect(Planning.isEventDateStringFormatValid('2020-03-21 truc')).toBeFalse(); expect( - Planning.isEventDateStringFormatValid('3214-64-12 1:16:65'), + Planning.isEventDateStringFormatValid('3214-64-12 1:16:65') ).toBeFalse(); expect(Planning.isEventDateStringFormatValid('garbage')).toBeFalse(); expect(Planning.isEventDateStringFormatValid('')).toBeFalse(); @@ -65,17 +62,17 @@ test('getFormattedEventTime', () => { expect(Planning.getFormattedEventTime(undefined, undefined)).toBe('/ - /'); expect(Planning.getFormattedEventTime('20:30', '23:00')).toBe('/ - /'); expect(Planning.getFormattedEventTime('2020-03-30', '2020-03-31')).toBe( - '/ - /', + '/ - /' ); expect( - Planning.getFormattedEventTime('2020-03-21 09:00', '2020-03-21 09:00'), + Planning.getFormattedEventTime('2020-03-21 09:00', '2020-03-21 09:00') ).toBe('09:00'); expect( - Planning.getFormattedEventTime('2020-03-21 09:00', '2020-03-22 17:00'), + Planning.getFormattedEventTime('2020-03-21 09:00', '2020-03-22 17:00') ).toBe('09:00 - 23:59'); expect( - Planning.getFormattedEventTime('2020-03-30 20:30', '2020-03-30 23:00'), + Planning.getFormattedEventTime('2020-03-30 20:30', '2020-03-30 23:00') ).toBe('20:30 - 23:00'); }); @@ -90,38 +87,38 @@ test('getDateOnlyString', () => { test('isEventBefore', () => { expect( - Planning.isEventBefore('2020-03-21 09:00', '2020-03-21 10:00'), + Planning.isEventBefore('2020-03-21 09:00', '2020-03-21 10:00') ).toBeTrue(); expect( - Planning.isEventBefore('2020-03-21 10:00', '2020-03-21 10:15'), + Planning.isEventBefore('2020-03-21 10:00', '2020-03-21 10:15') ).toBeTrue(); expect( - Planning.isEventBefore('2020-03-21 10:15', '2021-03-21 10:15'), + Planning.isEventBefore('2020-03-21 10:15', '2021-03-21 10:15') ).toBeTrue(); expect( - Planning.isEventBefore('2020-03-21 10:15', '2020-05-21 10:15'), + Planning.isEventBefore('2020-03-21 10:15', '2020-05-21 10:15') ).toBeTrue(); expect( - Planning.isEventBefore('2020-03-21 10:15', '2020-03-30 10:15'), + Planning.isEventBefore('2020-03-21 10:15', '2020-03-30 10:15') ).toBeTrue(); expect( - Planning.isEventBefore('2020-03-21 10:00', '2020-03-21 10:00'), + Planning.isEventBefore('2020-03-21 10:00', '2020-03-21 10:00') ).toBeFalse(); expect( - Planning.isEventBefore('2020-03-21 10:00', '2020-03-21 09:00'), + Planning.isEventBefore('2020-03-21 10:00', '2020-03-21 09:00') ).toBeFalse(); expect( - Planning.isEventBefore('2020-03-21 10:15', '2020-03-21 10:00'), + Planning.isEventBefore('2020-03-21 10:15', '2020-03-21 10:00') ).toBeFalse(); expect( - Planning.isEventBefore('2021-03-21 10:15', '2020-03-21 10:15'), + Planning.isEventBefore('2021-03-21 10:15', '2020-03-21 10:15') ).toBeFalse(); expect( - Planning.isEventBefore('2020-05-21 10:15', '2020-03-21 10:15'), + Planning.isEventBefore('2020-05-21 10:15', '2020-03-21 10:15') ).toBeFalse(); expect( - Planning.isEventBefore('2020-03-30 10:15', '2020-03-21 10:15'), + Planning.isEventBefore('2020-03-30 10:15', '2020-03-21 10:15') ).toBeFalse(); expect(Planning.isEventBefore('garbage', '2020-03-21 10:15')).toBeFalse(); @@ -162,25 +159,25 @@ test('generateEmptyCalendar', () => { test('pushEventInOrder', () => { let eventArray = []; - let event1 = {date_begin: '2020-01-14 09:15'}; + let event1 = { date_begin: '2020-01-14 09:15' }; Planning.pushEventInOrder(eventArray, event1); expect(eventArray.length).toBe(1); expect(eventArray[0]).toBe(event1); - let event2 = {date_begin: '2020-01-14 10:15'}; + let event2 = { date_begin: '2020-01-14 10:15' }; Planning.pushEventInOrder(eventArray, event2); expect(eventArray.length).toBe(2); expect(eventArray[0]).toBe(event1); expect(eventArray[1]).toBe(event2); - let event3 = {date_begin: '2020-01-14 10:15', title: 'garbage'}; + let event3 = { date_begin: '2020-01-14 10:15', title: 'garbage' }; Planning.pushEventInOrder(eventArray, event3); expect(eventArray.length).toBe(3); expect(eventArray[0]).toBe(event1); expect(eventArray[1]).toBe(event2); expect(eventArray[2]).toBe(event3); - let event4 = {date_begin: '2020-01-13 09:00'}; + let event4 = { date_begin: '2020-01-13 09:00' }; Planning.pushEventInOrder(eventArray, event4); expect(eventArray.length).toBe(4); expect(eventArray[0]).toBe(event4); @@ -194,11 +191,11 @@ test('generateEventAgenda', () => { .spyOn(Date, 'now') .mockImplementation(() => new Date('2020-01-14T00:00:00.000Z').getTime()); let eventList = [ - {date_begin: '2020-01-14 09:15'}, - {date_begin: '2020-02-01 09:15'}, - {date_begin: '2020-01-15 09:15'}, - {date_begin: '2020-02-01 09:30'}, - {date_begin: '2020-02-01 08:30'}, + { date_begin: '2020-01-14 09:15' }, + { date_begin: '2020-02-01 09:15' }, + { date_begin: '2020-01-15 09:15' }, + { date_begin: '2020-02-01 09:30' }, + { date_begin: '2020-02-01 08:30' }, ]; const calendar = Planning.generateEventAgenda(eventList, 2); expect(calendar['2020-01-14'].length).toBe(1); diff --git a/__tests__/utils/Proxiwash.test.js b/__tests__/utils/Proxiwash.test.js index 4bb7c51..c45156a 100644 --- a/__tests__/utils/Proxiwash.test.js +++ b/__tests__/utils/Proxiwash.test.js @@ -1,6 +1,3 @@ -/* eslint-disable */ - -import React from 'react'; import { getCleanedMachineWatched, getMachineEndDate, @@ -15,19 +12,19 @@ test('getMachineEndDate', () => { let expectDate = new Date('2020-01-14T15:00:00.000Z'); expectDate.setHours(23); expectDate.setMinutes(10); - expect(getMachineEndDate({endTime: '23:10'}).getTime()).toBe( - expectDate.getTime(), + expect(getMachineEndDate({ endTime: '23:10' }).getTime()).toBe( + expectDate.getTime() ); expectDate.setHours(16); expectDate.setMinutes(30); - expect(getMachineEndDate({endTime: '16:30'}).getTime()).toBe( - expectDate.getTime(), + expect(getMachineEndDate({ endTime: '16:30' }).getTime()).toBe( + expectDate.getTime() ); - expect(getMachineEndDate({endTime: '15:30'})).toBeNull(); + expect(getMachineEndDate({ endTime: '15:30' })).toBeNull(); - expect(getMachineEndDate({endTime: '13:10'})).toBeNull(); + expect(getMachineEndDate({ endTime: '13:10' })).toBeNull(); jest .spyOn(Date, 'now') @@ -35,8 +32,8 @@ test('getMachineEndDate', () => { expectDate = new Date('2020-01-14T23:00:00.000Z'); expectDate.setHours(0); expectDate.setMinutes(30); - expect(getMachineEndDate({endTime: '00:30'}).getTime()).toBe( - expectDate.getTime(), + expect(getMachineEndDate({ endTime: '00:30' }).getTime()).toBe( + expectDate.getTime() ); }); @@ -52,16 +49,16 @@ test('isMachineWatched', () => { }, ]; expect( - isMachineWatched({number: '0', endTime: '23:30'}, machineList), + isMachineWatched({ number: '0', endTime: '23:30' }, machineList) ).toBeTrue(); expect( - isMachineWatched({number: '1', endTime: '20:30'}, machineList), + isMachineWatched({ number: '1', endTime: '20:30' }, machineList) ).toBeTrue(); expect( - isMachineWatched({number: '3', endTime: '20:30'}, machineList), + isMachineWatched({ number: '3', endTime: '20:30' }, machineList) ).toBeFalse(); expect( - isMachineWatched({number: '1', endTime: '23:30'}, machineList), + isMachineWatched({ number: '1', endTime: '23:30' }, machineList) ).toBeFalse(); }); @@ -74,8 +71,8 @@ test('getMachineOfId', () => { number: '1', }, ]; - expect(getMachineOfId('0', machineList)).toStrictEqual({number: '0'}); - expect(getMachineOfId('1', machineList)).toStrictEqual({number: '1'}); + expect(getMachineOfId('0', machineList)).toStrictEqual({ number: '0' }); + expect(getMachineOfId('1', machineList)).toStrictEqual({ number: '1' }); expect(getMachineOfId('3', machineList)).toBeNull(); }); @@ -110,7 +107,7 @@ test('getCleanedMachineWatched', () => { ]; let cleanedList = watchList; expect(getCleanedMachineWatched(watchList, machineList)).toStrictEqual( - cleanedList, + cleanedList ); watchList = [ @@ -138,7 +135,7 @@ test('getCleanedMachineWatched', () => { }, ]; expect(getCleanedMachineWatched(watchList, machineList)).toStrictEqual( - cleanedList, + cleanedList ); watchList = [ @@ -162,6 +159,6 @@ test('getCleanedMachineWatched', () => { }, ]; expect(getCleanedMachineWatched(watchList, machineList)).toStrictEqual( - cleanedList, + cleanedList ); }); diff --git a/__tests__/utils/WebData.test.js b/__tests__/utils/WebData.test.js index 33e0c58..116b818 100644 --- a/__tests__/utils/WebData.test.js +++ b/__tests__/utils/WebData.test.js @@ -1,8 +1,6 @@ -/* eslint-disable */ - -import React from 'react'; -import {isApiResponseValid} from '../../src/utils/WebData'; +import { isApiResponseValid } from '../../src/utils/WebData'; +// eslint-disable-next-line no-unused-vars const fetch = require('isomorphic-fetch'); // fetch is not implemented in nodeJS but in react-native test('isRequestResponseValid', () => { @@ -23,7 +21,7 @@ test('isRequestResponseValid', () => { expect(isApiResponseValid(json)).toBeTrue(); json = { error: 50, - data: {truc: 'machin'}, + data: { truc: 'machin' }, }; expect(isApiResponseValid(json)).toBeTrue(); json = { @@ -32,7 +30,7 @@ test('isRequestResponseValid', () => { expect(isApiResponseValid(json)).toBeFalse(); json = { error: 'coucou', - data: {truc: 'machin'}, + data: { truc: 'machin' }, }; expect(isApiResponseValid(json)).toBeFalse(); json = { diff --git a/clear-node-cache.sh b/clear-node-cache.sh deleted file mode 100755 index 63975cf..0000000 --- a/clear-node-cache.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -echo "Removing node_modules..." -rm -rf node_modules/ -echo -e "Done\n" - -echo "Removing locks..." -rm -f package-lock.json && rm -f yarn.lock -echo -e "Done\n" - -#echo "Verifying npm cache..." -#npm cache verify -#echo -e "Done\n" - -echo "Installing dependencies..." -npm install -echo -e "Done\n" - diff --git a/index.js b/index.js index 4c1700a..325e0d7 100644 --- a/index.js +++ b/index.js @@ -21,9 +21,8 @@ * @format */ -import {AppRegistry} from 'react-native'; +import { AppRegistry } from 'react-native'; import App from './App'; -import {name as appName} from './app.json'; +import { name as appName } from './app.json'; -// eslint-disable-next-line flowtype/require-return-type AppRegistry.registerComponent(appName, () => App); diff --git a/metro.config.js b/metro.config.js index 4c78812..e91aba9 100644 --- a/metro.config.js +++ b/metro.config.js @@ -7,11 +7,10 @@ module.exports = { transformer: { - // eslint-disable-next-line flowtype/require-return-type getTransformOptions: async () => ({ transform: { experimentalImportSupport: false, - inlineRequires: false, + inlineRequires: true, }, }), }, diff --git a/package-lock.json b/package-lock.json index 7a2723f..99ce24e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,23 +5,28 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, + "@babel/compat-data": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==" + }, "@babel/core": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", - "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.0.tgz", + "integrity": "sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg==", "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.11.0", "@babel/helper-module-transforms": "^7.11.0", "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", + "@babel/parser": "^7.11.0", "@babel/template": "^7.10.4", "@babel/traverse": "^7.11.0", "@babel/types": "^7.11.0", @@ -36,257 +41,258 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.1.tgz", + "integrity": "sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ==", "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.14.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "@babel/helper-builder-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", - "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", + "@babel/helper-compilation-targets": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-react-jsx-experimental": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", - "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.10.5" + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.1.tgz", + "integrity": "sha512-r8rsUahG4ywm0QpGcCrLaUSOuNAISR3IZCg4Fx05Ozq31aCUrQsTLH6KPxy0N5ULoQ4Sn9qjNdGNtbPWAC6hYg==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" } }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "@babel/helper-define-polyfill-provider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "@babel/helper-explode-assignable-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", - "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "requires": { - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.13.0" } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.13.12" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.13.12" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz", + "integrity": "sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==", "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", - "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.13.12" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==" }, - "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.14.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -330,72 +336,74 @@ } }, "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q==" }, "@babel/plugin-external-helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.10.4.tgz", - "integrity": "sha512-5mASqSthmRNYVXOphYzlqmR3Y8yp5SZMZhtKDh2DGV3R2PWGLEmP7qOahw66//6m4hjhlpV1bVM7xIJHt1F77Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.13.tgz", + "integrity": "sha512-ClvAsk4RqpE6iacYUjdU9PtvIwC9yAefZENsPfGeG5FckX3jFZLDlWPuyv5gi9/9C2VgwX6H8q1ukBifC0ha+Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-export-default-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.4.tgz", - "integrity": "sha512-G1l00VvDZ7Yk2yRlC5D8Ybvu3gmeHS3rCHoUYdjrqGYUtdeOBoRypnvDZ5KQqxyaiiGHWnVDeSEzA5F9ozItig==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.13.tgz", + "integrity": "sha512-idIsBT+DGXdOHL82U+8bwX4goHm/z10g8sGGrQroh+HCRcm7mDv/luaGdWJQMTuCX2FsdXS7X0Nyyzp4znAPJA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-default-from": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-default-from": "^7.12.13" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-syntax-async-generators": { @@ -417,11 +425,11 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-dynamic-import": { @@ -433,19 +441,19 @@ } }, "@babel/plugin-syntax-export-default-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.4.tgz", - "integrity": "sha512-79V6r6Pgudz0RnuMGp5xidu6Z+bPFugh8/Q9eDHonmLp4wKFAZDwygJwYgCzuDu8lFA/sYyT+mc5y2wkd7bTXA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.13.tgz", + "integrity": "sha512-gVry0zqoums0hA+EniCYK3gABhjYSLX1dVuwYpPw9DrLNA4/GovXySHVg4FGRsZht09ON/5C2NVx3keq+qqVGQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-flow": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", - "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", + "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-import-meta": { @@ -467,11 +475,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -525,315 +533,295 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", - "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", + "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.1.tgz", + "integrity": "sha512-2mQXd0zBrwfp0O1moWIhPpEeTKDvxyHcnma3JATVP1l+CctWBuot6OJG8LQ4DnBj4ZZPSmlb/fm4mu47EOAnVA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", + "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz", - "integrity": "sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz", + "integrity": "sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-flow": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-flow": "^7.12.13" } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.13.12", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-object-assign": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.10.4.tgz", - "integrity": "sha512-6zccDhYEICfMeQqIjuY5G09/yhKzG30DKHJeYBQUHIsJH7c2jXSGvgwRalufLAXAq432OSlsEfAOLlzEsQzxVw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz", + "integrity": "sha512-4QxDMc0lAOkIBSfCrnSGbAJ+4epDBF2XXwcLXuBcG1xl9u7LrktNVD4+LwhL47XuKVPQ7R25e/WdcV+h97HyZA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", + "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", + "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", "requires": { - "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", + "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", + "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-runtime": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", - "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz", + "integrity": "sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA==", "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "semver": "^6.3.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-typescript": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", - "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", + "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-typescript": "^7.12.13" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/register": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.5.tgz", - "integrity": "sha512-eYHdLv43nyvmPn9bfNfrcC4+iYNwdQ8Pxk1MFJuU/U5LpSYl/PH4dFMazCYZDFVi8ueG3shvO+AQfLrxpYulQw==", + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.13.16.tgz", + "integrity": "sha512-dh2t11ysujTwByQjXNgJ48QZ2zcXKQVdV8s0TbeMI0flmtGWCdTwK9tJiACHXPLmncm5+ktNn/diojA45JE4jg==", "requires": { + "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", - "lodash": "^4.17.19", "make-dir": "^2.1.0", "pirates": "^4.0.0", "source-map-support": "^0.5.16" } }, "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.0.tgz", + "integrity": "sha512-qArkXsjJq7H+T86WrIFV0Fnu/tNOkZ4cgXmjkzAu3b/58D5mFIO8JH/y77t7C9q0OdDRdh9s7Ue5GasYssxtXw==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", - "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.0.tgz", + "integrity": "sha512-0R0HTZWHLk6G8jIk0FtoX+AatCtKnswS98VhXwGImFc759PJRp4Tru0PQYZofyijTFUr+gT8Mu7sgXVJLQ0ceg==", "dev": true, "requires": { "core-js-pure": "^3.0.0", @@ -841,48 +829,51 @@ } }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.0.tgz", + "integrity": "sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.0", + "@babel/types": "^7.14.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.1.tgz", + "integrity": "sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.14.0", "to-fast-properties": "^2.0.0" } }, @@ -893,9 +884,9 @@ "dev": true }, "@callstack/react-theme-provider": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@callstack/react-theme-provider/-/react-theme-provider-3.0.5.tgz", - "integrity": "sha512-Iec+ybWN0FvNj87sD3oWo/49edGUP0UOSdMnzCJEFJIDYr992ECIuOV89burAAh2/ibPCxgLiK6dmgv2mO/8Tg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@callstack/react-theme-provider/-/react-theme-provider-3.0.6.tgz", + "integrity": "sha512-wwKMXfmklfogpalNZT0W+jh76BIquiYUiQHOaPmt/PCyCEP/E6rP+e7Uie6mBZrfkea9WJYJ+mus6r+45JAEhg==", "requires": { "deepmerge": "^3.2.0", "hoist-non-react-statics": "^3.3.0" @@ -974,9 +965,9 @@ } }, "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { @@ -1017,6 +1008,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1089,18 +1085,24 @@ } }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -1126,9 +1128,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -1243,13 +1245,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -1279,12 +1281,6 @@ "glob": "^7.1.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -1304,9 +1300,9 @@ } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "which": { @@ -1416,21 +1412,15 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1463,9 +1453,9 @@ } }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } @@ -1542,9 +1532,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -1570,9 +1560,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -1667,13 +1657,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -1682,12 +1672,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1757,9 +1741,9 @@ } }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } @@ -1805,9 +1789,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -1833,9 +1817,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -1930,13 +1914,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -1945,12 +1929,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1996,9 +1974,9 @@ }, "dependencies": { "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -2024,9 +2002,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -2105,13 +2083,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -2120,12 +2098,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2149,18 +2121,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } } } }, @@ -2189,19 +2149,31 @@ } }, "@react-native-community/cli-debugger-ui": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.9.0.tgz", - "integrity": "sha512-fBFGamHm4VUrDqkBGnsrwQL8OC6Om7K6EBQb4xj0nWekpXt1HSa3ScylYHTTWwYcpRf9htGMRGiv4dQDY/odAw==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz", + "integrity": "sha512-UFnkg5RTq3s2X15fSkrWY9+5BKOFjihNSnJjTV2H5PtTUFbd55qnxxPw8CxSfK0bXb1IrSvCESprk2LEpqr5cg==", "requires": { "serve-static": "^1.13.1" } }, - "@react-native-community/cli-platform-android": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-4.11.0.tgz", - "integrity": "sha512-BzqocGjOCjpDW0bM/LUrHMXw4nBvOhDXnHWxaoRp3eeUVsD2oSegoRn52kZo9yhPb9cCPkZJ3b+Web71Ue4j9w==", + "@react-native-community/cli-hermes": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz", + "integrity": "sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ==", "requires": { - "@react-native-community/cli-tools": "^4.11.0", + "@react-native-community/cli-platform-android": "^4.13.0", + "@react-native-community/cli-tools": "^4.13.0", + "chalk": "^3.0.0", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5" + } + }, + "@react-native-community/cli-platform-android": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz", + "integrity": "sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA==", + "requires": { + "@react-native-community/cli-tools": "^4.13.0", "chalk": "^3.0.0", "execa": "^1.0.0", "fs-extra": "^8.1.0", @@ -2211,21 +2183,14 @@ "logkitty": "^0.7.1", "slash": "^3.0.0", "xmldoc": "^1.1.2" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - } } }, "@react-native-community/cli-platform-ios": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.11.0.tgz", - "integrity": "sha512-/qkjnhhJ7BGBTNkHSS8a+z8UgWUQbU6YZOTuYxjNywGUzMiTsb/wlm2cWCY1VEAvWtY97c4plAZ5OferPJHaVA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz", + "integrity": "sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA==", "requires": { - "@react-native-community/cli-tools": "^4.11.0", + "@react-native-community/cli-tools": "^4.13.0", "chalk": "^3.0.0", "glob": "^7.1.3", "js-yaml": "^3.13.1", @@ -2235,20 +2200,26 @@ } }, "@react-native-community/cli-server-api": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-4.11.0.tgz", - "integrity": "sha512-vrRaGq7ezsxyyUsFhAboEtA1CHLDa2UpJygOWHip30LaAluM+vopAJbau2NtHVX54vgQzXo438Tx8TXiRacPhA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz", + "integrity": "sha512-vQzsFKD9CjHthA2ehTQX8c7uIzlI9A7ejaIow1I9RlEnLraPH2QqVDmzIdbdh5Od47UPbRzamCgAP8Bnqv3qwQ==", "requires": { - "@react-native-community/cli-debugger-ui": "^4.9.0", - "@react-native-community/cli-tools": "^4.11.0", + "@react-native-community/cli-debugger-ui": "^4.13.1", + "@react-native-community/cli-tools": "^4.13.0", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.0", + "nocache": "^2.1.0", "pretty-format": "^25.1.0", "serve-static": "^1.13.1", "ws": "^1.1.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, "pretty-format": { "version": "25.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", @@ -2263,9 +2234,9 @@ } }, "@react-native-community/cli-tools": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-4.11.0.tgz", - "integrity": "sha512-o2dh9q/778lIYBJxgIvTXkcxi9bSozjt8lv3tpyVmLZNA/PAPmQ7CafT37jWWwdmaSgP7nWyp4DtuE/gRsrXkA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz", + "integrity": "sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg==", "requires": { "chalk": "^3.0.0", "lodash": "^4.17.15", @@ -2276,9 +2247,9 @@ }, "dependencies": { "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" } } }, @@ -2306,52 +2277,6 @@ "eslint-plugin-react-hooks": "^3.0.0", "eslint-plugin-react-native": "3.8.1", "prettier": "^2.0.2" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "eslint-plugin-flowtype": { - "version": "2.50.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz", - "integrity": "sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "eslint-plugin-react": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", - "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.15.1", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.2", - "xregexp": "^4.3.0" - } - }, - "eslint-plugin-react-hooks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz", - "integrity": "sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==", - "dev": true - } } }, "@react-native-community/eslint-plugin": { @@ -2388,16 +2313,15 @@ } }, "@react-navigation/core": { - "version": "5.12.3", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.12.3.tgz", - "integrity": "sha512-aEOTAw4FRRNsNu6F9ibLk3SVSs4Res8BI832NEZN6qUto5ZgtuYnQHWeWV2cZ43Nc9KvUyQC/vXvO2RScwgFwA==", + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.15.3.tgz", + "integrity": "sha512-3ZdyDInh8qg1kygCNkmh9lFgpDf29lTvPsaMe2mm/qvmxLKSgttWBz07P2fc181aV9jTdgQpzYfWZ5KWT036zw==", "requires": { - "@react-navigation/routers": "^5.4.11", + "@react-navigation/routers": "^5.7.2", "escape-string-regexp": "^4.0.0", - "nanoid": "^3.1.12", - "query-string": "^6.13.1", - "react-is": "^16.13.0", - "use-subscription": "^1.4.0" + "nanoid": "^3.1.15", + "query-string": "^6.13.6", + "react-is": "^16.13.0" } }, "@react-navigation/native": { @@ -2410,11 +2334,11 @@ } }, "@react-navigation/routers": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.4.11.tgz", - "integrity": "sha512-J/CsHdIjYBRe81UUiLOoz9NSrQ91uP23Oe21QPCALInRHx+rfwo2oPl6Fn8xAa7n8Dtt2oQUGyF+g5d05cB74w==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.7.2.tgz", + "integrity": "sha512-BxNSMLHpU+oS37Xok0ql6rc9U7IC8aUD4+U5ZPbjDJ0pwzZxGGh0YOEBzfV4k/Ig3cbPdvVWbc1C9HHbCVr2oQ==", "requires": { - "nanoid": "^3.1.12" + "nanoid": "^3.1.15" } }, "@react-navigation/stack": { @@ -2427,18 +2351,18 @@ } }, "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -2449,18 +2373,18 @@ } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -2468,19 +2392,14 @@ } }, "@types/babel__traverse": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", - "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -2488,18 +2407,18 @@ "dev": true }, "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/hammerjs": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.36.tgz", - "integrity": "sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ==" + "version": "2.0.39", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.39.tgz", + "integrity": "sha512-lYR2Y/tV2ujpk/WyUc7S0VLI0a9hrtVIN9EwnrNo5oSEJI2cK2/XrgwOQmXLL3eTulOESvh9qP6si9+DWM9cOA==" }, "@types/i18n-js": { "version": "3.0.3", @@ -2539,6 +2458,12 @@ "pretty-format": "^25.2.1" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "pretty-format": { "version": "25.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", @@ -2554,21 +2479,15 @@ } }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, "@types/node": { - "version": "14.0.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", - "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", + "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==", "dev": true }, "@types/normalize-package-data": { @@ -2590,19 +2509,20 @@ "dev": true }, "@types/react": { - "version": "16.9.49", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.49.tgz", - "integrity": "sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g==", + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.5.tgz", + "integrity": "sha512-bj4biDB9ZJmGAYTWSKJly6bMr4BLUiBrx9ujiJEoP9XIDY9CTaPGxE5QWN/1WjpPLzYF7/jRNnV2nNxNe970sw==", "dev": true, "requires": { "@types/prop-types": "*", + "@types/scheduler": "*", "csstype": "^3.0.2" } }, "@types/react-native": { - "version": "0.63.20", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.63.20.tgz", - "integrity": "sha512-APnxRTDxbWw/IYjvwvXkhYJiz1gahyVA579pJqAVsEfZ+ZUwUHZpWKnexobyH5NmRJHuA/8LrThyps/BW3SYXA==", + "version": "0.63.2", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.63.2.tgz", + "integrity": "sha512-oxbp084lUsZvwfdWmWxKjJAuqEraQDRf+cE/JgwmrHQMguSrmgIHZ3xkeoQ5FYnW5NHIPpHudB3BbjL1Zn3vnA==", "dev": true, "requires": { "@types/react": "*" @@ -2630,14 +2550,20 @@ } }, "@types/react-test-renderer": { - "version": "16.9.3", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.3.tgz", - "integrity": "sha512-wJ7IlN5NI82XMLOyHSa+cNN4Z0I+8/YaLl04uDgcZ+W+ExWCmCiVTLT/7fRNqzy4OhStZcUwIqLNF7q+AdW43Q==", + "version": "16.9.2", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz", + "integrity": "sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw==", "dev": true, "requires": { "@types/react": "*" } }, + "@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==", + "dev": true + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -2650,58 +2576,58 @@ "dev": true }, "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.27.0.tgz", + "integrity": "sha512-/my+vVHRN7zYgcp0n4z5A6HAK7bvKGBiswaM5zIlOQczsxj/aiD7RcgD+dvVFuwFaGh5+kM7XA6Q6PN0bvb1tw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/experimental-utils": "2.27.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz", + "integrity": "sha512-vOsYzjwJlY6E0NJRXPTeCGqjv5OHgRU1kzxHKWJVPjDYGbPgLudBXjIlc+OD1hDBZ4l1DLbOc5VjofKahsu9Jw==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", + "@typescript-eslint/typescript-estree": "2.27.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.27.0.tgz", + "integrity": "sha512-HFUXZY+EdwrJXZo31DW4IS1ujQW3krzlRjBrFRrJcMDh0zCu107/nRfhk/uBasO8m0NVDbBF5WZKcIUMRO7vPg==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", + "@typescript-eslint/experimental-utils": "2.27.0", + "@typescript-eslint/typescript-estree": "2.27.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz", + "integrity": "sha512-t2miCCJIb/FU8yArjAvxllxbTiyNqaXJag7UOpB5DVoM3+xnjeOngtqlJkLRnMtzaRcJhe3CIR9RmL40omubhg==", "dev": true, "requires": { "debug": "^4.1.1", @@ -2709,14 +2635,14 @@ "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", - "semver": "^7.3.2", + "semver": "^6.3.0", "tsutils": "^3.17.1" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -2727,19 +2653,19 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true } } }, "abab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", - "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "abort-controller": { @@ -2765,9 +2691,9 @@ } }, "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-globals": { @@ -2781,17 +2707,17 @@ }, "dependencies": { "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true } } }, "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "acorn-walk": { @@ -2801,9 +2727,9 @@ "dev": true }, "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -2865,16 +2791,15 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" }, "dependencies": { @@ -2915,16 +2840,6 @@ "sprintf-js": "~1.0.2" } }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -2952,13 +2867,15 @@ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" }, "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", "is-string": "^1.0.5" } }, @@ -2982,27 +2899,6 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "array.prototype.flatmap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", - "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" - } - }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -3028,12 +2924,6 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -3059,9 +2949,9 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autolinker": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.14.1.tgz", - "integrity": "sha512-yvsRHIaY51EYDml6MGlbqyJGfl4n7zezGYf+R7gvM8c5LNpRGc4SISkvgAswSS8SWxk/OrGCylKV9mJyVstz7w==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.14.3.tgz", + "integrity": "sha512-t81i2bCpS+s+5FIhatoww9DmpjhbdiimuU9ATEuLxtZMQ7jLv9fyFn7SWNG8IkEfD4AmYyirL1ss9k1aqVWRvg==", "requires": { "tslib": "^1.9.3" } @@ -3073,21 +2963,9 @@ "dev": true }, "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true - }, - "axe-core": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", - "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==", - "dev": true - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "babel-eslint": { @@ -3105,27 +2983,18 @@ } }, "babel-jest": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", - "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", + "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", "dev": true, "requires": { - "@jest/transform": "^25.5.1", - "@jest/types": "^25.5.0", - "@types/babel__core": "^7.1.7", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.5.0", + "babel-preset-jest": "^25.1.0", "chalk": "^3.0.0", - "graceful-fs": "^4.2.4", "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } } }, "babel-plugin-dynamic-import-node": { @@ -3160,15 +3029,42 @@ "@types/babel__traverse": "^7.0.6" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.0", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0" + } + }, "babel-plugin-syntax-trailing-function-commas": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" }, "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", + "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -3229,9 +3125,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -3284,9 +3180,9 @@ } }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -3386,6 +3282,18 @@ } } }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -3435,6 +3343,15 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -3461,6 +3378,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "caniuse-lite": { + "version": "1.0.30001223", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001223.tgz", + "integrity": "sha512-k/RYs6zc/fjbxTjaWZemeSmOjO0JJV+KguOBA3NwPup8uzxM1cMhR2BD9XmO86GuqaqTCO8CgkgH9Rz//vdDiA==" + }, "capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", @@ -3524,9 +3446,9 @@ } }, "cli-spinners": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", - "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==" }, "cli-width": { "version": "2.2.1", @@ -3534,23 +3456,26 @@ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" }, "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-regex": "^5.0.0" } } } @@ -3560,6 +3485,16 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3582,12 +3517,12 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" } }, "color-convert": { @@ -3604,9 +3539,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -3618,9 +3553,9 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, "combined-stream": { "version": "1.0.8", @@ -3641,6 +3576,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -3689,11 +3630,15 @@ "typedarray": "^0.0.6" } }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", - "dev": true + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } }, "connect": { "version": "3.7.0", @@ -3706,12 +3651,6 @@ "utils-merge": "1.0.1" } }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -3726,14 +3665,30 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "core-js-compat": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.12.0.tgz", + "integrity": "sha512-vvaN8EOvYBEjrr+MN3vCKrMNc/xdYZI+Rt/uPMROi4T5Hj8Fz6TiPQm2mrB9aZoQVW1lCFHYmMrv99aUct9mkg==", + "requires": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } }, "core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.12.0.tgz", + "integrity": "sha512-j2y084taJU4VMUpwuC93l19tsPbTAtOpg6/do3UOwX4eUJbsFdhEaGRQfTYthn5rDubsB88YITtei0Kw46vEQQ==", "dev": true }, "core-util-is": { @@ -3752,6 +3707,15 @@ "parse-json": "^4.0.0" } }, + "cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "dev": true, + "requires": { + "node-fetch": "2.6.1" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -3795,15 +3759,9 @@ } }, "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==", - "dev": true - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==", "dev": true }, "dashdash": { @@ -3827,9 +3785,9 @@ } }, "dayjs": { - "version": "1.8.33", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.33.tgz", - "integrity": "sha512-881TDLZCdpJFKbraWRHcUG8zfMLLX400ENf9rFZDuWc5zYMss6xifo2PhlDX0ftOmR2NRmaIY47bAa4gKQfXqw==" + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", + "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" }, "debug": { "version": "2.6.9", @@ -3949,6 +3907,12 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3962,9 +3926,9 @@ "dev": true }, "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -3980,14 +3944,14 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" } } }, @@ -4022,6 +3986,12 @@ "domelementtype": "1" } }, + "dottie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4032,15 +4002,40 @@ "safer-buffer": "^2.1.0" } }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "electron-to-chromium": { + "version": "1.3.727", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", + "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==" + }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", @@ -4073,32 +4068,15 @@ "once": "^1.4.0" } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - } - } - }, "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, "envinfo": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.2.tgz", - "integrity": "sha512-k3Eh5bKuQnZjm49/L7H4cHzs2FlL5QjbTB3JrPxoTI8aJG7hVMe4uKyJxSYH4ahseby2waUwk5OaKX/nAsaYgg==" + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==" }, "error-ex": { "version": "1.3.2", @@ -4115,6 +4093,14 @@ } } }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, "errorhandler": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", @@ -4125,22 +4111,27 @@ } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" } }, "es-to-primitive": { @@ -4154,6 +4145,11 @@ "is-symbol": "^1.0.2" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4226,9 +4222,9 @@ } }, "eslint": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", - "integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.2.0.tgz", + "integrity": "sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -4237,11 +4233,10 @@ "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "eslint-scope": "^5.1.0", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.2.0", + "eslint-utils": "^2.0.0", + "eslint-visitor-keys": "^1.2.0", + "espree": "^7.1.0", "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", @@ -4251,11 +4246,12 @@ "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -4269,16 +4265,60 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4291,12 +4331,47 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" } }, "globals": { @@ -4308,16 +4383,79 @@ "type-fest": "^0.8.1" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -4330,11 +4468,24 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "shebang-command": { "version": "2.0.0", @@ -4374,120 +4525,24 @@ "requires": { "isexe": "^2.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, - "eslint-config-airbnb": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz", - "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^14.2.0", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2" - } - }, - "eslint-config-airbnb-base": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", - "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.9", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2" - } - }, "eslint-config-prettier": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", - "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", "dev": true, "requires": { "get-stdin": "^6.0.0" } }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, "eslint-plugin-eslint-comments": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", @@ -4503,56 +4558,16 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true } } }, "eslint-plugin-flowtype": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz", - "integrity": "sha512-z7ULdTxuhlRJcEe1MVljePXricuPOrsWfScRXFhNzVD5dmTHWjIF57AxD0e7AbEoLSbjSsaA5S+hCg43WvpXJQ==", + "version": "2.50.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz", + "integrity": "sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ==", "dev": true, "requires": { - "lodash": "^4.17.15", - "string-natural-compare": "^3.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - } + "lodash": "^4.17.10" } }, "eslint-plugin-jest": { @@ -4561,33 +4576,6 @@ "integrity": "sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg==", "dev": true }, - "eslint-plugin-jsx-a11y": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz", - "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "aria-query": "^4.2.2", - "array-includes": "^3.1.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^3.5.4", - "axobject-query": "^2.1.2", - "damerau-levenshtein": "^1.0.6", - "emoji-regex": "^9.0.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", - "language-tags": "^1.0.5" - }, - "dependencies": { - "emoji-regex": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz", - "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==", - "dev": true - } - } - }, "eslint-plugin-prettier": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", @@ -4598,39 +4586,29 @@ } }, "eslint-plugin-react": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz", - "integrity": "sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", "dev": true, "requires": { "array-includes": "^3.1.1", - "array.prototype.flatmap": "^1.2.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", - "object.entries": "^1.1.2", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", "object.fromentries": "^2.0.2", "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.17.0", - "string.prototype.matchall": "^4.0.2" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - } + "resolve": "^1.15.1", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.2", + "xregexp": "^4.3.0" } }, "eslint-plugin-react-hooks": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.8.tgz", - "integrity": "sha512-6SSb5AiMCPd8FDJrzah+Z4F44P2CdOaK026cXFV+o/xSRzfOiV1FNFeLl2z6xm3yqWOQEZ5OfVgiec90qV2xrQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz", + "integrity": "sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==", "dev": true }, "eslint-plugin-react-native": { @@ -4649,12 +4627,12 @@ "dev": true }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -4674,13 +4652,13 @@ "dev": true }, "espree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", - "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "acorn": "^7.3.1", - "acorn-jsx": "^5.2.0", + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" } }, @@ -4690,9 +4668,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -4707,12 +4685,20 @@ } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -4748,9 +4734,9 @@ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" }, "execa": { "version": "1.0.0", @@ -4865,21 +4851,15 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5186,6 +5166,11 @@ } } }, + "filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -5319,15 +5304,25 @@ "dev": true }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -5363,9 +5358,9 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5376,9 +5371,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -5390,9 +5385,9 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, "growly": { "version": "1.3.0", @@ -5421,20 +5416,25 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-value": { "version": "1.0.0", @@ -5470,6 +5470,14 @@ "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.5.1.tgz", "integrity": "sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg==" }, + "hermes-profile-transformer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", + "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "requires": { + "source-map": "^0.7.3" + } + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -5479,9 +5487,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "html-encoding-sniffer": { @@ -5494,9 +5502,9 @@ } }, "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" }, "html-escaper": { "version": "2.0.2", @@ -5572,14 +5580,14 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, "image-size": { @@ -5625,7 +5633,8 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "inflight": { "version": "1.0.6", @@ -5641,6 +5650,12 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", @@ -5695,6 +5710,15 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -5714,14 +5738,14 @@ } }, "internal-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", - "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, "requires": { - "es-abstract": "^1.17.0-next.1", + "get-intrinsic": "^1.1.0", "has": "^1.0.3", - "side-channel": "^1.0.2" + "side-channel": "^1.0.4" } }, "invariant": { @@ -5732,6 +5756,11 @@ "loose-envify": "^1.0.0" } }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -5761,15 +5790,30 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, "is-ci": { @@ -5780,6 +5824,14 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", + "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -5799,9 +5851,9 @@ } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.3.tgz", + "integrity": "sha512-tDpEUInNcy2Yw3lNSepK3Wdw1RnXLcIVienz6Ou631Acl15cJyRWK4dgA1vCmOEgIbtOV0W7MHg+AR2Gdg1NXQ==", "dev": true }, "is-descriptor": { @@ -5827,9 +5879,9 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "optional": true }, @@ -5864,6 +5916,12 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -5882,6 +5940,12 @@ } } }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -5896,11 +5960,12 @@ } }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "dev": true, "requires": { + "call-bind": "^1.0.2", "has-symbols": "^1.0.1" } }, @@ -6033,14 +6098,20 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6060,14 +6131,14 @@ } }, "jest": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.5.4.tgz", - "integrity": "sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", + "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", "dev": true, "requires": { - "@jest/core": "^25.5.4", + "@jest/core": "^25.1.0", "import-local": "^3.0.2", - "jest-cli": "^25.5.4" + "jest-cli": "^25.1.0" }, "dependencies": { "@jest/console": { @@ -6095,6 +6166,12 @@ "collect-v8-coverage": "^1.0.0" } }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -6104,23 +6181,6 @@ "fill-range": "^7.0.1" } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6130,12 +6190,6 @@ "to-regex-range": "^5.0.1" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6223,13 +6277,13 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "pretty-format": { @@ -6244,32 +6298,6 @@ "react-is": "^16.12.0" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6278,46 +6306,6 @@ "requires": { "is-number": "^7.0.0" } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -6477,6 +6465,28 @@ "realpath-native": "^2.0.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "babel-jest": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", + "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", + "dev": true, + "requires": { + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -6550,13 +6560,13 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "pretty-format": { @@ -6594,6 +6604,12 @@ "pretty-format": "^25.5.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "jest-get-type": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", @@ -6636,6 +6652,12 @@ "pretty-format": "^25.5.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "jest-get-type": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", @@ -6777,21 +6799,15 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6902,21 +6918,15 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6951,9 +6961,9 @@ } }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -7103,6 +7113,16 @@ } } }, + "jest-fetch-mock": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", + "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", + "dev": true, + "requires": { + "cross-fetch": "^3.0.4", + "promise-polyfill": "^8.1.3" + } + }, "jest-get-type": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", @@ -7138,9 +7158,9 @@ } }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } @@ -7208,6 +7228,12 @@ "collect-v8-coverage": "^1.0.0" } }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -7277,13 +7303,13 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "pretty-format": { @@ -7298,12 +7324,6 @@ "react-is": "^16.12.0" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7337,6 +7357,12 @@ "pretty-format": "^25.5.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "jest-get-type": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", @@ -7369,6 +7395,12 @@ "pretty-format": "^25.5.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "jest-get-type": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", @@ -7415,9 +7447,9 @@ } }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } @@ -7450,6 +7482,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -7479,9 +7516,9 @@ } }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } @@ -7515,63 +7552,6 @@ "realpath-native": "^2.0.0", "resolve": "^1.17.0", "slash": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", - "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } } }, "jest-resolve-dependencies": { @@ -7638,9 +7618,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -7666,9 +7646,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -7763,13 +7743,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -7778,12 +7758,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -7880,10 +7854,16 @@ "collect-v8-coverage": "^1.0.0" } }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -7905,23 +7885,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -7932,18 +7895,12 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -8064,13 +8021,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -8091,44 +8048,12 @@ "react-is": "^16.12.0" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8146,46 +8071,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -8217,6 +8102,12 @@ "semver": "^6.3.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -8273,13 +8164,13 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "pretty-format": { @@ -8294,12 +8185,6 @@ "react-is": "^16.12.0" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8341,9 +8226,9 @@ } }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } @@ -8381,6 +8266,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8420,9 +8310,9 @@ } }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } @@ -8505,12 +8395,12 @@ } }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, "braces": { @@ -8576,21 +8466,15 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8601,9 +8485,9 @@ } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } @@ -8638,9 +8522,30 @@ } }, "jetifier": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", - "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==" + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.8.tgz", + "integrity": "sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw==" + }, + "js-beautify": { + "version": "1.13.13", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.13.tgz", + "integrity": "sha512-oH+nc0U5mOAqX8M5JO1J0Pw/7Q35sAdOsM5W3i87pir9Ntx6P/5Gx1xLNoK+MGyvHk4rqqRCE4Oq58H6xl2W7A==", + "dev": true, + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "^1.0.4", + "nopt": "^5.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } }, "js-tokens": { "version": "4.0.0", @@ -8648,9 +8553,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -8702,9 +8607,9 @@ }, "dependencies": { "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", "dev": true } } @@ -8719,6 +8624,12 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -8752,9 +8663,9 @@ "dev": true }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "requires": { "minimist": "^1.2.5" } @@ -8813,21 +8724,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "language-subtag-registry": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", - "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==", - "dev": true - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "dev": true, - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -8849,35 +8745,6 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -8887,15 +8754,26 @@ } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, "lodash.frompairs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz", @@ -8949,6 +8827,12 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -9003,83 +8887,6 @@ "ansi-fragments": "^0.2.1", "dayjs": "^1.8.15", "yargs": "^15.1.0" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } } }, "lolex": { @@ -9154,9 +8961,9 @@ } }, "metro": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.58.0.tgz", - "integrity": "sha512-yi/REXX+/s4r7RjzXht+E+qE6nzvFIrEXO5Q61h+70Q7RODMU8EnlpXx04JYk7DevHuMhFaX+NWhCtRINzR4zA==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.59.0.tgz", + "integrity": "sha512-OpVgYXyuTvouusFZQJ/UYKEbwfLmialrSCUUTGTFaBor6UMUHZgXPYtK86LzesgMqRc8aiuTQVO78iKW2Iz3wg==", "requires": { "@babel/code-frame": "^7.0.0", "@babel/core": "^7.0.0", @@ -9176,28 +8983,29 @@ "connect": "^3.6.5", "debug": "^2.2.0", "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", "eventemitter3": "^3.0.0", "fbjs": "^1.0.0", "fs-extra": "^1.0.0", "graceful-fs": "^4.1.3", "image-size": "^0.6.0", "invariant": "^2.2.4", - "jest-haste-map": "^24.7.1", - "jest-worker": "^24.6.0", + "jest-haste-map": "^24.9.0", + "jest-worker": "^24.9.0", "json-stable-stringify": "^1.0.1", "lodash.throttle": "^4.1.1", "merge-stream": "^1.0.1", - "metro-babel-register": "0.58.0", - "metro-babel-transformer": "0.58.0", - "metro-cache": "0.58.0", - "metro-config": "0.58.0", - "metro-core": "0.58.0", - "metro-inspector-proxy": "0.58.0", - "metro-minify-uglify": "0.58.0", - "metro-react-native-babel-preset": "0.58.0", - "metro-resolver": "0.58.0", - "metro-source-map": "0.58.0", - "metro-symbolicate": "0.58.0", + "metro-babel-register": "0.59.0", + "metro-babel-transformer": "0.59.0", + "metro-cache": "0.59.0", + "metro-config": "0.59.0", + "metro-core": "0.59.0", + "metro-inspector-proxy": "0.59.0", + "metro-minify-uglify": "0.59.0", + "metro-react-native-babel-preset": "0.59.0", + "metro-resolver": "0.59.0", + "metro-source-map": "0.59.0", + "metro-symbolicate": "0.59.0", "mime-types": "2.1.11", "mkdirp": "^0.5.1", "node-fetch": "^2.2.0", @@ -9210,7 +9018,6 @@ "temp": "0.8.3", "throat": "^4.1.0", "wordwrap": "^1.0.0", - "write-file-atomic": "^1.2.0", "ws": "^1.1.5", "xpipe": "^1.0.5", "yargs": "^14.2.0" @@ -9239,11 +9046,49 @@ "supports-color": "^5.3.0" } }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, "fs-extra": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", @@ -9267,79 +9112,13 @@ "graceful-fs": "^4.1.6" } }, - "metro-babel-register": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.58.0.tgz", - "integrity": "sha512-P5+G3ufhSYL6cA3a7xkbSJzzFBvtivj/PhWvGXFXnuFssDlMAX1CTktff+0gpka5Cd6B6QLt0UAMWulUAAE4Eg==", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/register": "^7.0.0", - "core-js": "^2.2.2", - "escape-string-regexp": "^1.0.5" - } - }, - "metro-react-native-babel-preset": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.58.0.tgz", - "integrity": "sha512-MRriNW+fF6jxABsgPphocUY6mIhmCm8idcrQZ58fT3Iti2vCdtkaK32TyCGUNUptzhUe2/cbE57j4aC+eaodAA==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "react-refresh": "^0.4.0" - } - }, - "metro-source-map": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", - "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.58.0", - "ob1": "0.58.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "mime-db": { @@ -9355,6 +9134,49 @@ "mime-db": "~1.23.0" } }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -9370,6 +9192,58 @@ "requires": { "has-flag": "^3.0.0" } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -9396,81 +9270,165 @@ } }, "metro-babel-transformer": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.58.0.tgz", - "integrity": "sha512-yBX3BkRhw2TCNPhe+pmLSgsAEA3huMvnX08UwjFqSXXI1aiqzRQobn92uKd1U5MM1Vx8EtXVomlJb95ZHNAv6A==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz", + "integrity": "sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w==", "requires": { "@babel/core": "^7.0.0", - "metro-source-map": "0.58.0" - }, - "dependencies": { - "metro-source-map": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", - "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.58.0", - "ob1": "0.58.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - } + "metro-source-map": "0.59.0" } }, "metro-cache": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.58.0.tgz", - "integrity": "sha512-jjW9zCTKxhgKcVkyQ6LHyna9Zdf4TK/45vvT1fPyyTk1RY82ZYjU1qs+84ycKEd08Ka4YcK9xcUew9SIDJYI8Q==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.59.0.tgz", + "integrity": "sha512-ryWNkSnpyADfRpHGb8BRhQ3+k8bdT/bsxMH2O0ntlZYZ188d8nnYWmxbRvFmEzToJxe/ol4uDw0tJFAaQsN8KA==", "requires": { - "jest-serializer": "^24.4.0", - "metro-core": "0.58.0", + "jest-serializer": "^24.9.0", + "metro-core": "0.59.0", "mkdirp": "^0.5.1", "rimraf": "^2.5.4" } }, "metro-config": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.58.0.tgz", - "integrity": "sha512-4vgBliXwL56vjUlYplvGMVSNrJJpkHuLcD+O20trV3FvPxKg4ZsvuOcNSxqDSMU26FCtIEJ15ojcuCbRL7KY0w==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.59.0.tgz", + "integrity": "sha512-MDsknFG9vZ4Nb5VR6OUDmGHaWz6oZg/FtE3up1zVBKPVRTXE1Z+k7zypnPtMXjMh3WHs/Sy4+wU1xnceE/zdnA==", "requires": { "cosmiconfig": "^5.0.5", - "jest-validate": "^24.7.0", - "metro": "0.58.0", - "metro-cache": "0.58.0", - "metro-core": "0.58.0", - "pretty-format": "^24.7.0" + "jest-validate": "^24.9.0", + "metro": "0.59.0", + "metro-cache": "0.59.0", + "metro-core": "0.59.0" } }, "metro-core": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.58.0.tgz", - "integrity": "sha512-RzXUjGFmCLOyzUqcKDvr91AldGtIOxnzNZrWUIiG8uC3kerVLo0mQp4YH3+XVm6fMNiLMg6iER7HLqD+MbpUjQ==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.59.0.tgz", + "integrity": "sha512-kb5LKvV5r2pqMEzGyTid8ai2mIjW13NMduQ8oBmfha7/EPTATcTQ//s+bkhAs1toQD8vqVvjAb0cPNjWQEmcmQ==", "requires": { - "jest-haste-map": "^24.7.1", + "jest-haste-map": "^24.9.0", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.58.0", + "metro-resolver": "0.59.0", "wordwrap": "^1.0.0" } }, "metro-inspector-proxy": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.58.0.tgz", - "integrity": "sha512-oFqTyNTJdCdvcw1Ha6SKE7ITbSaoTbO4xpYownIoJR+WZ0ZfxbWpp225JkHuBJm9UcBAnG9c0CME924m3uBbaw==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz", + "integrity": "sha512-hPeAuQcofTOH0F+2GEZqWkvkVY1/skezSSlMocDQDaqds+Kw6JgdA7FlZXxnKmQ/jYrWUzff/pl8SUCDwuYthQ==", "requires": { "connect": "^3.6.5", "debug": "^2.2.0", - "rxjs": "^5.4.3", "ws": "^1.1.5", "yargs": "^14.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "metro-minify-uglify": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.58.0.tgz", - "integrity": "sha512-vRHsA7bCi7eCn3LXLm20EfY2NoWDyYOnmWaq/N8LB0OxL2L5DXRqMYAQK+prWGJ5S1yvVnDuuNVP+peQ9851TA==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz", + "integrity": "sha512-7IzVgCVWZMymgZ/quieg/9v5EQ8QmZWAgDc86Zp9j0Vy6tQTjUn6jlU+YAKW3mfMEjMr6iIUzCD8YklX78tFAw==", "requires": { "uglify-es": "^3.1.9" } @@ -9530,23 +9488,12 @@ "metro-babel-transformer": "0.59.0", "metro-react-native-babel-preset": "0.59.0", "metro-source-map": "0.59.0" - }, - "dependencies": { - "metro-babel-transformer": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz", - "integrity": "sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w==", - "requires": { - "@babel/core": "^7.0.0", - "metro-source-map": "0.59.0" - } - } } }, "metro-resolver": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.58.0.tgz", - "integrity": "sha512-XFbAKvCHN2iWqKeiRARzEXn69eTDdJVJC7lu16S4dPQJ+Dy82dZBr5Es12iN+NmbJuFgrAuIHbpWrdnA9tOf6Q==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.59.0.tgz", + "integrity": "sha512-lbgiumnwoVosffEI96z0FGuq1ejTorHAj3QYUPmp5dFMfitRxLP7Wm/WP9l4ZZjIptxTExsJwuEff1SLRCPD9w==", "requires": { "absolute-path": "^0.0.0" } @@ -9565,50 +9512,29 @@ "vlq": "^1.0.0" }, "dependencies": { - "metro-symbolicate": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz", - "integrity": "sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw==", - "requires": { - "invariant": "^2.2.4", - "metro-source-map": "0.59.0", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - } - }, - "ob1": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.59.0.tgz", - "integrity": "sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ==" + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, "metro-symbolicate": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.58.0.tgz", - "integrity": "sha512-uIVxUQC1E26qOMj13dKROhwAa2FmZk5eR0NcBqej/aXmQhpr8LjJg2sondkoLKUp827Tf/Fm9+pS4icb5XiqCw==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz", + "integrity": "sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw==", "requires": { "invariant": "^2.2.4", - "metro-source-map": "0.58.0", + "metro-source-map": "0.59.0", "source-map": "^0.5.6", "through2": "^2.0.1", "vlq": "^1.0.0" }, "dependencies": { - "metro-source-map": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", - "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.58.0", - "ob1": "0.58.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -9638,16 +9564,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "requires": { - "mime-db": "1.44.0" + "mime-db": "1.47.0" } }, "mimic-fn": { @@ -9696,9 +9622,9 @@ } }, "moment": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.28.0.tgz", - "integrity": "sha512-Z5KOjYmnHyd/ukynmFd/WwyXHd7L4J9vTI/nn5Ap9AVUgaAE15VvQ9MOGmJJygEUklupqIrFnor/tjTwRU+tQw==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "ms": { "version": "2.1.1", @@ -9711,15 +9637,15 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", "optional": true }, "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==" + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==" }, "nanomatch": { "version": "1.2.13", @@ -9755,6 +9681,11 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, + "nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" + }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -9796,10 +9727,24 @@ } } }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + }, "node-stream-zip": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.11.2.tgz", - "integrity": "sha512-cowCX+OyzS3tN2i4BMMFxCr/pE6cQlEMTbVCugmos0TNEJQNtcG04tR41CY8lumO1I7F5GFiLaU4WavomJthaA==" + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.4.tgz", + "integrity": "sha512-M2nPvnSWFFH+fgLIRZDqmhshmuzXcr+ce9BsHQX/30pXR+cEz/USMYmx9ZAFYy837W2QoDoNzhFtbZhfzaMk9A==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } }, "normalize-package-data": { "version": "2.5.0", @@ -9855,9 +9800,9 @@ "dev": true }, "ob1": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.58.0.tgz", - "integrity": "sha512-uZP44cbowAfHafP1k4skpWItk5iHCoRevMfrnUvYCfyNNPPJd3rfDCyj0exklWi2gDXvjlj2ObsfiqP/bs/J7Q==" + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.59.0.tgz", + "integrity": "sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ==" }, "object-assign": { "version": "4.1.1", @@ -9893,9 +9838,9 @@ } }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", "dev": true }, "object-keys": { @@ -9912,36 +9857,37 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", - "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" } }, "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.2", "has": "^1.0.3" } }, @@ -9954,14 +9900,14 @@ } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.2", "has": "^1.0.3" } }, @@ -10078,9 +10024,9 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, "p-finally": { @@ -10104,6 +10050,22 @@ "p-limit": "^2.2.0" } }, + "p-reflect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", + "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==", + "dev": true + }, + "p-settle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-3.1.0.tgz", + "integrity": "sha512-gkN3UDlyofG81IRhxLnonSIi8BBrwcPlKMJS6tcJRubofyekqQPMdB5LXPrmCkeu/m/YKx5PzkUVQLezda5/JQ==", + "dev": true, + "requires": { + "p-limit": "^2.2.0", + "p-reflect": "^2.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -10176,22 +10138,11 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } + "pbxproj-dom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pbxproj-dom/-/pbxproj-dom-1.2.0.tgz", + "integrity": "sha512-K2czrWqA68AR0q1UXz5EBi/zoxcljrkO4RSJX0jPnVn3iyE0HYnYOzaEEDYMpueczkT/Vtdm3SCc3NM+12kMaQ==", + "dev": true }, "performance-now": { "version": "2.1.0", @@ -10200,9 +10151,9 @@ "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", "dev": true }, "pify": { @@ -10259,13 +10210,13 @@ } }, "plist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", - "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", + "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", "requires": { - "base64-js": "^1.2.3", + "base64-js": "^1.5.1", "xmlbuilder": "^9.0.7", - "xmldom": "0.1.x" + "xmldom": "^0.5.0" } }, "plugin-error": { @@ -10363,18 +10314,13 @@ } }, "@types/yargs": { - "version": "13.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", - "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", "requires": { "@types/yargs-parser": "*" } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -10404,14 +10350,20 @@ "asap": "~2.0.6" } }, + "promise-polyfill": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", + "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==", + "dev": true + }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" } }, "prop-types": { @@ -10424,6 +10376,12 @@ "react-is": "^16.8.1" } }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -10457,11 +10415,12 @@ "dev": true }, "query-string": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.2.tgz", - "integrity": "sha512-BMmDaUiLDFU1hlM38jTFcRt7HYiGP/zt1sRzrIWm5zpeEuO1rkbPS0ELI3uehoLuuhHDCS8u8lhFN3fEN4JzPQ==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", + "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", "requires": { "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" } @@ -10482,18 +10441,18 @@ } }, "react-devtools-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.8.2.tgz", - "integrity": "sha512-3Lv3nI8FPAwKqUco35oOlgf+4j8mgYNnIcDv2QTfxEqg2G69q17ZJ8ScU9aBnymS28YC1OW+kTxLmdIQeTN8yg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.13.1.tgz", + "integrity": "sha512-+N7vZgjQWqkPe/q7yltXOi20U3Zy4WdXax9IcLCNB4nWsUxLrkVF0Mqbsr3h4m/j0dA4046QpJOnlwdWVQuiFw==", "requires": { "shell-quote": "^1.6.1", "ws": "^7" }, "dependencies": { "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==" } } }, @@ -10537,14 +10496,15 @@ }, "dependencies": { "@react-native-community/cli": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-4.12.0.tgz", - "integrity": "sha512-zIrKxgHsQ5EUGjZ+oIW54+qY2XqVwDJbGV3hzsVsCFXleos2QUAQWskR0BG9zf06P1HT8kfwuDuHs/p1Ywe0rg==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-4.14.0.tgz", + "integrity": "sha512-EYJKBuxFxAu/iwNUfwDq41FjORpvSh1wvQ3qsHjzcR5uaGlWEOJrd3uNJDuKBAS0TVvbEesLF9NEXipjyRVr4Q==", "requires": { "@hapi/joi": "^15.0.3", - "@react-native-community/cli-debugger-ui": "^4.9.0", - "@react-native-community/cli-server-api": "^4.11.0", - "@react-native-community/cli-tools": "^4.11.0", + "@react-native-community/cli-debugger-ui": "^4.13.1", + "@react-native-community/cli-hermes": "^4.13.0", + "@react-native-community/cli-server-api": "^4.13.1", + "@react-native-community/cli-tools": "^4.13.0", "@react-native-community/cli-types": "^4.10.1", "chalk": "^3.0.0", "command-exists": "^1.2.8", @@ -10560,11 +10520,11 @@ "inquirer": "^3.0.6", "leven": "^3.1.0", "lodash": "^4.17.15", - "metro": "^0.58.0", - "metro-config": "^0.58.0", - "metro-core": "^0.58.0", - "metro-react-native-babel-transformer": "^0.58.0", - "metro-resolver": "^0.58.0", + "metro": "^0.59.0", + "metro-config": "^0.59.0", + "metro-core": "^0.59.0", + "metro-react-native-babel-transformer": "^0.59.0", + "metro-resolver": "^0.59.0", "minimist": "^1.2.0", "mkdirp": "^0.5.1", "node-stream-zip": "^1.9.1", @@ -10577,32 +10537,6 @@ "wcwidth": "^1.0.1" }, "dependencies": { - "metro-react-native-babel-transformer": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.58.0.tgz", - "integrity": "sha512-3A73+cRq1eUPQ8g+hPNGgMUMCGmtQjwqHfoG1DwinAoJ/kr4WOXWWbGZo0xHJNBe/zdHGl0uHcDCp2knPglTdQ==", - "requires": { - "@babel/core": "^7.0.0", - "babel-preset-fbjs": "^3.3.0", - "metro-babel-transformer": "0.58.0", - "metro-react-native-babel-preset": "0.58.0", - "metro-source-map": "0.58.0" - } - }, - "metro-source-map": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", - "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.58.0", - "ob1": "0.58.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - }, "pretty-format": { "version": "25.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", @@ -10616,47 +10550,10 @@ } } }, - "metro-react-native-babel-preset": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.58.0.tgz", - "integrity": "sha512-MRriNW+fF6jxABsgPphocUY6mIhmCm8idcrQZ58fT3Iti2vCdtkaK32TyCGUNUptzhUe2/cbE57j4aC+eaodAA==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "react-refresh": "^0.4.0" - } + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" } } }, @@ -10746,9 +10643,9 @@ } }, "react-native-iphone-x-helper": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.1.tgz", - "integrity": "sha512-/VbpIEp8tSNNHIvstuA3Swx610whci1Zpc9mqNkqn14DkMbw+ORviln2u0XyHG1kPvvwTNGZY6QpeFwxYaSdbQ==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz", + "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==" }, "react-native-keychain": { "version": "4.0.5", @@ -10865,82 +10762,64 @@ "lodash.template": "^4.5.0", "prop-types": "^15.7.2", "yargs": "^15.0.2" + } + }, + "react-native-version": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/react-native-version/-/react-native-version-4.0.0.tgz", + "integrity": "sha512-OMoSbeDcrE5JnmeilkZXYsXnk98/I2hZe/z68NZ+nel3LkixJIOh1AnAxsqW1Cq20Nmyz3bV4PpEYxilKAy9xg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "commander": "^4.0.0", + "common-tags": "^1.4.0", + "detect-indent": "^6.0.0", + "dottie": "^2.0.0", + "js-beautify": "^1.7.4", + "lodash.flattendeep": "^4.4.0", + "lodash.uniq": "^4.5.0", + "p-settle": "^3.0.0", + "pbxproj-dom": "^1.0.11", + "plist": "^3.0.1", + "resolve-from": "^5.0.0", + "semver": "^7.0.0" }, "dependencies": { - "cliui": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "yallist": "^4.0.0" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "lru-cache": "^6.0.0" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -10995,73 +10874,52 @@ } }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } @@ -11087,9 +10945,9 @@ "dev": true }, "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "8.2.0", @@ -11122,13 +10980,13 @@ } }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "regexpp": { @@ -11138,9 +10996,9 @@ "dev": true }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", @@ -11156,9 +11014,9 @@ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "requires": { "jsesc": "~0.5.0" }, @@ -11176,9 +11034,9 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" }, "repeat-string": { "version": "1.6.1", @@ -11268,10 +11126,11 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -11348,11 +11207,12 @@ } }, "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, "requires": { - "symbol-observable": "1.0.1" + "tslib": "^1.9.0" } }, "safe-buffer": { @@ -11489,6 +11349,14 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -11521,24 +11389,31 @@ "optional": true }, "side-channel": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", - "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { - "es-abstract": "^1.17.0-next.1", - "object-inspect": "^1.7.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-plist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.0.tgz", - "integrity": "sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", + "integrity": "sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg==", "requires": { "bplist-creator": "0.0.8", "bplist-parser": "0.2.0", @@ -11560,9 +11435,9 @@ "dev": true }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { "version": "2.1.0", @@ -11584,11 +11459,6 @@ } } }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -11619,6 +11489,11 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -11687,9 +11562,9 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" }, "source-map-resolve": { "version": "0.5.3", @@ -11720,9 +11595,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" }, "spdx-correct": { "version": "3.1.1", @@ -11751,9 +11626,9 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "split-on-first": { @@ -11792,9 +11667,24 @@ } }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" }, "stacktrace-parser": { "version": "0.1.10", @@ -11854,68 +11744,69 @@ "strip-ansi": "^5.2.0" } }, - "string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "dev": true - }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" } } } }, "string.prototype.matchall": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", - "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz", + "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", + "es-abstract": "^1.18.0-next.2", "has-symbols": "^1.0.1", - "internal-slot": "^1.0.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.2" + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "string_decoder": { @@ -11932,19 +11823,12 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "strip-eof": { @@ -11970,28 +11854,23 @@ "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dev": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -12010,6 +11889,12 @@ "string-width": "^3.0.0" }, "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -12050,18 +11935,18 @@ }, "dependencies": { "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } @@ -12188,38 +12073,15 @@ "punycode": "^2.1.0" } }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -12275,15 +12137,15 @@ } }, "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" }, "uglify-es": { "version": "3.3.9", @@ -12311,6 +12173,18 @@ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -12393,9 +12267,9 @@ } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -12412,9 +12286,9 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "use-subscription": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.4.1.tgz", - "integrity": "sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", + "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", "requires": { "object-assign": "^4.1.1" } @@ -12435,9 +12309,9 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "v8-to-istanbul": { @@ -12449,14 +12323,6 @@ "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "validate-npm-package-license": { @@ -12542,9 +12408,9 @@ } }, "whatwg-fetch": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.0.tgz", - "integrity": "sha512-rsum2ulz2iuZH08mJkT0Yi6JnKhwdw4oeyMjokgxd+mmqYSd9cPpOQf01TIWgjxG/U4+QR+AwKq6lSbXVxkyoQ==" + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" }, "whatwg-mimetype": { "version": "2.3.0", @@ -12571,6 +12437,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -12588,31 +12467,26 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-regex": "^5.0.0" } } } @@ -12632,13 +12506,15 @@ } }, "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { @@ -12690,9 +12566,9 @@ } }, "xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", + "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==" }, "xpipe": { "version": "1.0.5", @@ -12700,12 +12576,12 @@ "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=" }, "xregexp": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", - "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.4.1.tgz", + "integrity": "sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==", "dev": true, "requires": { - "@babel/runtime-corejs3": "^7.8.3" + "@babel/runtime-corejs3": "^7.12.1" } }, "xtend": { @@ -12714,9 +12590,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { "version": "2.1.2", @@ -12724,69 +12600,27 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "requires": { - "cliui": "^5.0.0", + "cliui": "^6.0.0", "decamelize": "^1.2.0", - "find-up": "^3.0.0", + "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } + "yargs-parser": "^18.1.2" } }, "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/package.json b/package.json index 8e6bc4d..16a762f 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,113 @@ "version": "4.1.0", "private": true, "scripts": { - "start": "react-native start", "android": "react-native run-android", "android-release": "react-native run-android --variant=release", "ios": "react-native run-ios", + "start": "react-native start", + "start-no-cache": "react-native start --reset-cache", "test": "jest", - "lint": "eslint . --ext .js,.jsx,.ts,.tsx" + "typescript": "tsc --noEmit", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx", + "lint-fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix", + "full-check": "npm run typescript && npm run lint && npm run test", + "pod": "cd ios && pod install && cd ..", + "bundle": "npm run full-check && cd android && ./gradlew bundleRelease", + "postversion": "react-native-version" + }, + "dependencies": { + "@nartc/react-native-barcode-mask": "1.2.0", + "@react-native-community/async-storage": "1.12.0", + "@react-native-community/masked-view": "0.1.10", + "@react-native-community/push-notification-ios": "1.5.0", + "@react-native-community/slider": "3.0.3", + "@react-navigation/bottom-tabs": "5.8.0", + "@react-navigation/native": "5.7.3", + "@react-navigation/stack": "5.9.0", + "i18n-js": "3.7.1", + "react": "16.13.1", + "react-native": "0.63.2", + "react-native-animatable": "1.3.3", + "react-native-app-intro-slider": "4.0.4", + "react-native-appearance": "0.3.4", + "react-native-autolink": "3.0.0", + "react-native-calendars": "1.403.0", + "react-native-camera": "3.40.0", + "react-native-collapsible": "1.5.3", + "react-native-gesture-handler": "1.8.0", + "react-native-image-zoom-viewer": "3.0.1", + "react-native-keychain": "4.0.5", + "react-native-linear-gradient": "2.5.6", + "react-native-localize": "1.4.1", + "react-native-modalize": "2.0.6", + "react-native-paper": "4.2.0", + "react-native-permissions": "2.2.1", + "react-native-push-notification": "5.1.1", + "react-native-reanimated": "1.13.0", + "react-native-render-html": "4.2.3", + "react-native-safe-area-context": "3.1.8", + "react-native-screens": "2.11.0", + "react-native-splash-screen": "3.2.0", + "react-native-vector-icons": "7.1.0", + "react-native-webview": "10.9.0", + "react-navigation-collapsible": "5.6.4", + "react-navigation-header-buttons": "5.0.2" + }, + "devDependencies": { + "@babel/core": "7.11.0", + "@babel/runtime": "7.11.0", + "@react-native-community/eslint-config": "1.1.0", + "@types/i18n-js": "3.0.3", + "@types/jest": "25.2.3", + "@types/react-native": "0.63.2", + "@types/react-native-calendars": "1.20.10", + "@types/react-native-vector-icons": "6.4.6", + "@types/react-test-renderer": "16.9.2", + "@typescript-eslint/eslint-plugin": "2.27.0", + "@typescript-eslint/parser": "2.27.0", + "babel-jest": "25.1.0", + "eslint": "7.2.0", + "jest": "25.1.0", + "jest-extended": "0.11.5", + "jest-fetch-mock": "3.0.3", + "metro-react-native-babel-preset": "0.59.0", + "prettier": "2.0.5", + "react-native-version": "4.0.0", + "react-test-renderer": "16.13.1", + "typescript": "3.8.3" + }, + "eslintConfig": { + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "@react-native-community", + "prettier" + ], + "rules": { + "prettier/prettier": [ + "error", + { + "quoteProps": "consistent", + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false + } + ] + } + }, + "eslintIgnore": [ + "node_modules/" + ], + "prettier": { + "quoteProps": "consistent", + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false }, "jest": { "preset": "react-native", @@ -23,71 +124,5 @@ "setupFilesAfterEnv": [ "jest-extended" ] - }, - "dependencies": { - "@nartc/react-native-barcode-mask": "^1.2.0", - "@react-native-community/async-storage": "^1.12.0", - "@react-native-community/masked-view": "^0.1.10", - "@react-native-community/push-notification-ios": "^1.5.0", - "@react-native-community/slider": "^3.0.3", - "@react-navigation/bottom-tabs": "^5.8.0", - "@react-navigation/native": "^5.7.3", - "@react-navigation/stack": "^5.9.0", - "i18n-js": "^3.7.1", - "react": "16.13.1", - "react-native": "0.63.2", - "react-native-animatable": "^1.3.3", - "react-native-app-intro-slider": "^4.0.4", - "react-native-appearance": "^0.3.4", - "react-native-autolink": "^3.0.0", - "react-native-calendars": "^1.403.0", - "react-native-camera": "^3.40.0", - "react-native-collapsible": "^1.5.3", - "react-native-gesture-handler": "^1.8.0", - "react-native-image-zoom-viewer": "^3.0.1", - "react-native-keychain": "4.0.5", - "react-native-linear-gradient": "^2.5.6", - "react-native-localize": "^1.4.1", - "react-native-modalize": "^2.0.6", - "react-native-paper": "^4.2.0", - "react-native-permissions": "^2.2.1", - "react-native-push-notification": "^5.1.1", - "react-native-reanimated": "^1.13.0", - "react-native-render-html": "^4.2.3", - "react-native-safe-area-context": "^3.1.8", - "react-native-screens": "^2.11.0", - "react-native-splash-screen": "^3.2.0", - "react-native-vector-icons": "^7.1.0", - "react-native-webview": "^10.9.0", - "react-navigation-collapsible": "^5.6.4", - "react-navigation-header-buttons": "^5.0.2" - }, - "devDependencies": { - "@babel/core": "^7.11.0", - "@babel/runtime": "^7.11.0", - "@react-native-community/eslint-config": "^1.1.0", - "@types/i18n-js": "^3.0.3", - "@types/jest": "^25.2.3", - "@types/react-native": "^0.63.2", - "@types/react-native-calendars": "^1.20.10", - "@types/react-native-vector-icons": "^6.4.6", - "@types/react-test-renderer": "^16.9.2", - "@typescript-eslint/eslint-plugin": "^2.27.0", - "@typescript-eslint/parser": "^2.27.0", - "babel-jest": "^25.1.0", - "eslint": "^7.2.0", - "eslint-config-airbnb": "^18.2.0", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-flowtype": "^5.2.0", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.20.5", - "eslint-plugin-react-hooks": "^4.0.0", - "jest": "^25.1.0", - "jest-extended": "^0.11.5", - "metro-react-native-babel-preset": "^0.59.0", - "prettier": "2.0.5", - "react-test-renderer": "16.13.1", - "typescript": "^3.8.3" } } diff --git a/src/components/Amicale/AuthenticatedScreen.tsx b/src/components/Amicale/AuthenticatedScreen.tsx index 68aa704..6683b80 100644 --- a/src/components/Amicale/AuthenticatedScreen.tsx +++ b/src/components/Amicale/AuthenticatedScreen.tsx @@ -18,9 +18,9 @@ */ import * as React from 'react'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { StackNavigationProp } from '@react-navigation/stack'; import ConnectionManager from '../../managers/ConnectionManager'; -import {ERROR_TYPE} from '../../utils/WebData'; +import { ERROR_TYPE } from '../../utils/WebData'; import ErrorView from '../Screens/ErrorView'; import BasicLoadingScreen from '../Screens/BasicLoadingScreen'; @@ -90,7 +90,7 @@ class AuthenticatedScreen extends React.Component, StateType> { * @param error The error code received */ onRequestFinished(data: T | null, index: number, error?: number) { - const {props} = this; + const { props } = this; if (index >= 0 && index < props.requests.length) { this.fetchedData[index] = data; this.errors[index] = error != null ? error : ERROR_TYPE.SUCCESS; @@ -101,7 +101,7 @@ class AuthenticatedScreen extends React.Component, StateType> { } if (this.allRequestsFinished()) { - this.setState({loading: false}); + this.setState({ loading: false }); } } @@ -113,7 +113,7 @@ class AuthenticatedScreen extends React.Component, StateType> { * @return {number} The error code or ERROR_TYPE.SUCCESS if no error was found */ getError(): number { - const {props} = this; + const { props } = this; for (let i = 0; i < this.errors.length; i += 1) { if ( this.errors[i] !== ERROR_TYPE.SUCCESS && @@ -131,7 +131,7 @@ class AuthenticatedScreen extends React.Component, StateType> { * @return {*} */ getErrorRender() { - const {props} = this; + const { props } = this; const errorCode = this.getError(); let shouldOverride = false; let override = null; @@ -166,9 +166,9 @@ class AuthenticatedScreen extends React.Component, StateType> { * If the user is logged in, send all requests. */ fetchData = () => { - const {state, props} = this; + const { state, props } = this; if (!state.loading) { - this.setState({loading: true}); + this.setState({ loading: true }); } if (this.connectionManager.isLoggedIn()) { @@ -176,11 +176,11 @@ class AuthenticatedScreen extends React.Component, StateType> { this.connectionManager .authenticatedRequest( props.requests[i].link, - props.requests[i].params, + props.requests[i].params ) .then((response: T): void => this.onRequestFinished(response, i)) .catch((error: number): void => - this.onRequestFinished(null, i, error), + this.onRequestFinished(null, i, error) ); } } else { @@ -213,7 +213,7 @@ class AuthenticatedScreen extends React.Component, StateType> { } render() { - const {state, props} = this; + const { state, props } = this; if (state.loading) { return ; } diff --git a/src/components/Amicale/LogoutDialog.tsx b/src/components/Amicale/LogoutDialog.tsx index 98205d3..6e060a3 100644 --- a/src/components/Amicale/LogoutDialog.tsx +++ b/src/components/Amicale/LogoutDialog.tsx @@ -21,7 +21,7 @@ import * as React from 'react'; import i18n from 'i18n-js'; import LoadingConfirmDialog from '../Dialogs/LoadingConfirmDialog'; import ConnectionManager from '../../managers/ConnectionManager'; -import {useNavigation} from '@react-navigation/native'; +import { useNavigation } from '@react-navigation/native'; type PropsType = { visible: boolean; @@ -37,7 +37,7 @@ function LogoutDialog(props: PropsType) { .then(() => { navigation.reset({ index: 0, - routes: [{name: 'main'}], + routes: [{ name: 'main' }], }); props.onDismiss(); resolve(); diff --git a/src/components/Amicale/Vote/VoteNotAvailable.tsx b/src/components/Amicale/Vote/VoteNotAvailable.tsx index f4d60ac..df2be7c 100644 --- a/src/components/Amicale/Vote/VoteNotAvailable.tsx +++ b/src/components/Amicale/Vote/VoteNotAvailable.tsx @@ -18,24 +18,31 @@ */ import React from 'react'; -import {View} from 'react-native'; -import {Headline, useTheme} from 'react-native-paper'; +import { StyleSheet, View } from 'react-native'; +import { Headline, useTheme } from 'react-native-paper'; import i18n from 'i18n-js'; +const styles = StyleSheet.create({ + container: { + width: '100%', + marginTop: 10, + marginBottom: 10, + }, + headline: { + textAlign: 'center', + }, +}); + function VoteNotAvailable() { const theme = useTheme(); return ( - + + ...styles.headline, + }} + > {i18n.t('screens.vote.noVote')} diff --git a/src/components/Amicale/Vote/VoteResults.tsx b/src/components/Amicale/Vote/VoteResults.tsx index f0e9396..42cdc44 100644 --- a/src/components/Amicale/Vote/VoteResults.tsx +++ b/src/components/Amicale/Vote/VoteResults.tsx @@ -26,9 +26,9 @@ import { Subheading, withTheme, } from 'react-native-paper'; -import {FlatList, StyleSheet} from 'react-native'; +import { FlatList, StyleSheet } from 'react-native'; import i18n from 'i18n-js'; -import type {VoteTeamType} from '../../../screens/Amicale/VoteScreen'; +import type { VoteTeamType } from '../../../screens/Amicale/VoteScreen'; type PropsType = { teams: Array; @@ -40,8 +40,11 @@ const styles = StyleSheet.create({ card: { margin: 10, }, - icon: { - backgroundColor: 'transparent', + itemCard: { + marginTop: 10, + }, + item: { + padding: 0, }, }); @@ -86,16 +89,18 @@ class VoteResults extends React.Component { voteKeyExtractor = (item: VoteTeamType): string => item.id.toString(); - resultRenderItem = ({item}: {item: VoteTeamType}) => { + resultRenderItem = ({ item }: { item: VoteTeamType }) => { const isWinner = this.winnerIds.indexOf(item.id) !== -1; const isDraw = this.winnerIds.length > 1; - const {props} = this; + const { props } = this; + const elevation = isWinner ? 5 : 3; return ( + ...styles.itemCard, + elevation: elevation, + }} + > { ? props.theme.colors.primary : props.theme.colors.text, }} - style={{padding: 0}} + style={styles.item} /> { }; render() { - const {props} = this; + const { props } = this; return ( ; @@ -43,8 +43,8 @@ const styles = StyleSheet.create({ card: { margin: 10, }, - icon: { - backgroundColor: 'transparent', + button: { + marginLeft: 'auto', }, }); @@ -63,28 +63,28 @@ export default class VoteSelect extends React.PureComponent< } onVoteSelectionChange = (teamName: string): void => - this.setState({selectedTeam: teamName}); + this.setState({ selectedTeam: teamName }); voteKeyExtractor = (item: VoteTeamType): string => item.id.toString(); - voteRenderItem = ({item}: {item: VoteTeamType}) => ( + voteRenderItem = ({ item }: { item: VoteTeamType }) => ( ); - showVoteDialog = (): void => this.setState({voteDialogVisible: true}); + showVoteDialog = (): void => this.setState({ voteDialogVisible: true }); - onVoteDialogDismiss = (): void => this.setState({voteDialogVisible: false}); + onVoteDialogDismiss = (): void => this.setState({ voteDialogVisible: false }); onVoteDialogAccept = async (): Promise => { return new Promise((resolve: () => void) => { - const {state} = this; + const { state } = this; ConnectionManager.getInstance() .authenticatedRequest('elections/vote', { team: parseInt(state.selectedTeam, 10), }) .then(() => { this.onVoteDialogDismiss(); - const {props} = this; + const { props } = this; props.onVoteSuccess(); resolve(); }) @@ -103,13 +103,13 @@ export default class VoteSelect extends React.PureComponent< }); onErrorDialogDismiss = () => { - this.setState({errorDialogVisible: false}); - const {props} = this; + this.setState({ errorDialogVisible: false }); + const { props } = this; props.onVoteError(); }; render() { - const {state, props} = this; + const { state, props } = this; return ( @@ -123,7 +123,8 @@ export default class VoteSelect extends React.PureComponent< + value={state.selectedTeam} + > + style={styles.button} + disabled={state.selectedTeam === 'none'} + > {i18n.t('screens.vote.select.sendButton')} diff --git a/src/components/Amicale/Vote/VoteTease.tsx b/src/components/Amicale/Vote/VoteTease.tsx index d52aa78..f256a81 100644 --- a/src/components/Amicale/Vote/VoteTease.tsx +++ b/src/components/Amicale/Vote/VoteTease.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {Avatar, Card, Paragraph} from 'react-native-paper'; -import {StyleSheet} from 'react-native'; +import { Avatar, Card, Paragraph } from 'react-native-paper'; +import { StyleSheet } from 'react-native'; import i18n from 'i18n-js'; type PropsType = { @@ -30,9 +30,6 @@ const styles = StyleSheet.create({ card: { margin: 10, }, - icon: { - backgroundColor: 'transparent', - }, }); export default function VoteTease(props: PropsType) { diff --git a/src/components/Amicale/Vote/VoteWait.tsx b/src/components/Amicale/Vote/VoteWait.tsx index b961fc2..55f059c 100644 --- a/src/components/Amicale/Vote/VoteWait.tsx +++ b/src/components/Amicale/Vote/VoteWait.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {Avatar, Card, Paragraph, useTheme} from 'react-native-paper'; -import {StyleSheet} from 'react-native'; +import { Avatar, Card, Paragraph, useTheme } from 'react-native-paper'; +import { StyleSheet } from 'react-native'; import i18n from 'i18n-js'; type PropsType = { @@ -33,14 +33,11 @@ const styles = StyleSheet.create({ card: { margin: 10, }, - icon: { - backgroundColor: 'transparent', - }, }); export default function VoteWait(props: PropsType) { const theme = useTheme(); - const {startDate} = props; + const { startDate } = props; return ( {props.justVoted ? ( - + {i18n.t('screens.vote.wait.messageSubmitted')} ) : null} {props.hasVoted ? ( - + {i18n.t('screens.vote.wait.messageVoted')} ) : null} diff --git a/src/components/Animations/AnimatedAccordion.tsx b/src/components/Animations/AnimatedAccordion.tsx index c4daea1..17fef0e 100644 --- a/src/components/Animations/AnimatedAccordion.tsx +++ b/src/components/Animations/AnimatedAccordion.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {View, ViewStyle} from 'react-native'; -import {List, withTheme} from 'react-native-paper'; +import { View, ViewStyle } from 'react-native'; +import { List, withTheme } from 'react-native-paper'; import Collapsible from 'react-native-collapsible'; import * as Animatable from 'react-native-animatable'; @@ -47,7 +47,7 @@ type StateType = { const AnimatedListIcon = Animatable.createAnimatableComponent(List.Icon); class AnimatedAccordion extends React.Component { - chevronRef: {current: null | (typeof AnimatedListIcon & List.Icon)}; + chevronRef: { current: null | (typeof AnimatedListIcon & List.Icon) }; chevronIcon: string; @@ -68,7 +68,7 @@ class AnimatedAccordion extends React.Component { } shouldComponentUpdate(nextProps: PropsType): boolean { - const {state, props} = this; + const { state, props } = this; if (nextProps.opened != null && nextProps.opened !== props.opened) { state.expanded = nextProps.opened; } @@ -76,7 +76,7 @@ class AnimatedAccordion extends React.Component { } setupChevron() { - const {expanded} = this.state; + const { expanded } = this.state; if (expanded) { this.chevronIcon = 'chevron-up'; this.animStart = '180deg'; @@ -89,26 +89,26 @@ class AnimatedAccordion extends React.Component { } toggleAccordion = () => { - const {expanded} = this.state; + const { expanded } = this.state; if (this.chevronRef.current != null) { this.chevronRef.current.transitionTo({ rotate: expanded ? this.animStart : this.animEnd, }); - this.setState((prevState: StateType): {expanded: boolean} => ({ + this.setState((prevState: StateType): { expanded: boolean } => ({ expanded: !prevState.expanded, })); } }; render() { - const {props, state} = this; - const {colors} = props.theme; + const { props, state } = this; + const { colors } = props.theme; return ( ( { - ref: {current: null | (Animatable.View & View)}; + ref: { current: null | (Animatable.View & View) }; hideHandler: AutoHideHandler; - displayModeIcons: {[key: string]: string}; + displayModeIcons: { [key: string]: string }; constructor(props: PropsType) { super(props); @@ -101,7 +107,7 @@ class AnimatedBottomBar extends React.Component { } shouldComponentUpdate(nextProps: PropsType, nextState: StateType): boolean { - const {props, state} = this; + const { props, state } = this; return ( nextProps.seekAttention !== props.seekAttention || nextState.currentMode !== state.currentMode @@ -124,7 +130,7 @@ class AnimatedBottomBar extends React.Component { }; changeDisplayMode = () => { - const {props, state} = this; + const { props, state } = this; let newMode; switch (state.currentMode) { case DISPLAY_MODES.DAY: @@ -140,12 +146,12 @@ class AnimatedBottomBar extends React.Component { newMode = DISPLAY_MODES.WEEK; break; } - this.setState({currentMode: newMode}); + this.setState({ currentMode: newMode }); props.onPress('changeView', newMode); }; render() { - const {props, state} = this; + const { props, state } = this; const buttonColor = props.theme.colors.primary; return ( { style={{ ...styles.container, bottom: 10 + CustomTabBar.TAB_BAR_HEIGHT, - }}> + }} + > { useNativeDriver style={styles.fab} icon="account-clock" - onPress={(): void => props.navigation.navigate('group-select')} + onPress={() => props.navigation.navigate('group-select')} /> - + { props.onPress('today')} + style={styles.icon} + onPress={() => props.onPress('today')} /> - + props.onPress('prev')} + onPress={() => props.onPress('prev')} /> props.onPress('next')} + style={styles.icon} + onPress={() => props.onPress('next')} /> diff --git a/src/components/Animations/AnimatedFAB.tsx b/src/components/Animations/AnimatedFAB.tsx index 8b73550..63b3174 100644 --- a/src/components/Animations/AnimatedFAB.tsx +++ b/src/components/Animations/AnimatedFAB.tsx @@ -24,7 +24,7 @@ import { StyleSheet, View, } from 'react-native'; -import {FAB} from 'react-native-paper'; +import { FAB } from 'react-native-paper'; import * as Animatable from 'react-native-animatable'; import AutoHideHandler from '../../utils/AutoHideHandler'; import CustomTabBar from '../Tabbar/CustomTabBar'; @@ -43,7 +43,7 @@ const styles = StyleSheet.create({ }); export default class AnimatedFAB extends React.Component { - ref: {current: null | (Animatable.View & View)}; + ref: { current: null | (Animatable.View & View) }; hideHandler: AutoHideHandler; @@ -75,7 +75,7 @@ export default class AnimatedFAB extends React.Component { }; render() { - const {props} = this; + const { props } = this; return ( { style={{ ...styles.fab, bottom: CustomTabBar.TAB_BAR_HEIGHT, - }}> + }} + > ); diff --git a/src/components/Collapsible/CollapsibleComponent.tsx b/src/components/Collapsible/CollapsibleComponent.tsx index 2039854..f34d55a 100644 --- a/src/components/Collapsible/CollapsibleComponent.tsx +++ b/src/components/Collapsible/CollapsibleComponent.tsx @@ -18,19 +18,29 @@ */ import * as React from 'react'; -import {useCollapsibleStack} from 'react-navigation-collapsible'; +import { useCollapsibleStack } from 'react-navigation-collapsible'; import CustomTabBar from '../Tabbar/CustomTabBar'; -import {NativeScrollEvent, NativeSyntheticEvent} from 'react-native'; +import { + NativeScrollEvent, + NativeSyntheticEvent, + StyleSheet, +} from 'react-native'; -export interface CollapsibleComponentPropsType { +export type CollapsibleComponentPropsType = { children?: React.ReactNode; hasTab?: boolean; onScroll?: (event: NativeSyntheticEvent) => void; -} +}; -interface PropsType extends CollapsibleComponentPropsType { +type PropsType = CollapsibleComponentPropsType & { component: React.ComponentType; -} +}; + +const styles = StyleSheet.create({ + main: { + minHeight: '100%', + }, +}); function CollapsibleComponent(props: PropsType) { const onScroll = (event: NativeSyntheticEvent) => { @@ -44,17 +54,18 @@ function CollapsibleComponent(props: PropsType) { scrollIndicatorInsetTop, onScrollWithListener, } = useCollapsibleStack(); - + const paddingBottom = props.hasTab ? CustomTabBar.TAB_BAR_HEIGHT : 0; return ( + scrollIndicatorInsets={{ top: scrollIndicatorInsetTop }} + > {props.children} ); diff --git a/src/components/Collapsible/CollapsibleFlatList.tsx b/src/components/Collapsible/CollapsibleFlatList.tsx index e8c1ce6..03936f9 100644 --- a/src/components/Collapsible/CollapsibleFlatList.tsx +++ b/src/components/Collapsible/CollapsibleFlatList.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {Animated, FlatListProps} from 'react-native'; -import type {CollapsibleComponentPropsType} from './CollapsibleComponent'; +import { Animated, FlatListProps } from 'react-native'; +import type { CollapsibleComponentPropsType } from './CollapsibleComponent'; import CollapsibleComponent from './CollapsibleComponent'; type Props = FlatListProps & CollapsibleComponentPropsType; diff --git a/src/components/Collapsible/CollapsibleScrollView.tsx b/src/components/Collapsible/CollapsibleScrollView.tsx index 3d8cdd7..effa0f7 100644 --- a/src/components/Collapsible/CollapsibleScrollView.tsx +++ b/src/components/Collapsible/CollapsibleScrollView.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {Animated, ScrollViewProps} from 'react-native'; -import type {CollapsibleComponentPropsType} from './CollapsibleComponent'; +import { Animated, ScrollViewProps } from 'react-native'; +import type { CollapsibleComponentPropsType } from './CollapsibleComponent'; import CollapsibleComponent from './CollapsibleComponent'; type Props = ScrollViewProps & CollapsibleComponentPropsType; diff --git a/src/components/Collapsible/CollapsibleSectionList.tsx b/src/components/Collapsible/CollapsibleSectionList.tsx index ed0a337..6e4dc21 100644 --- a/src/components/Collapsible/CollapsibleSectionList.tsx +++ b/src/components/Collapsible/CollapsibleSectionList.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {Animated, SectionListProps} from 'react-native'; -import type {CollapsibleComponentPropsType} from './CollapsibleComponent'; +import { Animated, SectionListProps } from 'react-native'; +import type { CollapsibleComponentPropsType } from './CollapsibleComponent'; import CollapsibleComponent from './CollapsibleComponent'; type Props = SectionListProps & CollapsibleComponentPropsType; diff --git a/src/components/Dialogs/AlertDialog.tsx b/src/components/Dialogs/AlertDialog.tsx index 642bc9b..9962a39 100644 --- a/src/components/Dialogs/AlertDialog.tsx +++ b/src/components/Dialogs/AlertDialog.tsx @@ -18,7 +18,7 @@ */ import * as React from 'react'; -import {Button, Dialog, Paragraph, Portal} from 'react-native-paper'; +import { Button, Dialog, Paragraph, Portal } from 'react-native-paper'; import i18n from 'i18n-js'; type PropsType = { diff --git a/src/components/Dialogs/ErrorDialog.tsx b/src/components/Dialogs/ErrorDialog.tsx index b726d56..78b9ac5 100644 --- a/src/components/Dialogs/ErrorDialog.tsx +++ b/src/components/Dialogs/ErrorDialog.tsx @@ -19,7 +19,7 @@ import * as React from 'react'; import i18n from 'i18n-js'; -import {ERROR_TYPE} from '../../utils/WebData'; +import { ERROR_TYPE } from '../../utils/WebData'; import AlertDialog from './AlertDialog'; type PropsType = { diff --git a/src/components/Dialogs/LoadingConfirmDialog.tsx b/src/components/Dialogs/LoadingConfirmDialog.tsx index 914ff13..4ba512a 100644 --- a/src/components/Dialogs/LoadingConfirmDialog.tsx +++ b/src/components/Dialogs/LoadingConfirmDialog.tsx @@ -26,6 +26,7 @@ import { Portal, } from 'react-native-paper'; import i18n from 'i18n-js'; +import { StyleSheet } from 'react-native'; type PropsType = { visible: boolean; @@ -41,6 +42,12 @@ type StateType = { loading: boolean; }; +const styles = StyleSheet.create({ + button: { + marginRight: 10, + }, +}); + export default class LoadingConfirmDialog extends React.PureComponent< PropsType, StateType @@ -70,8 +77,8 @@ export default class LoadingConfirmDialog extends React.PureComponent< * Set the dialog into loading state and closes it when operation finishes */ onClickAccept = () => { - const {props} = this; - this.setState({loading: true}); + const { props } = this; + this.setState({ loading: true }); if (props.onAccept != null) { props.onAccept().then(this.hideLoading); } @@ -83,21 +90,21 @@ export default class LoadingConfirmDialog extends React.PureComponent< */ hideLoading = (): NodeJS.Timeout => setTimeout(() => { - this.setState({loading: false}); + this.setState({ loading: false }); }, 200); /** * Hide the dialog if it is not loading */ onDismiss = () => { - const {state, props} = this; + const { state, props } = this; if (!state.loading && props.onDismiss != null) { props.onDismiss(); } }; render() { - const {state, props} = this; + const { state, props } = this; return ( @@ -113,7 +120,7 @@ export default class LoadingConfirmDialog extends React.PureComponent< {state.loading ? null : ( - diff --git a/src/components/Home/PreviewEventDashboardItem.tsx b/src/components/Home/PreviewEventDashboardItem.tsx index ae79354..ce9492c 100644 --- a/src/components/Home/PreviewEventDashboardItem.tsx +++ b/src/components/Home/PreviewEventDashboardItem.tsx @@ -18,12 +18,13 @@ */ import * as React from 'react'; -import {StyleSheet, View} from 'react-native'; +import { StyleSheet, View } from 'react-native'; import i18n from 'i18n-js'; -import {Avatar, Button, Card, TouchableRipple} from 'react-native-paper'; -import {getTimeOnlyString, isDescriptionEmpty} from '../../utils/Planning'; +import { Avatar, Button, Card, TouchableRipple } from 'react-native-paper'; +import { getTimeOnlyString, isDescriptionEmpty } from '../../utils/Planning'; import CustomHTML from '../Overrides/CustomHTML'; -import type {PlanningEventType} from '../../utils/Planning'; +import type { PlanningEventType } from '../../utils/Planning'; +import GENERAL_STYLES from '../../constants/Styles'; type PropsType = { event?: PlanningEventType | null; @@ -52,19 +53,26 @@ const styles = StyleSheet.create({ * Component used to display an event preview if an event is available */ function PreviewEventDashboardItem(props: PropsType) { - const {event} = props; + const { event } = props; const isEmpty = event == null ? true : isDescriptionEmpty(event.description); if (event != null) { const logo = event.logo; const getImage = logo ? () => ( - + ) : () => null; return ( - + + }} + > + }} + > {image ? ( ) : null} {props.badgeCount != null && props.badgeCount > 0 ? ( @@ -66,18 +80,16 @@ function SmallDashboardItem(props: PropsType) { animation="zoomIn" duration={300} useNativeDriver - style={{ - position: 'absolute', - top: 0, - right: 0, - }}> + style={styles.badgeContainer} + > + ...styles.badge, + }} + > {props.badgeCount} diff --git a/src/components/Intro/IconIntro.tsx b/src/components/Intro/IconIntro.tsx index 6017024..9eacced 100644 --- a/src/components/Intro/IconIntro.tsx +++ b/src/components/Intro/IconIntro.tsx @@ -18,9 +18,10 @@ */ import * as React from 'react'; -import {StyleSheet, View} from 'react-native'; +import { StyleSheet, View } from 'react-native'; import * as Animatable from 'react-native-animatable'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; +import GENERAL_STYLES from '../../constants/Styles'; type PropsType = { icon: string; @@ -37,7 +38,7 @@ const styles = StyleSheet.create({ function IntroIcon(props: PropsType) { return ( - + diff --git a/src/components/Intro/MascotIntroEnd.tsx b/src/components/Intro/MascotIntroEnd.tsx index ffffa0b..7b1543a 100644 --- a/src/components/Intro/MascotIntroEnd.tsx +++ b/src/components/Intro/MascotIntroEnd.tsx @@ -18,25 +18,23 @@ */ import * as React from 'react'; -import {StyleSheet, View} from 'react-native'; -import Mascot, {MASCOT_STYLE} from '../Mascot/Mascot'; +import { StyleSheet, View } from 'react-native'; +import GENERAL_STYLES from '../../constants/Styles'; +import Mascot, { MASCOT_STYLE } from '../Mascot/Mascot'; const styles = StyleSheet.create({ center: { - marginTop: 'auto', - marginBottom: 'auto', - marginRight: 'auto', - marginLeft: 'auto', + ...GENERAL_STYLES.center, + width: '80%', }, }); function MascotIntroEnd() { return ( - + + + style={styles.text} + > PABLO + style={styles.container} + > ; @@ -45,8 +45,8 @@ export default class CardList extends React.Component { this.horizontalItemSize = this.windowWidth / 4; // So that we can fit 3 items, and a part of the 4th => user knows he can scroll } - getRenderItem = ({item}: {item: ServiceItemType}) => { - const {props} = this; + getRenderItem = ({ item }: { item: ServiceItemType }) => { + const { props } = this; if (props.isHorizontal) { return ( { keyExtractor = (item: ServiceItemType): string => item.key; render() { - const {props} = this; + const { props } = this; let containerStyle = {}; if (props.isHorizontal) { containerStyle = { diff --git a/src/components/Lists/CardList/CardListItem.tsx b/src/components/Lists/CardList/CardListItem.tsx index ce0e9f6..155d868 100644 --- a/src/components/Lists/CardList/CardListItem.tsx +++ b/src/components/Lists/CardList/CardListItem.tsx @@ -18,29 +18,36 @@ */ import * as React from 'react'; -import {Caption, Card, Paragraph, TouchableRipple} from 'react-native-paper'; -import {View} from 'react-native'; -import type {ServiceItemType} from '../../../managers/ServicesManager'; +import { Caption, Card, Paragraph, TouchableRipple } from 'react-native-paper'; +import { StyleSheet, View } from 'react-native'; +import type { ServiceItemType } from '../../../managers/ServicesManager'; +import GENERAL_STYLES from '../../../constants/Styles'; type PropsType = { item: ServiceItemType; }; +const styles = StyleSheet.create({ + card: { + width: '40%', + margin: 5, + marginLeft: 'auto', + marginRight: 'auto', + }, + cover: { + height: 80, + }, +}); + function CardListItem(props: PropsType) { - const {item} = props; + const { item } = props; const source = - typeof item.image === 'number' ? item.image : {uri: item.image}; + typeof item.image === 'number' ? item.image : { uri: item.image }; return ( - - + + - + {item.title} {item.subtitle} diff --git a/src/components/Lists/CardList/ImageListItem.tsx b/src/components/Lists/CardList/ImageListItem.tsx index 73dd698..993b24c 100644 --- a/src/components/Lists/CardList/ImageListItem.tsx +++ b/src/components/Lists/CardList/ImageListItem.tsx @@ -18,46 +18,50 @@ */ import * as React from 'react'; -import {Text, TouchableRipple} from 'react-native-paper'; -import {Image, View} from 'react-native'; -import type {ServiceItemType} from '../../../managers/ServicesManager'; +import { Text, TouchableRipple } from 'react-native-paper'; +import { Image, StyleSheet, View } from 'react-native'; +import type { ServiceItemType } from '../../../managers/ServicesManager'; +import GENERAL_STYLES from '../../../constants/Styles'; type PropsType = { item: ServiceItemType; width: number; }; +const styles = StyleSheet.create({ + ripple: { + margin: 5, + }, + text: { + ...GENERAL_STYLES.centerHorizontal, + marginTop: 5, + textAlign: 'center', + }, +}); + function ImageListItem(props: PropsType) { - const {item} = props; + const { item } = props; const source = - typeof item.image === 'number' ? item.image : {uri: item.image}; + typeof item.image === 'number' ? item.image : { uri: item.image }; return ( + onPress={item.onPress} + > - - {item.title} - + {item.title} ); diff --git a/src/components/Lists/Clubs/ClubListHeader.tsx b/src/components/Lists/Clubs/ClubListHeader.tsx index d60030c..f7cec65 100644 --- a/src/components/Lists/Clubs/ClubListHeader.tsx +++ b/src/components/Lists/Clubs/ClubListHeader.tsx @@ -18,12 +18,13 @@ */ import * as React from 'react'; -import {Card, Chip, List, Text} from 'react-native-paper'; -import {StyleSheet, View} from 'react-native'; +import { Card, Chip, List, Text } from 'react-native-paper'; +import { StyleSheet, View } from 'react-native'; import i18n from 'i18n-js'; import AnimatedAccordion from '../../Animations/AnimatedAccordion'; -import {isItemInCategoryFilter} from '../../../utils/Search'; -import type {ClubCategoryType} from '../../../screens/Amicale/Clubs/ClubListScreen'; +import { isItemInCategoryFilter } from '../../../utils/Search'; +import type { ClubCategoryType } from '../../../screens/Amicale/Clubs/ClubListScreen'; +import GENERAL_STYLES from '../../../constants/Styles'; type PropsType = { categories: Array; @@ -39,8 +40,7 @@ const styles = StyleSheet.create({ paddingLeft: 0, marginTop: 5, marginBottom: 10, - marginLeft: 'auto', - marginRight: 'auto', + ...GENERAL_STYLES.centerHorizontal, }, chipContainer: { justifyContent: 'space-around', @@ -49,6 +49,11 @@ const styles = StyleSheet.create({ paddingLeft: 0, marginBottom: 5, }, + chip: { + marginRight: 5, + marginLeft: 5, + marginBottom: 5, + }, }); function ClubListHeader(props: PropsType) { @@ -62,8 +67,9 @@ function ClubListHeader(props: PropsType) { ])} mode="outlined" onPress={onPress} - style={{marginRight: 5, marginLeft: 5, marginBottom: 5}} - key={key}> + style={styles.chip} + key={key} + > {category.name} ); @@ -88,7 +94,8 @@ function ClubListHeader(props: PropsType) { icon="star" /> )} - opened> + opened + > {i18n.t('screens.clubs.categoriesFilterMessage')} diff --git a/src/components/Lists/Clubs/ClubListItem.tsx b/src/components/Lists/Clubs/ClubListItem.tsx index 87bae5b..35ac00b 100644 --- a/src/components/Lists/Clubs/ClubListItem.tsx +++ b/src/components/Lists/Clubs/ClubListItem.tsx @@ -18,12 +18,13 @@ */ import * as React from 'react'; -import {Avatar, Chip, List, withTheme} from 'react-native-paper'; -import {View} from 'react-native'; +import { Avatar, Chip, List, withTheme } from 'react-native-paper'; +import { StyleSheet, View } from 'react-native'; import type { ClubCategoryType, ClubType, } from '../../../screens/Amicale/Clubs/ClubListScreen'; +import GENERAL_STYLES from '../../../constants/Styles'; type PropsType = { onPress: () => void; @@ -33,6 +34,28 @@ type PropsType = { theme: ReactNativePaper.Theme; }; +const styles = StyleSheet.create({ + chip: { + marginRight: 5, + marginBottom: 5, + }, + chipContainer: { + flexDirection: 'row', + }, + avatar: { + backgroundColor: 'transparent', + marginLeft: 10, + marginRight: 10, + }, + icon: { + ...GENERAL_STYLES.centerVertical, + backgroundColor: 'transparent', + }, + item: { + justifyContent: 'center', + }, +}); + class ClubListItem extends React.Component { hasManagers: boolean; @@ -46,30 +69,28 @@ class ClubListItem extends React.Component { } getCategoriesRender(categories: Array) { - const {props} = this; + const { props } = this; const final: Array = []; categories.forEach((cat: number | null) => { if (cat != null) { const category = props.categoryTranslator(cat); if (category) { final.push( - + {category.name} - , + ); } } }); - return {final}; + return {final}; } render() { - const {props} = this; + const { props } = this; const categoriesRender = () => this.getCategoriesRender(props.item.category); - const {colors} = props.theme; + const { colors } = props.theme; return ( { onPress={props.onPress} left={() => ( )} right={() => ( { )} style={{ height: props.height, - justifyContent: 'center', + ...styles.item, }} /> ); diff --git a/src/components/Lists/DashboardEdit/DashboardEditAccordion.tsx b/src/components/Lists/DashboardEdit/DashboardEditAccordion.tsx index b273b9d..498cf6d 100644 --- a/src/components/Lists/DashboardEdit/DashboardEditAccordion.tsx +++ b/src/components/Lists/DashboardEdit/DashboardEditAccordion.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {useTheme} from 'react-native-paper'; -import {FlatList, Image, View} from 'react-native'; +import { useTheme } from 'react-native-paper'; +import { FlatList, Image, StyleSheet, View } from 'react-native'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import DashboardEditItem from './DashboardEditItem'; import AnimatedAccordion from '../../Animations/AnimatedAccordion'; @@ -34,12 +34,19 @@ type PropsType = { onPress: (service: ServiceItemType) => void; }; +const styles = StyleSheet.create({ + image: { + width: 40, + height: 40, + }, +}); + const LIST_ITEM_HEIGHT = 64; function DashboardEditAccordion(props: PropsType) { const theme = useTheme(); - const getRenderItem = ({item}: {item: ServiceItemType}) => { + const getRenderItem = ({ item }: { item: ServiceItemType }) => { return ( | null | undefined, - index: number, - ): {length: number; offset: number; index: number} => ({ + index: number + ): { length: number; offset: number; index: number } => ({ length: LIST_ITEM_HEIGHT, offset: LIST_ITEM_HEIGHT * index, index, }); - const {item} = props; + const { item } = props; return ( typeof item.image === 'number' ? ( - + ) : ( ) - }> + } + > void; }; +const styles = StyleSheet.create({ + image: { + width: 40, + height: 40, + }, + item: { + justifyContent: 'center', + paddingLeft: 30, + }, +}); + function DashboardEditItem(props: PropsType) { const theme = useTheme(); - const {item, onPress, height, isActive} = props; + const { item, onPress, height, isActive } = props; + const backgroundColor = isActive + ? theme.colors.proxiwashFinishedColor + : 'transparent'; return ( ( )} right={(iconProps) => @@ -58,12 +69,9 @@ function DashboardEditItem(props: PropsType) { ) : null } style={{ - height, - justifyContent: 'center', - paddingLeft: 30, - backgroundColor: isActive - ? theme.colors.proxiwashFinishedColor - : 'transparent', + ...styles.image, + height: height, + backgroundColor: backgroundColor, }} /> ); diff --git a/src/components/Lists/DashboardEdit/DashboardEditPreviewItem.tsx b/src/components/Lists/DashboardEdit/DashboardEditPreviewItem.tsx index bab1bbf..43bc871 100644 --- a/src/components/Lists/DashboardEdit/DashboardEditPreviewItem.tsx +++ b/src/components/Lists/DashboardEdit/DashboardEditPreviewItem.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {TouchableRipple, useTheme} from 'react-native-paper'; -import {Dimensions, Image, View} from 'react-native'; +import { TouchableRipple, useTheme } from 'react-native-paper'; +import { Dimensions, Image, StyleSheet, View } from 'react-native'; type PropsType = { image?: string | number; @@ -27,39 +27,50 @@ type PropsType = { onPress: () => void; }; +const styles = StyleSheet.create({ + ripple: { + marginLeft: 5, + marginRight: 5, + borderRadius: 5, + }, + image: { + width: '100%', + height: '100%', + }, +}); + /** * Component used to render a small dashboard item */ function DashboardEditPreviewItem(props: PropsType) { const theme = useTheme(); const itemSize = Dimensions.get('window').width / 8; - + const backgroundColor = props.isActive + ? theme.colors.textDisabled + : 'transparent'; return ( + ...styles.ripple, + backgroundColor: backgroundColor, + }} + > + }} + > {props.image ? ( ) : null} diff --git a/src/components/Lists/Equipment/EquipmentListItem.tsx b/src/components/Lists/Equipment/EquipmentListItem.tsx index 692c877..f76414a 100644 --- a/src/components/Lists/Equipment/EquipmentListItem.tsx +++ b/src/components/Lists/Equipment/EquipmentListItem.tsx @@ -18,15 +18,17 @@ */ import * as React from 'react'; -import {Avatar, List, useTheme} from 'react-native-paper'; +import { Avatar, List, useTheme } from 'react-native-paper'; import i18n from 'i18n-js'; -import {StackNavigationProp} from '@react-navigation/stack'; -import type {DeviceType} from '../../../screens/Amicale/Equipment/EquipmentListScreen'; +import { StackNavigationProp } from '@react-navigation/stack'; +import type { DeviceType } from '../../../screens/Amicale/Equipment/EquipmentListScreen'; import { getFirstEquipmentAvailability, getRelativeDateString, isEquipmentAvailable, } from '../../../utils/EquipmentBooking'; +import { StyleSheet } from 'react-native'; +import GENERAL_STYLES from '../../../constants/Styles'; type PropsType = { navigation: StackNavigationProp; @@ -35,9 +37,18 @@ type PropsType = { height: number; }; +const styles = StyleSheet.create({ + icon: { + backgroundColor: 'transparent', + }, + item: { + justifyContent: 'center', + }, +}); + function EquipmentListItem(props: PropsType) { const theme = useTheme(); - const {item, userDeviceRentDates, navigation, height} = props; + const { item, userDeviceRentDates, navigation, height } = props; const isRented = userDeviceRentDates != null; const isAvailable = isEquipmentAvailable(item); const firstAvailability = getFirstEquipmentAvailability(item); @@ -52,7 +63,7 @@ function EquipmentListItem(props: PropsType) { }; } else { onPress = () => { - navigation.navigate('equipment-rent', {item}); + navigation.navigate('equipment-rent', { item }); }; } @@ -71,7 +82,7 @@ function EquipmentListItem(props: PropsType) { }); } } else if (isAvailable) { - description = i18n.t('screens.equipment.bail', {cost: item.caution}); + description = i18n.t('screens.equipment.bail', { cost: item.caution }); } else { description = i18n.t('screens.equipment.available', { date: getRelativeDateString(firstAvailability), @@ -101,21 +112,12 @@ function EquipmentListItem(props: PropsType) { title={item.name} description={description} onPress={onPress} - left={() => ( - - )} + left={() => } right={() => ( ); diff --git a/src/components/Lists/PlanexGroups/GroupListAccordion.tsx b/src/components/Lists/PlanexGroups/GroupListAccordion.tsx index 75617b2..e73a100 100644 --- a/src/components/Lists/PlanexGroups/GroupListAccordion.tsx +++ b/src/components/Lists/PlanexGroups/GroupListAccordion.tsx @@ -18,9 +18,9 @@ */ import * as React from 'react'; -import {List, withTheme} from 'react-native-paper'; -import {FlatList, View} from 'react-native'; -import {stringMatchQuery} from '../../../utils/Search'; +import { List, withTheme } from 'react-native-paper'; +import { FlatList, StyleSheet, View } from 'react-native'; +import { stringMatchQuery } from '../../../utils/Search'; import GroupListItem from './GroupListItem'; import AnimatedAccordion from '../../Animations/AnimatedAccordion'; import type { @@ -40,9 +40,15 @@ type PropsType = { const LIST_ITEM_HEIGHT = 64; const REPLACE_REGEX = /_/g; +const styles = StyleSheet.create({ + container: { + justifyContent: 'center', + }, +}); + class GroupListAccordion extends React.Component { shouldComponentUpdate(nextProps: PropsType): boolean { - const {props} = this; + const { props } = this; return ( nextProps.currentSearchString !== props.currentSearchString || nextProps.favorites.length !== props.favorites.length || @@ -50,8 +56,8 @@ class GroupListAccordion extends React.Component { ); } - getRenderItem = ({item}: {item: PlanexGroupType}) => { - const {props} = this; + getRenderItem = ({ item }: { item: PlanexGroupType }) => { + const { props } = this; const onPress = () => { props.onGroupPress(item); }; @@ -70,7 +76,7 @@ class GroupListAccordion extends React.Component { }; getData(): Array { - const {props} = this; + const { props } = this; const originalData = props.item.content; const displayData: Array = []; originalData.forEach((data: PlanexGroupType) => { @@ -83,8 +89,8 @@ class GroupListAccordion extends React.Component { itemLayout = ( data: Array | null | undefined, - index: number, - ): {length: number; offset: number; index: number} => ({ + index: number + ): { length: number; offset: number; index: number } => ({ length: LIST_ITEM_HEIGHT, offset: LIST_ITEM_HEIGHT * index, index, @@ -93,15 +99,13 @@ class GroupListAccordion extends React.Component { keyExtractor = (item: PlanexGroupType): string => item.id.toString(); render() { - const {props} = this; - const {item} = this.props; + const { props } = this; + const { item } = this.props; return ( item.id === 0 ? ( { ) : null } unmountWhenCollapsed={item.id !== 0} // Only render list if expanded for increased performance - opened={props.currentSearchString.length > 0}> + opened={props.currentSearchString.length > 0} + > { isFav: boolean; - starRef: {current: null | (Animatable.View & View)}; + starRef: { current: null | (Animatable.View & View) }; constructor(props: PropsType) { super(props); @@ -46,7 +61,7 @@ class GroupListItem extends React.Component { } shouldComponentUpdate(nextProps: PropsType): boolean { - const {favorites} = this.props; + const { favorites } = this.props; const favChanged = favorites.length !== nextProps.favorites.length; let newFavState = this.isFav; if (favChanged) { @@ -58,7 +73,7 @@ class GroupListItem extends React.Component { } onStarPress = () => { - const {props} = this; + const { props } = this; const ref = this.starRef; if (ref.current && ref.current.rubberBand && ref.current.swing) { if (this.isFav) { @@ -71,7 +86,7 @@ class GroupListItem extends React.Component { }; isGroupInFavorites(favorites: Array): boolean { - const {item} = this.props; + const { item } = this.props; for (let i = 0; i < favorites.length; i += 1) { if (favorites[i].id === item.id) { return true; @@ -81,8 +96,8 @@ class GroupListItem extends React.Component { } render() { - const {props} = this; - const {colors} = props.theme; + const { props } = this; + const { colors } = props.theme; return ( { + style={styles.iconContainer} + > @@ -115,7 +126,7 @@ class GroupListItem extends React.Component { )} style={{ height: props.height, - justifyContent: 'center', + ...styles.item, }} /> ); diff --git a/src/components/Lists/Proximo/ProximoListItem.tsx b/src/components/Lists/Proximo/ProximoListItem.tsx index 9465922..6924563 100644 --- a/src/components/Lists/Proximo/ProximoListItem.tsx +++ b/src/components/Lists/Proximo/ProximoListItem.tsx @@ -18,9 +18,10 @@ */ import * as React from 'react'; -import {Avatar, List, Text} from 'react-native-paper'; +import { Avatar, List, Text } from 'react-native-paper'; import i18n from 'i18n-js'; -import type {ProximoArticleType} from '../../../screens/Services/Proximo/ProximoMainScreen'; +import type { ProximoArticleType } from '../../../screens/Services/Proximo/ProximoMainScreen'; +import { StyleSheet } from 'react-native'; type PropsType = { onPress: () => void; @@ -29,28 +30,38 @@ type PropsType = { height: number; }; +const styles = StyleSheet.create({ + avatar: { + backgroundColor: 'transparent', + }, + text: { + fontWeight: 'bold', + }, + item: { + justifyContent: 'center', + }, +}); + function ProximoListItem(props: PropsType) { return ( ( )} - right={() => ( - {props.item.price}€ - )} + right={() => {props.item.price}€} style={{ height: props.height, - justifyContent: 'center', + ...styles.item, }} /> ); diff --git a/src/components/Lists/Proxiwash/ProxiwashListItem.tsx b/src/components/Lists/Proxiwash/ProxiwashListItem.tsx index 9882333..f1b8ac6 100644 --- a/src/components/Lists/Proxiwash/ProxiwashListItem.tsx +++ b/src/components/Lists/Proxiwash/ProxiwashListItem.tsx @@ -27,14 +27,14 @@ import { Text, withTheme, } from 'react-native-paper'; -import {StyleSheet, View} from 'react-native'; +import { StyleSheet, View } from 'react-native'; import i18n from 'i18n-js'; import * as Animatable from 'react-native-animatable'; import ProxiwashConstants, { MachineStates, } from '../../../constants/ProxiwashConstants'; import AprilFoolsManager from '../../../managers/AprilFoolsManager'; -import type {ProxiwashMachineType} from '../../../screens/Proxiwash/ProxiwashScreen'; +import type { ProxiwashMachineType } from '../../../screens/Proxiwash/ProxiwashScreen'; type PropsType = { item: ProxiwashMachineType; @@ -42,7 +42,7 @@ type PropsType = { onPress: ( title: string, item: ProxiwashMachineType, - isDryer: boolean, + isDryer: boolean ) => void; isWatched: boolean; isDryer: boolean; @@ -56,6 +56,7 @@ const styles = StyleSheet.create({ margin: 5, justifyContent: 'center', elevation: 1, + borderRadius: 4, }, icon: { backgroundColor: 'transparent', @@ -65,17 +66,29 @@ const styles = StyleSheet.create({ left: 0, borderRadius: 4, }, + item: { + justifyContent: 'center', + }, + text: { + fontWeight: 'bold', + }, + textRow: { + flexDirection: 'row', + }, + textContainer: { + justifyContent: 'center', + }, }); /** * Component used to display a proxiwash item, showing machine progression and state */ class ProxiwashListItem extends React.Component { - stateStrings: {[key in MachineStates]: string} = { + stateStrings: { [key in MachineStates]: string } = { [MachineStates.AVAILABLE]: i18n.t('screens.proxiwash.states.ready'), [MachineStates.RUNNING]: i18n.t('screens.proxiwash.states.running'), [MachineStates.RUNNING_NOT_STARTED]: i18n.t( - 'screens.proxiwash.states.runningNotStarted', + 'screens.proxiwash.states.runningNotStarted' ), [MachineStates.FINISHED]: i18n.t('screens.proxiwash.states.finished'), [MachineStates.UNAVAILABLE]: i18n.t('screens.proxiwash.states.broken'), @@ -83,7 +96,7 @@ class ProxiwashListItem extends React.Component { [MachineStates.UNKNOWN]: i18n.t('screens.proxiwash.states.unknown'), }; - stateColors: {[key: string]: string}; + stateColors: { [key: string]: string }; title: string; @@ -97,7 +110,7 @@ class ProxiwashListItem extends React.Component { const displayMaxWeight = props.item.maxWeight; if (AprilFoolsManager.getInstance().isAprilFoolsEnabled()) { displayNumber = AprilFoolsManager.getProxiwashMachineDisplayNumber( - parseInt(props.item.number, 10), + parseInt(props.item.number, 10) ); } @@ -109,7 +122,7 @@ class ProxiwashListItem extends React.Component { } shouldComponentUpdate(nextProps: PropsType): boolean { - const {props} = this; + const { props } = this; return ( nextProps.theme.dark !== props.theme.dark || nextProps.item.state !== props.item.state || @@ -119,13 +132,13 @@ class ProxiwashListItem extends React.Component { } onListItemPress = () => { - const {props} = this; + const { props } = this; props.onPress(this.titlePopUp, props.item, props.isDryer); }; updateStateColors() { - const {props} = this; - const {colors} = props.theme; + const { props } = this; + const { colors } = props.theme; this.stateColors[MachineStates.AVAILABLE] = colors.proxiwashReadyColor; this.stateColors[MachineStates.RUNNING] = colors.proxiwashRunningColor; this.stateColors[MachineStates.RUNNING_NOT_STARTED] = @@ -137,8 +150,8 @@ class ProxiwashListItem extends React.Component { } render() { - const {props} = this; - const {colors} = props.theme; + const { props } = this; + const { colors } = props.theme; const machineState = props.item.state; const isRunning = machineState === MachineStates.RUNNING; const isReady = machineState === MachineStates.AVAILABLE; @@ -184,8 +197,8 @@ class ProxiwashListItem extends React.Component { style={{ ...styles.container, height: props.height, - borderRadius: 4, - }}> + }} + > {!isReady ? ( { description={description} style={{ height: props.height, - justifyContent: 'center', + ...styles.item, }} onPress={this.onListItemPress} left={() => icon} right={() => ( - - + + + ? styles.text + : undefined + } + > {stateString} {machineState === MachineStates.RUNNING ? ( {props.item.remainingTime} min ) : null} - + { shouldComponentUpdate(nextProps: PropsType): boolean { - const {props} = this; + const { props } = this; return ( nextProps.theme.dark !== props.theme.dark || nextProps.nbAvailable !== props.nbAvailable @@ -59,7 +62,7 @@ class ProxiwashListItem extends React.Component { } render() { - const {props} = this; + const { props } = this; const subtitle = `${props.nbAvailable} ${ props.nbAvailable <= 1 ? i18n.t('screens.proxiwash.numAvailable') @@ -76,9 +79,9 @@ class ProxiwashListItem extends React.Component { color={iconColor} style={styles.icon} /> - + {props.title} - {subtitle} + {subtitle} ); diff --git a/src/components/Mascot/Mascot.tsx b/src/components/Mascot/Mascot.tsx index 6ad77d6..43ed535 100644 --- a/src/components/Mascot/Mascot.tsx +++ b/src/components/Mascot/Mascot.tsx @@ -19,8 +19,14 @@ import * as React from 'react'; import * as Animatable from 'react-native-animatable'; -import {Image, TouchableWithoutFeedback, View, ViewStyle} from 'react-native'; -import {AnimatableProperties} from 'react-native-animatable'; +import { + Image, + StyleSheet, + TouchableWithoutFeedback, + View, + ViewStyle, +} from 'react-native'; +import { AnimatableProperties } from 'react-native-animatable'; export type AnimatableViewRefType = { current: null | (typeof Animatable.View & View); @@ -77,6 +83,34 @@ export enum MASCOT_STYLE { RANDOM = 999, } +const styles = StyleSheet.create({ + container: { + aspectRatio: 1, + }, + mascot: { + width: '100%', + height: '100%', + }, + glassesImage: { + position: 'absolute', + top: '15%', + left: 0, + width: '100%', + height: '100%', + }, + eyesImage: { + position: 'absolute', + top: '15%', + width: '100%', + height: '100%', + }, + eyesContainer: { + position: 'absolute', + width: '100%', + height: '100%', + }, +}); + class Mascot extends React.Component { static defaultProps = { emotion: MASCOT_STYLE.NORMAL, @@ -100,9 +134,9 @@ class Mascot extends React.Component { viewRef: AnimatableViewRefType; - eyeList: {[key in EYE_STYLE]: number}; + eyeList: { [key in EYE_STYLE]: number }; - glassesList: {[key in GLASSES_STYLE]: number}; + glassesList: { [key in GLASSES_STYLE]: number }; onPress: (viewRef: AnimatableViewRefType) => void; @@ -141,9 +175,9 @@ class Mascot extends React.Component { this.onPress = (viewRef: AnimatableViewRefType) => { const ref = viewRef.current; if (ref && ref.rubberBand) { - this.setState({currentEmotion: MASCOT_STYLE.LOVE}); + this.setState({ currentEmotion: MASCOT_STYLE.LOVE }); ref.rubberBand(1500).then(() => { - this.setState({currentEmotion: this.initialEmotion}); + this.setState({ currentEmotion: this.initialEmotion }); }); } }; @@ -155,9 +189,9 @@ class Mascot extends React.Component { this.onLongPress = (viewRef: AnimatableViewRefType) => { const ref = viewRef.current; if (ref && ref.tada) { - this.setState({currentEmotion: MASCOT_STYLE.ANGRY}); + this.setState({ currentEmotion: MASCOT_STYLE.ANGRY }); ref.tada(1000).then(() => { - this.setState({currentEmotion: this.initialEmotion}); + this.setState({ currentEmotion: this.initialEmotion }); }); } }; @@ -174,30 +208,22 @@ class Mascot extends React.Component { source={ glasses != null ? glasses : this.glassesList[GLASSES_STYLE.NORMAL] } - style={{ - position: 'absolute', - top: '15%', - left: 0, - width: '100%', - height: '100%', - }} + style={styles.glassesImage} /> ); } getEye(style: EYE_STYLE, isRight: boolean, rotation: string = '0deg') { const eye = this.eyeList[style]; + const left = isRight ? '-11%' : '11%'; return ( ); @@ -205,16 +231,7 @@ class Mascot extends React.Component { getEyes(emotion: MASCOT_STYLE) { const final = []; - final.push( - , - ); + final.push(); if (emotion === MASCOT_STYLE.CUTE) { final.push(this.getEye(EYE_STYLE.CUTE, true)); final.push(this.getEye(EYE_STYLE.CUTE, false)); @@ -249,32 +266,28 @@ class Mascot extends React.Component { } render() { - const {props, state} = this; + const { props, state } = this; const entryAnimation = props.animated ? props.entryAnimation : null; const loopAnimation = props.animated ? props.loopAnimation : null; return ( + {...entryAnimation} + > { this.onPress(this.viewRef); }} onLongPress={() => { this.onLongPress(this.viewRef); - }}> + }} + > - + {this.getEyes(state.currentEmotion)} diff --git a/src/components/Mascot/MascotPopup.tsx b/src/components/Mascot/MascotPopup.tsx index 0933027..d2df012 100644 --- a/src/components/Mascot/MascotPopup.tsx +++ b/src/components/Mascot/MascotPopup.tsx @@ -31,12 +31,14 @@ import { BackHandler, Dimensions, ScrollView, + StyleSheet, TouchableWithoutFeedback, View, } from 'react-native'; import Mascot from './Mascot'; import SpeechArrow from './SpeechArrow'; import AsyncStorageManager from '../../managers/AsyncStorageManager'; +import GENERAL_STYLES from '../../constants/Styles'; type PropsType = { theme: ReactNativePaper.Theme; @@ -67,6 +69,41 @@ type StateType = { dialogVisible: boolean; }; +const styles = StyleSheet.create({ + speechBubbleContainer: { + marginLeft: '10%', + marginRight: '10%', + }, + speechBubbleCard: { + borderWidth: 4, + borderRadius: 10, + }, + speechBubbleIcon: { + backgroundColor: 'transparent', + }, + speechBubbleText: { + marginBottom: 10, + }, + actionsContainer: { + marginTop: 10, + marginBottom: 10, + }, + button: { + ...GENERAL_STYLES.centerHorizontal, + marginBottom: 10, + }, + background: { + position: 'absolute', + backgroundColor: 'rgba(0,0,0,0.7)', + width: '100%', + height: '100%', + }, + container: { + marginTop: -80, + width: '100%', + }, +}); + /** * Component used to display a popup with the mascot. */ @@ -107,12 +144,13 @@ class MascotPopup extends React.Component { componentDidMount() { BackHandler.addEventListener( 'hardwareBackPress', - this.onBackButtonPressAndroid, + this.onBackButtonPressAndroid ); } shouldComponentUpdate(nextProps: PropsType, nextState: StateType): boolean { - const {props, state} = this; + // TODO this is so dirty it shouldn't even work + const { props, state } = this; if (nextProps.visible) { this.state.shouldRenderDialog = true; this.state.dialogVisible = true; @@ -134,10 +172,10 @@ class MascotPopup extends React.Component { }; onBackButtonPressAndroid = (): boolean => { - const {state, props} = this; + const { state, props } = this; if (state.dialogVisible) { - const {cancel} = props.buttons; - const {action} = props.buttons; + const { cancel } = props.buttons; + const { action } = props.buttons; if (cancel) { this.onDismiss(cancel.onPress); } else if (action) { @@ -152,27 +190,25 @@ class MascotPopup extends React.Component { }; getSpeechBubble() { - const {state, props} = this; + const { state, props } = this; return ( + duration={state.dialogVisible ? 1000 : 300} + > + ...styles.speechBubbleCard, + }} + > { ? () => ( @@ -191,13 +227,16 @@ class MascotPopup extends React.Component { + }} + > - {props.message} + + {props.message} + - + {this.getButtons()} @@ -206,14 +245,15 @@ class MascotPopup extends React.Component { } getMascot() { - const {props, state} = this; + const { props, state } = this; return ( + duration={state.dialogVisible ? 1500 : 200} + > @@ -222,45 +262,34 @@ class MascotPopup extends React.Component { } getButtons() { - const {props} = this; - const {action} = props.buttons; - const {cancel} = props.buttons; + const { props } = this; + const { action } = props.buttons; + const { cancel } = props.buttons; return ( - + {action != null ? ( ) : null} {cancel != null ? ( ) : null} @@ -269,19 +298,15 @@ class MascotPopup extends React.Component { } getBackground() { - const {props, state} = this; + const { props, state } = this; return ( { this.onDismiss(props.buttons.cancel?.onPress); - }}> + }} + > { } onDismiss = (callback?: () => void) => { - const {prefKey} = this.props; + const { prefKey } = this.props; if (prefKey != null) { AsyncStorageManager.set(prefKey, false); - this.setState({dialogVisible: false}); + this.setState({ dialogVisible: false }); } if (callback != null) { callback(); @@ -302,21 +327,13 @@ class MascotPopup extends React.Component { }; render() { - const {shouldRenderDialog} = this.state; + const { shouldRenderDialog } = this.state; if (shouldRenderDialog) { return ( {this.getBackground()} - - + + {this.getMascot()} {this.getSpeechBubble()} diff --git a/src/components/Mascot/SpeechArrow.tsx b/src/components/Mascot/SpeechArrow.tsx index 464a193..c76a243 100644 --- a/src/components/Mascot/SpeechArrow.tsx +++ b/src/components/Mascot/SpeechArrow.tsx @@ -18,7 +18,7 @@ */ import * as React from 'react'; -import {View, ViewStyle} from 'react-native'; +import { StyleSheet, View, ViewStyle } from 'react-native'; type PropsType = { style?: ViewStyle; @@ -26,20 +26,26 @@ type PropsType = { color: string; }; +const styles = StyleSheet.create({ + arrow: { + width: 0, + height: 0, + borderLeftWidth: 0, + borderStyle: 'solid', + backgroundColor: 'transparent', + borderLeftColor: 'transparent', + borderRightColor: 'transparent', + }, +}); + export default function SpeechArrow(props: PropsType) { return ( diff --git a/src/components/Media/ImageGalleryButton.tsx b/src/components/Media/ImageGalleryButton.tsx index 7075bfa..f840689 100644 --- a/src/components/Media/ImageGalleryButton.tsx +++ b/src/components/Media/ImageGalleryButton.tsx @@ -18,32 +18,36 @@ */ import * as React from 'react'; -import {TouchableRipple} from 'react-native-paper'; -import {Image} from 'react-native-animatable'; -import {useNavigation} from '@react-navigation/native'; -import {ViewStyle} from 'react-native'; +import { TouchableRipple } from 'react-native-paper'; +import { Image } from 'react-native-animatable'; +import { useNavigation } from '@react-navigation/native'; +import { StyleSheet, ViewStyle } from 'react-native'; type PropsType = { - images: Array<{url: string}>; + images: Array<{ url: string }>; style: ViewStyle; }; +const styles = StyleSheet.create({ + image: { + width: '100%', + height: '100%', + }, +}); + function ImageGalleryButton(props: PropsType) { const navigation = useNavigation(); const onPress = () => { - navigation.navigate('gallery', {images: props.images}); + navigation.navigate('gallery', { images: props.images }); }; return ( ); diff --git a/src/components/Overrides/CustomAgenda.tsx b/src/components/Overrides/CustomAgenda.tsx index 47dd166..c624122 100644 --- a/src/components/Overrides/CustomAgenda.tsx +++ b/src/components/Overrides/CustomAgenda.tsx @@ -18,9 +18,10 @@ */ import * as React from 'react'; -import {View} from 'react-native'; -import {useTheme} from 'react-native-paper'; -import {Agenda, AgendaProps} from 'react-native-calendars'; +import { View } from 'react-native'; +import { useTheme } from 'react-native-paper'; +import { Agenda, AgendaProps } from 'react-native-calendars'; +import GENERAL_STYLES from '../../constants/Styles'; type PropsType = { onRef: (ref: Agenda) => void; @@ -67,7 +68,7 @@ function CustomAgenda(props: PropsType) { // Completely recreate the component on theme change to force theme reload if (theme.dark) { - return {getAgenda()}; + return {getAgenda()}; } return getAgenda(); } diff --git a/src/components/Overrides/CustomHTML.tsx b/src/components/Overrides/CustomHTML.tsx index 95edf84..948912f 100644 --- a/src/components/Overrides/CustomHTML.tsx +++ b/src/components/Overrides/CustomHTML.tsx @@ -18,9 +18,9 @@ */ import * as React from 'react'; -import {Text} from 'react-native-paper'; +import { Text } from 'react-native-paper'; import HTML from 'react-native-render-html'; -import {GestureResponderEvent, Linking} from 'react-native'; +import { GestureResponderEvent, Linking } from 'react-native'; type PropsType = { html: string; @@ -38,7 +38,7 @@ function CustomHTML(props: PropsType) { htmlAttribs: any, children: any, convertedCSSStyles: any, - passProps: any, + passProps: any ) => { return {children}; }; diff --git a/src/components/Overrides/CustomHeaderButton.tsx b/src/components/Overrides/CustomHeaderButton.tsx index c6c4efc..4cec51b 100644 --- a/src/components/Overrides/CustomHeaderButton.tsx +++ b/src/components/Overrides/CustomHeaderButton.tsx @@ -25,7 +25,7 @@ import { HeaderButtons, HeaderButtonsProps, } from 'react-navigation-header-buttons'; -import {useTheme} from 'react-native-paper'; +import { useTheme } from 'react-native-paper'; const MaterialHeaderButton = (props: HeaderButtonProps) => { const theme = useTheme(); @@ -40,7 +40,7 @@ const MaterialHeaderButton = (props: HeaderButtonProps) => { }; const MaterialHeaderButtons = ( - props: HeaderButtonsProps & {children?: React.ReactNode}, + props: HeaderButtonsProps & { children?: React.ReactNode } ) => { return ( @@ -49,4 +49,4 @@ const MaterialHeaderButtons = ( export default MaterialHeaderButtons; -export {Item} from 'react-navigation-header-buttons'; +export { Item } from 'react-navigation-header-buttons'; diff --git a/src/components/Overrides/CustomIntroSlider.tsx b/src/components/Overrides/CustomIntroSlider.tsx index d773d42..ca2ec57 100644 --- a/src/components/Overrides/CustomIntroSlider.tsx +++ b/src/components/Overrides/CustomIntroSlider.tsx @@ -30,13 +30,14 @@ import i18n from 'i18n-js'; import AppIntroSlider from 'react-native-app-intro-slider'; import LinearGradient from 'react-native-linear-gradient'; import * as Animatable from 'react-native-animatable'; -import {Card} from 'react-native-paper'; +import { Card } from 'react-native-paper'; import Update from '../../constants/Update'; import ThemeManager from '../../managers/ThemeManager'; -import Mascot, {MASCOT_STYLE} from '../Mascot/Mascot'; +import Mascot, { MASCOT_STYLE } from '../Mascot/Mascot'; import MascotIntroWelcome from '../Intro/MascotIntroWelcome'; import IntroIcon from '../Intro/IconIntro'; import MascotIntroEnd from '../Intro/MascotIntroEnd'; +import GENERAL_STYLES from '../../constants/Styles'; type PropsType = { onDone: () => void; @@ -75,11 +76,42 @@ const styles = StyleSheet.create({ textAlign: 'center', marginBottom: 16, }, - center: { - marginTop: 'auto', - marginBottom: 'auto', - marginRight: 'auto', - marginLeft: 'auto', + mascot: { + marginLeft: 30, + marginBottom: 0, + width: 100, + marginTop: -30, + }, + speechArrow: { + marginLeft: 50, + width: 0, + height: 0, + borderLeftWidth: 20, + borderRightWidth: 0, + borderBottomWidth: 20, + borderStyle: 'solid', + backgroundColor: 'transparent', + borderLeftColor: 'transparent', + borderRightColor: 'transparent', + borderBottomColor: 'rgba(0,0,0,0.60)', + }, + card: { + backgroundColor: 'rgba(0,0,0,0.38)', + marginHorizontal: 20, + borderColor: 'rgba(0,0,0,0.60)', + borderWidth: 4, + borderRadius: 10, + elevation: 0, + }, + nextButtonContainer: { + borderRadius: 25, + padding: 5, + backgroundColor: 'rgba(0,0,0,0.2)', + }, + doneButtonContainer: { + borderRadius: 25, + padding: 5, + backgroundColor: 'rgb(190,21,34)', }, }); @@ -90,7 +122,7 @@ export default class CustomIntroSlider extends React.Component< PropsType, StateType > { - sliderRef: {current: null | AppIntroSlider}; + sliderRef: { current: null | AppIntroSlider }; introSlides: Array; @@ -173,31 +205,27 @@ export default class CustomIntroSlider extends React.Component< getIntroRenderItem = ( data: | (ListRenderItemInfo & { - dimensions: {width: number; height: number}; + dimensions: { width: number; height: number }; }) - | ListRenderItemInfo, + | ListRenderItemInfo ) => { const item = data.item; - const {state} = this; + const { state } = this; const index = parseInt(item.key, 10); return ( + start={{ x: 0, y: 0.1 }} + end={{ x: 0.1, y: 1 }} + > {state.currentSlide === index ? ( - - {item.view()} + + {item.view()} {item.mascotStyle != null ? ( ) : null} - - + + + style={styles.title} + > {item.title} + style={styles.text} + > {item.text} @@ -267,12 +275,12 @@ export default class CustomIntroSlider extends React.Component< onSlideChange = (index: number) => { CustomIntroSlider.setStatusBarColor(this.currentSlides[index].colors[0]); - this.setState({currentSlide: index}); + this.setState({ currentSlide: index }); }; onSkip = () => { CustomIntroSlider.setStatusBarColor( - this.currentSlides[this.currentSlides.length - 1].colors[0], + this.currentSlides[this.currentSlides.length - 1].colors[0] ); if (this.sliderRef.current != null) { this.sliderRef.current.goToSlide(this.currentSlides.length - 1); @@ -280,9 +288,9 @@ export default class CustomIntroSlider extends React.Component< }; onDone = () => { - const {props} = this; + const { props } = this; CustomIntroSlider.setStatusBarColor( - ThemeManager.getCurrentTheme().colors.surface, + ThemeManager.getCurrentTheme().colors.surface ); props.onDone(); }; @@ -292,11 +300,8 @@ export default class CustomIntroSlider extends React.Component< + style={styles.nextButtonContainer} + > ); @@ -307,18 +312,15 @@ export default class CustomIntroSlider extends React.Component< + style={styles.doneButtonContainer} + > ); }; render() { - const {props, state} = this; + const { props, state } = this; this.currentSlides = this.introSlides; if (props.isUpdate) { this.currentSlides = this.updateSlides; diff --git a/src/components/Overrides/CustomModal.tsx b/src/components/Overrides/CustomModal.tsx index 54b8cf0..cbcb07e 100644 --- a/src/components/Overrides/CustomModal.tsx +++ b/src/components/Overrides/CustomModal.tsx @@ -18,9 +18,9 @@ */ import * as React from 'react'; -import {useTheme} from 'react-native-paper'; -import {Modalize} from 'react-native-modalize'; -import {View} from 'react-native-animatable'; +import { useTheme } from 'react-native-paper'; +import { Modalize } from 'react-native-modalize'; +import { View } from 'react-native-animatable'; import CustomTabBar from '../Tabbar/CustomTabBar'; /** @@ -34,18 +34,20 @@ function CustomModal(props: { children?: React.ReactNode; }) { const theme = useTheme(); - const {onRef, children} = props; + const { onRef, children } = props; return ( + modalStyle={{ backgroundColor: theme.colors.card }} + handleStyle={{ backgroundColor: theme.colors.primary }} + > + }} + > {children} diff --git a/src/components/Overrides/CustomSlider.tsx b/src/components/Overrides/CustomSlider.tsx index 9bb92ab..9f6fa27 100644 --- a/src/components/Overrides/CustomSlider.tsx +++ b/src/components/Overrides/CustomSlider.tsx @@ -18,15 +18,28 @@ */ import * as React from 'react'; -import {Text} from 'react-native-paper'; -import {View} from 'react-native-animatable'; -import Slider, {SliderProps} from '@react-native-community/slider'; -import {useState} from 'react'; +import { Text } from 'react-native-paper'; +import { View } from 'react-native-animatable'; +import Slider, { SliderProps } from '@react-native-community/slider'; +import { useState } from 'react'; +import { StyleSheet } from 'react-native'; type PropsType = { valueSuffix?: string; } & SliderProps; +const styles = StyleSheet.create({ + container: { + flex: 1, + flexDirection: 'row', + }, + text: { + marginHorizontal: 10, + marginTop: 'auto', + marginBottom: 'auto', + }, +}); + /** * Abstraction layer for Modalize component, using custom configuration * @@ -44,15 +57,8 @@ function CustomSlider(props: PropsType) { }; return ( - - - {currentValue}min - + + {currentValue}min ); diff --git a/src/components/Screens/BasicLoadingScreen.tsx b/src/components/Screens/BasicLoadingScreen.tsx index 95d55d6..c997bd6 100644 --- a/src/components/Screens/BasicLoadingScreen.tsx +++ b/src/components/Screens/BasicLoadingScreen.tsx @@ -17,16 +17,24 @@ * along with Campus INSAT. If not, see . */ -// @flow - import * as React from 'react'; -import {View} from 'react-native'; -import {ActivityIndicator, useTheme} from 'react-native-paper'; +import { StyleSheet, View } from 'react-native'; +import { ActivityIndicator, useTheme } from 'react-native-paper'; type Props = { isAbsolute?: boolean; }; +const styles = StyleSheet.create({ + container: { + top: 0, + right: 0, + width: '100%', + height: '100%', + justifyContent: 'center', + }, +}); + /** * Component used to display a header button * @@ -35,18 +43,16 @@ type Props = { */ export default function BasicLoadingScreen(props: Props) { const theme = useTheme(); - const {isAbsolute} = props; + const { isAbsolute } = props; + const position = isAbsolute ? 'absolute' : 'relative'; return ( + position: position, + ...styles.container, + }} + > ); diff --git a/src/components/Screens/ErrorView.tsx b/src/components/Screens/ErrorView.tsx index 2e57a8e..129fd34 100644 --- a/src/components/Screens/ErrorView.tsx +++ b/src/components/Screens/ErrorView.tsx @@ -18,18 +18,18 @@ */ import * as React from 'react'; -import {Button, Subheading, withTheme} from 'react-native-paper'; -import {StyleSheet, View} from 'react-native'; +import { Button, Subheading, withTheme } from 'react-native-paper'; +import { StyleSheet, View } from 'react-native'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import i18n from 'i18n-js'; import * as Animatable from 'react-native-animatable'; -import {StackNavigationProp} from '@react-navigation/stack'; -import {ERROR_TYPE} from '../../utils/WebData'; +import { StackNavigationProp } from '@react-navigation/stack'; +import { ERROR_TYPE } from '../../utils/WebData'; type PropsType = { navigation?: StackNavigationProp; theme: ReactNativePaper.Theme; - route?: {name: string}; + route?: { name: string }; onRefresh?: () => void; errorCode?: number; icon?: string; @@ -84,13 +84,14 @@ class ErrorView extends React.PureComponent { } getRetryButton() { - const {props} = this; + const { props } = this; return ( ); @@ -102,24 +103,25 @@ class ErrorView extends React.PureComponent { mode="contained" icon="login" onPress={this.goToLogin} - style={styles.button}> + style={styles.button} + > {i18n.t('screens.login.title')} ); } goToLogin = () => { - const {props} = this; + const { props } = this; if (props.navigation) { props.navigation.navigate('login', { screen: 'login', - params: {nextScreen: props.route ? props.route.name : undefined}, + params: { nextScreen: props.route ? props.route.name : undefined }, }); } }; generateMessage() { - const {props} = this; + const { props } = this; this.showLoginButton = false; if (props.errorCode !== 0) { switch (props.errorCode) { @@ -171,7 +173,7 @@ class ErrorView extends React.PureComponent { } render() { - const {props} = this; + const { props } = this; this.generateMessage(); let button; if (this.showLoginButton) { @@ -190,7 +192,8 @@ class ErrorView extends React.PureComponent { }} animation="zoomIn" duration={200} - useNativeDriver> + useNativeDriver + > { style={{ ...styles.subheading, color: props.theme.colors.textDisabled, - }}> + }} + > {this.message} {button} diff --git a/src/components/Screens/WebSectionList.tsx b/src/components/Screens/WebSectionList.tsx index a080d1c..9abd227 100644 --- a/src/components/Screens/WebSectionList.tsx +++ b/src/components/Screens/WebSectionList.tsx @@ -19,21 +19,22 @@ import * as React from 'react'; import i18n from 'i18n-js'; -import {Snackbar} from 'react-native-paper'; +import { Snackbar } from 'react-native-paper'; import { NativeSyntheticEvent, RefreshControl, SectionListData, + StyleSheet, View, } from 'react-native'; import * as Animatable from 'react-native-animatable'; -import {Collapsible} from 'react-navigation-collapsible'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { Collapsible } from 'react-navigation-collapsible'; +import { StackNavigationProp } from '@react-navigation/stack'; import ErrorView from './ErrorView'; import BasicLoadingScreen from './BasicLoadingScreen'; import withCollapsible from '../../utils/withCollapsible'; import CustomTabBar from '../Tabbar/CustomTabBar'; -import {ERROR_TYPE, readData} from '../../utils/WebData'; +import { ERROR_TYPE, readData } from '../../utils/WebData'; import CollapsibleSectionList from '../Collapsible/CollapsibleSectionList'; export type SectionListDataType = Array<{ @@ -48,10 +49,10 @@ type PropsType = { fetchUrl: string; autoRefreshTime: number; refreshOnFocus: boolean; - renderItem: (data: {item: ItemT}) => React.ReactNode; + renderItem: (data: { item: ItemT }) => React.ReactNode; createDataset: ( data: RawData | null, - isLoading?: boolean, + isLoading?: boolean ) => SectionListDataType; onScroll: (event: NativeSyntheticEvent) => void; collapsibleStack: Collapsible; @@ -60,11 +61,11 @@ type PropsType = { itemHeight?: number | null; updateData?: number; renderListHeaderComponent?: ( - data: RawData | null, + data: RawData | null ) => React.ComponentType | React.ReactElement | null; renderSectionHeader?: ( - data: {section: SectionListData}, - isLoading?: boolean, + data: { section: SectionListData }, + isLoading?: boolean ) => React.ReactElement | null; stickyHeader?: boolean; }; @@ -77,6 +78,12 @@ type StateType = { const MIN_REFRESH_TIME = 5 * 1000; +const styles = StyleSheet.create({ + container: { + minHeight: '100%', + }, +}); + /** * Component used to render a SectionList with data fetched from the web * @@ -114,7 +121,7 @@ class WebSectionList extends React.PureComponent< * Allows to detect when the screen is focused */ componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; navigation.addListener('focus', this.onScreenFocus); navigation.addListener('blur', this.onScreenBlur); this.lastRefresh = undefined; @@ -125,7 +132,7 @@ class WebSectionList extends React.PureComponent< * Refreshes data when focusing the screen and setup a refresh interval if asked to */ onScreenFocus = () => { - const {props} = this; + const { props } = this; if (props.refreshOnFocus && this.lastRefresh) { setTimeout(this.onRefresh, 200); } @@ -173,7 +180,7 @@ class WebSectionList extends React.PureComponent< * Refreshes data and shows an animations while doing it */ onRefresh = () => { - const {fetchUrl} = this.props; + const { fetchUrl } = this.props; let canRefresh; if (this.lastRefresh != null) { const last = this.lastRefresh; @@ -182,7 +189,7 @@ class WebSectionList extends React.PureComponent< canRefresh = true; } if (canRefresh) { - this.setState({refreshing: true}); + this.setState({ refreshing: true }); readData(fetchUrl).then(this.onFetchSuccess).catch(this.onFetchError); } }; @@ -191,21 +198,21 @@ class WebSectionList extends React.PureComponent< * Shows the error popup */ showSnackBar = () => { - this.setState({snackbarVisible: true}); + this.setState({ snackbarVisible: true }); }; /** * Hides the error popup */ hideSnackBar = () => { - this.setState({snackbarVisible: false}); + this.setState({ snackbarVisible: false }); }; getItemLayout = ( height: number, data: Array> | null, - index: number, - ): {length: number; offset: number; index: number} => { + index: number + ): { length: number; offset: number; index: number } => { return { length: height, offset: height * index, @@ -213,9 +220,9 @@ class WebSectionList extends React.PureComponent< }; }; - getRenderSectionHeader = (data: {section: SectionListData}) => { - const {renderSectionHeader} = this.props; - const {refreshing} = this.state; + getRenderSectionHeader = (data: { section: SectionListData }) => { + const { renderSectionHeader } = this.props; + const { refreshing } = this.state; if (renderSectionHeader != null) { return ( @@ -226,8 +233,8 @@ class WebSectionList extends React.PureComponent< return null; }; - getRenderItem = (data: {item: ItemT}) => { - const {renderItem} = this.props; + getRenderItem = (data: { item: ItemT }) => { + const { renderItem } = this.props; return ( {renderItem(data)} @@ -236,15 +243,15 @@ class WebSectionList extends React.PureComponent< }; onScroll = (event: NativeSyntheticEvent) => { - const {onScroll} = this.props; + const { onScroll } = this.props; if (onScroll != null) { onScroll(event); } }; render() { - const {props, state} = this; - const {itemHeight} = props; + const { props, state } = this; + const { itemHeight } = props; let dataset: SectionListDataType = []; if ( state.fetchedData != null || @@ -253,7 +260,7 @@ class WebSectionList extends React.PureComponent< dataset = props.createDataset(state.fetchedData, state.refreshing); } - const {containerPaddingTop} = props.collapsibleStack; + const { containerPaddingTop } = props.collapsibleStack; return ( extends React.PureComponent< renderSectionHeader={this.getRenderSectionHeader} renderItem={this.getRenderItem} stickySectionHeadersEnabled={props.stickyHeader} - style={{minHeight: '100%'}} + style={styles.container} ListHeaderComponent={ props.renderListHeaderComponent != null ? props.renderListHeaderComponent(state.fetchedData) @@ -304,7 +311,8 @@ class WebSectionList extends React.PureComponent< duration={4000} style={{ bottom: CustomTabBar.TAB_BAR_HEIGHT, - }}> + }} + > {i18n.t('general.listUpdateFail')} diff --git a/src/components/Screens/WebViewScreen.tsx b/src/components/Screens/WebViewScreen.tsx index fe2c9b6..38cef0e 100644 --- a/src/components/Screens/WebViewScreen.tsx +++ b/src/components/Screens/WebViewScreen.tsx @@ -31,14 +31,15 @@ import { Linking, NativeScrollEvent, NativeSyntheticEvent, + StyleSheet, } from 'react-native'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; -import {withTheme} from 'react-native-paper'; -import {StackNavigationProp} from '@react-navigation/stack'; -import {Collapsible} from 'react-navigation-collapsible'; +import { withTheme } from 'react-native-paper'; +import { StackNavigationProp } from '@react-navigation/stack'; +import { Collapsible } from 'react-navigation-collapsible'; import withCollapsible from '../../utils/withCollapsible'; -import MaterialHeaderButtons, {Item} from '../Overrides/CustomHeaderButton'; -import {ERROR_TYPE} from '../../utils/WebData'; +import MaterialHeaderButtons, { Item } from '../Overrides/CustomHeaderButton'; +import { ERROR_TYPE } from '../../utils/WebData'; import ErrorView from './ErrorView'; import BasicLoadingScreen from './BasicLoadingScreen'; @@ -47,7 +48,7 @@ type PropsType = { theme: ReactNativePaper.Theme; url: string; collapsibleStack: Collapsible; - onMessage: (event: {nativeEvent: {data: string}}) => void; + onMessage: (event: { nativeEvent: { data: string } }) => void; onScroll: (event: NativeSyntheticEvent) => void; customJS?: string; customPaddingFunction?: null | ((padding: number) => string); @@ -56,6 +57,12 @@ type PropsType = { const AnimatedWebView = Animated.createAnimatedComponent(WebView); +const styles = StyleSheet.create({ + overflow: { + marginHorizontal: 10, + }, +}); + /** * Class defining a webview screen. */ @@ -68,7 +75,7 @@ class WebViewScreen extends React.PureComponent { currentUrl: string; - webviewRef: {current: null | WebView}; + webviewRef: { current: null | WebView }; canGoBack: boolean; @@ -83,7 +90,7 @@ class WebViewScreen extends React.PureComponent { * Creates header buttons and listens to events after mounting */ componentDidMount() { - const {props} = this; + const { props } = this; props.navigation.setOptions({ headerRight: props.showAdvancedControls ? this.getAdvancedButtons @@ -92,13 +99,13 @@ class WebViewScreen extends React.PureComponent { props.navigation.addListener('focus', () => { BackHandler.addEventListener( 'hardwareBackPress', - this.onBackButtonPressAndroid, + this.onBackButtonPressAndroid ); }); props.navigation.addListener('blur', () => { BackHandler.removeEventListener( 'hardwareBackPress', - this.onBackButtonPressAndroid, + this.onBackButtonPressAndroid ); }); } @@ -145,7 +152,7 @@ class WebViewScreen extends React.PureComponent { * @returns {*} */ getAdvancedButtons = () => { - const {props} = this; + const { props } = this; return ( { onPress={this.onRefreshClicked} /> - }> + } + > { * @returns {string} */ getJavascriptPadding(padding: number): string { - const {props} = this; + const { props } = this; const customPadding = props.customPaddingFunction != null ? props.customPaddingFunction(padding) @@ -229,7 +237,7 @@ class WebViewScreen extends React.PureComponent { }; onScroll = (event: NativeSyntheticEvent) => { - const {onScroll} = this.props; + const { onScroll } = this.props; if (onScroll) { onScroll(event); } @@ -247,12 +255,15 @@ class WebViewScreen extends React.PureComponent { }; render() { - const {props} = this; - const {containerPaddingTop, onScrollWithListener} = props.collapsibleStack; + const { props } = this; + const { + containerPaddingTop, + onScrollWithListener, + } = props.collapsibleStack; return ( { static TAB_BAR_HEIGHT = 48; @@ -71,7 +81,7 @@ class CustomTabBar extends React.Component { * @param destIndex The destination route index */ onItemPress(route: RouteType, currentIndex: number, destIndex: number) { - const {navigation} = this.props; + const { navigation } = this.props; if (currentIndex !== destIndex) { navigation.navigate(route.name); } @@ -83,7 +93,7 @@ class CustomTabBar extends React.Component { * @param route */ onItemLongPress(route: RouteType) { - const {navigation} = this.props; + const { navigation } = this.props; if (route.name === 'home') { navigation.navigate('game-start'); } @@ -93,7 +103,7 @@ class CustomTabBar extends React.Component { * Finds the active route and syncs the tab bar animation with the header bar */ onRouteChange = () => { - const {props} = this; + const { props } = this; props.state.routes.map(this.syncTabBar); }; @@ -122,9 +132,9 @@ class CustomTabBar extends React.Component { * @returns {*} */ getRenderIcon = (route: RouteType, index: number) => { - const {props} = this; - const {state} = props; - const {options} = props.descriptors[route.key]; + const { props } = this; + const { state } = props; + const { options } = props.descriptors[route.key]; let label; if (options.tabBarLabel != null) { label = options.tabBarLabel; @@ -171,12 +181,12 @@ class CustomTabBar extends React.Component { }; getIcons() { - const {props} = this; + const { props } = this; return props.state.routes.map(this.getRenderIcon); } syncTabBar = (route: RouteType, index: number) => { - const {state} = this.props; + const { state } = this.props; const isFocused = state.index === index; if (isFocused) { const stackState = route.state; @@ -184,8 +194,8 @@ class CustomTabBar extends React.Component { stackState && stackState.index != null ? stackState.routes[stackState.index] : null; - const params: {collapsible: Collapsible} | null | undefined = stackRoute - ? (stackRoute.params as {collapsible: Collapsible}) + const params: { collapsible: Collapsible } | null | undefined = stackRoute + ? (stackRoute.params as { collapsible: Collapsible }) : null; const collapsible = params != null ? params.collapsible : null; if (collapsible != null) { @@ -197,20 +207,17 @@ class CustomTabBar extends React.Component { }; render() { - const {props, state} = this; + const { props, state } = this; const icons = this.getIcons(); return ( + transform: [{ translateY: state.translateY }], + ...styles.container, + }} + > {icons} ); diff --git a/src/components/Tabbar/TabHomeIcon.tsx b/src/components/Tabbar/TabHomeIcon.tsx index 8d9b1fd..d5c2614 100644 --- a/src/components/Tabbar/TabHomeIcon.tsx +++ b/src/components/Tabbar/TabHomeIcon.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {Image, View} from 'react-native'; -import {FAB} from 'react-native-paper'; +import { Image, StyleSheet, View } from 'react-native'; +import { FAB } from 'react-native-paper'; import * as Animatable from 'react-native-animatable'; const FOCUSED_ICON = require('../../../assets/tab-icon.png'); const UNFOCUSED_ICON = require('../../../assets/tab-icon-outline.png'); @@ -33,6 +33,25 @@ type PropsType = { const AnimatedFAB = Animatable.createAnimatableComponent(FAB); +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + }, + subcontainer: { + position: 'absolute', + bottom: 0, + left: 0, + width: '100%', + marginBottom: -15, + }, + fab: { + marginTop: 15, + marginLeft: 'auto', + marginRight: 'auto', + }, +}); + /** * Abstraction layer for Agenda component, using custom configuration */ @@ -70,12 +89,12 @@ class TabHomeIcon extends React.Component { } shouldComponentUpdate(nextProps: PropsType): boolean { - const {focused} = this.props; + const { focused } = this.props; return nextProps.focused !== focused; } - getIconRender = ({size, color}: {size: number; color: string}) => { - const {focused} = this.props; + getIconRender = ({ size, color }: { size: number; color: string }) => { + const { focused } = this.props; return ( { }; render() { - const {props} = this; + const { props } = this; return ( - + + ...styles.subcontainer, + }} + > { icon={this.getIconRender} onPress={props.onPress} onLongPress={props.onLongPress} - style={{ - marginTop: 15, - marginLeft: 'auto', - marginRight: 'auto', - }} + style={styles.fab} /> diff --git a/src/components/Tabbar/TabIcon.tsx b/src/components/Tabbar/TabIcon.tsx index ee7d543..e674741 100644 --- a/src/components/Tabbar/TabIcon.tsx +++ b/src/components/Tabbar/TabIcon.tsx @@ -18,10 +18,11 @@ */ import * as React from 'react'; -import {View} from 'react-native'; -import {TouchableRipple, withTheme} from 'react-native-paper'; +import { StyleSheet, View } from 'react-native'; +import { TouchableRipple, withTheme } from 'react-native-paper'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import * as Animatable from 'react-native-animatable'; +import GENERAL_STYLES from '../../constants/Styles'; type PropsType = { focused: boolean; @@ -34,6 +35,19 @@ type PropsType = { extraData: null | boolean | number | string; }; +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + borderRadius: 10, + }, + text: { + marginLeft: 'auto', + marginRight: 'auto', + fontSize: 10, + }, +}); + /** * Abstraction layer for Agenda component, using custom configuration */ @@ -78,7 +92,7 @@ class TabIcon extends React.Component { } shouldComponentUpdate(nextProps: PropsType): boolean { - const {props} = this; + const { props } = this; return ( nextProps.focused !== props.focused || nextProps.theme.dark !== props.theme.dark || @@ -87,32 +101,27 @@ class TabIcon extends React.Component { } render() { - const {props} = this; + const { props } = this; return ( + borderless={true} + style={styles.container} + > + useNativeDriver + > { useNativeDriver style={{ color: props.color, - marginLeft: 'auto', - marginRight: 'auto', - fontSize: 10, - }}> + ...styles.text, + }} + > {props.label} diff --git a/src/constants/NewsSourcesConstants.ts b/src/constants/NewsSourcesConstants.ts index 1e5ecd3..e3cab9d 100644 --- a/src/constants/NewsSourcesConstants.ts +++ b/src/constants/NewsSourcesConstants.ts @@ -17,8 +17,6 @@ * along with Campus INSAT. If not, see . */ -// @flow - const ICON_AMICALE = require('../../assets/amicale.png'); const ICON_CAMPUS = require('../../assets/android.icon.png'); diff --git a/src/constants/Styles.tsx b/src/constants/Styles.tsx new file mode 100644 index 0000000..036c074 --- /dev/null +++ b/src/constants/Styles.tsx @@ -0,0 +1,23 @@ +import { StyleSheet } from 'react-native'; + +const GENERAL_STYLES = StyleSheet.create({ + centerHorizontal: { + marginLeft: 'auto', + marginRight: 'auto', + }, + centerVertical: { + marginTop: 'auto', + marginBottom: 'auto', + }, + center: { + marginLeft: 'auto', + marginRight: 'auto', + marginTop: 'auto', + marginBottom: 'auto', + }, + flex: { + flex: 1, + }, +}); + +export default GENERAL_STYLES; diff --git a/src/constants/Update.tsx b/src/constants/Update.tsx index 807b088..0ed64d6 100644 --- a/src/constants/Update.tsx +++ b/src/constants/Update.tsx @@ -19,7 +19,7 @@ import * as React from 'react'; import i18n from 'i18n-js'; -import type {IntroSlideType} from '../components/Overrides/CustomIntroSlider'; +import type { IntroSlideType } from '../components/Overrides/CustomIntroSlider'; import MascotIntroWelcome from '../components/Intro/MascotIntroWelcome'; import IntroIcon from '../components/Intro/IconIntro'; diff --git a/src/managers/AprilFoolsManager.ts b/src/managers/AprilFoolsManager.ts index d609db0..ff04e9c 100644 --- a/src/managers/AprilFoolsManager.ts +++ b/src/managers/AprilFoolsManager.ts @@ -17,8 +17,8 @@ * along with Campus INSAT. If not, see . */ -import type {ProxiwashMachineType} from '../screens/Proxiwash/ProxiwashScreen'; -import type {RuFoodCategoryType} from '../screens/Services/SelfMenuScreen'; +import type { ProxiwashMachineType } from '../screens/Proxiwash/ProxiwashScreen'; +import type { RuFoodCategoryType } from '../screens/Services/SelfMenuScreen'; /** * Singleton class used to manage april fools @@ -67,13 +67,13 @@ export default class AprilFoolsManager { * @returns {Object} */ static getFakeMenuItem( - menu: Array, + menu: Array ): Array { - menu[1].dishes.splice(4, 0, {name: 'Coq au vin'}); - menu[1].dishes.splice(2, 0, {name: "Bat'Soupe"}); - menu[1].dishes.splice(1, 0, {name: 'Pave de loup'}); - menu[1].dishes.splice(0, 0, {name: 'Béranger à point'}); - menu[1].dishes.splice(0, 0, {name: "Pieds d'Arnaud"}); + menu[1].dishes.splice(4, 0, { name: 'Coq au vin' }); + menu[1].dishes.splice(2, 0, { name: "Bat'Soupe" }); + menu[1].dishes.splice(1, 0, { name: 'Pave de loup' }); + menu[1].dishes.splice(0, 0, { name: 'Béranger à point' }); + menu[1].dishes.splice(0, 0, { name: "Pieds d'Arnaud" }); return menu; } @@ -83,7 +83,7 @@ export default class AprilFoolsManager { * @param dryers */ static getNewProxiwashDryerOrderedList( - dryers: Array | null, + dryers: Array | null ) { if (dryers != null) { const second = dryers[1]; @@ -98,7 +98,7 @@ export default class AprilFoolsManager { * @param washers */ static getNewProxiwashWasherOrderedList( - washers: Array | null, + washers: Array | null ) { if (washers != null) { const first = washers[0]; @@ -129,7 +129,7 @@ export default class AprilFoolsManager { * @returns {{colors: {textDisabled: string, agendaDayTextColor: string, surface: string, background: string, dividerBackground: string, accent: string, agendaBackgroundColor: string, tabIcon: string, card: string, primary: string}}} */ static getAprilFoolsTheme( - currentTheme: ReactNativePaper.Theme, + currentTheme: ReactNativePaper.Theme ): ReactNativePaper.Theme { return { ...currentTheme, diff --git a/src/managers/AsyncStorageManager.ts b/src/managers/AsyncStorageManager.ts index ac0155c..178cef0 100644 --- a/src/managers/AsyncStorageManager.ts +++ b/src/managers/AsyncStorageManager.ts @@ -18,7 +18,7 @@ */ import AsyncStorage from '@react-native-community/async-storage'; -import {SERVICES_KEY} from './ServicesManager'; +import { SERVICES_KEY } from './ServicesManager'; /** * Singleton used to manage preferences. @@ -29,7 +29,7 @@ import {SERVICES_KEY} from './ServicesManager'; export default class AsyncStorageManager { static instance: AsyncStorageManager | null = null; - static PREFERENCES: {[key: string]: {key: string; default: string}} = { + static PREFERENCES: { [key: string]: { key: string; default: string } } = { debugUnlocked: { key: 'debugUnlocked', default: '0', @@ -130,7 +130,7 @@ export default class AsyncStorageManager { }, }; - private currentPreferences: {[key: string]: string}; + private currentPreferences: { [key: string]: string }; constructor() { this.currentPreferences = {}; @@ -155,7 +155,7 @@ export default class AsyncStorageManager { */ static set( key: string, - value: number | string | boolean | object | Array, + value: number | string | boolean | object | Array ) { AsyncStorageManager.getInstance().setPreference(key, value); } @@ -209,7 +209,7 @@ export default class AsyncStorageManager { * @return {Promise} */ async loadPreferences() { - return new Promise((resolve: () => void) => { + return new Promise((resolve: (val: void) => void) => { const prefKeys: Array = []; // Get all available keys Object.keys(AsyncStorageManager.PREFERENCES).forEach((key: string) => { @@ -240,7 +240,7 @@ export default class AsyncStorageManager { */ setPreference( key: string, - value: number | string | boolean | object | Array, + value: number | string | boolean | object | Array ) { if (AsyncStorageManager.PREFERENCES[key] != null) { let convertedValue; diff --git a/src/managers/ConnectionManager.ts b/src/managers/ConnectionManager.ts index a200486..12227d8 100644 --- a/src/managers/ConnectionManager.ts +++ b/src/managers/ConnectionManager.ts @@ -17,11 +17,9 @@ * along with Campus INSAT. If not, see . */ -// @flow - import * as Keychain from 'react-native-keychain'; -import type {ApiDataLoginType} from '../utils/WebData'; -import {apiRequest, ERROR_TYPE} from '../utils/WebData'; +import type { ApiDataLoginType } from '../utils/WebData'; +import { apiRequest, ERROR_TYPE } from '../utils/WebData'; /** * champ: error @@ -84,7 +82,7 @@ export default class ConnectionManager { } resolve(); }) - .catch(resolve); + .catch(() => resolve()); } }); } @@ -159,7 +157,7 @@ export default class ConnectionManager { } }) .catch((error: number): void => reject(error)); - }, + } ); } @@ -172,7 +170,7 @@ export default class ConnectionManager { */ async authenticatedRequest( path: string, - params: {[key: string]: any}, + params: { [key: string]: any } ): Promise { return new Promise( (resolve: (response: T) => void, reject: (error: number) => void) => { @@ -187,7 +185,7 @@ export default class ConnectionManager { } else { reject(ERROR_TYPE.TOKEN_RETRIEVE); } - }, + } ); } } diff --git a/src/managers/DashboardManager.ts b/src/managers/DashboardManager.ts index 12035a6..34417c7 100644 --- a/src/managers/DashboardManager.ts +++ b/src/managers/DashboardManager.ts @@ -17,17 +17,15 @@ * along with Campus INSAT. If not, see . */ -// @flow - -import type {ServiceItemType} from './ServicesManager'; +import type { ServiceItemType } from './ServicesManager'; import ServicesManager from './ServicesManager'; -import {getSublistWithIds} from '../utils/Services'; +import { getSublistWithIds } from '../utils/Services'; import AsyncStorageManager from './AsyncStorageManager'; export default class DashboardManager extends ServicesManager { getCurrentDashboard(): Array { const dashboardIdList = AsyncStorageManager.getObject>( - AsyncStorageManager.PREFERENCES.dashboardItems.key, + AsyncStorageManager.PREFERENCES.dashboardItems.key ); const allDatasets = [ ...this.amicaleDataset, diff --git a/src/managers/DateManager.ts b/src/managers/DateManager.ts index f699e68..02b4207 100644 --- a/src/managers/DateManager.ts +++ b/src/managers/DateManager.ts @@ -84,7 +84,7 @@ export default class DateManager { date.setFullYear( parseInt(dateArray[0], 10), parseInt(dateArray[1], 10) - 1, - parseInt(dateArray[2], 10), + parseInt(dateArray[2], 10) ); return `${this.daysOfWeek[date.getDay()]} ${date.getDate()} ${ this.monthsOfYear[date.getMonth()] diff --git a/src/managers/ServicesManager.ts b/src/managers/ServicesManager.ts index c1c6eb8..c16bfc0 100644 --- a/src/managers/ServicesManager.ts +++ b/src/managers/ServicesManager.ts @@ -18,10 +18,10 @@ */ import i18n from 'i18n-js'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { StackNavigationProp } from '@react-navigation/stack'; import AvailableWebsites from '../constants/AvailableWebsites'; import ConnectionManager from './ConnectionManager'; -import type {FullDashboardType} from '../screens/Home/HomeScreen'; +import type { FullDashboardType } from '../screens/Home/HomeScreen'; import getStrippedServicesList from '../utils/Services'; // AMICALE @@ -337,7 +337,7 @@ export default class ServicesManager { if (ConnectionManager.getInstance().isLoggedIn()) { this.navigation.navigate(route); } else { - this.navigation.navigate('login', {nextScreen: route}); + this.navigation.navigate('login', { nextScreen: route }); } } diff --git a/src/managers/ThemeManager.ts b/src/managers/ThemeManager.ts index 11c2b31..9b4d341 100644 --- a/src/managers/ThemeManager.ts +++ b/src/managers/ThemeManager.ts @@ -17,8 +17,8 @@ * along with Campus INSAT. If not, see . */ -import {DarkTheme, DefaultTheme} from 'react-native-paper'; -import {Appearance} from 'react-native-appearance'; +import { DarkTheme, DefaultTheme } from 'react-native-paper'; +import { Appearance } from 'react-native-appearance'; import AsyncStorageManager from './AsyncStorageManager'; import AprilFoolsManager from './AprilFoolsManager'; @@ -235,14 +235,14 @@ export default class ThemeManager { static getNightMode(): boolean { return ( (AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.nightMode.key, + AsyncStorageManager.PREFERENCES.nightMode.key ) && (!AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.nightModeFollowSystem.key, + AsyncStorageManager.PREFERENCES.nightModeFollowSystem.key ) || colorScheme === 'no-preference')) || (AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.nightModeFollowSystem.key, + AsyncStorageManager.PREFERENCES.nightModeFollowSystem.key ) && colorScheme === 'dark') ); @@ -289,7 +289,7 @@ export default class ThemeManager { setNightMode(isNightMode: boolean) { AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.nightMode.key, - isNightMode, + isNightMode ); if (this.updateThemeCallback != null) { this.updateThemeCallback(); diff --git a/src/navigation/MainNavigator.tsx b/src/navigation/MainNavigator.tsx index a8da42f..e11f863 100644 --- a/src/navigation/MainNavigator.tsx +++ b/src/navigation/MainNavigator.tsx @@ -18,9 +18,12 @@ */ import * as React from 'react'; -import {createStackNavigator, TransitionPresets} from '@react-navigation/stack'; +import { + createStackNavigator, + TransitionPresets, +} from '@react-navigation/stack'; import i18n from 'i18n-js'; -import {Platform} from 'react-native'; +import { Platform } from 'react-native'; import SettingsScreen from '../screens/Other/Settings/SettingsScreen'; import AboutScreen from '../screens/About/AboutScreen'; import AboutDependenciesScreen from '../screens/About/AboutDependenciesScreen'; @@ -78,16 +81,16 @@ export enum MainRoutes { Feedback = 'feedback', } -type DefaultParams = {[key in MainRoutes]: object | undefined}; +type DefaultParams = { [key in MainRoutes]: object | undefined }; export interface FullParamsList extends DefaultParams { - login: {nextScreen: string}; + 'login': { nextScreen: string }; 'equipment-confirm': { item?: DeviceType; dates: [string, string]; }; - 'equipment-rent': {item?: DeviceType}; - gallery: {images: Array<{url: string}>}; + 'equipment-rent': { item?: DeviceType }; + 'gallery': { images: Array<{ url: string }> }; } // Don't know why but TS is complaining without this @@ -108,13 +111,14 @@ const defaultScreenOptions = { const MainStack = createStackNavigator(); -function MainStackComponent(props: {createTabNavigator: () => JSX.Element}) { - const {createTabNavigator} = props; +function MainStackComponent(props: { createTabNavigator: () => JSX.Element }) { + const { createTabNavigator } = props; return ( + screenOptions={defaultScreenOptions} + > JSX.Element}) { MainRoutes.Settings, MainStack, SettingsScreen, - i18n.t('screens.settings.title'), + i18n.t('screens.settings.title') )} {CreateScreenCollapsibleStack( MainRoutes.DashboardEdit, MainStack, DashboardEditScreen, - i18n.t('screens.settings.dashboardEdit.title'), + i18n.t('screens.settings.dashboardEdit.title') )} {CreateScreenCollapsibleStack( MainRoutes.About, MainStack, AboutScreen, - i18n.t('screens.about.title'), + i18n.t('screens.about.title') )} {CreateScreenCollapsibleStack( MainRoutes.Dependencies, MainStack, AboutDependenciesScreen, - i18n.t('screens.about.libs'), + i18n.t('screens.about.libs') )} {CreateScreenCollapsibleStack( MainRoutes.Debug, MainStack, DebugScreen, - i18n.t('screens.about.debug'), + i18n.t('screens.about.debug') )} {CreateScreenCollapsibleStack( @@ -169,7 +173,7 @@ function MainStackComponent(props: {createTabNavigator: () => JSX.Element}) { i18n.t('screens.game.title'), true, undefined, - 'transparent', + 'transparent' )} JSX.Element}) { LoginScreen, i18n.t('screens.login.title'), true, - {headerTintColor: '#fff'}, - 'transparent', + { headerTintColor: '#fff' }, + 'transparent' )} {getWebsiteStack('website', MainStack, WebsiteScreen, '')} @@ -193,19 +197,19 @@ function MainStackComponent(props: {createTabNavigator: () => JSX.Element}) { MainRoutes.SelfMenu, MainStack, SelfMenuScreen, - i18n.t('screens.menu.title'), + i18n.t('screens.menu.title') )} {CreateScreenCollapsibleStack( MainRoutes.Proximo, MainStack, ProximoMainScreen, - i18n.t('screens.proximo.title'), + i18n.t('screens.proximo.title') )} {CreateScreenCollapsibleStack( MainRoutes.ProximoList, MainStack, ProximoListScreen, - i18n.t('screens.proximo.articleList'), + i18n.t('screens.proximo.articleList') )} {CreateScreenCollapsibleStack( MainRoutes.ProximoAbout, @@ -213,20 +217,20 @@ function MainStackComponent(props: {createTabNavigator: () => JSX.Element}) { ProximoAboutScreen, i18n.t('screens.proximo.title'), true, - {...modalTransition}, + { ...modalTransition } )} {CreateScreenCollapsibleStack( MainRoutes.Profile, MainStack, ProfileScreen, - i18n.t('screens.profile.title'), + i18n.t('screens.profile.title') )} {CreateScreenCollapsibleStack( MainRoutes.ClubList, MainStack, ClubListScreen, - i18n.t('screens.clubs.title'), + i18n.t('screens.clubs.title') )} {CreateScreenCollapsibleStack( MainRoutes.ClubInformation, @@ -234,7 +238,7 @@ function MainStackComponent(props: {createTabNavigator: () => JSX.Element}) { ClubDisplayScreen, i18n.t('screens.clubs.details'), true, - {...modalTransition}, + { ...modalTransition } )} {CreateScreenCollapsibleStack( MainRoutes.ClubAbout, @@ -242,37 +246,37 @@ function MainStackComponent(props: {createTabNavigator: () => JSX.Element}) { ClubAboutScreen, i18n.t('screens.clubs.title'), true, - {...modalTransition}, + { ...modalTransition } )} {CreateScreenCollapsibleStack( MainRoutes.EquipmentList, MainStack, EquipmentScreen, - i18n.t('screens.equipment.title'), + i18n.t('screens.equipment.title') )} {CreateScreenCollapsibleStack( MainRoutes.EquipmentRent, MainStack, EquipmentLendScreen, - i18n.t('screens.equipment.book'), + i18n.t('screens.equipment.book') )} {CreateScreenCollapsibleStack( MainRoutes.EquipmentConfirm, MainStack, EquipmentConfirmScreen, - i18n.t('screens.equipment.confirm'), + i18n.t('screens.equipment.confirm') )} {CreateScreenCollapsibleStack( MainRoutes.Vote, MainStack, VoteScreen, - i18n.t('screens.vote.title'), + i18n.t('screens.vote.title') )} {CreateScreenCollapsibleStack( MainRoutes.Feedback, MainStack, BugReportScreen, - i18n.t('screens.feedback.title'), + i18n.t('screens.feedback.title') )} ); @@ -280,7 +284,7 @@ function MainStackComponent(props: {createTabNavigator: () => JSX.Element}) { type PropsType = { defaultHomeRoute: string | null; - defaultHomeData: {[key: string]: string}; + defaultHomeData: { [key: string]: string }; }; export default function MainNavigator(props: PropsType) { diff --git a/src/navigation/TabNavigator.tsx b/src/navigation/TabNavigator.tsx index e53ce76..972eb4e 100644 --- a/src/navigation/TabNavigator.tsx +++ b/src/navigation/TabNavigator.tsx @@ -18,14 +18,17 @@ */ import * as React from 'react'; -import {createStackNavigator, TransitionPresets} from '@react-navigation/stack'; -import {createBottomTabNavigator} from '@react-navigation/bottom-tabs'; +import { + createStackNavigator, + TransitionPresets, +} from '@react-navigation/stack'; +import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; -import {Title, useTheme} from 'react-native-paper'; -import {Platform} from 'react-native'; +import { Title, useTheme } from 'react-native-paper'; +import { Platform, StyleSheet } from 'react-native'; import i18n from 'i18n-js'; -import {createCollapsibleStack} from 'react-navigation-collapsible'; -import {View} from 'react-native-animatable'; +import { createCollapsibleStack } from 'react-navigation-collapsible'; +import { View } from 'react-native-animatable'; import HomeScreen from '../screens/Home/HomeScreen'; import PlanningScreen from '../screens/Planning/PlanningScreen'; import PlanningDisplayScreen from '../screens/Planning/PlanningDisplayScreen'; @@ -45,7 +48,7 @@ import { CreateScreenCollapsibleStack, getWebsiteStack, } from '../utils/CollapsibleUtils'; -import Mascot, {MASCOT_STYLE} from '../components/Mascot/Mascot'; +import Mascot, { MASCOT_STYLE } from '../components/Mascot/Mascot'; const modalTransition = Platform.OS === 'ios' @@ -58,6 +61,20 @@ const defaultScreenOptions = { ...modalTransition, }; +const styles = StyleSheet.create({ + header: { + flexDirection: 'row', + }, + mascot: { + width: 50, + }, + title: { + marginLeft: 10, + marginTop: 'auto', + marginBottom: 'auto', + }, +}); + const ServicesStack = createStackNavigator(); function ServicesStackComponent() { @@ -65,24 +82,25 @@ function ServicesStackComponent() { + screenOptions={defaultScreenOptions} + > {CreateScreenCollapsibleStack( 'index', ServicesStack, WebsitesHomeScreen, - i18n.t('screens.services.title'), + i18n.t('screens.services.title') )} {CreateScreenCollapsibleStack( 'services-section', ServicesStack, ServicesSectionScreen, - 'SECTION', + 'SECTION' )} {CreateScreenCollapsibleStack( 'amicale-contact', ServicesStack, AmicaleContactScreen, - i18n.t('screens.amicaleAbout.title'), + i18n.t('screens.amicaleAbout.title') )} ); @@ -95,18 +113,19 @@ function ProxiwashStackComponent() { + screenOptions={defaultScreenOptions} + > {CreateScreenCollapsibleStack( 'index', ProxiwashStack, ProxiwashScreen, - i18n.t('screens.proxiwash.title'), + i18n.t('screens.proxiwash.title') )} {CreateScreenCollapsibleStack( 'proxiwash-about', ProxiwashStack, ProxiwashAboutScreen, - i18n.t('screens.proxiwash.title'), + i18n.t('screens.proxiwash.title') )} ); @@ -119,17 +138,18 @@ function PlanningStackComponent() { + screenOptions={defaultScreenOptions} + > {CreateScreenCollapsibleStack( 'planning-information', PlanningStack, PlanningDisplayScreen, - i18n.t('screens.planning.eventDetails'), + i18n.t('screens.planning.eventDetails') )} ); @@ -139,18 +159,19 @@ const HomeStack = createStackNavigator(); function HomeStackComponent( initialRoute: string | null, - defaultData: {[key: string]: string}, + defaultData: { [key: string]: string } ) { let params; if (initialRoute) { - params = {data: defaultData, nextScreen: initialRoute, shouldOpen: true}; + params = { data: defaultData, nextScreen: initialRoute, shouldOpen: true }; } - const {colors} = useTheme(); + const { colors } = useTheme(); return ( + screenOptions={defaultScreenOptions} + > {createCollapsibleStack( ( - + - + <Title style={styles.title}> {i18n.t('screens.home.title')} @@ -194,31 +208,31 @@ function HomeStackComponent( { collapsedColor: colors.surface, useNativeDriver: true, - }, + } )} {CreateScreenCollapsibleStack( 'club-information', HomeStack, ClubDisplayScreen, - i18n.t('screens.clubs.details'), + i18n.t('screens.clubs.details') )} {CreateScreenCollapsibleStack( 'feed-information', HomeStack, FeedItemScreen, - i18n.t('screens.home.feed'), + i18n.t('screens.home.feed') )} {CreateScreenCollapsibleStack( 'planning-information', HomeStack, PlanningDisplayScreen, - i18n.t('screens.planning.eventDetails'), + i18n.t('screens.planning.eventDetails') )} ); @@ -231,18 +245,19 @@ function PlanexStackComponent() { + screenOptions={defaultScreenOptions} + > {getWebsiteStack( 'index', PlanexStack, PlanexScreen, - i18n.t('screens.planex.title'), + i18n.t('screens.planex.title') )} {CreateScreenCollapsibleStack( 'group-select', PlanexStack, GroupSelectionScreen, - '', + '' )} ); @@ -252,7 +267,7 @@ const Tab = createBottomTabNavigator(); type PropsType = { defaultHomeRoute: string | null; - defaultHomeData: {[key: string]: string}; + defaultHomeData: { [key: string]: string }; }; export default class TabNavigator extends React.Component { @@ -264,7 +279,7 @@ export default class TabNavigator extends React.Component { this.defaultRoute = 'home'; if (!props.defaultHomeRoute) { this.defaultRoute = AsyncStorageManager.getString( - AsyncStorageManager.PREFERENCES.defaultStartScreen.key, + AsyncStorageManager.PREFERENCES.defaultStartScreen.key ).toLowerCase(); } this.createHomeStackComponent = () => @@ -275,31 +290,32 @@ export default class TabNavigator extends React.Component { return ( }> + tabBar={(tabProps) => } + > ); diff --git a/src/screens/About/AboutDependenciesScreen.tsx b/src/screens/About/AboutDependenciesScreen.tsx index a7013d9..f98d072 100644 --- a/src/screens/About/AboutDependenciesScreen.tsx +++ b/src/screens/About/AboutDependenciesScreen.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {List} from 'react-native-paper'; -import {View} from 'react-native-animatable'; +import { List } from 'react-native-paper'; +import { View } from 'react-native-animatable'; import CollapsibleFlatList from '../../components/Collapsible/CollapsibleFlatList'; import packageJson from '../../../package.json'; @@ -40,7 +40,7 @@ function generateListFromObject(object: { const list: Array = []; const keys = Object.keys(object); keys.forEach((key: string) => { - list.push({name: key, version: object[key]}); + list.push({ name: key, version: object[key] }); }); return list; } @@ -60,18 +60,18 @@ export default class AboutDependenciesScreen extends React.Component<{}> { keyExtractor = (item: ListItemType): string => item.name; - getRenderItem = ({item}: {item: ListItemType}) => ( + getRenderItem = ({ item }: { item: ListItemType }) => ( ); getItemLayout = ( data: Array | null | undefined, - index: number, - ): {length: number; offset: number; index: number} => ({ + index: number + ): { length: number; offset: number; index: number } => ({ length: LIST_ITEM_HEIGHT, offset: LIST_ITEM_HEIGHT * index, index, diff --git a/src/screens/About/AboutScreen.tsx b/src/screens/About/AboutScreen.tsx index 1d55ac9..f1fc384 100644 --- a/src/screens/About/AboutScreen.tsx +++ b/src/screens/About/AboutScreen.tsx @@ -18,14 +18,22 @@ */ import * as React from 'react'; -import {FlatList, Linking, Platform, Image, View} from 'react-native'; +import { + FlatList, + Linking, + Platform, + Image, + View, + StyleSheet, +} from 'react-native'; import i18n from 'i18n-js'; -import {Avatar, Card, List} from 'react-native-paper'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { Avatar, Card, List } from 'react-native-paper'; +import { StackNavigationProp } from '@react-navigation/stack'; import packageJson from '../../../package.json'; import CollapsibleFlatList from '../../components/Collapsible/CollapsibleFlatList'; import OptionsDialog from '../../components/Dialogs/OptionsDialog'; -import type {OptionsDialogButtonType} from '../../components/Dialogs/OptionsDialog'; +import type { OptionsDialogButtonType } from '../../components/Dialogs/OptionsDialog'; +import GENERAL_STYLES from '../../constants/Styles'; const APP_LOGO = require('../../../assets/android.icon.round.png'); @@ -69,6 +77,15 @@ type StateType = { dialogButtons: Array; }; +const styles = StyleSheet.create({ + card: { + marginBottom: 10, + }, + list: { + padding: 5, + }, +}); + /** * Opens a link in the device's browser * @param link The link to open @@ -171,7 +188,7 @@ class AboutScreen extends React.Component { }, { onPressCallback: () => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.navigate('feedback'); }, icon: 'bug', @@ -228,7 +245,7 @@ class AboutScreen extends React.Component { }, { onPressCallback: () => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.navigate('dependencies'); }, icon: 'developer-board', @@ -267,7 +284,7 @@ class AboutScreen extends React.Component { ...this.getMemberData(this.majorContributors), { onPressCallback: () => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.navigate('feedback'); }, icon: 'hand-pointing-right', @@ -306,7 +323,7 @@ class AboutScreen extends React.Component { onPress: this.onDialogDismiss, }, ]; - const {linkedin, trollLink, mail} = user; + const { linkedin, trollLink, mail } = user; if (linkedin != null) { dialogBtn.push({ title: '', @@ -348,14 +365,14 @@ class AboutScreen extends React.Component { */ getAppCard() { return ( - + ( )} /> @@ -377,7 +394,7 @@ class AboutScreen extends React.Component { */ getTeamCard() { return ( - + ( @@ -402,7 +419,7 @@ class AboutScreen extends React.Component { */ getThanksCard() { return ( - + ( @@ -427,7 +444,7 @@ class AboutScreen extends React.Component { */ getTechnoCard() { return ( - + ( @@ -478,7 +495,7 @@ class AboutScreen extends React.Component { marginRight: number; marginVertical?: number; }; - }, + } ) { return ( @@ -490,7 +507,7 @@ class AboutScreen extends React.Component { * * @returns {*} */ - getCardItem = ({item}: {item: ListItemType}) => { + getCardItem = ({ item }: { item: ListItemType }) => { const getItemIcon = (props: { color: string; style?: { @@ -523,7 +540,7 @@ class AboutScreen extends React.Component { * @param item The item to show * @return {*} */ - getMainCard = ({item}: {item: {id: string}}) => { + getMainCard = ({ item }: { item: { id: string } }) => { switch (item.id) { case 'app': return this.getAppCard(); @@ -539,7 +556,7 @@ class AboutScreen extends React.Component { }; onDialogDismiss = () => { - this.setState({dialogVisible: false}); + this.setState({ dialogVisible: false }); }; /** @@ -551,14 +568,11 @@ class AboutScreen extends React.Component { keyExtractor = (item: ListItemType): string => item.icon; render() { - const {state} = this; + const { state } = this; return ( - + diff --git a/src/screens/About/DebugScreen.tsx b/src/screens/About/DebugScreen.tsx index 31c2afc..ab8d07f 100644 --- a/src/screens/About/DebugScreen.tsx +++ b/src/screens/About/DebugScreen.tsx @@ -18,7 +18,7 @@ */ import * as React from 'react'; -import {View} from 'react-native'; +import { StyleSheet, View } from 'react-native'; import { Button, List, @@ -27,7 +27,7 @@ import { Title, withTheme, } from 'react-native-paper'; -import {Modalize} from 'react-native-modalize'; +import { Modalize } from 'react-native-modalize'; import CustomModal from '../../components/Overrides/CustomModal'; import AsyncStorageManager from '../../managers/AsyncStorageManager'; import CollapsibleFlatList from '../../components/Collapsible/CollapsibleFlatList'; @@ -47,6 +47,17 @@ type StateType = { currentPreferences: Array; }; +const styles = StyleSheet.create({ + container: { + flex: 1, + padding: 20, + }, + buttonContainer: { + flexDirection: 'row', + marginTop: 10, + }, +}); + /** * Class defining the Debug screen. * This screen allows the user to get and modify information on the app/device. @@ -67,7 +78,7 @@ class DebugScreen extends React.Component { this.modalInputValue = ''; const currentPreferences: Array = []; Object.values(AsyncStorageManager.PREFERENCES).forEach((object: any) => { - const newObject: PreferenceItemType = {...object}; + const newObject: PreferenceItemType = { ...object }; newObject.current = AsyncStorageManager.getString(newObject.key); currentPreferences.push(newObject); }); @@ -83,7 +94,7 @@ class DebugScreen extends React.Component { * @return {*} */ getModalContent() { - const {props, state} = this; + const { props, state } = this; let key = ''; let defaultValue = ''; let current = ''; @@ -95,11 +106,7 @@ class DebugScreen extends React.Component { } return ( - + {key} Default: {defaultValue} Current: {current} @@ -109,18 +116,15 @@ class DebugScreen extends React.Component { this.modalInputValue = text; }} /> - + @@ -137,7 +142,7 @@ class DebugScreen extends React.Component { ); } - getRenderItem = ({item}: {item: PreferenceItemType}) => { + getRenderItem = ({ item }: { item: PreferenceItemType }) => { return ( { * @returns {number} */ findIndexOfKey(key: string): number { - const {currentPreferences} = this.state; + const { currentPreferences } = this.state; let index = -1; for (let i = 0; i < currentPreferences.length; i += 1) { if (currentPreferences[i].key === key) { @@ -202,7 +207,7 @@ class DebugScreen extends React.Component { } => { const currentPreferences = [...prevState.currentPreferences]; currentPreferences[this.findIndexOfKey(key)].current = value; - return {currentPreferences}; + return { currentPreferences }; }); AsyncStorageManager.set(key, value); if (this.modalRef) { @@ -211,7 +216,7 @@ class DebugScreen extends React.Component { } render() { - const {state} = this; + const { state } = this; return ( diff --git a/src/screens/Amicale/AmicaleContactScreen.tsx b/src/screens/Amicale/AmicaleContactScreen.tsx index 28b6919..0c6627f 100644 --- a/src/screens/Amicale/AmicaleContactScreen.tsx +++ b/src/screens/Amicale/AmicaleContactScreen.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {FlatList, Image, Linking, View} from 'react-native'; -import {Avatar, Card, List, Text} from 'react-native-paper'; +import { FlatList, Image, Linking, StyleSheet, View } from 'react-native'; +import { Avatar, Card, List, Text } from 'react-native-paper'; import i18n from 'i18n-js'; import CollapsibleFlatList from '../../components/Collapsible/CollapsibleFlatList'; @@ -31,6 +31,24 @@ type DatasetItemType = { icon: string; }; +const styles = StyleSheet.create({ + imageContainer: { + width: '100%', + height: 100, + marginTop: 20, + marginBottom: 20, + justifyContent: 'center', + alignItems: 'center', + }, + image: { + flex: 1, + resizeMode: 'contain', + }, + card: { + margin: 5, + }, +}); + /** * Class defining a planning event information page. */ @@ -105,7 +123,7 @@ class AmicaleContactScreen extends React.Component<{}> { /> ); - getRenderItem = ({item}: {item: DatasetItemType}) => { + getRenderItem = ({ item }: { item: DatasetItemType }) => { const onPress = () => { Linking.openURL(`mailto:${item.email}`); }; @@ -129,22 +147,14 @@ class AmicaleContactScreen extends React.Component<{}> { getScreen = () => { return ( - + - + { render() { return ( diff --git a/src/screens/Amicale/Clubs/ClubAboutScreen.tsx b/src/screens/Amicale/Clubs/ClubAboutScreen.tsx index 3164432..e7234dc 100644 --- a/src/screens/Amicale/Clubs/ClubAboutScreen.tsx +++ b/src/screens/Amicale/Clubs/ClubAboutScreen.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {Image, View} from 'react-native'; -import {Card, Avatar, Text} from 'react-native-paper'; +import { Image, StyleSheet, View } from 'react-native'; +import { Card, Avatar, Text } from 'react-native-paper'; import i18n from 'i18n-js'; import Autolink from 'react-native-autolink'; import CollapsibleScrollView from '../../../components/Collapsible/CollapsibleScrollView'; @@ -27,26 +27,39 @@ const AMICALE_ICON = require('../../../../assets/amicale.png'); const CONTACT_LINK = 'clubs@amicale-insat.fr'; +const styles = StyleSheet.create({ + container: { + padding: 5, + }, + imageContainer: { + width: '100%', + height: 100, + marginTop: 20, + marginBottom: 20, + justifyContent: 'center', + alignItems: 'center', + }, + image: { + flex: 1, + resizeMode: 'contain', + }, + card: { + margin: 5, + }, +}); + function ClubAboutScreen() { return ( - - + + {i18n.t('screens.clubs.about.text')} - + { categories.forEach((cat: number | null) => { if (cat != null) { final.push( - + {this.getCategoryName(cat)} - , + ); } }); - return {final}; + return {final}; } /** @@ -134,7 +165,7 @@ class ClubDisplayScreen extends React.Component { * @returns {*} */ getManagersRender(managers: Array, email: string | null) { - const {props} = this; + const { props } = this; const managersListView: Array = []; managers.forEach((item: string) => { managersListView.push({item}); @@ -142,7 +173,11 @@ class ClubDisplayScreen extends React.Component { const hasManagers = managers.length > 0; return ( + style={{ + marginBottom: CustomTabBar.TAB_BAR_HEIGHT + 20, + ...styles.card, + }} + > { left={(iconProps) => ( { onPress={() => { Linking.openURL(`mailto:${destinationEmail}`); }} - style={{marginLeft: 'auto'}}> + style={styles.emailButton} + > {text} @@ -205,19 +241,12 @@ class ClubDisplayScreen extends React.Component { if (data != null) { this.updateHeaderTitle(data); return ( - + {this.getCategoriesRender(data.category)} {data.logo !== null ? ( ) : ( @@ -244,12 +273,12 @@ class ClubDisplayScreen extends React.Component { * @param data The club data */ updateHeaderTitle(data: ClubType) { - const {props} = this; - props.navigation.setOptions({title: data.name}); + const { props } = this; + props.navigation.setOptions({ title: data.name }); } render() { - const {props} = this; + const { props } = this; if (this.shouldFetchData) { return ( { requests={[ { link: 'clubs/info', - params: {id: this.clubId}, + params: { id: this.clubId }, mandatory: true, }, ]} diff --git a/src/screens/Amicale/Clubs/ClubListScreen.tsx b/src/screens/Amicale/Clubs/ClubListScreen.tsx index f5a46ef..755bb83 100644 --- a/src/screens/Amicale/Clubs/ClubListScreen.tsx +++ b/src/screens/Amicale/Clubs/ClubListScreen.tsx @@ -18,13 +18,16 @@ */ import * as React from 'react'; -import {Platform} from 'react-native'; -import {Searchbar} from 'react-native-paper'; +import { Platform } from 'react-native'; +import { Searchbar } from 'react-native-paper'; import i18n from 'i18n-js'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { StackNavigationProp } from '@react-navigation/stack'; import AuthenticatedScreen from '../../../components/Amicale/AuthenticatedScreen'; import ClubListItem from '../../../components/Lists/Clubs/ClubListItem'; -import {isItemInCategoryFilter, stringMatchQuery} from '../../../utils/Search'; +import { + isItemInCategoryFilter, + stringMatchQuery, +} from '../../../utils/Search'; import ClubListHeader from '../../../components/Lists/Clubs/ClubListHeader'; import MaterialHeaderButtons, { Item, @@ -73,15 +76,15 @@ class ClubListScreen extends React.Component { * Creates the header content */ componentDidMount() { - const {props} = this; + const { props } = this; props.navigation.setOptions({ headerTitle: this.getSearchBar, headerRight: this.getHeaderButtons, headerBackTitleVisible: false, headerTitleContainerStyle: Platform.OS === 'ios' - ? {marginHorizontal: 0, width: '70%'} - : {marginHorizontal: 0, right: 50, left: 50}, + ? { marginHorizontal: 0, width: '70%' } + : { marginHorizontal: 0, right: 50, left: 50 }, }); } @@ -92,7 +95,7 @@ class ClubListScreen extends React.Component { * @param item The article pressed */ onListItemPress(item: ClubType) { - const {props} = this; + const { props } = this; props.navigation.navigate('club-information', { data: item, categories: this.categories, @@ -133,7 +136,7 @@ class ClubListScreen extends React.Component { */ getHeaderButtons = () => { const onPress = () => { - const {props} = this; + const { props } = this; props.navigation.navigate('club-about'); }; return ( @@ -147,7 +150,7 @@ class ClubListScreen extends React.Component { data: Array<{ categories: Array; clubs: Array; - } | null>, + } | null> ) => { let categoryList: Array = []; let clubList: Array = []; @@ -175,7 +178,7 @@ class ClubListScreen extends React.Component { * @returns {*} */ getListHeader() { - const {state} = this; + const { state } = this; return ( { return cat; }; - getRenderItem = ({item}: {item: ClubType}) => { + getRenderItem = ({ item }: { item: ClubType }) => { const onPress = () => { this.onListItemPress(item); }; @@ -222,8 +225,8 @@ class ClubListScreen extends React.Component { itemLayout = ( data: Array | null | undefined, - index: number, - ): {length: number; offset: number; index: number} => ({ + index: number + ): { length: number; offset: number; index: number } => ({ length: LIST_ITEM_HEIGHT, offset: LIST_ITEM_HEIGHT * index, index, @@ -239,7 +242,7 @@ class ClubListScreen extends React.Component { * @param categoryId The category to add/remove from the filter */ updateFilteredData(filterStr: string | null, categoryId: number | null) { - const {state} = this; + const { state } = this; const newCategoriesState = [...state.currentlySelectedCategories]; let newStrState = state.currentSearchString; if (filterStr !== null) { @@ -268,7 +271,7 @@ class ClubListScreen extends React.Component { * @returns {boolean} */ shouldRenderItem(item: ClubType): boolean { - const {state} = this; + const { state } = this; let shouldRender = state.currentlySelectedCategories.length === 0 || isItemInCategoryFilter(state.currentlySelectedCategories, item.category); @@ -279,7 +282,7 @@ class ClubListScreen extends React.Component { } render() { - const {props} = this; + const { props } = this; return ( - + - - - {item.name} - - ({i18n.t('screens.equipment.bail', {cost: item.caution})}) + + + {item.name} + + ({i18n.t('screens.equipment.bail', { cost: item.caution })}) - + <Title style={{ color: theme.colors.success, ...styles.subtitle }}> {buttonText} - + {i18n.t('screens.equipment.bookingConfirmedMessage')} diff --git a/src/screens/Amicale/Equipment/EquipmentListScreen.tsx b/src/screens/Amicale/Equipment/EquipmentListScreen.tsx index 608f082..54d5b98 100644 --- a/src/screens/Amicale/Equipment/EquipmentListScreen.tsx +++ b/src/screens/Amicale/Equipment/EquipmentListScreen.tsx @@ -18,16 +18,17 @@ */ import * as React from 'react'; -import {View} from 'react-native'; -import {Button} from 'react-native-paper'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { StyleSheet, View } from 'react-native'; +import { Button } from 'react-native-paper'; +import { StackNavigationProp } from '@react-navigation/stack'; import i18n from 'i18n-js'; import AuthenticatedScreen from '../../../components/Amicale/AuthenticatedScreen'; import EquipmentListItem from '../../../components/Lists/Equipment/EquipmentListItem'; import MascotPopup from '../../../components/Mascot/MascotPopup'; -import {MASCOT_STYLE} from '../../../components/Mascot/Mascot'; +import { MASCOT_STYLE } from '../../../components/Mascot/Mascot'; import AsyncStorageManager from '../../../managers/AsyncStorageManager'; import CollapsibleFlatList from '../../../components/Collapsible/CollapsibleFlatList'; +import GENERAL_STYLES from '../../../constants/Styles'; type PropsType = { navigation: StackNavigationProp; @@ -41,7 +42,7 @@ export type DeviceType = { id: number; name: string; caution: number; - booked_at: Array<{begin: string; end: string}>; + booked_at: Array<{ begin: string; end: string }>; }; export type RentedDeviceType = { @@ -53,10 +54,18 @@ export type RentedDeviceType = { const LIST_ITEM_HEIGHT = 64; +const styles = StyleSheet.create({ + headerContainer: { + width: '100%', + marginTop: 10, + marginBottom: 10, + }, +}); + class EquipmentListScreen extends React.Component { userRents: null | Array; - authRef: {current: null | AuthenticatedScreen}; + authRef: { current: null | AuthenticatedScreen }; canRefresh: boolean; @@ -65,7 +74,7 @@ class EquipmentListScreen extends React.Component { this.userRents = null; this.state = { mascotDialogVisible: AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.equipmentShowMascot.key, + AsyncStorageManager.PREFERENCES.equipmentShowMascot.key ), }; this.canRefresh = false; @@ -84,8 +93,8 @@ class EquipmentListScreen extends React.Component { this.canRefresh = true; }; - getRenderItem = ({item}: {item: DeviceType}) => { - const {navigation} = this.props; + getRenderItem = ({ item }: { item: DeviceType }) => { + const { navigation } = this.props; return ( { */ getListHeader() { return ( - + @@ -145,8 +147,10 @@ class EquipmentListScreen extends React.Component { */ getScreen = ( data: Array< - {devices: Array} | {locations: Array} | null - >, + | { devices: Array } + | { locations: Array } + | null + > ) => { const [allDevices, userRents] = data; if (userRents) { @@ -161,7 +165,7 @@ class EquipmentListScreen extends React.Component { ListHeaderComponent={this.getListHeader()} data={ allDevices - ? (allDevices as {devices: Array}).devices + ? (allDevices as { devices: Array }).devices : null } /> @@ -169,21 +173,21 @@ class EquipmentListScreen extends React.Component { }; showMascotDialog = () => { - this.setState({mascotDialogVisible: true}); + this.setState({ mascotDialogVisible: true }); }; hideMascotDialog = () => { AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.equipmentShowMascot.key, - false, + false ); - this.setState({mascotDialogVisible: false}); + this.setState({ mascotDialogVisible: false }); }; render() { - const {props, state} = this; + const { props, state } = this; return ( - + { item: DeviceType | null; bookedDates: Array; - bookRef: {current: null | (Animatable.View & View)}; + bookRef: { current: null | (Animatable.View & View) }; canBookEquipment: boolean; @@ -101,14 +146,14 @@ class EquipmentRentScreen extends React.Component { this.item = null; } } - const {item} = this; + const { item } = this; if (item != null) { this.lockedDates = {}; - item.booked_at.forEach((date: {begin: string; end: string}) => { + item.booked_at.forEach((date: { begin: string; end: string }) => { const range = getValidRange( new Date(date.begin), new Date(date.end), - null, + null ); this.lockedDates = { ...this.lockedDates, @@ -122,17 +167,17 @@ class EquipmentRentScreen extends React.Component { * Captures focus and blur events to hook on android back button */ componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; navigation.addListener('focus', () => { BackHandler.addEventListener( 'hardwareBackPress', - this.onBackButtonPressAndroid, + this.onBackButtonPressAndroid ); }); navigation.addListener('blur', () => { BackHandler.removeEventListener( 'hardwareBackPress', - this.onBackButtonPressAndroid, + this.onBackButtonPressAndroid ); }); } @@ -152,11 +197,11 @@ class EquipmentRentScreen extends React.Component { }; onDialogDismiss = () => { - this.setState({dialogVisible: false}); + this.setState({ dialogVisible: false }); }; onErrorDialogDismiss = () => { - this.setState({errorDialogVisible: false}); + this.setState({ errorDialogVisible: false }); }; /** @@ -168,7 +213,7 @@ class EquipmentRentScreen extends React.Component { */ onDialogAccept = (): Promise => { return new Promise((resolve: () => void) => { - const {item, props} = this; + const { item, props } = this; const start = this.getBookStartDate(); const end = this.getBookEndDate(); if (item != null && start != null && end != null) { @@ -203,7 +248,7 @@ class EquipmentRentScreen extends React.Component { } getBookEndDate(): Date | null { - const {length} = this.bookedDates; + const { length } = this.bookedDates; return length > 0 ? new Date(this.bookedDates[length - 1]) : null; } @@ -247,7 +292,7 @@ class EquipmentRentScreen extends React.Component { }; showDialog = () => { - this.setState({dialogVisible: true}); + this.setState({ dialogVisible: true }); }; /** @@ -288,14 +333,14 @@ class EquipmentRentScreen extends React.Component { } updateMarkedSelection() { - const {theme} = this.props; + const { theme } = this.props; this.setState({ markedDates: generateMarkedDates(true, theme, this.bookedDates), }); } render() { - const {item, props, state} = this; + const { item, props, state } = this; const start = this.getBookStartDate(); const end = this.getBookEndDate(); let subHeadingText; @@ -315,28 +360,17 @@ class EquipmentRentScreen extends React.Component { const isAvailable = isEquipmentAvailable(item); const firstAvailability = getFirstEquipmentAvailability(item); return ( - + - + - - - - {item.name} - - - ({i18n.t('screens.equipment.bail', {cost: item.caution})}) + + + {item.name} + + ( + {i18n.t('screens.equipment.bail', { cost: item.caution })} + ) @@ -348,17 +382,13 @@ class EquipmentRentScreen extends React.Component { ? props.theme.colors.success : props.theme.colors.primary } - mode="text"> + mode="text" + > {i18n.t('screens.equipment.available', { date: getRelativeDateString(firstAvailability), })} - + {subHeadingText} @@ -382,30 +412,30 @@ class EquipmentRentScreen extends React.Component { hideArrows={false} // Date marking style [simple/period/multi-dot/custom]. Default = 'simple' markingType={'period'} - markedDates={{...this.lockedDates, ...state.markedDates}} + markedDates={{ ...this.lockedDates, ...state.markedDates }} theme={{ - backgroundColor: props.theme.colors.agendaBackgroundColor, - calendarBackground: props.theme.colors.background, - textSectionTitleColor: props.theme.colors.agendaDayTextColor, - selectedDayBackgroundColor: props.theme.colors.primary, - selectedDayTextColor: '#ffffff', - todayTextColor: props.theme.colors.text, - dayTextColor: props.theme.colors.text, - textDisabledColor: props.theme.colors.agendaDayTextColor, - dotColor: props.theme.colors.primary, - selectedDotColor: '#ffffff', - arrowColor: props.theme.colors.primary, - monthTextColor: props.theme.colors.text, - indicatorColor: props.theme.colors.primary, - textDayFontFamily: 'monospace', - textMonthFontFamily: 'monospace', - textDayHeaderFontFamily: 'monospace', - textDayFontWeight: '300', - textMonthFontWeight: 'bold', - textDayHeaderFontWeight: '300', - textDayFontSize: 16, - textMonthFontSize: 16, - textDayHeaderFontSize: 16, + 'backgroundColor': props.theme.colors.agendaBackgroundColor, + 'calendarBackground': props.theme.colors.background, + 'textSectionTitleColor': props.theme.colors.agendaDayTextColor, + 'selectedDayBackgroundColor': props.theme.colors.primary, + 'selectedDayTextColor': '#ffffff', + 'todayTextColor': props.theme.colors.text, + 'dayTextColor': props.theme.colors.text, + 'textDisabledColor': props.theme.colors.agendaDayTextColor, + 'dotColor': props.theme.colors.primary, + 'selectedDotColor': '#ffffff', + 'arrowColor': props.theme.colors.primary, + 'monthTextColor': props.theme.colors.text, + 'indicatorColor': props.theme.colors.primary, + 'textDayFontFamily': 'monospace', + 'textMonthFontFamily': 'monospace', + 'textDayHeaderFontFamily': 'monospace', + 'textDayFontWeight': '300', + 'textMonthFontWeight': 'bold', + 'textDayHeaderFontWeight': '300', + 'textDayFontSize': 16, + 'textMonthFontSize': 16, + 'textDayHeaderFontSize': 16, 'stylesheet.day.period': { base: { overflow: 'hidden', @@ -415,7 +445,7 @@ class EquipmentRentScreen extends React.Component { }, }, }} - style={{marginBottom: 50}} + style={styles.calendar} /> { + style={styles.buttonContainer} + > diff --git a/src/screens/Amicale/LoginScreen.tsx b/src/screens/Amicale/LoginScreen.tsx index 5da8505..0394736 100644 --- a/src/screens/Amicale/LoginScreen.tsx +++ b/src/screens/Amicale/LoginScreen.tsx @@ -18,7 +18,7 @@ */ import * as React from 'react'; -import {Image, KeyboardAvoidingView, StyleSheet, View} from 'react-native'; +import { Image, KeyboardAvoidingView, StyleSheet, View } from 'react-native'; import { Button, Card, @@ -27,16 +27,17 @@ import { withTheme, } from 'react-native-paper'; import i18n from 'i18n-js'; -import {StackNavigationProp, StackScreenProps} from '@react-navigation/stack'; +import { StackNavigationProp, StackScreenProps } from '@react-navigation/stack'; import LinearGradient from 'react-native-linear-gradient'; import ConnectionManager from '../../managers/ConnectionManager'; import ErrorDialog from '../../components/Dialogs/ErrorDialog'; import AsyncStorageManager from '../../managers/AsyncStorageManager'; import AvailableWebsites from '../../constants/AvailableWebsites'; -import {MASCOT_STYLE} from '../../components/Mascot/Mascot'; +import { MASCOT_STYLE } from '../../components/Mascot/Mascot'; import MascotPopup from '../../components/Mascot/MascotPopup'; import CollapsibleScrollView from '../../components/Collapsible/CollapsibleScrollView'; -import {MainStackParamsList} from '../../navigation/MainNavigator'; +import { MainStackParamsList } from '../../navigation/MainNavigator'; +import GENERAL_STYLES from '../../constants/Styles'; type LoginScreenNavigationProp = StackScreenProps; @@ -63,9 +64,6 @@ const RESET_PASSWORD_PATH = 'https://www.amicale-insat.fr/password/reset'; const emailRegex = /^.+@.+\..+$/; const styles = StyleSheet.create({ - container: { - flex: 1, - }, card: { marginTop: 'auto', marginBottom: 'auto', @@ -74,10 +72,18 @@ const styles = StyleSheet.create({ fontSize: 36, marginBottom: 48, }, - textInput: {}, - btnContainer: { - marginTop: 5, - marginBottom: 10, + text: { + color: '#ffffff', + }, + buttonContainer: { + flexWrap: 'wrap', + }, + lockButton: { + marginRight: 'auto', + marginBottom: 20, + }, + sendButton: { + marginLeft: 'auto', }, }); @@ -113,7 +119,7 @@ class LoginScreen extends React.Component { dialogVisible: false, dialogError: 0, mascotDialogVisible: AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.loginShowMascot.key, + AsyncStorageManager.PREFERENCES.loginShowMascot.key ), }; } @@ -126,7 +132,7 @@ class LoginScreen extends React.Component { * Navigates to the Amicale website screen with the reset password link as navigation parameters */ onResetPasswordClick = () => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.navigate('website', { host: AvailableWebsites.websites.AMICALE, path: RESET_PASSWORD_PATH, @@ -174,15 +180,15 @@ class LoginScreen extends React.Component { * */ onSubmit = () => { - const {email, password} = this.state; + const { email, password } = this.state; if (this.shouldEnableLogin()) { - this.setState({loading: true}); + this.setState({ loading: true }); ConnectionManager.getInstance() .connect(email, password) .then(this.handleSuccess) .catch(this.showErrorDialog) .finally(() => { - this.setState({loading: false}); + this.setState({ loading: false }); }); } }; @@ -193,7 +199,7 @@ class LoginScreen extends React.Component { * @returns {*} */ getFormInput() { - const {email, password} = this.state; + const { email, password } = this.state; return ( { * @returns {*} */ getMainCard() { - const {props, state} = this; + const { props, state } = this; return ( ( + subtitleStyle={styles.text} + left={({ size }) => ( { /> {this.getFormInput()} - + @@ -288,10 +296,8 @@ class LoginScreen extends React.Component { icon="help-circle" mode="contained" onPress={this.showMascotDialog} - style={{ - marginLeft: 'auto', - marginRight: 'auto', - }}> + style={GENERAL_STYLES.centerHorizontal} + > {i18n.t('screens.login.mascotDialog.title')} @@ -304,26 +310,26 @@ class LoginScreen extends React.Component { * The user has unfocused the input, his email is ready to be validated */ validateEmail = () => { - this.setState({isEmailValidated: true}); + this.setState({ isEmailValidated: true }); }; /** * The user has unfocused the input, his password is ready to be validated */ validatePassword = () => { - this.setState({isPasswordValidated: true}); + this.setState({ isPasswordValidated: true }); }; hideMascotDialog = () => { AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.loginShowMascot.key, - false, + false ); - this.setState({mascotDialogVisible: false}); + this.setState({ mascotDialogVisible: false }); }; showMascotDialog = () => { - this.setState({mascotDialogVisible: true}); + this.setState({ mascotDialogVisible: true }); }; /** @@ -339,7 +345,7 @@ class LoginScreen extends React.Component { }; hideErrorDialog = () => { - this.setState({dialogVisible: false}); + this.setState({ dialogVisible: false }); }; /** @@ -347,11 +353,11 @@ class LoginScreen extends React.Component { * Saves in user preferences to not show the login banner again. */ handleSuccess = () => { - const {navigation} = this.props; + const { navigation } = this.props; // Do not show the home login banner again AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.homeShowMascot.key, - false, + false ); if (this.nextScreen == null) { navigation.goBack(); @@ -373,7 +379,7 @@ class LoginScreen extends React.Component { * @returns {boolean} */ isEmailValid(): boolean { - const {email} = this.state; + const { email } = this.state; return emailRegex.test(email); } @@ -384,7 +390,7 @@ class LoginScreen extends React.Component { * @returns {boolean|boolean} */ shouldShowEmailError(): boolean { - const {isEmailValidated} = this.state; + const { isEmailValidated } = this.state; return isEmailValidated && !this.isEmailValid(); } @@ -394,7 +400,7 @@ class LoginScreen extends React.Component { * @returns {boolean} */ isPasswordValid(): boolean { - const {password} = this.state; + const { password } = this.state; return password !== ''; } @@ -405,7 +411,7 @@ class LoginScreen extends React.Component { * @returns {boolean|boolean} */ shouldShowPasswordError(): boolean { - const {isPasswordValidated} = this.state; + const { isPasswordValidated } = this.state; return isPasswordValidated && !this.isPasswordValid(); } @@ -415,28 +421,28 @@ class LoginScreen extends React.Component { * @returns {boolean} */ shouldEnableLogin(): boolean { - const {loading} = this.state; + const { loading } = this.state; return this.isEmailValid() && this.isPasswordValid() && !loading; } render() { - const {mascotDialogVisible, dialogVisible, dialogError} = this.state; + const { mascotDialogVisible, dialogVisible, dialogError } = this.state; return ( + start={{ x: 0, y: 0.1 }} + end={{ x: 0.1, y: 1 }} + > + keyboardVerticalOffset={100} + > - {this.getMainCard()} + {this.getMainCard()} ; @@ -79,19 +80,25 @@ const styles = StyleSheet.create({ editButton: { marginLeft: 'auto', }, + mascot: { + width: 60, + }, + title: { + marginLeft: 10, + }, }); class ProfileScreen extends React.Component { data: ProfileDataType | null; - flatListData: Array<{id: string}>; + flatListData: Array<{ id: string }>; amicaleDataset: Array; constructor(props: PropsType) { super(props); this.data = null; - this.flatListData = [{id: '0'}, {id: '1'}, {id: '2'}, {id: '3'}]; + this.flatListData = [{ id: '0' }, { id: '1' }, { id: '2' }, { id: '3' }]; const services = new ServicesManager(props.navigation); this.amicaleDataset = services.getAmicaleServices([SERVICES_KEY.PROFILE]); this.state = { @@ -100,7 +107,7 @@ class ProfileScreen extends React.Component { } componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; navigation.setOptions({ headerRight: this.getHeaderButton, }); @@ -128,10 +135,10 @@ class ProfileScreen extends React.Component { * @returns {*} */ getScreen = (data: Array) => { - const {dialogVisible} = this.state; + const { dialogVisible } = this.state; this.data = data[0]; return ( - + { ); }; - getRenderItem = ({item}: {item: {id: string}}) => { + getRenderItem = ({ item }: { item: { id: string } }) => { switch (item.id) { case '0': return this.getWelcomeCard(); @@ -172,7 +179,7 @@ class ProfileScreen extends React.Component { * @returns {*} */ getWelcomeCard() { - const {navigation} = this.props; + const { navigation } = this.props; return ( { })} left={() => ( { }} /> )} - titleStyle={{marginLeft: 10}} + titleStyle={styles.title} /> @@ -207,7 +212,8 @@ class ProfileScreen extends React.Component { onPress={() => { navigation.navigate('feedback'); }} - style={styles.editButton}> + style={styles.editButton} + > {i18n.t('screens.feedback.homeButtonTitle')} @@ -235,7 +241,7 @@ class ProfileScreen extends React.Component { * @return {*} */ getPersonalListItem(field: string | undefined, icon: string) { - const {theme} = this.props; + const { theme } = this.props; const title = field != null ? ProfileScreen.getFieldValue(field) : ':('; const subtitle = field != null ? '' : ProfileScreen.getFieldValue(field); return ( @@ -259,7 +265,7 @@ class ProfileScreen extends React.Component { * @return {*} */ getPersonalCard() { - const {theme, navigation} = this.props; + const { theme, navigation } = this.props; return ( { title: i18n.t('screens.websites.amicale'), }); }} - style={styles.editButton}> + style={styles.editButton} + > {i18n.t('screens.profile.editInformation')} @@ -312,7 +319,7 @@ class ProfileScreen extends React.Component { * @return {*} */ getClubCard() { - const {theme} = this.props; + const { theme } = this.props; return ( { * @return {*} */ getMembershipCar() { - const {theme} = this.props; + const { theme } = this.props; return ( { * @return {*} */ getMembershipItem(state: boolean) { - const {theme} = this.props; + const { theme } = this.props; return ( { * @param item The club to render * @return {*} */ - getClubListItem = ({item}: {item: ClubType}) => { - const {theme} = this.props; + getClubListItem = ({ item }: { item: ClubType }) => { + const { theme } = this.props; const onPress = () => { this.openClubDetailsScreen(item.id); }; @@ -458,11 +465,11 @@ class ProfileScreen extends React.Component { sortClubList = (a: ClubType): number => (a.is_manager ? -1 : 1); showDisconnectDialog = () => { - this.setState({dialogVisible: true}); + this.setState({ dialogVisible: true }); }; hideDisconnectDialog = () => { - this.setState({dialogVisible: false}); + this.setState({ dialogVisible: false }); }; /** @@ -470,12 +477,12 @@ class ProfileScreen extends React.Component { * @param id The club's id to open */ openClubDetailsScreen(id: number) { - const {navigation} = this.props; - navigation.navigate('club-information', {clubId: id}); + const { navigation } = this.props; + navigation.navigate('club-information', { clubId: id }); } render() { - const {navigation} = this.props; + const { navigation } = this.props; return ( { today: Date; - mainFlatListData: Array<{key: string}>; + mainFlatListData: Array<{ key: string }>; lastRefresh: Date | null; - authRef: {current: null | AuthenticatedScreen}; + authRef: { current: null | AuthenticatedScreen }; constructor(props: PropsType) { super(props); @@ -146,14 +155,14 @@ export default class VoteScreen extends React.Component { this.state = { hasVoted: false, mascotDialogVisible: AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.voteShowMascot.key, + AsyncStorageManager.PREFERENCES.voteShowMascot.key ), }; this.hasVoted = false; this.today = new Date(); this.authRef = React.createRef(); this.lastRefresh = null; - this.mainFlatListData = [{key: 'main'}, {key: 'info'}]; + this.mainFlatListData = [{ key: 'main' }, { key: 'info' }]; } /** @@ -174,7 +183,7 @@ export default class VoteScreen extends React.Component { return dateString; } - getMainRenderItem = ({item}: {item: {key: string}}) => { + getMainRenderItem = ({ item }: { item: { key: string } }) => { if (item.key === 'info') { return ( @@ -182,11 +191,8 @@ export default class VoteScreen extends React.Component { mode="contained" icon="help-circle" onPress={this.showMascotDialog} - style={{ - marginLeft: 'auto', - marginRight: 'auto', - marginTop: 20, - }}> + style={styles.button} + > {i18n.t('screens.vote.mascotDialog.title')} @@ -196,7 +202,7 @@ export default class VoteScreen extends React.Component { }; getScreen = (data: Array) => { - const {state} = this; + const { state } = this; // data[0] = FAKE_TEAMS2; // data[1] = FAKE_DATE; this.lastRefresh = new Date(); @@ -229,7 +235,7 @@ export default class VoteScreen extends React.Component { }; getContent() { - const {state} = this; + const { state } = this; if (!this.isVoteStarted()) { return this.getTeaseVoteCard(); } @@ -245,7 +251,7 @@ export default class VoteScreen extends React.Component { return ; } - onVoteSuccess = (): void => this.setState({hasVoted: true}); + onVoteSuccess = (): void => this.setState({ hasVoted: true }); /** * The user has not voted yet, and the votes are open @@ -270,7 +276,7 @@ export default class VoteScreen extends React.Component { teams={this.teams} dateEnd={this.getDateString( this.dates.date_result_end, - this.datesString.date_result_end, + this.datesString.date_result_end )} /> ); @@ -287,7 +293,7 @@ export default class VoteScreen extends React.Component { ); @@ -299,7 +305,7 @@ export default class VoteScreen extends React.Component { * Votes have ended, or user has voted waiting for results */ getWaitVoteCard() { - const {state} = this; + const { state } = this; let startDate = null; if ( this.dates != null && @@ -308,7 +314,7 @@ export default class VoteScreen extends React.Component { ) { startDate = this.getDateString( this.dates.date_result_begin, - this.datesString.date_result_begin, + this.datesString.date_result_begin ); } return ( @@ -326,7 +332,7 @@ export default class VoteScreen extends React.Component { */ reloadData = () => { let canRefresh; - const {lastRefresh} = this; + const { lastRefresh } = this; if (lastRefresh != null) { canRefresh = new Date().getTime() - lastRefresh.getTime() > MIN_REFRESH_TIME; @@ -339,15 +345,15 @@ export default class VoteScreen extends React.Component { }; showMascotDialog = () => { - this.setState({mascotDialogVisible: true}); + this.setState({ mascotDialogVisible: true }); }; hideMascotDialog = () => { AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.voteShowMascot.key, - false, + false ); - this.setState({mascotDialogVisible: false}); + this.setState({ mascotDialogVisible: false }); }; isVoteStarted(): boolean { @@ -412,9 +418,9 @@ export default class VoteScreen extends React.Component { * @returns {*} */ render() { - const {props, state} = this; + const { props, state } = this; return ( - + navigation={props.navigation} ref={this.authRef} diff --git a/src/screens/Game/Shapes/BaseShape.ts b/src/screens/Game/Shapes/BaseShape.ts index 86a95fe..0b62bd9 100644 --- a/src/screens/Game/Shapes/BaseShape.ts +++ b/src/screens/Game/Shapes/BaseShape.ts @@ -17,8 +17,6 @@ * along with Campus INSAT. If not, see . */ -// @flow - export type CoordinatesType = { x: number; y: number; @@ -49,7 +47,7 @@ export default class BaseShape { } this.theme = theme; this.#rotation = 0; - this.position = {x: 0, y: 0}; + this.position = { x: 0, y: 0 }; this.#currentShape = this.getShapes()[this.#rotation]; } @@ -96,7 +94,7 @@ export default class BaseShape { y: this.position.y + row, }); } else { - coordinates.push({x: col, y: row}); + coordinates.push({ x: col, y: row }); } } } diff --git a/src/screens/Game/Shapes/ShapeI.ts b/src/screens/Game/Shapes/ShapeI.ts index d8b395f..920b41f 100644 --- a/src/screens/Game/Shapes/ShapeI.ts +++ b/src/screens/Game/Shapes/ShapeI.ts @@ -18,7 +18,7 @@ */ import BaseShape from './BaseShape'; -import type {ShapeType} from './BaseShape'; +import type { ShapeType } from './BaseShape'; export default class ShapeI extends BaseShape { constructor(theme: ReactNativePaper.Theme) { diff --git a/src/screens/Game/Shapes/ShapeJ.ts b/src/screens/Game/Shapes/ShapeJ.ts index 09c6bfd..0c3cd90 100644 --- a/src/screens/Game/Shapes/ShapeJ.ts +++ b/src/screens/Game/Shapes/ShapeJ.ts @@ -18,7 +18,7 @@ */ import BaseShape from './BaseShape'; -import type {ShapeType} from './BaseShape'; +import type { ShapeType } from './BaseShape'; export default class ShapeJ extends BaseShape { constructor(theme: ReactNativePaper.Theme) { diff --git a/src/screens/Game/Shapes/ShapeL.ts b/src/screens/Game/Shapes/ShapeL.ts index 310f7c2..cc80c5f 100644 --- a/src/screens/Game/Shapes/ShapeL.ts +++ b/src/screens/Game/Shapes/ShapeL.ts @@ -18,7 +18,7 @@ */ import BaseShape from './BaseShape'; -import type {ShapeType} from './BaseShape'; +import type { ShapeType } from './BaseShape'; export default class ShapeL extends BaseShape { constructor(theme: ReactNativePaper.Theme) { diff --git a/src/screens/Game/Shapes/ShapeO.ts b/src/screens/Game/Shapes/ShapeO.ts index 00eec59..0ff7cce 100644 --- a/src/screens/Game/Shapes/ShapeO.ts +++ b/src/screens/Game/Shapes/ShapeO.ts @@ -18,7 +18,7 @@ */ import BaseShape from './BaseShape'; -import type {ShapeType} from './BaseShape'; +import type { ShapeType } from './BaseShape'; export default class ShapeO extends BaseShape { constructor(theme: ReactNativePaper.Theme) { diff --git a/src/screens/Game/Shapes/ShapeS.ts b/src/screens/Game/Shapes/ShapeS.ts index 6f397df..491f8c9 100644 --- a/src/screens/Game/Shapes/ShapeS.ts +++ b/src/screens/Game/Shapes/ShapeS.ts @@ -18,7 +18,7 @@ */ import BaseShape from './BaseShape'; -import type {ShapeType} from './BaseShape'; +import type { ShapeType } from './BaseShape'; export default class ShapeS extends BaseShape { constructor(theme: ReactNativePaper.Theme) { diff --git a/src/screens/Game/Shapes/ShapeT.ts b/src/screens/Game/Shapes/ShapeT.ts index 71b1e80..4e8f450 100644 --- a/src/screens/Game/Shapes/ShapeT.ts +++ b/src/screens/Game/Shapes/ShapeT.ts @@ -18,7 +18,7 @@ */ import BaseShape from './BaseShape'; -import type {ShapeType} from './BaseShape'; +import type { ShapeType } from './BaseShape'; export default class ShapeT extends BaseShape { constructor(theme: ReactNativePaper.Theme) { diff --git a/src/screens/Game/Shapes/ShapeZ.ts b/src/screens/Game/Shapes/ShapeZ.ts index b24e13e..353e6e1 100644 --- a/src/screens/Game/Shapes/ShapeZ.ts +++ b/src/screens/Game/Shapes/ShapeZ.ts @@ -18,7 +18,7 @@ */ import BaseShape from './BaseShape'; -import type {ShapeType} from './BaseShape'; +import type { ShapeType } from './BaseShape'; export default class ShapeZ extends BaseShape { constructor(theme: ReactNativePaper.Theme) { diff --git a/src/screens/Game/__tests__/GridManager.test.js b/src/screens/Game/__tests__/GridManager.test.js index 53bfd6b..b42888d 100644 --- a/src/screens/Game/__tests__/GridManager.test.js +++ b/src/screens/Game/__tests__/GridManager.test.js @@ -17,9 +17,6 @@ * along with Campus INSAT. If not, see . */ -/* eslint-disable */ - -import React from 'react'; import GridManager from '../logic/GridManager'; import ScoreManager from '../logic/ScoreManager'; import Piece from '../logic/Piece'; @@ -39,8 +36,8 @@ afterAll(() => { test('getEmptyLine', () => { let g = new GridManager(2, 2, theme); expect(g.getEmptyLine(2)).toStrictEqual([ - {color: theme.colors.tetrisBackground, isEmpty: true, key: '0'}, - {color: theme.colors.tetrisBackground, isEmpty: true, key: '1'}, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '0' }, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '1' }, ]); expect(g.getEmptyLine(-1)).toStrictEqual([]); @@ -50,12 +47,12 @@ test('getEmptyGrid', () => { let g = new GridManager(2, 2, theme); expect(g.getEmptyGrid(2, 2)).toStrictEqual([ [ - {color: theme.colors.tetrisBackground, isEmpty: true, key: '0'}, - {color: theme.colors.tetrisBackground, isEmpty: true, key: '1'}, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '0' }, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '1' }, ], [ - {color: theme.colors.tetrisBackground, isEmpty: true, key: '0'}, - {color: theme.colors.tetrisBackground, isEmpty: true, key: '1'}, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '0' }, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '1' }, ], ]); @@ -67,7 +64,7 @@ test('getLinesToClear', () => { let g = new GridManager(2, 2, theme); g.getCurrentGrid()[0][0].isEmpty = false; g.getCurrentGrid()[0][1].isEmpty = false; - let coord = [{x: 1, y: 0}]; + let coord = [{ x: 1, y: 0 }]; expect(g.getLinesToClear(coord)).toStrictEqual([0]); g.getCurrentGrid()[0][0].isEmpty = true; @@ -75,7 +72,7 @@ test('getLinesToClear', () => { g.getCurrentGrid()[1][0].isEmpty = false; g.getCurrentGrid()[1][1].isEmpty = false; expect(g.getLinesToClear(coord)).toStrictEqual([]); - coord = [{x: 1, y: 1}]; + coord = [{ x: 1, y: 1 }]; expect(g.getLinesToClear(coord)).toStrictEqual([1]); }); @@ -83,12 +80,12 @@ test('clearLines', () => { let g = new GridManager(2, 2, theme); let grid = [ [ - {color: theme.colors.tetrisBackground, isEmpty: true, key: '0'}, - {color: theme.colors.tetrisBackground, isEmpty: true, key: '1'}, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '0' }, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '1' }, ], [ - {color: '0', isEmpty: true, key: '0'}, - {color: '0', isEmpty: true, key: '1'}, + { color: '0', isEmpty: true, key: '0' }, + { color: '0', isEmpty: true, key: '1' }, ], ]; g.getCurrentGrid()[1][0].color = '0'; @@ -98,12 +95,12 @@ test('clearLines', () => { g.clearLines([1], scoreManager); grid = [ [ - {color: theme.colors.tetrisBackground, isEmpty: true, key: '0'}, - {color: theme.colors.tetrisBackground, isEmpty: true, key: '1'}, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '0' }, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '1' }, ], [ - {color: theme.colors.tetrisBackground, isEmpty: true, key: '0'}, - {color: theme.colors.tetrisBackground, isEmpty: true, key: '1'}, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '0' }, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '1' }, ], ]; expect(g.getCurrentGrid()).toStrictEqual(grid); diff --git a/src/screens/Game/__tests__/Piece.test.js b/src/screens/Game/__tests__/Piece.test.js index d07f78d..3143ebe 100644 --- a/src/screens/Game/__tests__/Piece.test.js +++ b/src/screens/Game/__tests__/Piece.test.js @@ -17,9 +17,6 @@ * along with Campus INSAT. If not, see . */ -/* eslint-disable */ - -import React from 'react'; import Piece from '../logic/Piece'; import ShapeI from '../Shapes/ShapeI'; @@ -33,11 +30,9 @@ let theme = { jest.mock('../Shapes/ShapeI'); beforeAll(() => { - jest - .spyOn(Piece.prototype, 'getRandomShape') - .mockImplementation((colors: Object) => { - return new ShapeI(colors); - }); + jest.spyOn(Piece.prototype, 'getRandomShape').mockImplementation((colors) => { + return new ShapeI(colors); + }); }); afterAll(() => { @@ -50,11 +45,11 @@ test('isPositionValid', () => { let spy = jest .spyOn(ShapeI.prototype, 'getCellsCoordinates') .mockImplementation(() => { - return [{x: x, y: y}]; + return [{ x: x, y: y }]; }); let grid = [ - [{isEmpty: true}, {isEmpty: true}], - [{isEmpty: true}, {isEmpty: false}], + [{ isEmpty: true }, { isEmpty: true }], + [{ isEmpty: true }, { isEmpty: false }], ]; let size = 2; @@ -149,29 +144,29 @@ test('toGrid', () => { let spy1 = jest .spyOn(ShapeI.prototype, 'getCellsCoordinates') .mockImplementation(() => { - return [{x: x, y: y}]; + return [{ x: x, y: y }]; }); let spy2 = jest.spyOn(ShapeI.prototype, 'getColor').mockImplementation(() => { return theme.colors.tetrisI; }); let grid = [ [ - {isEmpty: true, key: '0'}, - {isEmpty: true, key: '1'}, + { isEmpty: true, key: '0' }, + { isEmpty: true, key: '1' }, ], [ - {isEmpty: true, key: '0'}, - {isEmpty: true, key: '1'}, + { isEmpty: true, key: '0' }, + { isEmpty: true, key: '1' }, ], ]; let expectedGrid = [ [ - {color: theme.colors.tetrisI, isEmpty: false, key: '0'}, - {isEmpty: true, key: '1'}, + { color: theme.colors.tetrisI, isEmpty: false, key: '0' }, + { isEmpty: true, key: '1' }, ], [ - {isEmpty: true, key: '0'}, - {isEmpty: true, key: '1'}, + { isEmpty: true, key: '0' }, + { isEmpty: true, key: '1' }, ], ]; @@ -186,21 +181,21 @@ test('toGrid', () => { test('removeFromGrid', () => { let gridOld = [ [ - {color: theme.colors.tetrisI, isEmpty: false, key: '0'}, - {color: theme.colors.tetrisI, isEmpty: false, key: '1'}, - {color: theme.colors.tetrisBackground, isEmpty: true, key: '2'}, + { color: theme.colors.tetrisI, isEmpty: false, key: '0' }, + { color: theme.colors.tetrisI, isEmpty: false, key: '1' }, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '2' }, ], ]; let gridNew = [ [ - {color: theme.colors.tetrisBackground, isEmpty: true, key: '0'}, - {color: theme.colors.tetrisBackground, isEmpty: true, key: '1'}, - {color: theme.colors.tetrisBackground, isEmpty: true, key: '2'}, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '0' }, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '1' }, + { color: theme.colors.tetrisBackground, isEmpty: true, key: '2' }, ], ]; let oldCoord = [ - {x: 0, y: 0}, - {x: 1, y: 0}, + { x: 0, y: 0 }, + { x: 1, y: 0 }, ]; let spy1 = jest .spyOn(ShapeI.prototype, 'getCellsCoordinates') diff --git a/src/screens/Game/__tests__/ScoreManager.test.js b/src/screens/Game/__tests__/ScoreManager.test.js index 4fb01d4..13aa7af 100644 --- a/src/screens/Game/__tests__/ScoreManager.test.js +++ b/src/screens/Game/__tests__/ScoreManager.test.js @@ -17,9 +17,6 @@ * along with Campus INSAT. If not, see . */ -/* eslint-disable */ - -import React from 'react'; import ScoreManager from '../logic/ScoreManager'; test('incrementScore', () => { diff --git a/src/screens/Game/__tests__/Shape.test.js b/src/screens/Game/__tests__/Shape.test.js index 285c78b..e7d2c1c 100644 --- a/src/screens/Game/__tests__/Shape.test.js +++ b/src/screens/Game/__tests__/Shape.test.js @@ -17,9 +17,6 @@ * along with Campus INSAT. If not, see . */ -/* eslint-disable */ - -import React from 'react'; import BaseShape from '../Shapes/BaseShape'; import ShapeI from '../Shapes/ShapeI'; @@ -87,41 +84,41 @@ test('rotate', () => { test('getCellsCoordinates', () => { let T = new ShapeI(theme); expect(T.getCellsCoordinates(false)).toStrictEqual([ - {x: 0, y: 1}, - {x: 1, y: 1}, - {x: 2, y: 1}, - {x: 3, y: 1}, + { x: 0, y: 1 }, + { x: 1, y: 1 }, + { x: 2, y: 1 }, + { x: 3, y: 1 }, ]); expect(T.getCellsCoordinates(true)).toStrictEqual([ - {x: 3, y: 1}, - {x: 4, y: 1}, - {x: 5, y: 1}, - {x: 6, y: 1}, + { x: 3, y: 1 }, + { x: 4, y: 1 }, + { x: 5, y: 1 }, + { x: 6, y: 1 }, ]); T.move(1, 1); expect(T.getCellsCoordinates(false)).toStrictEqual([ - {x: 0, y: 1}, - {x: 1, y: 1}, - {x: 2, y: 1}, - {x: 3, y: 1}, + { x: 0, y: 1 }, + { x: 1, y: 1 }, + { x: 2, y: 1 }, + { x: 3, y: 1 }, ]); expect(T.getCellsCoordinates(true)).toStrictEqual([ - {x: 4, y: 2}, - {x: 5, y: 2}, - {x: 6, y: 2}, - {x: 7, y: 2}, + { x: 4, y: 2 }, + { x: 5, y: 2 }, + { x: 6, y: 2 }, + { x: 7, y: 2 }, ]); T.rotate(true); expect(T.getCellsCoordinates(false)).toStrictEqual([ - {x: 2, y: 0}, - {x: 2, y: 1}, - {x: 2, y: 2}, - {x: 2, y: 3}, + { x: 2, y: 0 }, + { x: 2, y: 1 }, + { x: 2, y: 2 }, + { x: 2, y: 3 }, ]); expect(T.getCellsCoordinates(true)).toStrictEqual([ - {x: 6, y: 1}, - {x: 6, y: 2}, - {x: 6, y: 3}, - {x: 6, y: 4}, + { x: 6, y: 1 }, + { x: 6, y: 2 }, + { x: 6, y: 3 }, + { x: 6, y: 4 }, ]); }); diff --git a/src/screens/Game/components/CellComponent.tsx b/src/screens/Game/components/CellComponent.tsx index bf266a6..525d181 100644 --- a/src/screens/Game/components/CellComponent.tsx +++ b/src/screens/Game/components/CellComponent.tsx @@ -18,25 +18,32 @@ */ import * as React from 'react'; -import {View} from 'react-native'; +import { StyleSheet, View } from 'react-native'; -export type CellType = {color: string; isEmpty: boolean; key: string}; +export type CellType = { color: string; isEmpty: boolean; key: string }; type PropsType = { cell: CellType; }; +const styles = StyleSheet.create({ + cell: { + flex: 1, + borderColor: 'transparent', + borderRadius: 4, + borderWidth: 1, + aspectRatio: 1, + }, +}); + function CellComponent(props: PropsType) { const item = props.cell; + const backgroundColor = item.isEmpty ? 'transparent' : item.color; return ( ); diff --git a/src/screens/Game/components/GridComponent.tsx b/src/screens/Game/components/GridComponent.tsx index 05706b2..78f2271 100644 --- a/src/screens/Game/components/GridComponent.tsx +++ b/src/screens/Game/components/GridComponent.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {View, ViewStyle} from 'react-native'; -import type {CellType} from './CellComponent'; +import { StyleSheet, View, ViewStyle } from 'react-native'; +import type { CellType } from './CellComponent'; import CellComponent from './CellComponent'; export type GridType = Array>; @@ -31,13 +31,22 @@ type PropsType = { style: ViewStyle; }; +const styles = StyleSheet.create({ + row: { + flexDirection: 'row', + }, + grid: { + borderRadius: 4, + }, +}); + const getCellRender = (item: CellType) => { return ; }; function getRow(grid: GridType, rowNumber: number) { return ( - + {grid[rowNumber].map(getCellRender)} ); @@ -52,14 +61,15 @@ function getGrid(grid: GridType, height: number) { } function GridComponent(props: PropsType) { - const {style, width, height, grid} = props; + const { style, width, height, grid } = props; return ( + ...styles.grid, + }} + > {getGrid(grid, height)} ); diff --git a/src/screens/Game/components/Preview.tsx b/src/screens/Game/components/Preview.tsx index 58dca1a..a6cd3bf 100644 --- a/src/screens/Game/components/Preview.tsx +++ b/src/screens/Game/components/Preview.tsx @@ -18,8 +18,8 @@ */ import * as React from 'react'; -import {View, ViewStyle} from 'react-native'; -import type {GridType} from './GridComponent'; +import { StyleSheet, View, ViewStyle } from 'react-native'; +import type { GridType } from './GridComponent'; import GridComponent from './GridComponent'; type PropsType = { @@ -27,17 +27,21 @@ type PropsType = { style: ViewStyle; }; +const styles = StyleSheet.create({ + grid: { + marginRight: 5, + marginLeft: 5, + marginBottom: 5, + }, +}); + function getGridRender(item: GridType, index: number) { return ( ); @@ -53,7 +57,7 @@ function getGrids(items: Array) { class Preview extends React.PureComponent { render() { - const {style, items} = this.props; + const { style, items } = this.props; if (items.length > 0) { return {getGrids(items)}; } diff --git a/src/screens/Game/logic/GameLogic.ts b/src/screens/Game/logic/GameLogic.ts index 4458a02..bcc335c 100644 --- a/src/screens/Game/logic/GameLogic.ts +++ b/src/screens/Game/logic/GameLogic.ts @@ -20,12 +20,12 @@ import Piece from './Piece'; import ScoreManager from './ScoreManager'; import GridManager from './GridManager'; -import type {GridType} from '../components/GridComponent'; +import type { GridType } from '../components/GridComponent'; export type TickCallbackType = ( score: number, level: number, - grid: GridType, + grid: GridType ) => void; export type ClockCallbackType = (time: number) => void; @@ -33,7 +33,7 @@ export type ClockCallbackType = (time: number) => void; export type EndCallbackType = ( time: number, score: number, - isRestart: boolean, + isRestart: boolean ) => void; export type MovementCallbackType = (grid: GridType, score?: number) => void; @@ -101,7 +101,7 @@ export default class GameLogic { this.gridManager = new GridManager( this.getWidth(), this.getHeight(), - this.theme, + this.theme ); } @@ -179,14 +179,14 @@ export default class GameLogic { this.gridManager.getCurrentGrid(), this.getWidth(), this.getHeight(), - this.onFreeze, + this.onFreeze ); } if (callback) { callback( this.scoreManager.getScore(), this.scoreManager.getLevel(), - this.gridManager.getCurrentGrid(), + this.gridManager.getCurrentGrid() ); } if (this.scoreManager.canLevelUp()) { @@ -224,7 +224,7 @@ export default class GameLogic { isInitial: boolean, callback: MovementCallbackType, x: number, - y: number, + y: number ) { if (!this.canUseInput() || !this.isPressedIn) { return; @@ -237,14 +237,14 @@ export default class GameLogic { this.gridManager.getCurrentGrid(), this.getWidth(), this.getHeight(), - this.onFreeze, + this.onFreeze ); if (moved) { if (y === 1) { this.scoreManager.incrementScore(); callback( this.gridManager.getCurrentGrid(), - this.scoreManager.getScore(), + this.scoreManager.getScore() ); } else { callback(this.gridManager.getCurrentGrid()); @@ -254,7 +254,7 @@ export default class GameLogic { () => { this.movePressedRepeat(false, callback, x, y); }, - isInitial ? this.autoRepeatActivationDelay : this.autoRepeatDelay, + isInitial ? this.autoRepeatActivationDelay : this.autoRepeatDelay ); } @@ -275,7 +275,7 @@ export default class GameLogic { this.currentObject.tryRotate( this.gridManager.getCurrentGrid(), this.getWidth(), - this.getHeight(), + this.getHeight() ) ) { callback(this.gridManager.getCurrentGrid()); @@ -315,7 +315,7 @@ export default class GameLogic { !this.currentObject.isPositionValid( this.gridManager.getCurrentGrid(), this.getWidth(), - this.getHeight(), + this.getHeight() ) ) { this.endGame(false); @@ -346,7 +346,7 @@ export default class GameLogic { startGame( tickCallback: TickCallbackType, clockCallback: ClockCallbackType, - endCallback: EndCallbackType, + endCallback: EndCallbackType ) { if (this.gameRunning) { this.endGame(true); @@ -359,7 +359,7 @@ export default class GameLogic { this.gridManager = new GridManager( this.getWidth(), this.getHeight(), - this.theme, + this.theme ); this.nextPieces = []; this.generateNextPieces(); @@ -367,7 +367,7 @@ export default class GameLogic { tickCallback( this.scoreManager.getScore(), this.scoreManager.getLevel(), - this.gridManager.getCurrentGrid(), + this.gridManager.getCurrentGrid() ); clockCallback(this.gameTime); this.startTick(); diff --git a/src/screens/Game/logic/GridManager.ts b/src/screens/Game/logic/GridManager.ts index f242151..ada0d89 100644 --- a/src/screens/Game/logic/GridManager.ts +++ b/src/screens/Game/logic/GridManager.ts @@ -19,9 +19,9 @@ import Piece from './Piece'; import ScoreManager from './ScoreManager'; -import type {CoordinatesType} from '../Shapes/BaseShape'; -import type {GridType} from '../components/GridComponent'; -import type {CellType} from '../components/CellComponent'; +import type { CoordinatesType } from '../Shapes/BaseShape'; +import type { GridType } from '../components/GridComponent'; +import type { CellType } from '../components/CellComponent'; /** * Class used to manage the game grid @@ -134,7 +134,7 @@ export default class GridManager { freezeTetromino(currentObject: Piece, scoreManager: ScoreManager) { this.clearLines( this.getLinesToClear(currentObject.getCoordinates()), - scoreManager, + scoreManager ); } } diff --git a/src/screens/Game/logic/Piece.ts b/src/screens/Game/logic/Piece.ts index d2fc852..d0849a2 100644 --- a/src/screens/Game/logic/Piece.ts +++ b/src/screens/Game/logic/Piece.ts @@ -24,9 +24,9 @@ import ShapeO from '../Shapes/ShapeO'; import ShapeS from '../Shapes/ShapeS'; import ShapeT from '../Shapes/ShapeT'; import ShapeZ from '../Shapes/ShapeZ'; -import type {CoordinatesType} from '../Shapes/BaseShape'; +import type { CoordinatesType } from '../Shapes/BaseShape'; import BaseShape from '../Shapes/BaseShape'; -import type {GridType} from '../components/GridComponent'; +import type { GridType } from '../components/GridComponent'; /** * Class used as an abstraction layer for shapes. @@ -66,7 +66,7 @@ export default class Piece { */ removeFromGrid(grid: GridType) { const pos: Array = this.currentShape.getCellsCoordinates( - true, + true ); pos.forEach((coordinates: CoordinatesType) => { grid[coordinates.y][coordinates.x] = { @@ -85,7 +85,7 @@ export default class Piece { */ toGrid(grid: GridType, isPreview: boolean) { const pos: Array = this.currentShape.getCellsCoordinates( - !isPreview, + !isPreview ); pos.forEach((coordinates: CoordinatesType) => { grid[coordinates.y][coordinates.x] = { @@ -107,7 +107,7 @@ export default class Piece { isPositionValid(grid: GridType, width: number, height: number): boolean { let isValid = true; const pos: Array = this.currentShape.getCellsCoordinates( - true, + true ); for (let i = 0; i < pos.length; i += 1) { if ( @@ -141,7 +141,7 @@ export default class Piece { grid: GridType, width: number, height: number, - freezeCallback: () => void, + freezeCallback: () => void ): boolean { let newX = x; let newY = y; diff --git a/src/screens/Game/screens/GameMainScreen.tsx b/src/screens/Game/screens/GameMainScreen.tsx index 89356b1..5ef7f23 100644 --- a/src/screens/Game/screens/GameMainScreen.tsx +++ b/src/screens/Game/screens/GameMainScreen.tsx @@ -18,24 +18,25 @@ */ import * as React from 'react'; -import {View} from 'react-native'; -import {Caption, IconButton, Text, withTheme} from 'react-native-paper'; +import { StyleSheet, View } from 'react-native'; +import { Caption, IconButton, Text, withTheme } from 'react-native-paper'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import i18n from 'i18n-js'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { StackNavigationProp } from '@react-navigation/stack'; import GameLogic from '../logic/GameLogic'; -import type {GridType} from '../components/GridComponent'; +import type { GridType } from '../components/GridComponent'; import GridComponent from '../components/GridComponent'; import Preview from '../components/Preview'; import MaterialHeaderButtons, { Item, } from '../../../components/Overrides/CustomHeaderButton'; -import type {OptionsDialogButtonType} from '../../../components/Dialogs/OptionsDialog'; +import type { OptionsDialogButtonType } from '../../../components/Dialogs/OptionsDialog'; import OptionsDialog from '../../../components/Dialogs/OptionsDialog'; +import GENERAL_STYLES from '../../../constants/Styles'; type PropsType = { navigation: StackNavigationProp; - route: {params: {highScore: number}}; + route: { params: { highScore: number } }; theme: ReactNativePaper.Theme; }; @@ -52,6 +53,67 @@ type StateType = { onDialogDismiss: () => void; }; +const styles = StyleSheet.create({ + container: { + flex: 1, + flexDirection: 'row', + }, + gridContainer: { + flex: 4, + }, + centerSmallMargin: { + ...GENERAL_STYLES.centerHorizontal, + marginBottom: 5, + }, + centerVerticalSmallMargin: { + ...GENERAL_STYLES.centerVertical, + marginLeft: 5, + }, + centerBigMargin: { + marginLeft: 'auto', + marginRight: 'auto', + marginBottom: 20, + }, + statusContainer: { + flexDirection: 'row', + }, + statusIcon: { + marginLeft: 5, + }, + scoreMainContainer: { + marginTop: 10, + marginBottom: 10, + }, + scoreCurrentContainer: { + flexDirection: 'row', + marginLeft: 'auto', + marginRight: 'auto', + }, + scoreText: { + marginLeft: 5, + fontSize: 20, + }, + scoreBestContainer: { + flexDirection: 'row', + marginLeft: 'auto', + marginRight: 'auto', + marginTop: 5, + }, + controlsContainer: { + height: 80, + flexDirection: 'row', + }, + directionsContainer: { + flexDirection: 'row', + flex: 4, + }, + preview: { + marginLeft: 'auto', + marginRight: 'auto', + marginTop: 10, + }, +}); + class GameMainScreen extends React.Component { static getFormattedTime(seconds: number): string { const date = new Date(); @@ -94,7 +156,7 @@ class GameMainScreen extends React.Component { } componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; navigation.setOptions({ headerRight: this.getRightButton, }); @@ -128,11 +190,11 @@ class GameMainScreen extends React.Component { }; onDialogDismiss = () => { - this.setState({dialogVisible: false}); + this.setState({ dialogVisible: false }); }; onGameEnd = (time: number, score: number, isRestart: boolean) => { - const {props, state} = this; + const { props, state } = this; this.setState({ gameTime: time, gameScore: score, @@ -147,31 +209,19 @@ class GameMainScreen extends React.Component { }; getStatusIcons() { - const {props, state} = this; + const { props, state } = this; return ( - - + ...GENERAL_STYLES.flex, + ...GENERAL_STYLES.centerVertical, + }} + > + + {i18n.t('screens.game.time')} - + { /> + }} + > {GameMainScreen.getFormattedTime(state.gameTime)} - - + + {i18n.t('screens.game.level')} - + - - {state.gameLevel} - + {state.gameLevel} @@ -222,65 +255,38 @@ class GameMainScreen extends React.Component { } getScoreIcon() { - const {props, state} = this; + const { props, state } = this; const highScore = this.highScore == null || state.gameScore > this.highScore ? state.gameScore : this.highScore; return ( - - - - {i18n.t('screens.game.score', {score: state.gameScore})} + + + + {i18n.t('screens.game.score', { score: state.gameScore })} - + - {i18n.t('screens.game.highScore', {score: highScore})} + }} + > + {i18n.t('screens.game.highScore', { score: highScore })} @@ -288,30 +294,22 @@ class GameMainScreen extends React.Component { } getControlButtons() { - const {props} = this; + const { props } = this; return ( - + { this.logic.rotatePressed(this.updateGrid); }} - style={{flex: 1}} + style={GENERAL_STYLES.flex} /> - + { this.logic.pressedOut(); }} @@ -322,7 +320,7 @@ class GameMainScreen extends React.Component { { this.logic.pressedOut(); }} @@ -340,7 +338,7 @@ class GameMainScreen extends React.Component { onPress={() => { this.logic.pressedOut(); }} - style={{flex: 1}} + style={GENERAL_STYLES.flex} color={props.theme.colors.tetrisScore} /> @@ -420,16 +418,12 @@ class GameMainScreen extends React.Component { }; render() { - const {props, state} = this; + const { props, state } = this; return ( - - + + {this.getStatusIcons()} - + {this.getScoreIcon()} { grid={state.grid} style={{ backgroundColor: props.theme.colors.tetrisBackground, - flex: 1, - marginLeft: 'auto', - marginRight: 'auto', + ...GENERAL_STYLES.flex, + ...GENERAL_STYLES.centerHorizontal, }} /> - + diff --git a/src/screens/Game/screens/GameStartScreen.tsx b/src/screens/Game/screens/GameStartScreen.tsx index 0248f08..bcb7480 100644 --- a/src/screens/Game/screens/GameStartScreen.tsx +++ b/src/screens/Game/screens/GameStartScreen.tsx @@ -18,7 +18,7 @@ */ import * as React from 'react'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { StackNavigationProp } from '@react-navigation/stack'; import { Button, Card, @@ -28,20 +28,21 @@ import { Text, withTheme, } from 'react-native-paper'; -import {View} from 'react-native'; +import { StyleSheet, View } from 'react-native'; import i18n from 'i18n-js'; import * as Animatable from 'react-native-animatable'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import LinearGradient from 'react-native-linear-gradient'; -import Mascot, {MASCOT_STYLE} from '../../../components/Mascot/Mascot'; +import Mascot, { MASCOT_STYLE } from '../../../components/Mascot/Mascot'; import MascotPopup from '../../../components/Mascot/MascotPopup'; import AsyncStorageManager from '../../../managers/AsyncStorageManager'; -import type {GridType} from '../components/GridComponent'; +import type { GridType } from '../components/GridComponent'; import GridComponent from '../components/GridComponent'; import GridManager from '../logic/GridManager'; import Piece from '../logic/Piece'; import SpeechArrow from '../../../components/Mascot/SpeechArrow'; import CollapsibleScrollView from '../../../components/Collapsible/CollapsibleScrollView'; +import GENERAL_STYLES from '../../../constants/Styles'; type GameStatsType = { score: number; @@ -57,6 +58,87 @@ type PropsType = { theme: ReactNativePaper.Theme; }; +const styles = StyleSheet.create({ + pieceContainer: { + position: 'absolute', + width: '100%', + height: '100%', + }, + pieceBackground: { + position: 'absolute', + }, + playButton: { + marginLeft: 'auto', + marginRight: 'auto', + marginTop: 10, + }, + recapCard: { + borderWidth: 2, + marginLeft: 20, + marginRight: 20, + }, + recapContainer: { + flexDirection: 'row', + marginLeft: 'auto', + marginRight: 'auto', + }, + recapScoreContainer: { + flexDirection: 'row', + marginLeft: 'auto', + marginRight: 'auto', + marginTop: 10, + marginBottom: 10, + }, + recapScore: { + fontSize: 20, + }, + recapScoreIcon: { + marginLeft: 5, + }, + recapIcon: { + marginRight: 5, + marginLeft: 5, + }, + welcomeMascot: { + width: '40%', + marginLeft: 'auto', + marginRight: 'auto', + }, + welcomeCard: { + borderWidth: 2, + marginLeft: 10, + marginRight: 10, + }, + centertext: { + textAlign: 'center', + }, + welcomeText: { + textAlign: 'center', + marginTop: 10, + }, + speechArrow: { + marginLeft: '60%', + }, + podiumContainer: { + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'flex-end', + }, + podiumIconContainer: { + position: 'absolute', + top: -20, + }, + topScoreContainer: { + marginBottom: 20, + marginTop: 20, + }, + topScoreSubcontainer: { + flexDirection: 'row', + marginLeft: 'auto', + marginRight: 'auto', + }, +}); + class GameStartScreen extends React.Component { gridManager: GridManager; @@ -71,7 +153,7 @@ class GameStartScreen extends React.Component { this.isHighScore = false; this.gridManager = new GridManager(4, 4, props.theme); this.scores = AsyncStorageManager.getObject( - AsyncStorageManager.PREFERENCES.gameScores.key, + AsyncStorageManager.PREFERENCES.gameScores.key ); this.scores.sort((a: number, b: number): number => b - a); if (props.route.params != null) { @@ -80,7 +162,7 @@ class GameStartScreen extends React.Component { } getPiecesBackground() { - const {theme} = this.props; + const { theme } = this.props; const gridList = []; for (let i = 0; i < 18; i += 1) { gridList.push(this.gridManager.getEmptyGrid(4, 4)); @@ -88,12 +170,7 @@ class GameStartScreen extends React.Component { piece.toGrid(gridList[i], true); } return ( - + {gridList.map((item: GridType, index: number) => { const size = 10 + Math.floor(Math.random() * 30); const top = Math.floor(Math.random() * 100); @@ -110,16 +187,17 @@ class GameStartScreen extends React.Component { key={`piece${index.toString()}`} style={{ width: `${size}%`, - position: 'absolute', top: `${top}%`, left: `${left}%`, - }}> + ...styles.pieceBackground, + }} + > @@ -130,99 +208,72 @@ class GameStartScreen extends React.Component { } getPostGameContent(stats: GameStatsType) { - const {props} = this; + const { props } = this; + const width = this.isHighScore ? '50%' : '30%'; + const margin = this.isHighScore ? 'auto' : undefined; + const marginLeft = this.isHighScore ? '60%' : '20%'; + const color = this.isHighScore + ? props.theme.colors.gameGold + : props.theme.colors.primary; return ( - + + ...styles.recapCard, + }} + > + color: color, + ...styles.centertext, + }} + > {this.isHighScore ? i18n.t('screens.game.newHighScore') : i18n.t('screens.game.gameOver')} - - - {i18n.t('screens.game.score', {score: stats.score})} + + + {i18n.t('screens.game.score', { score: stats.score })} - + {i18n.t('screens.game.level')} {stats.level} - + {i18n.t('screens.game.time')} { } getWelcomeText() { - const {props} = this; + const { props } = this; return ( - + + ...styles.welcomeCard, + }} + > + ...styles.centertext, + }} + > {i18n.t('screens.game.welcomeTitle')} - + {i18n.t('screens.game.welcomeMessage')} @@ -282,7 +322,7 @@ class GameStartScreen extends React.Component { } getPodiumRender(place: 1 | 2 | 3, score: string) { - const {props} = this; + const { props } = this; let icon = 'podium-gold'; let color = props.theme.colors.gameGold; let fontSize = 20; @@ -298,15 +338,17 @@ class GameStartScreen extends React.Component { fontSize = 15; size = 50; } + const marginLeft = place === 2 ? 20 : 'auto'; + const marginRight = place === 3 ? 20 : 'auto'; + const fontWeight = place === 1 ? 'bold' : undefined; return ( + marginLeft: marginLeft, + marginRight: marginRight, + ...styles.podiumContainer, + }} + > {this.isHighScore && place === 1 ? ( { duration={2000} delay={1000} useNativeDriver - style={{ - position: 'absolute', - top: -20, - }}> + style={styles.podiumIconContainer} + > + useNativeDriver + > { /> + ...styles.centertext, + }} + > {score} @@ -352,18 +394,9 @@ class GameStartScreen extends React.Component { const silver = this.scores.length > 1 ? this.scores[1] : '-'; const bronze = this.scores.length > 2 ? this.scores[2] : '-'; return ( - + {this.getPodiumRender(1, gold.toString())} - + {this.getPodiumRender(3, bronze.toString())} {this.getPodiumRender(2, silver.toString())} @@ -372,9 +405,9 @@ class GameStartScreen extends React.Component { } getMainContent() { - const {props} = this; + const { props } = this; return ( - + {this.gameStats != null ? this.getPostGameContent(this.gameStats) : this.getWelcomeText()} @@ -386,11 +419,8 @@ class GameStartScreen extends React.Component { highScore: this.scores.length > 0 ? this.scores[0] : null, }); }} - style={{ - marginLeft: 'auto', - marginRight: 'auto', - marginTop: 10, - }}> + style={styles.playButton} + > {i18n.t('screens.game.play')} {this.getTopScoresRender()} @@ -401,7 +431,7 @@ class GameStartScreen extends React.Component { keyExtractor = (item: number): string => item.toString(); recoverGameScore() { - const {route} = this.props; + const { route } = this.props; this.gameStats = route.params; if (this.gameStats.score != null) { this.isHighScore = @@ -420,24 +450,25 @@ class GameStartScreen extends React.Component { } AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.gameScores.key, - this.scores, + this.scores ); } } render() { - const {props} = this; + const { props } = this; return ( - + {this.getPiecesBackground()} + start={{ x: 0, y: 0 }} + end={{ x: 0, y: 1 }} + > {this.getMainContent()} ; - route: {params: {data: FeedItemType; date: string}}; + route: { params: { data: FeedItemType; date: string } }; }; +const styles = StyleSheet.create({ + container: { + margin: 5, + }, + image: { + width: 48, + height: 48, + }, + button: { + width: 250, + height: 250, + marginLeft: 'auto', + marginRight: 'auto', + }, +}); + /** * Class defining a feed item page. */ @@ -54,7 +70,7 @@ class FeedItemScreen extends React.Component { } componentDidMount() { - const {props} = this; + const { props } = this; props.navigation.setOptions({ headerRight: this.getHeaderButton, }); @@ -89,32 +105,21 @@ class FeedItemScreen extends React.Component { const pageSource: NewsSourceType = NewsSourcesConstants[this.displayData.page_id as AvailablePages]; return ( - + ( - - )} + left={() => } /> {this.displayData.image ? ( ) : null} - + {this.displayData.message !== undefined ? ( ; + today_menu: Array<{ [key: string]: object }>; proximo_articles: number; available_dryers: number; available_washers: number; @@ -75,7 +81,7 @@ export type FullDashboardType = { available_tutorials: number; }; -type RawNewsFeedType = {[key: string]: Array}; +type RawNewsFeedType = { [key: string]: Array }; type RawDashboardType = { news_feed: RawNewsFeedType; @@ -84,7 +90,7 @@ type RawDashboardType = { type PropsType = { navigation: StackNavigationProp; - route: {params: {nextScreen: string; data: object}}; + route: { params: { nextScreen: string; data: object } }; theme: ReactNativePaper.Theme; }; @@ -92,6 +98,35 @@ type StateType = { dialogVisible: boolean; }; +const styles = StyleSheet.create({ + dashboardRow: { + marginLeft: 'auto', + marginRight: 'auto', + marginTop: 10, + marginBottom: 10, + }, + sectionHeader: { + textAlign: 'center', + marginTop: 50, + marginBottom: 10, + }, + sectionHeaderEmpty: { + textAlign: 'center', + marginTop: 50, + marginBottom: 10, + marginLeft: 20, + marginRight: 20, + }, + activityIndicator: { + marginTop: 10, + }, + content: { + position: 'absolute', + width: '100%', + height: '100%', + }, +}); + /** * Class defining the app's home screen */ @@ -113,7 +148,7 @@ class HomeScreen extends React.Component { isLoggedIn: boolean | null; - fabRef: {current: null | AnimatedFAB}; + fabRef: { current: null | AnimatedFAB }; currentNewFeed: Array; @@ -137,7 +172,7 @@ class HomeScreen extends React.Component { } componentDidMount() { - const {props} = this; + const { props } = this; props.navigation.addListener('focus', this.onScreenFocus); // Handle link open when home is focused props.navigation.addListener('state', this.handleNavigationParams); @@ -147,7 +182,7 @@ class HomeScreen extends React.Component { * Updates login state and navigation parameters on screen focus */ onScreenFocus = () => { - const {props} = this; + const { props } = this; if (ConnectionManager.getInstance().isLoggedIn() !== this.isLoggedIn) { this.isLoggedIn = ConnectionManager.getInstance().isLoggedIn(); props.navigation.setOptions({ @@ -164,9 +199,9 @@ class HomeScreen extends React.Component { * @returns {*} */ getHeaderButton = () => { - const {props} = this; + const { props } = this; let onPressLog = (): void => - props.navigation.navigate('login', {nextScreen: 'profile'}); + props.navigation.navigate('login', { nextScreen: 'profile' }); let logIcon = 'login'; let logColor = props.theme.colors.primary; if (this.isLoggedIn) { @@ -211,7 +246,8 @@ class HomeScreen extends React.Component { return ( + clickAction={this.onEventContainerClick} + > { data={content} renderItem={this.getDashboardRowRenderItem} horizontal - contentContainerStyle={{ - marginLeft: 'auto', - marginRight: 'auto', - marginTop: 10, - marginBottom: 10, - }} + contentContainerStyle={styles.dashboardRow} /> ); } @@ -248,7 +279,7 @@ class HomeScreen extends React.Component { * @param item * @returns {*} */ - getDashboardRowRenderItem = ({item}: {item: ServiceItemType | null}) => { + getDashboardRowRenderItem = ({ item }: { item: ServiceItemType | null }) => { if (item != null) { return ( { * @param section The current section * @return {*} */ - getRenderItem = ({item}: {item: FeedItemType}) => this.getFeedItem(item); + getRenderItem = ({ item }: { item: FeedItemType }) => this.getFeedItem(item); getRenderSectionHeader = ( data: { @@ -291,49 +322,32 @@ class HomeScreen extends React.Component { title: string; }; }, - isLoading: boolean, + isLoading: boolean ) => { - const {props} = this; + const { props } = this; if (data.section.data.length > 0) { return ( - - {data.section.title} - + {data.section.title} ); } return ( + }} + > {data.section.title} {isLoading ? ( - + ) : ( )} @@ -350,7 +364,7 @@ class HomeScreen extends React.Component { {this.getDashboardRow(this.dashboardManager.getCurrentDashboard())} {this.getDashboardEvent( - dashboard == null ? [] : dashboard.today_events, + dashboard == null ? [] : dashboard.today_events )} ); @@ -360,25 +374,27 @@ class HomeScreen extends React.Component { * Navigates to the a new screen if navigation parameters specify one */ handleNavigationParams = () => { - const {props} = this; + const { props } = this; if (props.route.params != null) { if (props.route.params.nextScreen != null) { props.navigation.navigate( props.route.params.nextScreen, - props.route.params.data, + props.route.params.data ); // reset params to prevent infinite loop - props.navigation.dispatch(CommonActions.setParams({nextScreen: null})); + props.navigation.dispatch( + CommonActions.setParams({ nextScreen: null }) + ); } } }; - showDisconnectDialog = (): void => this.setState({dialogVisible: true}); + showDisconnectDialog = (): void => this.setState({ dialogVisible: true }); - hideDisconnectDialog = (): void => this.setState({dialogVisible: false}); + hideDisconnectDialog = (): void => this.setState({ dialogVisible: false }); openScanner = () => { - const {props} = this; + const { props } = this; props.navigation.navigate('scanner'); }; @@ -391,7 +407,7 @@ class HomeScreen extends React.Component { */ createDataset = ( fetchedData: RawDashboardType | null, - isLoading: boolean, + isLoading: boolean ): Array<{ title: string; data: [] | Array; @@ -401,7 +417,7 @@ class HomeScreen extends React.Component { if (fetchedData != null) { if (fetchedData.news_feed != null) { this.currentNewFeed = HomeScreen.generateNewsFeed( - fetchedData.news_feed, + fetchedData.news_feed ); } if (fetchedData.dashboard != null) { @@ -429,7 +445,7 @@ class HomeScreen extends React.Component { }; onEventContainerClick = () => { - const {props} = this; + const { props } = this; props.navigation.navigate('planning'); }; @@ -444,22 +460,17 @@ class HomeScreen extends React.Component { * This hides the banner and takes the user to the login page. */ onLogin = () => { - const {props} = this; + const { props } = this; props.navigation.navigate('login', { nextScreen: 'profile', }); }; render() { - const {props, state} = this; + const { props, state } = this; return ( - - + + { */ getPermissionScreen() { return ( - + {i18n.t('screens.scanner.permissions.error')} @@ -102,14 +108,15 @@ class ScannerScreen extends React.Component<{}, StateType> { * @returns {*} */ getScanner() { - const {state} = this; + const { state } = this; return ( + captureAudio={false} + > { }; render() { - const {state} = this; + const { state } = this; return ( + }} + > {state.hasPermission ? this.getScanner() : this.getPermissionScreen()} { - images: Array<{url: string}>; + images: Array<{ url: string }>; - closeButtonRef: {current: null | (Animatable.View & View)}; + closeButtonRef: { current: null | (Animatable.View & View) }; - indicatorRef: {current: null | (Animatable.View & View)}; + indicatorRef: { current: null | (Animatable.View & View) }; controlsShown: boolean; @@ -84,7 +84,7 @@ class ImageGalleryScreen extends React.Component { } goBack = () => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.goBack(); }; @@ -93,7 +93,8 @@ class ImageGalleryScreen extends React.Component { + style={styles.closeButtonContainer} + > { + style={styles.indicatorContainer} + > {currentIndex}/{allSize} diff --git a/src/screens/Other/FeedbackScreen.tsx b/src/screens/Other/FeedbackScreen.tsx index 39781a7..c6e7f49 100644 --- a/src/screens/Other/FeedbackScreen.tsx +++ b/src/screens/Other/FeedbackScreen.tsx @@ -18,9 +18,9 @@ */ import * as React from 'react'; -import {Avatar, Button, Card, Paragraph, withTheme} from 'react-native-paper'; +import { Avatar, Button, Card, Paragraph, withTheme } from 'react-native-paper'; import i18n from 'i18n-js'; -import {Linking, View} from 'react-native'; +import { Linking, StyleSheet, View } from 'react-native'; import CollapsibleScrollView from '../../components/Collapsible/CollapsibleScrollView'; const links = { @@ -32,97 +32,87 @@ const links = { feedbackDiscord: 'https://discord.gg/W8MeTec', }; +const styles = StyleSheet.create({ + container: { + padding: 5, + }, + card: { + flex: 1, + flexWrap: 'wrap', + }, + content: { + flex: 1, + flexWrap: 'wrap', + flexDirection: 'row', + width: '100%', + }, + button: { + marginLeft: 'auto', + marginRight: 'auto', + marginTop: 5, + }, +}); + function getButtons(isFeedback: boolean) { return ( - + {isFeedback ? ( - + ) : ( - + @@ -133,7 +123,7 @@ function getButtons(isFeedback: boolean) { function FeedbackScreen() { return ( - + { super(props); const dashboardManager = new DashboardManager(props.navigation); this.initialDashboardIdList = AsyncStorageManager.getObject( - AsyncStorageManager.PREFERENCES.dashboardItems.key, + AsyncStorageManager.PREFERENCES.dashboardItems.key ); this.initialDashboard = dashboardManager.getCurrentDashboard(); this.state = { @@ -75,12 +100,12 @@ class DashboardEditScreen extends React.Component { item: ServiceItemType | null; index: number; }) => { - const {activeItem} = this.state; + const { activeItem } = this.state; return ( { - this.setState({activeItem: index}); + this.setState({ activeItem: index }); }} isActive={activeItem === index} /> @@ -94,17 +119,13 @@ class DashboardEditScreen extends React.Component { extraData={this.state} renderItem={this.getDashboardRowRenderItem} horizontal - contentContainerStyle={{ - marginLeft: 'auto', - marginRight: 'auto', - marginTop: 5, - }} + contentContainerStyle={styles.dashboard} /> ); } - getRenderItem = ({item}: {item: ServiceCategoryType}) => { - const {currentDashboardIdList} = this.state; + getRenderItem = ({ item }: { item: ServiceCategoryType }) => { + const { currentDashboardIdList } = this.state; return ( { }; getListHeader() { - const {currentDashboard} = this.state; + const { currentDashboard } = this.state; return ( - + - + - + {this.getDashboard(currentDashboard)} - + {i18n.t('screens.settings.dashboardEdit.message')} @@ -143,7 +161,7 @@ class DashboardEditScreen extends React.Component { } updateDashboard = (service: ServiceItemType) => { - const {currentDashboard, currentDashboardIdList, activeItem} = this.state; + const { currentDashboard, currentDashboardIdList, activeItem } = this.state; currentDashboard[activeItem] = service; currentDashboardIdList[activeItem] = service.key; this.setState({ @@ -152,7 +170,7 @@ class DashboardEditScreen extends React.Component { }); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.dashboardItems.key, - currentDashboardIdList, + currentDashboardIdList ); }; @@ -163,7 +181,7 @@ class DashboardEditScreen extends React.Component { }); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.dashboardItems.key, - this.initialDashboardIdList, + this.initialDashboardIdList ); }; diff --git a/src/screens/Other/Settings/SettingsScreen.tsx b/src/screens/Other/Settings/SettingsScreen.tsx index 4dd4df9..631fef3 100644 --- a/src/screens/Other/Settings/SettingsScreen.tsx +++ b/src/screens/Other/Settings/SettingsScreen.tsx @@ -18,7 +18,7 @@ */ import * as React from 'react'; -import {View} from 'react-native'; +import { StyleSheet, View } from 'react-native'; import i18n from 'i18n-js'; import { RadioButton, @@ -28,12 +28,13 @@ import { ToggleButton, withTheme, } from 'react-native-paper'; -import {Appearance} from 'react-native-appearance'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { Appearance } from 'react-native-appearance'; +import { StackNavigationProp } from '@react-navigation/stack'; import ThemeManager from '../../../managers/ThemeManager'; import AsyncStorageManager from '../../../managers/AsyncStorageManager'; import CustomSlider from '../../../components/Overrides/CustomSlider'; import CollapsibleScrollView from '../../../components/Collapsible/CollapsibleScrollView'; +import GENERAL_STYLES from '../../../constants/Styles'; type PropsType = { navigation: StackNavigationProp; @@ -48,6 +49,20 @@ type StateType = { isDebugUnlocked: boolean; }; +const styles = StyleSheet.create({ + slider: { + flex: 1, + marginHorizontal: 10, + height: 50, + }, + card: { + margin: 5, + }, + pickerContainer: { + marginLeft: 30, + }, +}); + /** * Class defining the Settings screen. This screen shows controls to modify app preferences. */ @@ -60,7 +75,7 @@ class SettingsScreen extends React.Component { constructor(props: PropsType) { super(props); const notifReminder = AsyncStorageManager.getString( - AsyncStorageManager.PREFERENCES.proxiwashNotifications.key, + AsyncStorageManager.PREFERENCES.proxiwashNotifications.key ); this.savedNotificationReminder = parseInt(notifReminder, 10); if (Number.isNaN(this.savedNotificationReminder)) { @@ -71,16 +86,16 @@ class SettingsScreen extends React.Component { nightMode: ThemeManager.getNightMode(), nightModeFollowSystem: AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.nightModeFollowSystem.key, + AsyncStorageManager.PREFERENCES.nightModeFollowSystem.key ) && Appearance.getColorScheme() !== 'no-preference', startScreenPickerSelected: AsyncStorageManager.getString( - AsyncStorageManager.PREFERENCES.defaultStartScreen.key, + AsyncStorageManager.PREFERENCES.defaultStartScreen.key ), selectedWash: AsyncStorageManager.getString( - AsyncStorageManager.PREFERENCES.selectedWash.key, + AsyncStorageManager.PREFERENCES.selectedWash.key ), isDebugUnlocked: AsyncStorageManager.getBool( - AsyncStorageManager.PREFERENCES.debugUnlocked.key, + AsyncStorageManager.PREFERENCES.debugUnlocked.key ), }; } @@ -93,7 +108,7 @@ class SettingsScreen extends React.Component { onProxiwashNotifPickerValueChange = (value: number) => { AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.proxiwashNotifications.key, - value, + value ); }; @@ -104,10 +119,10 @@ class SettingsScreen extends React.Component { */ onStartScreenPickerValueChange = (value: string) => { if (value != null) { - this.setState({startScreenPickerSelected: value}); + this.setState({ startScreenPickerSelected: value }); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.defaultStartScreen.key, - value, + value ); } }; @@ -118,10 +133,10 @@ class SettingsScreen extends React.Component { * @returns {React.Node} */ getProxiwashNotifPicker() { - const {theme} = this.props; + const { theme } = this.props; return ( { * @returns {React.Node} */ getProxiwashChangePicker() { - const {selectedWash} = this.state; + const { selectedWash } = this.state; return ( + value={selectedWash} + > { * @returns {React.Node} */ getStartScreenPicker() { - const {startScreenPickerSelected} = this.state; + const { startScreenPickerSelected } = this.state; return ( + style={GENERAL_STYLES.centerHorizontal} + > @@ -181,23 +198,23 @@ class SettingsScreen extends React.Component { * Toggles night mode and saves it to preferences */ onToggleNightMode = () => { - const {nightMode} = this.state; + const { nightMode } = this.state; ThemeManager.getInstance().setNightMode(!nightMode); - this.setState({nightMode: !nightMode}); + this.setState({ nightMode: !nightMode }); }; onToggleNightModeFollowSystem = () => { - const {nightModeFollowSystem} = this.state; + const { nightModeFollowSystem } = this.state; const value = !nightModeFollowSystem; - this.setState({nightModeFollowSystem: value}); + this.setState({ nightModeFollowSystem: value }); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.nightModeFollowSystem.key, - value, + value ); if (value) { const nightMode = Appearance.getColorScheme() === 'dark'; ThemeManager.getInstance().setNightMode(nightMode); - this.setState({nightMode}); + this.setState({ nightMode }); } }; @@ -216,7 +233,7 @@ class SettingsScreen extends React.Component { icon: string, title: string, subtitle: string, - state: boolean, + state: boolean ) { return ( { icon: string, title: string, subtitle: string, - onLongPress?: () => void, + onLongPress?: () => void ) { - const {navigation} = this.props; + const { navigation } = this.props; return ( { */ onSelectWashValueChange = (value: string) => { if (value != null) { - this.setState({selectedWash: value}); + this.setState({ selectedWash: value }); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.selectedWash.key, - value, + value ); } }; @@ -279,18 +296,18 @@ class SettingsScreen extends React.Component { * Unlocks debug mode and saves its state to user preferences */ unlockDebugMode = () => { - this.setState({isDebugUnlocked: true}); + this.setState({ isDebugUnlocked: true }); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.debugUnlocked.key, - true, + true ); }; render() { - const {nightModeFollowSystem, nightMode, isDebugUnlocked} = this.state; + const { nightModeFollowSystem, nightMode, isDebugUnlocked } = this.state; return ( - + {Appearance.getColorScheme() !== 'no-preference' @@ -299,7 +316,7 @@ class SettingsScreen extends React.Component { 'theme-light-dark', i18n.t('screens.settings.nightModeAuto'), i18n.t('screens.settings.nightModeAutoSub'), - nightModeFollowSystem, + nightModeFollowSystem ) : null} {Appearance.getColorScheme() === 'no-preference' || @@ -311,7 +328,7 @@ class SettingsScreen extends React.Component { nightMode ? i18n.t('screens.settings.nightModeSubOn') : i18n.t('screens.settings.nightModeSubOff'), - nightMode, + nightMode ) : null} { 'dashboard-edit', 'view-dashboard', i18n.t('screens.settings.dashboard'), - i18n.t('screens.settings.dashboardSub'), + i18n.t('screens.settings.dashboardSub') )} - + { /> )} /> - + {this.getProxiwashNotifPicker()} { /> )} /> - + {this.getProxiwashChangePicker()} - + {isDebugUnlocked @@ -375,7 +392,7 @@ class SettingsScreen extends React.Component { 'debug', 'bug-check', i18n.t('screens.debug.title'), - '', + '' ) : null} {this.getNavigateItem( @@ -383,13 +400,13 @@ class SettingsScreen extends React.Component { 'information', i18n.t('screens.about.title'), i18n.t('screens.about.buttonDesc'), - this.unlockDebugMode, + this.unlockDebugMode )} {this.getNavigateItem( 'feedback', 'comment-quote', i18n.t('screens.feedback.homeButtonTitle'), - i18n.t('screens.feedback.homeButtonSubtitle'), + i18n.t('screens.feedback.homeButtonSubtitle') )} diff --git a/src/screens/Planex/GroupSelectionScreen.tsx b/src/screens/Planex/GroupSelectionScreen.tsx index 7f83266..fa691b9 100644 --- a/src/screens/Planex/GroupSelectionScreen.tsx +++ b/src/screens/Planex/GroupSelectionScreen.tsx @@ -18,11 +18,11 @@ */ import * as React from 'react'; -import {Platform} from 'react-native'; +import { Platform } from 'react-native'; import i18n from 'i18n-js'; -import {Searchbar} from 'react-native-paper'; -import {StackNavigationProp} from '@react-navigation/stack'; -import {stringMatchQuery} from '../../utils/Search'; +import { Searchbar } from 'react-native-paper'; +import { StackNavigationProp } from '@react-navigation/stack'; +import { stringMatchQuery } from '../../utils/Search'; import WebSectionList from '../../components/Screens/WebSectionList'; import GroupListAccordion from '../../components/Lists/PlanexGroups/GroupListAccordion'; import AsyncStorageManager from '../../managers/AsyncStorageManager'; @@ -49,7 +49,7 @@ type StateType = { function sortName( a: PlanexGroupType | PlanexGroupCategoryType, - b: PlanexGroupType | PlanexGroupCategoryType, + b: PlanexGroupType | PlanexGroupCategoryType ): number { if (a.name.toLowerCase() < b.name.toLowerCase()) { return -1; @@ -71,7 +71,7 @@ class GroupSelectionScreen extends React.Component { this.state = { currentSearchString: '', favoriteGroups: AsyncStorageManager.getObject( - AsyncStorageManager.PREFERENCES.planexFavoriteGroups.key, + AsyncStorageManager.PREFERENCES.planexFavoriteGroups.key ), }; } @@ -80,14 +80,14 @@ class GroupSelectionScreen extends React.Component { * Creates the header content */ componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; navigation.setOptions({ headerTitle: this.getSearchBar, headerBackTitleVisible: false, headerTitleContainerStyle: Platform.OS === 'ios' - ? {marginHorizontal: 0, width: '70%'} - : {marginHorizontal: 0, right: 50, left: 50}, + ? { marginHorizontal: 0, width: '70%' } + : { marginHorizontal: 0, right: 50, left: 50 }, }); } @@ -112,8 +112,8 @@ class GroupSelectionScreen extends React.Component { * @param item The article to render * @return {*} */ - getRenderItem = ({item}: {item: PlanexGroupCategoryType}) => { - const {currentSearchString, favoriteGroups} = this.state; + getRenderItem = ({ item }: { item: PlanexGroupCategoryType }) => { + const { currentSearchString, favoriteGroups } = this.state; if ( this.shouldDisplayAccordion(item) || (item.id === 0 && item.content.length === 0) @@ -139,7 +139,7 @@ class GroupSelectionScreen extends React.Component { * */ createDataset = (fetchedData: { [key: string]: PlanexGroupCategoryType; - }): Array<{title: string; data: Array}> => { + }): Array<{ title: string; data: Array }> => { return [ { title: '', @@ -154,7 +154,7 @@ class GroupSelectionScreen extends React.Component { * @param str The new search string */ onSearchStringChange = (str: string) => { - this.setState({currentSearchString: str}); + this.setState({ currentSearchString: str }); }; /** @@ -164,10 +164,10 @@ class GroupSelectionScreen extends React.Component { * @param item The article pressed */ onListItemPress = (item: PlanexGroupType) => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.navigate('planex', { screen: 'index', - params: {group: item}, + params: { group: item }, }); }; @@ -188,7 +188,7 @@ class GroupSelectionScreen extends React.Component { */ isGroupInFavorites(group: PlanexGroupType): boolean { let isFav = false; - const {favoriteGroups} = this.state; + const { favoriteGroups } = this.state; favoriteGroups.forEach((favGroup: PlanexGroupType) => { if (group.id === favGroup.id) { isFav = true; @@ -218,7 +218,7 @@ class GroupSelectionScreen extends React.Component { * @returns {boolean} */ shouldDisplayAccordion(item: PlanexGroupCategoryType): boolean { - const {currentSearchString} = this.state; + const { currentSearchString } = this.state; let shouldDisplay = false; for (let i = 0; i < item.content.length; i += 1) { if (stringMatchQuery(item.content[i].name, currentSearchString)) { @@ -239,7 +239,7 @@ class GroupSelectionScreen extends React.Component { generateData(fetchedData: { [key: string]: PlanexGroupCategoryType; }): Array { - const {favoriteGroups} = this.state; + const { favoriteGroups } = this.state; const data: Array = []; Object.values(fetchedData).forEach((category: PlanexGroupCategoryType) => { data.push(category); @@ -262,7 +262,7 @@ class GroupSelectionScreen extends React.Component { this.setState((prevState: StateType): { favoriteGroups: Array; } => { - const {favoriteGroups} = prevState; + const { favoriteGroups } = prevState; for (let i = 0; i < favoriteGroups.length; i += 1) { if (group.id === favoriteGroups[i].id) { favoriteGroups.splice(i, 1); @@ -271,9 +271,9 @@ class GroupSelectionScreen extends React.Component { } AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.planexFavoriteGroups.key, - favoriteGroups, + favoriteGroups ); - return {favoriteGroups}; + return { favoriteGroups }; }); } @@ -286,19 +286,19 @@ class GroupSelectionScreen extends React.Component { this.setState((prevState: StateType): { favoriteGroups: Array; } => { - const {favoriteGroups} = prevState; + const { favoriteGroups } = prevState; favoriteGroups.push(group); favoriteGroups.sort(sortName); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.planexFavoriteGroups.key, - favoriteGroups, + favoriteGroups ); - return {favoriteGroups}; + return { favoriteGroups }; }); } render() { - const {props, state} = this; + const { props, state } = this; return ( . */ -// @flow - import * as React from 'react'; -import {Title, withTheme} from 'react-native-paper'; +import { Title, withTheme } from 'react-native-paper'; import i18n from 'i18n-js'; -import {NativeScrollEvent, NativeSyntheticEvent, View} from 'react-native'; -import {CommonActions} from '@react-navigation/native'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { + NativeScrollEvent, + NativeSyntheticEvent, + StyleSheet, + View, +} from 'react-native'; +import { CommonActions } from '@react-navigation/native'; +import { StackNavigationProp } from '@react-navigation/stack'; import Autolink from 'react-native-autolink'; import ThemeManager from '../../managers/ThemeManager'; import WebViewScreen from '../../components/Screens/WebViewScreen'; import AsyncStorageManager from '../../managers/AsyncStorageManager'; import AlertDialog from '../../components/Dialogs/AlertDialog'; -import {dateToString, getTimeOnlyString} from '../../utils/Planning'; +import { dateToString, getTimeOnlyString } from '../../utils/Planning'; import DateManager from '../../managers/DateManager'; import AnimatedBottomBar from '../../components/Animations/AnimatedBottomBar'; import ErrorView from '../../components/Screens/ErrorView'; -import type {PlanexGroupType} from './GroupSelectionScreen'; -import {MASCOT_STYLE} from '../../components/Mascot/Mascot'; +import type { PlanexGroupType } from './GroupSelectionScreen'; +import { MASCOT_STYLE } from '../../components/Mascot/Mascot'; import MascotPopup from '../../components/Mascot/MascotPopup'; -import {getPrettierPlanexGroupName} from '../../utils/Utils'; +import { getPrettierPlanexGroupName } from '../../utils/Utils'; +import GENERAL_STYLES from '../../constants/Styles'; type PropsType = { navigation: StackNavigationProp; - route: {params: {group: PlanexGroupType}}; + route: { params: { group: PlanexGroupType } }; theme: ReactNativePaper.Theme; }; @@ -136,14 +140,22 @@ const INJECT_STYLE = ` $('head').append(''); `; +const styles = StyleSheet.create({ + container: { + position: 'absolute', + height: '100%', + width: '100%', + }, +}); + /** * Class defining the app's Planex screen. * This screen uses a webview to render the page */ class PlanexScreen extends React.Component { - webScreenRef: {current: null | WebViewScreen}; + webScreenRef: { current: null | WebViewScreen }; - barRef: {current: null | AnimatedBottomBar}; + barRef: { current: null | AnimatedBottomBar }; customInjectedJS: string; @@ -156,11 +168,11 @@ class PlanexScreen extends React.Component { this.barRef = React.createRef(); this.customInjectedJS = ''; let currentGroupString = AsyncStorageManager.getString( - AsyncStorageManager.PREFERENCES.planexCurrentGroup.key, + AsyncStorageManager.PREFERENCES.planexCurrentGroup.key ); let currentGroup: PlanexGroupType; if (currentGroupString === '') { - currentGroup = {name: 'SELECT GROUP', id: -1}; + currentGroup = { name: 'SELECT GROUP', id: -1 }; } else { currentGroup = JSON.parse(currentGroupString); props.navigation.setOptions({ @@ -180,7 +192,7 @@ class PlanexScreen extends React.Component { * Register for events and show the banner after 2 seconds */ componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; navigation.addListener('focus', this.onScreenFocus); } @@ -191,7 +203,7 @@ class PlanexScreen extends React.Component { * @returns {boolean} */ shouldComponentUpdate(nextProps: PropsType): boolean { - const {props, state} = this; + const { props, state } = this; if (nextProps.theme.dark !== props.theme.dark) { this.generateInjectedJS(state.currentGroup.id); } @@ -204,11 +216,11 @@ class PlanexScreen extends React.Component { * @returns {*} */ getWebView() { - const {props, state} = this; + const { props, state } = this; const showWebview = state.currentGroup.id !== -1; return ( - + {!showWebview ? ( { * This will hide the banner and open the SettingsScreen */ onGoToSettings = () => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.navigate('settings'); }; @@ -267,7 +279,7 @@ class PlanexScreen extends React.Component { * * @param event */ - onMessage = (event: {nativeEvent: {data: string}}) => { + onMessage = (event: { nativeEvent: { data: string } }) => { const data: { start: string; end: string; @@ -325,7 +337,7 @@ class PlanexScreen extends React.Component { * If navigations parameters contain a group, set it as selected */ handleNavigationParams = () => { - const {props} = this; + const { props } = this; if (props.route.params != null) { if ( props.route.params.group !== undefined && @@ -333,7 +345,7 @@ class PlanexScreen extends React.Component { ) { // reset params to prevent infinite loop this.selectNewGroup(props.route.params.group); - props.navigation.dispatch(CommonActions.setParams({group: null})); + props.navigation.dispatch(CommonActions.setParams({ group: null })); } } }; @@ -344,14 +356,14 @@ class PlanexScreen extends React.Component { * @param group The group object selected */ selectNewGroup(group: PlanexGroupType) { - const {navigation} = this.props; + const { navigation } = this.props; this.sendMessage('setGroup', group.id.toString()); - this.setState({currentGroup: group}); + this.setState({ currentGroup: group }); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.planexCurrentGroup.key, - group, + group ); - navigation.setOptions({title: getPrettierPlanexGroupName(group.name)}); + navigation.setOptions({ title: getPrettierPlanexGroupName(group.name) }); this.generateInjectedJS(group.id); } @@ -374,24 +386,19 @@ class PlanexScreen extends React.Component { } render() { - const {props, state} = this; + const { props, state } = this; return ( - + {/* Allow to draw webview bellow banner */} - + {props.theme.dark ? ( // Force component theme update by recreating it on theme change this.getWebView() ) : ( - {this.getWebView()} + {this.getWebView()} )} {AsyncStorageManager.getString( - AsyncStorageManager.PREFERENCES.defaultStartScreen.key, + AsyncStorageManager.PREFERENCES.defaultStartScreen.key ).toLowerCase() !== 'planex' ? ( . */ -// @flow - import * as React from 'react'; -import {View} from 'react-native'; -import {Card} from 'react-native-paper'; +import { StyleSheet, View } from 'react-native'; +import { Card } from 'react-native-paper'; import i18n from 'i18n-js'; -import {StackNavigationProp} from '@react-navigation/stack'; -import {getDateOnlyString, getTimeOnlyString} from '../../utils/Planning'; +import { StackNavigationProp } from '@react-navigation/stack'; +import { getDateOnlyString, getTimeOnlyString } from '../../utils/Planning'; import DateManager from '../../managers/DateManager'; import BasicLoadingScreen from '../../components/Screens/BasicLoadingScreen'; -import {apiRequest, ERROR_TYPE} from '../../utils/WebData'; +import { apiRequest, ERROR_TYPE } from '../../utils/WebData'; import ErrorView from '../../components/Screens/ErrorView'; import CustomHTML from '../../components/Overrides/CustomHTML'; import CustomTabBar from '../../components/Tabbar/CustomTabBar'; import CollapsibleScrollView from '../../components/Collapsible/CollapsibleScrollView'; -import type {PlanningEventType} from '../../utils/Planning'; +import type { PlanningEventType } from '../../utils/Planning'; import ImageGalleryButton from '../../components/Media/ImageGalleryButton'; type PropsType = { navigation: StackNavigationProp; - route: {params: {data: PlanningEventType; id: number; eventId: number}}; + route: { params: { data: PlanningEventType; id: number; eventId: number } }; }; type StateType = { loading: boolean; }; +const styles = StyleSheet.create({ + container: { + paddingLeft: 5, + paddingRight: 5, + }, + button: { + width: 300, + height: 300, + marginLeft: 'auto', + marginRight: 'auto', + }, +}); + const EVENT_INFO_URL = 'event/info'; /** @@ -93,7 +104,7 @@ class PlanningDisplayScreen extends React.Component { */ onFetchSuccess = (data: PlanningEventType) => { this.displayData = data; - this.setState({loading: false}); + this.setState({ loading: false }); }; /** @@ -103,7 +114,7 @@ class PlanningDisplayScreen extends React.Component { */ onFetchError = (error: number) => { this.errorCode = error; - this.setState({loading: false}); + this.setState({ loading: false }); }; /** @@ -112,7 +123,7 @@ class PlanningDisplayScreen extends React.Component { * @returns {*} */ getContent() { - const {displayData} = this; + const { displayData } = this; if (displayData == null) { return null; } @@ -120,27 +131,23 @@ class PlanningDisplayScreen extends React.Component { const dateString = getDateOnlyString(displayData.date_begin); if (dateString !== null && subtitle != null) { subtitle += ` | ${DateManager.getInstance().getTranslatedDate( - dateString, + dateString )}`; } return ( - + {displayData.logo !== null ? ( ) : null} {displayData.description !== null ? ( + style={{ paddingBottom: CustomTabBar.TAB_BAR_HEIGHT + 20 }} + > ) : ( @@ -156,7 +163,7 @@ class PlanningDisplayScreen extends React.Component { * @returns {*} */ getErrorView() { - const {navigation} = this.props; + const { navigation } = this.props; if (this.errorCode === ERROR_TYPE.BAD_INPUT) { return ( { * Fetches data for the current event id from the API */ fetchData = () => { - this.setState({loading: true}); - apiRequest(EVENT_INFO_URL, 'POST', {id: this.eventId}) + this.setState({ loading: true }); + apiRequest(EVENT_INFO_URL, 'POST', { id: this.eventId }) .then(this.onFetchSuccess) .catch(this.onFetchError); }; render() { - const {loading} = this.state; + const { loading } = this.state; if (loading) { return ; } diff --git a/src/screens/Planning/PlanningScreen.tsx b/src/screens/Planning/PlanningScreen.tsx index ebebda7..aa03479 100644 --- a/src/screens/Planning/PlanningScreen.tsx +++ b/src/screens/Planning/PlanningScreen.tsx @@ -18,12 +18,12 @@ */ import * as React from 'react'; -import {BackHandler, View} from 'react-native'; +import { BackHandler, StyleSheet, View } from 'react-native'; import i18n from 'i18n-js'; -import {Agenda, LocaleConfig} from 'react-native-calendars'; -import {Avatar, Divider, List} from 'react-native-paper'; -import {StackNavigationProp} from '@react-navigation/stack'; -import {readData} from '../../utils/WebData'; +import { Agenda, LocaleConfig } from 'react-native-calendars'; +import { Avatar, Divider, List } from 'react-native-paper'; +import { StackNavigationProp } from '@react-navigation/stack'; +import { readData } from '../../utils/WebData'; import { generateEventAgenda, getCurrentDateString, @@ -32,9 +32,10 @@ import { PlanningEventType, } from '../../utils/Planning'; import CustomAgenda from '../../components/Overrides/CustomAgenda'; -import {MASCOT_STYLE} from '../../components/Mascot/Mascot'; +import { MASCOT_STYLE } from '../../components/Mascot/Mascot'; import MascotPopup from '../../components/Mascot/MascotPopup'; import AsyncStorageManager from '../../managers/AsyncStorageManager'; +import GENERAL_STYLES from '../../constants/Styles'; LocaleConfig.locales.fr = { monthNames: [ @@ -83,13 +84,19 @@ type PropsType = { type StateType = { refreshing: boolean; - agendaItems: {[key: string]: Array}; + agendaItems: { [key: string]: Array }; calendarShowing: boolean; }; const FETCH_URL = 'https://www.amicale-insat.fr/api/event/list'; const AGENDA_MONTH_SPAN = 3; +const styles = StyleSheet.create({ + icon: { + backgroundColor: 'transparent', + }, +}); + /** * Class defining the app's planning screen */ @@ -121,18 +128,18 @@ class PlanningScreen extends React.Component { * Captures focus and blur events to hook on android back button */ componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; this.onRefresh(); navigation.addListener('focus', () => { BackHandler.addEventListener( 'hardwareBackPress', - this.onBackButtonPressAndroid, + this.onBackButtonPressAndroid ); }); navigation.addListener('blur', () => { BackHandler.removeEventListener( 'hardwareBackPress', - this.onBackButtonPressAndroid, + this.onBackButtonPressAndroid ); }); } @@ -143,7 +150,7 @@ class PlanningScreen extends React.Component { * @return {boolean} */ onBackButtonPressAndroid = (): boolean => { - const {calendarShowing} = this.state; + const { calendarShowing } = this.state; if (calendarShowing && this.agendaRef != null) { // @ts-ignore this.agendaRef.chooseDay(this.agendaRef.state.selectedDay); @@ -166,7 +173,7 @@ class PlanningScreen extends React.Component { } if (canRefresh) { - this.setState({refreshing: true}); + this.setState({ refreshing: true }); readData(FETCH_URL) .then((fetchedData: Array) => { this.setState({ @@ -198,7 +205,7 @@ class PlanningScreen extends React.Component { * @param isCalendarOpened True is the calendar is already open, false otherwise */ onCalendarToggled = (isCalendarOpened: boolean) => { - this.setState({calendarShowing: isCalendarOpened}); + this.setState({ calendarShowing: isCalendarOpened }); }; /** @@ -208,7 +215,7 @@ class PlanningScreen extends React.Component { * @return {*} */ getRenderItem = (item: PlanningEventType) => { - const {navigation} = this.props; + const { navigation } = this.props; const onPress = () => { navigation.navigate('planning-information', { data: item, @@ -223,10 +230,7 @@ class PlanningScreen extends React.Component { title={item.title} description={getTimeOnlyString(item.date_begin)} left={() => ( - + )} onPress={onPress} /> @@ -253,9 +257,9 @@ class PlanningScreen extends React.Component { getRenderEmptyDate = () => ; render() { - const {state, props} = this; + const { state, props } = this; return ( - + + - - + + + {getCardItem(ProxiwashConstants.washinsa)} {getCardItem(ProxiwashConstants.tripodeB)} - + ( @@ -98,7 +109,7 @@ export default function ProxiwashAboutScreen() { - + ( diff --git a/src/screens/Proxiwash/ProxiwashScreen.tsx b/src/screens/Proxiwash/ProxiwashScreen.tsx index 00b7d5e..a0a8407 100644 --- a/src/screens/Proxiwash/ProxiwashScreen.tsx +++ b/src/screens/Proxiwash/ProxiwashScreen.tsx @@ -18,11 +18,11 @@ */ import * as React from 'react'; -import {Alert, View} from 'react-native'; +import { Alert, StyleSheet, View } from 'react-native'; import i18n from 'i18n-js'; -import {Avatar, Button, Card, Text, withTheme} from 'react-native-paper'; -import {StackNavigationProp} from '@react-navigation/stack'; -import {Modalize} from 'react-native-modalize'; +import { Avatar, Button, Card, Text, withTheme } from 'react-native-paper'; +import { StackNavigationProp } from '@react-navigation/stack'; +import { Modalize } from 'react-native-modalize'; import WebSectionList from '../../components/Screens/WebSectionList'; import * as Notifications from '../../utils/Notifications'; import AsyncStorageManager from '../../managers/AsyncStorageManager'; @@ -41,10 +41,11 @@ import { getMachineEndDate, isMachineWatched, } from '../../utils/Proxiwash'; -import {MASCOT_STYLE} from '../../components/Mascot/Mascot'; +import { MASCOT_STYLE } from '../../components/Mascot/Mascot'; import MascotPopup from '../../components/Mascot/MascotPopup'; -import type {SectionListDataType} from '../../components/Screens/WebSectionList'; -import type {LaundromatType} from './ProxiwashAboutScreen'; +import type { SectionListDataType } from '../../components/Screens/WebSectionList'; +import type { LaundromatType } from './ProxiwashAboutScreen'; +import GENERAL_STYLES from '../../constants/Styles'; const REFRESH_TIME = 1000 * 10; // Refresh every 10 seconds const LIST_ITEM_HEIGHT = 64; @@ -71,6 +72,21 @@ type StateType = { selectedWash: string; }; +const styles = StyleSheet.create({ + modalContainer: { + flex: 1, + padding: 20, + }, + icon: { + backgroundColor: 'transparent', + }, + container: { + position: 'absolute', + width: '100%', + height: '100%', + }, +}); + /** * Class defining the app's proxiwash screen. This screen shows information about washing machines and * dryers, taken from a scrapper reading proxiwash website @@ -82,15 +98,15 @@ class ProxiwashScreen extends React.Component { static showNotificationsDisabledWarning() { Alert.alert( i18n.t('screens.proxiwash.modal.notificationErrorTitle'), - i18n.t('screens.proxiwash.modal.notificationErrorDescription'), + i18n.t('screens.proxiwash.modal.notificationErrorDescription') ); } - modalStateStrings: {[key in MachineStates]: string} = { + modalStateStrings: { [key in MachineStates]: string } = { [MachineStates.AVAILABLE]: i18n.t('screens.proxiwash.modal.ready'), [MachineStates.RUNNING]: i18n.t('screens.proxiwash.modal.running'), [MachineStates.RUNNING_NOT_STARTED]: i18n.t( - 'screens.proxiwash.modal.runningNotStarted', + 'screens.proxiwash.modal.runningNotStarted' ), [MachineStates.FINISHED]: i18n.t('screens.proxiwash.modal.finished'), [MachineStates.UNAVAILABLE]: i18n.t('screens.proxiwash.modal.broken'), @@ -111,14 +127,14 @@ class ProxiwashScreen extends React.Component { constructor(props: PropsType) { super(props); this.modalRef = null; - this.fetchedData = {dryers: [], washers: []}; + this.fetchedData = { dryers: [], washers: [] }; this.state = { modalCurrentDisplayItem: null, machinesWatched: AsyncStorageManager.getObject( - AsyncStorageManager.PREFERENCES.proxiwashWatchedMachines.key, + AsyncStorageManager.PREFERENCES.proxiwashWatchedMachines.key ), selectedWash: AsyncStorageManager.getString( - AsyncStorageManager.PREFERENCES.selectedWash.key, + AsyncStorageManager.PREFERENCES.selectedWash.key ), }; } @@ -127,7 +143,7 @@ class ProxiwashScreen extends React.Component { * Setup notification channel for android and add listeners to detect notifications fired */ componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; navigation.setOptions({ headerRight: () => ( @@ -148,9 +164,9 @@ class ProxiwashScreen extends React.Component { } onScreenFocus = () => { - const {state} = this; + const { state } = this; const selected = AsyncStorageManager.getString( - AsyncStorageManager.PREFERENCES.selectedWash.key, + AsyncStorageManager.PREFERENCES.selectedWash.key ); if (selected !== state.selectedWash) { this.setState({ @@ -164,7 +180,7 @@ class ProxiwashScreen extends React.Component { * This will open the ProxiwashAboutScreen. */ onAboutPress = () => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.navigate('proxiwash-about'); }; @@ -199,8 +215,8 @@ class ProxiwashScreen extends React.Component { * @return {*} */ getModalContent(title: string, item: ProxiwashMachineType, isDryer: boolean) { - const {props, state} = this; - let button: {text: string; icon: string; onPress: () => void} | undefined; + const { props, state } = this; + let button: { text: string; icon: string; onPress: () => void } | undefined; let message = this.modalStateStrings[item.state]; const onPress = () => this.onSetupNotificationsPress(item); if (item.state === MachineStates.RUNNING) { @@ -224,18 +240,14 @@ class ProxiwashScreen extends React.Component { }); } return ( - + ( )} /> @@ -249,7 +261,8 @@ class ProxiwashScreen extends React.Component { icon={button.icon} mode="contained" onPress={button.onPress} - style={{marginLeft: 'auto', marginRight: 'auto'}}> + style={GENERAL_STYLES.centerHorizontal} + > {button.text} @@ -264,7 +277,7 @@ class ProxiwashScreen extends React.Component { * @param section The section to render * @return {*} */ - getRenderSectionHeader = ({section}: {section: {title: string}}) => { + getRenderSectionHeader = ({ section }: { section: { title: string } }) => { const isDryer = section.title === i18n.t('screens.proxiwash.dryers'); const nbAvailable = this.getMachineAvailableNumber(isDryer); return ( @@ -288,9 +301,9 @@ class ProxiwashScreen extends React.Component { section, }: { item: ProxiwashMachineType; - section: {title: string}; + section: { title: string }; }) => { - const {machinesWatched} = this.state; + const { machinesWatched } = this.state; const isDryer = section.title === i18n.t('screens.proxiwash.dryers'); return ( { * @param machine The machine to watch */ setupNotifications(machine: ProxiwashMachineType) { - const {machinesWatched} = this.state; + const { machinesWatched } = this.state; if (!isMachineWatched(machine, machinesWatched)) { Notifications.setupMachineNotification( machine.number, true, - getMachineEndDate(machine), + getMachineEndDate(machine) ) .then(() => { this.saveNotificationToState(machine); @@ -336,7 +349,7 @@ class ProxiwashScreen extends React.Component { Notifications.setupMachineNotification(machine.number, false, null).then( () => { this.removeNotificationFromState(machine); - }, + } ); } } @@ -373,7 +386,7 @@ class ProxiwashScreen extends React.Component { dryers: Array; washers: Array; }): SectionListDataType => { - const {state} = this; + const { state } = this; let data = fetchedData; if (AprilFoolsManager.getInstance().isAprilFoolsEnabled()) { data = JSON.parse(JSON.stringify(fetchedData)); // Deep copy @@ -381,9 +394,10 @@ class ProxiwashScreen extends React.Component { AprilFoolsManager.getNewProxiwashWasherOrderedList(data.washers); } this.fetchedData = data; + // TODO dirty, should be refactored this.state.machinesWatched = getCleanedMachineWatched( state.machinesWatched, - [...data.dryers, ...data.washers], + [...data.dryers, ...data.washers] ); return [ { @@ -406,7 +420,7 @@ class ProxiwashScreen extends React.Component { * This will hide the banner and open the SettingsScreen */ onGoToSettings = () => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.navigate('settings'); }; @@ -432,7 +446,7 @@ class ProxiwashScreen extends React.Component { * @param machine */ saveNotificationToState(machine: ProxiwashMachineType) { - const {machinesWatched} = this.state; + const { machinesWatched } = this.state; const data = machinesWatched; data.push(machine); this.saveNewWatchedList(data); @@ -444,7 +458,7 @@ class ProxiwashScreen extends React.Component { * @param selectedMachine */ removeNotificationFromState(selectedMachine: ProxiwashMachineType) { - const {machinesWatched} = this.state; + const { machinesWatched } = this.state; const newList = [...machinesWatched]; machinesWatched.forEach((machine: ProxiwashMachineType, index: number) => { if ( @@ -458,16 +472,16 @@ class ProxiwashScreen extends React.Component { } saveNewWatchedList(list: Array) { - this.setState({machinesWatched: list}); + this.setState({ machinesWatched: list }); AsyncStorageManager.set( AsyncStorageManager.PREFERENCES.proxiwashWatchedMachines.key, - list, + list ); } render() { - const {state} = this; - const {navigation} = this.props; + const { state } = this; + const { navigation } = this.props; let data: LaundromatType; switch (state.selectedWash) { case 'tripodeB': @@ -477,16 +491,8 @@ class ProxiwashScreen extends React.Component { data = ProxiwashConstants.washinsa; } return ( - - + + . */ -// @flow - import * as React from 'react'; -import {Image, View} from 'react-native'; +import { Image, StyleSheet, View } from 'react-native'; import i18n from 'i18n-js'; -import {Card, Avatar, Paragraph, Text} from 'react-native-paper'; +import { Card, Avatar, Paragraph, Text } from 'react-native-paper'; import CustomTabBar from '../../../components/Tabbar/CustomTabBar'; import CollapsibleScrollView from '../../../components/Collapsible/CollapsibleScrollView'; const LOGO = 'https://etud.insa-toulouse.fr/~amicale_app/images/Proximo.png'; +const styles = StyleSheet.create({ + container: { + padding: 5, + }, + imageContainer: { + width: '100%', + height: 100, + marginTop: 20, + marginBottom: 20, + justifyContent: 'center', + alignItems: 'center', + }, + image: { + height: '100%', + width: '100%', + resizeMode: 'contain', + }, + card: { + margin: 5, + }, +}); + /** * Class defining the proximo about screen. */ export default function ProximoAboutScreen() { return ( - - - + + + {i18n.t('screens.proximo.description')} - + ( @@ -60,7 +69,12 @@ export default function ProximoAboutScreen() { 18h30 - 19h30 - + ( diff --git a/src/screens/Services/Proximo/ProximoListScreen.tsx b/src/screens/Services/Proximo/ProximoListScreen.tsx index ce4c317..86e57b0 100644 --- a/src/screens/Services/Proximo/ProximoListScreen.tsx +++ b/src/screens/Services/Proximo/ProximoListScreen.tsx @@ -18,7 +18,7 @@ */ import * as React from 'react'; -import {Image, Platform, ScrollView, View} from 'react-native'; +import { Image, Platform, ScrollView, StyleSheet, View } from 'react-native'; import i18n from 'i18n-js'; import { RadioButton, @@ -28,16 +28,17 @@ import { Title, withTheme, } from 'react-native-paper'; -import {StackNavigationProp} from '@react-navigation/stack'; -import {Modalize} from 'react-native-modalize'; +import { StackNavigationProp } from '@react-navigation/stack'; +import { Modalize } from 'react-native-modalize'; import CustomModal from '../../../components/Overrides/CustomModal'; -import {stringMatchQuery} from '../../../utils/Search'; +import { stringMatchQuery } from '../../../utils/Search'; import ProximoListItem from '../../../components/Lists/Proximo/ProximoListItem'; import MaterialHeaderButtons, { Item, } from '../../../components/Overrides/CustomHeaderButton'; import CollapsibleFlatList from '../../../components/Collapsible/CollapsibleFlatList'; -import type {ProximoArticleType} from './ProximoMainScreen'; +import type { ProximoArticleType } from './ProximoMainScreen'; +import GENERAL_STYLES from '../../../constants/Styles'; function sortPrice(a: ProximoArticleType, b: ProximoArticleType): number { return parseInt(a.price, 10) - parseInt(b.price, 10); @@ -45,7 +46,7 @@ function sortPrice(a: ProximoArticleType, b: ProximoArticleType): number { function sortPriceReverse( a: ProximoArticleType, - b: ProximoArticleType, + b: ProximoArticleType ): number { return parseInt(b.price, 10) - parseInt(a.price, 10); } @@ -76,7 +77,7 @@ type PropsType = { navigation: StackNavigationProp; route: { params: { - data: {data: Array}; + data: { data: Array }; shouldFocusSearchBar: boolean; }; }; @@ -89,6 +90,34 @@ type StateType = { currentSearchString: string; }; +const styles = StyleSheet.create({ + modalContainer: { + flex: 1, + padding: 20, + }, + modalTitleContainer: { + flexDirection: 'row', + width: '100%', + marginTop: 10, + }, + modalTitle: { + marginLeft: 'auto', + }, + modalContent: { + width: '100%', + height: 150, + marginTop: 20, + marginBottom: 20, + }, + image: { + flex: 1, + resizeMode: 'contain', + }, + sortTitle: { + marginBottom: 10, + }, +}); + /** * Class defining Proximo article list of a certain category. */ @@ -115,15 +144,15 @@ class ProximoListScreen extends React.Component { * Creates the header content */ componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; navigation.setOptions({ headerRight: this.getSortMenuButton, headerTitle: this.getSearchBar, headerBackTitleVisible: false, headerTitleContainerStyle: Platform.OS === 'ios' - ? {marginHorizontal: 0, width: '70%'} - : {marginHorizontal: 0, right: 50, left: 50}, + ? { marginHorizontal: 0, width: '70%' } + : { marginHorizontal: 0, right: 50, left: 50 }, }); } @@ -146,7 +175,7 @@ class ProximoListScreen extends React.Component { * @param str The new search string */ onSearchStringChange = (str: string) => { - this.setState({currentSearchString: str}); + this.setState({ currentSearchString: str }); }; /** @@ -170,7 +199,7 @@ class ProximoListScreen extends React.Component { * @param mode The number representing the mode */ setSortMode(mode: string) { - const {currentSortMode} = this.state; + const { currentSortMode } = this.state; const currentMode = parseInt(mode, 10); this.setState({ currentSortMode: currentMode, @@ -204,7 +233,7 @@ class ProximoListScreen extends React.Component { * @return */ getStockColor(availableStock: number): string { - const {theme} = this.props; + const { theme } = this.props; let color: string; if (availableStock > 3) { color = theme.colors.success; @@ -252,39 +281,22 @@ class ProximoListScreen extends React.Component { */ getModalItemContent(item: ProximoArticleType) { return ( - + {item.name} - + + }} + > {`${item.quantity} ${i18n.t('screens.proximo.inStock')}`} - {item.price}€ + {item.price}€ - - + + {item.description} @@ -298,21 +310,18 @@ class ProximoListScreen extends React.Component { * @return {*} */ getModalSortMenu() { - const {currentSortMode} = this.state; + const { currentSortMode } = this.state; return ( - - + <View style={styles.modalContainer}> + <Title style={styles.sortTitle}> {i18n.t('screens.proximo.sortOrder')} { this.setSortMode(value); }} - value={currentSortMode.toString()}> + value={currentSortMode.toString()} + > { * @param item The article to render * @return {*} */ - getRenderItem = ({item}: {item: ProximoArticleType}) => { - const {currentSearchString} = this.state; + getRenderItem = ({ item }: { item: ProximoArticleType }) => { + const { currentSearchString } = this.state; if (stringMatchQuery(item.name, currentSearchString)) { const onPress = () => { this.onListItemPress(item); @@ -378,20 +387,17 @@ class ProximoListScreen extends React.Component { itemLayout = ( data: Array | null | undefined, - index: number, - ): {length: number; offset: number; index: number} => ({ + index: number + ): { length: number; offset: number; index: number } => ({ length: LIST_ITEM_HEIGHT, offset: LIST_ITEM_HEIGHT * index, index, }); render() { - const {state} = this; + const { state } = this; return ( - + {state.modalCurrentDisplayItem} diff --git a/src/screens/Services/Proximo/ProximoMainScreen.tsx b/src/screens/Services/Proximo/ProximoMainScreen.tsx index 7aaca82..6956501 100644 --- a/src/screens/Services/Proximo/ProximoMainScreen.tsx +++ b/src/screens/Services/Proximo/ProximoMainScreen.tsx @@ -17,17 +17,16 @@ * along with Campus INSAT. If not, see . */ -// @flow - import * as React from 'react'; import i18n from 'i18n-js'; -import {List, withTheme} from 'react-native-paper'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { List, withTheme } from 'react-native-paper'; +import { StackNavigationProp } from '@react-navigation/stack'; import WebSectionList from '../../../components/Screens/WebSectionList'; import MaterialHeaderButtons, { Item, } from '../../../components/Overrides/CustomHeaderButton'; -import type {SectionListDataType} from '../../../components/Screens/WebSectionList'; +import type { SectionListDataType } from '../../../components/Screens/WebSectionList'; +import { StyleSheet } from 'react-native'; const DATA_URL = 'https://etud.insa-toulouse.fr/~proximo/data/stock-v2.json'; const LIST_ITEM_HEIGHT = 84; @@ -64,6 +63,12 @@ type PropsType = { theme: ReactNativePaper.Theme; }; +const styles = StyleSheet.create({ + item: { + justifyContent: 'center', + }, +}); + /** * Class defining the main proximo screen. * This screen shows the different categories of articles offered by proximo. @@ -79,7 +84,7 @@ class ProximoMainScreen extends React.Component { */ static sortFinalData( a: ProximoMainListItemType, - b: ProximoMainListItemType, + b: ProximoMainListItemType ): number { const str1 = a.type.name.toLowerCase(); const str2 = b.type.name.toLowerCase(); @@ -111,7 +116,7 @@ class ProximoMainScreen extends React.Component { */ static getAvailableArticles( articles: Array | null, - type?: ProximoCategoryType, + type?: ProximoCategoryType ): Array { const availableArticles: Array = []; if (articles != null) { @@ -138,7 +143,7 @@ class ProximoMainScreen extends React.Component { * Creates header button */ componentDidMount() { - const {navigation} = this.props; + const { navigation } = this.props; navigation.setOptions({ headerRight: () => this.getHeaderButtons(), }); @@ -149,7 +154,7 @@ class ProximoMainScreen extends React.Component { * This will open a new ProximoListScreen with all items displayed */ onPressSearchBtn = () => { - const {navigation} = this.props; + const { navigation } = this.props; const searchScreenData = { shouldFocusSearchBar: true, data: { @@ -172,7 +177,7 @@ class ProximoMainScreen extends React.Component { * This will open the ProximoAboutScreen */ onPressAboutBtn = () => { - const {navigation} = this.props; + const { navigation } = this.props; navigation.navigate('proximo-about'); }; @@ -211,8 +216,8 @@ class ProximoMainScreen extends React.Component { * @param item The category to render * @return {*} */ - getRenderItem = ({item}: {item: ProximoMainListItemType}) => { - const {navigation, theme} = this.props; + getRenderItem = ({ item }: { item: ProximoMainListItemType }) => { + const { navigation, theme } = this.props; const dataToSend = { shouldFocusSearchBar: false, data: item, @@ -247,7 +252,7 @@ class ProximoMainScreen extends React.Component { )} style={{ height: LIST_ITEM_HEIGHT, - justifyContent: 'center', + ...styles.item, }} /> ); @@ -262,7 +267,7 @@ class ProximoMainScreen extends React.Component { * @return {*} * */ createDataset = ( - fetchedData: ProximoDataType | null, + fetchedData: ProximoDataType | null ): SectionListDataType => { return [ { @@ -281,12 +286,12 @@ class ProximoMainScreen extends React.Component { * @returns {Array} The formatted dataset */ generateData( - fetchedData: ProximoDataType | null, + fetchedData: ProximoDataType | null ): Array { const finalData: Array = []; this.articles = null; if (fetchedData != null) { - const {types} = fetchedData; + const { types } = fetchedData; this.articles = fetchedData.articles; finalData.push({ type: { @@ -308,7 +313,7 @@ class ProximoMainScreen extends React.Component { } render() { - const {navigation} = this.props; + const { navigation } = this.props; return ( ; + dishes: Array<{ name: string }>; }; type RuMealType = { @@ -51,6 +51,44 @@ type RawRuMenuType = { meal: Array; }; +const styles = StyleSheet.create({ + itemCard: { + flex: 0, + marginHorizontal: 10, + marginVertical: 5, + }, + headerCard: { + width: '95%', + marginLeft: 'auto', + marginRight: 'auto', + marginTop: 5, + marginBottom: 5, + elevation: 4, + }, + text: { + textAlign: 'center', + }, + title: { + paddingLeft: 0, + }, + itemTitle: { + marginTop: 5, + }, + item: { + width: '80%', + marginLeft: 'auto', + marginRight: 'auto', + borderBottomWidth: 1, + marginTop: 5, + marginBottom: 5, + }, + itemText: { + marginTop: 5, + marginBottom: 5, + textAlign: 'center', + }, +}); + /** * Class defining the app's menu screen. */ @@ -72,7 +110,7 @@ class SelfMenuScreen extends React.Component { * @return {[]} */ createDataset = ( - fetchedData: Array, + fetchedData: Array ): SectionListDataType => { let result: SectionListDataType = []; if (fetchedData == null || fetchedData.length === 0) { @@ -101,28 +139,14 @@ class SelfMenuScreen extends React.Component { * @param section The section to render the header from * @return {*} */ - getRenderSectionHeader = ({section}: {section: {title: string}}) => { + getRenderSectionHeader = ({ section }: { section: { title: string } }) => { return ( - + ); @@ -134,39 +158,24 @@ class SelfMenuScreen extends React.Component { * @param item The item to render * @return {*} */ - getRenderItem = ({item}: {item: RuFoodCategoryType}) => { - const {theme} = this.props; + getRenderItem = ({ item }: { item: RuFoodCategoryType }) => { + const { theme } = this.props; return ( - - + + - {item.dishes.map((object: {name: string}) => + {item.dishes.map((object: { name: string }) => object.name !== '' ? ( - + {SelfMenuScreen.formatName(object.name)} - ) : null, + ) : null )} @@ -182,7 +191,7 @@ class SelfMenuScreen extends React.Component { getKeyExtractor = (item: RuFoodCategoryType): string => item.name; render() { - const {navigation} = this.props; + const { navigation } = this.props; return ( ; theme: ReactNativePaper.Theme; }; +const styles = StyleSheet.create({ + container: { + margin: 5, + marginBottom: 20, + }, + image: { + width: 48, + height: 48, + }, + icon: { + backgroundColor: 'transparent', + }, +}); + class ServicesScreen extends React.Component { finalDataset: Array; @@ -59,7 +73,7 @@ class ServicesScreen extends React.Component { } componentDidMount() { - const {props} = this; + const { props } = this; props.navigation.setOptions({ headerRight: this.getAboutButton, }); @@ -76,7 +90,7 @@ class ServicesScreen extends React.Component { ); onAboutPress = () => { - const {props} = this; + const { props } = this; props.navigation.navigate('amicale-contact'); }; @@ -90,24 +104,16 @@ class ServicesScreen extends React.Component { * @returns {*} */ getListTitleImage(source: string | number) { - const {props} = this; + const { props } = this; if (typeof source === 'number') { - return ( - - ); + return ; } return ( ); } @@ -118,17 +124,15 @@ class ServicesScreen extends React.Component { * @param item * @returns {*} */ - getRenderItem = ({item}: {item: ServiceCategoryType}) => { - const {props} = this; + getRenderItem = ({ item }: { item: ServiceCategoryType }) => { + const { props } = this; return ( { - props.navigation.navigate('services-section', {data: item}); - }}> + props.navigation.navigate('services-section', { data: item }); + }} + > ; - route: {params: {data: ServiceCategoryType | null}}; + route: { params: { data: ServiceCategoryType | null } }; collapsibleStack: Collapsible; }; @@ -43,11 +43,11 @@ class ServicesSectionScreen extends React.Component { * Recover the list to display from navigation parameters */ handleNavigationParams() { - const {props} = this; + const { props } = this; if (props.route.params.data) { this.finalDataset = props.route.params.data; // reset params to prevent infinite loop - props.navigation.dispatch(CommonActions.setParams({data: null})); + props.navigation.dispatch(CommonActions.setParams({ data: null })); props.navigation.setOptions({ headerTitle: this.finalDataset.title, }); diff --git a/src/screens/Services/WebsiteScreen.tsx b/src/screens/Services/WebsiteScreen.tsx index f7bcfb8..7f42f50 100644 --- a/src/screens/Services/WebsiteScreen.tsx +++ b/src/screens/Services/WebsiteScreen.tsx @@ -18,14 +18,14 @@ */ import * as React from 'react'; -import {StackNavigationProp} from '@react-navigation/stack'; +import { StackNavigationProp } from '@react-navigation/stack'; import WebViewScreen from '../../components/Screens/WebViewScreen'; import AvailableWebsites from '../../constants/AvailableWebsites'; import BasicLoadingScreen from '../../components/Screens/BasicLoadingScreen'; type PropsType = { navigation: StackNavigationProp; - route: {params: {host: string; path: string | null; title: string}}; + route: { params: { host: string; path: string | null; title: string } }; }; const ENABLE_MOBILE_STRING = @@ -46,9 +46,9 @@ const BIB_BACK_BUTTON = class WebsiteScreen extends React.Component { fullUrl: string; - injectedJS: {[key: string]: string}; + injectedJS: { [key: string]: string }; - customPaddingFunctions: {[key: string]: (padding: string) => string}; + customPaddingFunctions: { [key: string]: (padding: string) => string }; host: string; @@ -70,7 +70,7 @@ class WebsiteScreen extends React.Component { `$(".hero-unit-form").append("${BIB_BACK_BUTTON}");true;`; this.customPaddingFunctions[AvailableWebsites.websites.BLUEMIND] = ( - padding: string, + padding: string ): string => { return ( `$('head').append('${ENABLE_MOBILE_STRING}');` + @@ -79,7 +79,7 @@ class WebsiteScreen extends React.Component { ); }; this.customPaddingFunctions[AvailableWebsites.websites.WIKETUD] = ( - padding: string, + padding: string ): string => { return ( `$('#p-logo-text').css('top', 10 + ${padding});` + @@ -98,11 +98,11 @@ class WebsiteScreen extends React.Component { * */ handleNavigationParams() { - const {route, navigation} = this.props; + const { route, navigation } = this.props; if (route.params != null) { this.host = route.params.host; - let {path} = route.params; - const {title} = route.params; + let { path } = route.params; + const { title } = route.params; if (this.host != null && path != null) { path = path.replace(this.host, ''); this.fullUrl = this.host + path; @@ -111,13 +111,13 @@ class WebsiteScreen extends React.Component { } if (title != null) { - navigation.setOptions({title}); + navigation.setOptions({ title }); } } } render() { - const {navigation} = this.props; + const { navigation } = this.props; let injectedJavascript = ''; let customPadding = null; if (this.host != null && this.injectedJS[this.host] != null) { diff --git a/src/utils/AutoHideHandler.ts b/src/utils/AutoHideHandler.ts index c3e7662..fbc1eec 100644 --- a/src/utils/AutoHideHandler.ts +++ b/src/utils/AutoHideHandler.ts @@ -17,7 +17,7 @@ * along with Campus INSAT. If not, see . */ -import {NativeScrollEvent, NativeSyntheticEvent} from 'react-native'; +import { NativeScrollEvent, NativeSyntheticEvent } from 'react-native'; const speedOffset = 5; @@ -76,7 +76,7 @@ export default class AutoHideHandler { * @param event The scroll event generated by the animated component onScroll prop */ onScroll(event: NativeSyntheticEvent) { - const {nativeEvent} = event; + const { nativeEvent } = event; const speed = nativeEvent.contentOffset.y < 0 ? 0 diff --git a/src/utils/CollapsibleUtils.tsx b/src/utils/CollapsibleUtils.tsx index 5438752..11a7ed1 100644 --- a/src/utils/CollapsibleUtils.tsx +++ b/src/utils/CollapsibleUtils.tsx @@ -18,15 +18,17 @@ */ import * as React from 'react'; -import {useTheme} from 'react-native-paper'; -import {createCollapsibleStack} from 'react-navigation-collapsible'; -import StackNavigator, {StackNavigationOptions} from '@react-navigation/stack'; -import {StackNavigationState, TypedNavigator} from '@react-navigation/native'; -import {StackNavigationEventMap} from '@react-navigation/stack/lib/typescript/src/types'; +import { useTheme } from 'react-native-paper'; +import { createCollapsibleStack } from 'react-navigation-collapsible'; +import StackNavigator, { + StackNavigationOptions, +} from '@react-navigation/stack'; +import { StackNavigationState, TypedNavigator } from '@react-navigation/native'; +import { StackNavigationEventMap } from '@react-navigation/stack/lib/typescript/src/types'; type StackNavigatorType = import('@react-navigation/native').TypedNavigator< Record, - StackNavigationState, + StackNavigationState, StackNavigationOptions, StackNavigationEventMap, typeof StackNavigator @@ -55,9 +57,9 @@ export function CreateScreenCollapsibleStack( title: string, useNativeDriver: boolean = true, options: StackNavigationOptions = {}, - headerColor?: string, + headerColor?: string ) { - const {colors} = useTheme(); + const { colors } = useTheme(); return createCollapsibleStack( , component: React.ComponentType, - title: string, + title: string ) { return CreateScreenCollapsibleStack(name, Stack, component, title, false); } diff --git a/src/utils/EquipmentBooking.ts b/src/utils/EquipmentBooking.ts index d2cf6f6..fdf2808 100644 --- a/src/utils/EquipmentBooking.ts +++ b/src/utils/EquipmentBooking.ts @@ -18,10 +18,10 @@ */ import i18n from 'i18n-js'; -import type {DeviceType} from '../screens/Amicale/Equipment/EquipmentListScreen'; +import type { DeviceType } from '../screens/Amicale/Equipment/EquipmentListScreen'; import DateManager from '../managers/DateManager'; -import type {MarkedDatesObjectType} from '../screens/Amicale/Equipment/EquipmentRentScreen'; -import {PeriodMarking} from 'react-native-calendars'; +import type { MarkedDatesObjectType } from '../screens/Amicale/Equipment/EquipmentRentScreen'; +import { PeriodMarking } from 'react-native-calendars'; /** * Gets the current day at midnight @@ -54,7 +54,7 @@ export function isEquipmentAvailable(item: DeviceType): boolean { let isAvailable = true; const today = getCurrentDay(); const dates = item.booked_at; - dates.forEach((date: {begin: string; end: string}) => { + dates.forEach((date: { begin: string; end: string }) => { const start = new Date(date.begin); const end = new Date(date.end); if (!(today < start || today > end)) { @@ -73,7 +73,7 @@ export function isEquipmentAvailable(item: DeviceType): boolean { export function getFirstEquipmentAvailability(item: DeviceType): Date { let firstAvailability = getCurrentDay(); const dates = item.booked_at; - dates.forEach((date: {begin: string; end: string}) => { + dates.forEach((date: { begin: string; end: string }) => { const start = new Date(date.begin); const end = new Date(date.end); end.setDate(end.getDate() + 1); @@ -134,7 +134,7 @@ export function getRelativeDateString(date: Date): string { export function getValidRange( start: Date, end: Date, - item: DeviceType | null, + item: DeviceType | null ): Array { const direction = start <= end ? 1 : -1; let limit = new Date(end); @@ -187,7 +187,7 @@ export function getValidRange( export function generateMarkedDates( isSelection: boolean, theme: ReactNativePaper.Theme, - range: Array, + range: Array ): MarkedDatesObjectType { const markedDates: { [key: string]: PeriodMarking; diff --git a/src/utils/Home.ts b/src/utils/Home.ts index efebafd..fe306a8 100644 --- a/src/utils/Home.ts +++ b/src/utils/Home.ts @@ -17,8 +17,8 @@ * along with Campus INSAT. If not, see . */ -import {stringToDate} from './Planning'; -import type {PlanningEventType} from './Planning'; +import { stringToDate } from './Planning'; +import type { PlanningEventType } from './Planning'; /** * Gets the time limit depending on the current day: @@ -48,7 +48,7 @@ export function getTodayEventTimeLimit(): Date { */ export function getEventsAfterLimit( events: Array, - limit: Date, + limit: Date ): Array { const validEvents: Array = []; events.forEach((event: PlanningEventType) => { @@ -66,7 +66,7 @@ export function getEventsAfterLimit( * @param events */ export function getFutureEvents( - events: Array, + events: Array ): Array { const validEvents: Array = []; const now = new Date(); @@ -86,13 +86,13 @@ export function getFutureEvents( * @return {PlanningEventType | null} */ export function getDisplayEvent( - events: Array, + events: Array ): PlanningEventType | null { let displayEvent = null; if (events.length > 1) { const eventsAfterLimit = getEventsAfterLimit( events, - getTodayEventTimeLimit(), + getTodayEventTimeLimit() ); if (eventsAfterLimit.length > 0) { [displayEvent] = eventsAfterLimit; diff --git a/src/utils/Locales.ts b/src/utils/Locales.ts index 3f6f144..e874bbc 100644 --- a/src/utils/Locales.ts +++ b/src/utils/Locales.ts @@ -25,7 +25,7 @@ import fr from '../../locales/fr.json'; const initLocales = () => { i18n.fallbacks = true; - i18n.translations = {fr, en}; + i18n.translations = { fr, en }; const bestLanguage = RNLocalize.findBestAvailableLanguage(['en', 'fr']); i18n.locale = bestLanguage ? bestLanguage.languageTag : 'en'; }; diff --git a/src/utils/Notifications.ts b/src/utils/Notifications.ts index 1bb8acd..6262797 100644 --- a/src/utils/Notifications.ts +++ b/src/utils/Notifications.ts @@ -38,13 +38,13 @@ const reminderIdFactor = 100; */ export async function askPermissions(): Promise { return new Promise((resolve: () => void, reject: () => void) => { - checkNotifications().then(({status}: {status: string}) => { + checkNotifications().then(({ status }: { status: string }) => { if (status === RESULTS.GRANTED) { resolve(); } else if (status === RESULTS.BLOCKED) { reject(); } else { - requestNotifications([]).then((result: {status: string}) => { + requestNotifications([]).then((result: { status: string }) => { if (result.status === RESULTS.GRANTED) { resolve(); } else { @@ -66,7 +66,7 @@ export async function askPermissions(): Promise { */ function createNotifications(machineID: string, date: Date) { const reminder = AsyncStorageManager.getNumber( - AsyncStorageManager.PREFERENCES.proxiwashNotifications.key, + AsyncStorageManager.PREFERENCES.proxiwashNotifications.key ); if (!Number.isNaN(reminder) && reminder > 0) { const id = reminderIdFactor * parseInt(machineID, 10); @@ -107,7 +107,7 @@ function createNotifications(machineID: string, date: Date) { export async function setupMachineNotification( machineID: string, isEnabled: boolean, - endDate: Date | null, + endDate: Date | null ): Promise { return new Promise((resolve: () => void, reject: () => void) => { if (isEnabled && endDate != null) { @@ -120,9 +120,9 @@ export async function setupMachineNotification( reject(); }); } else { - PushNotification.cancelLocalNotifications({id: machineID}); + PushNotification.cancelLocalNotifications({ id: machineID }); const reminderId = reminderIdFactor * parseInt(machineID, 10); - PushNotification.cancelLocalNotifications({id: reminderId.toString()}); + PushNotification.cancelLocalNotifications({ id: reminderId.toString() }); resolve(); } }); diff --git a/src/utils/Planning.ts b/src/utils/Planning.ts index 81a19f7..e620fcf 100644 --- a/src/utils/Planning.ts +++ b/src/utils/Planning.ts @@ -63,7 +63,7 @@ export function stringToDate(dateString: string): Date | null { date.setFullYear( parseInt(dateArray[0], 10), parseInt(dateArray[1], 10) - 1, // Month range from 0 to 11 - parseInt(dateArray[2], 10), + parseInt(dateArray[2], 10) ); date.setHours(parseInt(timeArray[0], 10), parseInt(timeArray[1], 10), 0, 0); } else { @@ -179,11 +179,11 @@ export function isDescriptionEmpty(description?: string): boolean { * @return {Object} */ export function generateEmptyCalendar( - numberOfMonths: number, -): {[key: string]: Array} { + numberOfMonths: number +): { [key: string]: Array } { const end = new Date(Date.now()); end.setMonth(end.getMonth() + numberOfMonths); - const daysOfYear: {[key: string]: Array} = {}; + const daysOfYear: { [key: string]: Array } = {}; for (let d = new Date(Date.now()); d <= end; d.setDate(d.getDate() + 1)) { const dateString = getDateOnlyString(dateToString(new Date(d), false)); if (dateString !== null) { @@ -203,7 +203,7 @@ export function generateEmptyCalendar( */ export function pushEventInOrder( eventArray: Array, - event: PlanningEventType, + event: PlanningEventType ) { if (eventArray.length === 0) { eventArray.push(event); @@ -233,8 +233,8 @@ export function pushEventInOrder( */ export function generateEventAgenda( eventList: Array, - numberOfMonths: number, -): {[key: string]: Array} { + numberOfMonths: number +): { [key: string]: Array } { const agendaItems = generateEmptyCalendar(numberOfMonths); for (let i = 0; i < eventList.length; i += 1) { const dateString = getDateOnlyString(eventList[i].date_begin); diff --git a/src/utils/Proxiwash.ts b/src/utils/Proxiwash.ts index e2e202b..92cad82 100644 --- a/src/utils/Proxiwash.ts +++ b/src/utils/Proxiwash.ts @@ -17,7 +17,7 @@ * along with Campus INSAT. If not, see . */ -import type {ProxiwashMachineType} from '../screens/Proxiwash/ProxiwashScreen'; +import type { ProxiwashMachineType } from '../screens/Proxiwash/ProxiwashScreen'; /** * Gets the machine end Date object. @@ -59,7 +59,7 @@ export function getMachineEndDate(machine: ProxiwashMachineType): Date | null { */ export function isMachineWatched( machine: ProxiwashMachineType, - machinesWatched: Array, + machinesWatched: Array ): boolean { let watched = false; machinesWatched.forEach((watchedMachine: ProxiwashMachineType) => { @@ -82,7 +82,7 @@ export function isMachineWatched( */ export function getMachineOfId( id: string, - allMachines: Array, + allMachines: Array ): ProxiwashMachineType | null { let machineFound = null; allMachines.forEach((machine: ProxiwashMachineType) => { @@ -104,7 +104,7 @@ export function getMachineOfId( */ export function getCleanedMachineWatched( machineWatchedList: Array, - allMachines: Array, + allMachines: Array ): Array { const newList: Array = []; machineWatchedList.forEach((watchedMachine: ProxiwashMachineType) => { diff --git a/src/utils/Search.ts b/src/utils/Search.ts index 2b2c67f..d2af386 100644 --- a/src/utils/Search.ts +++ b/src/utils/Search.ts @@ -54,7 +54,7 @@ export function stringMatchQuery(str: string, query: string): boolean { */ export function isItemInCategoryFilter( filter: Array, - categories: Array, + categories: Array ): boolean { let itemFound = false; categories.forEach((cat: number | null) => { diff --git a/src/utils/Services.ts b/src/utils/Services.ts index 9d82611..bae30c3 100644 --- a/src/utils/Services.ts +++ b/src/utils/Services.ts @@ -24,9 +24,9 @@ * @param sourceList The item list to use as source * @returns {[]} */ -export default function getStrippedServicesList( +export default function getStrippedServicesList( idList: Array, - sourceList: Array, + sourceList: Array ) { const newArray: Array = []; sourceList.forEach((item: T) => { @@ -46,9 +46,9 @@ export default function getStrippedServicesList( * @param originalList The original list * @returns {[]} */ -export function getSublistWithIds( +export function getSublistWithIds( idList: Array, - originalList: Array, + originalList: Array ) { const subList: Array = []; for (let i = 0; i < idList.length; i += 1) { diff --git a/src/utils/URLHandler.ts b/src/utils/URLHandler.ts index 15764e5..a498b9f 100644 --- a/src/utils/URLHandler.ts +++ b/src/utils/URLHandler.ts @@ -17,18 +17,18 @@ * along with Campus INSAT. If not, see . */ -import {Linking} from 'react-native'; +import { Linking } from 'react-native'; export type ParsedUrlDataType = { route: string; - data: {[key: string]: string}; + data: { [key: string]: string }; }; export type ParsedUrlCallbackType = (parsedData: ParsedUrlDataType) => void; type RawParsedUrlDataType = { path: string; - queryParams: {[key: string]: string}; + queryParams: { [key: string]: string }; }; /** @@ -51,7 +51,7 @@ export default class URLHandler { constructor( onInitialURLParsed: ParsedUrlCallbackType, - onDetectURL: ParsedUrlCallbackType, + onDetectURL: ParsedUrlCallbackType ) { this.onInitialURLParsed = onInitialURLParsed; this.onDetectURL = onDetectURL; @@ -67,7 +67,7 @@ export default class URLHandler { let parsedData: RawParsedUrlDataType | null = null; const urlNoScheme = url.replace(URLHandler.SCHEME, ''); if (urlNoScheme != null) { - const params: {[key: string]: string} = {}; + const params: { [key: string]: string } = {}; const [path, fullParamsString] = urlNoScheme.split('?'); if (fullParamsString != null) { const paramsStringArray = fullParamsString.split('&'); @@ -79,7 +79,7 @@ export default class URLHandler { }); } if (path != null) { - parsedData = {path, queryParams: params}; + parsedData = { path, queryParams: params }; } } return parsedData; @@ -93,12 +93,12 @@ export default class URLHandler { * @returns {null} */ static getUrlData( - rawParsedUrlData: RawParsedUrlDataType | null, + rawParsedUrlData: RawParsedUrlDataType | null ): ParsedUrlDataType | null { let parsedData: null | ParsedUrlDataType = null; if (rawParsedUrlData != null) { - const {path} = rawParsedUrlData; - const {queryParams} = rawParsedUrlData; + const { path } = rawParsedUrlData; + const { queryParams } = rawParsedUrlData; if (URLHandler.isClubInformationLink(path)) { parsedData = URLHandler.generateClubInformationData(queryParams); } else if (URLHandler.isPlanningInformationLink(path)) { @@ -153,7 +153,7 @@ export default class URLHandler { if (!Number.isNaN(id)) { return { route: URLHandler.CLUB_INFO_ROUTE, - data: {clubId: id.toString()}, + data: { clubId: id.toString() }, }; } } @@ -174,7 +174,7 @@ export default class URLHandler { if (!Number.isNaN(id)) { return { route: URLHandler.EVENT_INFO_ROUTE, - data: {eventId: id.toString()}, + data: { eventId: id.toString() }, }; } } @@ -200,7 +200,7 @@ export default class URLHandler { * * @param url The url detected */ - onUrl = ({url}: {url: string}) => { + onUrl = ({ url }: { url: string }) => { if (url != null) { const data = URLHandler.getUrlData(URLHandler.parseUrl(url)); if (data != null) { diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index 301e2e1..d8c9af4 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -17,7 +17,7 @@ * along with Campus INSAT. If not, see . */ -import {Platform, StatusBar} from 'react-native'; +import { Platform, StatusBar } from 'react-native'; import ThemeManager from '../managers/ThemeManager'; /** @@ -33,7 +33,7 @@ export function setupStatusBar() { if (Platform.OS === 'android') { StatusBar.setBackgroundColor( ThemeManager.getCurrentTheme().colors.surface, - true, + true ); } } diff --git a/src/utils/WebData.ts b/src/utils/WebData.ts index f27e6d8..ea7cb93 100644 --- a/src/utils/WebData.ts +++ b/src/utils/WebData.ts @@ -73,25 +73,25 @@ export function isApiResponseValid(response: ApiResponseType): boolean { export async function apiRequest( path: string, method: string, - params?: object, + params?: object ): Promise { return new Promise( (resolve: (data: T) => void, reject: (error: number) => void) => { let requestParams = {}; if (params != null) { - requestParams = {...params}; + requestParams = { ...params }; } fetch(API_ENDPOINT + path, { method, headers: new Headers({ - Accept: 'application/json', + 'Accept': 'application/json', 'Content-Type': 'application/json', }), body: JSON.stringify(requestParams), }) .then( async (response: Response): Promise> => - response.json(), + response.json() ) .then((response: ApiResponseType) => { if (isApiResponseValid(response)) { @@ -105,7 +105,7 @@ export async function apiRequest( } }) .catch((): void => reject(ERROR_TYPE.CONNECTION_ERROR)); - }, + } ); } diff --git a/src/utils/withCollapsible.tsx b/src/utils/withCollapsible.tsx index 4d537cd..6cfb2d1 100644 --- a/src/utils/withCollapsible.tsx +++ b/src/utils/withCollapsible.tsx @@ -18,7 +18,7 @@ */ import * as React from 'react'; -import {useCollapsibleStack} from 'react-navigation-collapsible'; +import { useCollapsibleStack } from 'react-navigation-collapsible'; /** * Function used to manipulate Collapsible Hooks from a class.