Dev #3

Merged
Horhik merged 4 commits from dev into master 2020-03-25 13:07:04 +00:00
24 changed files with 444 additions and 242 deletions

View file

@ -179,6 +179,7 @@ android {
}
dependencies {
implementation project(':@react-native-community_async-storage')
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.facebook.react:react-native:+" // From node_modules

View file

@ -4,6 +4,7 @@ import android.app.Application;
import android.content.Context;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.reactnativecommunity.asyncstorage.AsyncStoragePackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;

View file

@ -1,3 +1,5 @@
rootProject.name = 'ankilan'
include ':@react-native-community_async-storage'
project(':@react-native-community_async-storage').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/async-storage/android')
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
include ':app'

View file

@ -34,6 +34,8 @@ target 'ankilan' do
pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
pod 'RNCAsyncStorage', :path => '../node_modules/@react-native-community/async-storage'
target 'ankilanTests' do
inherit! :search_paths
# Pods for testing

View file

@ -10,8 +10,10 @@
"lint": "eslint ."
},
"dependencies": {
"@react-native-community/async-storage": "^1.8.1",
"axios": "^0.19.2",
"babel-preset-react-native": "^4.0.1",
"jsonfn": "^0.31.0",
"native-base": "^2.13.8",
"node-fetch": "^2.6.0",
"react": "16.13.0",

View file

@ -69,7 +69,6 @@ export const getModelList = () => async dispatch => {
if (err) {
throw err;
}
console.log(res);
await dispatch(setModelList(res));
} catch (err) {
console.log(err);

View file

@ -1,8 +1,8 @@
import {AnkiDroid} from 'react-native-ankidroid/dist/ankidroid';
import {
SET_ANKI_NOTE_CREATOR,
SET_CREATOR_TEMPLATE,
SET_DECK,
SET_FIELDS,
} from '../constants/anki-constants';
export const selectDeck = id => ({
@ -19,3 +19,41 @@ export const setCreatorTemplate = template => ({
type: SET_CREATOR_TEMPLATE,
payload: template,
});
const parseToAnkiFormat = dict => {
/*
*** TEMPLATE ***
const modelFields = [
'Word or sentence',
'Part of speech 1',
'Translation 1',
'Definition 1',
'Part of speech 2',
'Translation 2',
'Definition 2',
'Usage example',
'Transcription',
'Sound',
]
*/
const tr1 = dict.compounded[0];
const tr2 = dict.compounded[1] || {};
return [
dict.word,
tr1.pos,
tr1.tr,
tr1.definition,
tr2.pos || '',
tr2.tr || '',
tr2.definition || '',
`${tr1.example || ''} \n ${tr2.example || ''}`,
dict.pronunciation,
`[sound:${dict.sound}]`,
];
};
export const setFields = dict => ({
type: SET_FIELDS,
payload: parseToAnkiFormat(dict),
});

View file

@ -1,6 +1,7 @@
import {search} from 'urban-dictionary-client';
import {
SET_AVAILABLE_API,
SET_PARSED_DICTIONARY,
URBAN_DICTIONARY_API,
WORDS_API,
} from '../../constants/api-constants';
@ -11,6 +12,8 @@ import {
parseUrbanDictionaryApi,
} from './urban-dictionary';
import {createDictionary} from '../dictionary/create-dictionary';
import {setFields} from '../anki-set-actions';
import {sendWord, submit} from '../form-actions';
const getAvailableApi = (apiArray = []) => {
for (const api of apiArray) {
@ -25,6 +28,10 @@ const setAvailableApi = api => ({
type: SET_AVAILABLE_API,
payload: api,
});
const setDictioanry = dictioanry => ({
type: SET_PARSED_DICTIONARY,
payload: dictioanry,
});
export const wordInfo = word => async dispatch => {
try {
@ -40,7 +47,9 @@ export const wordInfo = word => async dispatch => {
//function which return universal template for more simple interaction with api
//TODO available dictionary instead api1
await dispatch(setAvailableApi(api1));
await createDictionary(api1);
const wordDictionary = await createDictionary(api1);
dispatch(setDictioanry(wordDictionary));
sendWord(setFields(wordDictionary));
} catch (e) {
console.log(e);
}

27
src/actions/api/f-json.js Normal file
View file

@ -0,0 +1,27 @@
// The object
// the string version of a function with /Function(
// in front and )/ at the end.
export const fJsonStingify = obj => {
return JSON.stringify(obj, function(key, value) {
if (typeof value === 'function') {
return '/Function(' + value.toString() + ')/';
}
return value;
});
};
// Convert to an object using a reviver function that
// recognizes the /Function(...)/ value and converts it
// into a function via -shudder- `eval`.
export const fJsonParse = json => {
return JSON.parse(json, function(key, value) {
if (
typeof value === 'string' &&
value.startsWith('/Function(') &&
value.endsWith(')/')
) {
value = value.substring(10, value.length - 2);
return eval('(' + value + ')');
}
return value;
});
};

View file

@ -1,12 +1,11 @@
const getAudio = async word => {
const site = await fetch(word, {
const site = await fetch(`https://www.lexico.com/definition/${word}`, {
method: 'GET',
headers: {'Content-Type': 'text/html'},
});
const html = await site.text();
const getSrc = new RegExp('<audio.+?src="(.+?)".+?/?>');
const src = html.match(getSrc)[1];
console.log(src);
return src;
};

View file

@ -13,7 +13,6 @@ const yDictionary = async (
{method: 'GET'},
);
const json = await res.json();
// console.log(word, json.def);
return findPartofSpeech(json.def);
} catch (e) {
console.log('err in yandex-dictionary.js: ', e);

View file

@ -1,177 +1,35 @@
import {AnkiDroid} from 'react-native-ankidroid/dist/ankidroid';
import {setAnkiNoteCreator, setCreatorTemplate} from './anki-set-actions';
import sendDataToLocaleStorage from './filesystem';
import setSettings, {
modelFields,
valueFields,
} from '../constants/anki-model-values';
import {
checkAnkiLanModelForExisting,
getFieldList,
getModelList,
} from './anki-get-actions';
import JSONfn from 'jsonfn';
import store from '../store';
export const createAnkiLanModel = model => async dispatch => {
try {
const deckName = model.deck.name;
const modelName = model.name;
const dbDeckReference = 'com.anki.decks';
const dbModelReference = 'com.anki.models';
const tags = ['AnkiLan'];
const modelFields = [
'Word or sentence',
'Part of speech 1',
'Translation 1',
'Definition 1',
'Part of speech 2',
'Translation 2',
'Definition 2',
'Usage example',
'Transcription',
'Sound',
];
const cardNames = ['Russian>English', 'English>Russian'];
const css = `.card {
font-family: 'Roboto', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
font-size: 24px;
text-align: center;
color: black;
background-color: white;
word-wrap: break-word;
}
const settings = setSettings(model);
.big {
font-size: 48px;
}
.small {
font-size: 18px;
}
.sound--container {
display: flex;
justify-content: center;
padding: 0px;
align-items: center;
}
.sound {
padding-left: 10px;
}
.transcription {
color: #1e7efc;
font-weight: bold;
}
.list{
list-style: none;
display: flex;
flex-direction:column;
align-items:center;
padding: 0;
}
.definition{
font-size: 20px;
font-famyli: sans-serif;
font-style: italic;
display: block;
margin: 7px ;
padding: 0 20px ;
white-space: normal;
width: 70vw;
}
.usage{
background-color: rgba(100,100,100,0.1);
padding: 10px;
font-size: 20px;
white-space: normal;
width: 70vw;
margin: 0 auto;
border-radius: 5px;
}`;
const questionFmt1 = `
<div class="big">{{Word or sentence}}</div>
<ul class="list">
<li>
<div class="small">{{Part of speech 1}}</div>
</li>
<li>
<div class="small">{{Part of speech 2}}</div>
</li>
</ul>
<div class="sound--container">
<div class="transcription">{{Transcription}}</div>
<span class="sound">{{Sound}}</span>
`;
const questionFmt2 = '<div class="big">{{Translation 1}}</div>';
const questionFormat = [questionFmt1, questionFmt2];
const answerFmt1 = `
<div class="big">{{Word or sentence}}</div>
<div class="sound--container">
<div class="transcription">{{Transcription}}</div>
<span class="sound">{{Sound}}</span>
</div>
<hr>
<div class="usage">{{Usage example}}</div>
<hr />
<ul class="list">
<li>
<div>
<div class="small">{{Part of speech 1}}</div>
<pre class="definition">{{Definition 1}}</pre>
<div>{{Translation 1}}</div>
</div>
</li>
<li>
<div>
<div class="small">{{Part of speech 2}}</div>
<pre class="definition">{{Definition 2}}</pre>
<div>{{Translation 2}}</div>
</div>
</li>
</ul>
</div>`;
const answerFormat = [answerFmt1, answerFmt1];
// ADDING NOTES //
const deckProperties = {
name: deckName,
reference: dbDeckReference,
};
const modelProperties = {
name: modelName,
reference: dbModelReference,
fields: modelFields,
tags,
cardNames,
questionFormat,
answerFormat,
css,
};
const valueFields = [
'AnkiLan',
'Translate by typing the word',
'',
'You can type the word in input field and get translate, sound and definition of this word',
'Translate via sharing',
'',
'You can mark the word in you phone and share it with AnkiLan',
'IMAGE WILL BE HERE',
'guide',
'',
];
const settings = {
modelId: undefined,
modelProperties: modelProperties,
deckId: model.deck.id,
deckProperties: deckProperties,
};
const selectedDeck = new AnkiDroid(settings);
await dispatch(setAnkiNoteCreator(selectedDeck));
await dispatch(setCreatorTemplate(modelFields));
// const sd = JSON.parse(JSON.stringify(selectedDeck));
// console.log(sd === selectedDeck);
// ****************
alert('oh shit');
addNote(selectedDeck, valueFields, modelFields);
// ****************
// sendDataToLocaleStorage(
// setAnkiNoteCreator(sd), //send creator to locale storage
// setCreatorTemplate(modelFields),
// );
checkAnkiLanModelForExisting(model.name, model.list);
await dispatch(getModelList());
await dispatch(getFieldList(model.name));
@ -180,6 +38,15 @@ export const createAnkiLanModel = model => async dispatch => {
}
};
export const addNote = (creator, words, template) => {
//creator is an object what have to store in locale storage.
export const addNote = words => {
const template = store.getState().anki.noteTemplate;
const settings = {
deckId: '1',
modelId: '1585139654585',
};
const creator = new AnkiDroid(settings);
creator.addNote(words, template);
alert('sucssess');
};

View file

@ -5,6 +5,7 @@ import {compoundWithYDictionary} from './get-translate';
export const createDictionary = async apiRes => {
const word = apiRes.word;
const parsedDictionary = parseDictionary(apiRes);
// const audio = await getAudio(word);
await compoundWithYDictionary(parsedDictionary, word);
const audio = await getAudio(word);
const compounded = await compoundWithYDictionary(parsedDictionary, word);
return {...compounded, sound: audio};
};

View file

@ -5,7 +5,6 @@ export const compoundWithYDictionary = async (definitionList, word) => {
let compounded = [];
// console.log('YANDEX ', translations);
// console.log('WORDS', definitionList);
translations.forEach(translate => {
definitionList.words.forEach(definition => {
if (definition.pos === translate.pos) {
@ -17,7 +16,12 @@ export const compoundWithYDictionary = async (definitionList, word) => {
compounded.push(translate);
}
});
console.log(`RESPONSE FOR: ${word}`, compounded);
// console.log(`RESPONSE FOR: ${word}`, {word, compounded});
return {
word,
pronunciation: `/${definitionList.pronunciation}/`,
compounded,
};
} catch (e) {
console.log('erris HERE', e);
}
@ -35,6 +39,5 @@ export const compoundWithYDictionary = async (definitionList, word) => {
});
})();
const yDictionaryRes = smallStore.res.payload;
alert('foo');
console.log(yDictionaryRes, definitionList);
};*/

48
src/actions/filesystem.js Normal file
View file

@ -0,0 +1,48 @@
import AsyncStorage from '@react-native-community/async-storage';
import {
ANKILAN_NOTE_CREATOR,
ANKILAN_NOTE_TEMPLATE,
} from '../constants/anki-constants';
import JSONfn from 'jsonfn';
const sendDataToLocaleStorage = async (creator, template) => {
try {
await AsyncStorage.clear();
await AsyncStorage.setItem(ANKILAN_NOTE_CREATOR, JSONfn.stringify(creator));
await AsyncStorage.setItem(
ANKILAN_NOTE_TEMPLATE,
JSONfn.stringify(template),
);
} catch (e) {
// saving error
alert('Error while syncing with filesystem');
console.log(e);
}
};
export default sendDataToLocaleStorage;
export const getTemplate = async () => {
try {
const value = await AsyncStorage.getItem(ANKILAN_NOTE_TEMPLATE);
console.log(value);
if (value !== null) {
// value previously stored
return JSONfn.parse(value);
}
} catch (e) {
// error reading value
}
};
export const getCreator = async () => {
try {
const value = await AsyncStorage.getItem(ANKILAN_NOTE_CREATOR);
if (value !== null) {
// value previously stored
return JSONfn.parse(value);
}
} catch (e) {
// error reading value
}
};

View file

@ -0,0 +1,12 @@
import {getCreator, getTemplate} from './filesystem';
import {addNote} from './createAnkiLanModel';
export const submit = () => ({});
export const sendWord = async fields => {
// const creator = await getCreator();
// const template = JSON.parse(await getTemplate()).payload;
// console.log(creator);
// console.log(template);
console.log(fields);
addNote(fields.payload);
};

View file

@ -1,4 +1,4 @@
import React, {useEffect} from 'react';
import React, {useEffect, useState} from 'react';
import {connect} from 'react-redux';
import DeckPicker from './view/deck-picker';
import {Form, Container, Item} from 'native-base';
@ -8,22 +8,30 @@ import SubmitButton from './view/submit-button';
import {wordInfo} from "../actions/api/dictionary";
const AnkiForm = props => {
const [target, setTarget] = useState('')
useEffect(() => {
props.wordInfo('Urge');
props.wordInfo('Maze');
props.wordInfo('Ramification');
props.wordInfo('Dare');
props.wordInfo('Entrepreneurship');
props.wordInfo('meagre');
props.wordInfo('meager');
// props.wordInfo('Urge');
// props.wordInfo('Maze');
// props.wordInfo('Ramification');
// props.wordInfo('Dare');
// props.wordInfo('Entrepreneurship');
// props.wordInfo('meagre');
// props.wordInfo('meager');
}, []);
const getWord = (word) => {
setTarget(word)
};
const submit = () => {
props.wordInfo(target);
};
return (
<Container style={{padding: 20}}>
<Form onSubmit={() => alert('hell')}>
<Form >
<DeckPicker />
<InputWord />
<SubmitButton />
<InputWord word={getWord} onSubmit={submit}/>
<SubmitButton onSubmit={submit} />
</Form>
</Container>
);

View file

@ -4,9 +4,10 @@ import {Button, Text} from 'native-base';
const SubmitButton = props => {
return (
<Button type="submit">
<Button onPress={props.onSubmit}>
<Text>Submit</Text>
</Button>
);
};
export default connect()(SubmitButton);
export default SubmitButton

View file

@ -1,9 +1,11 @@
import React from 'react';
import React, {useRef} from 'react';
import {connect} from 'react-redux';
import {TextField} from 'react-native-material-textfield';
const InputWord = props => {
const submit = () => {};
return <TextField label={'Your word'} onChange={submit} />;
const sendWord = (word) => {
props.word(word)
};
return <TextField label={'Your word'} onChangeText={word => sendWord(word)} onSubmitEditing={props.onSubmit}/>;
};
export default connect(state => ({}), {})(InputWord);

View file

@ -17,7 +17,12 @@ export const SET_WORD_SOUND = 'SET_WORD_SOUND';
export const SET_WORD_TRANSLATE = 'SET_WORD_TRANSLATE';
export const SET_ANKI_NOTE_CREATOR = 'SET_ANKI_NOTE_CREATOR';
export const SET_CREATOR_TEMPLATE = 'SET_CREATOR_TEMPLATE';
export const SET_FIELDS = 'SET_FIELDS';
//Anki ui actions
export const SHOW_FIELDS = 'SHOW_FIELDS';
// Anki check actions
export const SET_EXISTING_OF_ANKI_LAN_MODEL = 'SET_EXISTING_OF_ANKI_LAN_MODEL';
//rn-async-storage kesy
export const ANKILAN_NOTE_CREATOR = '@ANKILAN_NOTE_CREATOR';
export const ANKILAN_NOTE_TEMPLATE = '@ANKILAN_NOTE_TEMPLATE';

View file

@ -0,0 +1,165 @@
export const modelFields = [
'Word or sentence',
'Part of speech 1',
'Translation 1',
'Definition 1',
'Part of speech 2',
'Translation 2',
'Definition 2',
'Usage example',
'Transcription',
'Sound',
];
export const valueFields = [
'AnkiLan',
'Translate by typing the word',
'',
'You can type the word in input field and get translate, sound and definition of this word',
'Translate via sharing',
'',
'You can mark the word in you phone and share it with AnkiLan',
'IMAGE WILL BE HERE',
'guide',
'',
];
const setSettings = model => {
const deckName = model.deck.name;
const modelName = model.name;
const dbDeckReference = 'com.anki.decks';
const dbModelReference = 'com.anki.models';
const tags = ['AnkiLan'];
const cardNames = ['Russian>English', 'English>Russian'];
const css = `.card {
font-family: 'Roboto', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
font-size: 24px;
text-align: center;
color: black;
background-color: white;
word-wrap: break-word;
}
.big {
font-size: 48px;
}
.small {
font-size: 18px;
}
.sound--container {
display: flex;
justify-content: center;
padding: 0px;
align-items: center;
}
.sound {
padding-left: 10px;
}
.transcription {
color: #1e7efc;
font-weight: bold;
}
.list{
list-style: none;
display: flex;
flex-direction:column;
align-items:center;
padding: 0;
}
.definition{
font-size: 20px;
font-famyli: sans-serif;
font-style: italic;
display: block;
margin: 7px ;
padding: 0 20px ;
white-space: normal;
width: 70vw;
}
.usage{
background-color: rgba(100,100,100,0.1);
padding: 10px;
font-size: 20px;
white-space: normal;
width: 70vw;
margin: 0 auto;
border-radius: 5px;
}`;
const questionFmt1 = `
<div class="big">{{Word or sentence}}</div>
<ul class="list">
<li>
<div class="small">{{Part of speech 1}}</div>
</li>
<li>
<div class="small">{{Part of speech 2}}</div>
</li>
</ul>
<div class="sound--container">
<div class="transcription">{{Transcription}}</div>
<span class="sound">{{Sound}}</span>
`;
const questionFmt2 = '<div class="big">{{Translation 1}}</div>';
const questionFormat = [questionFmt1, questionFmt2];
const answerFmt1 = `
<div class="big">{{Word or sentence}}</div>
<div class="sound--container">
<div class="transcription">{{Transcription}}</div>
<span class="sound">{{Sound}}</span>
</div>
<hr>
<div class="usage">{{Usage example}}</div>
<hr />
<ul class="list">
<li>
<div>
<div class="small">{{Part of speech 1}}</div>
<pre class="definition">{{Definition 1}}</pre>
<div>{{Translation 1}}</div>
</div>
</li>
<li>
<div>
<div class="small">{{Part of speech 2}}</div>
<pre class="definition">{{Definition 2}}</pre>
<div>{{Translation 2}}</div>
</div>
</li>
</ul>
</div>`;
const answerFormat = [answerFmt1, answerFmt1];
// ADDING NOTES //
const deckProperties = {
name: deckName,
reference: dbDeckReference,
};
const modelProperties = {
name: modelName,
reference: dbModelReference,
fields: modelFields,
tags,
cardNames,
questionFormat,
answerFormat,
css,
};
return {
modelId: undefined,
modelProperties: modelProperties,
deckId: model.deck.id,
deckProperties: deckProperties,
};
};
export default setSettings;

View file

@ -20,7 +20,7 @@ const initialState = {
mainFieldIsAvailable: false,
fieldList: [],
ankiLanModelIsAlreadyExists: false,
ankiLanModelName: 'AnkiLan3',
ankiLanModelName: '1AnkiLan1111',
noteCreator: {},
noteTemplate: [],
};

View file

@ -1,5 +1,6 @@
import {
SET_AVAILABLE_API,
SET_PARSED_DICTIONARY,
SET_YANDEX_DICTIONARY_RESPONSE,
} from '../constants/api-constants';
@ -26,6 +27,11 @@ const apiReducer = (state = initialState, action) => {
availableApi: action.payload,
availableApiName: action.payload.source,
};
case SET_PARSED_DICTIONARY:
return {
...state,
parsedDictionary: action.payload,
};
default:
return state;
}

113
yarn.lock
View file

@ -928,6 +928,11 @@
"@types/yargs" "^15.0.0"
chalk "^3.0.0"
"@react-native-community/async-storage@^1.8.1":
version "1.8.1"
resolved "https://registry.yarnpkg.com/@react-native-community/async-storage/-/async-storage-1.8.1.tgz#c93e69dcf948667b207e409b8039b7edf199159b"
integrity sha512-MA1fTp4SB7OOtDmNAwds6jIpiwwty1NIoFboWjEWkoyWW35zIuxlhHxD4joSy21aWEzUVwvv6JJ2hSsP/HTb7A==
"@react-native-community/cli-debugger-ui@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-3.0.0.tgz#d01d08d1e5ddc1633d82c7d84d48fff07bd39416"
@ -2744,9 +2749,9 @@ data-urls@^1.1.0:
whatwg-url "^7.0.0"
dayjs@^1.8.15:
version "1.8.22"
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.22.tgz#5e835d776b373e216678be8d12c336da71a25a9c"
integrity sha512-N8IXfxBD62Y9cKTuuuSoOlCXRnnzaTj1vu91r855iq6FbY5cZqOZnW/95nUn6kJiR+W9PHHrLykEoQOe6fUKxQ==
version "1.8.23"
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.23.tgz#07b5a8e759c4d75ae07bdd0ad6977f851c01e510"
integrity sha512-NmYHMFONftoZbeOhVz6jfiXI4zSiPN6NoVWJgC0aZQfYVwzy/ZpESPHuCcI0B8BUMpSJQ08zenHDbofOLKq8hQ==
debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
version "2.6.9"
@ -3049,9 +3054,9 @@ eslint-plugin-prettier@2.6.2:
jest-docblock "^21.0.0"
eslint-plugin-react-hooks@^2.0.1:
version "2.5.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.0.tgz#c50ab7ca5945ce6d1cf8248d9e185c80b54171b6"
integrity sha512-bzvdX47Jx847bgAYf0FPX3u1oxU+mKU8tqrpj4UX9A96SbAmj/HVEefEy6rJUog5u8QIlOPTKZcBpGn5kkKfAQ==
version "2.5.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.1.tgz#4ef5930592588ce171abeb26f400c7fbcbc23cd0"
integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g==
eslint-plugin-react-native-globals@^0.1.1:
version "0.1.2"
@ -3696,9 +3701,9 @@ fs.realpath@^1.0.0:
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
fsevents@^1.2.7:
version "1.2.11"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3"
integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==
version "1.2.12"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c"
integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==
dependencies:
bindings "^1.5.0"
nan "^2.12.1"
@ -5001,11 +5006,11 @@ json-stringify-safe@~5.0.1:
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
json5@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6"
integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==
version "2.1.2"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e"
integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==
dependencies:
minimist "^1.2.0"
minimist "^1.2.5"
jsonfile@^2.1.0:
version "2.4.0"
@ -5021,6 +5026,11 @@ jsonfile@^4.0.0:
optionalDependencies:
graceful-fs "^4.1.6"
jsonfn@^0.31.0:
version "0.31.0"
resolved "https://registry.yarnpkg.com/jsonfn/-/jsonfn-0.31.0.tgz#8cd09ee376d46df75c2c0de3c548a95dbb81dc8b"
integrity sha1-jNCe43bUbfdcLA3jxUipXbuB3Is=
jsonify@~0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
@ -5675,17 +5685,12 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
minimist@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.0.tgz#cdf225e8898f840a258ded44fc91776770afdc93"
integrity sha1-zfIl6ImPhAolje1E/JF3Z3Cv3JM=
minimist@^1.1.1, minimist@^1.2.0:
minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@ -5699,11 +5704,11 @@ mixin-deep@^1.2.0:
is-extendable "^1.0.1"
mkdirp@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c"
integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==
dependencies:
minimist "0.0.8"
minimist "^1.2.5"
moment@2.x.x:
version "2.24.0"
@ -6435,9 +6440,9 @@ promise@^7.1.1:
asap "~2.0.3"
prompts@^2.0.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.1.tgz#b63a9ce2809f106fa9ae1277c275b167af46ea05"
integrity sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==
version "2.3.2"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068"
integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==
dependencies:
kleur "^3.0.3"
sisteransi "^1.0.4"
@ -6533,9 +6538,9 @@ react-devtools-core@^3.6.3:
ws "^3.3.1"
react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0:
version "16.13.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527"
integrity sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-native-ankidroid@^0.4.0:
version "0.4.0"
@ -6791,9 +6796,9 @@ regenerator-transform@^0.10.0:
private "^0.1.6"
regenerator-transform@^0.14.2:
version "0.14.3"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.3.tgz#54aebff2ef58c0ae61e695ad1b9a9d65995fff78"
integrity sha512-zXHNKJspmONxBViAb3ZUmFoFPnTBs3zFhCEZJiwp/gkNzxVbTqNJVjYKx6Qk1tQ1P4XLf4TbH9+KBB7wGoAaUw==
version "0.14.4"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7"
integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==
dependencies:
"@babel/runtime" "^7.8.4"
private "^0.1.8"
@ -7243,9 +7248,9 @@ scheduler@0.15.0:
object-assign "^4.1.1"
scheduler@^0.19.0:
version "0.19.0"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.0.tgz#a715d56302de403df742f4a9be11975b32f5698d"
integrity sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA==
version "0.19.1"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
@ -7395,9 +7400,9 @@ simple-swizzle@^0.2.2:
is-arrayish "^0.3.1"
sisteransi@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3"
integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==
version "1.0.5"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
slash@^2.0.0:
version "2.0.0"
@ -8502,18 +8507,18 @@ yargs-parser@^11.1.1:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^13.1.1:
version "13.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
yargs-parser@^13.1.2:
version "13.1.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^18.1.0:
version "18.1.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.0.tgz#1b0ab1118ebd41f68bb30e729f4c83df36ae84c3"
integrity sha512-o/Jr6JBOv6Yx3pL+5naWSoIA2jJ+ZkMYQG/ie9qFbukBe4uzmBatlXFOiu/tNKRWEtyf+n5w7jc/O16ufqOTdQ==
yargs-parser@^18.1.1:
version "18.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37"
integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
@ -8544,9 +8549,9 @@ yargs@^12.0.5:
yargs-parser "^11.1.1"
yargs@^13.2.2:
version "13.3.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"
integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==
version "13.3.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
dependencies:
cliui "^5.0.0"
find-up "^3.0.0"
@ -8557,12 +8562,12 @@ yargs@^13.2.2:
string-width "^3.0.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^13.1.1"
yargs-parser "^13.1.2"
yargs@^15.0.0:
version "15.3.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.0.tgz#403af6edc75b3ae04bf66c94202228ba119f0976"
integrity sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==
version "15.3.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b"
integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==
dependencies:
cliui "^6.0.0"
decamelize "^1.2.0"
@ -8574,7 +8579,7 @@ yargs@^15.0.0:
string-width "^4.2.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^18.1.0"
yargs-parser "^18.1.1"
yargs@^9.0.0:
version "9.0.1"