From 893f159e47fca115eee5d17c0941ff8d4944d6d4 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 6 Mar 2022 07:13:19 +0100 Subject: [PATCH 01/47] Add async exec call --- cpp/react-native-quick-sqlite.cpp | 187 ++++++++++++++++++------------ example/ios/Podfile | 2 +- example/ios/Podfile.lock | 10 +- example/package.json | 3 +- example/src/App.tsx | 16 ++- example/src/Database.ts | 90 ++++++++------ example/yarn.lock | 3 + src/index.ts | 9 +- 8 files changed, 195 insertions(+), 125 deletions(-) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 2fad9b2..3558bb8 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -33,13 +33,21 @@ const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) string docPathStr; -jsi::Object createError(jsi::Runtime &rt, string message) { +jsi::Object createError(jsi::Runtime &rt, string message) +{ auto res = jsi::Object(rt); res.setProperty(rt, "status", jsi::Value(1)); res.setProperty(rt, "message", jsi::String::createFromUtf8(rt, message)); return res; } +jsi::Object createOk(jsi::Runtime &rt) +{ + auto res = jsi::Object(rt); + res.setProperty(rt, "status", jsi::Value(0)); + return res; +} + void installSequel(jsi::Runtime &rt, const char *docPath) { @@ -53,7 +61,8 @@ void installSequel(jsi::Runtime &rt, const char *docPath) 1, [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { - if(count == 0) { + if (count == 0) + { return createError(rt, "[react-native-quick-sqlite][open] database name is required"); } @@ -64,15 +73,16 @@ void installSequel(jsi::Runtime &rt, const char *docPath) string dbName = args[0].asString(rt).utf8(rt); string tempDocPath = string(docPathStr); - if(count > 1) { - if(!args[1].isString()) { + if (count > 1) + { + if (!args[1].isString()) + { return createError(rt, "[react-native-quick-sqlite][open] database location must be a string"); } tempDocPath = tempDocPath + "/" + args[1].asString(rt).utf8(rt); } - SequelResult result = sequel_open(dbName, tempDocPath); if (result.type == SequelResultError) @@ -80,7 +90,7 @@ void installSequel(jsi::Runtime &rt, const char *docPath) return createError(rt, result.message.c_str()); } - return move(result.value); + return createOk(rt); }); // auto attach = jsi::Function::createFromHostFunction( @@ -113,7 +123,8 @@ void installSequel(jsi::Runtime &rt, const char *docPath) 1, [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { - if(count == 0) { + if (count == 0) + { return createError(rt, "[react-native-quick-sqlite][close] database name is required"); } @@ -122,7 +133,6 @@ void installSequel(jsi::Runtime &rt, const char *docPath) return createError(rt, "[react-native-quick-sqlite][close] database name must be a string"); } - string dbName = args[0].asString(rt).utf8(rt); SequelResult result = sequel_close(dbName); @@ -142,7 +152,8 @@ void installSequel(jsi::Runtime &rt, const char *docPath) 1, [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { - if(count == 0) { + if (count == 0) + { return createError(rt, "[react-native-quick-sqlite][open] database name is required"); } @@ -151,7 +162,6 @@ void installSequel(jsi::Runtime &rt, const char *docPath) return createError(rt, "[react-native-quick-sqlite][open] database name must be a string"); } - string dbName = args[0].asString(rt).utf8(rt); SequelResult result = sequel_remove(dbName, docPathStr); @@ -192,36 +202,38 @@ void installSequel(jsi::Runtime &rt, const char *docPath) 2, [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { - if(sizeof(args) < 2) { + if (sizeof(args) < 2) + { return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - Incorrect parameter count"); } - + const string dbName = args[0].asString(rt).utf8(rt); const jsi::Value ¶ms = args[1]; - if(params.isNull() || params.isUndefined()) + if (params.isNull() || params.isUndefined()) { return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - An array of SQL commands or parameters is needed"); } - + int rowsAffected = 0; const jsi::Array &batchParams = params.asObject(rt).asArray(rt); try { sequel_execute(rt, dbName, "BEGIN TRANSACTION", jsi::Value::undefined()); - for(int i = 0; i 1 ? command.getValueAtIndex(rt, 1) : jsi::Value::undefined(); - if(!commandParams.isUndefined() && commandParams.asObject(rt).isArray(rt) && commandParams.asObject(rt).asArray(rt).length(rt) > 0 && commandParams.asObject(rt).asArray(rt).getValueAtIndex(rt, 0).isObject()) + if (!commandParams.isUndefined() && commandParams.asObject(rt).isArray(rt) && commandParams.asObject(rt).asArray(rt).length(rt) > 0 && commandParams.asObject(rt).asArray(rt).getValueAtIndex(rt, 0).isObject()) { // This arguments are an array of arrays, like a batch update of a single sql command. const jsi::Array &batchUpdateParams = commandParams.asObject(rt).asArray(rt); - for(int x = 0; x jsi::Value { - // const string dbName = args[0].asString(rt).utf8(rt); - // const string query = args[1].asString(rt).utf8(rt); - // const jsi::Value ¶ms = args[2]; - - // jsi::Value promise = rt.global().getPropertyAsFunction(rt, "Promise").callAsConstructor(rt, jsi::Function::createFromHostFunction(rt, jsi::PropNameID::forAscii(rt, "executor"), 2, [dbName, query, ¶ms](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t) -> jsi::Value { - // // Spawn c++ thread - // thread t1([&rt, &dbName, &query, ¶ms, resolve{make_shared(rt, args[0])}] { - // SequelResult result = sequel_execute(rt, dbName, query, params); - - // if (result.type == SequelResultError) - // { - // jsi::detail::throwJSError(rt, result.message.c_str()); - // } - // else - // { - // resolve->asObject(rt).asFunction(rt).call(rt, move(result.value)); - // } - // }); - - // t1.detach(); - - // return {}; - // })); - - // return promise; - // }); + auto asyncExecSQL = jsi::Function::createFromHostFunction( + rt, + jsi::PropNameID::forAscii(rt, "sequel_asyncExecSQL"), + 3, + [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value + { + const string dbName = args[0].asString(rt).utf8(rt); + const string query = args[1].asString(rt).utf8(rt); + const jsi::Value ¶ms = args[2]; + + std::make_shared resolver; + + auto promiseBody = jsi::Function::createFromHostFunction( + rt, + jsi::PropNameID::forAscii(rt, "executor"), + 2, + [&resolver]( + jsi::Runtime &rt, + const jsi::Value &thisValue, + const jsi::Value *args, + size_t) -> jsi::Value + { + resolverValue = std::make_shared(arguments[0].asObject(rt)); + return {}; + }); + + auto promiseConstructor = rt.global() + .getPropertyAsFunction(rt, "Promise"); + + auto promise = promiseConstructor.callAsConstructor(rt, promiseBody); + + // Spawn c++ thread + thread t1( + [&rt, &dbName, &query, ¶ms, resolve{make_shared(rt, args[0])}] + { + SequelResult result = sequel_execute(rt, dbName, query, params); + + if (result.type == SequelResultError) + { + resolve->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); + } + else + { + resolve->asObject(rt).asFunction(rt).call(rt, move(result.value)); + } }); + + t1.detach(); + + return promise; + }); // Global object jsi::Object module = jsi::Object(rt); - // Callable properties module.setProperty(rt, "open", move(open)); module.setProperty(rt, "close", move(close)); @@ -362,7 +407,7 @@ void installSequel(jsi::Runtime &rt, const char *docPath) module.setProperty(rt, "executeSql", move(execSQL)); module.setProperty(rt, "executeSqlBatch", move(execSQLBatch)); module.setProperty(rt, "loadSqlFile", move(loadSQLFile)); - // module.setProperty(rt, "backgroundExecuteSql", move(asyncExecSQL)); + module.setProperty(rt, "asyncExecuteSql", move(asyncExecSQL)); rt.global().setProperty(rt, "sqlite", move(module)); } diff --git a/example/ios/Podfile b/example/ios/Podfile index 6fffaee..e0d13d2 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -8,5 +8,5 @@ target 'SequelExample' do use_react_native!(:path => config["reactNativePath"]) - pod 'react-native-quick-sqlite', :path => '../..' + # pod 'react-native-quick-sqlite', :path => '../..' end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 4e96146..10735fc 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -185,7 +185,7 @@ PODS: - React-cxxreact (= 0.63.4) - React-jsi (= 0.63.4) - React-jsinspector (0.63.4) - - react-native-quick-sqlite (2.0.3): + - react-native-quick-sqlite (3.0.0): - React-Core - React-RCTActionSheet (0.63.4): - React-Core/RCTActionSheetHeaders (= 0.63.4) @@ -267,7 +267,7 @@ DEPENDENCIES: - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) - - react-native-quick-sqlite (from `../..`) + - react-native-quick-sqlite (from `../node_modules/react-native-quick-sqlite`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) @@ -316,7 +316,7 @@ EXTERNAL SOURCES: React-jsinspector: :path: "../node_modules/react-native/ReactCommon/jsinspector" react-native-quick-sqlite: - :path: "../.." + :path: "../node_modules/react-native-quick-sqlite" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: @@ -357,7 +357,7 @@ SPEC CHECKSUMS: React-jsi: a0418934cf48f25b485631deb27c64dc40fb4c31 React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949 React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a - react-native-quick-sqlite: 132b2712269190bd42c73d044b4ce941e95b6a0a + react-native-quick-sqlite: 6ab34ef780fc0ded69569738d491be940d749a90 React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0 @@ -370,6 +370,6 @@ SPEC CHECKSUMS: ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6 -PODFILE CHECKSUM: 468acaff90c15fab0a38d24ffe8509d22154ad61 +PODFILE CHECKSUM: 567c58ea0ac68a610763c2a30e3030fb7778d058 COCOAPODS: 1.11.2 diff --git a/example/package.json b/example/package.json index add4cc1..7dbc7d8 100644 --- a/example/package.json +++ b/example/package.json @@ -13,7 +13,8 @@ "buffer": "^6.0.3", "react": "16.13.1", "react-native": "0.63.4", - "typeorm": "^0.2.36" + "typeorm": "^0.2.36", + "react-native-quick-sqlite": ".." }, "devDependencies": { "@babel/core": "^7.12.10", diff --git a/example/src/App.tsx b/example/src/App.tsx index 589dff7..4624070 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -13,17 +13,15 @@ import type { User } from './model/User'; import { Buffer } from 'buffer'; export default function App() { - let [users, setUsers] = React.useState([]); + // let [users, setUsers] = React.useState([]); React.useEffect(() => { - createDb().then((users) => { - setUsers(users); - }); + createDb(); }, []); return ( - ) => { return ( @@ -48,16 +46,16 @@ export default function App() { {info.item.name} Age {info.item.age} - {info.item.metadata.nickname} - {/* + {info.item.metadata.nickname} */} + {/* Favorite Book {info.item.favoriteBook.title} */} - + {/* ); }} keyExtractor={(item: any) => item.id} - /> + /> */} ); } diff --git a/example/src/Database.ts b/example/src/Database.ts index c3e2352..a02fc86 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -1,48 +1,64 @@ +import 'react-native-quick-sqlite'; import { createConnection, getRepository } from 'typeorm'; import { Book } from './model/Book'; import { User } from './model/User'; import { Buffer } from 'buffer'; export const createDb = async () => { - await createConnection({ - type: 'react-native', - // driver: require('react-native-quick-sqlite'), - database: 'test', - location: 'sample/database', - logging: ['error'], - synchronize: true, - entities: [User, Book], + const dbOpenResult = sqlite.open('test', 'sample/database'); + + // const syncQueryResult = sqlite.executeSql( + // 'test', + // 'SELECT * FROM "User";', + // [] + // ); + // console.warn('syncQueryResult', syncQueryResult); + + sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', []).then((res) => { + console.warn('async query result', res); }); - // const bookRepository = getRepository(Book); - const userRepository = getRepository(User); - - const user1 = new User(); - user1.name = 'John Seedman 🤯'; - user1.age = 30; - user1.networth = 30000.23; - user1.metadata = { - nickname: - '

We deliver that something because some interesting text!

\n

Always remember...

\n

some 🧟‍♀️ 🧚 🍉 text here.

\n', - }; - user1.avatar = Buffer.from( - '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', - 'base64' - ).buffer; - - // const book1 = new Book(); - // book1.title = 'Lord of the rings'; - // book1.user = user1; - - // user1.favoriteBook = book1; - - // await bookRepository.save(book1); - await userRepository.save(user1); - - const users = await userRepository.find(); - // const users = await userRepository.find({ - // relations: ['favoriteBook'], + console.warn('should log before async log'); + + // await createConnection({ + // type: 'react-native', + // // driver: require('react-native-quick-sqlite'), + // database: 'test', + // location: 'sample/database', + // logging: ['error'], + // synchronize: true, + // entities: [User, Book], // }); - return users; + // // const bookRepository = getRepository(Book); + // const userRepository = getRepository(User); + + // const user1 = new User(); + // user1.name = 'John Seedman 🤯'; + // user1.age = 30; + // user1.networth = 30000.23; + // user1.metadata = { + // nickname: + // '

We deliver that something because some interesting text!

\n

Always remember...

\n

some 🧟‍♀️ 🧚 🍉 text here.

\n', + // }; + // user1.avatar = Buffer.from( + // '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', + // 'base64' + // ).buffer; + + // // const book1 = new Book(); + // // book1.title = 'Lord of the rings'; + // // book1.user = user1; + + // // user1.favoriteBook = book1; + + // // await bookRepository.save(book1); + // await userRepository.save(user1); + + // const users = await userRepository.find(); + // // const users = await userRepository.find({ + // // relations: ['favoriteBook'], + // // }); + + // return users; }; diff --git a/example/yarn.lock b/example/yarn.lock index 925c011..5b5b903 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -3746,6 +3746,9 @@ react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-native-quick-sqlite@..: + version "3.0.0" + react-native@0.63.4: version "0.63.4" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.4.tgz#2210fdd404c94a5fa6b423c6de86f8e48810ec36" diff --git a/src/index.ts b/src/index.ts index 7514d8e..f235acb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -70,6 +70,11 @@ interface ISQLite { query: string, params: any[] | undefined ) => QueryResult; + asyncExecuteSql: ( + dbName: string, + query: string, + params: any[] | undefined + ) => Promise; executeSqlBatch: ( dbName: string, commands: SQLBatchParams[] @@ -78,7 +83,9 @@ interface ISQLite { // backgroundExecuteSql: (dbName: string, query: string, params: any[]) => any; } -declare var sqlite: ISQLite; +declare global { + const sqlite: ISQLite; +} // API FOR TYPEORM interface IConnectionOptions { From 45cc3b1a474ae72209cf58aec9f2bad75dbc1ca6 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 6 Mar 2022 09:12:42 +0100 Subject: [PATCH 02/47] Fix async call pointers --- cpp/react-native-quick-sqlite.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 3558bb8..143f726 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -353,9 +353,9 @@ void installSequel(jsi::Runtime &rt, const char *docPath) { const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); - const jsi::Value ¶ms = args[2]; + std::shared_ptr params = std::make_shared(args[2].asObject(rt)); - std::make_shared resolver; + std::shared_ptr resolver; auto promiseBody = jsi::Function::createFromHostFunction( rt, @@ -367,7 +367,7 @@ void installSequel(jsi::Runtime &rt, const char *docPath) const jsi::Value *args, size_t) -> jsi::Value { - resolverValue = std::make_shared(arguments[0].asObject(rt)); + resolver = std::make_shared(args[0].asObject(rt)); return {}; }); @@ -378,17 +378,17 @@ void installSequel(jsi::Runtime &rt, const char *docPath) // Spawn c++ thread thread t1( - [&rt, &dbName, &query, ¶ms, resolve{make_shared(rt, args[0])}] + [&rt, dbName, query, params, resolver] { - SequelResult result = sequel_execute(rt, dbName, query, params); + SequelResult result = sequel_execute(rt, dbName, query, *params); if (result.type == SequelResultError) { - resolve->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); + resolver->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); } else { - resolve->asObject(rt).asFunction(rt).call(rt, move(result.value)); + resolver->asObject(rt).asFunction(rt).call(rt, move(result.value)); } }); t1.detach(); From 05b3ecaeaffde01fc0038f98f13c9cd739b2a2db Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 6 Mar 2022 09:50:37 +0100 Subject: [PATCH 03/47] Android affordances --- README.md | 1 + android/CMakeLists.txt | 49 +++++++++++++++---------------- cpp/react-native-quick-sqlite.cpp | 15 +++++----- example/ios/Podfile | 2 +- example/ios/Podfile.lock | 6 ++-- example/package.json | 4 +-- example/src/App.tsx | 6 ++-- example/src/Database.ts | 32 ++++++++++---------- example/yarn.lock | 3 -- package.json | 4 +-- 10 files changed, 59 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index d0989db..af1ff67 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Inspired/compatible with [react-native-sqlite-storage](https://github.com/andpor - From version 2.0.0 onwards errors are no longer thrown on invalid SQL statements. The response contains a `status` number, `0` signals correct execution, `1` signals an error. - From version 3.0.0 onwards no JS errors are thown, every operation returns an object with a `status` field. - If you want to run the example project on android, you will have to change the paths on the android/CMakeLists.txt file, they are already there, just uncomment them. +- If you are running the latest versions of android studio, the SDKs and NDKs you might face strange errors, you need to have CMake 3.6.0 installed and NDK versions 22 and below (you can install them from android studio SDK manager, just make sure to tick `show package details`) ## Use TypeORM diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 0f2edbb..c2a91cf 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -4,37 +4,17 @@ set (CMAKE_VERBOSE_MAKEFILE ON) set (CMAKE_CXX_STANDARD 11) # Uncomment the following lines to compile the example project -# include_directories( -# ../cpp -# ../node_modules/react-native/React -# ../node_modules/react-native/React/Base -# ../node_modules/react-native/ReactCommon/jsi -# ) - -# add_library(sequel -# SHARED - -# ../node_modules/react-native/ReactCommon/jsi/jsi/jsi.cpp -# ../cpp/sequel.cpp -# ../cpp/sequel.h -# ../cpp/SequelResult.h -# ../cpp/react-native-quick-sqlite.cpp -# ../cpp/react-native-quick-sqlite.h -# ../cpp/sqlite3.h -# ../cpp/sqlite3.c -# cpp-adapter.cpp -# ) - include_directories( ../cpp - ../../react-native/React - ../../react-native/React/Base - ../../react-native/ReactCommon/jsi + ../node_modules/react-native/React + ../node_modules/react-native/React/Base + ../node_modules/react-native/ReactCommon/jsi ) add_library(sequel SHARED - ../../react-native/ReactCommon/jsi/jsi/jsi.cpp + + ../node_modules/react-native/ReactCommon/jsi/jsi/jsi.cpp ../cpp/sequel.cpp ../cpp/sequel.h ../cpp/SequelResult.h @@ -45,5 +25,24 @@ add_library(sequel cpp-adapter.cpp ) +# include_directories( +# ../cpp +# ../../react-native/React +# ../../react-native/React/Base +# ../../react-native/ReactCommon/jsi +# ) + +# add_library(sequel +# SHARED +# ../../react-native/ReactCommon/jsi/jsi/jsi.cpp +# ../cpp/sequel.cpp +# ../cpp/sequel.h +# ../cpp/SequelResult.h +# ../cpp/react-native-quick-sqlite.cpp +# ../cpp/react-native-quick-sqlite.h +# ../cpp/sqlite3.h +# ../cpp/sqlite3.c +# cpp-adapter.cpp +# ) target_link_libraries(sequel android log) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 143f726..ec1e68c 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -355,7 +355,7 @@ void installSequel(jsi::Runtime &rt, const char *docPath) const string query = args[1].asString(rt).utf8(rt); std::shared_ptr params = std::make_shared(args[2].asObject(rt)); - std::shared_ptr resolver; + std::shared_ptr resolver; auto promiseBody = jsi::Function::createFromHostFunction( rt, @@ -367,14 +367,13 @@ void installSequel(jsi::Runtime &rt, const char *docPath) const jsi::Value *args, size_t) -> jsi::Value { - resolver = std::make_shared(args[0].asObject(rt)); + resolver = std::make_shared(args[0].asObject(rt)); return {}; }); - auto promiseConstructor = rt.global() - .getPropertyAsFunction(rt, "Promise"); - - auto promise = promiseConstructor.callAsConstructor(rt, promiseBody); + auto promise = rt.global() + .getPropertyAsFunction(rt, "Promise") + .callAsConstructor(rt, promiseBody); // Spawn c++ thread thread t1( @@ -384,11 +383,11 @@ void installSequel(jsi::Runtime &rt, const char *docPath) if (result.type == SequelResultError) { - resolver->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); + resolver->asFunction(rt).call(rt, createError(rt, result.message.c_str())); } else { - resolver->asObject(rt).asFunction(rt).call(rt, move(result.value)); + resolver->asFunction(rt).call(rt, move(result.value)); } }); t1.detach(); diff --git a/example/ios/Podfile b/example/ios/Podfile index e0d13d2..6fffaee 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -8,5 +8,5 @@ target 'SequelExample' do use_react_native!(:path => config["reactNativePath"]) - # pod 'react-native-quick-sqlite', :path => '../..' + pod 'react-native-quick-sqlite', :path => '../..' end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 10735fc..ed97ee6 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -267,7 +267,7 @@ DEPENDENCIES: - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) - - react-native-quick-sqlite (from `../node_modules/react-native-quick-sqlite`) + - react-native-quick-sqlite (from `../..`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) @@ -316,7 +316,7 @@ EXTERNAL SOURCES: React-jsinspector: :path: "../node_modules/react-native/ReactCommon/jsinspector" react-native-quick-sqlite: - :path: "../node_modules/react-native-quick-sqlite" + :path: "../.." React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: @@ -370,6 +370,6 @@ SPEC CHECKSUMS: ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6 -PODFILE CHECKSUM: 567c58ea0ac68a610763c2a30e3030fb7778d058 +PODFILE CHECKSUM: 468acaff90c15fab0a38d24ffe8509d22154ad61 COCOAPODS: 1.11.2 diff --git a/example/package.json b/example/package.json index 7dbc7d8..e43b9b8 100644 --- a/example/package.json +++ b/example/package.json @@ -5,6 +5,7 @@ "private": true, "scripts": { "android": "react-native run-android", + "android:logcat": "$ANDROID_HOME/platform-tools/adb logcat", "ios": "react-native run-ios", "start": "react-native start", "postinstall": "patch-package" @@ -13,8 +14,7 @@ "buffer": "^6.0.3", "react": "16.13.1", "react-native": "0.63.4", - "typeorm": "^0.2.36", - "react-native-quick-sqlite": ".." + "typeorm": "^0.2.36" }, "devDependencies": { "@babel/core": "^7.12.10", diff --git a/example/src/App.tsx b/example/src/App.tsx index 4624070..eb7cc86 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,4 +1,4 @@ -import 'reflect-metadata'; +// import 'reflect-metadata'; import * as React from 'react'; import { StyleSheet, @@ -9,8 +9,7 @@ import { ListRenderItemInfo, } from 'react-native'; import { createDb } from './Database'; -import type { User } from './model/User'; -import { Buffer } from 'buffer'; +// import type { User } from './model/User'; export default function App() { // let [users, setUsers] = React.useState([]); @@ -21,6 +20,7 @@ export default function App() { return ( + App Started {/* ) => { diff --git a/example/src/Database.ts b/example/src/Database.ts index a02fc86..2d795b2 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -1,24 +1,24 @@ -import 'react-native-quick-sqlite'; -import { createConnection, getRepository } from 'typeorm'; -import { Book } from './model/Book'; -import { User } from './model/User'; -import { Buffer } from 'buffer'; +import '../..'; +// import { createConnection, getRepository } from 'typeorm'; +// import { Book } from './model/Book'; +// import { User } from './model/User'; +// import { Buffer } from 'buffer'; export const createDb = async () => { - const dbOpenResult = sqlite.open('test', 'sample/database'); + sqlite.open('test', 'sample/database'); - // const syncQueryResult = sqlite.executeSql( - // 'test', - // 'SELECT * FROM "User";', - // [] - // ); - // console.warn('syncQueryResult', syncQueryResult); + // sqlite.executeSql('test', 'CREATE TABLE "User" ( name TEXT NOT NULL );', []); + // sqlite.executeSql('test', 'INSERT INTO "User" (name) VALUES(\'OSCAR\')', []); + const res = sqlite.executeSql('test', 'SELECT * FROM "User";', []); + console.warn(res); - sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', []).then((res) => { - console.warn('async query result', res); - }); + const asyncRes = await sqlite.asyncExecuteSql( + 'test', + 'SELECT * FROM "User";', + [] + ); - console.warn('should log before async log'); + console.warn('asyncRes', asyncRes); // await createConnection({ // type: 'react-native', diff --git a/example/yarn.lock b/example/yarn.lock index 5b5b903..925c011 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -3746,9 +3746,6 @@ react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-native-quick-sqlite@..: - version "3.0.0" - react-native@0.63.4: version "0.63.4" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.4.tgz#2210fdd404c94a5fa6b423c6de86f8e48810ec36" diff --git a/package.json b/package.json index b65b63b..bcceeb8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "react-native-quick-sqlite", - "version": "3.0.0", - "description": "Fast sqlite implementation for react-native", + "version": "3.0.1", + "description": "Fast SQLite for react-native", "main": "lib/commonjs/index", "module": "lib/module/index", "types": "lib/typescript/index.d.ts", From d4451f539c23e01351a98af39816d0cf2bf28cf2 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 6 Mar 2022 10:03:51 +0100 Subject: [PATCH 04/47] Try to std::move promise object --- cpp/react-native-quick-sqlite.cpp | 2 +- example/ios/Podfile.lock | 4 ++-- example/src/Database.ts | 10 +++------- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index ec1e68c..1544ac7 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -392,7 +392,7 @@ void installSequel(jsi::Runtime &rt, const char *docPath) t1.detach(); - return promise; + return move(promise); }); // Global object diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index ed97ee6..743e53b 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -185,7 +185,7 @@ PODS: - React-cxxreact (= 0.63.4) - React-jsi (= 0.63.4) - React-jsinspector (0.63.4) - - react-native-quick-sqlite (3.0.0): + - react-native-quick-sqlite (3.0.1): - React-Core - React-RCTActionSheet (0.63.4): - React-Core/RCTActionSheetHeaders (= 0.63.4) @@ -357,7 +357,7 @@ SPEC CHECKSUMS: React-jsi: a0418934cf48f25b485631deb27c64dc40fb4c31 React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949 React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a - react-native-quick-sqlite: 6ab34ef780fc0ded69569738d491be940d749a90 + react-native-quick-sqlite: bb52b8b21954434cd36c345e191bdb0548d69676 React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0 diff --git a/example/src/Database.ts b/example/src/Database.ts index 2d795b2..d536c30 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -12,13 +12,9 @@ export const createDb = async () => { const res = sqlite.executeSql('test', 'SELECT * FROM "User";', []); console.warn(res); - const asyncRes = await sqlite.asyncExecuteSql( - 'test', - 'SELECT * FROM "User";', - [] - ); - - console.warn('asyncRes', asyncRes); + sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', []).then((res) => { + console.warn('asyncRes', res); + }); // await createConnection({ // type: 'react-native', From 27ab7e23ce43c221376829f50667d29ebb98da54 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 6 Mar 2022 11:56:07 +0100 Subject: [PATCH 05/47] Update RN in sample app and completely redo android --- .bundle/config | 2 + .gitignore | 3 +- Gemfile | 4 + android/CMakeLists.txt | 33 +- android/build.gradle | 43 +- android/gradle.properties | 8 +- .../com/reactnativesequel/SequelModule.java | 46 +- .../com/reactnativesequel/SequelPackage.java | 2 +- example/android/app/build.gradle | 16 +- .../android/app/src/debug/AndroidManifest.xml | 7 +- .../android/app/src/main/AndroidManifest.xml | 1 - .../reactnativesequel/MainApplication.java | 3 - .../res/drawable/rn_edit_text_material.xml | 29 + .../app/src/main/res/values/styles.xml | 5 +- example/android/build.gradle | 23 +- example/android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- example/ios/Podfile | 9 +- example/ios/Podfile.lock | 499 +- .../SequelExample.xcodeproj/project.pbxproj | 6 +- example/package.json | 18 +- example/src/Database.ts | 14 +- example/yarn.lock | 4512 +++++++++++++---- package.json | 32 +- src/index.ts | 8 + yarn.lock | 2473 ++++----- 26 files changed, 5249 insertions(+), 2551 deletions(-) create mode 100644 .bundle/config create mode 100644 Gemfile create mode 100644 example/android/app/src/main/res/drawable/rn_edit_text_material.xml diff --git a/.bundle/config b/.bundle/config new file mode 100644 index 0000000..d137d24 --- /dev/null +++ b/.bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6ee6576..84328ae 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,8 @@ project.xcworkspace .idea .gradle local.properties -android.iml +*.iml +*.hprof # Cocoapods # diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..bbba14a --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby '2.7.4' +gem 'cocoapods', '~> 1.11', '>= 1.11.2' \ No newline at end of file diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index c2a91cf..854e6d5 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -1,20 +1,19 @@ -cmake_minimum_required(VERSION 3.4.1) +cmake_minimum_required(VERSION 3.9.0) +set (PACKAGE_NAME "react-native-quick-sqlite") set (CMAKE_VERBOSE_MAKEFILE ON) set (CMAKE_CXX_STANDARD 11) -# Uncomment the following lines to compile the example project include_directories( ../cpp - ../node_modules/react-native/React - ../node_modules/react-native/React/Base - ../node_modules/react-native/ReactCommon/jsi + "${NODE_MODULES_DIR}/react-native/React" + "${NODE_MODULES_DIR}/react-native/React/Base" + "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi" ) add_library(sequel SHARED - - ../node_modules/react-native/ReactCommon/jsi/jsi/jsi.cpp + "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi/jsi/jsi.cpp" ../cpp/sequel.cpp ../cpp/sequel.h ../cpp/SequelResult.h @@ -25,24 +24,4 @@ add_library(sequel cpp-adapter.cpp ) -# include_directories( -# ../cpp -# ../../react-native/React -# ../../react-native/React/Base -# ../../react-native/ReactCommon/jsi -# ) - -# add_library(sequel -# SHARED -# ../../react-native/ReactCommon/jsi/jsi/jsi.cpp -# ../cpp/sequel.cpp -# ../cpp/sequel.h -# ../cpp/SequelResult.h -# ../cpp/react-native-quick-sqlite.cpp -# ../cpp/react-native-quick-sqlite.h -# ../cpp/sqlite3.h -# ../cpp/sqlite3.c -# cpp-adapter.cpp -# ) - target_link_libraries(sequel android log) diff --git a/android/build.gradle b/android/build.gradle index 1097713..4e0a731 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,21 +1,19 @@ -buildscript { - // Buildscript is evaluated before everything else so we can't use getExtOrDefault - def kotlin_version = rootProject.ext.has('kotlinVersion') ? rootProject.ext.get('kotlinVersion') : project.properties['Sequel_kotlinVersion'] +import java.nio.file.Paths + +buildscript { repositories { google() jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - // noinspection DifferentKotlinGradleVersion - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.android.tools.build:gradle:4.2.2' } } apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' def getExtOrDefault(name) { return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['Sequel_' + name] @@ -25,11 +23,30 @@ def getExtOrIntegerDefault(name) { return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties['Sequel_' + name]).toInteger() } +static def findNodeModules(baseDir) { + def basePath = baseDir.toPath().normalize() + // Node's module resolution algorithm searches up to the root directory, + // after which the base path will be null + while (basePath) { + def nodeModulesPath = Paths.get(basePath.toString(), "node_modules") + def reactNativePath = Paths.get(nodeModulesPath.toString(), "react-native") + if (nodeModulesPath.toFile().exists() && reactNativePath.toFile().exists()) { + return nodeModulesPath.toString() + } + basePath = basePath.getParent() + } + throw new GradleException("react-native-quick-base64: Failed to find node_modules/ path!") +} + +def nodeModules = findNodeModules(projectDir); +logger.warn("react-native-quick-sqlite: node_modules/ found at: ${nodeModules}"); + android { compileSdkVersion getExtOrIntegerDefault('compileSdkVersion') buildToolsVersion getExtOrDefault('buildToolsVersion') + defaultConfig { - minSdkVersion 16 + minSdkVersion 21 targetSdkVersion getExtOrIntegerDefault('targetSdkVersion') versionCode 1 versionName "1.0" @@ -37,8 +54,8 @@ android { externalNativeBuild { cmake { cppFlags "-O2 -frtti -fexceptions -Wall -Wno-unused-variable -fstack-protector-all" - arguments "-DDEV_CMAKE=true" abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' + arguments "-DNODE_MODULES_DIR=${nodeModules}" } } @@ -66,7 +83,6 @@ android { repositories { mavenCentral() - jcenter() google() def found = false @@ -76,10 +92,7 @@ repositories { if (rootProject.ext.has('reactNativeAndroidRoot')) { defaultDir = rootProject.ext.get('reactNativeAndroidRoot') } else { - defaultDir = new File( - projectDir, - '/../../../node_modules/react-native/android' - ) + defaultDir = file("$nodeModules/react-native/android") } if (defaultDir.exists()) { @@ -135,10 +148,8 @@ repositories { } } -def kotlin_version = getExtOrDefault('kotlinVersion') dependencies { // noinspection GradleDynamicVersion api 'com.facebook.react:react-native:+' - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } diff --git a/android/gradle.properties b/android/gradle.properties index 0619cef..3dd260a 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,4 @@ -Sequel_kotlinVersion=1.3.50 -Sequel_compileSdkVersion=29 -Sequel_buildToolsVersion=29.0.2 -Sequel_targetSdkVersion=29 \ No newline at end of file +Sequel_kotlinVersion=1.6.0 +Sequel_compileSdkVersion=30 +Sequel_buildToolsVersion=30 +Sequel_targetSdkVersion=30 \ No newline at end of file diff --git a/android/src/main/java/com/reactnativesequel/SequelModule.java b/android/src/main/java/com/reactnativesequel/SequelModule.java index aeb7bcf..f3b4a23 100644 --- a/android/src/main/java/com/reactnativesequel/SequelModule.java +++ b/android/src/main/java/com/reactnativesequel/SequelModule.java @@ -1,45 +1,39 @@ package com.reactnativequicksqlite; import androidx.annotation.NonNull; +import android.util.Log; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; class SequelModule extends ReactContextBaseJavaModule { - static { - System.loadLibrary("sequel"); - } - + public static final String NAME = "QuickSQLite"; private static native void initialize(long jsiPtr, String docDir); - private static native void destruct(); - public SequelModule(ReactApplicationContext reactContext) { - super(reactContext); + public SequelModule(ReactApplicationContext context) { + super(context); } @NonNull @Override public String getName() { - return "Sequel"; + return NAME; } - - @NonNull - @Override - public void initialize() { - super.initialize(); - - // LEFT HERE: - // Convert the second arg into a std::string in the cpp-adapter file - // https://stackoverflow.com/questions/41820039/jstringjni-to-stdstringc-with-utf8-characters - SequelModule.initialize( - this.getReactApplicationContext().getJavaScriptContextHolder().get(), - this.getReactApplicationContext().getFilesDir().getAbsolutePath() - ); - } - - @Override - public void onCatalystInstanceDestroy() { - SequelModule.destruct(); + @ReactMethod(isBlockingSynchronousMethod = true) + public boolean install() { + try { + System.loadLibrary("sequel"); + + ReactApplicationContext context = getReactApplicationContext(); + initialize( + context.getJavaScriptContextHolder().get(), + context.getFilesDir().getAbsolutePath() + ); + return true; + } catch (Exception exception) { + return false; + } } } \ No newline at end of file diff --git a/android/src/main/java/com/reactnativesequel/SequelPackage.java b/android/src/main/java/com/reactnativesequel/SequelPackage.java index 49eeadb..ec16dd5 100644 --- a/android/src/main/java/com/reactnativesequel/SequelPackage.java +++ b/android/src/main/java/com/reactnativesequel/SequelPackage.java @@ -16,7 +16,7 @@ public class SequelPackage implements ReactPackage { @NonNull @Override public List createNativeModules(@NonNull ReactApplicationContext reactContext) { - return Arrays.asList(new SequelModule(reactContext)); + return Collections.singletonList(new SequelModule(reactContext)); } @NonNull diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 1b07a8d..71bdeff 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -120,12 +120,9 @@ def jscFlavor = 'org.webkit:android-jsc:+' def enableHermes = project.ext.react.get("enableHermes", false); android { - compileSdkVersion rootProject.ext.compileSdkVersion + ndkVersion rootProject.ext.ndkVersion - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } + compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { applicationId "com.example.reactnativequicksqlite" @@ -153,6 +150,11 @@ android { buildTypes { debug { signingConfig signingConfigs.debug + // if (nativeArchitectures) { + // ndk { + // abiFilters nativeArchitectures.split(',') + // } + // } } release { // Caution! In production, you need to generate your own keystore file. @@ -171,7 +173,7 @@ android { def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = - versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + defaultConfig.versionCode * 1000 + versionCodes.get(abi) } } @@ -200,7 +202,7 @@ dependencies { // Run this once to be able to run the application with BUCK // puts all compile dependencies into folder libs for BUCK to use task copyDownloadableDepsToLibs(type: Copy) { - from configurations.compile + from configurations.implementation into 'libs' } diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml index fa26aa5..1447142 100644 --- a/example/android/app/src/debug/AndroidManifest.xml +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -4,5 +4,10 @@ - + + + diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 1c8e1e0..4dde3fe 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -21,7 +21,6 @@ - diff --git a/example/android/app/src/main/java/com/example/reactnativesequel/MainApplication.java b/example/android/app/src/main/java/com/example/reactnativesequel/MainApplication.java index f7c7abf..4466844 100644 --- a/example/android/app/src/main/java/com/example/reactnativesequel/MainApplication.java +++ b/example/android/app/src/main/java/com/example/reactnativesequel/MainApplication.java @@ -25,8 +25,6 @@ public boolean getUseDeveloperSupport() { protected List getPackages() { @SuppressWarnings("UnnecessaryLocalVariable") List packages = new PackageList(this).getPackages(); - // Packages that cannot be autolinked yet can be added manually here, for SequelExample: - // packages.add(new MyReactNativePackage()); packages.add(new SequelPackage()); return packages; } @@ -46,6 +44,5 @@ public ReactNativeHost getReactNativeHost() { public void onCreate() { super.onCreate(); SoLoader.init(this, /* native exopackage */ false); - // initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); // Remove this line if you don't want Flipper enabled } } diff --git a/example/android/app/src/main/res/drawable/rn_edit_text_material.xml b/example/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 0000000..bb6f578 --- /dev/null +++ b/example/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,29 @@ + + + + + + + + + \ No newline at end of file diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml index 62fe59f..f360193 100644 --- a/example/android/app/src/main/res/values/styles.xml +++ b/example/android/app/src/main/res/values/styles.xml @@ -1,9 +1,8 @@ - - diff --git a/example/android/build.gradle b/example/android/build.gradle index b9065bd..d5c2a8c 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,18 +1,17 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - buildscript { ext { - buildToolsVersion = "29.0.2" - minSdkVersion = 16 - compileSdkVersion = 29 - targetSdkVersion = 29 + buildToolsVersion = "30.0.2" + minSdkVersion = 21 + compileSdkVersion = 30 + targetSdkVersion = 30 + ndkVersion = "21.4.7075529" } repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:3.5.3") + classpath("com.android.tools.build:gradle:4.2.2") // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -30,7 +29,13 @@ allprojects { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } - + mavenCentral { + // We don't want to fetch react-native from Maven Central as there are + // older versions over there. + content { + excludeGroup "com.facebook.react" + } + } google() jcenter() maven { url 'https://www.jitpack.io' } diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 027ef9d..5a90cba 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -9,7 +9,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m +# Default value: -Xmx1024m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 8422670..a0f7639 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/example/ios/Podfile b/example/ios/Podfile index 6fffaee..8b193e1 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,12 +1,17 @@ require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' -platform :ios, '10.0' +platform :ios, '11.0' target 'SequelExample' do config = use_native_modules! - use_react_native!(:path => config["reactNativePath"]) + use_react_native!(:path => config[:reactNativePath]) pod 'react-native-quick-sqlite', :path => '../..' + + post_install do |installer| + react_native_post_install(installer) + __apply_Xcode_12_5_M1_post_install_workaround(installer) + end end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 743e53b..d1ba3f8 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,260 +1,290 @@ PODS: - - boost-for-react-native (1.63.0) + - boost (1.76.0) - DoubleConversion (1.1.6) - - FBLazyVector (0.63.4) - - FBReactNativeSpec (0.63.4): - - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.4) - - RCTTypeSafety (= 0.63.4) - - React-Core (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - Folly (2020.01.13.00): - - boost-for-react-native + - FBLazyVector (0.67.3) + - FBReactNativeSpec (0.67.3): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.67.3) + - RCTTypeSafety (= 0.67.3) + - React-Core (= 0.67.3) + - React-jsi (= 0.67.3) + - ReactCommon/turbomodule/core (= 0.67.3) + - fmt (6.2.1) + - glog (0.3.5) + - RCT-Folly (2021.06.28.00-v2): + - boost - DoubleConversion - - Folly/Default (= 2020.01.13.00) + - fmt (~> 6.2.1) - glog - - Folly/Default (2020.01.13.00): - - boost-for-react-native + - RCT-Folly/Default (= 2021.06.28.00-v2) + - RCT-Folly/Default (2021.06.28.00-v2): + - boost - DoubleConversion + - fmt (~> 6.2.1) - glog - - glog (0.3.5) - - RCTRequired (0.63.4) - - RCTTypeSafety (0.63.4): - - FBLazyVector (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.4) - - React-Core (= 0.63.4) - - React (0.63.4): - - React-Core (= 0.63.4) - - React-Core/DevSupport (= 0.63.4) - - React-Core/RCTWebSocket (= 0.63.4) - - React-RCTActionSheet (= 0.63.4) - - React-RCTAnimation (= 0.63.4) - - React-RCTBlob (= 0.63.4) - - React-RCTImage (= 0.63.4) - - React-RCTLinking (= 0.63.4) - - React-RCTNetwork (= 0.63.4) - - React-RCTSettings (= 0.63.4) - - React-RCTText (= 0.63.4) - - React-RCTVibration (= 0.63.4) - - React-callinvoker (0.63.4) - - React-Core (0.63.4): - - Folly (= 2020.01.13.00) + - RCTRequired (0.67.3) + - RCTTypeSafety (0.67.3): + - FBLazyVector (= 0.67.3) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.67.3) + - React-Core (= 0.67.3) + - React (0.67.3): + - React-Core (= 0.67.3) + - React-Core/DevSupport (= 0.67.3) + - React-Core/RCTWebSocket (= 0.67.3) + - React-RCTActionSheet (= 0.67.3) + - React-RCTAnimation (= 0.67.3) + - React-RCTBlob (= 0.67.3) + - React-RCTImage (= 0.67.3) + - React-RCTLinking (= 0.67.3) + - React-RCTNetwork (= 0.67.3) + - React-RCTSettings (= 0.67.3) + - React-RCTText (= 0.67.3) + - React-RCTVibration (= 0.67.3) + - React-callinvoker (0.67.3) + - React-Core (0.67.3): - glog - - React-Core/Default (= 0.63.4) - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.67.3) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/CoreModulesHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/CoreModulesHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/Default (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/Default (0.67.3): - glog - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/DevSupport (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/DevSupport (0.67.3): - glog - - React-Core/Default (= 0.63.4) - - React-Core/RCTWebSocket (= 0.63.4) - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) - - React-jsinspector (= 0.63.4) + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.67.3) + - React-Core/RCTWebSocket (= 0.67.3) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-jsinspector (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTActionSheetHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTActionSheetHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTAnimationHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTAnimationHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTBlobHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTBlobHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTImageHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTImageHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTLinkingHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTLinkingHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTNetworkHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTNetworkHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTSettingsHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTSettingsHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTTextHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTTextHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTVibrationHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTVibrationHeaders (0.67.3): - glog + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-Core/RCTWebSocket (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTWebSocket (0.67.3): - glog - - React-Core/Default (= 0.63.4) - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.67.3) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga - - React-CoreModules (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/CoreModulesHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - React-RCTImage (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-cxxreact (0.63.4): - - boost-for-react-native (= 1.63.0) + - React-CoreModules (0.67.3): + - FBReactNativeSpec (= 0.67.3) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.67.3) + - React-Core/CoreModulesHeaders (= 0.67.3) + - React-jsi (= 0.67.3) + - React-RCTImage (= 0.67.3) + - ReactCommon/turbomodule/core (= 0.67.3) + - React-cxxreact (0.67.3): + - boost (= 1.76.0) - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-callinvoker (= 0.63.4) - - React-jsinspector (= 0.63.4) - - React-jsi (0.63.4): - - boost-for-react-native (= 1.63.0) + - RCT-Folly (= 2021.06.28.00-v2) + - React-callinvoker (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsinspector (= 0.67.3) + - React-logger (= 0.67.3) + - React-perflogger (= 0.67.3) + - React-runtimeexecutor (= 0.67.3) + - React-jsi (0.67.3): + - boost (= 1.76.0) - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-jsi/Default (= 0.63.4) - - React-jsi/Default (0.63.4): - - boost-for-react-native (= 1.63.0) + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsi/Default (= 0.67.3) + - React-jsi/Default (0.67.3): + - boost (= 1.76.0) - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-jsiexecutor (0.63.4): + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsiexecutor (0.67.3): - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsinspector (0.63.4) + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-perflogger (= 0.67.3) + - React-jsinspector (0.67.3) + - React-logger (0.67.3): + - glog - react-native-quick-sqlite (3.0.1): - React-Core - - React-RCTActionSheet (0.63.4): - - React-Core/RCTActionSheetHeaders (= 0.63.4) - - React-RCTAnimation (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/RCTAnimationHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTBlob (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - React-Core/RCTBlobHeaders (= 0.63.4) - - React-Core/RCTWebSocket (= 0.63.4) - - React-jsi (= 0.63.4) - - React-RCTNetwork (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTImage (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/RCTImageHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - React-RCTNetwork (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTLinking (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - React-Core/RCTLinkingHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTNetwork (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/RCTNetworkHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTSettings (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/RCTSettingsHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTText (0.63.4): - - React-Core/RCTTextHeaders (= 0.63.4) - - React-RCTVibration (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - React-Core/RCTVibrationHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - ReactCommon/turbomodule/core (0.63.4): + - React-perflogger (0.67.3) + - React-RCTActionSheet (0.67.3): + - React-Core/RCTActionSheetHeaders (= 0.67.3) + - React-RCTAnimation (0.67.3): + - FBReactNativeSpec (= 0.67.3) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.67.3) + - React-Core/RCTAnimationHeaders (= 0.67.3) + - React-jsi (= 0.67.3) + - ReactCommon/turbomodule/core (= 0.67.3) + - React-RCTBlob (0.67.3): + - FBReactNativeSpec (= 0.67.3) + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/RCTBlobHeaders (= 0.67.3) + - React-Core/RCTWebSocket (= 0.67.3) + - React-jsi (= 0.67.3) + - React-RCTNetwork (= 0.67.3) + - ReactCommon/turbomodule/core (= 0.67.3) + - React-RCTImage (0.67.3): + - FBReactNativeSpec (= 0.67.3) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.67.3) + - React-Core/RCTImageHeaders (= 0.67.3) + - React-jsi (= 0.67.3) + - React-RCTNetwork (= 0.67.3) + - ReactCommon/turbomodule/core (= 0.67.3) + - React-RCTLinking (0.67.3): + - FBReactNativeSpec (= 0.67.3) + - React-Core/RCTLinkingHeaders (= 0.67.3) + - React-jsi (= 0.67.3) + - ReactCommon/turbomodule/core (= 0.67.3) + - React-RCTNetwork (0.67.3): + - FBReactNativeSpec (= 0.67.3) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.67.3) + - React-Core/RCTNetworkHeaders (= 0.67.3) + - React-jsi (= 0.67.3) + - ReactCommon/turbomodule/core (= 0.67.3) + - React-RCTSettings (0.67.3): + - FBReactNativeSpec (= 0.67.3) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.67.3) + - React-Core/RCTSettingsHeaders (= 0.67.3) + - React-jsi (= 0.67.3) + - ReactCommon/turbomodule/core (= 0.67.3) + - React-RCTText (0.67.3): + - React-Core/RCTTextHeaders (= 0.67.3) + - React-RCTVibration (0.67.3): + - FBReactNativeSpec (= 0.67.3) + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/RCTVibrationHeaders (= 0.67.3) + - React-jsi (= 0.67.3) + - ReactCommon/turbomodule/core (= 0.67.3) + - React-runtimeexecutor (0.67.3): + - React-jsi (= 0.67.3) + - ReactCommon/turbomodule/core (0.67.3): - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-callinvoker (= 0.63.4) - - React-Core (= 0.63.4) - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) + - RCT-Folly (= 2021.06.28.00-v2) + - React-callinvoker (= 0.67.3) + - React-Core (= 0.67.3) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-logger (= 0.67.3) + - React-perflogger (= 0.67.3) - Yoga (1.14.0) DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`) - - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - React (from `../node_modules/react-native/`) @@ -267,7 +297,9 @@ DEPENDENCIES: - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - react-native-quick-sqlite (from `../..`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) @@ -277,24 +309,27 @@ DEPENDENCIES: - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: - - boost-for-react-native + - fmt EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" FBReactNativeSpec: - :path: "../node_modules/react-native/Libraries/FBReactNativeSpec" - Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec" + :path: "../node_modules/react-native/React/FBReactNativeSpec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: :path: "../node_modules/react-native/Libraries/RCTRequired" RCTTypeSafety: @@ -315,8 +350,12 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: :path: "../node_modules/react-native/ReactCommon/jsinspector" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" react-native-quick-sqlite: :path: "../.." + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: @@ -335,41 +374,47 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: :path: "../node_modules/react-native/Libraries/Vibration" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" ReactCommon: :path: "../node_modules/react-native/ReactCommon" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c - DoubleConversion: cde416483dac037923206447da6e1454df403714 - FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e - FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e - Folly: b73c3869541e86821df3c387eb0af5f65addfab4 - glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 - RCTRequired: 082f10cd3f905d6c124597fd1c14f6f2655ff65e - RCTTypeSafety: 8c9c544ecbf20337d069e4ae7fd9a377aadf504b - React: b0a957a2c44da4113b0c4c9853d8387f8e64e615 - React-callinvoker: c3f44dd3cb195b6aa46621fff95ded79d59043fe - React-Core: d3b2a1ac9a2c13c3bcde712d9281fc1c8a5b315b - React-CoreModules: 0581ff36cb797da0943d424f69e7098e43e9be60 - React-cxxreact: c1480d4fda5720086c90df537ee7d285d4c57ac3 - React-jsi: a0418934cf48f25b485631deb27c64dc40fb4c31 - React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949 - React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a + boost: a7c83b31436843459a1961bfd74b96033dc77234 + DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 + FBLazyVector: 808f741ddb0896a20e5b98cc665f5b3413b072e2 + FBReactNativeSpec: 94473205b8741b61402e8c51716dea34aa3f5b2f + fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 + glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85 + RCT-Folly: 803a9cfd78114b2ec0f140cfa6fa2a6bafb2d685 + RCTRequired: 3c77b683474faf23920fbefc71c4e13af21470c0 + RCTTypeSafety: 720b1841260dac692444c2822b27403178da8b28 + React: 25970dd74abbdac449ca66dec4107652cacc606d + React-callinvoker: 2d158700bc27b3d49c3c95721d288ed6c1a489ef + React-Core: 306cfdc1393bcf9481cc5de9807608db7661817b + React-CoreModules: 2576a88d630899f3fcdf2cb79fcc0454d7b2a8bb + React-cxxreact: a492f0de07d875419dcb9f463c63c22fe51c433b + React-jsi: bca092b0c38d5e3fd60bb491d4994ab4a8ac2ad3 + React-jsiexecutor: 15ea57ead631a11fad57634ff69f78e797113a39 + React-jsinspector: 1e1e03345cf6d47779e2061d679d0a87d9ae73d8 + React-logger: 1e10789cb84f99288479ba5f20822ce43ced6ffe react-native-quick-sqlite: bb52b8b21954434cd36c345e191bdb0548d69676 - React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 - React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b - React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0 - React-RCTImage: c1b1f2d3f43a4a528c8946d6092384b5c880d2f0 - React-RCTLinking: 35ae4ab9dc0410d1fcbdce4d7623194a27214fb2 - React-RCTNetwork: 29ec2696f8d8cfff7331fac83d3e893c95ef43ae - React-RCTSettings: 60f0691bba2074ef394f95d4c2265ec284e0a46a - React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c - React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d - ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b - Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6 + React-perflogger: 93d3f142d6d9a46e635f09ba0518027215a41098 + React-RCTActionSheet: 87327c3722203cc79cf79d02fb83e7332aeedd18 + React-RCTAnimation: 009c87c018d50e0b38692699405ebe631ff4872d + React-RCTBlob: 9e30308cc1b127af11c8f858514d2d8638ce36d7 + React-RCTImage: b9460cb8e3acc51410735a234a9dffbf4964f540 + React-RCTLinking: 73ecf0b87b515383a08ebbf07f558c48de1f0027 + React-RCTNetwork: 8f63119f2da99a94515ad0e0d0a13f9b3f6fe89d + React-RCTSettings: b827282b1ac2bd98515c0c09f5cbc5062ebd83b0 + React-RCTText: 6d09140f514e1f60aff255e0acdf16e3b486ba4c + React-RCTVibration: d0361f15ea978958fab7ffb6960f475b5063d83f + React-runtimeexecutor: af1946623656f9c5fd64ca6f36f3863516193446 + ReactCommon: 650e33cde4fb7d36781cd3143f5276da0abb2f96 + Yoga: 90dcd029e45d8a7c1ff059e8b3c6612ff409061a -PODFILE CHECKSUM: 468acaff90c15fab0a38d24ffe8509d22154ad61 +PODFILE CHECKSUM: bb7adee47fdc7ccdad0c428b6712b1c38afa514a COCOAPODS: 1.11.2 diff --git a/example/ios/SequelExample.xcodeproj/project.pbxproj b/example/ios/SequelExample.xcodeproj/project.pbxproj index 1f9aecc..6edec4e 100644 --- a/example/ios/SequelExample.xcodeproj/project.pbxproj +++ b/example/ios/SequelExample.xcodeproj/project.pbxproj @@ -339,6 +339,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -357,8 +358,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( + "$(SDKROOT)/usr/lib/swift", "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = YES; @@ -399,6 +400,7 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -410,8 +412,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( + "$(SDKROOT)/usr/lib/swift", "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; diff --git a/example/package.json b/example/package.json index e43b9b8..4b3ee4d 100644 --- a/example/package.json +++ b/example/package.json @@ -11,20 +11,22 @@ "postinstall": "patch-package" }, "dependencies": { + "babel-plugin-module-resolver": "^4.1.0", "buffer": "^6.0.3", - "react": "16.13.1", - "react-native": "0.63.4", + "react": "17.0.2", + "react-native": "0.67.3", "typeorm": "^0.2.36" }, "devDependencies": { - "@babel/core": "^7.12.10", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-decorators": "^7.13.5", + "@babel/core": "^7.12.9", "@babel/runtime": "^7.12.5", - "babel-plugin-module-resolver": "^4.0.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "metro-react-native-babel-preset": "^0.64.0", + "@react-native-community/eslint-config": "^2.0.0", + "babel-jest": "^26.6.3", + "eslint": "7.14.0", + "jest": "^26.6.3", + "metro-react-native-babel-preset": "^0.66.2", "patch-package": "^6.4.7", + "react-test-renderer": "17.0.2", "reflect-metadata": "^0.1.13" } } diff --git a/example/src/Database.ts b/example/src/Database.ts index d536c30..88a608b 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-undef */ import '../..'; // import { createConnection, getRepository } from 'typeorm'; // import { Book } from './model/Book'; @@ -5,16 +6,19 @@ import '../..'; // import { Buffer } from 'buffer'; export const createDb = async () => { + // console.warn('opening DB'); + sqlite.open('test', 'sample/database'); + // console.warn('DB Opened'); // sqlite.executeSql('test', 'CREATE TABLE "User" ( name TEXT NOT NULL );', []); // sqlite.executeSql('test', 'INSERT INTO "User" (name) VALUES(\'OSCAR\')', []); - const res = sqlite.executeSql('test', 'SELECT * FROM "User";', []); - console.warn(res); + // const res = sqlite.executeSql('test', 'SELECT * FROM "User";', []); + // console.warn(res); - sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', []).then((res) => { - console.warn('asyncRes', res); - }); + // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', []).then((res) => { + // console.warn('asyncRes', res); + // }); // await createConnection({ // type: 'react-native', diff --git a/example/yarn.lock b/example/yarn.lock index 925c011..3ace434 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" + integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.0" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" @@ -9,34 +16,45 @@ dependencies: "@babel/highlight" "^7.12.13" +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + "@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.8.tgz#5b783b9808f15cef71547f1b691f34f8ff6003a6" integrity sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog== -"@babel/core@^7.0.0", "@babel/core@^7.12.10": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.8.tgz#c191d9c5871788a591d69ea1dc03e5843a3680fb" - integrity sha512-oYapIySGw1zGhEFRd6lzWNLWFX2s5dA/jm+Pw/+59ZdXtjyIuwlXbrId22Md0rgZVop+aVoqow2riXhBLNyuQg== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.0" - "@babel/helper-compilation-targets" "^7.13.8" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helpers" "^7.13.0" - "@babel/parser" "^7.13.4" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" +"@babel/compat-data@^7.16.4": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" + integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== + +"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.14.0", "@babel/core@^7.7.5": + version "7.17.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" + integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.17.2" + "@babel/parser" "^7.17.3" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" semver "^6.3.0" - source-map "^0.5.0" -"@babel/generator@^7.13.0", "@babel/generator@^7.5.0": +"@babel/generator@^7.13.0": version "7.13.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== @@ -45,6 +63,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.14.0", "@babel/generator@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" + integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -52,6 +79,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" @@ -70,6 +104,16 @@ browserslist "^4.14.5" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.13.0": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.8.tgz#0367bd0a7505156ce018ca464f7ac91ba58c1a04" @@ -81,6 +125,19 @@ "@babel/helper-replace-supers" "^7.13.0" "@babel/helper-split-export-declaration" "^7.12.13" +"@babel/helper-create-class-features-plugin@^7.16.7": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" + integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-create-regexp-features-plugin@^7.12.13": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" @@ -103,6 +160,13 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" @@ -119,6 +183,15 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -126,6 +199,20 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-member-expression-to-functions@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" @@ -133,6 +220,13 @@ dependencies: "@babel/types" "^7.13.0" +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-module-imports@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" @@ -140,6 +234,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-module-transforms@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" @@ -155,6 +256,20 @@ "@babel/types" "^7.13.0" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.16.7": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0" + integrity sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -162,11 +277,32 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== +"@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + "@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" @@ -177,6 +313,17 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-simple-access@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" @@ -184,6 +331,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -191,6 +345,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-split-export-declaration@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" @@ -198,24 +359,51 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== -"@babel/helpers@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.0.tgz#7647ae57377b4f0408bf4f8a7af01c42e41badc0" - integrity sha512-aan1MeFPxFacZeSz6Ld7YZo5aPuqnKlD7+HZY75xQsueczFccP9A7V05+oe0XpLwHK3oLorPe9eaAUljL7WEaQ== +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.17.2": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" + integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.0" + "@babel/types" "^7.17.0" "@babel/highlight@^7.12.13": version "7.13.8" @@ -226,19 +414,26 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.0", "@babel/parser@^7.13.4": +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.7.0": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" + integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== + +"@babel/parser@^7.12.13", "@babel/parser@^7.13.0": version "7.13.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.9.tgz#ca34cb95e1c2dd126863a84465ae8ef66114be99" integrity sha512-nEUfRiARCcaVo3ny3ZQjURjHQZUo/JkEw7rLlSZy/psWGnvwXFtPcr6jb7Yb41DVW5LTe6KRq9LGleRNsg1Frw== -"@babel/plugin-external-helpers@^7.0.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.13.tgz#65ef9f4576297250dc601d2aa334769790d9966d" - integrity sha512-ClvAsk4RqpE6iacYUjdU9PtvIwC9yAefZENsPfGeG5FckX3jFZLDlWPuyv5gi9/9C2VgwX6H8q1ukBifC0ha+Q== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0": +"@babel/plugin-proposal-class-properties@^7.0.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== @@ -246,14 +441,13 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-decorators@^7.13.5": - version "7.13.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.5.tgz#d28071457a5ba8ee1394b23e38d5dcf32ea20ef7" - integrity sha512-i0GDfVNuoapwiheevUOuSW67mInqJ8qw7uWfpjNVeHMn143kXblEy/bmL9AdZ/0yf/4BMQeWXezK0tQIvNPqag== +"@babel/plugin-proposal-class-properties@^7.1.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-decorators" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-proposal-export-default-from@^7.0.0": version "7.12.13" @@ -271,6 +465,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.1.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread@^7.0.0": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" @@ -299,17 +501,33 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-syntax-class-properties@^7.0.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== +"@babel/plugin-proposal-optional-chaining@^7.1.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-decorators@^7.12.13": +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" - integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" @@ -334,6 +552,27 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-flow@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" + integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" @@ -341,6 +580,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" @@ -348,6 +594,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" @@ -369,6 +622,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" @@ -376,6 +636,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-typescript@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-arrow-functions@^7.0.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" @@ -383,6 +650,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-async-to-generator@^7.0.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions@^7.0.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" @@ -440,6 +716,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-flow" "^7.12.13" +"@babel/plugin-transform-flow-strip-types@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" + integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-flow" "^7.16.7" + "@babel/plugin-transform-for-of@^7.0.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" @@ -479,6 +763,16 @@ "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.1.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-object-assign@^7.0.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz#d9b9200a69e03403a813e44a933ad9f4bddfd050" @@ -588,6 +882,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-typescript@^7.16.7": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" + integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-typescript" "^7.16.7" + "@babel/plugin-transform-typescript@^7.5.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" @@ -605,6 +908,24 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" +"@babel/preset-flow@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.16.7.tgz#7fd831323ab25eeba6e4b77a589f680e30581cbd" + integrity sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-flow-strip-types" "^7.16.7" + +"@babel/preset-typescript@^7.1.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" + integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.16.7" + "@babel/register@^7.0.0": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.13.8.tgz#d9051dc6820cb4e86375cc0e2d55a4862b31184f" @@ -616,7 +937,7 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": version "7.13.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.9.tgz#97dbe2116e2630c489f22e0656decd60aaa1fcee" integrity sha512-aY2kU+xgJ3dJ1eU6FMB9EH8dIe8dmusF1xEku52joLvw6eAFN0AI+WxCLDnpev2LEejWBAy2sBvBOBAjI3zmvA== @@ -632,7 +953,32 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0": +"@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" + integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.3" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== @@ -656,6 +1002,19 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.7.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -664,118 +1023,282 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== +"@eslint/eslintrc@^0.2.1": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== +"@hapi/hoek@^9.0.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== -"@hapi/joi@^15.0.3": - version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" + "@hapi/hoek" "^9.0.0" -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: - "@hapi/hoek" "^8.3.0" + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" -"@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== +"@jest/console@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" + integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.6.2" + jest-util "^26.6.2" + slash "^3.0.0" + +"@jest/core@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" + integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/reporters" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^26.6.2" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-resolve-dependencies "^26.6.3" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + jest-watcher "^26.6.2" + micromatch "^4.0.2" + p-each-series "^2.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" -"@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== +"@jest/create-cache-key-function@^27.0.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" + integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== + dependencies: + "@jest/types" "^27.5.1" + +"@jest/environment@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" + integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== + dependencies: + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + +"@jest/fake-timers@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" + integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== + dependencies: + "@jest/types" "^26.6.2" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +"@jest/globals@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" + integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/types" "^26.6.2" + expect "^26.6.2" + +"@jest/reporters@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" + integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^26.6.2" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^7.0.0" + optionalDependencies: + node-notifier "^8.0.0" + +"@jest/source-map@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" + integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== dependencies: callsites "^3.0.0" - graceful-fs "^4.1.15" + graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== +"@jest/test-result@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" + integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" + "@jest/console" "^26.6.2" + "@jest/types" "^26.6.2" "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" + integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== + dependencies: + "@jest/test-result" "^26.6.2" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" + integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" + integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" -"@react-native-community/cli-debugger-ui@^4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz#07de6d4dab80ec49231de1f1fbf658b4ad39b32c" - integrity sha512-UFnkg5RTq3s2X15fSkrWY9+5BKOFjihNSnJjTV2H5PtTUFbd55qnxxPw8CxSfK0bXb1IrSvCESprk2LEpqr5cg== +"@react-native-community/cli-debugger-ui@^6.0.0-rc.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-6.0.0.tgz#ef9eb1268d85c1bd3caf2c4d36dc350bb080f254" + integrity sha512-onf6vtvqSzOr6bNEWhPzgcJP2UQhA0VY6c8tXwNczIONC/ahnN93LPBB/uXDbn9d/kLMvE7oUJiqRadZWHk6aA== dependencies: serve-static "^1.13.1" -"@react-native-community/cli-hermes@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz#6243ed9c709dad5e523f1ccd7d21066b32f2899d" - integrity sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ== +"@react-native-community/cli-hermes@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-6.3.0.tgz#92b2f07d08626a60f6893c3e3d57c1538c8fb5a7" + integrity sha512-Uhbm9bubyZLZ12vFCIfWbE/Qi3SBTbYIN/TC08EudTLhv/KbPomCQnmFsnJ7AXQFuOZJs73mBxoEAYSbRbwyVA== dependencies: - "@react-native-community/cli-platform-android" "^4.13.0" - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" + "@react-native-community/cli-platform-android" "^6.3.0" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" hermes-profile-transformer "^0.0.6" ip "^1.1.5" -"@react-native-community/cli-platform-android@^4.10.0", "@react-native-community/cli-platform-android@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz#922681ec82ee1aadd993598b814df1152118be02" - integrity sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA== +"@react-native-community/cli-platform-android@^6.0.0", "@react-native-community/cli-platform-android@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-6.3.0.tgz#ab7d156bd69a392493323eeaba839a874c0e201f" + integrity sha512-d5ufyYcvrZoHznYm5bjBXaiHIJv552t5gYtQpnUsxBhHSQ8QlaNmlLUyeSPRDfOw4ND9b0tPHqs4ufwx6vp/fQ== dependencies: - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" execa "^1.0.0" fs-extra "^8.1.0" glob "^7.1.3" @@ -785,63 +1308,85 @@ slash "^3.0.0" xmldoc "^1.1.2" -"@react-native-community/cli-platform-ios@^4.10.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz#a738915c68cac86df54e578b59a1311ea62b1aef" - integrity sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA== +"@react-native-community/cli-platform-ios@^6.0.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-6.2.0.tgz#ceaa23995511a8e400b506632ac7e6a66a17ec2a" + integrity sha512-k15MhExxLiLDDZOeuPgvTxbp0CsoLQQpk2Du0HjZDePqqWcKJylQqMZru1o8HuQHPcEr+b71HIs5V+lKyFYpfg== dependencies: - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" glob "^7.1.3" js-yaml "^3.13.1" lodash "^4.17.15" - plist "^3.0.1" + ora "^3.4.0" + plist "^3.0.2" xcode "^2.0.0" -"@react-native-community/cli-server-api@^4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz#bee7ee9702afce848e9d6ca3dcd5669b99b125bd" - integrity sha512-vQzsFKD9CjHthA2ehTQX8c7uIzlI9A7ejaIow1I9RlEnLraPH2QqVDmzIdbdh5Od47UPbRzamCgAP8Bnqv3qwQ== - dependencies: - "@react-native-community/cli-debugger-ui" "^4.13.1" - "@react-native-community/cli-tools" "^4.13.0" +"@react-native-community/cli-plugin-metro@^6.4.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-6.4.0.tgz#70b7908d6b548481f37ed58167f9460d325ae21c" + integrity sha512-lcrNODvHd3ZVhiEshXAjyBoqP44rjhkytkOSUpnZHAcmMLiguxDmvhWeWqbwu3XqSX/f0gVKmfj81t+opI1bSw== + dependencies: + "@react-native-community/cli-server-api" "^6.4.0" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" + metro "^0.66.1" + metro-config "^0.66.1" + metro-core "^0.66.1" + metro-react-native-babel-transformer "^0.66.1" + metro-resolver "^0.66.1" + metro-runtime "^0.66.1" + readline "^1.3.0" + +"@react-native-community/cli-server-api@^6.4.0": + version "6.4.3" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-6.4.3.tgz#b52444454f40bfb54a84ab52bf42e9f8002917f5" + integrity sha512-Ywy2x+PhIUZXgE74YiCYXylSVnuEBcq5cNfYLR3AwOvrILjh03smXfCca8s2V2LWUlzmWN6+L85FJGsT92MUJA== + dependencies: + "@react-native-community/cli-debugger-ui" "^6.0.0-rc.0" + "@react-native-community/cli-tools" "^6.2.0" compression "^1.7.1" connect "^3.6.5" errorhandler "^1.5.0" nocache "^2.1.0" - pretty-format "^25.1.0" + pretty-format "^26.6.2" serve-static "^1.13.1" ws "^1.1.0" -"@react-native-community/cli-tools@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz#b406463d33af16cedc4305a9a9257ed32845cf1b" - integrity sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg== +"@react-native-community/cli-tools@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-6.2.0.tgz#8f4adc2d83ab96e5654348533c8fa602742c4fce" + integrity sha512-08ssz4GMEnRxC/1FgTTN/Ud7mExQi5xMphItPjfHiTxpZPhrFn+IMx6mya0ncFEhhxQ207wYlJMRLPRRdBZ8oA== dependencies: - chalk "^3.0.0" + appdirsjs "^1.2.4" + chalk "^4.1.2" lodash "^4.17.15" mime "^2.4.1" node-fetch "^2.6.0" open "^6.2.0" + semver "^6.3.0" shell-quote "1.6.1" -"@react-native-community/cli-types@^4.10.1": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.10.1.tgz#d68a2dcd1649d3b3774823c64e5e9ce55bfbe1c9" - integrity sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ== - -"@react-native-community/cli@^4.10.0": - version "4.14.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.14.0.tgz#bb106a98341bfa2db36060091ff90bfe82ea4f55" - integrity sha512-EYJKBuxFxAu/iwNUfwDq41FjORpvSh1wvQ3qsHjzcR5uaGlWEOJrd3uNJDuKBAS0TVvbEesLF9NEXipjyRVr4Q== - dependencies: - "@hapi/joi" "^15.0.3" - "@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" +"@react-native-community/cli-types@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-6.0.0.tgz#90269fbdc7229d5e3b8f2f3e029a94083551040d" + integrity sha512-K493Fk2DMJC0ZM8s8gnfseKxGasIhuDaCUDeLZcoCSFlrjKEuEs1BKKEJiev0CARhKEXKOyyp/uqYM9nWhisNw== + dependencies: + ora "^3.4.0" + +"@react-native-community/cli@^6.0.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-6.4.0.tgz#0b61a4b5f11293b0b79a0e78f80777387a9529a9" + integrity sha512-UNvYnWaALa4mJEaWdLY3fVK+csZzx/Ja/FGvXISPJ9W9lrKvGtyXkidViUCPbPtMsJUi7teA4uIShHn0mbGmnQ== + dependencies: + "@react-native-community/cli-debugger-ui" "^6.0.0-rc.0" + "@react-native-community/cli-hermes" "^6.3.0" + "@react-native-community/cli-plugin-metro" "^6.4.0" + "@react-native-community/cli-server-api" "^6.4.0" + "@react-native-community/cli-tools" "^6.2.0" + "@react-native-community/cli-types" "^6.0.0" + appdirsjs "^1.2.4" + chalk "^4.1.2" command-exists "^1.2.8" commander "^2.19.0" cosmiconfig "^5.1.0" @@ -852,35 +1397,155 @@ fs-extra "^8.1.0" glob "^7.1.3" graceful-fs "^4.1.3" - inquirer "^3.0.6" + joi "^17.2.1" leven "^3.1.0" lodash "^4.17.15" - 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" ora "^3.4.0" - pretty-format "^25.2.0" + pretty-format "^26.6.2" + prompts "^2.4.0" semver "^6.3.0" serve-static "^1.13.1" strip-ansi "^5.2.0" sudo-prompt "^9.0.0" wcwidth "^1.0.1" +"@react-native-community/eslint-config@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/eslint-config/-/eslint-config-2.0.0.tgz#35dcc529a274803fc4e0a6b3d6c274551fb91774" + integrity sha512-vHaMMfvMp9BWCQQ0lNIXibOJTcXIbYUQ8dSUsMOsrXgVkeVQJj88OwrKS00rQyqwMaC4/a6HuDiFzYUkGKOpVg== + dependencies: + "@react-native-community/eslint-plugin" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^3.1.0" + "@typescript-eslint/parser" "^3.1.0" + babel-eslint "^10.1.0" + eslint-config-prettier "^6.10.1" + eslint-plugin-eslint-comments "^3.1.2" + eslint-plugin-flowtype "2.50.3" + eslint-plugin-jest "22.4.1" + eslint-plugin-prettier "3.1.2" + eslint-plugin-react "^7.20.0" + eslint-plugin-react-hooks "^4.0.4" + eslint-plugin-react-native "^3.8.1" + prettier "^2.0.2" + +"@react-native-community/eslint-plugin@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.1.0.tgz#e42b1bef12d2415411519fd528e64b593b1363dc" + integrity sha512-W/J0fNYVO01tioHjvYWQ9m6RgndVtbElzYozBq1ZPrHO/iCzlqoySHl4gO/fpCl9QEFjvJfjPgtPMTMlsoq5DQ== + +"@react-native/assets@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" + integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== + +"@react-native/normalize-color@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.0.0.tgz#da955909432474a9a0fe1cbffc66576a0447f567" + integrity sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw== + +"@react-native/polyfills@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" + integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== + +"@sideway/address@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.3.tgz#d93cce5d45c5daec92ad76db492cc2ee3c64ab27" + integrity sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sqltools/formatter@^1.2.2": version "1.2.3" resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20" integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg== +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": + version "7.1.18" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" + integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== +"@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + "@types/istanbul-lib-report@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" @@ -888,31 +1553,43 @@ dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: - "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/json-schema@^7.0.3": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/node@*": + version "17.0.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" + integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/prettier@^2.0.0": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" + integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/yargs-parser@*": version "20.2.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== -"@types/yargs@^13.0.0": - version "13.0.11" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" - integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^15.0.0": version "15.0.13" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" @@ -920,16 +1597,88 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + "@types/zen-observable@0.8.3": version "0.8.3" resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== +"@typescript-eslint/eslint-plugin@^3.1.0": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" + integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== + dependencies: + "@typescript-eslint/experimental-utils" "3.10.1" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^3.1.0": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "3.10.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== + +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== + dependencies: + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== + dependencies: + eslint-visitor-keys "^1.1.0" + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -942,6 +1691,14 @@ absolute-path@^0.0.0: resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" integrity sha1-p4di+9rftSl76ZsV01p4Wy8JW/c= +accepts@^1.3.7: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -950,29 +1707,67 @@ accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -anser@^1.4.9: - version "1.4.10" - resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" - integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: - ansi-wrap "^0.1.0" + debug "4" -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - ansi-wrap "0.1.0" + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +anser@^1.4.9: + version "1.4.10" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" + integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" ansi-fragments@^0.2.1: version "0.2.1" @@ -983,31 +1778,12 @@ ansi-fragments@^0.2.1: slice-ansi "^2.0.0" strip-ansi "^5.0.0" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= - dependencies: - ansi-wrap "0.1.0" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -1036,11 +1812,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= - any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -1054,11 +1825,24 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + app-root-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== +appdirsjs@^1.2.4: + version "1.2.6" + resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.6.tgz#fccf9ee543315492867cacfcfd4a2b32257d30ac" + integrity sha512-D8wJNkqMCeQs3kLasatELsddox/Xqkhp+J07iXGyL54fVN7oc+nmNfYzGuCs1IEP6uBw+TfpuO3JKwc+lECy4w== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1071,29 +1855,16 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= - arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" @@ -1104,6 +1875,17 @@ array-filter@~0.0.0: resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= +array-includes@^3.1.3, array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" @@ -1114,17 +1896,21 @@ array-reduce@~0.0.0: resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -asap@~2.0.3, asap@~2.0.6: +array.prototype.flatmap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -1134,11 +1920,23 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-types@0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + async@^2.4.0: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -1146,11 +1944,47 @@ async@^2.4.0: dependencies: lodash "^4.17.14" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-jest@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" @@ -1158,7 +1992,28 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-module-resolver@^4.0.0: +babel-plugin-istanbul@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-module-resolver@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2" integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA== @@ -1198,17 +2053,28 @@ babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== -babel-plugin-transform-typescript-metadata@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.1.tgz#d86599b7139131ba5e917f5f568d0c824a5cdfc3" - integrity sha512-thOuACZReULfLy7vh2o3/joYkkRerMKLBDmXy3ImCnkNUnxBmNw0uVa05JhhX0slluaEkio6OIFa7zPgaJdk6g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541" - integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw== +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== dependencies: "@babel/plugin-proposal-class-properties" "^7.0.0" "@babel/plugin-proposal-object-rest-spread" "^7.0.0" @@ -1238,12 +2104,20 @@ babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0: "@babel/plugin-transform-template-literals" "^7.0.0" babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1: +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -1266,13 +2140,6 @@ big-integer@^1.6.44: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - bplist-creator@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.8.tgz#56b2a6e79e9aec3fc33bf831d09347d73794e79c" @@ -1318,6 +2185,11 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + browserslist@^4.14.5, browserslist@^4.16.3: version "4.16.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" @@ -1329,6 +2201,17 @@ browserslist@^4.14.5, browserslist@^4.16.3: escalade "^3.1.1" node-releases "^1.1.70" +browserslist@^4.17.5: + version "4.19.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.3.tgz#29b7caad327ecf2859485f696f9604214bedd383" + integrity sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg== + dependencies: + caniuse-lite "^1.0.30001312" + electron-to-chromium "^1.4.71" + escalade "^3.1.1" + node-releases "^2.0.2" + picocolors "^1.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -1336,11 +2219,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-crc32@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -1374,7 +2252,7 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -call-bind@^1.0.0: +call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -1411,11 +2289,21 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-lite@^1.0.30001181: version "1.0.30001194" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001194.tgz#3d16ff3d734a5a7d9818402c28b1f636c5be5bed" integrity sha512-iDUOH+oFeBYk5XawYsPtsx/8fFpndAPUQJC7gBTfxHM8xw5nOZv7ceAD4frS1MKCLUac7QL5wdAJiFQlDRjXlA== +caniuse-lite@^1.0.30001312: + version "1.0.30001313" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001313.tgz#a380b079db91621e1b7120895874e2fd62ed2e2f" + integrity sha512-rI1UN0koZUiKINjysQDuRi2VeSCce3bYJNmDcj3PIKREiAmjakugBul1QSkg/fPrlULYl6oWfGg3PbgOSY9X4Q== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -1434,7 +2322,7 @@ chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1443,14 +2331,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -1459,16 +2339,29 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cjs-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" + integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1503,20 +2396,6 @@ cli-spinners@^2.0.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -1540,6 +2419,16 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -1572,16 +2461,23 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - colorette@^1.0.7, colorette@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + command-exists@^1.2.8: version "1.2.9" resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" @@ -1632,16 +2528,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - connect@^3.6.5: version "3.7.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" @@ -1652,6 +2538,13 @@ connect@^3.6.5: parseurl "~1.3.3" utils-merge "1.0.1" +convert-source-map@^1.4.0, convert-source-map@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" @@ -1672,11 +2565,6 @@ core-js-compat@^3.8.1: browserslist "^4.16.3" semver "7.0.0" -core-js@^2.4.1: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1692,15 +2580,6 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -1712,6 +2591,41 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + dayjs@^1.8.15: version "1.10.4" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2" @@ -1724,6 +2638,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" +debug@4, debug@^4.0.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + debug@^4.1.0, debug@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" @@ -1743,16 +2664,31 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deepmerge@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -1789,6 +2725,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" @@ -1804,6 +2745,37 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + dotenv@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" @@ -1819,6 +2791,16 @@ electron-to-chromium@^1.3.649: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.677.tgz#b5d586b0d1976c97cc7e95262677ac5944199513" integrity sha512-Tcmk+oKQgpjcM+KYanlkd76ZtpzalkpUULnlJDP6vjHtR7UU564IM9Qv5DxqHZNBQjzXm6mkn7Y8bw2OoE3FmQ== +electron-to-chromium@^1.4.71: + version "1.4.76" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.76.tgz#a0494baedaf51094b1c172999919becd9975a934" + integrity sha512-3Vftv7cenJtQb+k00McEBZ2vVmZ/x+HEF7pcZONZIkOsESqAqVuACmBxMv0JhzX7u0YltU0vSqRqgBSTAhFUjA== + +emittery@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -1834,13 +2816,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -1848,6 +2823,13 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + envinfo@^7.7.2: version "7.7.4" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320" @@ -1875,6 +2857,41 @@ errorhandler@^1.5.0: accepts "~1.3.7" escape-html "~1.0.3" +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -1895,11 +2912,201 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -esprima@^4.0.0: +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^6.10.1: + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== + dependencies: + get-stdin "^6.0.0" + +eslint-plugin-eslint-comments@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-flowtype@2.50.3: + version "2.50.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz#61379d6dce1d010370acd6681740fd913d68175f" + integrity sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ== + dependencies: + lodash "^4.17.10" + +eslint-plugin-jest@22.4.1: + version "22.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz#a5fd6f7a2a41388d16f527073b778013c5189a9c" + integrity sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg== + +eslint-plugin-prettier@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" + integrity sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.0.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" + integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== + +eslint-plugin-react-native-globals@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" + integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== + +eslint-plugin-react-native@^3.8.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.11.0.tgz#c73b0886abb397867e5e6689d3a6a418682e6bac" + integrity sha512-7F3OTwrtQPfPFd+VygqKA2VZ0f2fz0M4gJmry/TRE18JBb94/OtMxwbL7Oqwu7FGyrdeIOWnXQbBAveMcSTZIA== + dependencies: + "@babel/traverse" "^7.7.4" + eslint-plugin-react-native-globals "^0.1.1" + +eslint-plugin-react@^7.20.0: + version "7.29.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.3.tgz#f4eab757f2756d25d6d4c2a58a9e20b004791f05" + integrity sha512-MzW6TuCnDOcta67CkpDyRfRsEVx9FNMDV8wZsDqe1luHPdGTrQIUaUXD27Ja3gHsdOIs/cXzNchWGlqm+qRVRg== + dependencies: + array-includes "^3.1.4" + array.prototype.flatmap "^1.2.5" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.0" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.6" + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@7.14.0: + version "7.14.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.14.0.tgz#2d2cac1d28174c510a97b377f122a5507958e344" + integrity sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.1" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.0" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + 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" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -1910,11 +3117,6 @@ event-target-shim@^5.0.0, event-target-shim@^5.0.1: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter3@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - exec-sh@^0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" @@ -1933,6 +3135,26 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -1946,12 +3168,17 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= +expect@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== dependencies: - kind-of "^1.1.0" + "@jest/types" "^26.6.2" + ansi-styles "^4.0.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" extend-shallow@^2.0.1: version "2.0.1" @@ -1968,15 +3195,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -1991,15 +3209,25 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -fancy-log@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fb-watchman@^2.0.0: version "2.0.1" @@ -2008,57 +3236,17 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs-scripts@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" - integrity sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ== - dependencies: - "@babel/core" "^7.0.0" - ansi-colors "^1.0.1" - babel-preset-fbjs "^3.2.0" - core-js "^2.4.1" - cross-spawn "^5.1.0" - fancy-log "^1.3.2" - object-assign "^4.0.1" - plugin-error "^0.1.2" - semver "^5.1.0" - through2 "^2.0.0" - -fbjs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" - integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== - dependencies: - core-js "^2.4.1" - fbjs-css-vars "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - figlet@^1.1.1: version "1.5.0" resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.0.tgz#2db4d00a584e5155a96080632db919213c3e003c" integrity sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww== -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: - escape-string-regexp "^1.0.5" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + flat-cache "^2.0.1" fill-range@^4.0.0: version "4.0.0" @@ -2114,7 +3302,7 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.1.0: +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -2129,11 +3317,44 @@ find-yarn-workspace-root@^2.0.0: dependencies: micromatch "^4.0.2" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flow-parser@0.*: + version "0.173.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.173.0.tgz#992539fe87b4448a660ac1c54ffa358301e7110b" + integrity sha512-gikomjo+jzdehhOCHP2Ca5y1HGK3jkODhUdTxk4a3SdyLAMBsEwb7KJETHzB4KQs7HhHcqhyT7mGmd9iT8B5Hg== + +flow-parser@^0.121.0: + version "0.121.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.121.0.tgz#9f9898eaec91a9f7c323e9e992d81ab5c58e618f" + integrity sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg== + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -2178,19 +3399,21 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" +fsevents@^2.1.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -2201,7 +3424,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -2210,6 +3433,16 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -2217,11 +3450,45 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +glob-parent@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.4: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.3, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -2239,11 +3506,28 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@^4.2.4: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2251,6 +3535,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2266,6 +3555,18 @@ has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-symbols@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -2304,10 +3605,15 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hermes-engine@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.5.1.tgz#601115e4b1e0a17d9aa91243b96277de4e926e09" - integrity sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg== +hermes-engine@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.9.0.tgz#84d9cfe84e8f6b1b2020d6e71b350cec84ed982f" + integrity sha512-r7U+Y4P2Qg/igFVZN+DpT7JFfXUn1MM4dFne8aW+cCrF6RRymof+VqrUHs1kl07j8h8V2CNesU19RKgWbr3qPw== + +hermes-parser@0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.4.7.tgz#410f5129d57183784d205a0538e6fbdcf614c9ea" + integrity sha512-jc+zCtXbtwTiXoMAoXOHepxAaGVFIp89wwE9qcdwnMd/uGVEtPoY8FaFSsx0ThPvyKirdR2EsIIDVrpbSXz1Ag== hermes-profile-transformer@^0.0.6: version "0.0.6" @@ -2321,6 +3627,23 @@ highlight.js@^10.7.1: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + http-errors@~1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" @@ -2332,25 +3655,50 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -iconv-lite@^0.4.17: +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.5: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + image-size@^0.6.0: version "0.6.3" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" @@ -2364,6 +3712,27 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2372,30 +3741,19 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" invariant@^2.2.4: version "2.2.4" @@ -2428,11 +3786,31 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -2447,6 +3825,13 @@ is-core-module@^2.2.0: dependencies: has "^1.0.3" +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -2461,6 +3846,13 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -2501,6 +3893,11 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -2511,6 +3908,30 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -2530,11 +3951,60 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-stream@^1.0.1, is-stream@^1.1.0: +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -2545,7 +4015,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.1.1: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -2562,119 +4032,459 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-instrument@^5.0.4: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" + integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== + dependencies: + "@jest/types" "^26.6.2" + execa "^4.0.0" + throat "^5.0.0" + +jest-cli@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" + integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== + dependencies: + "@jest/core" "^26.6.3" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.6.3" + jest-util "^26.6.2" + jest-validate "^26.6.2" + prompts "^2.0.1" + yargs "^15.4.1" + +jest-config@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" + integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.6.3" + "@jest/types" "^26.6.2" + babel-jest "^26.6.3" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.6.2" + jest-environment-node "^26.6.2" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.6.3" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + micromatch "^4.0.2" + pretty-format "^26.6.2" + +jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + +jest-each@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" + integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + jest-get-type "^26.3.0" + jest-util "^26.6.2" + pretty-format "^26.6.2" + +jest-environment-jsdom@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +jest-environment-node@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" + integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-haste-map@^26.5.2, jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" + integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.6.2" + is-generator-fn "^2.0.0" + jest-each "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + pretty-format "^26.6.2" + throat "^5.0.0" + +jest-leak-detector@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" + integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== + dependencies: + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== dependencies: - isarray "1.0.0" + "@jest/types" "^26.6.2" + "@types/node" "*" -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-resolve-dependencies@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" + integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" + "@jest/types" "^26.6.2" + jest-regex-util "^26.0.0" + jest-snapshot "^26.6.2" -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== +jest-resolve@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" + integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.2" + read-pkg-up "^7.0.1" + resolve "^1.18.1" + slash "^3.0.0" -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== +jest-runner@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" + integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-docblock "^26.0.0" + jest-haste-map "^26.6.2" + jest-leak-detector "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + jest-runtime "^26.6.3" + jest-util "^26.6.2" + jest-worker "^26.6.2" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" + integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/globals" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + cjs-module-lexer "^0.6.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.4.1" -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== - dependencies: - "@jest/types" "^24.9.0" - -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - -jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" + integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.6.2" + graceful-fs "^4.2.4" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + jest-haste-map "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + natural-compare "^1.4.0" + pretty-format "^26.6.2" + semver "^7.3.2" + +jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" + micromatch "^4.0.2" -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== +jest-validate@^26.5.2, jest-validate@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" leven "^3.1.0" - pretty-format "^24.9.0" + pretty-format "^26.6.2" -jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== +jest-watcher@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" + integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== dependencies: + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.6.2" + string-length "^4.0.1" + +jest-worker@^26.0.0, jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" merge-stream "^2.0.0" - supports-color "^6.1.0" + supports-color "^7.0.0" + +jest@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" + integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== + dependencies: + "@jest/core" "^26.6.3" + import-local "^3.0.2" + jest-cli "^26.6.3" jetifier@^1.6.2: version "1.6.6" resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.6.tgz#fec8bff76121444c12dc38d2dad6767c421dab68" integrity sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ== +joi@^17.2.1: + version "17.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2695,10 +4505,68 @@ js-yaml@^4.0.0: dependencies: argparse "^2.0.1" -jsc-android@^245459.0.0: - version "245459.0.0" - resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" - integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg== +jsc-android@^250230.2.1: + version "250230.2.1" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250230.2.1.tgz#3790313a970586a03ab0ad47defbc84df54f1b83" + integrity sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q== + +jscodeshift@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.11.0.tgz#4f95039408f3f06b0e39bb4d53bc3139f5330e2f" + integrity sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g== + dependencies: + "@babel/core" "^7.1.6" + "@babel/parser" "^7.1.6" + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.1.0" + "@babel/plugin-proposal-optional-chaining" "^7.1.0" + "@babel/plugin-transform-modules-commonjs" "^7.1.0" + "@babel/preset-flow" "^7.0.0" + "@babel/preset-typescript" "^7.1.0" + "@babel/register" "^7.0.0" + babel-core "^7.0.0-bridge.0" + colors "^1.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.20.3" + temp "^0.8.1" + write-file-atomic "^2.3.0" + +jsdom@^16.4.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" jsesc@^2.5.1: version "2.5.2" @@ -2715,12 +4583,20 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-stable-stringify@^1.0.1: +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json5@^0.5.1: version "0.5.1" @@ -2753,10 +4629,13 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== + dependencies: + array-includes "^3.1.3" + object.assign "^4.1.2" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -2796,11 +4675,37 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -2826,7 +4731,7 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.3.0: +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2854,13 +4759,12 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" + yallist "^4.0.0" make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" @@ -2870,6 +4774,13 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -2889,138 +4800,98 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -metro-babel-register@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.59.0.tgz#2bcff65641b36794cf083ba732fbc46cf870fb43" - integrity sha512-JtWc29erdsXO/V3loenXKw+aHUXgj7lt0QPaZKPpctLLy8kcEpI/8pfXXgVK9weXICCpCnYtYncIosAyzh0xjg== +metro-babel-register@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.66.2.tgz#c6bbe36c7a77590687ccd74b425dc020d17d05af" + integrity sha512-3F+vsVubUPJYKfVMeol8/7pd8CC287Rw92QYzJD8LEmI980xcgwMUEVBZ0UIAUwlLgiJG/f4Mwhuji2EeBXrPg== dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/core" "^7.14.0" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^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" escape-string-regexp "^1.0.5" -metro-babel-transformer@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz#dda99c75d831b00142c42c020c51c103b29f199d" - integrity sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w== +metro-babel-transformer@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.66.2.tgz#fce0a3e314d28a5e7141c135665e1cc9b8e7ce86" + integrity sha512-aJ/7fc/Xkofw8Fqa51OTDhBzBz26mmpIWrXAZcPdQ8MSTt883EWncxeCEjasc79NJ89BRi7sOkkaWZo2sXlKvw== dependencies: - "@babel/core" "^7.0.0" - metro-source-map "0.59.0" + "@babel/core" "^7.14.0" + hermes-parser "0.4.7" + metro-source-map "0.66.2" + nullthrows "^1.1.1" -metro-cache@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.59.0.tgz#ef3c055f276933979b731455dc8317d7a66f0f2d" - integrity sha512-ryWNkSnpyADfRpHGb8BRhQ3+k8bdT/bsxMH2O0ntlZYZ188d8nnYWmxbRvFmEzToJxe/ol4uDw0tJFAaQsN8KA== +metro-cache-key@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.66.2.tgz#d6463d2a53e887a38419d523962cc24ea0e780b4" + integrity sha512-WtkNmRt41qOpHh1MkNA4nLiQ/m7iGL90ysSKD+fcLqlUnOBKJptPQm0ZUv8Kfqk18ddWX2KmsSbq+Sf3I6XohQ== + +metro-cache@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.66.2.tgz#e0af4e0a319898f7d42a980f7ee5da153fcfd019" + integrity sha512-5QCYJtJOHoBSbL3H4/Fpl36oA697C3oYHqsce+Hk/dh2qtODUGpS3gOBhvP1B8iB+H8jJMyR75lZq129LJEsIQ== dependencies: - jest-serializer "^24.9.0" - metro-core "0.59.0" + metro-core "0.66.2" mkdirp "^0.5.1" rimraf "^2.5.4" -metro-config@0.59.0, metro-config@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.59.0.tgz#9844e388069321dd7403e49f0d495a81f9aa0fef" - integrity sha512-MDsknFG9vZ4Nb5VR6OUDmGHaWz6oZg/FtE3up1zVBKPVRTXE1Z+k7zypnPtMXjMh3WHs/Sy4+wU1xnceE/zdnA== +metro-config@0.66.2, metro-config@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.66.2.tgz#e365acdb66ad0cda0182b9c9910760a97ee4293b" + integrity sha512-0C+PrKKIBNNzLZUKN/8ZDJS2U5FLMOTXDWbvBHIdqb6YXz8WplXR2+xlSlaSCCi5b+GR7cWFWUNeKA4GQS1/AQ== dependencies: cosmiconfig "^5.0.5" - jest-validate "^24.9.0" - metro "0.59.0" - metro-cache "0.59.0" - metro-core "0.59.0" - -metro-core@0.59.0, metro-core@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.59.0.tgz#958cde3fe5c8cd84a78e1899af801ad69e9c83b1" - integrity sha512-kb5LKvV5r2pqMEzGyTid8ai2mIjW13NMduQ8oBmfha7/EPTATcTQ//s+bkhAs1toQD8vqVvjAb0cPNjWQEmcmQ== - dependencies: - jest-haste-map "^24.9.0" + jest-validate "^26.5.2" + metro "0.66.2" + metro-cache "0.66.2" + metro-core "0.66.2" + metro-runtime "0.66.2" + +metro-core@0.66.2, metro-core@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.66.2.tgz#ead776a17b3e5a307e6dc22259db30bf5c7e8490" + integrity sha512-JieLZkef/516yxXYvQxWnf3OWw5rcgWRy76K8JV/wr/i8LGVGulPAXlIi445/QZzXVydzRVASKAEVqyxM5F4mA== + dependencies: + jest-haste-map "^26.5.2" lodash.throttle "^4.1.1" - metro-resolver "0.59.0" - wordwrap "^1.0.0" + metro-resolver "0.66.2" + +metro-hermes-compiler@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.66.2.tgz#30290748f83805faa601aa487632444915795823" + integrity sha512-nCVL1g9uR6vrw5+X1wjwZruRyMkndnzGRMqjqoljf+nGEqBTD607CR7elXw4fMWn/EM+1y0Vdq5altUu9LdgCA== -metro-inspector-proxy@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz#39d1390772d13767fc595be9a1a7074e2425cf8e" - integrity sha512-hPeAuQcofTOH0F+2GEZqWkvkVY1/skezSSlMocDQDaqds+Kw6JgdA7FlZXxnKmQ/jYrWUzff/pl8SUCDwuYthQ== +metro-inspector-proxy@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.66.2.tgz#a83c76bd2f2fd7b9240be92acf9a8b1d1404547a" + integrity sha512-gnLc9121eznwP0iiA9tCBW8qZjwIsCgwHWMF1g1Qaki9le9tzeJv3dK4/lFNGxyfSaLO7vahQEhsEYsiRnTROg== dependencies: connect "^3.6.5" debug "^2.2.0" ws "^1.1.5" - yargs "^14.2.0" + yargs "^15.3.1" -metro-minify-uglify@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz#6491876308d878742f7b894d7fca4af356886dd5" - integrity sha512-7IzVgCVWZMymgZ/quieg/9v5EQ8QmZWAgDc86Zp9j0Vy6tQTjUn6jlU+YAKW3mfMEjMr6iIUzCD8YklX78tFAw== +metro-minify-uglify@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.66.2.tgz#6061dbee4f61e6d5bb3c100e4379ff6f2e16e42b" + integrity sha512-7TUK+L5CmB5x1PVnFbgmjzHW4CUadq9H5jgp0HfFoWT1skXAyEsx0DHkKDXwnot0khnNhBOEfl62ctQOnE110Q== dependencies: uglify-es "^3.1.9" -metro-react-native-babel-preset@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz#20e020bc6ac9849e1477de1333d303ed42aba225" - integrity sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg== - dependencies: - "@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-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.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-self" "^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-react-native-babel-preset@^0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz#76861408681dfda3c1d962eb31a8994918c976f8" - integrity sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ== +metro-react-native-babel-preset@0.66.2, metro-react-native-babel-preset@^0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.66.2.tgz#fddebcf413ad4ea617d4f47f7c1da401052de734" + integrity sha512-H/nLBAz0MgfDloSe1FjyH4EnbokHFdncyERvLPXDACY3ROVRCeUyFNo70ywRGXW2NMbrV4H7KUyU4zkfWhC2HQ== dependencies: - "@babel/core" "^7.0.0" + "@babel/core" "^7.14.0" "@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" @@ -3033,6 +4904,7 @@ metro-react-native-babel-preset@^0.64.0: "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.0.0" "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^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" @@ -3060,109 +4932,144 @@ metro-react-native-babel-preset@^0.64.0: "@babel/template" "^7.0.0" react-refresh "^0.4.0" -metro-react-native-babel-transformer@0.59.0, metro-react-native-babel-transformer@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz#9b3dfd6ad35c6ef37fc4ce4d20a2eb67fabbb4be" - integrity sha512-1O3wrnMq4NcPQ1asEcl9lRDn/t+F1Oef6S9WaYVIKEhg9m/EQRGVrrTVP+R6B5Eeaj3+zNKbzM8Dx/NWy1hUbQ== - dependencies: - "@babel/core" "^7.0.0" - babel-preset-fbjs "^3.3.0" - metro-babel-transformer "0.59.0" - metro-react-native-babel-preset "0.59.0" - metro-source-map "0.59.0" +metro-react-native-babel-transformer@0.66.2, metro-react-native-babel-transformer@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.66.2.tgz#768f341e7c3d3d1c38189799c9884b90d1c32eb7" + integrity sha512-z1ab7ihIT0pJrwgi9q2IH+LcW/xUWMQ0hH+Mrk7wbKQB0RnJdXFoxphrfoVHBHMUu+TBPetUcEkKawkK1e7Cng== + dependencies: + "@babel/core" "^7.14.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.4.7" + metro-babel-transformer "0.66.2" + metro-react-native-babel-preset "0.66.2" + metro-source-map "0.66.2" + nullthrows "^1.1.1" -metro-resolver@0.59.0, metro-resolver@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.59.0.tgz#fbc9d7c95f094c52807877d0011feffb9e896fad" - integrity sha512-lbgiumnwoVosffEI96z0FGuq1ejTorHAj3QYUPmp5dFMfitRxLP7Wm/WP9l4ZZjIptxTExsJwuEff1SLRCPD9w== +metro-resolver@0.66.2, metro-resolver@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.66.2.tgz#f743ddbe7a12dd137d1f7a555732cafcaea421f8" + integrity sha512-pXQAJR/xauRf4kWFj2/hN5a77B4jLl0Fom5I3PHp6Arw/KxSBp0cnguXpGLwNQ6zQC0nxKCoYGL9gQpzMnN7Hw== dependencies: absolute-path "^0.0.0" -metro-source-map@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.59.0.tgz#e9beb9fc51bfb4e060f95820cf1508fc122d23f7" - integrity sha512-0w5CmCM+ybSqXIjqU4RiK40t4bvANL6lafabQ2GP2XD3vSwkLY+StWzCtsb4mPuyi9R/SgoLBel+ZOXHXAH0eQ== +metro-runtime@0.66.2, metro-runtime@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.66.2.tgz#3409ee957b949b6c7b72ef6ed2b9af9a4f4a910e" + integrity sha512-vFhKBk2ot9FS4b+2v0OTa/guCF/QDAOJubY0CNg7PzCS5+w4y3IvZIcPX4SSS1t8pYEZBLvtdtTDarlDl81xmg== + +metro-source-map@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.66.2.tgz#b5304a282a5d55fa67b599265e9cf3217175cdd7" + integrity sha512-038tFmB7vSh73VQcDWIbr5O1m+WXWyYafDaOy+1A/2K308YP0oj33gbEgDnZsLZDwcJ+xt1x6KUEBIzlX4YGeQ== dependencies: - "@babel/traverse" "^7.0.0" + "@babel/traverse" "^7.14.0" "@babel/types" "^7.0.0" invariant "^2.2.4" - metro-symbolicate "0.59.0" - ob1 "0.59.0" + metro-symbolicate "0.66.2" + nullthrows "^1.1.1" + ob1 "0.66.2" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz#fc7f93957a42b02c2bfc57ed1e8f393f5f636a54" - integrity sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw== +metro-symbolicate@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.66.2.tgz#addd095ce5f77e73ca21ddb5dfb396ff5d4fa041" + integrity sha512-u+DeQHyAFXVD7mVP+GST/894WHJ3i/U8oEJFnT7U3P52ZuLgX8n4tMNxhqZU12RcLR6etF8143aP0Ktx1gFLEQ== dependencies: invariant "^2.2.4" - metro-source-map "0.59.0" + metro-source-map "0.66.2" + nullthrows "^1.1.1" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro@0.59.0, metro@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.59.0.tgz#64a87cd61357814a4f279518e0781b1eab5934b8" - integrity sha512-OpVgYXyuTvouusFZQJ/UYKEbwfLmialrSCUUTGTFaBor6UMUHZgXPYtK86LzesgMqRc8aiuTQVO78iKW2Iz3wg== +metro-transform-plugins@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.66.2.tgz#39dd044a23b1343e4f2d2ec34d08128cdf255ed4" + integrity sha512-KTvqplh0ut7oDKovvDG6yzXM02R6X+9b2oVG+qYq8Zd3aCGTi51ASx4ThCNkAHyEvCuJdYg9fxXTL+j+wvhB5w== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.14.0" + nullthrows "^1.1.1" + +metro-transform-worker@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.66.2.tgz#0a8455992132c479721accd52c9bd47deb77769e" + integrity sha512-dO4PtYOMGB7Vzte8aIzX39xytODhmbJrBYPu+zYzlDjyefJZT7BkZ0LkPIThtyJi96xWcGqi9JBSo0CeRupAHw== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + metro "0.66.2" + metro-babel-transformer "0.66.2" + metro-cache "0.66.2" + metro-cache-key "0.66.2" + metro-hermes-compiler "0.66.2" + metro-source-map "0.66.2" + metro-transform-plugins "0.66.2" + nullthrows "^1.1.1" + +metro@0.66.2, metro@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.66.2.tgz#f21759bf00995470e7577b5b88a5277963f24492" + integrity sha512-uNsISfcQ3iKKSHoN5Q+LAh0l3jeeg7ZcNZ/4BAHGsk02erA0OP+l2m+b5qYVoPptHz9Oc3KyG5oGJoTu41pWjg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/parser" "^7.0.0" - "@babel/plugin-external-helpers" "^7.0.0" + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" + "@babel/traverse" "^7.14.0" "@babel/types" "^7.0.0" absolute-path "^0.0.0" + accepts "^1.3.7" async "^2.4.0" - babel-preset-fbjs "^3.3.0" - buffer-crc32 "^0.2.13" - chalk "^2.4.1" + chalk "^4.0.0" ci-info "^2.0.0" - concat-stream "^1.6.0" 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" + hermes-parser "0.4.7" image-size "^0.6.0" invariant "^2.2.4" - jest-haste-map "^24.9.0" - jest-worker "^24.9.0" - json-stable-stringify "^1.0.1" + jest-haste-map "^26.5.2" + jest-worker "^26.0.0" lodash.throttle "^4.1.1" - merge-stream "^1.0.1" - 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" + metro-babel-register "0.66.2" + metro-babel-transformer "0.66.2" + metro-cache "0.66.2" + metro-cache-key "0.66.2" + metro-config "0.66.2" + metro-core "0.66.2" + metro-hermes-compiler "0.66.2" + metro-inspector-proxy "0.66.2" + metro-minify-uglify "0.66.2" + metro-react-native-babel-preset "0.66.2" + metro-resolver "0.66.2" + metro-runtime "0.66.2" + metro-source-map "0.66.2" + metro-symbolicate "0.66.2" + metro-transform-plugins "0.66.2" + metro-transform-worker "0.66.2" + mime-types "^2.1.27" mkdirp "^0.5.1" node-fetch "^2.2.0" nullthrows "^1.1.1" - resolve "^1.5.0" rimraf "^2.5.4" serialize-error "^2.1.0" source-map "^0.5.6" - strip-ansi "^4.0.0" + strip-ansi "^6.0.0" temp "0.8.3" - throat "^4.1.0" - wordwrap "^1.0.0" + throat "^5.0.0" ws "^1.1.5" - xpipe "^1.0.5" - yargs "^14.2.0" + yargs "^15.3.1" micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" @@ -3196,17 +5103,17 @@ mime-db@1.46.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== -mime-db@~1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" - integrity sha1-oxtAcK2uon1zLqMzdApk0OyaZlk= +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== -mime-types@2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" - integrity sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw= +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.34: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "~1.23.0" + mime-db "1.51.0" mime-types@~2.1.24: version "2.1.29" @@ -3230,6 +5137,18 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.2, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -3277,11 +5196,6 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - mz@^2.4.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -3291,11 +5205,6 @@ mz@^2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.12.1: - version "2.14.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -3313,11 +5222,26 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -3328,13 +5252,12 @@ nocache@^2.1.0: resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" + minimatch "^3.0.2" node-fetch@^2.2.0, node-fetch@^2.6.0: version "2.6.1" @@ -3351,16 +5274,43 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= +node-notifier@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" + integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" + node-releases@^1.1.70: version "1.1.71" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" + integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== + node-stream-zip@^1.9.1: version "1.13.2" resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.13.2.tgz#2fce9d001fa7fda943a906eff239eb83fda124ba" integrity sha512-159NUO3quDIRVSVOQiQ/0VG8NFrGvVyUa+MUUleiOys3NLtrGtNkodqYYTRHU/kiXu/ygHZcNy/tZ4NUCcDUmQ== +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -3368,6 +5318,11 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -3375,17 +5330,29 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + nullthrows@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -ob1@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.59.0.tgz#ee103619ef5cb697f2866e3577da6f0ecd565a36" - integrity sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ== +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +ob1@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.66.2.tgz#8caf548202cf2688944bae47db405a08bca17a61" + integrity sha512-RFewnL/RjE0qQBOuM+2bbY96zmJPIge/aDtsiDbLSb+MOiK8CReAhBHDgL+zrA3F1hQk00lMWpUwYcep750plA== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -3399,6 +5366,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -3411,7 +5383,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: +object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -3421,6 +5393,32 @@ object.assign@^4.1.0: has-symbols "^1.0.1" object-keys "^1.1.1" +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" + integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.19.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -3428,6 +5426,15 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -3454,6 +5461,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + open@^6.2.0: version "6.4.0" resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" @@ -3469,6 +5483,30 @@ open@^7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" @@ -3491,6 +5529,11 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +p-each-series@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" + integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -3522,6 +5565,13 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parent-require@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" @@ -3535,10 +5585,15 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@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" parse5-htmlparser2-tree-adapter@^6.0.0: version "6.0.1" @@ -3547,16 +5602,16 @@ parse5-htmlparser2-tree-adapter@^6.0.0: dependencies: parse5 "^6.0.1" +parse5@6.0.1, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parse5@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -3606,11 +5661,31 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + picomatch@^2.0.5: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" @@ -3628,6 +5703,11 @@ pirates@^4.0.0: dependencies: node-modules-regexp "^1.0.0" +pirates@^4.0.1: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -3635,6 +5715,13 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" @@ -3651,53 +5738,60 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= +plist@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.4.tgz#a62df837e3aed2bb3b735899d510c4f186019cbe" + integrity sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg== dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" + base64-js "^1.5.1" + xmlbuilder "^9.0.7" posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" + fast-diff "^1.1.2" -pretty-format@^25.1.0, pretty-format@^25.2.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== +prettier@^2.0.2: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +pretty-format@^26.5.2, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== dependencies: - "@jest/types" "^25.5.0" + "@jest/types" "^26.6.2" ansi-regex "^5.0.0" ansi-styles "^4.0.0" - react-is "^16.12.0" + react-is "^17.0.1" process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== promise@^8.0.3: version "8.1.0" @@ -3706,7 +5800,15 @@ promise@^8.0.3: dependencies: asap "~2.0.6" -prop-types@^15.6.2, prop-types@^15.7.2: +prompts@^2.0.1, prompts@^2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -3715,10 +5817,19 @@ prop-types@^15.6.2, prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== pump@^3.0.0: version "3.0.0" @@ -3728,72 +5839,130 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -react-devtools-core@^4.6.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.10.1.tgz#6d57db291aeac9cc45ef9fb4636dd2ab97490daf" - integrity sha512-sXbBjGAWcf9HAblTP/zMtFhGHqxAfIR+GPxONZsSGN9FHnF4635dx1s2LdQWG9rJ+Ehr3nWg+BUAB6P78my5PA== +react-devtools-core@4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.19.1.tgz#bc37c2ef2f48f28c6af4c7292be9dca1b63deace" + integrity sha512-2wJiGffPWK0KggBjVwnTaAk+Z3MSxKInHmdzPTrBh1mAarexsa93Kw+WMX88+XjN+TtYgAiLe9xeTqcO5FfJTw== dependencies: shell-quote "^1.6.1" ws "^7" -react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4: +"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^16.13.1, react-is@^16.8.1: 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@0.63.4: - version "0.63.4" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.4.tgz#2210fdd404c94a5fa6b423c6de86f8e48810ec36" - integrity sha512-I4kM8kYO2mWEYUFITMcpRulcy4/jd+j9T6PbIzR0FuMcz/xwd+JwHoLPa1HmCesvR1RDOw9o4D+OFLwuXXfmGw== +react-native-codegen@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.0.8.tgz#b7796a54074139d956fff2862cf1285db43c891b" + integrity sha512-k/944+0XD+8l7zDaiKfYabyEKmAmyZgS1mj+4LcSRPyHnrjgCHKrh/Y6jM6kucQ6xU1+1uyMmF/dSkikxK8i+Q== dependencies: - "@babel/runtime" "^7.0.0" - "@react-native-community/cli" "^4.10.0" - "@react-native-community/cli-platform-android" "^4.10.0" - "@react-native-community/cli-platform-ios" "^4.10.0" + flow-parser "^0.121.0" + jscodeshift "^0.11.0" + nullthrows "^1.1.1" + +react-native@0.67.3: + version "0.67.3" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.67.3.tgz#ee8bafb644afbe511a4a2c8e9c144a9720d06dd8" + integrity sha512-epMVRMRH7dLCis97+YwiV4dmTVZO6qKmQgwcTNcxVt/kEMxAa+OYK7h81+99/n7XCeMFk/U2zYOBuQqc7c5Amg== + dependencies: + "@jest/create-cache-key-function" "^27.0.1" + "@react-native-community/cli" "^6.0.0" + "@react-native-community/cli-platform-android" "^6.0.0" + "@react-native-community/cli-platform-ios" "^6.0.0" + "@react-native/assets" "1.0.0" + "@react-native/normalize-color" "2.0.0" + "@react-native/polyfills" "2.0.0" abort-controller "^3.0.0" anser "^1.4.9" base64-js "^1.1.2" event-target-shim "^5.0.1" - fbjs "^1.0.0" - fbjs-scripts "^1.1.0" - hermes-engine "~0.5.0" + hermes-engine "~0.9.0" invariant "^2.2.4" - jsc-android "^245459.0.0" - metro-babel-register "0.59.0" - metro-react-native-babel-transformer "0.59.0" - metro-source-map "0.59.0" + jsc-android "^250230.2.1" + metro-react-native-babel-transformer "0.66.2" + metro-runtime "0.66.2" + metro-source-map "0.66.2" nullthrows "^1.1.1" - pretty-format "^24.9.0" + pretty-format "^26.5.2" promise "^8.0.3" prop-types "^15.7.2" - react-devtools-core "^4.6.0" + react-devtools-core "4.19.1" + react-native-codegen "^0.0.8" react-refresh "^0.4.0" regenerator-runtime "^0.13.2" - scheduler "0.19.1" + scheduler "^0.20.2" stacktrace-parser "^0.1.3" use-subscription "^1.0.0" whatwg-fetch "^3.0.0" + ws "^6.1.4" react-refresh@^0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== -react@16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" - integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== +react-shallow-renderer@^16.13.1: + version "16.14.1" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz#bf0d02df8a519a558fd9b8215442efa5c840e124" + integrity sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0" + +react-test-renderer@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-17.0.2.tgz#4cd4ae5ef1ad5670fc0ef776e8cc7e1231d9866c" + integrity sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ== + dependencies: + object-assign "^4.1.1" + react-is "^17.0.2" + react-shallow-renderer "^16.13.1" + scheduler "^0.20.2" + +react@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" -readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -3806,6 +5975,21 @@ readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw= + +recast@^0.20.3: + version "0.20.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" + integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== + dependencies: + ast-types "0.14.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + reflect-metadata@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" @@ -3843,6 +6027,19 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp.prototype.flags@^1.3.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" + integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + regexpu-core@^4.7.1: version "4.7.1" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" @@ -3893,21 +6090,47 @@ require-main-filename@^2.0.0: integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== reselect@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" - integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== + version "4.1.5" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.5.tgz#852c361247198da6756d07d9296c2b51eddb79f6" + integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.13.1, resolve@^1.14.2, resolve@^1.5.0: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.18.1: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^1.14.2: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -3915,6 +6138,14 @@ resolve@^1.13.1, resolve@^1.14.2, resolve@^1.5.0: is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -3928,6 +6159,13 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +rimraf@2.6.3, rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -3935,6 +6173,13 @@ rimraf@^2.5.4, rimraf@^2.6.3: dependencies: glob "^7.1.3" +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -3945,23 +6190,6 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -3979,7 +6207,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -4004,29 +6232,43 @@ sax@>=0.6.0, sax@^1.2.1: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^5.1.0, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.2.1, semver@^7.3.2: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -4076,11 +6318,6 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - setprototypeof@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" @@ -4101,11 +6338,23 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shell-quote@1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" @@ -4121,6 +6370,20 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -4135,6 +6398,11 @@ simple-plist@^1.0.0: bplist-parser "0.2.0" plist "^3.0.1" +sisteransi@^1.0.5: + 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" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -4145,7 +6413,7 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.0.0: +slice-ansi@^2.0.0, slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== @@ -4203,6 +6471,14 @@ source-map-support@^0.5.16: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" @@ -4213,7 +6489,7 @@ source-map@^0.5.0, source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -4223,6 +6499,32 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -4235,10 +6537,10 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -stack-utils@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.4.tgz#4b600971dcfc6aed0cbdf2a8268177cc916c87c8" - integrity sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w== +stack-utils@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: escape-string-regexp "^2.0.0" @@ -4272,15 +6574,15 @@ stream-buffers@~2.2.0: resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + char-regex "^1.0.2" + strip-ansi "^6.0.0" -string-width@^3.0.0, string-width@^3.1.0: +string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -4298,6 +6600,36 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.matchall@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -4312,13 +6644,6 @@ strip-ansi@^3.0.0: dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -4333,11 +6658,26 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + sudo-prompt@^9.0.0: version "9.2.1" resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" @@ -4355,20 +6695,41 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + temp@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" @@ -4377,6 +6738,35 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" +temp@^0.8.1: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" @@ -4391,12 +6781,12 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -throat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -through2@^2.0.0, through2@^2.0.1: +through2@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -4404,16 +6794,6 @@ through2@^2.0.0, through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -4468,20 +6848,89 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tslib@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== +tsutils@^3.17.1: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" typeorm@^0.2.36: version "0.2.36" @@ -4506,11 +6955,6 @@ typeorm@^0.2.36: yargs "^17.0.1" zen-observable-ts "^1.0.0" -ua-parser-js@^0.7.18: - version "0.7.24" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.24.tgz#8d3ecea46ed4f1f1d63ec25f17d8568105dc027c" - integrity sha512-yo+miGzQx5gakzVK3QFfN0/L9uVhosXBBO7qmnk7c2iw1IhL212wfA3zbnI54B0obGwC/5NWub/iT9sReMx+Fw== - uglify-es@^3.1.9: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" @@ -4524,6 +6968,16 @@ ultron@1.0.x: resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + 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@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -4557,7 +7011,7 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -universalify@^0.1.0: +universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -4575,6 +7029,13 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -4607,6 +7068,33 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" + integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -4617,6 +7105,20 @@ vlq@^1.0.0: resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -4631,11 +7133,53 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.0.0: version "3.6.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + 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@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -4648,19 +7192,17 @@ which@^1.2.9: dependencies: isexe "^2.0.0" -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + isexe "^2.0.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wrap-ansi@^6.2.0: version "6.2.0" @@ -4685,6 +7227,32 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + ws@^1.1.0, ws@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" @@ -4693,11 +7261,23 @@ ws@^1.1.0, ws@^1.1.5: options ">=0.0.5" ultron "1.0.x" +ws@^6.1.4: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + ws@^7: version "7.4.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== +ws@^7.4.6: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + xcode@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" @@ -4706,6 +7286,11 @@ xcode@^2.0.0: simple-plist "^1.0.0" uuid "^3.3.2" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xml2js@^0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" @@ -4724,6 +7309,11 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + xmldoc@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.1.2.tgz#6666e029fe25470d599cd30e23ff0d1ed50466d7" @@ -4736,11 +7326,6 @@ xmldom@0.1.x: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== -xpipe@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf" - integrity sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98= - xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -4756,10 +7341,10 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yargonaut@^1.1.4: version "1.1.4" @@ -4770,14 +7355,6 @@ yargonaut@^1.1.4: figlet "^1.1.1" parent-require "^1.0.0" -yargs-parser@^15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" - integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -4791,24 +7368,7 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== -yargs@^14.2.0: - version "14.2.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" - integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== - dependencies: - 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@^15.1.0: +yargs@^15.1.0, yargs@^15.3.1, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== diff --git a/package.json b/package.json index bcceeb8..91293c8 100644 --- a/package.json +++ b/package.json @@ -48,28 +48,24 @@ "registry": "https://registry.npmjs.org/" }, "devDependencies": { - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-decorators": "^7.13.5", - "@commitlint/config-conventional": "^11.0.0", - "@react-native-community/eslint-config": "^2.0.0", - "@release-it/conventional-changelog": "^2.0.0", + "@commitlint/config-conventional": "^15.0.0", + "@react-native-community/eslint-config": "^3.0.1", + "@release-it/conventional-changelog": "^3.3.0", "@types/jest": "^26.0.0", - "@types/react": "^16.9.19", - "@types/react-native": "0.62.13", - "babel-plugin-transform-typescript-metadata": "^0.3.1", + "@types/react": "17.0.2", + "@types/react-native": "0.66.3", "commitlint": "^11.0.0", - "eslint": "^7.2.0", - "eslint-config-prettier": "^7.0.0", - "eslint-plugin-prettier": "^3.1.3", - "husky": "^4.2.5", + "eslint": "^7.32.0", + "eslint-config-prettier": "^7.2.0", + "eslint-plugin-prettier": "^4.0.0", + "husky": "^6.0.0", "jest": "^26.0.1", - "pod-install": "^0.1.0", - "prettier": "^2.0.5", - "react": "16.13.1", - "react-native": "0.63.4", - "react-native-builder-bob": "^0.17.1", + "pod-install": "^0.1.32", + "react": "17.0.2", + "react-native": "0.66.3", + "react-native-builder-bob": "^0.18.2", "release-it": "^14.2.2", - "typescript": "^4.1.3" + "typescript": "^4.5.2" }, "peerDependencies": { "react": "*", diff --git a/src/index.ts b/src/index.ts index f235acb..4027fe5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,10 @@ +import { NativeModules } from 'react-native'; + +const SequelModule = NativeModules.QuickSQLite; + +if (SequelModule && typeof SequelModule.install === 'function') { + SequelModule.install(); +} /** * JSI BINDINGS DO NOT WORK WHEN CONNECTED TO THE CHROME DEBUGGER * Use flipper to debug your RN apps from now on @@ -14,6 +21,7 @@ * * @interface QueryResult */ + interface QueryResult { status?: 0 | 1; insertId?: number; diff --git a/yarn.lock b/yarn.lock index d268f51..d3bfe5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" + integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.0" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -16,12 +23,24 @@ dependencies: "@babel/highlight" "^7.12.13" +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + "@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.5": version "7.13.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.5.tgz#1e3b9043df6e3f5cfa750854adeb0c7a222d15a8" integrity sha512-+c3G3S8n5ziRyfLybmgm9Y6KgoCni+s0hkV0I5bIpGWhu8uqEQo/VGnETY8YS6PFwedAoXOqfe4FhrvbtsLu+Q== -"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.7.5": +"@babel/compat-data@^7.16.4": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" + integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== + +"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.7.5": version "7.13.1" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.1.tgz#7ddd027176debe40f13bb88bac0c21218c5b1ecf" integrity sha512-FzeKfFBG2rmFtGiiMdXZPFt/5R5DXubVi82uYhjGX4Msf+pgYQMCFIqFXZWs5vbIYbf14VeBIgdGI03CDOOM1w== @@ -43,7 +62,28 @@ semver "7.0.0" source-map "^0.5.0" -"@babel/generator@^7.13.0", "@babel/generator@^7.5.0": +"@babel/core@^7.1.6", "@babel/core@^7.14.0": + version "7.17.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" + integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.17.2" + "@babel/parser" "^7.17.3" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + +"@babel/generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.0.tgz#bd00d4394ca22f220390c56a0b5b85568ec1ec0c" integrity sha512-zBZfgvBB/ywjx0Rgc2+BwoH/3H+lDtlgD4hBOpEv5LxRnYsm/753iRuLepqnYlynpjC3AdQxtxsoeHJoEEwOAw== @@ -52,6 +92,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.14.0", "@babel/generator@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" + integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -59,6 +108,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" @@ -77,6 +133,16 @@ browserslist "^4.14.5" semver "7.0.0" +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.0.tgz#28d04ad9cfbd1ed1d8b988c9ea7b945263365846" @@ -88,6 +154,19 @@ "@babel/helper-replace-supers" "^7.13.0" "@babel/helper-split-export-declaration" "^7.12.13" +"@babel/helper-create-class-features-plugin@^7.16.7": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" + integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-create-regexp-features-plugin@^7.12.13": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" @@ -110,6 +189,13 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" @@ -126,6 +212,15 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -133,6 +228,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-hoist-variables@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" @@ -141,6 +243,13 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-member-expression-to-functions@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" @@ -148,6 +257,13 @@ dependencies: "@babel/types" "^7.13.0" +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-module-imports@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" @@ -155,6 +271,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-module-transforms@^7.12.13", "@babel/helper-module-transforms@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" @@ -170,6 +293,20 @@ "@babel/types" "^7.13.0" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.16.7": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0" + integrity sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -177,11 +314,23 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== +"@babel/helper-plugin-utils@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + "@babel/helper-remap-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" @@ -191,6 +340,15 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + "@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" @@ -201,6 +359,17 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-simple-access@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" @@ -208,6 +377,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -215,6 +391,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-split-export-declaration@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" @@ -222,16 +405,33 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + "@babel/helper-wrap-function@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" @@ -242,6 +442,16 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + "@babel/helpers@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.0.tgz#7647ae57377b4f0408bf4f8a7af01c42e41badc0" @@ -251,6 +461,15 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helpers@^7.17.2": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" + integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.0" + "@babel/types" "^7.17.0" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" @@ -260,17 +479,24 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.0", "@babel/parser@^7.7.0": +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.0", "@babel/parser@^7.7.0": version "7.13.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.4.tgz#340211b0da94a351a6f10e63671fa727333d13ab" integrity sha512-uvoOulWHhI+0+1f9L4BoozY7U5cIkZ9PgJqvb041d6vypgUmtVPG4vmGm4pSggjl8BELzvHyUeJSUyEMY6b+qA== -"@babel/plugin-external-helpers@^7.0.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.13.tgz#65ef9f4576297250dc601d2aa334769790d9966d" - integrity sha512-ClvAsk4RqpE6iacYUjdU9PtvIwC9yAefZENsPfGeG5FckX3jFZLDlWPuyv5gi9/9C2VgwX6H8q1ukBifC0ha+Q== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" +"@babel/parser@^7.1.6", "@babel/parser@^7.14.0", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" + integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== "@babel/plugin-proposal-async-generator-functions@^7.13.5": version "7.13.5" @@ -289,14 +515,13 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-decorators@^7.13.5": - version "7.13.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.5.tgz#d28071457a5ba8ee1394b23e38d5dcf32ea20ef7" - integrity sha512-i0GDfVNuoapwiheevUOuSW67mInqJ8qw7uWfpjNVeHMn143kXblEy/bmL9AdZ/0yf/4BMQeWXezK0tQIvNPqag== +"@babel/plugin-proposal-class-properties@^7.1.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-decorators" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-proposal-dynamic-import@^7.12.17": version "7.12.17" @@ -346,6 +571,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.1.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" @@ -380,6 +613,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" +"@babel/plugin-proposal-optional-chaining@^7.1.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-methods@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" @@ -417,13 +659,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-decorators@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" - integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -452,6 +687,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-flow@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" + integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -529,6 +771,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-typescript@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" @@ -536,6 +785,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-async-to-generator@^7.0.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-transform-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" @@ -617,6 +875,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-flow" "^7.12.13" +"@babel/plugin-transform-flow-strip-types@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" + integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-flow" "^7.16.7" + "@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" @@ -665,6 +931,16 @@ "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.1.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-systemjs@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" @@ -845,6 +1121,15 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-typescript" "^7.12.13" +"@babel/plugin-transform-typescript@^7.16.7": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" + integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-typescript" "^7.16.7" + "@babel/plugin-transform-unicode-escapes@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" @@ -934,6 +1219,15 @@ core-js-compat "^3.9.0" semver "7.0.0" +"@babel/preset-flow@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.16.7.tgz#7fd831323ab25eeba6e4b77a589f680e30581cbd" + integrity sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-flow-strip-types" "^7.16.7" + "@babel/preset-flow@^7.12.1": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.12.13.tgz#71ee7fe65a95b507ac12bcad65a4ced27d8dfc3e" @@ -964,6 +1258,15 @@ "@babel/plugin-transform-react-jsx-development" "^7.12.12" "@babel/plugin-transform-react-pure-annotations" "^7.12.1" +"@babel/preset-typescript@^7.1.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" + integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.16.7" + "@babel/preset-typescript@^7.12.7": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz#ab107e5f050609d806fbb039bec553b33462c60a" @@ -984,7 +1287,7 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.8.4": version "7.13.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.4.tgz#a2f5b5304d6f98a94053e6737321501347325617" integrity sha512-pZLFG10nRL1hPF9J0/WdxjVuLEanSge8W3Ct+Kls9fNhD4vOi9bhuAU8DdNARvBE9GTg6UhQFcEIF1XhIZd9ZA== @@ -1000,7 +1303,16 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4": +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== @@ -1015,6 +1327,22 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" + integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.3" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.13.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" @@ -1024,6 +1352,14 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1055,10 +1391,10 @@ resolve-global "1.0.0" yargs "^15.1.0" -"@commitlint/config-conventional@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz#3fa300a1b639273946de3c3f15e1cda518333422" - integrity sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA== +"@commitlint/config-conventional@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-15.0.0.tgz#3bf1adf319e3b431de12ba82dc399524038b2d8f" + integrity sha512-eZBRL8Lk3hMNHp1wUMYj0qrZQEsST1ai7KHR8J1IDD9aHgT7L2giciibuQ+Og7vxVhR5WtYDvh9xirXFVPaSkQ== dependencies: conventional-changelog-conventionalcommits "^4.3.1" @@ -1173,53 +1509,46 @@ resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== -"@eslint/eslintrc@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" - integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" debug "^4.1.1" espree "^7.3.0" - globals "^12.1.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" - lodash "^4.17.20" minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== - -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== +"@hapi/hoek@^9.0.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== -"@hapi/joi@^15.0.3": - version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" + "@hapi/hoek" "^9.0.0" -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: - "@hapi/hoek" "^8.3.0" + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@iarna/toml@2.2.5": version "2.2.5" @@ -1242,15 +1571,6 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - "@jest/console@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" @@ -1297,6 +1617,13 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/create-cache-key-function@^27.0.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" + integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== + dependencies: + "@jest/types" "^27.5.1" + "@jest/environment@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" @@ -1307,15 +1634,6 @@ "@types/node" "*" jest-mock "^26.6.2" -"@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - "@jest/fake-timers@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" @@ -1369,15 +1687,6 @@ optionalDependencies: node-notifier "^8.0.0" -"@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - "@jest/source-map@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" @@ -1387,15 +1696,6 @@ graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@jest/test-result@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" @@ -1438,25 +1738,6 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" - "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" @@ -1468,6 +1749,35 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" + integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" + integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -1591,31 +1901,31 @@ dependencies: "@octokit/openapi-types" "^5.1.0" -"@react-native-community/cli-debugger-ui@^4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz#07de6d4dab80ec49231de1f1fbf658b4ad39b32c" - integrity sha512-UFnkg5RTq3s2X15fSkrWY9+5BKOFjihNSnJjTV2H5PtTUFbd55qnxxPw8CxSfK0bXb1IrSvCESprk2LEpqr5cg== +"@react-native-community/cli-debugger-ui@^6.0.0-rc.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-6.0.0.tgz#ef9eb1268d85c1bd3caf2c4d36dc350bb080f254" + integrity sha512-onf6vtvqSzOr6bNEWhPzgcJP2UQhA0VY6c8tXwNczIONC/ahnN93LPBB/uXDbn9d/kLMvE7oUJiqRadZWHk6aA== dependencies: serve-static "^1.13.1" -"@react-native-community/cli-hermes@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz#6243ed9c709dad5e523f1ccd7d21066b32f2899d" - integrity sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ== +"@react-native-community/cli-hermes@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-6.3.0.tgz#92b2f07d08626a60f6893c3e3d57c1538c8fb5a7" + integrity sha512-Uhbm9bubyZLZ12vFCIfWbE/Qi3SBTbYIN/TC08EudTLhv/KbPomCQnmFsnJ7AXQFuOZJs73mBxoEAYSbRbwyVA== dependencies: - "@react-native-community/cli-platform-android" "^4.13.0" - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" + "@react-native-community/cli-platform-android" "^6.3.0" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" hermes-profile-transformer "^0.0.6" ip "^1.1.5" -"@react-native-community/cli-platform-android@^4.10.0", "@react-native-community/cli-platform-android@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz#922681ec82ee1aadd993598b814df1152118be02" - integrity sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA== +"@react-native-community/cli-platform-android@^6.0.0", "@react-native-community/cli-platform-android@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-6.3.0.tgz#ab7d156bd69a392493323eeaba839a874c0e201f" + integrity sha512-d5ufyYcvrZoHznYm5bjBXaiHIJv552t5gYtQpnUsxBhHSQ8QlaNmlLUyeSPRDfOw4ND9b0tPHqs4ufwx6vp/fQ== dependencies: - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" execa "^1.0.0" fs-extra "^8.1.0" glob "^7.1.3" @@ -1625,63 +1935,85 @@ slash "^3.0.0" xmldoc "^1.1.2" -"@react-native-community/cli-platform-ios@^4.10.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz#a738915c68cac86df54e578b59a1311ea62b1aef" - integrity sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA== +"@react-native-community/cli-platform-ios@^6.0.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-6.2.0.tgz#ceaa23995511a8e400b506632ac7e6a66a17ec2a" + integrity sha512-k15MhExxLiLDDZOeuPgvTxbp0CsoLQQpk2Du0HjZDePqqWcKJylQqMZru1o8HuQHPcEr+b71HIs5V+lKyFYpfg== dependencies: - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" glob "^7.1.3" js-yaml "^3.13.1" lodash "^4.17.15" - plist "^3.0.1" + ora "^3.4.0" + plist "^3.0.2" xcode "^2.0.0" -"@react-native-community/cli-server-api@^4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz#bee7ee9702afce848e9d6ca3dcd5669b99b125bd" - integrity sha512-vQzsFKD9CjHthA2ehTQX8c7uIzlI9A7ejaIow1I9RlEnLraPH2QqVDmzIdbdh5Od47UPbRzamCgAP8Bnqv3qwQ== - dependencies: - "@react-native-community/cli-debugger-ui" "^4.13.1" - "@react-native-community/cli-tools" "^4.13.0" +"@react-native-community/cli-plugin-metro@^6.4.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-6.4.0.tgz#70b7908d6b548481f37ed58167f9460d325ae21c" + integrity sha512-lcrNODvHd3ZVhiEshXAjyBoqP44rjhkytkOSUpnZHAcmMLiguxDmvhWeWqbwu3XqSX/f0gVKmfj81t+opI1bSw== + dependencies: + "@react-native-community/cli-server-api" "^6.4.0" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" + metro "^0.66.1" + metro-config "^0.66.1" + metro-core "^0.66.1" + metro-react-native-babel-transformer "^0.66.1" + metro-resolver "^0.66.1" + metro-runtime "^0.66.1" + readline "^1.3.0" + +"@react-native-community/cli-server-api@^6.4.0": + version "6.4.3" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-6.4.3.tgz#b52444454f40bfb54a84ab52bf42e9f8002917f5" + integrity sha512-Ywy2x+PhIUZXgE74YiCYXylSVnuEBcq5cNfYLR3AwOvrILjh03smXfCca8s2V2LWUlzmWN6+L85FJGsT92MUJA== + dependencies: + "@react-native-community/cli-debugger-ui" "^6.0.0-rc.0" + "@react-native-community/cli-tools" "^6.2.0" compression "^1.7.1" connect "^3.6.5" errorhandler "^1.5.0" nocache "^2.1.0" - pretty-format "^25.1.0" + pretty-format "^26.6.2" serve-static "^1.13.1" ws "^1.1.0" -"@react-native-community/cli-tools@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz#b406463d33af16cedc4305a9a9257ed32845cf1b" - integrity sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg== +"@react-native-community/cli-tools@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-6.2.0.tgz#8f4adc2d83ab96e5654348533c8fa602742c4fce" + integrity sha512-08ssz4GMEnRxC/1FgTTN/Ud7mExQi5xMphItPjfHiTxpZPhrFn+IMx6mya0ncFEhhxQ207wYlJMRLPRRdBZ8oA== dependencies: - chalk "^3.0.0" + appdirsjs "^1.2.4" + chalk "^4.1.2" lodash "^4.17.15" mime "^2.4.1" node-fetch "^2.6.0" open "^6.2.0" + semver "^6.3.0" shell-quote "1.6.1" -"@react-native-community/cli-types@^4.10.1": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.10.1.tgz#d68a2dcd1649d3b3774823c64e5e9ce55bfbe1c9" - integrity sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ== - -"@react-native-community/cli@^4.10.0": - version "4.14.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.14.0.tgz#bb106a98341bfa2db36060091ff90bfe82ea4f55" - integrity sha512-EYJKBuxFxAu/iwNUfwDq41FjORpvSh1wvQ3qsHjzcR5uaGlWEOJrd3uNJDuKBAS0TVvbEesLF9NEXipjyRVr4Q== - dependencies: - "@hapi/joi" "^15.0.3" - "@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" +"@react-native-community/cli-types@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-6.0.0.tgz#90269fbdc7229d5e3b8f2f3e029a94083551040d" + integrity sha512-K493Fk2DMJC0ZM8s8gnfseKxGasIhuDaCUDeLZcoCSFlrjKEuEs1BKKEJiev0CARhKEXKOyyp/uqYM9nWhisNw== + dependencies: + ora "^3.4.0" + +"@react-native-community/cli@^6.0.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-6.4.0.tgz#0b61a4b5f11293b0b79a0e78f80777387a9529a9" + integrity sha512-UNvYnWaALa4mJEaWdLY3fVK+csZzx/Ja/FGvXISPJ9W9lrKvGtyXkidViUCPbPtMsJUi7teA4uIShHn0mbGmnQ== + dependencies: + "@react-native-community/cli-debugger-ui" "^6.0.0-rc.0" + "@react-native-community/cli-hermes" "^6.3.0" + "@react-native-community/cli-plugin-metro" "^6.4.0" + "@react-native-community/cli-server-api" "^6.4.0" + "@react-native-community/cli-tools" "^6.2.0" + "@react-native-community/cli-types" "^6.0.0" + appdirsjs "^1.2.4" + chalk "^4.1.2" command-exists "^1.2.8" commander "^2.19.0" cosmiconfig "^5.1.0" @@ -1692,33 +2024,28 @@ fs-extra "^8.1.0" glob "^7.1.3" graceful-fs "^4.1.3" - inquirer "^3.0.6" + joi "^17.2.1" leven "^3.1.0" lodash "^4.17.15" - 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" ora "^3.4.0" - pretty-format "^25.2.0" + pretty-format "^26.6.2" + prompts "^2.4.0" semver "^6.3.0" serve-static "^1.13.1" strip-ansi "^5.2.0" sudo-prompt "^9.0.0" wcwidth "^1.0.1" -"@react-native-community/eslint-config@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/eslint-config/-/eslint-config-2.0.0.tgz#35dcc529a274803fc4e0a6b3d6c274551fb91774" - integrity sha512-vHaMMfvMp9BWCQQ0lNIXibOJTcXIbYUQ8dSUsMOsrXgVkeVQJj88OwrKS00rQyqwMaC4/a6HuDiFzYUkGKOpVg== +"@react-native-community/eslint-config@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@react-native-community/eslint-config/-/eslint-config-3.0.1.tgz#c45968f1214139fe747a7aebdba06c4fa2a4d018" + integrity sha512-h0MRsaHkyfoQjEiTjG3a+Ie/p6AmQNAHXpYrVhtYMZNRF26TCwNOsQNp4/13QhKAq6vhS8EJppge0P43GnPmfQ== dependencies: "@react-native-community/eslint-plugin" "^1.1.0" - "@typescript-eslint/eslint-plugin" "^3.1.0" - "@typescript-eslint/parser" "^3.1.0" + "@typescript-eslint/eslint-plugin" "^4.22.1" + "@typescript-eslint/parser" "^4.22.1" babel-eslint "^10.1.0" eslint-config-prettier "^6.10.1" eslint-plugin-eslint-comments "^3.1.2" @@ -1726,8 +2053,8 @@ eslint-plugin-jest "22.4.1" eslint-plugin-prettier "3.1.2" eslint-plugin-react "^7.20.0" - eslint-plugin-react-hooks "^4.0.4" - eslint-plugin-react-native "^3.8.1" + eslint-plugin-react-hooks "^4.0.7" + eslint-plugin-react-native "^3.10.0" prettier "^2.0.2" "@react-native-community/eslint-plugin@^1.1.0": @@ -1735,16 +2062,48 @@ resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.1.0.tgz#e42b1bef12d2415411519fd528e64b593b1363dc" integrity sha512-W/J0fNYVO01tioHjvYWQ9m6RgndVtbElzYozBq1ZPrHO/iCzlqoySHl4gO/fpCl9QEFjvJfjPgtPMTMlsoq5DQ== -"@release-it/conventional-changelog@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@release-it/conventional-changelog/-/conventional-changelog-2.0.1.tgz#bdd52ad3ecc0d6e39d637592d6ea2bd6d28e5ecb" - integrity sha512-q67D3Jod935kZt6wThsDeOmhY+RWYPMY7nYyl0YxiXK8vVZzD+9z957fXGz+8Uk3iugmgDaucht7VxTaZlu6nA== +"@react-native/assets@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" + integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== + +"@react-native/normalize-color@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-1.0.0.tgz#c52a99d4fe01049102d47dc45d40cbde4f720ab6" + integrity sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg== + +"@react-native/polyfills@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" + integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== + +"@release-it/conventional-changelog@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@release-it/conventional-changelog/-/conventional-changelog-3.3.0.tgz#0f79e4b736412040d37c2b84bf433e393268c08e" + integrity sha512-pchCHf+wNpn15oj2hau4gisFKQat/01JuTzAwlGsQE83ZUBknU4dRlPA3xf5F5f3K70VVTQ3lx4/lgQvR+zxww== dependencies: concat-stream "^2.0.0" conventional-changelog "^3.1.24" conventional-recommended-bump "^6.1.0" prepend-file "^2.0.0" +"@sideway/address@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.3.tgz#d93cce5d45c5daec92ad76db492cc2ee3c64ab27" + integrity sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -1826,11 +2185,6 @@ "@types/node" "*" "@types/responselike" "*" -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/graceful-fs@^4.1.2": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" @@ -1855,14 +2209,6 @@ dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - "@types/istanbul-reports@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" @@ -1878,10 +2224,10 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/json-schema@^7.0.3": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json-schema@^7.0.7": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/keyv@*": version "3.1.1" @@ -1920,14 +2266,14 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/react-native@0.62.13": - version "0.62.13" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.62.13.tgz#c688c5ae03e426f927f7e1fa1a59cd067f35d1c2" - integrity sha512-hs4/tSABhcJx+J8pZhVoXHrOQD89WFmbs8QiDLNSA9zNrD46pityAuBWuwk1aMjPk9I3vC5ewkJroVRHgRIfdg== +"@types/react-native@0.66.3": + version "0.66.3" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.66.3.tgz#a9910e973d1273a3d8d28433ecbf31e64241a22f" + integrity sha512-ZJmd4R36dPmgm5I0lEcR/1wCPH31Lwqz2ApDmvNXPow2ssoF5EO7NlNMG6hsROBbzYSf5U0DPVDAyW39VzvuAA== dependencies: "@types/react" "*" -"@types/react@*": +"@types/react@*", "@types/react@17.0.2": version "17.0.2" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.2.tgz#3de24c4efef902dd9795a49c75f760cbe4f7a5a8" integrity sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA== @@ -1935,14 +2281,6 @@ "@types/prop-types" "*" csstype "^3.0.2" -"@types/react@^16.9.19": - version "16.14.4" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.4.tgz#365f6a1e117d1eec960ba792c7e1e91ecad38e6f" - integrity sha512-ETj7GbkPGjca/A4trkVeGvoIakmLV6ZtX3J8dcmOpzKzWVybbrOxanwaIPG71GZwImoMDY6Fq4wIe34lEqZ0FQ== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - "@types/responselike@*", "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" @@ -1950,11 +2288,6 @@ dependencies: "@types/node" "*" -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - "@types/stack-utils@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" @@ -1965,13 +2298,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== -"@types/yargs@^13.0.0": - version "13.0.11" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" - integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^15.0.0": version "15.0.13" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" @@ -1979,65 +2305,82 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^3.1.0": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" - integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== dependencies: - "@typescript-eslint/experimental-utils" "3.10.1" - debug "^4.1.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" - integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@^3.1.0": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" - integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.10.1" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/types@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" - integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== + "@types/yargs-parser" "*" -"@typescript-eslint/typescript-estree@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" - integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== +"@typescript-eslint/eslint-plugin@^4.22.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" + integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== dependencies: - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/visitor-keys" "3.10.1" - debug "^4.1.1" - glob "^7.1.6" + "@typescript-eslint/experimental-utils" "4.33.0" + "@typescript-eslint/scope-manager" "4.33.0" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.22.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== + dependencies: + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + +"@typescript-eslint/typescript-estree@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" + semver "^7.3.5" + tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" - integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== dependencies: - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" JSONStream@^1.0.4: version "1.3.5" @@ -2064,6 +2407,14 @@ absolute-path@^0.0.0: resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" integrity sha1-p4di+9rftSl76ZsV01p4Wy8JW/c= +accepts@^1.3.7: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -2118,10 +2469,10 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^7.0.2: - version "7.1.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.1.tgz#1e6b37a454021fa9941713f38b952fc1c8d32a84" - integrity sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ== +ajv@^8.0.1: + version "8.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d" + integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2140,30 +2491,11 @@ ansi-align@^3.0.0: dependencies: string-width "^3.0.0" -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== - dependencies: - ansi-wrap "^0.1.0" - ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= - dependencies: - ansi-wrap "0.1.0" - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.2.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" @@ -2180,26 +2512,7 @@ ansi-fragments@^0.2.1: slice-ansi "^2.0.0" strip-ansi "^5.0.0" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= - dependencies: - ansi-wrap "0.1.0" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -2209,6 +2522,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2223,11 +2541,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2244,6 +2557,11 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" +appdirsjs@^1.2.4: + version "1.2.6" + resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.6.tgz#fccf9ee543315492867cacfcfd4a2b32257d30ac" + integrity sha512-D8wJNkqMCeQs3kLasatELsddox/Xqkhp+J07iXGyL54fVN7oc+nmNfYzGuCs1IEP6uBw+TfpuO3JKwc+lECy4w== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2251,29 +2569,16 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= - arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" @@ -2315,11 +2620,6 @@ array-reduce@~0.0.0: resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -2345,7 +2645,7 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asap@~2.0.3, asap@~2.0.6: +asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -2367,6 +2667,13 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-types@0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -2377,6 +2684,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + async-retry@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" @@ -2384,11 +2696,6 @@ async-retry@1.3.1: dependencies: retry "0.12.0" -async@0.9.x: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= - async@^2.4.0: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -2421,6 +2728,11 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + babel-eslint@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" @@ -2504,13 +2816,6 @@ babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== -babel-plugin-transform-typescript-metadata@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.1.tgz#d86599b7139131ba5e917f5f568d0c824a5cdfc3" - integrity sha512-thOuACZReULfLy7vh2o3/joYkkRerMKLBDmXy3ImCnkNUnxBmNw0uVa05JhhX0slluaEkio6OIFa7zPgaJdk6g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -2529,10 +2834,10 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541" - integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw== +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== dependencies: "@babel/plugin-proposal-class-properties" "^7.0.0" "@babel/plugin-proposal-object-rest-spread" "^7.0.0" @@ -2575,7 +2880,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1: +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -2610,13 +2915,6 @@ big-integer@^1.6.44: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -2701,6 +2999,17 @@ browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.3: escalade "^3.1.1" node-releases "^1.1.70" +browserslist@^4.17.5: + version "4.19.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.3.tgz#29b7caad327ecf2859485f696f9604214bedd383" + integrity sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg== + dependencies: + caniuse-lite "^1.0.30001312" + electron-to-chromium "^1.4.71" + escalade "^3.1.1" + node-releases "^2.0.2" + picocolors "^1.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -2708,11 +3017,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-crc32@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -2726,11 +3030,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -2851,6 +3150,11 @@ caniuse-lite@^1.0.30001181: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9" integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw== +caniuse-lite@^1.0.30001312: + version "1.0.30001313" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001313.tgz#a380b079db91621e1b7120895874e2fd62ed2e2f" + integrity sha512-rI1UN0koZUiKINjysQDuRi2VeSCce3bYJNmDcj3PIKREiAmjakugBul1QSkg/fPrlULYl6oWfGg3PbgOSY9X4Q== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -2871,7 +3175,7 @@ chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2880,10 +3184,10 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -2893,11 +3197,6 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -2957,25 +3256,11 @@ cli-spinners@^2.0.0, cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -3048,16 +3333,16 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - colorette@^1.0.7, colorette@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -3100,11 +3385,6 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -compare-versions@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" - integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== - component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -3135,16 +3415,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - concat-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" @@ -3358,11 +3628,6 @@ core-js-compat@^3.8.1, core-js-compat@^3.9.0: browserslist "^4.16.3" semver "7.0.0" -core-js@^2.4.1: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - core-js@^3.6.1: version "3.9.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.0.tgz#790b1bb11553a2272b36e2625c7179db345492f8" @@ -3394,15 +3659,6 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -3502,6 +3758,13 @@ debug@4.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "2.1.2" +debug@^4.3.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -3720,18 +3983,16 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.1.5: - version "3.1.6" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" - integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== - dependencies: - jake "^10.6.1" - electron-to-chromium@^1.3.649: version "1.3.672" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.672.tgz#3a6e335016dab4bc584d5292adc4f98f54541f6a" integrity sha512-gFQe7HBb0lbOMqK2GAS5/1F+B0IMdYiAgB9OT/w1F4M7lgJK2aNOMNOM622aEax+nS1cTMytkiT0uMOkbtFmHw== +electron-to-chromium@^1.4.71: + version "1.4.76" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.76.tgz#a0494baedaf51094b1c172999919becd9975a934" + integrity sha512-3Vftv7cenJtQb+k00McEBZ2vVmZ/x+HEF7pcZONZIkOsESqAqVuACmBxMv0JhzX7u0YltU0vSqRqgBSTAhFUjA== + emittery@^0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" @@ -3752,13 +4013,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -3854,6 +4108,11 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^1.14.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -3873,7 +4132,7 @@ eslint-config-prettier@^6.10.1: dependencies: get-stdin "^6.0.0" -eslint-config-prettier@^7.0.0: +eslint-config-prettier@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9" integrity sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg== @@ -3905,27 +4164,27 @@ eslint-plugin-prettier@3.1.2: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-prettier@^3.1.3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz#7079cfa2497078905011e6f82e8dd8453d1371b7" - integrity sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ== +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-react-hooks@^4.0.4: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" - integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== +eslint-plugin-react-hooks@^4.0.7: + version "4.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" + integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== eslint-plugin-react-native-globals@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== -eslint-plugin-react-native@^3.8.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.10.0.tgz#240f7e6979a908af3dfd9ba9652434c33f4d64cd" - integrity sha512-4f5+hHYYq5wFhB5eptkPEAR7FfvqbS7AzScUOANfAMZtYw5qgnCxRq45bpfBaQF+iyPMim5Q8pubcpvLv75NAg== +eslint-plugin-react-native@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.11.0.tgz#c73b0886abb397867e5e6689d3a6a418682e6bac" + integrity sha512-7F3OTwrtQPfPFd+VygqKA2VZ0f2fz0M4gJmry/TRE18JBb94/OtMxwbL7Oqwu7FGyrdeIOWnXQbBAveMcSTZIA== dependencies: "@babel/traverse" "^7.7.4" eslint-plugin-react-native-globals "^0.1.1" @@ -3947,7 +4206,7 @@ eslint-plugin-react@^7.20.0: resolve "^1.18.1" string.prototype.matchall "^4.0.2" -eslint-scope@^5.0.0, eslint-scope@^5.1.1: +eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3955,13 +4214,20 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: +eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" @@ -3972,29 +4238,32 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@^7.2.0: - version "7.20.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7" - integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.3.0" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" + escape-string-regexp "^4.0.0" eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^6.0.0" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -4002,7 +4271,7 @@ eslint@^7.2.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.20" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -4011,7 +4280,7 @@ eslint@^7.2.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^6.0.4" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -4024,7 +4293,7 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -4068,11 +4337,6 @@ event-target-shim@^5.0.0, event-target-shim@^5.0.1: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter3@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - exec-sh@^0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" @@ -4151,13 +4415,6 @@ expect@^26.6.2: jest-message-util "^26.6.2" jest-regex-util "^26.0.0" -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= - dependencies: - kind-of "^1.1.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4178,15 +4435,6 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -4220,17 +4468,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fancy-log@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -4252,6 +4490,17 @@ fast-glob@^3.1.1: micromatch "^4.0.2" picomatch "^2.2.1" +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -4276,48 +4525,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs-scripts@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" - integrity sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ== - dependencies: - "@babel/core" "^7.0.0" - ansi-colors "^1.0.1" - babel-preset-fbjs "^3.2.0" - core-js "^2.4.1" - cross-spawn "^5.1.0" - fancy-log "^1.3.2" - object-assign "^4.0.1" - plugin-error "^0.1.2" - semver "^5.1.0" - through2 "^2.0.0" - -fbjs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" - integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== - dependencies: - core-js "^2.4.1" - fbjs-css-vars "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -4325,25 +4532,13 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^6.0.0: +file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filelist@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" - integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== - dependencies: - minimatch "^3.0.4" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -4426,13 +4621,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-versions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" - integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== - dependencies: - semver-regex "^3.1.2" - flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -4451,6 +4639,16 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== +flow-parser@0.*: + version "0.173.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.173.0.tgz#992539fe87b4448a660ac1c54ffa358301e7110b" + integrity sha512-gikomjo+jzdehhOCHP2Ca5y1HGK3jkODhUdTxk4a3SdyLAMBsEwb7KJETHzB4KQs7HhHcqhyT7mGmd9iT8B5Hg== + +flow-parser@^0.121.0: + version "0.121.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.121.0.tgz#9f9898eaec91a9f7c323e9e992d81ab5c58e618f" + integrity sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg== + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -4524,14 +4722,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - fsevents@^2.1.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -4628,13 +4818,6 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -gh-got@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-8.1.0.tgz#2378d07ac293f524549c75f8dc6f3604a885ab01" - integrity sha512-Jy7+73XqsAVeAtM5zA0dd+A7mmzkQVIzFuw3xRjFbPsQVqS+aeci8v8H1heOCAPlBYWED5ZYPhlYqZVXdD3Fmg== - dependencies: - got "^9.5.0" - git-raw-commits@^2.0.0, git-raw-commits@^2.0.8: version "2.0.10" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.10.tgz#e2255ed9563b1c9c3ea6bd05806410290297bbc1" @@ -4684,20 +4867,20 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -github-username@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/github-username/-/github-username-5.0.1.tgz#f4e8c2cd7a3247bd75ae2841f5f69347f5b4c1f0" - integrity sha512-HxFIz5tIQDoiob2ienSKLHoCSFFC6F79IcnM5E5KNAxkxMjvpuUSE7K4fU2n51fwo0idT0ZsMFZIUy4SIPXoVA== - dependencies: - gh-got "^8.1.0" - -glob-parent@^5.0.0, glob-parent@^5.1.0: +glob-parent@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -4729,12 +4912,12 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.12.1" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb" + integrity sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" globby@11.0.2, globby@^11.0.1: version "11.0.2" @@ -4748,6 +4931,18 @@ globby@11.0.2, globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.3: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + got@11.8.1: version "11.8.1" resolved "https://registry.yarnpkg.com/got/-/got-11.8.1.tgz#df04adfaf2e782babb3daabc79139feec2f7e85d" @@ -4765,7 +4960,7 @@ got@11.8.1: p-cancelable "^2.0.0" responselike "^2.0.0" -got@^9.5.0, got@^9.6.0: +got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== @@ -4782,6 +4977,11 @@ got@^9.5.0, got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" +graceful-fs@^4.1.11: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -4880,10 +5080,15 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hermes-engine@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.5.1.tgz#601115e4b1e0a17d9aa91243b96277de4e926e09" - integrity sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg== +hermes-engine@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.9.0.tgz#84d9cfe84e8f6b1b2020d6e71b350cec84ed982f" + integrity sha512-r7U+Y4P2Qg/igFVZN+DpT7JFfXUn1MM4dFne8aW+cCrF6RRymof+VqrUHs1kl07j8h8V2CNesU19RKgWbr3qPw== + +hermes-parser@0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.4.7.tgz#410f5129d57183784d205a0538e6fbdcf614c9ea" + integrity sha512-jc+zCtXbtwTiXoMAoXOHepxAaGVFIp89wwE9qcdwnMd/uGVEtPoY8FaFSsx0ThPvyKirdR2EsIIDVrpbSXz1Ag== hermes-profile-transformer@^0.0.6: version "0.0.6" @@ -4957,38 +5162,20 @@ human-signals@^1.1.1: human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -husky@^4.2.5: - version "4.3.8" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" - integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow== - dependencies: - chalk "^4.0.0" - ci-info "^2.0.0" - compare-versions "^3.6.0" - cosmiconfig "^7.0.0" - find-versions "^4.0.0" - opencollective-postinstall "^2.0.2" - pkg-dir "^5.0.0" - please-upgrade-node "^3.2.0" - slash "^3.0.0" - which-pm-runs "^1.0.0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +husky@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-6.0.0.tgz#810f11869adf51604c32ea577edbc377d7f9319e" + integrity sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ== -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -5004,6 +5191,11 @@ ignore@^5.0.5, ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + image-size@^0.6.0: version "0.6.3" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" @@ -5111,26 +5303,6 @@ inquirer@7.3.3: strip-ansi "^6.0.0" through "^2.3.6" -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -5421,7 +5593,7 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -5511,14 +5683,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -5565,16 +5729,6 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jake@^10.6.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" - integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== - dependencies: - async "0.9.x" - chalk "^2.4.2" - filelist "^1.0.1" - minimatch "^3.0.4" - jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" @@ -5680,36 +5834,12 @@ jest-environment-node@^26.6.2: jest-mock "^26.6.2" jest-util "^26.6.2" -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-haste-map@^26.6.2: +jest-haste-map@^26.5.2, jest-haste-map@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== @@ -5772,20 +5902,6 @@ jest-matcher-utils@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - jest-message-util@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" @@ -5801,13 +5917,6 @@ jest-message-util@^26.6.2: slash "^3.0.0" stack-utils "^2.0.2" -jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== - dependencies: - "@jest/types" "^24.9.0" - jest-mock@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" @@ -5908,11 +6017,6 @@ jest-runtime@^26.6.3: strip-bom "^4.0.0" yargs "^15.4.1" -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - jest-serializer@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" @@ -5943,24 +6047,6 @@ jest-snapshot@^26.6.2: pretty-format "^26.6.2" semver "^7.3.2" -jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - jest-util@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" @@ -5973,19 +6059,7 @@ jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== - dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" - leven "^3.1.0" - pretty-format "^24.9.0" - -jest-validate@^26.6.2: +jest-validate@^26.5.2, jest-validate@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== @@ -6010,15 +6084,7 @@ jest-watcher@^26.6.2: jest-util "^26.6.2" string-length "^4.0.1" -jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -jest-worker@^26.6.2: +jest-worker@^26.0.0, jest-worker@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -6041,6 +6107,17 @@ jetifier@^1.6.2, jetifier@^1.6.6: resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.6.tgz#fec8bff76121444c12dc38d2dad6767c421dab68" integrity sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ== +joi@^17.2.1: + version "17.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6059,10 +6136,35 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsc-android@^245459.0.0: - version "245459.0.0" - resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" - integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg== +jsc-android@^250230.2.1: + version "250230.2.1" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250230.2.1.tgz#3790313a970586a03ab0ad47defbc84df54f1b83" + integrity sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q== + +jscodeshift@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.11.0.tgz#4f95039408f3f06b0e39bb4d53bc3139f5330e2f" + integrity sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g== + dependencies: + "@babel/core" "^7.1.6" + "@babel/parser" "^7.1.6" + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.1.0" + "@babel/plugin-proposal-optional-chaining" "^7.1.0" + "@babel/plugin-transform-modules-commonjs" "^7.1.0" + "@babel/preset-flow" "^7.0.0" + "@babel/preset-typescript" "^7.1.0" + "@babel/register" "^7.0.0" + babel-core "^7.0.0-bridge.0" + colors "^1.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.20.3" + temp "^0.8.1" + write-file-atomic "^2.3.0" jsdom@^16.4.0: version "16.4.0" @@ -6146,13 +6248,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -6230,11 +6325,6 @@ keyv@^4.0.0: dependencies: json-buffer "3.0.1" -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -6365,6 +6455,11 @@ lodash.ismatch@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -6375,12 +6470,17 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash@4.17.20: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.3.0: +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6433,14 +6533,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -6530,98 +6622,103 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metro-babel-register@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.59.0.tgz#2bcff65641b36794cf083ba732fbc46cf870fb43" - integrity sha512-JtWc29erdsXO/V3loenXKw+aHUXgj7lt0QPaZKPpctLLy8kcEpI/8pfXXgVK9weXICCpCnYtYncIosAyzh0xjg== +metro-babel-register@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.66.2.tgz#c6bbe36c7a77590687ccd74b425dc020d17d05af" + integrity sha512-3F+vsVubUPJYKfVMeol8/7pd8CC287Rw92QYzJD8LEmI980xcgwMUEVBZ0UIAUwlLgiJG/f4Mwhuji2EeBXrPg== dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/core" "^7.14.0" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^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" escape-string-regexp "^1.0.5" -metro-babel-transformer@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz#dda99c75d831b00142c42c020c51c103b29f199d" - integrity sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w== +metro-babel-transformer@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.66.2.tgz#fce0a3e314d28a5e7141c135665e1cc9b8e7ce86" + integrity sha512-aJ/7fc/Xkofw8Fqa51OTDhBzBz26mmpIWrXAZcPdQ8MSTt883EWncxeCEjasc79NJ89BRi7sOkkaWZo2sXlKvw== dependencies: - "@babel/core" "^7.0.0" - metro-source-map "0.59.0" + "@babel/core" "^7.14.0" + hermes-parser "0.4.7" + metro-source-map "0.66.2" + nullthrows "^1.1.1" -metro-cache@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.59.0.tgz#ef3c055f276933979b731455dc8317d7a66f0f2d" - integrity sha512-ryWNkSnpyADfRpHGb8BRhQ3+k8bdT/bsxMH2O0ntlZYZ188d8nnYWmxbRvFmEzToJxe/ol4uDw0tJFAaQsN8KA== +metro-cache-key@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.66.2.tgz#d6463d2a53e887a38419d523962cc24ea0e780b4" + integrity sha512-WtkNmRt41qOpHh1MkNA4nLiQ/m7iGL90ysSKD+fcLqlUnOBKJptPQm0ZUv8Kfqk18ddWX2KmsSbq+Sf3I6XohQ== + +metro-cache@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.66.2.tgz#e0af4e0a319898f7d42a980f7ee5da153fcfd019" + integrity sha512-5QCYJtJOHoBSbL3H4/Fpl36oA697C3oYHqsce+Hk/dh2qtODUGpS3gOBhvP1B8iB+H8jJMyR75lZq129LJEsIQ== dependencies: - jest-serializer "^24.9.0" - metro-core "0.59.0" + metro-core "0.66.2" mkdirp "^0.5.1" rimraf "^2.5.4" -metro-config@0.59.0, metro-config@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.59.0.tgz#9844e388069321dd7403e49f0d495a81f9aa0fef" - integrity sha512-MDsknFG9vZ4Nb5VR6OUDmGHaWz6oZg/FtE3up1zVBKPVRTXE1Z+k7zypnPtMXjMh3WHs/Sy4+wU1xnceE/zdnA== +metro-config@0.66.2, metro-config@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.66.2.tgz#e365acdb66ad0cda0182b9c9910760a97ee4293b" + integrity sha512-0C+PrKKIBNNzLZUKN/8ZDJS2U5FLMOTXDWbvBHIdqb6YXz8WplXR2+xlSlaSCCi5b+GR7cWFWUNeKA4GQS1/AQ== dependencies: cosmiconfig "^5.0.5" - jest-validate "^24.9.0" - metro "0.59.0" - metro-cache "0.59.0" - metro-core "0.59.0" - -metro-core@0.59.0, metro-core@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.59.0.tgz#958cde3fe5c8cd84a78e1899af801ad69e9c83b1" - integrity sha512-kb5LKvV5r2pqMEzGyTid8ai2mIjW13NMduQ8oBmfha7/EPTATcTQ//s+bkhAs1toQD8vqVvjAb0cPNjWQEmcmQ== - dependencies: - jest-haste-map "^24.9.0" + jest-validate "^26.5.2" + metro "0.66.2" + metro-cache "0.66.2" + metro-core "0.66.2" + metro-runtime "0.66.2" + +metro-core@0.66.2, metro-core@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.66.2.tgz#ead776a17b3e5a307e6dc22259db30bf5c7e8490" + integrity sha512-JieLZkef/516yxXYvQxWnf3OWw5rcgWRy76K8JV/wr/i8LGVGulPAXlIi445/QZzXVydzRVASKAEVqyxM5F4mA== + dependencies: + jest-haste-map "^26.5.2" lodash.throttle "^4.1.1" - metro-resolver "0.59.0" - wordwrap "^1.0.0" + metro-resolver "0.66.2" -metro-inspector-proxy@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz#39d1390772d13767fc595be9a1a7074e2425cf8e" - integrity sha512-hPeAuQcofTOH0F+2GEZqWkvkVY1/skezSSlMocDQDaqds+Kw6JgdA7FlZXxnKmQ/jYrWUzff/pl8SUCDwuYthQ== +metro-hermes-compiler@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.66.2.tgz#30290748f83805faa601aa487632444915795823" + integrity sha512-nCVL1g9uR6vrw5+X1wjwZruRyMkndnzGRMqjqoljf+nGEqBTD607CR7elXw4fMWn/EM+1y0Vdq5altUu9LdgCA== + +metro-inspector-proxy@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.66.2.tgz#a83c76bd2f2fd7b9240be92acf9a8b1d1404547a" + integrity sha512-gnLc9121eznwP0iiA9tCBW8qZjwIsCgwHWMF1g1Qaki9le9tzeJv3dK4/lFNGxyfSaLO7vahQEhsEYsiRnTROg== dependencies: connect "^3.6.5" debug "^2.2.0" ws "^1.1.5" - yargs "^14.2.0" + yargs "^15.3.1" -metro-minify-uglify@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz#6491876308d878742f7b894d7fca4af356886dd5" - integrity sha512-7IzVgCVWZMymgZ/quieg/9v5EQ8QmZWAgDc86Zp9j0Vy6tQTjUn6jlU+YAKW3mfMEjMr6iIUzCD8YklX78tFAw== +metro-minify-uglify@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.66.2.tgz#6061dbee4f61e6d5bb3c100e4379ff6f2e16e42b" + integrity sha512-7TUK+L5CmB5x1PVnFbgmjzHW4CUadq9H5jgp0HfFoWT1skXAyEsx0DHkKDXwnot0khnNhBOEfl62ctQOnE110Q== dependencies: uglify-es "^3.1.9" -metro-react-native-babel-preset@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz#20e020bc6ac9849e1477de1333d303ed42aba225" - integrity sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg== +metro-react-native-babel-preset@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.66.2.tgz#fddebcf413ad4ea617d4f47f7c1da401052de734" + integrity sha512-H/nLBAz0MgfDloSe1FjyH4EnbokHFdncyERvLPXDACY3ROVRCeUyFNo70ywRGXW2NMbrV4H7KUyU4zkfWhC2HQ== dependencies: + "@babel/core" "^7.14.0" "@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" @@ -6634,6 +6731,7 @@ metro-react-native-babel-preset@0.59.0: "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.0.0" "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^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" @@ -6661,109 +6759,144 @@ metro-react-native-babel-preset@0.59.0: "@babel/template" "^7.0.0" react-refresh "^0.4.0" -metro-react-native-babel-transformer@0.59.0, metro-react-native-babel-transformer@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz#9b3dfd6ad35c6ef37fc4ce4d20a2eb67fabbb4be" - integrity sha512-1O3wrnMq4NcPQ1asEcl9lRDn/t+F1Oef6S9WaYVIKEhg9m/EQRGVrrTVP+R6B5Eeaj3+zNKbzM8Dx/NWy1hUbQ== - dependencies: - "@babel/core" "^7.0.0" - babel-preset-fbjs "^3.3.0" - metro-babel-transformer "0.59.0" - metro-react-native-babel-preset "0.59.0" - metro-source-map "0.59.0" +metro-react-native-babel-transformer@0.66.2, metro-react-native-babel-transformer@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.66.2.tgz#768f341e7c3d3d1c38189799c9884b90d1c32eb7" + integrity sha512-z1ab7ihIT0pJrwgi9q2IH+LcW/xUWMQ0hH+Mrk7wbKQB0RnJdXFoxphrfoVHBHMUu+TBPetUcEkKawkK1e7Cng== + dependencies: + "@babel/core" "^7.14.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.4.7" + metro-babel-transformer "0.66.2" + metro-react-native-babel-preset "0.66.2" + metro-source-map "0.66.2" + nullthrows "^1.1.1" -metro-resolver@0.59.0, metro-resolver@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.59.0.tgz#fbc9d7c95f094c52807877d0011feffb9e896fad" - integrity sha512-lbgiumnwoVosffEI96z0FGuq1ejTorHAj3QYUPmp5dFMfitRxLP7Wm/WP9l4ZZjIptxTExsJwuEff1SLRCPD9w== +metro-resolver@0.66.2, metro-resolver@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.66.2.tgz#f743ddbe7a12dd137d1f7a555732cafcaea421f8" + integrity sha512-pXQAJR/xauRf4kWFj2/hN5a77B4jLl0Fom5I3PHp6Arw/KxSBp0cnguXpGLwNQ6zQC0nxKCoYGL9gQpzMnN7Hw== dependencies: absolute-path "^0.0.0" -metro-source-map@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.59.0.tgz#e9beb9fc51bfb4e060f95820cf1508fc122d23f7" - integrity sha512-0w5CmCM+ybSqXIjqU4RiK40t4bvANL6lafabQ2GP2XD3vSwkLY+StWzCtsb4mPuyi9R/SgoLBel+ZOXHXAH0eQ== +metro-runtime@0.66.2, metro-runtime@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.66.2.tgz#3409ee957b949b6c7b72ef6ed2b9af9a4f4a910e" + integrity sha512-vFhKBk2ot9FS4b+2v0OTa/guCF/QDAOJubY0CNg7PzCS5+w4y3IvZIcPX4SSS1t8pYEZBLvtdtTDarlDl81xmg== + +metro-source-map@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.66.2.tgz#b5304a282a5d55fa67b599265e9cf3217175cdd7" + integrity sha512-038tFmB7vSh73VQcDWIbr5O1m+WXWyYafDaOy+1A/2K308YP0oj33gbEgDnZsLZDwcJ+xt1x6KUEBIzlX4YGeQ== dependencies: - "@babel/traverse" "^7.0.0" + "@babel/traverse" "^7.14.0" "@babel/types" "^7.0.0" invariant "^2.2.4" - metro-symbolicate "0.59.0" - ob1 "0.59.0" + metro-symbolicate "0.66.2" + nullthrows "^1.1.1" + ob1 "0.66.2" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz#fc7f93957a42b02c2bfc57ed1e8f393f5f636a54" - integrity sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw== +metro-symbolicate@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.66.2.tgz#addd095ce5f77e73ca21ddb5dfb396ff5d4fa041" + integrity sha512-u+DeQHyAFXVD7mVP+GST/894WHJ3i/U8oEJFnT7U3P52ZuLgX8n4tMNxhqZU12RcLR6etF8143aP0Ktx1gFLEQ== dependencies: invariant "^2.2.4" - metro-source-map "0.59.0" + metro-source-map "0.66.2" + nullthrows "^1.1.1" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro@0.59.0, metro@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.59.0.tgz#64a87cd61357814a4f279518e0781b1eab5934b8" - integrity sha512-OpVgYXyuTvouusFZQJ/UYKEbwfLmialrSCUUTGTFaBor6UMUHZgXPYtK86LzesgMqRc8aiuTQVO78iKW2Iz3wg== +metro-transform-plugins@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.66.2.tgz#39dd044a23b1343e4f2d2ec34d08128cdf255ed4" + integrity sha512-KTvqplh0ut7oDKovvDG6yzXM02R6X+9b2oVG+qYq8Zd3aCGTi51ASx4ThCNkAHyEvCuJdYg9fxXTL+j+wvhB5w== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.14.0" + nullthrows "^1.1.1" + +metro-transform-worker@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.66.2.tgz#0a8455992132c479721accd52c9bd47deb77769e" + integrity sha512-dO4PtYOMGB7Vzte8aIzX39xytODhmbJrBYPu+zYzlDjyefJZT7BkZ0LkPIThtyJi96xWcGqi9JBSo0CeRupAHw== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + metro "0.66.2" + metro-babel-transformer "0.66.2" + metro-cache "0.66.2" + metro-cache-key "0.66.2" + metro-hermes-compiler "0.66.2" + metro-source-map "0.66.2" + metro-transform-plugins "0.66.2" + nullthrows "^1.1.1" + +metro@0.66.2, metro@^0.66.1: + version "0.66.2" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.66.2.tgz#f21759bf00995470e7577b5b88a5277963f24492" + integrity sha512-uNsISfcQ3iKKSHoN5Q+LAh0l3jeeg7ZcNZ/4BAHGsk02erA0OP+l2m+b5qYVoPptHz9Oc3KyG5oGJoTu41pWjg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/parser" "^7.0.0" - "@babel/plugin-external-helpers" "^7.0.0" + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" + "@babel/traverse" "^7.14.0" "@babel/types" "^7.0.0" absolute-path "^0.0.0" + accepts "^1.3.7" async "^2.4.0" - babel-preset-fbjs "^3.3.0" - buffer-crc32 "^0.2.13" - chalk "^2.4.1" + chalk "^4.0.0" ci-info "^2.0.0" - concat-stream "^1.6.0" 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" + hermes-parser "0.4.7" image-size "^0.6.0" invariant "^2.2.4" - jest-haste-map "^24.9.0" - jest-worker "^24.9.0" - json-stable-stringify "^1.0.1" + jest-haste-map "^26.5.2" + jest-worker "^26.0.0" lodash.throttle "^4.1.1" - merge-stream "^1.0.1" - 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" + metro-babel-register "0.66.2" + metro-babel-transformer "0.66.2" + metro-cache "0.66.2" + metro-cache-key "0.66.2" + metro-config "0.66.2" + metro-core "0.66.2" + metro-hermes-compiler "0.66.2" + metro-inspector-proxy "0.66.2" + metro-minify-uglify "0.66.2" + metro-react-native-babel-preset "0.66.2" + metro-resolver "0.66.2" + metro-runtime "0.66.2" + metro-source-map "0.66.2" + metro-symbolicate "0.66.2" + metro-transform-plugins "0.66.2" + metro-transform-worker "0.66.2" + mime-types "^2.1.27" mkdirp "^0.5.1" node-fetch "^2.2.0" nullthrows "^1.1.1" - resolve "^1.5.0" rimraf "^2.5.4" serialize-error "^2.1.0" source-map "^0.5.6" - strip-ansi "^4.0.0" + strip-ansi "^6.0.0" temp "0.8.3" - throat "^4.1.0" - wordwrap "^1.0.0" + throat "^5.0.0" ws "^1.1.5" - xpipe "^1.0.5" - yargs "^14.2.0" + yargs "^15.3.1" micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" @@ -6792,22 +6925,23 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + mime-db@1.46.0, "mime-db@>= 1.43.0 < 2": version "1.46.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== -mime-db@~1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" - integrity sha1-oxtAcK2uon1zLqMzdApk0OyaZlk= - -mime-types@2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" - integrity sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw= - dependencies: - mime-db "~1.23.0" +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@2.1.29, mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.29" @@ -6816,6 +6950,13 @@ mime-types@2.1.29, mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: dependencies: mime-db "1.46.0" +mime-types@^2.1.27, mime-types@~2.1.34: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -6851,6 +6992,13 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +minimatch@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -6907,21 +7055,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1: - version "2.14.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -6949,7 +7087,12 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.6.0: +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0, neo-async@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -6964,13 +7107,12 @@ nocache@^2.1.0: resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" + minimatch "^3.0.2" node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" @@ -7004,6 +7146,11 @@ node-releases@^1.1.70: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== +node-releases@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" + integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== + node-stream-zip@^1.9.1: version "1.13.1" resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.13.1.tgz#2f8f9a360ec7ae23a80744c4c3862bf3aa3e7892" @@ -7080,12 +7227,12 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -ob1@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.59.0.tgz#ee103619ef5cb697f2866e3577da6f0ecd565a36" - integrity sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ== +ob1@0.66.2: + version "0.66.2" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.66.2.tgz#8caf548202cf2688944bae47db405a08bca17a61" + integrity sha512-RFewnL/RjE0qQBOuM+2bbY96zmJPIge/aDtsiDbLSb+MOiK8CReAhBHDgL+zrA3F1hQk00lMWpUwYcep750plA== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -7203,11 +7350,6 @@ open@^6.2.0: dependencies: is-wsl "^1.1.0" -opencollective-postinstall@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== - optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -7409,11 +7551,6 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - parse-path@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" @@ -7512,11 +7649,21 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -7565,20 +7712,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - -please-upgrade-node@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" - integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== - dependencies: - semver-compare "^1.0.0" - plist@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" @@ -7588,21 +7721,18 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= +plist@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.4.tgz#a62df837e3aed2bb3b735899d510c4f186019cbe" + integrity sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg== dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" + base64-js "^1.5.1" + xmlbuilder "^9.0.7" -pod-install@^0.1.0: - version "0.1.18" - resolved "https://registry.yarnpkg.com/pod-install/-/pod-install-0.1.18.tgz#849ca44fd0be6d26da00b0664c6986eaaa08f7da" - integrity sha512-67du/MXloYatvOCgiV4RZXmg1nW887TdrwVTfZPVWMhmzRefzo3Mkw8lNYmbqN8WUlXtstaKn0l5DFDPfsDMLw== +pod-install@^0.1.32: + version "0.1.32" + resolved "https://registry.yarnpkg.com/pod-install/-/pod-install-0.1.32.tgz#2cafa6c0f7428738a560e0495a02e1e5778a944d" + integrity sha512-o0qH9bcpzJW43d3pFQfs1+k7Su6oQGUugejmgg05X+i4fpFLPITsbOWzm5CHlWOc5RcSLOh0CzAbqni/k8cNeg== posix-character-classes@^0.1.0: version "0.1.1" @@ -7639,32 +7769,12 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.0.2, prettier@^2.0.5: +prettier@^2.0.2: version "2.2.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -pretty-format@^25.1.0, pretty-format@^25.2.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== - dependencies: - "@jest/types" "^25.5.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" - -pretty-format@^26.0.0, pretty-format@^26.6.2: +pretty-format@^26.0.0, pretty-format@^26.5.2, pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== @@ -7684,13 +7794,6 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - promise@^8.0.3: version "8.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" @@ -7706,7 +7809,7 @@ prompts@^2.0.1, prompts@^2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -7720,11 +7823,6 @@ protocols@^1.1.0, protocols@^1.4.0: resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -7805,15 +7903,15 @@ rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-devtools-core@^4.6.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.10.1.tgz#6d57db291aeac9cc45ef9fb4636dd2ab97490daf" - integrity sha512-sXbBjGAWcf9HAblTP/zMtFhGHqxAfIR+GPxONZsSGN9FHnF4635dx1s2LdQWG9rJ+Ehr3nWg+BUAB6P78my5PA== +react-devtools-core@^4.13.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.23.0.tgz#dff9d12202a472ef62632203d6de3877dc6e58be" + integrity sha512-KkzneT1LczFtebbTJlvRphIRvzuHLhI9ghfrseVv9ktBs+l2cXy8Svw5U16lzQnwU9okVEcURmGPgH79WWrlaw== dependencies: shell-quote "^1.6.1" ws "^7" -react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4: +react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -7823,10 +7921,10 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== -react-native-builder-bob@^0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/react-native-builder-bob/-/react-native-builder-bob-0.17.1.tgz#4bb12f721acf9417d62065232d42e0201b673315" - integrity sha512-vO3PYa/vgIqUFOfXZWNEsqQfjJMiNJAfJ0Sq4ovZa4zb/bnMKF4vDbARo3uhA8eg/wA0h4W6BlceY/Kjo74+6g== +react-native-builder-bob@^0.18.2: + version "0.18.2" + resolved "https://registry.yarnpkg.com/react-native-builder-bob/-/react-native-builder-bob-0.18.2.tgz#e3a96abe3ead84b167c1c1ea97747ef8ffc2a9f4" + integrity sha512-HA7ryoG99tkWh92s7Qb/619qAAfa3TMAKP4Q5l/smqZQwnJ77z5ESiPgRZl8gQMiCnrmmPVb/c5yUscKOL9GdQ== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-proposal-class-properties" "^7.12.1" @@ -7840,65 +7938,74 @@ react-native-builder-bob@^0.17.1: cross-spawn "^7.0.3" dedent "^0.7.0" del "^6.0.0" - ejs "^3.1.5" fs-extra "^9.0.1" - github-username "^5.0.1" glob "^7.1.6" is-git-dirty "^2.0.1" json5 "^2.1.3" prompts "^2.4.0" - validate-npm-package-name "^3.0.0" which "^2.0.2" yargs "^16.2.0" optionalDependencies: jetifier "^1.6.6" -react-native@0.63.4: - version "0.63.4" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.4.tgz#2210fdd404c94a5fa6b423c6de86f8e48810ec36" - integrity sha512-I4kM8kYO2mWEYUFITMcpRulcy4/jd+j9T6PbIzR0FuMcz/xwd+JwHoLPa1HmCesvR1RDOw9o4D+OFLwuXXfmGw== +react-native-codegen@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.0.7.tgz#86651c5c5fec67a8077ef7f4e36f7ed459043e14" + integrity sha512-dwNgR8zJ3ALr480QnAmpTiqvFo+rDtq6V5oCggKhYFlRjzOmVSFn3YD41u8ltvKS5G2nQ8gCs2vReFFnRGLYng== dependencies: - "@babel/runtime" "^7.0.0" - "@react-native-community/cli" "^4.10.0" - "@react-native-community/cli-platform-android" "^4.10.0" - "@react-native-community/cli-platform-ios" "^4.10.0" + flow-parser "^0.121.0" + jscodeshift "^0.11.0" + nullthrows "^1.1.1" + +react-native@0.66.3: + version "0.66.3" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.66.3.tgz#25c7c4c7d81867326b3eb7a36f0fe6a61fa4104e" + integrity sha512-B/dQpuvta9YvF5MihDWefoGlTvxzUHK5X5RjdrXHAu/ihTehJXxEA+m6z/tufp1ZUMDjU+tMZK6gnehzCuYfzw== + dependencies: + "@jest/create-cache-key-function" "^27.0.1" + "@react-native-community/cli" "^6.0.0" + "@react-native-community/cli-platform-android" "^6.0.0" + "@react-native-community/cli-platform-ios" "^6.0.0" + "@react-native/assets" "1.0.0" + "@react-native/normalize-color" "1.0.0" + "@react-native/polyfills" "2.0.0" abort-controller "^3.0.0" anser "^1.4.9" base64-js "^1.1.2" event-target-shim "^5.0.1" - fbjs "^1.0.0" - fbjs-scripts "^1.1.0" - hermes-engine "~0.5.0" + hermes-engine "~0.9.0" invariant "^2.2.4" - jsc-android "^245459.0.0" - metro-babel-register "0.59.0" - metro-react-native-babel-transformer "0.59.0" - metro-source-map "0.59.0" + jsc-android "^250230.2.1" + metro-babel-register "0.66.2" + metro-react-native-babel-transformer "0.66.2" + metro-runtime "0.66.2" + metro-source-map "0.66.2" nullthrows "^1.1.1" - pretty-format "^24.9.0" + pretty-format "^26.5.2" promise "^8.0.3" prop-types "^15.7.2" - react-devtools-core "^4.6.0" + react-devtools-core "^4.13.0" + react-native-codegen "^0.0.7" react-refresh "^0.4.0" regenerator-runtime "^0.13.2" - scheduler "0.19.1" + scheduler "^0.20.2" stacktrace-parser "^0.1.3" use-subscription "^1.0.0" whatwg-fetch "^3.0.0" + ws "^6.1.4" react-refresh@^0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== -react@16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" - integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== +react@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.2" read-pkg-up@^1.0.1: version "1.0.1" @@ -7962,7 +8069,7 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stre string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: +readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -7975,6 +8082,21 @@ readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw= + +recast@^0.20.3: + version "0.20.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" + integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== + dependencies: + ast-types "0.14.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -8038,7 +8160,7 @@ regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^3.0.0, regexpp@^3.1.0: +regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== @@ -8233,7 +8355,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.5.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -8305,12 +8427,19 @@ rimraf@~2.2.6: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0, run-async@^2.4.0: +run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -8322,18 +8451,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - rxjs@^6.6.0: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" @@ -8358,7 +8475,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -8390,19 +8507,14 @@ saxes@^5.0.0: dependencies: xmlchars "^2.2.0" -scheduler@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - semver-diff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" @@ -8410,12 +8522,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -semver-regex@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807" - integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA== - -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -8442,6 +8549,13 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -8491,11 +8605,6 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - setprototypeof@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" @@ -8582,11 +8691,6 @@ sisteransi@^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" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -8751,13 +8855,6 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stack-utils@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.4.tgz#4b600971dcfc6aed0cbdf2a8268177cc916c87c8" - integrity sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w== - dependencies: - escape-string-regexp "^2.0.0" - stack-utils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" @@ -8813,15 +8910,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: +string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -8839,6 +8928,15 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.matchall@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" @@ -8882,13 +8980,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -8903,6 +8994,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -8966,13 +9064,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -8993,15 +9084,16 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.0.4: - version "6.0.7" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" - integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== +table@^6.0.9: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: - ajv "^7.0.2" - lodash "^4.17.20" + ajv "^8.0.1" + lodash.truncate "^4.4.2" slice-ansi "^4.0.0" - string-width "^4.2.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" temp-dir@^1.0.0: version "1.0.0" @@ -9027,6 +9119,13 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" +temp@^0.8.1: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -9054,11 +9153,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -throat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - throat@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" @@ -9084,11 +9178,6 @@ through@2, "through@>=2.2.7 <3", through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -9192,10 +9281,15 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tsutils@^3.17.1: - version "3.20.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" - integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== +tslib@^2.0.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -9272,15 +9366,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" - integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== - -ua-parser-js@^0.7.18: - version "0.7.24" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.24.tgz#8d3ecea46ed4f1f1d63ec25f17d8568105dc027c" - integrity sha512-yo+miGzQx5gakzVK3QFfN0/L9uVhosXBBO7qmnk7c2iw1IhL212wfA3zbnI54B0obGwC/5NWub/iT9sReMx+Fw== +typescript@^4.5.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" + integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== uglify-es@^3.1.9: version "3.3.9" @@ -9471,13 +9560,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= - dependencies: - builtins "^1.0.3" - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -9542,7 +9624,7 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: +whatwg-fetch@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.1.tgz#93bc4005af6c2cc30ba3e42ec3125947c8f54ed3" integrity sha512-IEmN/ZfmMw6G1hgZpVd0LuZXOQDisrMOZrzYd5x3RAK4bMPlJohKUZWZ9t/QsTvH0dV9TbPDcc2OSuIDcihnHA== @@ -9566,11 +9648,6 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which-pm-runs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" - integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= - which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -9609,15 +9686,6 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -9641,6 +9709,15 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write-file-atomic@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" @@ -9659,6 +9736,13 @@ ws@^1.1.0, ws@^1.1.5: options ">=0.0.5" ultron "1.0.x" +ws@^6.1.4: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + ws@^7, ws@^7.2.3: version "7.4.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" @@ -9704,11 +9788,6 @@ xmldom@0.1.x: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== -xpipe@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf" - integrity sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98= - xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -9724,11 +9803,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -9744,14 +9818,6 @@ yargs-parser@20.2.5: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== -yargs-parser@^15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" - integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -9765,24 +9831,7 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20" integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA== -yargs@^14.2.0: - version "14.2.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" - integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== - dependencies: - 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@^15.1.0, yargs@^15.4.1: +yargs@^15.1.0, yargs@^15.3.1, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== From 0133e21540dbe4dc34a801ae2f47f51b04b91040 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 6 Mar 2022 12:12:41 +0100 Subject: [PATCH 06/47] Clean up example project --- example/src/Database.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example/src/Database.ts b/example/src/Database.ts index 88a608b..e07edd2 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -16,9 +16,9 @@ export const createDb = async () => { // const res = sqlite.executeSql('test', 'SELECT * FROM "User";', []); // console.warn(res); - // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', []).then((res) => { - // console.warn('asyncRes', res); - // }); + sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', []).then((res) => { + console.warn('asyncRes', res); + }); // await createConnection({ // type: 'react-native', From 9a96ae6e91c85d8b9fe597118ae779fae7cffd50 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 6 Mar 2022 12:17:11 +0100 Subject: [PATCH 07/47] Clean up example project --- README.md | 27 +++++++---- example/src/App.tsx | 24 ++++++---- example/src/Database.ts | 100 +++++++++++++++++++--------------------- 3 files changed, 80 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index af1ff67..5a55afc 100644 --- a/README.md +++ b/README.md @@ -33,14 +33,7 @@ Inspired/compatible with [react-native-sqlite-storage](https://github.com/andpor - This library supports SQLite BLOBs which are mapped to JS ArrayBuffers, check out the sample project on how to use it - From version 2.0.0 onwards errors are no longer thrown on invalid SQL statements. The response contains a `status` number, `0` signals correct execution, `1` signals an error. - From version 3.0.0 onwards no JS errors are thown, every operation returns an object with a `status` field. -- If you want to run the example project on android, you will have to change the paths on the android/CMakeLists.txt file, they are already there, just uncomment them. -- If you are running the latest versions of android studio, the SDKs and NDKs you might face strange errors, you need to have CMake 3.6.0 installed and NDK versions 22 and below (you can install them from android studio SDK manager, just make sure to tick `show package details`) - -## Use TypeORM - -This package offers a low-level API to raw execute SQL queries. I strongly recommend to use [TypeORM](https://github.com/typeorm/typeorm) (with [patch-package](https://github.com/ds300/patch-package)). TypeORM already has a sqlite-storage driver. In the `example` project on the `patch` folder you can a find a [patch for TypeORM](https://github.com/ospfranco/react-native-quick-sqlite/blob/main/example/patches/typeorm%2B0.2.31.patch). - -Follow the instructions to make TypeORM work with React Native (enable decorators, configure babel, etc), then apply the patch via patch-package and you should be good to go. +- On older react-native versions you might face weird NDK/SDK/Cmake errors, the latest version is tested against RN 0.67.3 ## API @@ -62,12 +55,21 @@ interface BatchQueryResult { interface ISQLite { open: (dbName: string, location?: string) => any; + close: (dbName: string) => any; + executeSql: ( dbName: string, query: string, params: any[] | undefined ) => QueryResult; + + asyncExecuteSql: ( + dbName: string, + query: string, + params: any[] | undefined + ) => Promise; + executeSqlBatch: ( dbName: string, commands: SQLBatchParams[] @@ -75,9 +77,10 @@ interface ISQLite { } ``` -In your code +# Usage ```typescript +// You need to import this once in your app, it installs the binding on android import 'react-native-quick-sqlite'; // `sqlite` is a globally registered object, so you can directly call it from anywhere in your javascript @@ -129,6 +132,12 @@ if (!result.status) { } ``` +## Use TypeORM + +This package offers a low-level API to raw execute SQL queries. I strongly recommend to use [TypeORM](https://github.com/typeorm/typeorm) (with [patch-package](https://github.com/ds300/patch-package)). TypeORM already has a sqlite-storage driver. In the `example` project on the `patch` folder you can a find a [patch for TypeORM](https://github.com/ospfranco/react-native-quick-sqlite/blob/main/example/patches/typeorm%2B0.2.31.patch). + +Follow the instructions to make TypeORM work with React Native (enable decorators, configure babel, etc), then apply the patch via patch-package and you should be good to go. + ## Learn React Native JSI If you want to learn how to make your own JSI module buy my [JSI/C++ Cheatsheet](http://ospfranco.gumroad.com/l/IeeIvl), I'm also available for [freelance work](mailto:ospfranco@protonmail.com?subject=Freelance)! diff --git a/example/src/App.tsx b/example/src/App.tsx index eb7cc86..9e53473 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,4 +1,4 @@ -// import 'reflect-metadata'; +import 'reflect-metadata'; import * as React from 'react'; import { StyleSheet, @@ -8,20 +8,24 @@ import { FlatList, ListRenderItemInfo, } from 'react-native'; -import { createDb } from './Database'; -// import type { User } from './model/User'; +// Replace if you want to test the low level API +// import { lowLevelInit } from './Database'; +import { typeORMInit } from './Database'; +import type { User } from './model/User'; +import { Buffer } from 'buffer'; export default function App() { - // let [users, setUsers] = React.useState([]); + let [users, setUsers] = React.useState([]); React.useEffect(() => { - createDb(); + // lowLevelInit(); + typeORMInit().then(setUsers); }, []); return ( App Started - {/* ) => { return ( @@ -46,16 +50,16 @@ export default function App() { {info.item.name} Age {info.item.age} - {info.item.metadata.nickname} */} - {/* + {info.item.metadata.nickname} + {/* Favorite Book {info.item.favoriteBook.title} */} - {/* + ); }} keyExtractor={(item: any) => item.id} - /> */} + /> ); } diff --git a/example/src/Database.ts b/example/src/Database.ts index e07edd2..9bdc75f 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -1,64 +1,60 @@ /* eslint-disable no-undef */ import '../..'; -// import { createConnection, getRepository } from 'typeorm'; -// import { Book } from './model/Book'; -// import { User } from './model/User'; -// import { Buffer } from 'buffer'; - -export const createDb = async () => { - // console.warn('opening DB'); +import { createConnection, getRepository } from 'typeorm'; +import { Book } from './model/Book'; +import { User } from './model/User'; +import { Buffer } from 'buffer'; +export const lowLevelInit = async () => { sqlite.open('test', 'sample/database'); - // console.warn('DB Opened'); - // sqlite.executeSql('test', 'CREATE TABLE "User" ( name TEXT NOT NULL );', []); - // sqlite.executeSql('test', 'INSERT INTO "User" (name) VALUES(\'OSCAR\')', []); - // const res = sqlite.executeSql('test', 'SELECT * FROM "User";', []); - // console.warn(res); + sqlite.executeSql('test', 'CREATE TABLE "User" ( name TEXT NOT NULL );', []); + sqlite.executeSql('test', 'INSERT INTO "User" (name) VALUES(\'OSCAR\')', []); sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', []).then((res) => { console.warn('asyncRes', res); }); +}; - // await createConnection({ - // type: 'react-native', - // // driver: require('react-native-quick-sqlite'), - // database: 'test', - // location: 'sample/database', - // logging: ['error'], - // synchronize: true, - // entities: [User, Book], - // }); - - // // const bookRepository = getRepository(Book); - // const userRepository = getRepository(User); - - // const user1 = new User(); - // user1.name = 'John Seedman 🤯'; - // user1.age = 30; - // user1.networth = 30000.23; - // user1.metadata = { - // nickname: - // '

We deliver that something because some interesting text!

\n

Always remember...

\n

some 🧟‍♀️ 🧚 🍉 text here.

\n', - // }; - // user1.avatar = Buffer.from( - // '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', - // 'base64' - // ).buffer; - - // // const book1 = new Book(); - // // book1.title = 'Lord of the rings'; - // // book1.user = user1; - - // // user1.favoriteBook = book1; - - // // await bookRepository.save(book1); - // await userRepository.save(user1); +export async function typeORMInit() { + await createConnection({ + type: 'react-native', + database: 'test', + location: 'sample/database', + logging: ['error'], + synchronize: true, + entities: [User, Book], + }); - // const users = await userRepository.find(); - // // const users = await userRepository.find({ - // // relations: ['favoriteBook'], - // // }); + // const bookRepository = getRepository(Book); + const userRepository = getRepository(User); + + const user1 = new User(); + user1.name = 'John Seedman 🤯'; + user1.age = 30; + user1.networth = 30000.23; + user1.metadata = { + nickname: + '

We deliver that something because some interesting text!

\n

Always remember...

\n

some 🧟‍♀️ 🧚 🍉 text here.

\n', + }; + user1.avatar = Buffer.from( + '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', + 'base64' + ).buffer; + + // const book1 = new Book(); + // book1.title = 'Lord of the rings'; + // book1.user = user1; + + // user1.favoriteBook = book1; + + // await bookRepository.save(book1); + await userRepository.save(user1); + + const users = await userRepository.find(); + // const users = await userRepository.find({ + // relations: ['favoriteBook'], + // }); - // return users; -}; + return users; +} From 4bd35847de30768a7d212d030ba19611924feba0 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 6 Mar 2022 16:32:14 +0100 Subject: [PATCH 08/47] Fix missing dependencies and bump versions on root --- example/metro.config.js | 4 ++-- example/package.json | 7 ++++-- example/yarn.lock | 34 +++++++++++++++++++++++++++-- package.json | 4 ++-- yarn.lock | 47 ++++++++++++++++++++--------------------- 5 files changed, 64 insertions(+), 32 deletions(-) diff --git a/example/metro.config.js b/example/metro.config.js index d1f468a..7cf0d06 100644 --- a/example/metro.config.js +++ b/example/metro.config.js @@ -1,5 +1,5 @@ const path = require('path'); -const blacklist = require('metro-config/src/defaults/blacklist'); +const exclusionList = require('metro-config/src/defaults/exclusionList'); const escape = require('escape-string-regexp'); const pak = require('../package.json'); @@ -16,7 +16,7 @@ module.exports = { // We need to make sure that only one version is loaded for peerDependencies // So we blacklist them at the root, and alias them to the versions in example's node_modules resolver: { - blacklistRE: blacklist( + blockList: exclusionList( modules.map( (m) => new RegExp(`^${escape(path.join(root, 'node_modules', m))}\\/.*$`) diff --git a/example/package.json b/example/package.json index 4b3ee4d..4b4c32d 100644 --- a/example/package.json +++ b/example/package.json @@ -15,18 +15,21 @@ "buffer": "^6.0.3", "react": "17.0.2", "react-native": "0.67.3", + "reflect-metadata": "^0.1.13", "typeorm": "^0.2.36" }, "devDependencies": { "@babel/core": "^7.12.9", + "@babel/plugin-proposal-decorators": "^7.17.2", "@babel/runtime": "^7.12.5", "@react-native-community/eslint-config": "^2.0.0", + "@types/node": "^17.0.21", "babel-jest": "^26.6.3", + "babel-plugin-transform-typescript-metadata": "^0.3.2", "eslint": "7.14.0", "jest": "^26.6.3", "metro-react-native-babel-preset": "^0.66.2", "patch-package": "^6.4.7", - "react-test-renderer": "17.0.2", - "reflect-metadata": "^0.1.13" + "react-test-renderer": "17.0.2" } } diff --git a/example/yarn.lock b/example/yarn.lock index 3ace434..f6d53ea 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -125,7 +125,7 @@ "@babel/helper-replace-supers" "^7.13.0" "@babel/helper-split-export-declaration" "^7.12.13" -"@babel/helper-create-class-features-plugin@^7.16.7": +"@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1": version "7.17.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== @@ -449,6 +449,17 @@ "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-proposal-decorators@^7.17.2": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz#c36372ddfe0360cac1ee331a238310bddca11493" + integrity sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.1" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/plugin-syntax-decorators" "^7.17.0" + charcodes "^0.2.0" + "@babel/plugin-proposal-export-default-from@^7.0.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.13.tgz#f110284108a9b2b96f01b15b3be9e54c2610a989" @@ -531,6 +542,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-decorators@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz#a2be3b2c9fe7d78bd4994e790896bc411e2f166d" + integrity sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import@^7.0.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -1565,7 +1583,7 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== -"@types/node@*": +"@types/node@*", "@types/node@^17.0.21": version "17.0.21" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== @@ -2053,6 +2071,13 @@ babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== +babel-plugin-transform-typescript-metadata@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz#7a327842d8c36ffe07ee1b5276434e56c297c9b7" + integrity sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -2352,6 +2377,11 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +charcodes@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/charcodes/-/charcodes-0.2.0.tgz#5208d327e6cc05f99eb80ffc814707572d1f14e4" + integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" diff --git a/package.json b/package.json index 91293c8..5cc52e7 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@release-it/conventional-changelog": "^3.3.0", "@types/jest": "^26.0.0", "@types/react": "17.0.2", - "@types/react-native": "0.66.3", + "@types/react-native": "0.67.2", "commitlint": "^11.0.0", "eslint": "^7.32.0", "eslint-config-prettier": "^7.2.0", @@ -62,7 +62,7 @@ "jest": "^26.0.1", "pod-install": "^0.1.32", "react": "17.0.2", - "react-native": "0.66.3", + "react-native": "0.67.3", "react-native-builder-bob": "^0.18.2", "release-it": "^14.2.2", "typescript": "^4.5.2" diff --git a/yarn.lock b/yarn.lock index d3bfe5f..e8e9a06 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2067,10 +2067,10 @@ resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== -"@react-native/normalize-color@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-1.0.0.tgz#c52a99d4fe01049102d47dc45d40cbde4f720ab6" - integrity sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg== +"@react-native/normalize-color@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.0.0.tgz#da955909432474a9a0fe1cbffc66576a0447f567" + integrity sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw== "@react-native/polyfills@2.0.0": version "2.0.0" @@ -2266,10 +2266,10 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/react-native@0.66.3": - version "0.66.3" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.66.3.tgz#a9910e973d1273a3d8d28433ecbf31e64241a22f" - integrity sha512-ZJmd4R36dPmgm5I0lEcR/1wCPH31Lwqz2ApDmvNXPow2ssoF5EO7NlNMG6hsROBbzYSf5U0DPVDAyW39VzvuAA== +"@types/react-native@0.67.2": + version "0.67.2" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.67.2.tgz#801656be65b875cf215cd09de208436df92fa356" + integrity sha512-DyBkq7kw1UngzfvBr8WE41+hL/TWpxOZVaeABJz6Si7DmpT0Rq6vJCYjVaR85ViKSYJvIHpzxYfp0dD+lb3ctA== dependencies: "@types/react" "*" @@ -7903,10 +7903,10 @@ rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-devtools-core@^4.13.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.23.0.tgz#dff9d12202a472ef62632203d6de3877dc6e58be" - integrity sha512-KkzneT1LczFtebbTJlvRphIRvzuHLhI9ghfrseVv9ktBs+l2cXy8Svw5U16lzQnwU9okVEcURmGPgH79WWrlaw== +react-devtools-core@4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.19.1.tgz#bc37c2ef2f48f28c6af4c7292be9dca1b63deace" + integrity sha512-2wJiGffPWK0KggBjVwnTaAk+Z3MSxKInHmdzPTrBh1mAarexsa93Kw+WMX88+XjN+TtYgAiLe9xeTqcO5FfJTw== dependencies: shell-quote "^1.6.1" ws "^7" @@ -7948,26 +7948,26 @@ react-native-builder-bob@^0.18.2: optionalDependencies: jetifier "^1.6.6" -react-native-codegen@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.0.7.tgz#86651c5c5fec67a8077ef7f4e36f7ed459043e14" - integrity sha512-dwNgR8zJ3ALr480QnAmpTiqvFo+rDtq6V5oCggKhYFlRjzOmVSFn3YD41u8ltvKS5G2nQ8gCs2vReFFnRGLYng== +react-native-codegen@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.0.8.tgz#b7796a54074139d956fff2862cf1285db43c891b" + integrity sha512-k/944+0XD+8l7zDaiKfYabyEKmAmyZgS1mj+4LcSRPyHnrjgCHKrh/Y6jM6kucQ6xU1+1uyMmF/dSkikxK8i+Q== dependencies: flow-parser "^0.121.0" jscodeshift "^0.11.0" nullthrows "^1.1.1" -react-native@0.66.3: - version "0.66.3" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.66.3.tgz#25c7c4c7d81867326b3eb7a36f0fe6a61fa4104e" - integrity sha512-B/dQpuvta9YvF5MihDWefoGlTvxzUHK5X5RjdrXHAu/ihTehJXxEA+m6z/tufp1ZUMDjU+tMZK6gnehzCuYfzw== +react-native@0.67.3: + version "0.67.3" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.67.3.tgz#ee8bafb644afbe511a4a2c8e9c144a9720d06dd8" + integrity sha512-epMVRMRH7dLCis97+YwiV4dmTVZO6qKmQgwcTNcxVt/kEMxAa+OYK7h81+99/n7XCeMFk/U2zYOBuQqc7c5Amg== dependencies: "@jest/create-cache-key-function" "^27.0.1" "@react-native-community/cli" "^6.0.0" "@react-native-community/cli-platform-android" "^6.0.0" "@react-native-community/cli-platform-ios" "^6.0.0" "@react-native/assets" "1.0.0" - "@react-native/normalize-color" "1.0.0" + "@react-native/normalize-color" "2.0.0" "@react-native/polyfills" "2.0.0" abort-controller "^3.0.0" anser "^1.4.9" @@ -7976,7 +7976,6 @@ react-native@0.66.3: hermes-engine "~0.9.0" invariant "^2.2.4" jsc-android "^250230.2.1" - metro-babel-register "0.66.2" metro-react-native-babel-transformer "0.66.2" metro-runtime "0.66.2" metro-source-map "0.66.2" @@ -7984,8 +7983,8 @@ react-native@0.66.3: pretty-format "^26.5.2" promise "^8.0.3" prop-types "^15.7.2" - react-devtools-core "^4.13.0" - react-native-codegen "^0.0.7" + react-devtools-core "4.19.1" + react-native-codegen "^0.0.8" react-refresh "^0.4.0" regenerator-runtime "^0.13.2" scheduler "^0.20.2" From d9a5ff968c37fb70c28df9797ee1c62b41114b51 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 6 Mar 2022 18:20:56 +0100 Subject: [PATCH 09/47] Try using a callback instead of a promise --- cpp/react-native-quick-sqlite.cpp | 47 ++++++++++++------------------- example/src/App.tsx | 10 +++---- example/src/Database.ts | 29 ++++++++++++++++--- src/index.ts | 5 ++-- 4 files changed, 51 insertions(+), 40 deletions(-) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 1544ac7..46b4726 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -348,51 +348,40 @@ void installSequel(jsi::Runtime &rt, const char *docPath) auto asyncExecSQL = jsi::Function::createFromHostFunction( rt, jsi::PropNameID::forAscii(rt, "sequel_asyncExecSQL"), - 3, + 4, [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { + + if(count < 4) { + LOGW("NOT ENOUGH PARAMS PASSED"); + } const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); - std::shared_ptr params = std::make_shared(args[2].asObject(rt)); - - std::shared_ptr resolver; - - auto promiseBody = jsi::Function::createFromHostFunction( - rt, - jsi::PropNameID::forAscii(rt, "executor"), - 2, - [&resolver]( - jsi::Runtime &rt, - const jsi::Value &thisValue, - const jsi::Value *args, - size_t) -> jsi::Value - { - resolver = std::make_shared(args[0].asObject(rt)); - return {}; - }); + auto params = std::make_shared(args[2].asObject(rt)); + auto callback = std::make_shared(args[3].asObject(rt).asFunction(rt)); - auto promise = rt.global() - .getPropertyAsFunction(rt, "Promise") - .callAsConstructor(rt, promiseBody); - - // Spawn c++ thread thread t1( - [&rt, dbName, query, params, resolver] + [&rt, dbName, query, params, callback] { SequelResult result = sequel_execute(rt, dbName, query, *params); - + LOGW("ROPO FINISHED COMPUTING"); if (result.type == SequelResultError) { - resolver->asFunction(rt).call(rt, createError(rt, result.message.c_str())); + LOGW("RETURNING ERROR"); + callback->asFunction(rt).call(rt, createError(rt, result.message.c_str())); } else { - resolver->asFunction(rt).call(rt, move(result.value)); - } }); + LOGW("RETURNING SUCCESS"); + callback->call(rt, result.value); + LOGW("SUCCESS CALLED"); + } + + }); t1.detach(); - return move(promise); + return {}; }); // Global object diff --git a/example/src/App.tsx b/example/src/App.tsx index 9e53473..5b45ba0 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -9,8 +9,8 @@ import { ListRenderItemInfo, } from 'react-native'; // Replace if you want to test the low level API -// import { lowLevelInit } from './Database'; -import { typeORMInit } from './Database'; +import { lowLevelInit } from './Database'; +// import { typeORMInit } from './Database'; import type { User } from './model/User'; import { Buffer } from 'buffer'; @@ -18,13 +18,13 @@ export default function App() { let [users, setUsers] = React.useState([]); React.useEffect(() => { - // lowLevelInit(); - typeORMInit().then(setUsers); + lowLevelInit(); + // typeORMInit().then(setUsers); }, []); return ( - App Started + Quick SQLite tester app ) => { diff --git a/example/src/Database.ts b/example/src/Database.ts index 9bdc75f..41676c6 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -8,11 +8,32 @@ import { Buffer } from 'buffer'; export const lowLevelInit = async () => { sqlite.open('test', 'sample/database'); - sqlite.executeSql('test', 'CREATE TABLE "User" ( name TEXT NOT NULL );', []); - sqlite.executeSql('test', 'INSERT INTO "User" (name) VALUES(\'OSCAR\')', []); + // const result = sqlite.executeSql( + // 'test', + // 'CREATE TABLE "User" ( name TEXT NOT NULL );', + // undefined + // ); + // console.warn('tried to create table result', result); - sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', []).then((res) => { - console.warn('asyncRes', res); + // sqlite.executeSql( + // 'test', + // 'INSERT INTO "User" (name) VALUES(\'OSCAR\')', + // undefined + // ); + + // console.warn('INSERTED DATA'); + + // sqlite + // .asyncExecuteSql('test', 'SELECT * FROM "User";', []) + // .then((asyncRes) => { + // console.warn('asyncRes', asyncRes); + // }) + // .catch((err) => { + // console.warn('async error', err); + // }); + + sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { + console.warn('asyncRes', asyncRes); }); }; diff --git a/src/index.ts b/src/index.ts index 4027fe5..9e035ba 100644 --- a/src/index.ts +++ b/src/index.ts @@ -81,8 +81,9 @@ interface ISQLite { asyncExecuteSql: ( dbName: string, query: string, - params: any[] | undefined - ) => Promise; + params: any[] | undefined, + cb: (res: QueryResult) => void + ) => void; executeSqlBatch: ( dbName: string, commands: SQLBatchParams[] From 67b06c6551342ede1e5e8d4e684aabb300f72f3f Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Wed, 9 Mar 2022 20:48:53 +0100 Subject: [PATCH 10/47] Implement thread pool --- cpp/react-native-quick-sqlite.cpp | 110 ++++++++++++++++++++++++++++-- example/src/Database.ts | 10 ++- 2 files changed, 113 insertions(+), 7 deletions(-) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 46b4726..9dfb908 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -16,10 +16,110 @@ #include #include #include +#include +#include +#include +#include +#include using namespace std; using namespace facebook; +class ThreadPool { + public: + ThreadPool() : done(false) { + // This returns the number of threads supported by the system. If the + // function can't figure out this information, it returns 0. 0 is not good, + // so we create at least 1 + auto numberOfThreads = std::thread::hardware_concurrency(); + if (numberOfThreads == 0) { + numberOfThreads = 1; + } + + for (unsigned i = 0; i < numberOfThreads; ++i) { + // The threads will execute the private member `doWork`. Note that we need + // to pass a reference to the function (namespaced with the class name) as + // the first argument, and the current object as second argument + threads.push_back(std::thread(&ThreadPool::doWork, this)); + } + } + + // The destructor joins all the threads so the program can exit gracefully. + // This will be executed if there is any exception (e.g. creating the threads) + ~ThreadPool() { + // So threads know it's time to shut down + done = true; + + // Wake up all the threads, so they can finish and be joined + workQueueConditionVariable.notify_all(); + for (auto& thread : threads) { + if (thread.joinable()) { + thread.join(); + } + } + } + + // This function will be called by the server every time there is a request + // that needs to be processed by the thread pool + void queueWork(std::function task) { + // Grab the mutex + std::lock_guard g(workQueueMutex); + + // Push the request to the queue + workQueue.push(task); + + // Notify one thread that there are requests to process + workQueueConditionVariable.notify_one(); + } + + private: + // This condition variable is used for the threads to wait until there is work + // to do + std::condition_variable_any workQueueConditionVariable; + + // We store the threads in a vector, so we can later stop them gracefully + std::vector threads; + + // Mutex to protect workQueue + std::mutex workQueueMutex; + + // Queue of requests waiting to be processed + std::queue> workQueue; + + // This will be set to true when the thread pool is shutting down. This tells + // the threads to stop looping and finish + bool done; + + // Function used by the threads to grab work from the queue + void doWork() { + // Loop while the queue is not destructing + while (!done) { + std::function task; + + // Create a scope, so we don't lock the queue for longer than necessary + { + std::unique_lock g(workQueueMutex); + workQueueConditionVariable.wait(g, [&]{ + // Only wake up if there are elements in the queue or the program is + // shutting down + return !workQueue.empty() || done; + }); + + // If we are shutting down exit witout trying to process more work + if (done) { + break; + } + + task = workQueue.front(); + workQueue.pop(); + } + + task(); + } + } +}; + + const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) { int jsiParamsLength = params.length(rt); @@ -32,6 +132,7 @@ const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) } string docPathStr; +ThreadPool *tp = new ThreadPool; jsi::Object createError(jsi::Runtime &rt, string message) { @@ -359,8 +460,9 @@ void installSequel(jsi::Runtime &rt, const char *docPath) const string query = args[1].asString(rt).utf8(rt); auto params = std::make_shared(args[2].asObject(rt)); auto callback = std::make_shared(args[3].asObject(rt).asFunction(rt)); + - thread t1( + auto task = [&rt, dbName, query, params, callback] { SequelResult result = sequel_execute(rt, dbName, query, *params); @@ -377,9 +479,9 @@ void installSequel(jsi::Runtime &rt, const char *docPath) LOGW("SUCCESS CALLED"); } - }); - - t1.detach(); + }; + + tp->queueWork(task); return {}; }); diff --git a/example/src/Database.ts b/example/src/Database.ts index 41676c6..fcc9d54 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -32,9 +32,13 @@ export const lowLevelInit = async () => { // console.warn('async error', err); // }); - sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { - console.warn('asyncRes', asyncRes); - }); + // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { + // console.warn('asyncRes', asyncRes); + // }); + + // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { + // console.warn('asyncRes2', asyncRes); + // }); }; export async function typeORMInit() { From 5b7da06d6a86bf726ee27e2a069b2bc48fa78837 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Thu, 10 Mar 2022 06:40:04 +0100 Subject: [PATCH 11/47] Add try catch to sequel block --- cpp/react-native-quick-sqlite.cpp | 42 ++++++++++++++++++------------- example/src/Database.ts | 6 ++--- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 9dfb908..a6816cb 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -21,6 +21,7 @@ #include #include #include +#include using namespace std; using namespace facebook; @@ -132,7 +133,6 @@ const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) } string docPathStr; -ThreadPool *tp = new ThreadPool; jsi::Object createError(jsi::Runtime &rt, string message) { @@ -154,6 +154,7 @@ void installSequel(jsi::Runtime &rt, const char *docPath) // Transfer from pointer to variable to prevent de-allocation once calling function has finished docPathStr = std::string(docPath); + auto pool = std::make_shared(); // Open/create db auto open = jsi::Function::createFromHostFunction( @@ -450,7 +451,7 @@ void installSequel(jsi::Runtime &rt, const char *docPath) rt, jsi::PropNameID::forAscii(rt, "sequel_asyncExecSQL"), 4, - [](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value + [pool](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { if(count < 4) { @@ -458,30 +459,35 @@ void installSequel(jsi::Runtime &rt, const char *docPath) } const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); - auto params = std::make_shared(args[2].asObject(rt)); - auto callback = std::make_shared(args[3].asObject(rt).asFunction(rt)); + auto params = make_shared(args[2].asObject(rt)); + auto callback = make_shared((args[3].asObject(rt))); auto task = - [&rt, dbName, query, params, callback] + [&rt, dbName, query, params, callback]() { - SequelResult result = sequel_execute(rt, dbName, query, *params); - LOGW("ROPO FINISHED COMPUTING"); - if (result.type == SequelResultError) - { - LOGW("RETURNING ERROR"); - callback->asFunction(rt).call(rt, createError(rt, result.message.c_str())); - } - else - { - LOGW("RETURNING SUCCESS"); - callback->call(rt, result.value); - LOGW("SUCCESS CALLED"); + try { + SequelResult result = sequel_execute(rt, dbName, query, *params); + LOGW("ROPO FINISHED COMPUTING"); + if (result.type == SequelResultError) + { + LOGW("RETURNING ERROR"); + callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); + } + else + { + LOGW("RETURNING SUCCESS"); + callback->asObject(rt).asFunction(rt).call(rt, result.value); + LOGW("SUCCESS CALLED"); + } + + } catch(std::exception& exc) { + LOGW("Catched exception: %s", exc.what()); } }; - tp->queueWork(task); + pool->queueWork(task); return {}; }); diff --git a/example/src/Database.ts b/example/src/Database.ts index fcc9d54..f934251 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -32,9 +32,9 @@ export const lowLevelInit = async () => { // console.warn('async error', err); // }); - // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { - // console.warn('asyncRes', asyncRes); - // }); + sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { + console.warn('asyncRes', asyncRes); + }); // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { // console.warn('asyncRes2', asyncRes); From f4fe27a7303ade0c336f1605483a2dd7ac1f37ee Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Thu, 10 Mar 2022 07:20:05 +0100 Subject: [PATCH 12/47] Try to add JNI to android compilation --- android/CMakeLists.txt | 11 ++- android/build.gradle | 14 ++- android/cpp-adapter.cpp | 11 ++- .../com/reactnativesequel/SequelModule.java | 10 +- cpp/react-native-quick-sqlite.cpp | 94 +++++++++++-------- 5 files changed, 89 insertions(+), 51 deletions(-) diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 854e6d5..a821baf 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -2,16 +2,21 @@ cmake_minimum_required(VERSION 3.9.0) set (PACKAGE_NAME "react-native-quick-sqlite") set (CMAKE_VERBOSE_MAKEFILE ON) -set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD 14) include_directories( ../cpp "${NODE_MODULES_DIR}/react-native/React" "${NODE_MODULES_DIR}/react-native/React/Base" "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi" + "${NODE_MODULES_DIR}/react-native/ReactCommon/callinvoker" + "${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon" ) -add_library(sequel +# find fbjni package +find_package(fbjni REQUIRED CONFIG) + +add_library(${PACKAGE_NAME} SHARED "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi/jsi/jsi.cpp" ../cpp/sequel.cpp @@ -24,4 +29,4 @@ add_library(sequel cpp-adapter.cpp ) -target_link_libraries(sequel android log) +target_link_libraries(sequel fbjni::fbjni android log) diff --git a/android/build.gradle b/android/build.gradle index 4e0a731..79526a7 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -35,13 +35,23 @@ static def findNodeModules(baseDir) { } basePath = basePath.getParent() } - throw new GradleException("react-native-quick-base64: Failed to find node_modules/ path!") + throw new GradleException("react-native-quick-sqlite: Failed to find node_modules/ path!") } def nodeModules = findNodeModules(projectDir); logger.warn("react-native-quick-sqlite: node_modules/ found at: ${nodeModules}"); android { + buildFeatures { + prefab true + } + dependencies { + implementation 'com.facebook.fbjni:fbjni:0.2.2' + } + configurations { + all*.exclude module: 'fbjni-java-only' + } + compileSdkVersion getExtOrIntegerDefault('compileSdkVersion') buildToolsVersion getExtOrDefault('buildToolsVersion') @@ -55,7 +65,7 @@ android { cmake { cppFlags "-O2 -frtti -fexceptions -Wall -Wno-unused-variable -fstack-protector-all" abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' - arguments "-DNODE_MODULES_DIR=${nodeModules}" + arguments "-DNODE_MODULES_DIR=${nodeModules} -DANDROID_STL=c++_shared" } } diff --git a/android/cpp-adapter.cpp b/android/cpp-adapter.cpp index 7d82f88..6857bb0 100644 --- a/android/cpp-adapter.cpp +++ b/android/cpp-adapter.cpp @@ -1,13 +1,20 @@ #include +#include +#include #include "react-native-quick-sqlite.h" extern "C" JNIEXPORT void JNICALL -Java_com_reactnativequicksqlite_SequelModule_initialize(JNIEnv *env, jclass clazz, jlong jsiPtr, jstring docPath) +Java_com_reactnativequicksqlite_SequelModule_initialize(JNIEnv *env, + jclass clazz, + jlong jsiPtr, + jni::alias_ref jsCallInvokerHolder, + jstring docPath) { jboolean isCopy; const char *docPathString = (env)->GetStringUTFChars(docPath, &isCopy); + auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); - installSequel(*reinterpret_cast(jsiPtr), docPathString); + installSequel(*reinterpret_cast(jsiPtr), jsCallInvoker, docPathString); } extern "C" JNIEXPORT void JNICALL diff --git a/android/src/main/java/com/reactnativesequel/SequelModule.java b/android/src/main/java/com/reactnativesequel/SequelModule.java index f3b4a23..bba8b99 100644 --- a/android/src/main/java/com/reactnativesequel/SequelModule.java +++ b/android/src/main/java/com/reactnativesequel/SequelModule.java @@ -6,10 +6,11 @@ import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; class SequelModule extends ReactContextBaseJavaModule { - public static final String NAME = "QuickSQLite"; - private static native void initialize(long jsiPtr, String docDir); + public static final String NAME = "react-native-quick-sqlite"; + private static native void initialize(long jsiPtr, CallInvokerHolderImpl jsCallInvokerHolder, String docDir); public SequelModule(ReactApplicationContext context) { super(context); @@ -24,11 +25,14 @@ public String getName() { @ReactMethod(isBlockingSynchronousMethod = true) public boolean install() { try { - System.loadLibrary("sequel"); + System.loadLibrary("react-native-quick-sqlite"); ReactApplicationContext context = getReactApplicationContext(); + CallInvokerHolderImpl holder = (CallInvokerHolderImpl)context.getCatalystInstance().getJSCallInvokerHolder(); + initialize( context.getJavaScriptContextHolder().get(), + holder, context.getFilesDir().getAbsolutePath() ); return true; diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index a6816cb..2198025 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -26,18 +26,22 @@ using namespace std; using namespace facebook; -class ThreadPool { - public: - ThreadPool() : done(false) { +class ThreadPool +{ +public: + ThreadPool() : done(false) + { // This returns the number of threads supported by the system. If the // function can't figure out this information, it returns 0. 0 is not good, // so we create at least 1 auto numberOfThreads = std::thread::hardware_concurrency(); - if (numberOfThreads == 0) { + if (numberOfThreads == 0) + { numberOfThreads = 1; } - for (unsigned i = 0; i < numberOfThreads; ++i) { + for (unsigned i = 0; i < numberOfThreads; ++i) + { // The threads will execute the private member `doWork`. Note that we need // to pass a reference to the function (namespaced with the class name) as // the first argument, and the current object as second argument @@ -47,14 +51,17 @@ class ThreadPool { // The destructor joins all the threads so the program can exit gracefully. // This will be executed if there is any exception (e.g. creating the threads) - ~ThreadPool() { + ~ThreadPool() + { // So threads know it's time to shut down done = true; // Wake up all the threads, so they can finish and be joined workQueueConditionVariable.notify_all(); - for (auto& thread : threads) { - if (thread.joinable()) { + for (auto &thread : threads) + { + if (thread.joinable()) + { thread.join(); } } @@ -62,7 +69,8 @@ class ThreadPool { // This function will be called by the server every time there is a request // that needs to be processed by the thread pool - void queueWork(std::function task) { + void queueWork(std::function task) + { // Grab the mutex std::lock_guard g(workQueueMutex); @@ -73,7 +81,7 @@ class ThreadPool { workQueueConditionVariable.notify_one(); } - private: +private: // This condition variable is used for the threads to wait until there is work // to do std::condition_variable_any workQueueConditionVariable; @@ -92,22 +100,25 @@ class ThreadPool { bool done; // Function used by the threads to grab work from the queue - void doWork() { + void doWork() + { // Loop while the queue is not destructing - while (!done) { + while (!done) + { std::function task; // Create a scope, so we don't lock the queue for longer than necessary { std::unique_lock g(workQueueMutex); - workQueueConditionVariable.wait(g, [&]{ + workQueueConditionVariable.wait(g, [&] + { // Only wake up if there are elements in the queue or the program is // shutting down - return !workQueue.empty() || done; - }); + return !workQueue.empty() || done; }); // If we are shutting down exit witout trying to process more work - if (done) { + if (done) + { break; } @@ -120,7 +131,6 @@ class ThreadPool { } }; - const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) { int jsiParamsLength = params.length(rt); @@ -133,6 +143,7 @@ const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) } string docPathStr; +react::CallInvoker invoker; jsi::Object createError(jsi::Runtime &rt, string message) { @@ -149,12 +160,13 @@ jsi::Object createOk(jsi::Runtime &rt) return res; } -void installSequel(jsi::Runtime &rt, const char *docPath) +void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath) { // Transfer from pointer to variable to prevent de-allocation once calling function has finished docPathStr = std::string(docPath); auto pool = std::make_shared(); + invoker = jsCallInvoker; // Open/create db auto open = jsi::Function::createFromHostFunction( @@ -453,40 +465,40 @@ void installSequel(jsi::Runtime &rt, const char *docPath) 4, [pool](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { - - if(count < 4) { + if (count < 4) + { LOGW("NOT ENOUGH PARAMS PASSED"); } const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); auto params = make_shared(args[2].asObject(rt)); auto callback = make_shared((args[3].asObject(rt))); - auto task = [&rt, dbName, query, params, callback]() + { + try + { + SequelResult result = sequel_execute(rt, dbName, query, *params); + LOGW("ROPO FINISHED COMPUTING"); + if (result.type == SequelResultError) { - try { - SequelResult result = sequel_execute(rt, dbName, query, *params); - LOGW("ROPO FINISHED COMPUTING"); - if (result.type == SequelResultError) - { - LOGW("RETURNING ERROR"); - callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); - } - else - { - LOGW("RETURNING SUCCESS"); - callback->asObject(rt).asFunction(rt).call(rt, result.value); - LOGW("SUCCESS CALLED"); - } - - } catch(std::exception& exc) { - LOGW("Catched exception: %s", exc.what()); - } + LOGW("RETURNING ERROR"); + callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); + } + else + { + LOGW("RETURNING SUCCESS"); + callback->asObject(rt).asFunction(rt).call(rt, result.value); + LOGW("SUCCESS CALLED"); + } + } + catch (std::exception &exc) + { + LOGW("Catched exception: %s", exc.what()); + } + }; - }; - pool->queueWork(task); return {}; From 0af635ded78d804ca1f961638e92b59837e25d82 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Fri, 11 Mar 2022 15:13:10 +0100 Subject: [PATCH 13/47] Remove unnecesary pod dependency --- react-native-quick-sqlite.podspec | 1 - 1 file changed, 1 deletion(-) diff --git a/react-native-quick-sqlite.podspec b/react-native-quick-sqlite.podspec index 13cc87a..e50cf35 100644 --- a/react-native-quick-sqlite.podspec +++ b/react-native-quick-sqlite.podspec @@ -23,5 +23,4 @@ Pod::Spec.new do |s| s.source_files = "ios/**/*.{h,m,mm}", "cpp/**/*.{h,cpp,c}" s.dependency "React-Core" - # s.library = 'sqlite3' end From 9fe5c3eb2f6f26ea0598743a31776d210a0b1f82 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Fri, 11 Mar 2022 16:22:55 +0100 Subject: [PATCH 14/47] Android compiles (but needs a different installer because of jni references) --- android/CMakeLists.txt | 131 +++++++- android/build.gradle | 291 +++++++++++++++++- android/cpp-adapter.cpp | 2 +- .../com/reactnativesequel/SequelModule.java | 2 +- cpp/react-native-quick-sqlite.cpp | 2 +- cpp/react-native-quick-sqlite.h | 5 +- example/src/Database.ts | 6 +- src/index.ts | 10 +- 8 files changed, 418 insertions(+), 31 deletions(-) diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index a821baf..0f40102 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -1,8 +1,25 @@ cmake_minimum_required(VERSION 3.9.0) -set (PACKAGE_NAME "react-native-quick-sqlite") set (CMAKE_VERBOSE_MAKEFILE ON) set (CMAKE_CXX_STANDARD 14) +set (CMAKE_CXX_FLAGS "-DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_MOBILE=1 -DON_ANDROID -DONANDROID -DFOR_HERMES=${FOR_HERMES}") + +set (PACKAGE_NAME "react-native-quick-sqlite") +set (BUILD_DIR ${CMAKE_SOURCE_DIR}/build) +set (RN_SO_DIR ${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/jni/first-party/react/jni) + +if(${REACT_NATIVE_VERSION} LESS 66) + set ( + INCLUDE_JSI_CPP + "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi/jsi/jsi.cpp" + ) + set ( + INCLUDE_JSIDYNAMIC_CPP + "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi/jsi/JSIDynamic.cpp" + ) +endif() + +file (GLOB LIBFBJNI_INCLUDE_DIR "${BUILD_DIR}/fbjni-*-headers.jar/") include_directories( ../cpp @@ -10,15 +27,18 @@ include_directories( "${NODE_MODULES_DIR}/react-native/React/Base" "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi" "${NODE_MODULES_DIR}/react-native/ReactCommon/callinvoker" - "${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon" + "${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni" + "${NODE_MODULES_DIR}/react-native/ReactCommon" + "${NODE_MODULES_DIR}/react-native/ReactCommon/callinvoker" + "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi" + "${NODE_MODULES_DIR}/hermes-engine/android/include/" + ${INCLUDE_JSI_CPP} # only on older RN versions + ${INCLUDE_JSIDYNAMIC_CPP} # only on older RN versions ) -# find fbjni package -find_package(fbjni REQUIRED CONFIG) - -add_library(${PACKAGE_NAME} +add_library( + ${PACKAGE_NAME} SHARED - "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi/jsi/jsi.cpp" ../cpp/sequel.cpp ../cpp/sequel.h ../cpp/SequelResult.h @@ -29,4 +49,99 @@ add_library(${PACKAGE_NAME} cpp-adapter.cpp ) -target_link_libraries(sequel fbjni::fbjni android log) +# find fbjni package +file (GLOB LIBFBJNI_INCLUDE_DIR "${BUILD_DIR}/fbjni-*-headers.jar/") + +target_include_directories( + ${PACKAGE_NAME} + PRIVATE + # --- fbjni --- + "${LIBFBJNI_INCLUDE_DIR}" + # --- Third Party (required by RN) --- + "${BUILD_DIR}/third-party-ndk/boost" + "${BUILD_DIR}/third-party-ndk/double-conversion" + "${BUILD_DIR}/third-party-ndk/folly" + "${BUILD_DIR}/third-party-ndk/glog" + # --- React Native --- + "${NODE_MODULES_DIR}/react-native/React" + "${NODE_MODULES_DIR}/react-native/React/Base" + "${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/jni" + "${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni" + "${NODE_MODULES_DIR}/react-native/ReactCommon" + "${NODE_MODULES_DIR}/react-native/ReactCommon/callinvoker" + "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi" + "${NODE_MODULES_DIR}/hermes-engine/android/include/" + ${INCLUDE_JSI_CPP} # only on older RN versions + ${INCLUDE_JSIDYNAMIC_CPP} # only on older RN versions +) + +file (GLOB LIBRN_DIR "${BUILD_DIR}/react-native-0*/jni/${ANDROID_ABI}") + +if(${FOR_HERMES}) + file (GLOB LIBHERMES_DIR "${BUILD_DIR}/third-party-ndk/hermes/jni/${ANDROID_ABI}") + # Use Hermes + find_library( + JS_ENGINE_LIB + hermes + PATHS ${LIBHERMES_DIR} + NO_CMAKE_FIND_ROOT_PATH + ) +else() + file (GLOB LIBJSC_DIR "${BUILD_DIR}/android-jsc*.aar/jni/${ANDROID_ABI}") + # Use JSC + find_library( + JS_ENGINE_LIB + jscexecutor + PATHS ${LIBRN_DIR} + NO_CMAKE_FIND_ROOT_PATH + ) +endif() + +find_library( + FBJNI_LIB + fbjni + PATHS ${LIBRN_DIR} + NO_CMAKE_FIND_ROOT_PATH +) +find_library( + FOLLY_JSON_LIB + folly_json + PATHS ${LIBRN_DIR} + NO_CMAKE_FIND_ROOT_PATH +) + +find_library( + REACT_NATIVE_JNI_LIB + reactnativejni + PATHS ${LIBRN_DIR} + NO_CMAKE_FIND_ROOT_PATH +) +if(${REACT_NATIVE_VERSION} LESS 66) + # JSI lib didn't exist on RN 0.65 and before. Simply omit it. + set (JSI_LIB "") +else() + # RN 0.66 distributes libjsi.so, can be used instead of compiling jsi.cpp manually. + find_library( + JSI_LIB + jsi + PATHS ${LIBRN_DIR} + NO_CMAKE_FIND_ROOT_PATH + ) +endif() + +find_library( + LOG_LIB + log +) + +# target_link_libraries(sequel fbjni::fbjni android log) +target_link_libraries( + ${PACKAGE_NAME} + ${LOG_LIB} + ${JSI_LIB} + ${JS_ENGINE_LIB} # <-- Hermes or JSC + ${REACT_NATIVE_JNI_LIB} + ${FBJNI_LIB} + ${FOLLY_JSON_LIB} + android +) diff --git a/android/build.gradle b/android/build.gradle index 79526a7..3ff36e4 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,4 +1,4 @@ - +import org.apache.tools.ant.filters.ReplaceTokens import java.nio.file.Paths buildscript { @@ -10,10 +10,12 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'de.undercouch:gradle-download-task:4.1.2' } } apply plugin: 'com.android.library' +apply plugin: 'de.undercouch.download' def getExtOrDefault(name) { return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['Sequel_' + name] @@ -41,16 +43,21 @@ static def findNodeModules(baseDir) { def nodeModules = findNodeModules(projectDir); logger.warn("react-native-quick-sqlite: node_modules/ found at: ${nodeModules}"); -android { - buildFeatures { - prefab true - } - dependencies { - implementation 'com.facebook.fbjni:fbjni:0.2.2' - } - configurations { - all*.exclude module: 'fbjni-java-only' +def reactNative = new File("$nodeModules/react-native") + +def reactProperties = new Properties() +file("$nodeModules/react-native/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) } +def REACT_NATIVE_VERSION = reactProperties.getProperty("VERSION_NAME").split("\\.")[1].toInteger() + +def FOR_HERMES = System.getenv("FOR_HERMES") == "True" +rootProject.getSubprojects().forEach({ project -> + if (project.plugins.hasPlugin("com.android.application")) { + FOR_HERMES = project.ext.react.enableHermes } +}) +logger.warn("JSI-WS: Building with ${FOR_HERMES ? "Hermes" : "JSC"}...") + +android { compileSdkVersion getExtOrIntegerDefault('compileSdkVersion') buildToolsVersion getExtOrDefault('buildToolsVersion') @@ -63,9 +70,12 @@ android { externalNativeBuild { cmake { - cppFlags "-O2 -frtti -fexceptions -Wall -Wno-unused-variable -fstack-protector-all" + cppFlags "-O2", "-fexceptions", "-frtti", "-std=c++1y", "-DONANDROID" abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' - arguments "-DNODE_MODULES_DIR=${nodeModules} -DANDROID_STL=c++_shared" + arguments '-DANDROID_STL=c++_shared', + "-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION}", + "-DNODE_MODULES_DIR=${nodeModules}", + "-DFOR_HERMES=${FOR_HERMES}" } } @@ -76,6 +86,12 @@ android { path "CMakeLists.txt" } } + + packagingOptions { + // Exclude all Libraries that are already present in the user's app (through React Native or by him installing REA) + excludes = ["**/libc++_shared.so", "**/libfbjni.so", "**/libjsi.so", "**/libreactnativejni.so", "**/libfolly_json.so", "**/libjscexecutor.so", "**/libhermes.so"] + exclude "META-INF/**" + } buildTypes { release { @@ -89,6 +105,11 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + configurations { + extractHeaders + extractJNI + } } repositories { @@ -162,4 +183,250 @@ repositories { dependencies { // noinspection GradleDynamicVersion api 'com.facebook.react:react-native:+' + + //noinspection GradleDynamicVersion + extractHeaders("com.facebook.fbjni:fbjni:+:headers") + //noinspection GradleDynamicVersion + extractJNI("com.facebook.fbjni:fbjni:+") + + def rnAAR = fileTree("${nodeModules}/react-native/android").matching({ it.include "**/**/*.aar" }).singleFile + def jscAAR = fileTree("${nodeModules}/jsc-android/dist/org/webkit/android-jsc").matching({ it.include "**/**/*.aar" }).singleFile + + + extractJNI(files(rnAAR, jscAAR)) +} + + +// third-party-ndk deps headers +// mostly a copy of https://github.com/software-mansion/react-native-reanimated/blob/master/android/build.gradle#L115 + +def downloadsDir = new File("$buildDir/downloads") +def thirdPartyNdkDir = new File("$buildDir/third-party-ndk") +def thirdPartyVersionsFile = new File("${nodeModules}/react-native/ReactAndroid/gradle.properties") +def thirdPartyVersions = new Properties() +thirdPartyVersions.load(new FileInputStream(thirdPartyVersionsFile)) + +def BOOST_VERSION = thirdPartyVersions["BOOST_VERSION"] +def boost_file = new File(downloadsDir, "boost_${BOOST_VERSION}.tar.gz") +def DOUBLE_CONVERSION_VERSION = thirdPartyVersions["DOUBLE_CONVERSION_VERSION"] +def double_conversion_file = new File(downloadsDir, "double-conversion-${DOUBLE_CONVERSION_VERSION}.tar.gz") +def FOLLY_VERSION = thirdPartyVersions["FOLLY_VERSION"] +def folly_file = new File(downloadsDir, "folly-${FOLLY_VERSION}.tar.gz") +def GLOG_VERSION = thirdPartyVersions["GLOG_VERSION"] +def glog_file = new File(downloadsDir, "glog-${GLOG_VERSION}.tar.gz") + +task createNativeDepsDirectories { + doLast { + downloadsDir.mkdirs() + thirdPartyNdkDir.mkdirs() + } +} + +task downloadBoost(dependsOn: createNativeDepsDirectories, type: Download) { + src("https://github.com/react-native-community/boost-for-react-native/releases/download/v${BOOST_VERSION.replace("_", ".")}-0/boost_${BOOST_VERSION}.tar.gz") + onlyIfNewer(true) + overwrite(false) + dest(boost_file) +} + +task prepareBoost(dependsOn: downloadBoost, type: Copy) { + from(tarTree(resources.gzip(downloadBoost.dest))) + from("src/main/jni/third-party/boost/Android.mk") + include("Android.mk", "boost_${BOOST_VERSION}/boost/**/*.hpp", "boost/boost/**/*.hpp") + includeEmptyDirs = false + into("$thirdPartyNdkDir") // /boost_X_XX_X + doLast { + file("$thirdPartyNdkDir/boost_${BOOST_VERSION}").renameTo("$thirdPartyNdkDir/boost") + } +} + +task downloadDoubleConversion(dependsOn: createNativeDepsDirectories, type: Download) { + src("https://github.com/google/double-conversion/archive/v${DOUBLE_CONVERSION_VERSION}.tar.gz") + onlyIfNewer(true) + overwrite(false) + dest(double_conversion_file) +} + +task prepareDoubleConversion(dependsOn: downloadDoubleConversion, type: Copy) { + from(tarTree(downloadDoubleConversion.dest)) + from("src/main/jni/third-party/double-conversion/Android.mk") + include("double-conversion-${DOUBLE_CONVERSION_VERSION}/src/**/*", "Android.mk") + filesMatching("*/src/**/*", { fname -> fname.path = "double-conversion/${fname.name}" }) + includeEmptyDirs = false + into("$thirdPartyNdkDir/double-conversion") +} + +task downloadFolly(dependsOn: createNativeDepsDirectories, type: Download) { + src("https://github.com/facebook/folly/archive/v${FOLLY_VERSION}.tar.gz") + onlyIfNewer(true) + overwrite(false) + dest(folly_file) +} + +task prepareFolly(dependsOn: downloadFolly, type: Copy) { + from(tarTree(downloadFolly.dest)) + from("src/main/jni/third-party/folly/Android.mk") + include("folly-${FOLLY_VERSION}/folly/**/*", "Android.mk") + eachFile { fname -> fname.path = (fname.path - "folly-${FOLLY_VERSION}/") } + includeEmptyDirs = false + into("$thirdPartyNdkDir/folly") +} + +task downloadGlog(dependsOn: createNativeDepsDirectories, type: Download) { + src("https://github.com/google/glog/archive/v${GLOG_VERSION}.tar.gz") + onlyIfNewer(true) + overwrite(false) + dest(glog_file) +} + +task prepareGlog(dependsOn: downloadGlog, type: Copy) { + from(tarTree(downloadGlog.dest)) + from("src/main/jni/third-party/glog/") + include("glog-${GLOG_VERSION}/src/**/*", "Android.mk", "config.h") + includeEmptyDirs = false + filesMatching("**/*.h.in") { + filter(ReplaceTokens, tokens: [ + ac_cv_have_unistd_h : "1", + ac_cv_have_stdint_h : "1", + ac_cv_have_systypes_h : "1", + ac_cv_have_inttypes_h : "1", + ac_cv_have_libgflags : "0", + ac_google_start_namespace : "namespace google {", + ac_cv_have_uint16_t : "1", + ac_cv_have_u_int16_t : "1", + ac_cv_have___uint16 : "0", + ac_google_end_namespace : "}", + ac_cv_have___builtin_expect : "1", + ac_google_namespace : "google", + ac_cv___attribute___noinline : "__attribute__ ((noinline))", + ac_cv___attribute___noreturn : "__attribute__ ((noreturn))", + ac_cv___attribute___printf_4_5: "__attribute__((__format__ (__printf__, 4, 5)))" + ]) + it.path = (it.name - ".in") + } + into("$thirdPartyNdkDir/glog") + + doLast { + copy { + from(fileTree(dir: "$thirdPartyNdkDir/glog", includes: ["stl_logging.h", "logging.h", "raw_logging.h", "vlog_is_on.h", "**/src/glog/log_severity.h"]).files) + includeEmptyDirs = false + into("$thirdPartyNdkDir/glog/exported/glog") + } + } } + +task prepareThirdPartyNdkHeaders { + if (!boost_file.exists()) { + dependsOn(prepareBoost) + } + if (!double_conversion_file.exists()) { + dependsOn(prepareDoubleConversion) + } + if (!folly_file.exists()) { + dependsOn(prepareFolly) + } + if (!glog_file.exists()) { + dependsOn(prepareGlog) + } +} + +prepareThirdPartyNdkHeaders.mustRunAfter createNativeDepsDirectories + +task prepareHermes() { + doLast { + def hermesPackagePath = file("${nodeModules}/hermes-engine") + if (!hermesPackagePath.exists()) { + throw new GradleScriptException("Could not find the hermes-engine npm package", null) + } + + def hermesAAR = file("$hermesPackagePath/android/hermes-debug.aar") + if (!hermesAAR.exists()) { + throw new GradleScriptException("The hermes-engine npm package is missing \"android/hermes-debug.aar\"", null) + } + + def soFiles = zipTree(hermesAAR).matching({ it.include "**/*.so" }) + + copy { + from soFiles + from "$reactNative/ReactAndroid/src/main/jni/first-party/hermes/Android.mk" + into "$thirdPartyNdkDir/hermes" + } + } +} + +prepareHermes.mustRunAfter prepareThirdPartyNdkHeaders + +task prepareJSC { + doLast { + def jscPackagePath = file("${nodeModules}/jsc-android") + if (!jscPackagePath.exists()) { + throw new GradleScriptException("Could not find the jsc-android npm package", null) + } + + def jscDist = file("$jscPackagePath/dist") + if (!jscDist.exists()) { + throw new GradleScriptException("The jsc-android npm package is missing its \"dist\" directory", null) + } + + def jscAAR = fileTree(jscDist).matching({ it.include "**/android-jsc/**/*.aar" }).singleFile + def soFiles = zipTree(jscAAR).matching({ it.include "**/*.so" }) + + def headerFiles = fileTree(jscDist).matching({ it.include "**/include/*.h" }) + + copy { + from(soFiles) + from(headerFiles) + from("$reactNative/ReactAndroid/src/main/jni/third-party/jsc/Android.mk") + + filesMatching("**/*.h", { it.path = "JavaScriptCore/${it.name}" }) + + includeEmptyDirs(false) + into("$thirdPartyNdkDir/jsc") + } + } +} + +prepareJSC.mustRunAfter prepareHermes + +task extractAARHeaders { + doLast { + configurations.extractHeaders.files.each { + def file = it.absoluteFile + copy { + from zipTree(file) + into "$buildDir/$file.name" + include "**/*.h" + } + } + } +} + +extractAARHeaders.mustRunAfter prepareJSC + +task extractJNIFiles { + doLast { + configurations.extractJNI.files.each { + def file = it.absoluteFile + + copy { + from zipTree(file) + into "$buildDir/$file.name" + include "jni/**/*" + } + } + } +} + +extractJNIFiles.mustRunAfter extractAARHeaders + +// pre-native build pipeline + +tasks.whenTaskAdded { task -> + if (!task.name.contains('Clean') && (task.name.contains('externalNative') || task.name.contains('CMake'))) { + task.dependsOn(extractAARHeaders) + task.dependsOn(extractJNIFiles) + task.dependsOn(prepareJSC) + task.dependsOn(prepareHermes) + task.dependsOn(prepareThirdPartyNdkHeaders) + } +} \ No newline at end of file diff --git a/android/cpp-adapter.cpp b/android/cpp-adapter.cpp index 6857bb0..baf4167 100644 --- a/android/cpp-adapter.cpp +++ b/android/cpp-adapter.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include "react-native-quick-sqlite.h" diff --git a/android/src/main/java/com/reactnativesequel/SequelModule.java b/android/src/main/java/com/reactnativesequel/SequelModule.java index bba8b99..69be937 100644 --- a/android/src/main/java/com/reactnativesequel/SequelModule.java +++ b/android/src/main/java/com/reactnativesequel/SequelModule.java @@ -9,7 +9,7 @@ import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; class SequelModule extends ReactContextBaseJavaModule { - public static final String NAME = "react-native-quick-sqlite"; + public static final String NAME = "QuickSQLite"; private static native void initialize(long jsiPtr, CallInvokerHolderImpl jsCallInvokerHolder, String docDir); public SequelModule(ReactApplicationContext context) { diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 2198025..5c03b54 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -143,7 +143,7 @@ const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) } string docPathStr; -react::CallInvoker invoker; +std::shared_ptr invoker; jsi::Object createError(jsi::Runtime &rt, string message) { diff --git a/cpp/react-native-quick-sqlite.h b/cpp/react-native-quick-sqlite.h index d2083e4..ca685d9 100644 --- a/cpp/react-native-quick-sqlite.h +++ b/cpp/react-native-quick-sqlite.h @@ -9,11 +9,10 @@ #include #include -// #include +#include using namespace facebook; -// void installSequel(jsi::Runtime& rt, std::shared_ptr callInvoker); -void installSequel(jsi::Runtime &rt, const char *docPath); +void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath); void cleanUpSequel(); diff --git a/example/src/Database.ts b/example/src/Database.ts index f934251..fcc9d54 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -32,9 +32,9 @@ export const lowLevelInit = async () => { // console.warn('async error', err); // }); - sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { - console.warn('asyncRes', asyncRes); - }); + // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { + // console.warn('asyncRes', asyncRes); + // }); // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { // console.warn('asyncRes2', asyncRes); diff --git a/src/index.ts b/src/index.ts index 9e035ba..decaaa7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,15 @@ import { NativeModules } from 'react-native'; const SequelModule = NativeModules.QuickSQLite; +console.warn('ROPO LOADING'); -if (SequelModule && typeof SequelModule.install === 'function') { - SequelModule.install(); +if (SequelModule) { + console.warn('MODULE DETECTED'); + if (typeof SequelModule.install === 'function') { + console.warn('INSTALLING SQLITE BINDINGS'); + + SequelModule.install(); + } } /** * JSI BINDINGS DO NOT WORK WHEN CONNECTED TO THE CHROME DEBUGGER From aa78a4f240024bc325dd9cf1232d57f391ba1fec Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sat, 12 Mar 2022 10:27:03 +0100 Subject: [PATCH 15/47] WIP to store the callInvoker holder --- android/CMakeLists.txt | 2 +- android/QuickSQLiteBridge.cpp | 66 +++++++++++++++++++ android/QuickSQLiteBridge.h | 38 +++++++++++ android/cpp-adapter.cpp | 2 +- .../reactnativesequel/QuickSQLiteBridge.java | 43 ++++++++++++ .../com/reactnativesequel/SequelModule.java | 24 +++---- example/src/Database.ts | 8 +-- 7 files changed, 159 insertions(+), 24 deletions(-) create mode 100644 android/QuickSQLiteBridge.cpp create mode 100644 android/QuickSQLiteBridge.h create mode 100644 android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 0f40102..a1b7e02 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -46,7 +46,7 @@ add_library( ../cpp/react-native-quick-sqlite.h ../cpp/sqlite3.h ../cpp/sqlite3.c - cpp-adapter.cpp + QuickSQLiteBridge.cpp ) # find fbjni package diff --git a/android/QuickSQLiteBridge.cpp b/android/QuickSQLiteBridge.cpp new file mode 100644 index 0000000..45fde0e --- /dev/null +++ b/android/QuickSQLiteBridge.cpp @@ -0,0 +1,66 @@ +// +// Created by Sergei Golishnikov on 08/03/2022. +// + +#include "QuickSQLiteBridge.h" + +#include +#include "iostream" +#include "react-native-quick-sqlite.h" + +using namespace facebook; +using namespace facebook::jni; + +using TSelf = local_ref::jhybriddata>; + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) +{ + return facebook::jni::initialize(vm, [] + { QuickSQLiteBridge::registerNatives(); }); +} + +// JNI binding +void QuickSQLiteBridge::registerNatives() +{ + __android_log_print(ANDROID_LOG_VERBOSE, "😇", "registerNatives"); + registerHybrid({ + makeNativeMethod("initHybrid", + QuickSQLiteBridge::initHybrid), + makeNativeMethod("installJSIBindings", + QuickSQLiteBridge::installJSIBindings), + }); +} + +QuickSQLiteBridge::QuickSQLiteBridge( + jni::alias_ref jThis, + jsi::Runtime *rt, + std::shared_ptr jsCallInvoker) + : javaPart_(jni::make_global(jThis)), + runtime_(rt), + jsCallInvoker_(std::move(jsCallInvoker)) {} + +// JNI init +TSelf QuickSQLiteBridge::initHybrid( + alias_ref jThis, + jlong jsContext, + jni::alias_ref + jsCallInvokerHolder) +{ + + __android_log_write(ANDROID_LOG_INFO, "🥲", "initHybrid..."); + auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); + return makeCxxInstance(jThis, (jsi::Runtime *)jsContext, jsCallInvoker); +} + +void QuickSQLiteBridge::installJSIBindings( + jlong jsContext, + jni::alias_ref jsCallInvokerHolder, + jstring docPath) +{ + __android_log_print(ANDROID_LOG_VERBOSE, "😇", "installJSIBindings"); + // jThis.env + auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); + jboolean isCopy; + const char *docPathString = (env)->GetStringUTFChars(docPath, &isCopy); + installSequel(*reinterpret_cast(jsContext), jsCallInvoker, docPathString); +} \ No newline at end of file diff --git a/android/QuickSQLiteBridge.h b/android/QuickSQLiteBridge.h new file mode 100644 index 0000000..ad8712e --- /dev/null +++ b/android/QuickSQLiteBridge.h @@ -0,0 +1,38 @@ + +// +// Created by Sergei Golishnikov on 08/03/2022. +// +#include +#include +#include +#include + +class QuickSQLiteBridge : public facebook::jni::HybridClass +{ + +public: + static constexpr auto kJavaDescriptor = "Lcom/reactnativequicksqlite/QuickSQLiteBridge;"; + static facebook::jni::local_ref initHybrid( + facebook::jni::alias_ref jThis, + jlong jsContext, + facebook::jni::alias_ref jsCallInvokerHolder); + + static void registerNatives(); + + void installJSIBindings( + jlong jsContext, + facebook::jni::alias_ref jsCallInvokerHolder, + jstring docPath); + // void emitJs(jstring name, jstring data); + +private: + friend HybridBase; + facebook::jni::global_ref javaPart_; + facebook::jsi::Runtime *runtime_; + std::shared_ptr jsCallInvoker_; + std::map> webSocketCallbacks_; + explicit QuickSQLiteBridge( + facebook::jni::alias_ref jThis, + facebook::jsi::Runtime *rt, + std::shared_ptr jsCallInvoker); +}; diff --git a/android/cpp-adapter.cpp b/android/cpp-adapter.cpp index baf4167..6857bb0 100644 --- a/android/cpp-adapter.cpp +++ b/android/cpp-adapter.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include "react-native-quick-sqlite.h" diff --git a/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java b/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java new file mode 100644 index 0000000..7fdeec8 --- /dev/null +++ b/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java @@ -0,0 +1,43 @@ +package com.reactnativequicksqlite; + +import android.os.Handler; +import android.os.Looper; + +import androidx.collection.ArrayMap; + +import com.facebook.jni.HybridData; +import com.facebook.jni.annotations.DoNotStrip; +import com.facebook.react.bridge.JavaScriptContextHolder; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; +import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; + +@SuppressWarnings("JavaJniMissingFunction") +public class QuickSQLiteBridge { + @DoNotStrip + @SuppressWarnings("unused") + private HybridData mHybridData; + + public static final QuickSQLiteBridge instance = new QuickSQLiteBridge(); + + public boolean install(ReactApplicationContext context) { + try { + JavaScriptContextHolder jsContext = context.getJavaScriptContextHolder(); + CallInvokerHolder jsCallInvokerHolder = context.getCatalystInstance().getJSCallInvokerHolder(); + mHybridData = initHybrid(jsContext.get(), (CallInvokerHolderImpl)jsCallInvokerHolder); + + installJSIBindings( + jsContext.get(), + (CallInvokerHolderImpl)jsCallInvokerHolder, + context.getFilesDir().getAbsolutePath() + ); + return true; + } catch (Exception exception) { + return false; + } + } + + private native void installJSIBindings(long jsContext, CallInvokerHolderImpl jsCallInvokerHolder, String docPath); + private native HybridData initHybrid(long jsContext, CallInvokerHolderImpl jsCallInvokerHolder); + +} \ No newline at end of file diff --git a/android/src/main/java/com/reactnativesequel/SequelModule.java b/android/src/main/java/com/reactnativesequel/SequelModule.java index 69be937..f361c64 100644 --- a/android/src/main/java/com/reactnativesequel/SequelModule.java +++ b/android/src/main/java/com/reactnativesequel/SequelModule.java @@ -3,15 +3,18 @@ import androidx.annotation.NonNull; import android.util.Log; +import com.facebook.jni.HybridData; +import com.facebook.jni.annotations.DoNotStrip; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; +import com.facebook.react.module.annotations.ReactModule; +@ReactModule(name = SequelModule.NAME) class SequelModule extends ReactContextBaseJavaModule { - public static final String NAME = "QuickSQLite"; - private static native void initialize(long jsiPtr, CallInvokerHolderImpl jsCallInvokerHolder, String docDir); - + public static final String NAME = "QuickSQLiteBridge"; + public SequelModule(ReactApplicationContext context) { super(context); } @@ -23,21 +26,12 @@ public String getName() { } @ReactMethod(isBlockingSynchronousMethod = true) - public boolean install() { + public void install() { try { System.loadLibrary("react-native-quick-sqlite"); - - ReactApplicationContext context = getReactApplicationContext(); - CallInvokerHolderImpl holder = (CallInvokerHolderImpl)context.getCatalystInstance().getJSCallInvokerHolder(); - - initialize( - context.getJavaScriptContextHolder().get(), - holder, - context.getFilesDir().getAbsolutePath() - ); - return true; + QuickSQLiteBridge.instance.install(getReactApplicationContext()); } catch (Exception exception) { - return false; + Log.e(NAME, "Failed to install JSI Bindings!", exception); } } } \ No newline at end of file diff --git a/example/src/Database.ts b/example/src/Database.ts index fcc9d54..7c07d70 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -6,23 +6,19 @@ import { User } from './model/User'; import { Buffer } from 'buffer'; export const lowLevelInit = async () => { - sqlite.open('test', 'sample/database'); - + // sqlite.open('test', 'sample/database'); // const result = sqlite.executeSql( // 'test', // 'CREATE TABLE "User" ( name TEXT NOT NULL );', // undefined // ); // console.warn('tried to create table result', result); - // sqlite.executeSql( // 'test', // 'INSERT INTO "User" (name) VALUES(\'OSCAR\')', // undefined // ); - // console.warn('INSERTED DATA'); - // sqlite // .asyncExecuteSql('test', 'SELECT * FROM "User";', []) // .then((asyncRes) => { @@ -31,11 +27,9 @@ export const lowLevelInit = async () => { // .catch((err) => { // console.warn('async error', err); // }); - // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { // console.warn('asyncRes', asyncRes); // }); - // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { // console.warn('asyncRes2', asyncRes); // }); From 4aa42fc1f4d46d6ee78780480b62ce4f8678e96d Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sat, 12 Mar 2022 17:20:38 +0100 Subject: [PATCH 16/47] Android compiles but still crashes on callback --- android/QuickSQLiteBridge.cpp | 14 +++++++------- android/QuickSQLiteBridge.h | 6 +++--- .../com/reactnativesequel/QuickSQLiteBridge.java | 3 +-- .../java/com/reactnativesequel/SequelModule.java | 3 ++- cpp/react-native-quick-sqlite.cpp | 9 ++++++--- example/src/Database.ts | 8 ++++---- 6 files changed, 23 insertions(+), 20 deletions(-) diff --git a/android/QuickSQLiteBridge.cpp b/android/QuickSQLiteBridge.cpp index 45fde0e..ddc6f74 100644 --- a/android/QuickSQLiteBridge.cpp +++ b/android/QuickSQLiteBridge.cpp @@ -7,6 +7,7 @@ #include #include "iostream" #include "react-native-quick-sqlite.h" +#include using namespace facebook; using namespace facebook::jni; @@ -54,13 +55,12 @@ TSelf QuickSQLiteBridge::initHybrid( void QuickSQLiteBridge::installJSIBindings( jlong jsContext, - jni::alias_ref jsCallInvokerHolder, - jstring docPath) + // jni::alias_ref jsCallInvokerHolder, + jni::alias_ref docPath) { __android_log_print(ANDROID_LOG_VERBOSE, "😇", "installJSIBindings"); - // jThis.env - auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); - jboolean isCopy; - const char *docPathString = (env)->GetStringUTFChars(docPath, &isCopy); - installSequel(*reinterpret_cast(jsContext), jsCallInvoker, docPathString); + // auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); + std::string docPathString = docPath->toStdString(); + // LOGW("INSTALL SEQUEL BEING CALLED %s", docPathString); + installSequel(*reinterpret_cast(jsContext), jsCallInvoker_, docPathString.c_str()); } \ No newline at end of file diff --git a/android/QuickSQLiteBridge.h b/android/QuickSQLiteBridge.h index ad8712e..dd8ea7d 100644 --- a/android/QuickSQLiteBridge.h +++ b/android/QuickSQLiteBridge.h @@ -7,6 +7,8 @@ #include #include +using namespace facebook; + class QuickSQLiteBridge : public facebook::jni::HybridClass { @@ -21,9 +23,7 @@ class QuickSQLiteBridge : public facebook::jni::HybridClass void installJSIBindings( jlong jsContext, - facebook::jni::alias_ref jsCallInvokerHolder, - jstring docPath); - // void emitJs(jstring name, jstring data); + jni::alias_ref docPath); private: friend HybridBase; diff --git a/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java b/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java index 7fdeec8..0f61228 100644 --- a/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java +++ b/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java @@ -28,7 +28,6 @@ public boolean install(ReactApplicationContext context) { installJSIBindings( jsContext.get(), - (CallInvokerHolderImpl)jsCallInvokerHolder, context.getFilesDir().getAbsolutePath() ); return true; @@ -37,7 +36,7 @@ public boolean install(ReactApplicationContext context) { } } - private native void installJSIBindings(long jsContext, CallInvokerHolderImpl jsCallInvokerHolder, String docPath); + private native void installJSIBindings(long jsContext, String docPath); private native HybridData initHybrid(long jsContext, CallInvokerHolderImpl jsCallInvokerHolder); } \ No newline at end of file diff --git a/android/src/main/java/com/reactnativesequel/SequelModule.java b/android/src/main/java/com/reactnativesequel/SequelModule.java index f361c64..9ef2ad8 100644 --- a/android/src/main/java/com/reactnativesequel/SequelModule.java +++ b/android/src/main/java/com/reactnativesequel/SequelModule.java @@ -13,7 +13,7 @@ @ReactModule(name = SequelModule.NAME) class SequelModule extends ReactContextBaseJavaModule { - public static final String NAME = "QuickSQLiteBridge"; + public static final String NAME = "QuickSQLite"; public SequelModule(ReactApplicationContext context) { super(context); @@ -28,6 +28,7 @@ public String getName() { @ReactMethod(isBlockingSynchronousMethod = true) public void install() { try { + // Log.w(NAME, 'ROPO INSTALL BEING CALLED') System.loadLibrary("react-native-quick-sqlite"); QuickSQLiteBridge.instance.install(getReactApplicationContext()); } catch (Exception exception) { diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 5c03b54..1e2ed64 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -472,7 +472,7 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); auto params = make_shared(args[2].asObject(rt)); - auto callback = make_shared((args[3].asObject(rt))); + auto callback = make_shared((args[3].asObject(rt).asFunction(rt))); auto task = [&rt, dbName, query, params, callback]() @@ -484,12 +484,15 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI if (result.type == SequelResultError) { LOGW("RETURNING ERROR"); - callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); +// callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); } else { LOGW("RETURNING SUCCESS"); - callback->asObject(rt).asFunction(rt).call(rt, result.value); + invoker->invokeAsync([&rt, &callback, &result]() { + callback->call(rt, result.value); + }); + LOGW("SUCCESS CALLED"); } } diff --git a/example/src/Database.ts b/example/src/Database.ts index 7c07d70..35051dd 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -6,7 +6,7 @@ import { User } from './model/User'; import { Buffer } from 'buffer'; export const lowLevelInit = async () => { - // sqlite.open('test', 'sample/database'); + sqlite.open('test', 'sample/database'); // const result = sqlite.executeSql( // 'test', // 'CREATE TABLE "User" ( name TEXT NOT NULL );', @@ -30,9 +30,9 @@ export const lowLevelInit = async () => { // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { // console.warn('asyncRes', asyncRes); // }); - // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { - // console.warn('asyncRes2', asyncRes); - // }); + sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { + console.warn('asyncRes2', asyncRes); + }); }; export async function typeORMInit() { From aa7888e8f96e9f26419c3795659e27ddbfeb1c80 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sat, 12 Mar 2022 18:03:46 +0100 Subject: [PATCH 17/47] Try to use invoker to call callback --- cpp/react-native-quick-sqlite.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 1e2ed64..e8d24ac 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -472,7 +472,7 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); auto params = make_shared(args[2].asObject(rt)); - auto callback = make_shared((args[3].asObject(rt).asFunction(rt))); + auto callback = make_shared((args[3].asObject(rt))); auto task = [&rt, dbName, query, params, callback]() @@ -489,8 +489,8 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI else { LOGW("RETURNING SUCCESS"); - invoker->invokeAsync([&rt, &callback, &result]() { - callback->call(rt, result.value); + invoker->invokeAsync([&] { + callback->asObject(rt).asFunction(rt).call(rt, result.value); }); LOGW("SUCCESS CALLED"); From c58d90e482b8fcaa9b703474e5b14e2f27192dbc Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sat, 12 Mar 2022 19:25:44 +0100 Subject: [PATCH 18/47] Try a different proxy object --- android/CMakeLists.txt | 2 +- android/QuickSQLiteBridge.cpp | 66 ------------------- android/QuickSQLiteBridge.h | 38 ----------- android/cpp-adapter.cpp | 44 ++++++++----- .../QuickSQLiteBridge.java | 38 +++++++++++ .../SequelModule.java | 4 +- .../SequelPackage.java | 0 .../reactnativesequel/QuickSQLiteBridge.java | 42 ------------ cpp/react-native-quick-sqlite.cpp | 13 ++-- 9 files changed, 79 insertions(+), 168 deletions(-) delete mode 100644 android/QuickSQLiteBridge.cpp delete mode 100644 android/QuickSQLiteBridge.h create mode 100644 android/src/main/java/com/reactnativequicksqlite/QuickSQLiteBridge.java rename android/src/main/java/com/{reactnativesequel => reactnativequicksqlite}/SequelModule.java (94%) rename android/src/main/java/com/{reactnativesequel => reactnativequicksqlite}/SequelPackage.java (100%) delete mode 100644 android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index a1b7e02..0f40102 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -46,7 +46,7 @@ add_library( ../cpp/react-native-quick-sqlite.h ../cpp/sqlite3.h ../cpp/sqlite3.c - QuickSQLiteBridge.cpp + cpp-adapter.cpp ) # find fbjni package diff --git a/android/QuickSQLiteBridge.cpp b/android/QuickSQLiteBridge.cpp deleted file mode 100644 index ddc6f74..0000000 --- a/android/QuickSQLiteBridge.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// -// Created by Sergei Golishnikov on 08/03/2022. -// - -#include "QuickSQLiteBridge.h" - -#include -#include "iostream" -#include "react-native-quick-sqlite.h" -#include - -using namespace facebook; -using namespace facebook::jni; - -using TSelf = local_ref::jhybriddata>; - -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) -{ - return facebook::jni::initialize(vm, [] - { QuickSQLiteBridge::registerNatives(); }); -} - -// JNI binding -void QuickSQLiteBridge::registerNatives() -{ - __android_log_print(ANDROID_LOG_VERBOSE, "😇", "registerNatives"); - registerHybrid({ - makeNativeMethod("initHybrid", - QuickSQLiteBridge::initHybrid), - makeNativeMethod("installJSIBindings", - QuickSQLiteBridge::installJSIBindings), - }); -} - -QuickSQLiteBridge::QuickSQLiteBridge( - jni::alias_ref jThis, - jsi::Runtime *rt, - std::shared_ptr jsCallInvoker) - : javaPart_(jni::make_global(jThis)), - runtime_(rt), - jsCallInvoker_(std::move(jsCallInvoker)) {} - -// JNI init -TSelf QuickSQLiteBridge::initHybrid( - alias_ref jThis, - jlong jsContext, - jni::alias_ref - jsCallInvokerHolder) -{ - - __android_log_write(ANDROID_LOG_INFO, "🥲", "initHybrid..."); - auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); - return makeCxxInstance(jThis, (jsi::Runtime *)jsContext, jsCallInvoker); -} - -void QuickSQLiteBridge::installJSIBindings( - jlong jsContext, - // jni::alias_ref jsCallInvokerHolder, - jni::alias_ref docPath) -{ - __android_log_print(ANDROID_LOG_VERBOSE, "😇", "installJSIBindings"); - // auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); - std::string docPathString = docPath->toStdString(); - // LOGW("INSTALL SEQUEL BEING CALLED %s", docPathString); - installSequel(*reinterpret_cast(jsContext), jsCallInvoker_, docPathString.c_str()); -} \ No newline at end of file diff --git a/android/QuickSQLiteBridge.h b/android/QuickSQLiteBridge.h deleted file mode 100644 index dd8ea7d..0000000 --- a/android/QuickSQLiteBridge.h +++ /dev/null @@ -1,38 +0,0 @@ - -// -// Created by Sergei Golishnikov on 08/03/2022. -// -#include -#include -#include -#include - -using namespace facebook; - -class QuickSQLiteBridge : public facebook::jni::HybridClass -{ - -public: - static constexpr auto kJavaDescriptor = "Lcom/reactnativequicksqlite/QuickSQLiteBridge;"; - static facebook::jni::local_ref initHybrid( - facebook::jni::alias_ref jThis, - jlong jsContext, - facebook::jni::alias_ref jsCallInvokerHolder); - - static void registerNatives(); - - void installJSIBindings( - jlong jsContext, - jni::alias_ref docPath); - -private: - friend HybridBase; - facebook::jni::global_ref javaPart_; - facebook::jsi::Runtime *runtime_; - std::shared_ptr jsCallInvoker_; - std::map> webSocketCallbacks_; - explicit QuickSQLiteBridge( - facebook::jni::alias_ref jThis, - facebook::jsi::Runtime *rt, - std::shared_ptr jsCallInvoker); -}; diff --git a/android/cpp-adapter.cpp b/android/cpp-adapter.cpp index 6857bb0..9c236a5 100644 --- a/android/cpp-adapter.cpp +++ b/android/cpp-adapter.cpp @@ -1,24 +1,38 @@ #include -#include #include +#include +#include #include "react-native-quick-sqlite.h" +#include "logs.h" +#include -extern "C" JNIEXPORT void JNICALL -Java_com_reactnativequicksqlite_SequelModule_initialize(JNIEnv *env, - jclass clazz, - jlong jsiPtr, - jni::alias_ref jsCallInvokerHolder, - jstring docPath) +struct QuickSQLiteBridge : jni::JavaClass { - jboolean isCopy; - const char *docPathString = (env)->GetStringUTFChars(docPath, &isCopy); - auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); + static constexpr auto kJavaDescriptor = "Lcom/reactnativequicksqlite/QuickSQLiteBridge;"; - installSequel(*reinterpret_cast(jsiPtr), jsCallInvoker, docPathString); -} + static void registerNatives() + { + javaClassStatic()->registerNatives({// initialization for JSI + makeNativeMethod("installNativeJsi", QuickSQLiteBridge::installNativeJsi)}); + } -extern "C" JNIEXPORT void JNICALL -Java_com_reactnativequicksqlite_SequelModule_destruct(JNIEnv *env, jclass clazz) +private: + static void installNativeJsi(jni::alias_ref thiz, + jlong jsiRuntimePtr, + jni::alias_ref jsCallInvokerHolder, + jni::alias_ref docPath) + { + LOGW("ROPO INSTALLING BINDINGS 2") + auto jsiRuntime = reinterpret_cast(jsiRuntimePtr); + auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); + std::string docPathString = docPath->toStdString(); + + installSequel(*jsiRuntime, jsCallInvoker, docPathString.c_str()); + } +}; + +JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) { - cleanUpSequel(); + return jni::initialize(vm, [] + { QuickSQLiteBridge::registerNatives(); }); } \ No newline at end of file diff --git a/android/src/main/java/com/reactnativequicksqlite/QuickSQLiteBridge.java b/android/src/main/java/com/reactnativequicksqlite/QuickSQLiteBridge.java new file mode 100644 index 0000000..ba7b0c3 --- /dev/null +++ b/android/src/main/java/com/reactnativequicksqlite/QuickSQLiteBridge.java @@ -0,0 +1,38 @@ +package com.reactnativequicksqlite; + +import android.util.Log; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; + + +public class QuickSQLiteBridge { + private native void installNativeJsi(long jsContextNativePointer, CallInvokerHolderImpl jsCallInvokerHolder, String docPath); + public static final QuickSQLiteBridge instance = new QuickSQLiteBridge(); + + public void install(ReactContext context) { + // try { + Log.d("react-native-quick-sqlite", "Installing native..."); + + long jsContextPointer = context.getJavaScriptContextHolder().get(); + Log.d("react-native-quick-sqlite", "Installing native 2 ..."); + + CallInvokerHolderImpl jsCallInvokerHolder = (CallInvokerHolderImpl)context.getCatalystInstance().getJSCallInvokerHolder(); + Log.d("react-native-quick-sqlite", "Installing native 3..."); + + final String path = context.getFilesDir().getAbsolutePath(); + + Log.d("react-native-quick-sqlite", "Installing native4..."); + + installNativeJsi( + jsContextPointer, + jsCallInvokerHolder, + path + ); + + // } catch (Exception exception) { + // return false; + // } + } +} \ No newline at end of file diff --git a/android/src/main/java/com/reactnativesequel/SequelModule.java b/android/src/main/java/com/reactnativequicksqlite/SequelModule.java similarity index 94% rename from android/src/main/java/com/reactnativesequel/SequelModule.java rename to android/src/main/java/com/reactnativequicksqlite/SequelModule.java index 9ef2ad8..f5c0f0b 100644 --- a/android/src/main/java/com/reactnativesequel/SequelModule.java +++ b/android/src/main/java/com/reactnativequicksqlite/SequelModule.java @@ -26,13 +26,15 @@ public String getName() { } @ReactMethod(isBlockingSynchronousMethod = true) - public void install() { + public boolean install() { try { // Log.w(NAME, 'ROPO INSTALL BEING CALLED') System.loadLibrary("react-native-quick-sqlite"); QuickSQLiteBridge.instance.install(getReactApplicationContext()); + return true; } catch (Exception exception) { Log.e(NAME, "Failed to install JSI Bindings!", exception); + return false; } } } \ No newline at end of file diff --git a/android/src/main/java/com/reactnativesequel/SequelPackage.java b/android/src/main/java/com/reactnativequicksqlite/SequelPackage.java similarity index 100% rename from android/src/main/java/com/reactnativesequel/SequelPackage.java rename to android/src/main/java/com/reactnativequicksqlite/SequelPackage.java diff --git a/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java b/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java deleted file mode 100644 index 0f61228..0000000 --- a/android/src/main/java/com/reactnativesequel/QuickSQLiteBridge.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.reactnativequicksqlite; - -import android.os.Handler; -import android.os.Looper; - -import androidx.collection.ArrayMap; - -import com.facebook.jni.HybridData; -import com.facebook.jni.annotations.DoNotStrip; -import com.facebook.react.bridge.JavaScriptContextHolder; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; -import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; - -@SuppressWarnings("JavaJniMissingFunction") -public class QuickSQLiteBridge { - @DoNotStrip - @SuppressWarnings("unused") - private HybridData mHybridData; - - public static final QuickSQLiteBridge instance = new QuickSQLiteBridge(); - - public boolean install(ReactApplicationContext context) { - try { - JavaScriptContextHolder jsContext = context.getJavaScriptContextHolder(); - CallInvokerHolder jsCallInvokerHolder = context.getCatalystInstance().getJSCallInvokerHolder(); - mHybridData = initHybrid(jsContext.get(), (CallInvokerHolderImpl)jsCallInvokerHolder); - - installJSIBindings( - jsContext.get(), - context.getFilesDir().getAbsolutePath() - ); - return true; - } catch (Exception exception) { - return false; - } - } - - private native void installJSIBindings(long jsContext, String docPath); - private native HybridData initHybrid(long jsContext, CallInvokerHolderImpl jsCallInvokerHolder); - -} \ No newline at end of file diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index e8d24ac..3c5dc63 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -472,7 +472,7 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); auto params = make_shared(args[2].asObject(rt)); - auto callback = make_shared((args[3].asObject(rt))); + auto callback = make_shared(args[3].asObject(rt)); auto task = [&rt, dbName, query, params, callback]() @@ -484,14 +484,17 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI if (result.type == SequelResultError) { LOGW("RETURNING ERROR"); -// callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); + invoker->invokeAsync([&rt, callback, &result] + { +// callback->asObject(rt).asFunction(rt).call(rt, result.value); + callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); }); + // callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); } else { LOGW("RETURNING SUCCESS"); - invoker->invokeAsync([&] { - callback->asObject(rt).asFunction(rt).call(rt, result.value); - }); + invoker->invokeAsync([&rt, callback, &result] + { callback->asObject(rt).asFunction(rt).call(rt, result.value); }); LOGW("SUCCESS CALLED"); } From 7c1bb7e9bebe55b760cd62338a43034fb66a4914 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sat, 12 Mar 2022 19:43:35 +0100 Subject: [PATCH 19/47] remove annotation --- .../src/main/java/com/reactnativequicksqlite/SequelModule.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/android/src/main/java/com/reactnativequicksqlite/SequelModule.java b/android/src/main/java/com/reactnativequicksqlite/SequelModule.java index f5c0f0b..4e30a68 100644 --- a/android/src/main/java/com/reactnativequicksqlite/SequelModule.java +++ b/android/src/main/java/com/reactnativequicksqlite/SequelModule.java @@ -9,9 +9,7 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; -import com.facebook.react.module.annotations.ReactModule; -@ReactModule(name = SequelModule.NAME) class SequelModule extends ReactContextBaseJavaModule { public static final String NAME = "QuickSQLite"; From dc68293cb01585bae0d9446b6fbe5d6dbc8ed32f Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 13 Mar 2022 00:05:38 +0100 Subject: [PATCH 20/47] get iOS to compile --- .gitignore | 3 + cpp/SequelResult.h | 8 ++ cpp/react-native-quick-sqlite.cpp | 157 ++++++++++++++++++++---------- example/ios/Podfile.lock | 4 +- ios/Sequel.h | 1 - ios/Sequel.mm | 7 +- react-native-quick-sqlite.podspec | 2 + src/index.ts | 43 +++++++- 8 files changed, 163 insertions(+), 62 deletions(-) diff --git a/.gitignore b/.gitignore index 84328ae..59510ef 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ android/.cxx # generated by bob lib/ +# Gradle +android/gradle/ +android/gradle* \ No newline at end of file diff --git a/cpp/SequelResult.h b/cpp/SequelResult.h index d3423e3..ed9da0e 100644 --- a/cpp/SequelResult.h +++ b/cpp/SequelResult.h @@ -35,3 +35,11 @@ struct SequelLiteralUpdateResult string message; int affectedRows; }; + +struct SequelBatchOperationResult +{ + ResultType type; + string message; + int affectedRows; + int commands; +}; \ No newline at end of file diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 3c5dc63..e7729b0 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -145,6 +145,55 @@ const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) string docPathStr; std::shared_ptr invoker; +/** + * Local function to handle SQL File Import in order to reuse with Sync and Async operations + */ +SequelBatchOperationResult importSQLFile(string dbName, string fileLocation) +{ + string line; + ifstream sqFile(fileLocation); + if (sqFile.is_open()) + { + try + { + int affectedRows = 0; + int commands = 0; + sequel_execute_literal_update(dbName, "BEGIN EXCLUSIVE TRANSACTION"); + while (std::getline(sqFile, line, '\n')) + { + if (!line.empty()) + { + SequelLiteralUpdateResult result = sequel_execute_literal_update(dbName, line); + if (result.type == SequelResultError) + { + sequel_execute_literal_update(dbName, "ROLLBACK"); + sqFile.close(); + return {SequelResultError, result.message, 0, commands}; + } + else + { + affectedRows += result.affectedRows; + commands++; + } + } + } + sqFile.close(); + sequel_execute_literal_update(dbName, "COMMIT"); + return {SequelResultOk, "", affectedRows, commands}; + } + catch (...) + { + sqFile.close(); + sequel_execute_literal_update(dbName, "ROLLBACK"); + return {SequelResultError, "[react-native-quick-sqlite][loadSQLFile] Unexpected error, transaction was rolledback", 0, 0}; + } + } + else + { + return {SequelResultError, "[react-native-quick-sqlite][loadSQLFile] Could not open file", 0, 0}; + } +} + jsi::Object createError(jsi::Runtime &rt, string message) { auto res = jsi::Object(rt); @@ -407,55 +456,63 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI const string dbName = args[0].asString(rt).utf8(rt); const string sqlFileName = args[1].asString(rt).utf8(rt); - string line; - ifstream sqFile(sqlFileName); - if (sqFile.is_open()) + const auto importResult = importSQLFile(dbName, sqlFileName); + if (importResult.type == SequelResultOk) + { + auto res = jsi::Object(rt); + res.setProperty(rt, "status", jsi::Value(0)); + res.setProperty(rt, "rowsAffected", jsi::Value(importResult.affectedRows)); + res.setProperty(rt, "commands", jsi::Value(importResult.commands)); + return move(res); + } + else + { + return createError(rt, "[react-native-quick-sqlite][loadSQLFile] Could not open file"); + } + }); + + // Load SQL File from disk in another thread + auto loadSQLFileAsync = jsi::Function::createFromHostFunction( + rt, + jsi::PropNameID::forAscii(rt, "sequel_loadSQLFileAsync"), + 3, + [pool](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value + { + const string dbName = args[0].asString(rt).utf8(rt); + const string sqlFileName = args[1].asString(rt).utf8(rt); + auto callback = make_shared((args[2].asObject(rt))); + + auto task = + [&rt, dbName, sqlFileName, callback]() { try { - int affectedRows = 0; - int commands = 0; - sequel_execute_literal_update(dbName, "BEGIN TRANSACTION"); - while (std::getline(sqFile, line, '\n')) - { - if (!line.empty()) + // Running the import operation in another thread + const auto importResult = importSQLFile(dbName, sqlFileName); + + // Executing the callback invoke inside the JavaScript thread in order to safe build JSI objects that depends on jsi::Runtime and must be synchronized. + invoker->invokeAsync([&rt, result = move(importResult), callback] + { + if(result.type == SequelResultOk) { - SequelLiteralUpdateResult result = sequel_execute_literal_update(dbName, line); - if (result.type == SequelResultError) - { - sequel_execute_literal_update(dbName, "ROLLBACK"); - auto res = jsi::Object(rt); - res.setProperty(rt, "status", jsi::Value(1)); - res.setProperty(rt, "message", jsi::String::createFromUtf8(rt, result.message.c_str())); - sqFile.close(); - return move(res); - } - else - { - affectedRows += result.affectedRows; - commands++; - } - } - } - sqFile.close(); - sequel_execute_literal_update(dbName, "COMMIT"); - auto res = jsi::Object(rt); - res.setProperty(rt, "status", jsi::Value(0)); - res.setProperty(rt, "rowsAffected", jsi::Value(affectedRows)); - res.setProperty(rt, "commands", jsi::Value(commands)); - return move(res); + auto res = jsi::Object(rt); + res.setProperty(rt, "status", jsi::Value(0)); + res.setProperty(rt, "rowsAffected", jsi::Value(result.affectedRows)); + res.setProperty(rt, "commands", jsi::Value(result.commands)); + callback->asObject(rt).asFunction(rt).call(rt, move(res)); + } else { + callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message)); + } }); } - catch (...) + catch (std::exception &exc) { - sqFile.close(); - sequel_execute_literal_update(dbName, "ROLLBACK"); - return createError(rt, "[react-native-quick-sqlite][loadSQLFile] Unexpected error, transaction was rolledback"); + LOGW("Catched exception: %s", exc.what()); + invoker->invokeAsync([&rt, err = exc.what(), callback] + { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, "Unknow error")); }); } - } - else - { - return createError(rt, "[react-native-quick-sqlite][loadSQLFile] Could not open file"); - } + }; + pool->queueWork(task); + return {}; }); // Async Execute SQL @@ -480,28 +537,21 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI try { SequelResult result = sequel_execute(rt, dbName, query, *params); - LOGW("ROPO FINISHED COMPUTING"); if (result.type == SequelResultError) { - LOGW("RETURNING ERROR"); invoker->invokeAsync([&rt, callback, &result] - { -// callback->asObject(rt).asFunction(rt).call(rt, result.value); - callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); }); - // callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); + { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); }); } else { - LOGW("RETURNING SUCCESS"); invoker->invokeAsync([&rt, callback, &result] { callback->asObject(rt).asFunction(rt).call(rt, result.value); }); - - LOGW("SUCCESS CALLED"); } } catch (std::exception &exc) { - LOGW("Catched exception: %s", exc.what()); + invoker->invokeAsync([&rt, callback, &exc] + { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, exc.what())); }); } }; @@ -519,9 +569,10 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI // module.setProperty(rt, "attach", move(attach)); module.setProperty(rt, "delete", move(remove)); module.setProperty(rt, "executeSql", move(execSQL)); + module.setProperty(rt, "asyncExecuteSql", move(asyncExecSQL)); module.setProperty(rt, "executeSqlBatch", move(execSQLBatch)); module.setProperty(rt, "loadSqlFile", move(loadSQLFile)); - module.setProperty(rt, "asyncExecuteSql", move(asyncExecSQL)); + module.setProperty(rt, "asyncLoadSqlFile", move(loadSQLFileAsync)); rt.global().setProperty(rt, "sqlite", move(module)); } diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index d1ba3f8..659d41e 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -210,6 +210,8 @@ PODS: - React-logger (0.67.3): - glog - react-native-quick-sqlite (3.0.1): + - React + - React-callinvoker - React-Core - React-perflogger (0.67.3) - React-RCTActionSheet (0.67.3): @@ -400,7 +402,7 @@ SPEC CHECKSUMS: React-jsiexecutor: 15ea57ead631a11fad57634ff69f78e797113a39 React-jsinspector: 1e1e03345cf6d47779e2061d679d0a87d9ae73d8 React-logger: 1e10789cb84f99288479ba5f20822ce43ced6ffe - react-native-quick-sqlite: bb52b8b21954434cd36c345e191bdb0548d69676 + react-native-quick-sqlite: 47074fd0f16ded188572f1395e8b9f4e108aaec9 React-perflogger: 93d3f142d6d9a46e635f09ba0518027215a41098 React-RCTActionSheet: 87327c3722203cc79cf79d02fb83e7332aeedd18 React-RCTAnimation: 009c87c018d50e0b38692699405ebe631ff4872d diff --git a/ios/Sequel.h b/ios/Sequel.h index 9c96edb..0b05c20 100644 --- a/ios/Sequel.h +++ b/ios/Sequel.h @@ -8,7 +8,6 @@ */ #import -#import "react-native-quick-sqlite.h" @interface Sequel : NSObject diff --git a/ios/Sequel.mm b/ios/Sequel.mm index d3a8359..2916726 100644 --- a/ios/Sequel.mm +++ b/ios/Sequel.mm @@ -8,9 +8,11 @@ */ #import "Sequel.h" +#import "react-native-quick-sqlite.h" #import #import +#import #import #import @@ -33,16 +35,17 @@ - (void)setBridge:(RCTBridge *)bridge { _setBridgeOnMainQueue = RCTIsMainQueue(); RCTCxxBridge *cxxBridge = (RCTCxxBridge *)self.bridge; - if (!cxxBridge.runtime) { return; } + + auto callInvoker = bridge.jsCallInvoker; // Get iOS app's document directory (to safely store database .sqlite3 file) NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true); NSString *documentPath = [paths objectAtIndex:0]; - installSequel(*(facebook::jsi::Runtime *)cxxBridge.runtime, [documentPath UTF8String]); + installSequel(*(facebook::jsi::Runtime *)cxxBridge.runtime, callInvoker,[documentPath UTF8String]); } - (void)invalidate { diff --git a/react-native-quick-sqlite.podspec b/react-native-quick-sqlite.podspec index e50cf35..ad14eaf 100644 --- a/react-native-quick-sqlite.podspec +++ b/react-native-quick-sqlite.podspec @@ -22,5 +22,7 @@ Pod::Spec.new do |s| s.header_mappings_dir = "cpp" s.source_files = "ios/**/*.{h,m,mm}", "cpp/**/*.{h,cpp,c}" + s.dependency "React-callinvoker" + s.dependency "React" s.dependency "React-Core" end diff --git a/src/index.ts b/src/index.ts index decaaa7..bbfce05 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,13 +1,9 @@ import { NativeModules } from 'react-native'; const SequelModule = NativeModules.QuickSQLite; -console.warn('ROPO LOADING'); if (SequelModule) { - console.warn('MODULE DETECTED'); if (typeof SequelModule.install === 'function') { - console.warn('INSTALLING SQLITE BINDINGS'); - SequelModule.install(); } } @@ -95,7 +91,11 @@ interface ISQLite { commands: SQLBatchParams[] ) => BatchQueryResult; loadSqlFile: (dbName: string, location: string) => FileLoadResult; - // backgroundExecuteSql: (dbName: string, query: string, params: any[]) => any; + asyncLoadSqlFile: ( + dbName: string, + location: string, + cb: (res: FileLoadResult) => void + ) => void; } declare global { @@ -115,6 +115,11 @@ interface IDBConnection { ok: (res: QueryResult) => void, fail: (msg: string) => void ) => void; + asyncExecuteSql: ( + query: string, + params: any[] | undefined, + cb: (res: QueryResult) => void + ) => void; executeSqlBatch: ( commands: SQLBatchParams[], callback?: (res: BatchQueryResult) => void @@ -124,6 +129,10 @@ interface IDBConnection { location: string, callback: (result: FileLoadResult) => void ) => void; + asyncLoadSqlFile: ( + location: string, + callback: (res: FileLoadResult) => void + ) => void; } export const openDatabase = ( @@ -155,6 +164,24 @@ export const openDatabase = ( fail(e); } }, + asyncExecuteSql: ( + sql: string, + params: any[] | undefined, + cb: (res: QueryResult) => void + ) => { + try { + // console.warn(`[react-native-quick-sqlite], sql: `, sql, ` params: ` , params); + sqlite.asyncExecuteSql(options.name, sql, params, (response) => { + // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work + if (response.rows != null) { + response.rows.item = (idx: number) => response.rows._array[idx]; + } + cb(response); + }); + } catch (e) { + fail(e); + } + }, executeSqlBatch: ( commands: SQLBatchParams[], callback?: (res: BatchQueryResult) => void @@ -179,6 +206,12 @@ export const openDatabase = ( callback(result); } }, + asyncLoadSqlFile: ( + location: string, + callback: (result: FileLoadResult) => void + ) => { + sqlite.asyncLoadSqlFile(options.name, location, callback); + }, }; ok(connection); From 3d530ef3556715b14d995d3887171f5b56ef39cb Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 13 Mar 2022 07:38:16 +0100 Subject: [PATCH 21/47] Start refactoring JSI code from SQLite bindings, extract Thread Pool to it's own file --- android/cpp-adapter.cpp | 1 - .../QuickSQLiteBridge.java | 14 -- .../reactnativequicksqlite/SequelModule.java | 1 - cpp/ThreadPool.cpp | 91 ++++++++++++ cpp/ThreadPool.h | 48 +++++++ cpp/react-native-quick-sqlite.cpp | 133 ++---------------- cpp/sequel.cpp | 7 +- example/ios/Podfile | 5 +- example/ios/Podfile.lock | 2 +- 9 files changed, 162 insertions(+), 140 deletions(-) create mode 100644 cpp/ThreadPool.cpp create mode 100644 cpp/ThreadPool.h diff --git a/android/cpp-adapter.cpp b/android/cpp-adapter.cpp index 9c236a5..c995acf 100644 --- a/android/cpp-adapter.cpp +++ b/android/cpp-adapter.cpp @@ -22,7 +22,6 @@ struct QuickSQLiteBridge : jni::JavaClass jni::alias_ref jsCallInvokerHolder, jni::alias_ref docPath) { - LOGW("ROPO INSTALLING BINDINGS 2") auto jsiRuntime = reinterpret_cast(jsiRuntimePtr); auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); std::string docPathString = docPath->toStdString(); diff --git a/android/src/main/java/com/reactnativequicksqlite/QuickSQLiteBridge.java b/android/src/main/java/com/reactnativequicksqlite/QuickSQLiteBridge.java index ba7b0c3..9ca5bf8 100644 --- a/android/src/main/java/com/reactnativequicksqlite/QuickSQLiteBridge.java +++ b/android/src/main/java/com/reactnativequicksqlite/QuickSQLiteBridge.java @@ -6,33 +6,19 @@ import com.facebook.react.bridge.ReactContext; import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; - public class QuickSQLiteBridge { private native void installNativeJsi(long jsContextNativePointer, CallInvokerHolderImpl jsCallInvokerHolder, String docPath); public static final QuickSQLiteBridge instance = new QuickSQLiteBridge(); public void install(ReactContext context) { - // try { - Log.d("react-native-quick-sqlite", "Installing native..."); - long jsContextPointer = context.getJavaScriptContextHolder().get(); - Log.d("react-native-quick-sqlite", "Installing native 2 ..."); - CallInvokerHolderImpl jsCallInvokerHolder = (CallInvokerHolderImpl)context.getCatalystInstance().getJSCallInvokerHolder(); - Log.d("react-native-quick-sqlite", "Installing native 3..."); - final String path = context.getFilesDir().getAbsolutePath(); - Log.d("react-native-quick-sqlite", "Installing native4..."); - installNativeJsi( jsContextPointer, jsCallInvokerHolder, path ); - - // } catch (Exception exception) { - // return false; - // } } } \ No newline at end of file diff --git a/android/src/main/java/com/reactnativequicksqlite/SequelModule.java b/android/src/main/java/com/reactnativequicksqlite/SequelModule.java index 4e30a68..bec3079 100644 --- a/android/src/main/java/com/reactnativequicksqlite/SequelModule.java +++ b/android/src/main/java/com/reactnativequicksqlite/SequelModule.java @@ -26,7 +26,6 @@ public String getName() { @ReactMethod(isBlockingSynchronousMethod = true) public boolean install() { try { - // Log.w(NAME, 'ROPO INSTALL BEING CALLED') System.loadLibrary("react-native-quick-sqlite"); QuickSQLiteBridge.instance.install(getReactApplicationContext()); return true; diff --git a/cpp/ThreadPool.cpp b/cpp/ThreadPool.cpp new file mode 100644 index 0000000..43f1d0f --- /dev/null +++ b/cpp/ThreadPool.cpp @@ -0,0 +1,91 @@ +// +// ThreadPool.cpp +// react-native-quick-sqlite +// +// Created by Oscar on 13.03.22. +// + +#include "ThreadPool.h" + +ThreadPool::ThreadPool() : done(false) +{ + // This returns the number of threads supported by the system. If the + // function can't figure out this information, it returns 0. 0 is not good, + // so we create at least 1 + auto numberOfThreads = std::thread::hardware_concurrency(); + if (numberOfThreads == 0) + { + numberOfThreads = 1; + } + + for (unsigned i = 0; i < numberOfThreads; ++i) + { + // The threads will execute the private member `doWork`. Note that we need + // to pass a reference to the function (namespaced with the class name) as + // the first argument, and the current object as second argument + threads.push_back(std::thread(&ThreadPool::doWork, this)); + } +} + +// The destructor joins all the threads so the program can exit gracefully. +// This will be executed if there is any exception (e.g. creating the threads) +ThreadPool::~ThreadPool() +{ + // So threads know it's time to shut down + done = true; + + // Wake up all the threads, so they can finish and be joined + workQueueConditionVariable.notify_all(); + for (auto &thread : threads) + { + if (thread.joinable()) + { + thread.join(); + } + } +} + +// This function will be called by the server every time there is a request +// that needs to be processed by the thread pool +void ThreadPool::queueWork(std::function task) +{ + // Grab the mutex + std::lock_guard g(workQueueMutex); + + // Push the request to the queue + workQueue.push(task); + + // Notify one thread that there are requests to process + workQueueConditionVariable.notify_one(); +} + +// Function used by the threads to grab work from the queue +void ThreadPool::doWork() +{ + // Loop while the queue is not destructing + while (!done) + { + std::function task; + + // Create a scope, so we don't lock the queue for longer than necessary + { + std::unique_lock g(workQueueMutex); + workQueueConditionVariable.wait(g, [&] + { + // Only wake up if there are elements in the queue or the program is + // shutting down + return !workQueue.empty() || done; }); + + // If we are shutting down exit witout trying to process more work + if (done) + { + break; + } + + task = workQueue.front(); + workQueue.pop(); + } + + task(); + } +} diff --git a/cpp/ThreadPool.h b/cpp/ThreadPool.h new file mode 100644 index 0000000..b68701a --- /dev/null +++ b/cpp/ThreadPool.h @@ -0,0 +1,48 @@ +// +// ThreadPool.hpp +// react-native-quick-sqlite +// +// Created by Oscar on 13.03.22. +// + +#ifndef ThreadPool_hpp +#define ThreadPool_hpp + +#include +#include +#include +#include +#include +#include +#include + +class ThreadPool +{ +public: + ThreadPool(); + ~ThreadPool(); + void queueWork(std::function task); + +private: + // This condition variable is used for the threads to wait until there is work + // to do + std::condition_variable_any workQueueConditionVariable; + + // We store the threads in a vector, so we can later stop them gracefully + std::vector threads; + + // Mutex to protect workQueue + std::mutex workQueueMutex; + + // Queue of requests waiting to be processed + std::queue> workQueue; + + // This will be set to true when the thread pool is shutting down. This tells + // the threads to stop looping and finish + bool done; + + // Function used by the threads to grab work from the queue + void doWork(); +}; + +#endif /* ThreadPool_hpp */ diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index e7729b0..b36b904 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -11,125 +11,19 @@ #include "sequel.h" #include "logs.h" #include "SequelResult.h" +#include "ThreadPool.h" #include #include #include #include #include #include -#include -#include -#include -#include #include using namespace std; using namespace facebook; -class ThreadPool -{ -public: - ThreadPool() : done(false) - { - // This returns the number of threads supported by the system. If the - // function can't figure out this information, it returns 0. 0 is not good, - // so we create at least 1 - auto numberOfThreads = std::thread::hardware_concurrency(); - if (numberOfThreads == 0) - { - numberOfThreads = 1; - } - - for (unsigned i = 0; i < numberOfThreads; ++i) - { - // The threads will execute the private member `doWork`. Note that we need - // to pass a reference to the function (namespaced with the class name) as - // the first argument, and the current object as second argument - threads.push_back(std::thread(&ThreadPool::doWork, this)); - } - } - - // The destructor joins all the threads so the program can exit gracefully. - // This will be executed if there is any exception (e.g. creating the threads) - ~ThreadPool() - { - // So threads know it's time to shut down - done = true; - - // Wake up all the threads, so they can finish and be joined - workQueueConditionVariable.notify_all(); - for (auto &thread : threads) - { - if (thread.joinable()) - { - thread.join(); - } - } - } - - // This function will be called by the server every time there is a request - // that needs to be processed by the thread pool - void queueWork(std::function task) - { - // Grab the mutex - std::lock_guard g(workQueueMutex); - - // Push the request to the queue - workQueue.push(task); - - // Notify one thread that there are requests to process - workQueueConditionVariable.notify_one(); - } -private: - // This condition variable is used for the threads to wait until there is work - // to do - std::condition_variable_any workQueueConditionVariable; - - // We store the threads in a vector, so we can later stop them gracefully - std::vector threads; - - // Mutex to protect workQueue - std::mutex workQueueMutex; - - // Queue of requests waiting to be processed - std::queue> workQueue; - - // This will be set to true when the thread pool is shutting down. This tells - // the threads to stop looping and finish - bool done; - - // Function used by the threads to grab work from the queue - void doWork() - { - // Loop while the queue is not destructing - while (!done) - { - std::function task; - - // Create a scope, so we don't lock the queue for longer than necessary - { - std::unique_lock g(workQueueMutex); - workQueueConditionVariable.wait(g, [&] - { - // Only wake up if there are elements in the queue or the program is - // shutting down - return !workQueue.empty() || done; }); - - // If we are shutting down exit witout trying to process more work - if (done) - { - break; - } - - task = workQueue.front(); - workQueue.pop(); - } - - task(); - } - } -}; const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) { @@ -536,17 +430,20 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI { try { - SequelResult result = sequel_execute(rt, dbName, query, *params); - if (result.type == SequelResultError) - { - invoker->invokeAsync([&rt, callback, &result] - { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); }); - } - else - { - invoker->invokeAsync([&rt, callback, &result] - { callback->asObject(rt).asFunction(rt).call(rt, result.value); }); - } + invoker->invokeAsync([&rt, callback] { + callback->asObject(rt).asFunction(rt).call(rt, jsi::Value(rt, 4)); + }); +// SequelResult result = sequel_execute(rt, dbName, query, *params); +// if (result.type == SequelResultError) +// { +// invoker->invokeAsync([&rt, callback, &result] +// { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); }); +// } +// else +// { +// invoker->invokeAsync([&rt, callback, &result] +// { callback->asObject(rt).asFunction(rt).call(rt, result.value); }); +// } } catch (std::exception &exc) { diff --git a/cpp/sequel.cpp b/cpp/sequel.cpp index 752388c..9eba3a7 100644 --- a/cpp/sequel.cpp +++ b/cpp/sequel.cpp @@ -15,9 +15,8 @@ #include #include #include -// #ifdef ANDROID -// #include "logs.h" -// #endif // ANDROID +#include "logs.h" + using namespace std; using namespace facebook; @@ -504,4 +503,4 @@ SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, str "", changedRowCount }; -} \ No newline at end of file +} diff --git a/example/ios/Podfile b/example/ios/Podfile index 8b193e1..7506616 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -6,7 +6,10 @@ platform :ios, '11.0' target 'SequelExample' do config = use_native_modules! - use_react_native!(:path => config[:reactNativePath]) + use_react_native!( + :path => config[:reactNativePath], + :hermes_enabled => false + ) pod 'react-native-quick-sqlite', :path => '../..' diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 659d41e..1102648 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -417,6 +417,6 @@ SPEC CHECKSUMS: ReactCommon: 650e33cde4fb7d36781cd3143f5276da0abb2f96 Yoga: 90dcd029e45d8a7c1ff059e8b3c6612ff409061a -PODFILE CHECKSUM: bb7adee47fdc7ccdad0c428b6712b1c38afa514a +PODFILE CHECKSUM: 8e46f9681f82354d9c073d5479b59194bb998732 COCOAPODS: 1.11.2 From 7a78f8e3671ab7835079db56fdb05c2abaa7ac3e Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 13 Mar 2022 09:15:38 +0100 Subject: [PATCH 22/47] Update C++ version on xcode settings --- cpp/react-native-quick-sqlite.cpp | 15 ++------------- .../ios/SequelExample.xcodeproj/project.pbxproj | 2 ++ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index b36b904..785bb05 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -23,19 +23,6 @@ using namespace std; using namespace facebook; - - -const vector mapParams(jsi::Runtime &rt, jsi::Array ¶ms) -{ - int jsiParamsLength = params.length(rt); - vector res; - for (int ii = 0; ii < jsiParamsLength; ii++) - { - res.push_back(params.getValueAtIndex(rt, ii).asString(rt).utf8(rt)); - } - return res; -} - string docPathStr; std::shared_ptr invoker; @@ -103,6 +90,8 @@ jsi::Object createOk(jsi::Runtime &rt) return res; } + + void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath) { diff --git a/example/ios/SequelExample.xcodeproj/project.pbxproj b/example/ios/SequelExample.xcodeproj/project.pbxproj index 6edec4e..df3ad65 100644 --- a/example/ios/SequelExample.xcodeproj/project.pbxproj +++ b/example/ios/SequelExample.xcodeproj/project.pbxproj @@ -266,6 +266,7 @@ baseConfigurationReference = 47F7ED3B7971BE374F7B8635 /* Pods-SequelExample.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 24CMR7378R; @@ -290,6 +291,7 @@ baseConfigurationReference = E00ACF0FDA8BF921659E2F9A /* Pods-SequelExample.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 24CMR7378R; From fbf8336ccf9b9f19f8770c952dfb87469143b51d Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 13 Mar 2022 09:20:45 +0100 Subject: [PATCH 23/47] Clear unused imports from main file --- README.md | 1 + cpp/react-native-quick-sqlite.cpp | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 5a55afc..ddc35bc 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Inspired/compatible with [react-native-sqlite-storage](https://github.com/andpor ## Gotchas +- On Xcode you need to change the C++ version to C++ 17 or above - **Javascript cannot represent intergers larger than 53 bits**, be careful when loading data if it came from other systems. [Read more](https://github.com/ospfranco/react-native-quick-sqlite/issues/16#issuecomment-1018412991). - **It's not possible to use a browser to debug a JSI app**, use [Flipper](https://github.com/facebook/flipper) (for android Flipper also has SQLite Database explorer). - Your app will now include C++, you will need to install the NDK on your machine for android. diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 785bb05..6bf9b80 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -14,11 +14,8 @@ #include "ThreadPool.h" #include #include -#include -#include #include #include -#include using namespace std; using namespace facebook; From 8cb71dcda2e3e76ddcfb66cb14c4c198d2fed01b Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Sun, 13 Mar 2022 11:33:14 +0100 Subject: [PATCH 24/47] WIP Refactoring dynamic C++ types --- cpp/JSIHelper.cpp | 79 ++++++++ cpp/JSIHelper.h | 21 ++ cpp/SequelResult.h | 9 +- cpp/react-native-quick-sqlite.cpp | 55 ++++- cpp/sequel.cpp | 322 ++++++++++++++++++++++++++---- cpp/sequel.h | 5 +- example/ios/Podfile.lock | 2 +- example/src/Database.ts | 19 +- react-native-quick-sqlite.podspec | 1 + 9 files changed, 453 insertions(+), 60 deletions(-) create mode 100644 cpp/JSIHelper.cpp create mode 100644 cpp/JSIHelper.h diff --git a/cpp/JSIHelper.cpp b/cpp/JSIHelper.cpp new file mode 100644 index 0000000..8b61fa7 --- /dev/null +++ b/cpp/JSIHelper.cpp @@ -0,0 +1,79 @@ +// +// JSIHelper.cpp +// react-native-quick-sqlite +// +// Created by Oscar on 13.03.22. +// + +#include "JSIHelper.h" + +using namespace std; +using namespace facebook; + +vector jsiArrayToVector(jsi::Runtime &rt, jsi::Array values) +{ +// int jsiParamsLength = params.length(rt); +// vector res; +// for (int ii = 0; ii < jsiParamsLength; ii++) +// { +// res.push_back(params.getValueAtIndex(rt, ii).asString(rt).utf8(rt)); +// } +// return res; + vector res; + + for (int ii = 0; ii < values.length(rt); ii++) + { + jsi::Value value = values.getValueAtIndex(rt, ii); + if (value.isNull()) + { + res.push_back(nullptr); +// sqlite3_bind_null(statement, ii + 1); + } + else if (value.isBool()) + { + res.push_back(value.getBool()); +// int intVal = int(value.getBool()); +// sqlite3_bind_int(statement, ii + 1, intVal); + } + else if (value.isNumber()) + { + res.push_back(value.asNumber()); +// double doubleVal = value.asNumber(); +// int intVal = (int)doubleVal; +// long long longVal = (long)doubleVal; +// if (intVal == doubleVal) +// { +// sqlite3_bind_int(statement, ii + 1, intVal); +// } +// else if (longVal == doubleVal) +// { +// sqlite3_bind_int64(statement, ii + 1, longVal); +// } +// else +// { +// sqlite3_bind_double(statement, ii + 1, doubleVal); +// } + } + else if (value.isString()) + { + res.push_back(value.asString(rt).utf8(rt)); +// string strVal = value.asString(rt).utf8(rt); +// +// sqlite3_bind_text(statement, ii + 1, strVal.c_str(), strVal.length(), SQLITE_TRANSIENT); + } + else if (value.isObject()) + { +// auto obj = value.asObject(rt); +// if (obj.isArrayBuffer(rt)) +// { +// auto buf = obj.getArrayBuffer(rt); +// // The statement is executed before returning control to JSI, so we don't need to copy the data to extend its lifetime. +// sqlite3_bind_blob(statement, ii + 1, buf.data(rt), buf.size(rt), SQLITE_STATIC); +// } + } + } + + + + return res; +} diff --git a/cpp/JSIHelper.h b/cpp/JSIHelper.h new file mode 100644 index 0000000..6af085d --- /dev/null +++ b/cpp/JSIHelper.h @@ -0,0 +1,21 @@ +// +// JSIHelper.hpp +// react-native-quick-sqlite +// +// Created by Oscar on 13.03.22. +// + +#ifndef JSIHelper_h +#define JSIHelper_h + +#include +#include +#include +#include + +using namespace std; +using namespace facebook; + +vector jsiArrayToVector(jsi::Runtime &rt, jsi::Array values); + +#endif /* JSIHelper_h */ diff --git a/cpp/SequelResult.h b/cpp/SequelResult.h index ed9da0e..7cd475b 100644 --- a/cpp/SequelResult.h +++ b/cpp/SequelResult.h @@ -12,6 +12,7 @@ #include #include #include +#include using namespace std; using namespace facebook; @@ -42,4 +43,10 @@ struct SequelBatchOperationResult string message; int affectedRows; int commands; -}; \ No newline at end of file +}; + +struct SQLiteValueWrapper +{ + string name; + any value; +}; diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 6bf9b80..59193d1 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -11,6 +11,7 @@ #include "sequel.h" #include "logs.h" #include "SequelResult.h" +#include "JSIHelper.h" #include "ThreadPool.h" #include #include @@ -226,15 +227,55 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI { const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); - const jsi::Value ¶ms = args[2]; - SequelResult result = sequel_execute(rt, dbName, query, params); - - if (result.type == SequelResultError) + const vector params = jsiArrayToVector(rt, args[2].asObject(rt).asArray(rt)); + +// LOGW("VECTOR CREATED"); +// std::cout << std::boolalpha; + +// for(auto i: params) { + +// LOGW("PARAM: %s", i.type().name()); +// std::cout << "PARAM: " << i.type().name() << endl; +// } + + auto rows = sequel_execute2(dbName, query, params); + + auto array = jsi::Array(rt, rows.size()); + + for (int i = 0; i < rows.size(); i++) { - return createError(rt, result.message.c_str()); +// LOGW("ITERATE %d", i); + auto row = rows[i]; + + auto jsiRow = jsi::Object(rt); + + for(SQLiteValueWrapper rowInfo: row) { + const char* typeName = rowInfo.value.type().name(); + LOGW("TYPENAME %s", typeName) + if(strcmp(typeName, "d") == 0) { + jsiRow.setProperty(rt, rowInfo.name.c_str(), jsi::Value(rt, any_cast(rowInfo.value))); + } else if(strcmp(typeName, "NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE") == 0) { +// jsi::String::createFromUtf8(rt, column_value) + jsiRow.setProperty(rt, rowInfo.name.c_str(), jsi::String::createFromUtf8(rt, any_cast(rowInfo.value).c_str())); + } + + } + array.setValueAtIndex(rt, i, jsiRow); } - - return move(result.value); + + return array; + + +// const jsi::Value ¶ms = args[2]; +// SequelResult result = sequel_execute(rt, dbName, query, params); +// +// if (result.type == SequelResultError) +// { +// return createError(rt, result.message.c_str()); +// } +// +// return move(result.value); + return {}; }); // Execute a batch of SQL queries in a transaction diff --git a/cpp/sequel.cpp b/cpp/sequel.cpp index 9eba3a7..11c073b 100644 --- a/cpp/sequel.cpp +++ b/cpp/sequel.cpp @@ -17,7 +17,6 @@ #include #include "logs.h" - using namespace std; using namespace facebook; @@ -30,10 +29,10 @@ bool folder_exists(const std::string &foldername) } /** - * Portable wrapper for mkdir. Internally used by mkdir() - * @param[in] path the full path of the directory to create. - * @return zero on success, otherwise -1. - */ + * Portable wrapper for mkdir. Internally used by mkdir() + * @param[in] path the full path of the directory to create. + * @return zero on success, otherwise -1. + */ int _mkdir(const char *path) { #if _POSIX_C_SOURCE @@ -44,10 +43,10 @@ int _mkdir(const char *path) } /** - * Recursive, portable wrapper for mkdir. - * @param[in] path the full path of the directory to create. - * @return zero on success, otherwise -1. - */ + * Recursive, portable wrapper for mkdir. + * @param[in] path the full path of the directory to create. + * @return zero on success, otherwise -1. + */ int mkdir(const char *path) { string current_level = "/"; @@ -133,19 +132,19 @@ SequelResult sequel_close(string const dbName) jsi::Value::undefined()}; } -//SequelResult sequel_attach(string const &dbName) +// SequelResult sequel_attach(string const &dbName) //{ -// if(dbMap.count(dbName) == 0){ -// cout << "[react-native-quick-sqlite]: DB " << dbName << " not open" << endl; -// return SequelResult{ -// SequelResultError, -// dbName + " is not open", -// jsi::Value::undefined() -// }; -// } +// if(dbMap.count(dbName) == 0){ +// cout << "[react-native-quick-sqlite]: DB " << dbName << " not open" << endl; +// return SequelResult{ +// SequelResultError, +// dbName + " is not open", +// jsi::Value::undefined() +// }; +// } // TODO: What does "Attach" do? is it really necessary? -//https://github.com/andpor/react-native-sqlite-storage/blob/master/platforms/ios/SQLite.m#L362 +// https://github.com/andpor/react-native-sqlite-storage/blob/master/platforms/ios/SQLite.m#L362 // NSString* sql = [NSString stringWithFormat:@"ATTACH DATABASE '%@' AS %@", dbPathToAttach, dbAlias]; // @@ -185,6 +184,48 @@ SequelResult sequel_remove(string const dbName, string const docPath) jsi::Value::undefined()}; } +void bindStatement2(sqlite3_stmt *statement, const vector ¶ms) +{ + try + { + for (int ii = 0; ii < params.size(); ii++) + { + any item = params[ii]; + const char *typeName = item.type().name(); + + if (strcmp(typeName, "d") == 0) + { + double doubleVal = any_cast(item); + int intVal = (int)doubleVal; + long long longVal = (long)doubleVal; + if (intVal == doubleVal) + { + sqlite3_bind_int(statement, ii + 1, intVal); + } + else if (longVal == doubleVal) + { + sqlite3_bind_int64(statement, ii + 1, longVal); + } + else + { + sqlite3_bind_double(statement, ii + 1, doubleVal); + } + } + else if(strcmp(typeName, "NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE") == 0) { + string strVal = any_cast(item); + sqlite3_bind_text(statement, ii + 1, strVal.c_str(), strVal.length(), SQLITE_TRANSIENT); + } else + { + LOGW("UNKNOWN TYPE DETECTED %s", typeName); + } + } + } + catch (const std::bad_any_cast &e) + { + std::cout << e.what() << '\n'; + } +} + void bindStatement(sqlite3_stmt *statement, jsi::Runtime &rt, jsi::Value const ¶ms) { if (params.isNull() || params.isUndefined()) @@ -244,6 +285,206 @@ void bindStatement(sqlite3_stmt *statement, jsi::Runtime &rt, jsi::Value const & } } +vector> sequel_execute2(const string dbName, const string &query, const vector ¶ms) +{ + // Check if db connection is opened + if (dbMap.count(dbName) == 0) + { + LOGE("QUICKSQLITE EXEC2 NO DATABASE FOUND"); + // return SequelResult{ + // SequelResultError, + // "[react-native-quick-sqlite]: Database " + dbName + " is not open"}; + } + + sqlite3 *db = dbMap[dbName]; + + // SQLite statements need to be compiled before executed + sqlite3_stmt *statement; + + // Compile and move result into statement memory spot + int statementStatus = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, NULL); + + if (statementStatus == SQLITE_OK) // statemnet is correct, bind the passed parameters + { + // bindStatement(statement, rt, params); + bindStatement2(statement, params); + } + else + { + const char *message = sqlite3_errmsg(db); + LOGE("QUICKSQLITE EXEC2 FAILED: %s", message); + } + + bool isConsuming = true; + bool isFailed = false; + + int result, i, count, column_type; + string column_name; + vector> rows; + + while (isConsuming) + { + result = sqlite3_step(statement); + vector row; + + switch (result) + { + case SQLITE_ROW: + i = 0; + count = sqlite3_column_count(statement); + + while (i < count) + { + column_type = sqlite3_column_type(statement, i); + column_name = sqlite3_column_name(statement, i); + + switch (column_type) + { + + case SQLITE_INTEGER: + { + /** + * It's not possible to send a int64_t in a jsi::Value because JS cannot represent the whole number range. + * Instead, we're sending a double, which can represent all integers up to 53 bits long, which is more + * than what was there before (a 32-bit int). + * + * See https://github.com/ospfranco/react-native-quick-sqlite/issues/16 for more context. + */ + double column_value = sqlite3_column_double(statement, i); + row.push_back({ + column_name.c_str(), + column_value + }); + break; + } + + case SQLITE_FLOAT: + { + double column_value = sqlite3_column_double(statement, i); + row.push_back({ + column_name.c_str(), + column_value + }); + break; + } + + case SQLITE_TEXT: + { + const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); + row.push_back({ + column_name.c_str(), + string(column_value) + }); +// entry.setProperty(rt, column_name.c_str(), jsi::String::createFromUtf8(rt, column_value)); + break; + } + + case SQLITE_BLOB: + { +// int blob_size = sqlite3_column_bytes(statement, i); +// const void *blob = sqlite3_column_blob(statement, i); +// jsi::Function array_buffer_ctor = rt.global().getPropertyAsFunction(rt, "ArrayBuffer"); +// jsi::Object o = array_buffer_ctor.callAsConstructor(rt, blob_size).getObject(rt); +// jsi::ArrayBuffer buf = o.getArrayBuffer(rt); +// // It's a shame we have to copy here: see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564. +// memcpy(buf.data(rt), blob, blob_size); +// entry.setProperty(rt, column_name.c_str(), o); +// break; + } + + case SQLITE_NULL: + // Intentionally left blank to switch to default case + default: +// entry.setProperty(rt, column_name.c_str(), jsi::Value(nullptr)); + row.push_back({ + column_name.c_str(), + nullptr + }); + break; + } + + i++; + } + + rows.push_back(row); + break; + + case SQLITE_DONE: + isConsuming = false; + break; + + default: + isFailed = true; + isConsuming = false; + } + } + + sqlite3_finalize(statement); + + if (isFailed) + { + const char *message = sqlite3_errmsg(db); +// return { +// SequelResultError, +// "[react-native-quick-sqlite] SQL execution error: " + string(message), +// jsi::Value::undefined()}; + } + + LOGW("STATEMENT RETRIEVED!"); + + return rows; + + // Move everything into a JSI object +// auto array = jsi::Array(rt, results.size()); +// for (int i = 0; i < results.size(); i++) +// { +// array.setValueAtIndex(rt, i, move(results[i])); +// } +// +// jsi::Object rows = jsi::Object(rt); +// rows.setProperty(rt, "status", jsi::Value(0)); +// rows.setProperty(rt, "length", jsi::Value((int)results.size())); +// rows.setProperty(rt, "_array", move(array)); +// +// // For any future endaevors, I tried to create the accesor function directly on via JSI +// // But this is too complex for my punny brain, so this function is created on the index.ts file +// // // Create accessor function +// // auto itemAccesser = jsi::Function::createFromHostFunction( +// // rt, +// // jsi::PropNameID::forAscii(rt, "item"), +// // 1, +// // [&array](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value +// // { +// // if(args[0].isNumber()) { +// // double rowNumber = args[0].asNumber(); +// // cout << "trying to access value at" << rowNumber << endl; +// // return array.getValueAtIndex(rt, (int)rowNumber); +// // } +// // +// // return {}; +// // }); +// +// // rows.setProperty(rt, "item", move(itemAccesser)); +// +// jsi::Object res = jsi::Object(rt); +// res.setProperty(rt, "rows", move(rows)); +// +// int changedRowCount = sqlite3_changes(db); +// res.setProperty(rt, "rowsAffected", jsi::Value(changedRowCount)); +// +// // row id has nothing to do with the actual uuid/id of the object, but internal row count +// long long latestInsertRowId = sqlite3_last_insert_rowid(db); +// if (changedRowCount > 0 && latestInsertRowId != 0) +// { +// res.setProperty(rt, "insertId", jsi::Value((int)latestInsertRowId)); +// } +// +// return { +// SequelResultOk, +// "", +// move(res)}; +} + SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const &query, jsi::Value const ¶ms) { // Check if db connection is opened @@ -264,7 +505,6 @@ SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const // Compile and move result into statement memory spot int statementStatus = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, NULL); - if (statementStatus == SQLITE_OK) // statemnet is correct, bind the passed parameters { bindStatement(statement, rt, params); @@ -306,11 +546,11 @@ SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const case SQLITE_INTEGER: { /** - * It's not possible to send a int64_t in a jsi::Value because JS cannot represent the whole number range. - * Instead, we're sending a double, which can represent all integers up to 53 bits long, which is more - * than what was there before (a 32-bit int). + * It's not possible to send a int64_t in a jsi::Value because JS cannot represent the whole number range. + * Instead, we're sending a double, which can represent all integers up to 53 bits long, which is more + * than what was there before (a 32-bit int). * - * See https://github.com/ospfranco/react-native-quick-sqlite/issues/16 for more context. + * See https://github.com/ospfranco/react-native-quick-sqlite/issues/16 for more context. */ double column_value = sqlite3_column_double(statement, i); entry.setProperty(rt, column_name.c_str(), jsi::Value(column_value)); @@ -429,7 +669,7 @@ SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const move(res)}; } -SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, string const &query) +SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, string const &query) { // Check if db connection is opened if (dbMap.count(dbName) == 0) @@ -437,8 +677,7 @@ SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, str return { SequelResultError, "[react-native-quick-sqlite] Database not opened: " + dbName, - 0 - }; + 0}; } sqlite3 *db = dbMap[dbName]; @@ -455,10 +694,9 @@ SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, str return { SequelResultError, "[react-native-quick-sqlite] SQL execution error: " + string(message), - 0 - }; + 0}; } - + bool isConsuming = true; bool isFailed = false; @@ -471,17 +709,17 @@ SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, str switch (result) { - case SQLITE_ROW: - isConsuming = true; - break; + case SQLITE_ROW: + isConsuming = true; + break; - case SQLITE_DONE: - isConsuming = false; - break; + case SQLITE_DONE: + isConsuming = false; + break; - default: - isFailed = true; - isConsuming = false; + default: + isFailed = true; + isConsuming = false; } } @@ -493,14 +731,12 @@ SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, str return { SequelResultError, "[react-native-quick-sqlite] SQL execution error: " + string(message), - 0 - }; + 0}; } int changedRowCount = sqlite3_changes(db); return { SequelResultOk, "", - changedRowCount - }; + changedRowCount}; } diff --git a/cpp/sequel.h b/cpp/sequel.h index 03e0b4c..6ae3c18 100644 --- a/cpp/sequel.h +++ b/cpp/sequel.h @@ -11,6 +11,7 @@ #include #include "SequelResult.h" #include +#include using namespace std; using namespace facebook; @@ -25,4 +26,6 @@ SequelResult sequel_remove(string const dbName, string const docPath); SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const &query, jsi::Value const ¶ms); -SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, string const &query); \ No newline at end of file +vector> sequel_execute2(string const dbName, string const &query, const vector ¶ms); + +SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, string const &query); diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 1102648..4d865e0 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -402,7 +402,7 @@ SPEC CHECKSUMS: React-jsiexecutor: 15ea57ead631a11fad57634ff69f78e797113a39 React-jsinspector: 1e1e03345cf6d47779e2061d679d0a87d9ae73d8 React-logger: 1e10789cb84f99288479ba5f20822ce43ced6ffe - react-native-quick-sqlite: 47074fd0f16ded188572f1395e8b9f4e108aaec9 + react-native-quick-sqlite: 094983ef7f02c4e2a731864581d6110d77f40d55 React-perflogger: 93d3f142d6d9a46e635f09ba0518027215a41098 React-RCTActionSheet: 87327c3722203cc79cf79d02fb83e7332aeedd18 React-RCTAnimation: 009c87c018d50e0b38692699405ebe631ff4872d diff --git a/example/src/Database.ts b/example/src/Database.ts index 35051dd..d482c1a 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -9,15 +9,20 @@ export const lowLevelInit = async () => { sqlite.open('test', 'sample/database'); // const result = sqlite.executeSql( // 'test', - // 'CREATE TABLE "User" ( name TEXT NOT NULL );', + // 'CREATE TABLE "User" ( id INT PRIMARY KEY, name TEXT NOT NULL );', // undefined // ); // console.warn('tried to create table result', result); - // sqlite.executeSql( + // const result = sqlite.executeSql( // 'test', - // 'INSERT INTO "User" (name) VALUES(\'OSCAR\')', - // undefined + // 'INSERT INTO "User" (id, name) VALUES(?, ?)', + // [new Date().getMilliseconds(), `${new Date().getMilliseconds()}`] // ); + + const result = sqlite.executeSql('test', 'SELECT * FROM "User";', []); + console.warn('RESULT ', result); + + // sqlite.executeSql() // console.warn('INSERTED DATA'); // sqlite // .asyncExecuteSql('test', 'SELECT * FROM "User";', []) @@ -30,9 +35,9 @@ export const lowLevelInit = async () => { // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { // console.warn('asyncRes', asyncRes); // }); - sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { - console.warn('asyncRes2', asyncRes); - }); + // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { + // console.warn('asyncRes2', asyncRes); + // }); }; export async function typeORMInit() { diff --git a/react-native-quick-sqlite.podspec b/react-native-quick-sqlite.podspec index ad14eaf..1de5cf8 100644 --- a/react-native-quick-sqlite.podspec +++ b/react-native-quick-sqlite.podspec @@ -14,6 +14,7 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/ospfranco/react-native-quick-sqlite.git", :tag => "#{s.version}" } s.pod_target_xcconfig = { + :CLANG_CXX_LANGUAGE_STANDARD => 'c++17', :GCC_PREPROCESSOR_DEFINITIONS => "HAVE_FULLFSYNC=1", :WARNING_CFLAGS => "-Wno-shorten-64-to-32 -Wno-comma -Wno-unreachable-code -Wno-conditional-uninitialized -Wno-deprecated-declarations", :USE_HEADERMAP => "No" From 5a6df149ac6a5fa05b27c5753bc541539f75326e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Sun, 13 Mar 2022 18:36:11 -0300 Subject: [PATCH 25/47] Using typesafe enums to represent SQLite Values --- android/CMakeLists.txt | 4 + cpp/JSIHelper.cpp | 206 +++++++++++++++++++++------ cpp/JSIHelper.h | 20 ++- cpp/SequelResult.h | 45 +++++- cpp/react-native-quick-sqlite.cpp | 61 ++------ cpp/sequel.cpp | 223 +++++++++++------------------- cpp/sequel.h | 4 +- 7 files changed, 317 insertions(+), 246 deletions(-) diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 0f40102..3055c6b 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -46,6 +46,10 @@ add_library( ../cpp/react-native-quick-sqlite.h ../cpp/sqlite3.h ../cpp/sqlite3.c + ../cpp/JSIHelper.h + ../cpp/JSIHelper.cpp + ../cpp/ThreadPool.h + ../cpp/ThreadPool.cpp cpp-adapter.cpp ) diff --git a/cpp/JSIHelper.cpp b/cpp/JSIHelper.cpp index 8b61fa7..3610395 100644 --- a/cpp/JSIHelper.cpp +++ b/cpp/JSIHelper.cpp @@ -10,70 +10,184 @@ using namespace std; using namespace facebook; -vector jsiArrayToVector(jsi::Runtime &rt, jsi::Array values) +SequelValue createNullSequelValue() { + return SequelValue { + .dataType = NULL_VALUE + }; +} + +SequelValue createBooleanSequelValue(bool value) { + return SequelValue { + .dataType = BOOLEAN, + .booleanValue = int(value) + }; +} + +SequelValue createTextSequelValue(string value) { + return SequelValue { + .dataType = TEXT, + .textValue = value + }; +} + +SequelValue createIntegerSequelValue(int value) { + return SequelValue { + .dataType = INTEGER, + .doubleOrIntValue = static_cast(value) + }; +} + +SequelValue createIntegerSequelValue(double value) { + return SequelValue { + .dataType = INTEGER, + .doubleOrIntValue = value + }; +} + +SequelValue createInt64SequelValue(long long value) { + return SequelValue { + .dataType = INT64, + .int64Value = value + }; +} + +SequelValue createDoubleSequelValue(double value) { + return SequelValue { + .dataType = DOUBLE, + .doubleOrIntValue = value + }; +} + +SequelValue createArrayBufferSequelValue(uint8_t *arrayBufferValue, size_t arrayBufferSize) { + return SequelValue { + .dataType = ARRAY_BUFFER, + .arrayBufferValue = shared_ptr{arrayBufferValue}, + .arrayBufferSize = arrayBufferSize + }; +} + +void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, vector *target) { -// int jsiParamsLength = params.length(rt); -// vector res; -// for (int ii = 0; ii < jsiParamsLength; ii++) -// { -// res.push_back(params.getValueAtIndex(rt, ii).asString(rt).utf8(rt)); -// } -// return res; - vector res; - + if (params.isNull() || params.isUndefined()) + { + return; + } + + jsi::Array values = params.asObject(rt).asArray(rt); + for (int ii = 0; ii < values.length(rt); ii++) { + jsi::Value value = values.getValueAtIndex(rt, ii); if (value.isNull()) { - res.push_back(nullptr); -// sqlite3_bind_null(statement, ii + 1); + target->push_back(createNullSequelValue()); } else if (value.isBool()) { - res.push_back(value.getBool()); -// int intVal = int(value.getBool()); -// sqlite3_bind_int(statement, ii + 1, intVal); + int intVal = int(value.getBool()); + target->push_back(createBooleanSequelValue(value.getBool())); } else if (value.isNumber()) { - res.push_back(value.asNumber()); -// double doubleVal = value.asNumber(); -// int intVal = (int)doubleVal; -// long long longVal = (long)doubleVal; -// if (intVal == doubleVal) -// { -// sqlite3_bind_int(statement, ii + 1, intVal); -// } -// else if (longVal == doubleVal) -// { -// sqlite3_bind_int64(statement, ii + 1, longVal); -// } -// else -// { -// sqlite3_bind_double(statement, ii + 1, doubleVal); -// } + double doubleVal = value.asNumber(); + int intVal = (int)doubleVal; + long long longVal = (long)doubleVal; + if (intVal == doubleVal) + { + target->push_back(createIntegerSequelValue(intVal)); + } + else if (longVal == doubleVal) + { + target->push_back(createInt64SequelValue(longVal)); + } + else + { + target->push_back(createDoubleSequelValue(doubleVal)); + } } else if (value.isString()) { - res.push_back(value.asString(rt).utf8(rt)); -// string strVal = value.asString(rt).utf8(rt); -// -// sqlite3_bind_text(statement, ii + 1, strVal.c_str(), strVal.length(), SQLITE_TRANSIENT); + string strVal = value.asString(rt).utf8(rt); + target->push_back(createTextSequelValue(strVal)); } else if (value.isObject()) { -// auto obj = value.asObject(rt); -// if (obj.isArrayBuffer(rt)) -// { -// auto buf = obj.getArrayBuffer(rt); -// // The statement is executed before returning control to JSI, so we don't need to copy the data to extend its lifetime. -// sqlite3_bind_blob(statement, ii + 1, buf.data(rt), buf.size(rt), SQLITE_STATIC); -// } + auto obj = value.asObject(rt); + if (obj.isArrayBuffer(rt)) + { + auto buf = obj.getArrayBuffer(rt); + target->push_back(createArrayBufferSequelValue(buf.data(rt), buf.size(rt))); + } } } - - - - return res; } + +jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationStatus status, vector> *results) +{ + jsi::Object res = jsi::Object(rt); + if(status.type == SequelResultOk) + { + //res.setProperty(rt, "rows", move(rows)); + res.setProperty(rt, "rowsAffected", jsi::Value(status.rowsAffected)); + if (status.rowsAffected > 0 && status.insertId != 0) + { + res.setProperty(rt, "insertId", jsi::Value(status.insertId)); + } + + // Converting row results into objects + size_t rowCount = results->size(); + jsi::Object rows = jsi::Object(rt); + if(rowCount > 0) + { + auto array = jsi::Array(rt, rowCount); + for(int i = 0; iat(i); + for (auto const& entry : row) + { + std::string columnName = entry.first; + SequelValue value = entry.second; + if (value.dataType == TEXT) + { + rowObject.setProperty(rt, columnName.c_str(), jsi::String::createFromUtf8(rt, value.textValue.c_str())); + } + else if (value.dataType == INTEGER) + { + rowObject.setProperty(rt, columnName.c_str(), jsi::Value(value.doubleOrIntValue)); + } + else if (value.dataType == DOUBLE) + { + rowObject.setProperty(rt, columnName.c_str(), jsi::Value(value.doubleOrIntValue)); + } + else if (value.dataType == ARRAY_BUFFER) + { + jsi::Function array_buffer_ctor = rt.global().getPropertyAsFunction(rt, "ArrayBuffer"); + jsi::Object o = array_buffer_ctor.callAsConstructor(rt, (int)value.arrayBufferSize).getObject(rt); + jsi::ArrayBuffer buf = o.getArrayBuffer(rt); + // It's a shame we have to copy here: see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564. + memcpy(buf.data(rt), value.arrayBufferValue.get(), value.arrayBufferSize); + rowObject.setProperty(rt, columnName.c_str(), o); + } + else + { + rowObject.setProperty(rt, columnName.c_str(), jsi::Value(nullptr)); + } + } + array.setValueAtIndex(rt, i, move(rowObject)); + } + rows.setProperty(rt, "_array", move(array)); + res.setProperty(rt, "rows", move(rows)); + } + rows.setProperty(rt, "status", jsi::Value(0)); + rows.setProperty(rt, "length", jsi::Value((int)rowCount)); + } + else + { + res.setProperty(rt, "status", jsi::Value(1)); + res.setProperty(rt, "message", jsi::String::createFromUtf8(rt, status.errorMessage.c_str())); + } + + return move(res); +} \ No newline at end of file diff --git a/cpp/JSIHelper.h b/cpp/JSIHelper.h index 6af085d..20482ba 100644 --- a/cpp/JSIHelper.h +++ b/cpp/JSIHelper.h @@ -11,11 +11,27 @@ #include #include #include -#include +#include +#include +#include "SequelResult.h" using namespace std; using namespace facebook; -vector jsiArrayToVector(jsi::Runtime &rt, jsi::Array values); +/** + * Fill the target vector with parsed parameters + * */ +void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const &args, vector *target); + +SequelValue createNullSequelValue(); +SequelValue createBooleanSequelValue(bool value); +SequelValue createTextSequelValue(string value); +SequelValue createIntegerSequelValue(int value); +SequelValue createIntegerSequelValue(double value); +SequelValue createInt64SequelValue(long long value); +SequelValue createDoubleSequelValue(double value); +SequelValue createArrayBufferSequelValue(uint8_t *arrayBufferValue, size_t arrayBufferSize); +jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationStatus status, vector> *results); + #endif /* JSIHelper_h */ diff --git a/cpp/SequelResult.h b/cpp/SequelResult.h index 7cd475b..56a80f6 100644 --- a/cpp/SequelResult.h +++ b/cpp/SequelResult.h @@ -12,11 +12,41 @@ #include #include #include -#include using namespace std; using namespace facebook; +enum SequelDataType { + NULL_VALUE, + TEXT, + INTEGER, + INT64, + DOUBLE, + BOOLEAN, + ARRAY_BUFFER, +}; + +/** + * TypeSafe dynamic parameter value to bind on sqlite statements + */ +struct SequelValue { + SequelDataType dataType; + int booleanValue; + double doubleOrIntValue; + long long int64Value; + string textValue; + shared_ptr arrayBufferValue; + size_t arrayBufferSize; +}; + +/** + * TypeSafe dynamic column value holder representing a sqlite columnValue + */ +struct SequelColumnValue { + SequelValue value; + string columnName; +}; + enum ResultType { SequelResultOk, @@ -30,6 +60,14 @@ struct SequelResult jsi::Value value; }; +struct SequelOperationStatus +{ + ResultType type; + string errorMessage; + int rowsAffected; + double insertId; +}; + struct SequelLiteralUpdateResult { ResultType type; @@ -45,8 +83,3 @@ struct SequelBatchOperationResult int commands; }; -struct SQLiteValueWrapper -{ - string name; - any value; -}; diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 59193d1..0417229 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -227,55 +227,18 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI { const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); - const vector params = jsiArrayToVector(rt, args[2].asObject(rt).asArray(rt)); - -// LOGW("VECTOR CREATED"); -// std::cout << std::boolalpha; - -// for(auto i: params) { - -// LOGW("PARAM: %s", i.type().name()); -// std::cout << "PARAM: " << i.type().name() << endl; -// } - - auto rows = sequel_execute2(dbName, query, params); - - auto array = jsi::Array(rt, rows.size()); - - for (int i = 0; i < rows.size(); i++) - { -// LOGW("ITERATE %d", i); - auto row = rows[i]; - - auto jsiRow = jsi::Object(rt); - - for(SQLiteValueWrapper rowInfo: row) { - const char* typeName = rowInfo.value.type().name(); - LOGW("TYPENAME %s", typeName) - if(strcmp(typeName, "d") == 0) { - jsiRow.setProperty(rt, rowInfo.name.c_str(), jsi::Value(rt, any_cast(rowInfo.value))); - } else if(strcmp(typeName, "NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE") == 0) { -// jsi::String::createFromUtf8(rt, column_value) - jsiRow.setProperty(rt, rowInfo.name.c_str(), jsi::String::createFromUtf8(rt, any_cast(rowInfo.value).c_str())); - } - - } - array.setValueAtIndex(rt, i, jsiRow); - } - - return array; - - -// const jsi::Value ¶ms = args[2]; -// SequelResult result = sequel_execute(rt, dbName, query, params); -// -// if (result.type == SequelResultError) -// { -// return createError(rt, result.message.c_str()); -// } -// -// return move(result.value); - return {}; + const jsi::Value &originalParams = args[2]; + // Converting parameters + vector params; + jsiQueryArgumentsToSequelParam(rt, originalParams, ¶ms); + + // Filling the results + vector> results; + auto status = sequel_execute3(dbName, query, ¶ms, &results); + + // Converting results into a JSI Response + auto jsiResult = createSequelQueryExecutionResult(rt, status, &results); + return move(jsiResult); }); // Execute a batch of SQL queries in a transaction diff --git a/cpp/sequel.cpp b/cpp/sequel.cpp index 11c073b..0f514ba 100644 --- a/cpp/sequel.cpp +++ b/cpp/sequel.cpp @@ -184,48 +184,6 @@ SequelResult sequel_remove(string const dbName, string const docPath) jsi::Value::undefined()}; } -void bindStatement2(sqlite3_stmt *statement, const vector ¶ms) -{ - try - { - for (int ii = 0; ii < params.size(); ii++) - { - any item = params[ii]; - const char *typeName = item.type().name(); - - if (strcmp(typeName, "d") == 0) - { - double doubleVal = any_cast(item); - int intVal = (int)doubleVal; - long long longVal = (long)doubleVal; - if (intVal == doubleVal) - { - sqlite3_bind_int(statement, ii + 1, intVal); - } - else if (longVal == doubleVal) - { - sqlite3_bind_int64(statement, ii + 1, longVal); - } - else - { - sqlite3_bind_double(statement, ii + 1, doubleVal); - } - } - else if(strcmp(typeName, "NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE") == 0) { - string strVal = any_cast(item); - sqlite3_bind_text(statement, ii + 1, strVal.c_str(), strVal.length(), SQLITE_TRANSIENT); - } else - { - LOGW("UNKNOWN TYPE DETECTED %s", typeName); - } - } - } - catch (const std::bad_any_cast &e) - { - std::cout << e.what() << '\n'; - } -} - void bindStatement(sqlite3_stmt *statement, jsi::Runtime &rt, jsi::Value const ¶ms) { if (params.isNull() || params.isUndefined()) @@ -285,15 +243,57 @@ void bindStatement(sqlite3_stmt *statement, jsi::Runtime &rt, jsi::Value const & } } -vector> sequel_execute2(const string dbName, const string &query, const vector ¶ms) +// Using Structs IMPL +void bindStatementWithValues(sqlite3_stmt *statement, vector *values) +{ + size_t size = values->size(); + if (size <= 0) + { + return; + } + + for (int ii = 0; ii < size; ii++) + { + int sqIndex = ii + 1; + SequelValue value = values->at(ii); + SequelDataType dataType = value.dataType; + if (dataType == NULL_VALUE) + { + sqlite3_bind_null(statement, sqIndex); + } + else if (dataType == BOOLEAN) + { + sqlite3_bind_int(statement, sqIndex, value.booleanValue); + } + else if (dataType == INTEGER) + { + sqlite3_bind_int(statement, sqIndex, (int) value.doubleOrIntValue); + } else if (dataType == DOUBLE) + { + sqlite3_bind_double(statement, sqIndex, value.doubleOrIntValue); + } else if (dataType == INT64) + { + sqlite3_bind_int64(statement, sqIndex, value.int64Value); + } else if (dataType == TEXT) + { + sqlite3_bind_text(statement, sqIndex, value.textValue.c_str(), value.textValue.length(), SQLITE_TRANSIENT); + } else if (dataType == ARRAY_BUFFER) + { + sqlite3_bind_blob(statement, sqIndex, value.arrayBufferValue.get(), value.arrayBufferSize, SQLITE_STATIC); + } + } +} + +SequelOperationStatus sequel_execute3(string const dbName, string const &query, vector *params, vector> *results) { // Check if db connection is opened if (dbMap.count(dbName) == 0) { - LOGE("QUICKSQLITE EXEC2 NO DATABASE FOUND"); - // return SequelResult{ - // SequelResultError, - // "[react-native-quick-sqlite]: Database " + dbName + " is not open"}; + return SequelOperationStatus{ + SequelResultError, + "[react-native-quick-sqlite]: Database " + dbName + " is not open", + 0 + }; } sqlite3 *db = dbMap[dbName]; @@ -306,31 +306,34 @@ vector> sequel_execute2(const string dbName, const st if (statementStatus == SQLITE_OK) // statemnet is correct, bind the passed parameters { - // bindStatement(statement, rt, params); - bindStatement2(statement, params); + bindStatementWithValues(statement, params); } else { const char *message = sqlite3_errmsg(db); - LOGE("QUICKSQLITE EXEC2 FAILED: %s", message); + return SequelOperationStatus { + SequelResultError, + "[react-native-quick-sqlite] SQL execution error: " + string(message), + 0 + }; } - + bool isConsuming = true; bool isFailed = false; int result, i, count, column_type; string column_name; - vector> rows; - + map row; + while (isConsuming) { result = sqlite3_step(statement); - vector row; switch (result) { case SQLITE_ROW: i = 0; + row = map(); count = sqlite3_column_count(statement); while (i < count) @@ -351,64 +354,45 @@ vector> sequel_execute2(const string dbName, const st * See https://github.com/ospfranco/react-native-quick-sqlite/issues/16 for more context. */ double column_value = sqlite3_column_double(statement, i); - row.push_back({ - column_name.c_str(), - column_value - }); + row[column_name] = createIntegerSequelValue(column_value); break; } case SQLITE_FLOAT: { double column_value = sqlite3_column_double(statement, i); - row.push_back({ - column_name.c_str(), - column_value - }); + row[column_name] = createDoubleSequelValue(column_value); break; } case SQLITE_TEXT: { const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); - row.push_back({ - column_name.c_str(), - string(column_value) - }); -// entry.setProperty(rt, column_name.c_str(), jsi::String::createFromUtf8(rt, column_value)); + row[column_name] = createTextSequelValue(string(column_value)); break; } case SQLITE_BLOB: { -// int blob_size = sqlite3_column_bytes(statement, i); -// const void *blob = sqlite3_column_blob(statement, i); -// jsi::Function array_buffer_ctor = rt.global().getPropertyAsFunction(rt, "ArrayBuffer"); -// jsi::Object o = array_buffer_ctor.callAsConstructor(rt, blob_size).getObject(rt); -// jsi::ArrayBuffer buf = o.getArrayBuffer(rt); -// // It's a shame we have to copy here: see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564. -// memcpy(buf.data(rt), blob, blob_size); -// entry.setProperty(rt, column_name.c_str(), o); -// break; + int blob_size = sqlite3_column_bytes(statement, i); + const void *blob = sqlite3_column_blob(statement, i); + uint8_t *data; + memcpy(data, blob, blob_size); + row[column_name] = createArrayBufferSequelValue(data, blob_size); + break; } case SQLITE_NULL: // Intentionally left blank to switch to default case default: -// entry.setProperty(rt, column_name.c_str(), jsi::Value(nullptr)); - row.push_back({ - column_name.c_str(), - nullptr - }); + row[column_name] = createNullSequelValue(); break; } i++; } - - rows.push_back(row); + results->push_back(move(row)); break; - case SQLITE_DONE: isConsuming = false; break; @@ -424,65 +408,22 @@ vector> sequel_execute2(const string dbName, const st if (isFailed) { const char *message = sqlite3_errmsg(db); -// return { -// SequelResultError, -// "[react-native-quick-sqlite] SQL execution error: " + string(message), -// jsi::Value::undefined()}; + return SequelOperationStatus{ + SequelResultError, + "[react-native-quick-sqlite] SQL execution error: " + string(message), + 0, + 0 + }; } - - LOGW("STATEMENT RETRIEVED!"); - - return rows; - // Move everything into a JSI object -// auto array = jsi::Array(rt, results.size()); -// for (int i = 0; i < results.size(); i++) -// { -// array.setValueAtIndex(rt, i, move(results[i])); -// } -// -// jsi::Object rows = jsi::Object(rt); -// rows.setProperty(rt, "status", jsi::Value(0)); -// rows.setProperty(rt, "length", jsi::Value((int)results.size())); -// rows.setProperty(rt, "_array", move(array)); -// -// // For any future endaevors, I tried to create the accesor function directly on via JSI -// // But this is too complex for my punny brain, so this function is created on the index.ts file -// // // Create accessor function -// // auto itemAccesser = jsi::Function::createFromHostFunction( -// // rt, -// // jsi::PropNameID::forAscii(rt, "item"), -// // 1, -// // [&array](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value -// // { -// // if(args[0].isNumber()) { -// // double rowNumber = args[0].asNumber(); -// // cout << "trying to access value at" << rowNumber << endl; -// // return array.getValueAtIndex(rt, (int)rowNumber); -// // } -// // -// // return {}; -// // }); -// -// // rows.setProperty(rt, "item", move(itemAccesser)); -// -// jsi::Object res = jsi::Object(rt); -// res.setProperty(rt, "rows", move(rows)); -// -// int changedRowCount = sqlite3_changes(db); -// res.setProperty(rt, "rowsAffected", jsi::Value(changedRowCount)); -// -// // row id has nothing to do with the actual uuid/id of the object, but internal row count -// long long latestInsertRowId = sqlite3_last_insert_rowid(db); -// if (changedRowCount > 0 && latestInsertRowId != 0) -// { -// res.setProperty(rt, "insertId", jsi::Value((int)latestInsertRowId)); -// } -// -// return { -// SequelResultOk, -// "", -// move(res)}; + int changedRowCount = sqlite3_changes(db); + long long latestInsertRowId = sqlite3_last_insert_rowid(db); + return SequelOperationStatus{ + SequelResultOk, + "", + changedRowCount, + static_cast(latestInsertRowId) + }; } SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const &query, jsi::Value const ¶ms) diff --git a/cpp/sequel.h b/cpp/sequel.h index 6ae3c18..2d85ef5 100644 --- a/cpp/sequel.h +++ b/cpp/sequel.h @@ -10,8 +10,8 @@ #include #include #include "SequelResult.h" +#include "JSIHelper.h" #include -#include using namespace std; using namespace facebook; @@ -26,6 +26,6 @@ SequelResult sequel_remove(string const dbName, string const docPath); SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const &query, jsi::Value const ¶ms); -vector> sequel_execute2(string const dbName, string const &query, const vector ¶ms); +SequelOperationStatus sequel_execute3(string const dbName, string const &query, vector *values, vector> *result); SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, string const &query); From c38ed7bc2aee716dec4de360a2c1f99131668de2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Sun, 13 Mar 2022 19:38:00 -0300 Subject: [PATCH 26/47] Some fixes on translation types for undefined arguments --- cpp/JSIHelper.cpp | 5 ++++- cpp/react-native-quick-sqlite.cpp | 29 ++++++++++++++--------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/cpp/JSIHelper.cpp b/cpp/JSIHelper.cpp index 3610395..436d7af 100644 --- a/cpp/JSIHelper.cpp +++ b/cpp/JSIHelper.cpp @@ -79,7 +79,7 @@ void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, { jsi::Value value = values.getValueAtIndex(rt, ii); - if (value.isNull()) + if (value.isNull() || value.isUndefined()) { target->push_back(createNullSequelValue()); } @@ -120,6 +120,9 @@ void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, target->push_back(createArrayBufferSequelValue(buf.data(rt), buf.size(rt))); } } + else { + target->push_back(createNullSequelValue()); + } } } diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 0417229..13d4cd9 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -412,28 +412,27 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI } const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); - auto params = make_shared(args[2].asObject(rt)); + const jsi::Value &originalParams = args[2]; auto callback = make_shared(args[3].asObject(rt)); + // Converting query parameters inside the javascript caller thread + vector params; + jsiQueryArgumentsToSequelParam(rt, originalParams, ¶ms); + auto task = - [&rt, dbName, query, params, callback]() + [&rt, dbName, query, ¶ms, callback]() { try { - invoker->invokeAsync([&rt, callback] { - callback->asObject(rt).asFunction(rt).call(rt, jsi::Value(rt, 4)); + // Inside the new worker thread, we can now call sqlite operations + vector> results; + auto status = sequel_execute3(dbName, query, ¶ms, &results); + invoker->invokeAsync([&rt, &results, status_copy = move(status), callback] { + // Now, back into the JavaScript thread, we can translate the results + // back to a JSI Object to pass on the callback + auto jsiResult = createSequelQueryExecutionResult(rt, status_copy, &results); + callback->asObject(rt).asFunction(rt).call(rt, move(jsiResult)); }); -// SequelResult result = sequel_execute(rt, dbName, query, *params); -// if (result.type == SequelResultError) -// { -// invoker->invokeAsync([&rt, callback, &result] -// { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, result.message.c_str())); }); -// } -// else -// { -// invoker->invokeAsync([&rt, callback, &result] -// { callback->asObject(rt).asFunction(rt).call(rt, result.value); }); -// } } catch (std::exception &exc) { From 1be077611507860d714fc537635474ab59416247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Sun, 13 Mar 2022 19:55:25 -0300 Subject: [PATCH 27/47] asyncExecuteSql implemented and working on android --- cpp/react-native-quick-sqlite.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 13d4cd9..455c854 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -420,17 +420,17 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI jsiQueryArgumentsToSequelParam(rt, originalParams, ¶ms); auto task = - [&rt, dbName, query, ¶ms, callback]() + [&rt, dbName, query, params=make_shared>(params), callback]() { try { // Inside the new worker thread, we can now call sqlite operations vector> results; - auto status = sequel_execute3(dbName, query, ¶ms, &results); - invoker->invokeAsync([&rt, &results, status_copy = move(status), callback] { + auto status = sequel_execute3(dbName, query, params.get(), &results); + invoker->invokeAsync([&rt, results=make_shared>>(results), status_copy = move(status), callback] { // Now, back into the JavaScript thread, we can translate the results // back to a JSI Object to pass on the callback - auto jsiResult = createSequelQueryExecutionResult(rt, status_copy, &results); + auto jsiResult = createSequelQueryExecutionResult(rt, status_copy, results.get()); callback->asObject(rt).asFunction(rt).call(rt, move(jsiResult)); }); } From 475e00913d357934722cf04ba658b206fe728826 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Mon, 14 Mar 2022 07:17:37 +0100 Subject: [PATCH 28/47] Renaming WIP --- cpp/JSIHelper.cpp | 115 ++++++++++++++------------- cpp/JSIHelper.h | 99 ++++++++++++++++++++--- cpp/SequelResult.h | 85 -------------------- cpp/react-native-quick-sqlite.cpp | 21 +++-- cpp/{sequel.cpp => sqliteBridge.cpp} | 60 +++++++------- cpp/{sequel.h => sqliteBridge.h} | 5 +- 6 files changed, 186 insertions(+), 199 deletions(-) delete mode 100644 cpp/SequelResult.h rename cpp/{sequel.cpp => sqliteBridge.cpp} (94%) rename cpp/{sequel.h => sqliteBridge.h} (82%) diff --git a/cpp/JSIHelper.cpp b/cpp/JSIHelper.cpp index 436d7af..62cfb78 100644 --- a/cpp/JSIHelper.cpp +++ b/cpp/JSIHelper.cpp @@ -10,63 +10,63 @@ using namespace std; using namespace facebook; -SequelValue createNullSequelValue() { - return SequelValue { - .dataType = NULL_VALUE - }; +QuickValue createNullQuickValue() +{ + return QuickValue{ + .dataType = NULL_VALUE}; } -SequelValue createBooleanSequelValue(bool value) { - return SequelValue { - .dataType = BOOLEAN, - .booleanValue = int(value) - }; +QuickValue createBooleanQuickValue(bool value) +{ + return QuickValue{ + .dataType = BOOLEAN, + .booleanValue = int(value)}; } -SequelValue createTextSequelValue(string value) { - return SequelValue { - .dataType = TEXT, - .textValue = value - }; +QuickValue createTextQuickValue(string value) +{ + return QuickValue{ + .dataType = TEXT, + .textValue = value}; } -SequelValue createIntegerSequelValue(int value) { - return SequelValue { - .dataType = INTEGER, - .doubleOrIntValue = static_cast(value) - }; +QuickValue createIntegerQuickValue(int value) +{ + return QuickValue{ + .dataType = INTEGER, + .doubleOrIntValue = static_cast(value)}; } -SequelValue createIntegerSequelValue(double value) { - return SequelValue { - .dataType = INTEGER, - .doubleOrIntValue = value - }; +QuickValue createIntegerQuickValue(double value) +{ + return QuickValue{ + .dataType = INTEGER, + .doubleOrIntValue = value}; } -SequelValue createInt64SequelValue(long long value) { - return SequelValue { - .dataType = INT64, - .int64Value = value - }; +QuickValue createInt64QuickValue(long long value) +{ + return QuickValue{ + .dataType = INT64, + .int64Value = value}; } -SequelValue createDoubleSequelValue(double value) { - return SequelValue { - .dataType = DOUBLE, - .doubleOrIntValue = value - }; +QuickValue createDoubleQuickValue(double value) +{ + return QuickValue{ + .dataType = DOUBLE, + .doubleOrIntValue = value}; } -SequelValue createArrayBufferSequelValue(uint8_t *arrayBufferValue, size_t arrayBufferSize) { - return SequelValue { - .dataType = ARRAY_BUFFER, - .arrayBufferValue = shared_ptr{arrayBufferValue}, - .arrayBufferSize = arrayBufferSize - }; +QuickValue createArrayBufferQuickValue(uint8_t *arrayBufferValue, size_t arrayBufferSize) +{ + return QuickValue{ + .dataType = ARRAY_BUFFER, + .arrayBufferValue = shared_ptr{arrayBufferValue}, + .arrayBufferSize = arrayBufferSize}; } -void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, vector *target) +void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, vector *target) { if (params.isNull() || params.isUndefined()) { @@ -81,12 +81,12 @@ void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, jsi::Value value = values.getValueAtIndex(rt, ii); if (value.isNull() || value.isUndefined()) { - target->push_back(createNullSequelValue()); + target->push_back(createNullQuickValue()); } else if (value.isBool()) { int intVal = int(value.getBool()); - target->push_back(createBooleanSequelValue(value.getBool())); + target->push_back(createBooleanQuickValue(value.getBool())); } else if (value.isNumber()) { @@ -95,21 +95,21 @@ void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, long long longVal = (long)doubleVal; if (intVal == doubleVal) { - target->push_back(createIntegerSequelValue(intVal)); + target->push_back(createIntegerQuickValue(intVal)); } else if (longVal == doubleVal) { - target->push_back(createInt64SequelValue(longVal)); + target->push_back(createInt64QuickValue(longVal)); } else { - target->push_back(createDoubleSequelValue(doubleVal)); + target->push_back(createDoubleQuickValue(doubleVal)); } } else if (value.isString()) { string strVal = value.asString(rt).utf8(rt); - target->push_back(createTextSequelValue(strVal)); + target->push_back(createTextQuickValue(strVal)); } else if (value.isObject()) { @@ -117,21 +117,22 @@ void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, if (obj.isArrayBuffer(rt)) { auto buf = obj.getArrayBuffer(rt); - target->push_back(createArrayBufferSequelValue(buf.data(rt), buf.size(rt))); + target->push_back(createArrayBufferQuickValue(buf.data(rt), buf.size(rt))); } } - else { - target->push_back(createNullSequelValue()); + else + { + target->push_back(createNullQuickValue()); } } } -jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationStatus status, vector> *results) +jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationStatus status, vector> *results) { jsi::Object res = jsi::Object(rt); - if(status.type == SequelResultOk) + if (status.type == SequelResultOk) { - //res.setProperty(rt, "rows", move(rows)); + // res.setProperty(rt, "rows", move(rows)); res.setProperty(rt, "rowsAffected", jsi::Value(status.rowsAffected)); if (status.rowsAffected > 0 && status.insertId != 0) { @@ -141,17 +142,17 @@ jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationSta // Converting row results into objects size_t rowCount = results->size(); jsi::Object rows = jsi::Object(rt); - if(rowCount > 0) + if (rowCount > 0) { auto array = jsi::Array(rt, rowCount); - for(int i = 0; iat(i); - for (auto const& entry : row) + for (auto const &entry : row) { std::string columnName = entry.first; - SequelValue value = entry.second; + QuickValue value = entry.second; if (value.dataType == TEXT) { rowObject.setProperty(rt, columnName.c_str(), jsi::String::createFromUtf8(rt, value.textValue.c_str())); diff --git a/cpp/JSIHelper.h b/cpp/JSIHelper.h index 20482ba..ea56c76 100644 --- a/cpp/JSIHelper.h +++ b/cpp/JSIHelper.h @@ -13,25 +13,100 @@ #include #include #include -#include "SequelResult.h" using namespace std; using namespace facebook; +/** + * Enum for QuickValue to store/determine correct type for dynamic JSI values + */ +enum QuickDataType +{ + NULL_VALUE, + TEXT, + INTEGER, + INT64, + DOUBLE, + BOOLEAN, + ARRAY_BUFFER, +}; + +/** + * Wrapper struct to allocate dynamic JSI values to static C++ primitives + */ +struct QuickValue +{ + QuickDataType dataType; + int booleanValue; + double doubleOrIntValue; + long long int64Value; + string textValue; + shared_ptr arrayBufferValue; + size_t arrayBufferSize; +}; + +/** + * Helper struct to carry SQLite results between entities + */ +struct QuickColumnValue +{ + QuickValue value; + string columnName; +}; + +/** + * Various structs to help with the results of the SQLite operations + */ +enum ResultType +{ + SequelResultOk, + SequelResultError +}; + +struct SequelResult +{ + ResultType type; + string message; + jsi::Value value; +}; + +struct SequelOperationStatus +{ + ResultType type; + string errorMessage; + int rowsAffected; + double insertId; +}; + +struct SequelLiteralUpdateResult +{ + ResultType type; + string message; + int affectedRows; +}; + +struct SequelBatchOperationResult +{ + ResultType type; + string message; + int affectedRows; + int commands; +}; + + /** * Fill the target vector with parsed parameters * */ -void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const &args, vector *target); - -SequelValue createNullSequelValue(); -SequelValue createBooleanSequelValue(bool value); -SequelValue createTextSequelValue(string value); -SequelValue createIntegerSequelValue(int value); -SequelValue createIntegerSequelValue(double value); -SequelValue createInt64SequelValue(long long value); -SequelValue createDoubleSequelValue(double value); -SequelValue createArrayBufferSequelValue(uint8_t *arrayBufferValue, size_t arrayBufferSize); -jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationStatus status, vector> *results); +void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const &args, vector *target); +QuickValue createNullQuickValue(); +QuickValue createBooleanQuickValue(bool value); +QuickValue createTextQuickValue(string value); +QuickValue createIntegerQuickValue(int value); +QuickValue createIntegerQuickValue(double value); +QuickValue createInt64QuickValue(long long value); +QuickValue createDoubleQuickValue(double value); +QuickValue createArrayBufferQuickValue(uint8_t *arrayBufferValue, size_t arrayBufferSize); +jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationStatus status, vector> *results); #endif /* JSIHelper_h */ diff --git a/cpp/SequelResult.h b/cpp/SequelResult.h deleted file mode 100644 index 56a80f6..0000000 --- a/cpp/SequelResult.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * SequelResult.h - * - * Created by Oscar Franco on 2021/03/07 - * Copyright (c) 2021 Oscar Franco - * - * This code is licensed under the MIT license - */ - -#pragma once - -#include -#include -#include - -using namespace std; -using namespace facebook; - -enum SequelDataType { - NULL_VALUE, - TEXT, - INTEGER, - INT64, - DOUBLE, - BOOLEAN, - ARRAY_BUFFER, -}; - -/** - * TypeSafe dynamic parameter value to bind on sqlite statements - */ -struct SequelValue { - SequelDataType dataType; - int booleanValue; - double doubleOrIntValue; - long long int64Value; - string textValue; - shared_ptr arrayBufferValue; - size_t arrayBufferSize; -}; - -/** - * TypeSafe dynamic column value holder representing a sqlite columnValue - */ -struct SequelColumnValue { - SequelValue value; - string columnName; -}; - -enum ResultType -{ - SequelResultOk, - SequelResultError -}; - -struct SequelResult -{ - ResultType type; - string message; - jsi::Value value; -}; - -struct SequelOperationStatus -{ - ResultType type; - string errorMessage; - int rowsAffected; - double insertId; -}; - -struct SequelLiteralUpdateResult -{ - ResultType type; - string message; - int affectedRows; -}; - -struct SequelBatchOperationResult -{ - ResultType type; - string message; - int affectedRows; - int commands; -}; - diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/react-native-quick-sqlite.cpp index 455c854..d72c36c 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/react-native-quick-sqlite.cpp @@ -8,9 +8,8 @@ */ #include "react-native-quick-sqlite.h" -#include "sequel.h" +#include "sqliteBridge.h" #include "logs.h" -#include "SequelResult.h" #include "JSIHelper.h" #include "ThreadPool.h" #include @@ -88,8 +87,6 @@ jsi::Object createOk(jsi::Runtime &rt) return res; } - - void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath) { @@ -229,11 +226,11 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI const string query = args[1].asString(rt).utf8(rt); const jsi::Value &originalParams = args[2]; // Converting parameters - vector params; + vector params; jsiQueryArgumentsToSequelParam(rt, originalParams, ¶ms); // Filling the results - vector> results; + vector> results; auto status = sequel_execute3(dbName, query, ¶ms, &results); // Converting results into a JSI Response @@ -416,23 +413,23 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI auto callback = make_shared(args[3].asObject(rt)); // Converting query parameters inside the javascript caller thread - vector params; + vector params; jsiQueryArgumentsToSequelParam(rt, originalParams, ¶ms); auto task = - [&rt, dbName, query, params=make_shared>(params), callback]() + [&rt, dbName, query, params = make_shared>(params), callback]() { try { // Inside the new worker thread, we can now call sqlite operations - vector> results; + vector> results; auto status = sequel_execute3(dbName, query, params.get(), &results); - invoker->invokeAsync([&rt, results=make_shared>>(results), status_copy = move(status), callback] { + invoker->invokeAsync([&rt, results = make_shared>>(results), status_copy = move(status), callback] + { // Now, back into the JavaScript thread, we can translate the results // back to a JSI Object to pass on the callback auto jsiResult = createSequelQueryExecutionResult(rt, status_copy, results.get()); - callback->asObject(rt).asFunction(rt).call(rt, move(jsiResult)); - }); + callback->asObject(rt).asFunction(rt).call(rt, move(jsiResult)); }); } catch (std::exception &exc) { diff --git a/cpp/sequel.cpp b/cpp/sqliteBridge.cpp similarity index 94% rename from cpp/sequel.cpp rename to cpp/sqliteBridge.cpp index 0f514ba..56889ea 100644 --- a/cpp/sequel.cpp +++ b/cpp/sqliteBridge.cpp @@ -7,7 +7,7 @@ * This code is licensed under the MIT license */ -#include "sequel.h" +#include "sqliteBridge.h" #include #include #include @@ -244,7 +244,7 @@ void bindStatement(sqlite3_stmt *statement, jsi::Runtime &rt, jsi::Value const & } // Using Structs IMPL -void bindStatementWithValues(sqlite3_stmt *statement, vector *values) +void bindStatementWithValues(sqlite3_stmt *statement, vector *values) { size_t size = values->size(); if (size <= 0) @@ -255,8 +255,8 @@ void bindStatementWithValues(sqlite3_stmt *statement, vector *value for (int ii = 0; ii < size; ii++) { int sqIndex = ii + 1; - SequelValue value = values->at(ii); - SequelDataType dataType = value.dataType; + QuickValue value = values->at(ii); + QuickDataType dataType = value.dataType; if (dataType == NULL_VALUE) { sqlite3_bind_null(statement, sqIndex); @@ -267,24 +267,28 @@ void bindStatementWithValues(sqlite3_stmt *statement, vector *value } else if (dataType == INTEGER) { - sqlite3_bind_int(statement, sqIndex, (int) value.doubleOrIntValue); - } else if (dataType == DOUBLE) + sqlite3_bind_int(statement, sqIndex, (int)value.doubleOrIntValue); + } + else if (dataType == DOUBLE) { sqlite3_bind_double(statement, sqIndex, value.doubleOrIntValue); - } else if (dataType == INT64) + } + else if (dataType == INT64) { sqlite3_bind_int64(statement, sqIndex, value.int64Value); - } else if (dataType == TEXT) + } + else if (dataType == TEXT) { sqlite3_bind_text(statement, sqIndex, value.textValue.c_str(), value.textValue.length(), SQLITE_TRANSIENT); - } else if (dataType == ARRAY_BUFFER) + } + else if (dataType == ARRAY_BUFFER) { sqlite3_bind_blob(statement, sqIndex, value.arrayBufferValue.get(), value.arrayBufferSize, SQLITE_STATIC); } } } -SequelOperationStatus sequel_execute3(string const dbName, string const &query, vector *params, vector> *results) +SequelOperationStatus sequel_execute3(string const dbName, string const &query, vector *params, vector> *results) { // Check if db connection is opened if (dbMap.count(dbName) == 0) @@ -292,8 +296,7 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, return SequelOperationStatus{ SequelResultError, "[react-native-quick-sqlite]: Database " + dbName + " is not open", - 0 - }; + 0}; } sqlite3 *db = dbMap[dbName]; @@ -311,11 +314,10 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, else { const char *message = sqlite3_errmsg(db); - return SequelOperationStatus { + return SequelOperationStatus{ SequelResultError, "[react-native-quick-sqlite] SQL execution error: " + string(message), - 0 - }; + 0}; } bool isConsuming = true; @@ -323,8 +325,8 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, int result, i, count, column_type; string column_name; - map row; - + map row; + while (isConsuming) { result = sqlite3_step(statement); @@ -333,7 +335,7 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, { case SQLITE_ROW: i = 0; - row = map(); + row = map(); count = sqlite3_column_count(statement); while (i < count) @@ -354,21 +356,21 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, * See https://github.com/ospfranco/react-native-quick-sqlite/issues/16 for more context. */ double column_value = sqlite3_column_double(statement, i); - row[column_name] = createIntegerSequelValue(column_value); + row[column_name] = createIntegerQuickValue(column_value); break; } case SQLITE_FLOAT: { double column_value = sqlite3_column_double(statement, i); - row[column_name] = createDoubleSequelValue(column_value); + row[column_name] = createDoubleQuickValue(column_value); break; } case SQLITE_TEXT: { const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); - row[column_name] = createTextSequelValue(string(column_value)); + row[column_name] = createTextQuickValue(string(column_value)); break; } @@ -378,14 +380,14 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, const void *blob = sqlite3_column_blob(statement, i); uint8_t *data; memcpy(data, blob, blob_size); - row[column_name] = createArrayBufferSequelValue(data, blob_size); + row[column_name] = createArrayBufferQuickValue(data, blob_size); break; } case SQLITE_NULL: // Intentionally left blank to switch to default case default: - row[column_name] = createNullSequelValue(); + row[column_name] = createNullQuickValue(); break; } @@ -412,18 +414,16 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, SequelResultError, "[react-native-quick-sqlite] SQL execution error: " + string(message), 0, - 0 - }; + 0}; } int changedRowCount = sqlite3_changes(db); long long latestInsertRowId = sqlite3_last_insert_rowid(db); return SequelOperationStatus{ - SequelResultOk, - "", - changedRowCount, - static_cast(latestInsertRowId) - }; + SequelResultOk, + "", + changedRowCount, + static_cast(latestInsertRowId)}; } SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const &query, jsi::Value const ¶ms) diff --git a/cpp/sequel.h b/cpp/sqliteBridge.h similarity index 82% rename from cpp/sequel.h rename to cpp/sqliteBridge.h index 2d85ef5..6da07ec 100644 --- a/cpp/sequel.h +++ b/cpp/sqliteBridge.h @@ -9,7 +9,6 @@ #include #include -#include "SequelResult.h" #include "JSIHelper.h" #include @@ -22,10 +21,10 @@ SequelResult sequel_close(string const dbName); SequelResult sequel_remove(string const dbName, string const docPath); -//SequelResult sequel_attach(string const &dbName); +// SequelResult sequel_attach(string const &dbName); SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const &query, jsi::Value const ¶ms); -SequelOperationStatus sequel_execute3(string const dbName, string const &query, vector *values, vector> *result); +SequelOperationStatus sequel_execute3(string const dbName, string const &query, vector *values, vector> *result); SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, string const &query); From 6e80c610ddcd1a9748ae3b4b3b5a29ce532b3220 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Mon, 14 Mar 2022 07:26:42 +0100 Subject: [PATCH 29/47] Adjust CMakeLists --- android/CMakeLists.txt | 5 ++--- cpp/JSIHelper.h | 1 - example/ios/SequelExample.xcodeproj/project.pbxproj | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 3055c6b..df7e663 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -39,9 +39,8 @@ include_directories( add_library( ${PACKAGE_NAME} SHARED - ../cpp/sequel.cpp - ../cpp/sequel.h - ../cpp/SequelResult.h + ../cpp/sqliteBridge.cpp + ../cpp/sqliteBridge.h ../cpp/react-native-quick-sqlite.cpp ../cpp/react-native-quick-sqlite.h ../cpp/sqlite3.h diff --git a/cpp/JSIHelper.h b/cpp/JSIHelper.h index ea56c76..9565c70 100644 --- a/cpp/JSIHelper.h +++ b/cpp/JSIHelper.h @@ -93,7 +93,6 @@ struct SequelBatchOperationResult int commands; }; - /** * Fill the target vector with parsed parameters * */ diff --git a/example/ios/SequelExample.xcodeproj/project.pbxproj b/example/ios/SequelExample.xcodeproj/project.pbxproj index df3ad65..daf0ab4 100644 --- a/example/ios/SequelExample.xcodeproj/project.pbxproj +++ b/example/ios/SequelExample.xcodeproj/project.pbxproj @@ -266,7 +266,7 @@ baseConfigurationReference = 47F7ED3B7971BE374F7B8635 /* Pods-SequelExample.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 24CMR7378R; @@ -291,7 +291,7 @@ baseConfigurationReference = E00ACF0FDA8BF921659E2F9A /* Pods-SequelExample.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 24CMR7378R; From 347b8c292474a59ebb210c4f9ed533e8083d0c2d Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Mon, 14 Mar 2022 08:24:40 +0100 Subject: [PATCH 30/47] Rename main installer file --- android/CMakeLists.txt | 4 ++-- cpp/{react-native-quick-sqlite.cpp => installer.cpp} | 9 ++------- cpp/{react-native-quick-sqlite.h => installer.h} | 4 +--- ios/Sequel.mm | 6 +++--- 4 files changed, 8 insertions(+), 15 deletions(-) rename cpp/{react-native-quick-sqlite.cpp => installer.cpp} (98%) rename cpp/{react-native-quick-sqlite.h => installer.h} (67%) diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index df7e663..b9ca999 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -41,8 +41,8 @@ add_library( SHARED ../cpp/sqliteBridge.cpp ../cpp/sqliteBridge.h - ../cpp/react-native-quick-sqlite.cpp - ../cpp/react-native-quick-sqlite.h + ../cpp/installer.cpp + ../cpp/installer.h ../cpp/sqlite3.h ../cpp/sqlite3.c ../cpp/JSIHelper.h diff --git a/cpp/react-native-quick-sqlite.cpp b/cpp/installer.cpp similarity index 98% rename from cpp/react-native-quick-sqlite.cpp rename to cpp/installer.cpp index d72c36c..634ef3e 100644 --- a/cpp/react-native-quick-sqlite.cpp +++ b/cpp/installer.cpp @@ -7,7 +7,7 @@ * This code is licensed under the MIT license */ -#include "react-native-quick-sqlite.h" +#include "installer.h" #include "sqliteBridge.h" #include "logs.h" #include "JSIHelper.h" @@ -87,7 +87,7 @@ jsi::Object createOk(jsi::Runtime &rt) return res; } -void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath) +void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath) { // Transfer from pointer to variable to prevent de-allocation once calling function has finished @@ -459,8 +459,3 @@ void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallI rt.global().setProperty(rt, "sqlite", move(module)); } - -void cleanUpSequel() -{ - // intentionally left blank -} diff --git a/cpp/react-native-quick-sqlite.h b/cpp/installer.h similarity index 67% rename from cpp/react-native-quick-sqlite.h rename to cpp/installer.h index ca685d9..9cbc15c 100644 --- a/cpp/react-native-quick-sqlite.h +++ b/cpp/installer.h @@ -13,6 +13,4 @@ using namespace facebook; -void installSequel(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath); - -void cleanUpSequel(); +void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath); diff --git a/ios/Sequel.mm b/ios/Sequel.mm index 2916726..b7a7c33 100644 --- a/ios/Sequel.mm +++ b/ios/Sequel.mm @@ -8,7 +8,7 @@ */ #import "Sequel.h" -#import "react-native-quick-sqlite.h" +#import "installer.h" #import #import @@ -45,11 +45,11 @@ - (void)setBridge:(RCTBridge *)bridge { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true); NSString *documentPath = [paths objectAtIndex:0]; - installSequel(*(facebook::jsi::Runtime *)cxxBridge.runtime, callInvoker,[documentPath UTF8String]); + install(*(facebook::jsi::Runtime *)cxxBridge.runtime, callInvoker,[documentPath UTF8String]); } - (void)invalidate { - cleanUpSequel(); + // intentionally left blank } @end From c680dda9d08140bfcb1a9b2d028041e94f4408c8 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Mon, 14 Mar 2022 18:36:09 +0100 Subject: [PATCH 31/47] Remove readme mention of c++ 17 --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index ddc35bc..5a55afc 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,6 @@ Inspired/compatible with [react-native-sqlite-storage](https://github.com/andpor ## Gotchas -- On Xcode you need to change the C++ version to C++ 17 or above - **Javascript cannot represent intergers larger than 53 bits**, be careful when loading data if it came from other systems. [Read more](https://github.com/ospfranco/react-native-quick-sqlite/issues/16#issuecomment-1018412991). - **It's not possible to use a browser to debug a JSI app**, use [Flipper](https://github.com/facebook/flipper) (for android Flipper also has SQLite Database explorer). - Your app will now include C++, you will need to install the NDK on your machine for android. From 46aeb26b18f14eff16d77554d93b1b2763431163 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Mon, 14 Mar 2022 18:38:55 +0100 Subject: [PATCH 32/47] Fix typo --- cpp/installer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/installer.cpp b/cpp/installer.cpp index 634ef3e..3c14e0d 100644 --- a/cpp/installer.cpp +++ b/cpp/installer.cpp @@ -235,7 +235,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker // Converting results into a JSI Response auto jsiResult = createSequelQueryExecutionResult(rt, status, &results); - return move(jsiResult); + return jsiResult; }); // Execute a batch of SQL queries in a transaction @@ -389,7 +389,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker { LOGW("Catched exception: %s", exc.what()); invoker->invokeAsync([&rt, err = exc.what(), callback] - { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, "Unknow error")); }); + { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, "Unknown error")); }); } }; pool->queueWork(task); From 33ad8c2ab88581e261b929f2ea73393955eb4ec8 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Mon, 14 Mar 2022 18:43:40 +0100 Subject: [PATCH 33/47] Throw error when incorrect number of args is passed to asyncExecuteSQL call --- cpp/installer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpp/installer.cpp b/cpp/installer.cpp index 3c14e0d..385fbf6 100644 --- a/cpp/installer.cpp +++ b/cpp/installer.cpp @@ -405,8 +405,10 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker { if (count < 4) { - LOGW("NOT ENOUGH PARAMS PASSED"); + jsi::detail::throwJSError(rt, "[react-native-quick-sqlite] Incorrect arguments for asyncExecuteSQL"); + return {}; } + const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); const jsi::Value &originalParams = args[2]; From a6ae204cbbf63c9140eb8d6633efd2a67f86c2f7 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Mon, 14 Mar 2022 18:57:33 +0100 Subject: [PATCH 34/47] Fix android cpp-adapter --- android/cpp-adapter.cpp | 4 +-- example/android/app/build.gradle | 2 +- example/ios/Podfile | 2 +- example/ios/Podfile.lock | 31 ++++++++++++++++++- .../SequelExample.xcodeproj/project.pbxproj | 23 ++++++++++++-- 5 files changed, 55 insertions(+), 7 deletions(-) diff --git a/android/cpp-adapter.cpp b/android/cpp-adapter.cpp index c995acf..9e8f570 100644 --- a/android/cpp-adapter.cpp +++ b/android/cpp-adapter.cpp @@ -2,7 +2,7 @@ #include #include #include -#include "react-native-quick-sqlite.h" +#include "installer.h" #include "logs.h" #include @@ -26,7 +26,7 @@ struct QuickSQLiteBridge : jni::JavaClass auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); std::string docPathString = docPath->toStdString(); - installSequel(*jsiRuntime, jsCallInvoker, docPathString.c_str()); + install(*jsiRuntime, jsCallInvoker, docPathString.c_str()); } }; diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 71bdeff..a8ff4b1 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -76,7 +76,7 @@ import com.android.build.OutputFile */ project.ext.react = [ - enableHermes: true, // clean and rebuild if changing + enableHermes: false, // clean and rebuild if changing entryFile: "index.tsx", ] diff --git a/example/ios/Podfile b/example/ios/Podfile index 7506616..d29a436 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -8,7 +8,7 @@ target 'SequelExample' do use_react_native!( :path => config[:reactNativePath], - :hermes_enabled => false + :hermes_enabled => true ) pod 'react-native-quick-sqlite', :path => '../..' diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 4d865e0..a72740e 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -11,6 +11,8 @@ PODS: - ReactCommon/turbomodule/core (= 0.67.3) - fmt (6.2.1) - glog (0.3.5) + - hermes-engine (0.9.0) + - libevent (2.1.12) - RCT-Folly (2021.06.28.00-v2): - boost - DoubleConversion @@ -22,6 +24,12 @@ PODS: - DoubleConversion - fmt (~> 6.2.1) - glog + - RCT-Folly/Futures (2021.06.28.00-v2): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - libevent - RCTRequired (0.67.3) - RCTTypeSafety (0.67.3): - FBLazyVector (= 0.67.3) @@ -188,6 +196,17 @@ PODS: - React-logger (= 0.67.3) - React-perflogger (= 0.67.3) - React-runtimeexecutor (= 0.67.3) + - React-hermes (0.67.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.06.28.00-v2) + - RCT-Folly/Futures (= 2021.06.28.00-v2) + - React-cxxreact (= 0.67.3) + - React-jsi (= 0.67.3) + - React-jsiexecutor (= 0.67.3) + - React-jsinspector (= 0.67.3) + - React-perflogger (= 0.67.3) - React-jsi (0.67.3): - boost (= 1.76.0) - DoubleConversion @@ -286,6 +305,8 @@ DEPENDENCIES: - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (~> 0.9.0) + - libevent (~> 2.1.12) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) @@ -296,6 +317,7 @@ DEPENDENCIES: - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) @@ -318,6 +340,8 @@ DEPENDENCIES: SPEC REPOS: trunk: - fmt + - hermes-engine + - libevent EXTERNAL SOURCES: boost: @@ -346,6 +370,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" React-jsi: :path: "../node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: @@ -390,6 +416,8 @@ SPEC CHECKSUMS: FBReactNativeSpec: 94473205b8741b61402e8c51716dea34aa3f5b2f fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85 + hermes-engine: bf7577d12ac6ccf53ab8b5af3c6ccf0dd8458c5c + libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 RCT-Folly: 803a9cfd78114b2ec0f140cfa6fa2a6bafb2d685 RCTRequired: 3c77b683474faf23920fbefc71c4e13af21470c0 RCTTypeSafety: 720b1841260dac692444c2822b27403178da8b28 @@ -398,6 +426,7 @@ SPEC CHECKSUMS: React-Core: 306cfdc1393bcf9481cc5de9807608db7661817b React-CoreModules: 2576a88d630899f3fcdf2cb79fcc0454d7b2a8bb React-cxxreact: a492f0de07d875419dcb9f463c63c22fe51c433b + React-hermes: 4321bcd6fce09f8c6d1be355da31e1cdae7bfac6 React-jsi: bca092b0c38d5e3fd60bb491d4994ab4a8ac2ad3 React-jsiexecutor: 15ea57ead631a11fad57634ff69f78e797113a39 React-jsinspector: 1e1e03345cf6d47779e2061d679d0a87d9ae73d8 @@ -417,6 +446,6 @@ SPEC CHECKSUMS: ReactCommon: 650e33cde4fb7d36781cd3143f5276da0abb2f96 Yoga: 90dcd029e45d8a7c1ff059e8b3c6612ff409061a -PODFILE CHECKSUM: 8e46f9681f82354d9c073d5479b59194bb998732 +PODFILE CHECKSUM: 23fbb34cc9cd3db2810e5bb10e37bce3ce025dee COCOAPODS: 1.11.2 diff --git a/example/ios/SequelExample.xcodeproj/project.pbxproj b/example/ios/SequelExample.xcodeproj/project.pbxproj index daf0ab4..748010c 100644 --- a/example/ios/SequelExample.xcodeproj/project.pbxproj +++ b/example/ios/SequelExample.xcodeproj/project.pbxproj @@ -118,6 +118,7 @@ 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, C1D60D28B925C94BD88E79D7 /* [CP] Copy Pods Resources */, + A93F141C4CF7AFEFE24310BB /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -209,6 +210,24 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + A93F141C4CF7AFEFE24310BB /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-SequelExample/Pods-SequelExample-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/hermes.framework/hermes", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SequelExample/Pods-SequelExample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; C1D60D28B925C94BD88E79D7 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -341,7 +360,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -402,7 +421,7 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; From c338ad67632d4a7e5e2e92f06274b3872072e5a8 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Mon, 14 Mar 2022 19:02:06 +0100 Subject: [PATCH 35/47] Add some comments to the example low level api --- example/src/Database.ts | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/example/src/Database.ts b/example/src/Database.ts index d482c1a..23fb95b 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -7,37 +7,31 @@ import { Buffer } from 'buffer'; export const lowLevelInit = async () => { sqlite.open('test', 'sample/database'); + // Just uncomment this methods to try the low level api of the library + + // Creates a table in db // const result = sqlite.executeSql( // 'test', // 'CREATE TABLE "User" ( id INT PRIMARY KEY, name TEXT NOT NULL );', // undefined // ); // console.warn('tried to create table result', result); + + // This is how you do a sync request // const result = sqlite.executeSql( // 'test', // 'INSERT INTO "User" (id, name) VALUES(?, ?)', // [new Date().getMilliseconds(), `${new Date().getMilliseconds()}`] // ); - const result = sqlite.executeSql('test', 'SELECT * FROM "User";', []); - console.warn('RESULT ', result); + // A simple select + // const result = sqlite.executeSql('test', 'SELECT * FROM "User";', []); - // sqlite.executeSql() - // console.warn('INSERTED DATA'); - // sqlite - // .asyncExecuteSql('test', 'SELECT * FROM "User";', []) - // .then((asyncRes) => { - // console.warn('asyncRes', asyncRes); - // }) - // .catch((err) => { - // console.warn('async error', err); - // }); - // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { - // console.warn('asyncRes', asyncRes); - // }); - // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { - // console.warn('asyncRes2', asyncRes); - // }); + // For more advanced use cases where you don't want to block the UI thread + // use async methods + sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { + console.warn('asyncRes2', asyncRes); + }); }; export async function typeORMInit() { From b799900343d5a5bcd469ca3b1c9bc628e8677502 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Mon, 14 Mar 2022 19:04:56 +0100 Subject: [PATCH 36/47] Remove C++ 17 requirement from podspec --- example/ios/Podfile.lock | 2 +- react-native-quick-sqlite.podspec | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index a72740e..9cc2dfe 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -431,7 +431,7 @@ SPEC CHECKSUMS: React-jsiexecutor: 15ea57ead631a11fad57634ff69f78e797113a39 React-jsinspector: 1e1e03345cf6d47779e2061d679d0a87d9ae73d8 React-logger: 1e10789cb84f99288479ba5f20822ce43ced6ffe - react-native-quick-sqlite: 094983ef7f02c4e2a731864581d6110d77f40d55 + react-native-quick-sqlite: 47074fd0f16ded188572f1395e8b9f4e108aaec9 React-perflogger: 93d3f142d6d9a46e635f09ba0518027215a41098 React-RCTActionSheet: 87327c3722203cc79cf79d02fb83e7332aeedd18 React-RCTAnimation: 009c87c018d50e0b38692699405ebe631ff4872d diff --git a/react-native-quick-sqlite.podspec b/react-native-quick-sqlite.podspec index 1de5cf8..ad14eaf 100644 --- a/react-native-quick-sqlite.podspec +++ b/react-native-quick-sqlite.podspec @@ -14,7 +14,6 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/ospfranco/react-native-quick-sqlite.git", :tag => "#{s.version}" } s.pod_target_xcconfig = { - :CLANG_CXX_LANGUAGE_STANDARD => 'c++17', :GCC_PREPROCESSOR_DEFINITIONS => "HAVE_FULLFSYNC=1", :WARNING_CFLAGS => "-Wno-shorten-64-to-32 -Wno-comma -Wno-unreachable-code -Wno-conditional-uninitialized -Wno-deprecated-declarations", :USE_HEADERMAP => "No" From c91bf89a60d1d9d9ed23b64c2caa0d039df437e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Mon, 14 Mar 2022 16:59:38 -0300 Subject: [PATCH 37/47] Refactory of importSQLFile - Method exported to its own file --- android/CMakeLists.txt | 2 ++ cpp/installer.cpp | 50 +------------------------------------- cpp/sqlfileloader.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++ cpp/sqlfileloader.h | 10 ++++++++ 4 files changed, 67 insertions(+), 49 deletions(-) create mode 100644 cpp/sqlfileloader.cpp create mode 100644 cpp/sqlfileloader.h diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index b9ca999..5c845be 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -49,6 +49,8 @@ add_library( ../cpp/JSIHelper.cpp ../cpp/ThreadPool.h ../cpp/ThreadPool.cpp + ../cpp/sqlfileloader.h + ../cpp/sqlfileloader.cpp cpp-adapter.cpp ) diff --git a/cpp/installer.cpp b/cpp/installer.cpp index 385fbf6..1973a0b 100644 --- a/cpp/installer.cpp +++ b/cpp/installer.cpp @@ -12,6 +12,7 @@ #include "logs.h" #include "JSIHelper.h" #include "ThreadPool.h" +#include "sqlfileloader.h" #include #include #include @@ -23,55 +24,6 @@ using namespace facebook; string docPathStr; std::shared_ptr invoker; -/** - * Local function to handle SQL File Import in order to reuse with Sync and Async operations - */ -SequelBatchOperationResult importSQLFile(string dbName, string fileLocation) -{ - string line; - ifstream sqFile(fileLocation); - if (sqFile.is_open()) - { - try - { - int affectedRows = 0; - int commands = 0; - sequel_execute_literal_update(dbName, "BEGIN EXCLUSIVE TRANSACTION"); - while (std::getline(sqFile, line, '\n')) - { - if (!line.empty()) - { - SequelLiteralUpdateResult result = sequel_execute_literal_update(dbName, line); - if (result.type == SequelResultError) - { - sequel_execute_literal_update(dbName, "ROLLBACK"); - sqFile.close(); - return {SequelResultError, result.message, 0, commands}; - } - else - { - affectedRows += result.affectedRows; - commands++; - } - } - } - sqFile.close(); - sequel_execute_literal_update(dbName, "COMMIT"); - return {SequelResultOk, "", affectedRows, commands}; - } - catch (...) - { - sqFile.close(); - sequel_execute_literal_update(dbName, "ROLLBACK"); - return {SequelResultError, "[react-native-quick-sqlite][loadSQLFile] Unexpected error, transaction was rolledback", 0, 0}; - } - } - else - { - return {SequelResultError, "[react-native-quick-sqlite][loadSQLFile] Could not open file", 0, 0}; - } -} - jsi::Object createError(jsi::Runtime &rt, string message) { auto res = jsi::Object(rt); diff --git a/cpp/sqlfileloader.cpp b/cpp/sqlfileloader.cpp new file mode 100644 index 0000000..da4cd8c --- /dev/null +++ b/cpp/sqlfileloader.cpp @@ -0,0 +1,54 @@ +/** + * SQL File Loader implementation +*/ +#include "sqlfileloader.h" +#include +#include + +using namespace std; + +SequelBatchOperationResult importSQLFile(string dbName, string fileLocation) +{ + string line; + ifstream sqFile(fileLocation); + if (sqFile.is_open()) + { + try + { + int affectedRows = 0; + int commands = 0; + sequel_execute_literal_update(dbName, "BEGIN EXCLUSIVE TRANSACTION"); + while (std::getline(sqFile, line, '\n')) + { + if (!line.empty()) + { + SequelLiteralUpdateResult result = sequel_execute_literal_update(dbName, line); + if (result.type == SequelResultError) + { + sequel_execute_literal_update(dbName, "ROLLBACK"); + sqFile.close(); + return {SequelResultError, result.message, 0, commands}; + } + else + { + affectedRows += result.affectedRows; + commands++; + } + } + } + sqFile.close(); + sequel_execute_literal_update(dbName, "COMMIT"); + return {SequelResultOk, "", affectedRows, commands}; + } + catch (...) + { + sqFile.close(); + sequel_execute_literal_update(dbName, "ROLLBACK"); + return {SequelResultError, "[react-native-quick-sqlite][loadSQLFile] Unexpected error, transaction was rolledback", 0, 0}; + } + } + else + { + return {SequelResultError, "[react-native-quick-sqlite][loadSQLFile] Could not open file", 0, 0}; + } +} diff --git a/cpp/sqlfileloader.h b/cpp/sqlfileloader.h new file mode 100644 index 0000000..c301035 --- /dev/null +++ b/cpp/sqlfileloader.h @@ -0,0 +1,10 @@ + +/** + * SQL File Loader + * Utilizes the regular sqlite bridge to load an SQLFile inside a transaction + * +*/ + +#include "JSIHelper.h" +#include "sqliteBridge.h" +SequelBatchOperationResult importSQLFile(std::string dbName, std::string fileLocation); \ No newline at end of file From 2196756b6aeea7114d7a29826f19f872cb42a15c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Mon, 14 Mar 2022 17:04:57 -0300 Subject: [PATCH 38/47] Removed unused imports --- cpp/installer.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/cpp/installer.cpp b/cpp/installer.cpp index 1973a0b..875d8d5 100644 --- a/cpp/installer.cpp +++ b/cpp/installer.cpp @@ -14,8 +14,6 @@ #include "ThreadPool.h" #include "sqlfileloader.h" #include -#include -#include #include using namespace std; From 273f6953f6d02503aebbbbbf858c5bb7a9f7ac62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Mon, 14 Mar 2022 19:35:14 -0300 Subject: [PATCH 39/47] Refactory of batchExecution - Exported to this own file - Created the async version of this feature --- android/CMakeLists.txt | 2 + cpp/installer.cpp | 126 ++++++++++++++++++++------------------- cpp/sqlbatchexecutor.cpp | 89 +++++++++++++++++++++++++++ cpp/sqlbatchexecutor.h | 24 ++++++++ cpp/sqliteBridge.cpp | 5 ++ package.json | 3 + src/index.ts | 15 +++++ 7 files changed, 204 insertions(+), 60 deletions(-) create mode 100644 cpp/sqlbatchexecutor.cpp create mode 100644 cpp/sqlbatchexecutor.h diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 5c845be..a91a4db 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -51,6 +51,8 @@ add_library( ../cpp/ThreadPool.cpp ../cpp/sqlfileloader.h ../cpp/sqlfileloader.cpp + ../cpp/sqlbatchexecutor.h + ../cpp/sqlbatchexecutor.cpp cpp-adapter.cpp ) diff --git a/cpp/installer.cpp b/cpp/installer.cpp index 875d8d5..b1a4734 100644 --- a/cpp/installer.cpp +++ b/cpp/installer.cpp @@ -13,6 +13,7 @@ #include "JSIHelper.h" #include "ThreadPool.h" #include "sqlfileloader.h" +#include "sqlbatchexecutor.h" #include #include @@ -185,7 +186,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker // Converting results into a JSI Response auto jsiResult = createSequelQueryExecutionResult(rt, status, &results); - return jsiResult; + return move(jsiResult); }); // Execute a batch of SQL queries in a transaction @@ -201,80 +202,84 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - Incorrect parameter count"); } + const jsi::Value ¶ms = args[1]; + if (params.isNull() || params.isUndefined()) + { + return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - An array of SQL commands or parameters is needed"); + } const string dbName = args[0].asString(rt).utf8(rt); + const jsi::Array &batchParams = params.asObject(rt).asArray(rt); + vector commands; + jsiBatchParametersToQuickArguments(rt, batchParams, &commands); + + auto batchResult = executeBatch(dbName, &commands); + if(batchResult.type == SequelResultOk) + { + auto res = jsi::Object(rt); + res.setProperty(rt, "status", jsi::Value(0)); + res.setProperty(rt, "rowsAffected", jsi::Value(batchResult.affectedRows)); + return move(res); + } else + { + return createError(rt, batchResult.message); + } + }); + + auto execSQLBatchAsync = jsi::Function::createFromHostFunction( + rt, + jsi::PropNameID::forAscii(rt, "sequel_execSQLBatchAsync"), + 3, + [pool](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value + { + if (sizeof(args) < 3) + { + return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - Incorrect parameter count"); + } + const jsi::Value ¶ms = args[1]; if (params.isNull() || params.isUndefined()) { return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - An array of SQL commands or parameters is needed"); } - int rowsAffected = 0; + + const string dbName = args[0].asString(rt).utf8(rt); const jsi::Array &batchParams = params.asObject(rt).asArray(rt); - try + auto callback = make_shared((args[2].asObject(rt))); + + vector commands; + jsiBatchParametersToQuickArguments(rt, batchParams, &commands); + + auto task = + [&rt, dbName, commands = make_shared>(commands), callback]() { - sequel_execute(rt, dbName, "BEGIN TRANSACTION", jsi::Value::undefined()); - for (int i = 0; i < batchParams.length(rt); i++) + try { - const jsi::Array &command = batchParams.getValueAtIndex(rt, i).asObject(rt).asArray(rt); - if (command.length(rt) == 0) - { - sequel_execute(rt, dbName, "ROLLBACK", jsi::Value::undefined()); - return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - No SQL Commands found on batch index " + std::to_string(i)); - } - const string query = command.getValueAtIndex(rt, 0).asString(rt).utf8(rt); - const jsi::Value &commandParams = command.length(rt) > 1 ? command.getValueAtIndex(rt, 1) : jsi::Value::undefined(); - if (!commandParams.isUndefined() && commandParams.asObject(rt).isArray(rt) && commandParams.asObject(rt).asArray(rt).length(rt) > 0 && commandParams.asObject(rt).asArray(rt).getValueAtIndex(rt, 0).isObject()) - { - // This arguments are an array of arrays, like a batch update of a single sql command. - const jsi::Array &batchUpdateParams = commandParams.asObject(rt).asArray(rt); - for (int x = 0; x < batchUpdateParams.length(rt); x++) - { - const jsi::Value &p = batchUpdateParams.getValueAtIndex(rt, x); - SequelResult result = sequel_execute(rt, dbName, query, p); - if (result.type == SequelResultError) - { - sequel_execute(rt, dbName, "ROLLBACK", jsi::Value::undefined()); - return createError(rt, result.message.c_str()); - } - else - { - if (result.value.getObject(rt).hasProperty(rt, jsi::PropNameID::forAscii(rt, "rowsAffected"))) - { - rowsAffected += result.value.getObject(rt).getProperty(rt, jsi::PropNameID::forAscii(rt, "rowsAffected")).asNumber(); - } - } - } - } - else + // Inside the new worker thread, we can now call sqlite operations + auto batchResult = executeBatch(dbName, commands.get()); + invoker->invokeAsync([&rt, batchResult = move(batchResult), callback] { - SequelResult result = sequel_execute(rt, dbName, query, commandParams); - if (result.type == SequelResultError) + if(batchResult.type == SequelResultOk) { - sequel_execute(rt, dbName, "ROLLBACK", jsi::Value::undefined()); - - return createError(rt, result.message.c_str()); - } - else + auto res = jsi::Object(rt); + res.setProperty(rt, "status", jsi::Value(0)); + res.setProperty(rt, "rowsAffected", jsi::Value(batchResult.affectedRows)); + callback->asObject(rt).asFunction(rt).call(rt, move(res)); + return move(res); + } else { - if (result.value.getObject(rt).hasProperty(rt, jsi::PropNameID::forAscii(rt, "rowsAffected"))) - { - rowsAffected += result.value.getObject(rt).getProperty(rt, jsi::PropNameID::forAscii(rt, "rowsAffected")).asNumber(); - } + callback->asObject(rt).asFunction(rt).call(rt, createError(rt, batchResult.message)); } - } + }); } - sequel_execute(rt, dbName, "COMMIT", jsi::Value::undefined()); - } - catch (...) - { - sequel_execute(rt, dbName, "ROLLBACK", jsi::Value::undefined()); - return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - Unexpected error"); - } - - auto res = jsi::Object(rt); - res.setProperty(rt, "status", jsi::Value(0)); - res.setProperty(rt, "rowsAffected", jsi::Value(rowsAffected)); - return move(res); + catch (std::exception &exc) + { + invoker->invokeAsync([&rt, callback, &exc] + { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, exc.what())); }); + } + }; + pool->queueWork(task); + return {}; }); // Load SQL File from disk @@ -406,6 +411,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker module.setProperty(rt, "executeSql", move(execSQL)); module.setProperty(rt, "asyncExecuteSql", move(asyncExecSQL)); module.setProperty(rt, "executeSqlBatch", move(execSQLBatch)); + module.setProperty(rt, "asyncExecuteSqlBatch", move(execSQLBatchAsync)); module.setProperty(rt, "loadSqlFile", move(loadSQLFile)); module.setProperty(rt, "asyncLoadSqlFile", move(loadSQLFileAsync)); diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp new file mode 100644 index 0000000..8e1ce67 --- /dev/null +++ b/cpp/sqlbatchexecutor.cpp @@ -0,0 +1,89 @@ +/** + * Batch execution implementation +*/ +#include "sqlbatchexecutor.h" + +void jsiBatchParametersToQuickArguments(jsi::Runtime &rt, jsi::Array const &batchParams, vector *commands) +{ + for (int i = 0; i < batchParams.length(rt); i++) + { + const jsi::Array &command = batchParams.getValueAtIndex(rt, i).asObject(rt).asArray(rt); + if (command.length(rt) == 0) + { + continue; + } + + const string query = command.getValueAtIndex(rt, 0).asString(rt).utf8(rt); + const jsi::Value &commandParams = command.length(rt) > 1 ? command.getValueAtIndex(rt, 1) : jsi::Value::undefined(); + if (!commandParams.isUndefined() && commandParams.asObject(rt).isArray(rt) && commandParams.asObject(rt).asArray(rt).length(rt) > 0 && commandParams.asObject(rt).asArray(rt).getValueAtIndex(rt, 0).isObject()) + { + // This arguments is an array of arrays, like a batch update of a single sql command. + const jsi::Array &batchUpdateParams = commandParams.asObject(rt).asArray(rt); + for (int x = 0; x < batchUpdateParams.length(rt); x++) + { + const jsi::Value &p = batchUpdateParams.getValueAtIndex(rt, x); + vector params; + jsiQueryArgumentsToSequelParam(rt, p, ¶ms); + commands->push_back(QuickQueryArguments{ + query, + make_shared>(params) + }); + } + } + else + { + vector params; + jsiQueryArgumentsToSequelParam(rt, commandParams, ¶ms); + commands->push_back(QuickQueryArguments{ + query, + make_shared>(params) + }); + } + } +} + +SequelBatchOperationResult executeBatch(std::string dbName, vector *commands) +{ + size_t commandCount = commands->size(); + if(commandCount <= 0) + { + return SequelBatchOperationResult { + .type = SequelResultError, + .message = "No SQL commands provided", + }; + } + + try + { + int affectedRows = 0; + sequel_execute_literal_update(dbName, "BEGIN EXCLUSIVE TRANSACTION"); + for(int i = 0; iat(i); + // We do not provide a datastructure to receive query data because we don't need/want to handle this results in a batch execution + auto result = sequel_execute3(dbName, command.sql, command.params.get(), NULL); + if(result.type == SequelResultError) + { + return SequelBatchOperationResult { + .type = SequelResultError, + .message = result.errorMessage, + }; + } else + { + affectedRows += result.rowsAffected; + } + } + sequel_execute_literal_update(dbName, "COMMIT"); + return SequelBatchOperationResult { + .type = SequelResultOk, + .affectedRows = affectedRows, + .commands = (int) commandCount, + }; + } catch(std::exception &exc) + { + sequel_execute_literal_update(dbName, "ROLLBACK"); + return SequelBatchOperationResult { + .type = SequelResultError, + .message = exc.what(), + }; + } +} diff --git a/cpp/sqlbatchexecutor.h b/cpp/sqlbatchexecutor.h new file mode 100644 index 0000000..400e9b7 --- /dev/null +++ b/cpp/sqlbatchexecutor.h @@ -0,0 +1,24 @@ +/** + * SQL Batch execution implementation using default sqliteBridge implementation +*/ +#include "JSIHelper.h" +#include "sqliteBridge.h" + +using namespace std; +using namespace facebook; + +struct QuickQueryArguments { + string sql; + shared_ptr> params; +}; + +/** + * Local Helper method to translate JSI objects QuickQueryArguments datastructure + * MUST be called in the JavaScript Thread +*/ +void jsiBatchParametersToQuickArguments(jsi::Runtime &rt, jsi::Array const &batchParams, vector *commands); + +/** + * Execute a batch of commands in a exclusive transaction +*/ +SequelBatchOperationResult executeBatch(std::string dbName, vector *commands); diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index 56889ea..e78d58d 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -334,6 +334,11 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, switch (result) { case SQLITE_ROW: + if(results == NULL) + { + break; + } + i = 0; row = map(); count = sqlite3_column_count(statement); diff --git a/package.json b/package.json index 5cc52e7..a8f1a94 100644 --- a/package.json +++ b/package.json @@ -138,5 +138,8 @@ } ] ] + }, + "dependencies": { + "react-native-quick-sqlite": "file:///home/eduardo/Projetos/react/plugins/react-native-quick-sqlite" } } diff --git a/src/index.ts b/src/index.ts index bbfce05..3f897f2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -90,6 +90,11 @@ interface ISQLite { dbName: string, commands: SQLBatchParams[] ) => BatchQueryResult; + asyncExecuteSqlBatch: ( + dbName: string, + commands: SQLBatchParams[], + cb: (res: BatchQueryResult) => void + ) => void; loadSqlFile: (dbName: string, location: string) => FileLoadResult; asyncLoadSqlFile: ( dbName: string, @@ -124,6 +129,10 @@ interface IDBConnection { commands: SQLBatchParams[], callback?: (res: BatchQueryResult) => void ) => void; + asyncExecuteSqlBatch: ( + commands: SQLBatchParams[], + cb: (res: BatchQueryResult) => void + ) => void; close: (ok: (res: any) => void, fail: (msg: string) => void) => void; loadSqlFile: ( location: string, @@ -189,6 +198,12 @@ export const openDatabase = ( const response = sqlite.executeSqlBatch(options.name, commands); if (callback) callback(response); }, + asyncExecuteSqlBatch: ( + commands: SQLBatchParams[], + cb: (res: BatchQueryResult) => void + ) => { + sqlite.asyncExecuteSqlBatch(options.name, commands, cb); + }, close: (ok: any, fail: any) => { try { sqlite.close(options.name); From 263de995c9c4c3b9af50886b801df768dbe463ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Mon, 14 Mar 2022 19:38:04 -0300 Subject: [PATCH 40/47] Removal of incorrect return statement --- cpp/installer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/cpp/installer.cpp b/cpp/installer.cpp index b1a4734..f7eda2b 100644 --- a/cpp/installer.cpp +++ b/cpp/installer.cpp @@ -265,7 +265,6 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker res.setProperty(rt, "status", jsi::Value(0)); res.setProperty(rt, "rowsAffected", jsi::Value(batchResult.affectedRows)); callback->asObject(rt).asFunction(rt).call(rt, move(res)); - return move(res); } else { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, batchResult.message)); From 84e2e2d50a65afa7df54d87fe78eac5620e89295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Tue, 15 Mar 2022 08:47:25 -0300 Subject: [PATCH 41/47] Fixes - Incorrect dependency from package.json removed. - Better parameter checking of async batch execution --- cpp/installer.cpp | 13 +++++++++---- package.json | 3 --- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cpp/installer.cpp b/cpp/installer.cpp index f7eda2b..8e797b1 100644 --- a/cpp/installer.cpp +++ b/cpp/installer.cpp @@ -233,19 +233,24 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker { if (sizeof(args) < 3) { - return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - Incorrect parameter count"); + return {}; } const jsi::Value ¶ms = args[1]; + const jsi::Value &callbackHolder = args[2]; + if(!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) { + return {}; + } + if (params.isNull() || params.isUndefined()) { - return createError(rt, "[react-native-quick-sqlite][execSQLBatch] - An array of SQL commands or parameters is needed"); + callbackHolder.asObject(rt).asFunction(rt).call(rt, createError(rt, "[react-native-quick-sqlite][execSQLBatch] - An array of SQL commands or parameters is needed")); + return {}; } - const string dbName = args[0].asString(rt).utf8(rt); const jsi::Array &batchParams = params.asObject(rt).asArray(rt); - auto callback = make_shared((args[2].asObject(rt))); + auto callback = make_shared((callbackHolder.asObject(rt))); vector commands; jsiBatchParametersToQuickArguments(rt, batchParams, &commands); diff --git a/package.json b/package.json index a8f1a94..5cc52e7 100644 --- a/package.json +++ b/package.json @@ -138,8 +138,5 @@ } ] ] - }, - "dependencies": { - "react-native-quick-sqlite": "file:///home/eduardo/Projetos/react/plugins/react-native-quick-sqlite" } } From ea6de4fa652f507002de3735c698975dd8311168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Tue, 15 Mar 2022 09:43:45 -0300 Subject: [PATCH 42/47] New async methods now throw erros on parameters validation. --- cpp/installer.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/cpp/installer.cpp b/cpp/installer.cpp index 8e797b1..bc5dc3c 100644 --- a/cpp/installer.cpp +++ b/cpp/installer.cpp @@ -233,24 +233,26 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker { if (sizeof(args) < 3) { + jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncExecuteSqlBatch] Incorrect parameter count"); return {}; } const jsi::Value ¶ms = args[1]; const jsi::Value &callbackHolder = args[2]; if(!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) { + jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncExecuteSqlBatch] The callback argument must be a function"); return {}; } if (params.isNull() || params.isUndefined()) { - callbackHolder.asObject(rt).asFunction(rt).call(rt, createError(rt, "[react-native-quick-sqlite][execSQLBatch] - An array of SQL commands or parameters is needed")); + jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncExecuteSqlBatch] - An array of SQL commands or parameters is needed"); return {}; } const string dbName = args[0].asString(rt).utf8(rt); const jsi::Array &batchParams = params.asObject(rt).asArray(rt); - auto callback = make_shared((callbackHolder.asObject(rt))); + auto callback = make_shared(callbackHolder.asObject(rt)); vector commands; jsiBatchParametersToQuickArguments(rt, batchParams, &commands); @@ -318,9 +320,21 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker 3, [pool](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value { + if (sizeof(args) < 3) + { + jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncLoadSqlFile] Incorrect parameter count"); + return {}; + } + + const jsi::Value &callbackHolder = args[2]; + if(!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) { + jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncLoadSqlFile] The callback argument must be a function"); + return {}; + } + const string dbName = args[0].asString(rt).utf8(rt); const string sqlFileName = args[1].asString(rt).utf8(rt); - auto callback = make_shared((args[2].asObject(rt))); + auto callback = make_shared(callbackHolder.asObject(rt)); auto task = [&rt, dbName, sqlFileName, callback]() @@ -364,14 +378,20 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker { if (count < 4) { - jsi::detail::throwJSError(rt, "[react-native-quick-sqlite] Incorrect arguments for asyncExecuteSQL"); + jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncExecuteSql] Incorrect arguments for asyncExecuteSQL"); + return {}; + } + + const jsi::Value &callbackHolder = args[3]; + if(!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) { + jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncExecuteSql] The callback argument must be a function"); return {}; } const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); const jsi::Value &originalParams = args[2]; - auto callback = make_shared(args[3].asObject(rt)); + auto callback = make_shared(callbackHolder.asObject(rt)); // Converting query parameters inside the javascript caller thread vector params; From 2e11e0a31b48fc85947fc62c00478dd105a9d050 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Wed, 16 Mar 2022 11:37:01 +0100 Subject: [PATCH 43/47] Remove original execute_sequel method (depended on JSI) and rename base structs --- cpp/JSIHelper.cpp | 7 +- cpp/JSIHelper.h | 15 +- cpp/installer.cpp | 55 +++--- cpp/sqlbatchexecutor.cpp | 18 +- cpp/sqlfileloader.cpp | 20 +-- cpp/sqliteBridge.cpp | 356 ++++++--------------------------------- cpp/sqliteBridge.h | 14 +- example/src/Database.ts | 32 ++-- 8 files changed, 133 insertions(+), 384 deletions(-) diff --git a/cpp/JSIHelper.cpp b/cpp/JSIHelper.cpp index 62cfb78..c46ef46 100644 --- a/cpp/JSIHelper.cpp +++ b/cpp/JSIHelper.cpp @@ -85,7 +85,6 @@ void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, } else if (value.isBool()) { - int intVal = int(value.getBool()); target->push_back(createBooleanQuickValue(value.getBool())); } else if (value.isNumber()) @@ -127,10 +126,10 @@ void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, } } -jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationStatus status, vector> *results) +jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SQLiteOPResult status, vector> *results) { jsi::Object res = jsi::Object(rt); - if (status.type == SequelResultOk) + if (status.type == SQLiteOk) { // res.setProperty(rt, "rows", move(rows)); res.setProperty(rt, "rowsAffected", jsi::Value(status.rowsAffected)); @@ -194,4 +193,4 @@ jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationSta } return move(res); -} \ No newline at end of file +} diff --git a/cpp/JSIHelper.h b/cpp/JSIHelper.h index 9565c70..fa5012c 100644 --- a/cpp/JSIHelper.h +++ b/cpp/JSIHelper.h @@ -59,18 +59,11 @@ struct QuickColumnValue */ enum ResultType { - SequelResultOk, - SequelResultError + SQLiteOk, + SQLiteError }; -struct SequelResult -{ - ResultType type; - string message; - jsi::Value value; -}; - -struct SequelOperationStatus +struct SQLiteOPResult { ResultType type; string errorMessage; @@ -106,6 +99,6 @@ QuickValue createIntegerQuickValue(double value); QuickValue createInt64QuickValue(long long value); QuickValue createDoubleQuickValue(double value); QuickValue createArrayBufferQuickValue(uint8_t *arrayBufferValue, size_t arrayBufferSize); -jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SequelOperationStatus status, vector> *results); +jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SQLiteOPResult status, vector> *results); #endif /* JSIHelper_h */ diff --git a/cpp/installer.cpp b/cpp/installer.cpp index bc5dc3c..602d0a5 100644 --- a/cpp/installer.cpp +++ b/cpp/installer.cpp @@ -75,11 +75,11 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker tempDocPath = tempDocPath + "/" + args[1].asString(rt).utf8(rt); } - SequelResult result = sequel_open(dbName, tempDocPath); + SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); - if (result.type == SequelResultError) + if (result.type == SQLiteError) { - return createError(rt, result.message.c_str()); + return createError(rt, result.errorMessage.c_str()); } return createOk(rt); @@ -99,7 +99,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker // string dbName = args[0].asString(rt).utf8(rt); // SequelResult result = sequel_attach(dbName); // - // if (result.type == SequelResultError) + // if (result.type == SQLiteError) // { // jsi::detail::throwJSError(rt, result.message.c_str()); // return {}; @@ -127,14 +127,14 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker string dbName = args[0].asString(rt).utf8(rt); - SequelResult result = sequel_close(dbName); + SQLiteOPResult result = sqliteCloseDb(dbName); - if (result.type == SequelResultError) + if (result.type == SQLiteError) { - return createError(rt, result.message.c_str()); + return createError(rt, result.errorMessage.c_str()); } - return move(result.value); + return createOk(rt); }); // Delete db @@ -156,11 +156,11 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker string dbName = args[0].asString(rt).utf8(rt); - SequelResult result = sequel_remove(dbName, docPathStr); + SQLiteOPResult result = sqliteRemoveDb(dbName, docPathStr); - if (result.type == SequelResultError) + if (result.type == SQLiteError) { - return createError(rt, result.message.c_str()); + return createError(rt, result.errorMessage.c_str()); } return jsi::Value::undefined(); @@ -182,7 +182,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker // Filling the results vector> results; - auto status = sequel_execute3(dbName, query, ¶ms, &results); + auto status = sqliteExecute(dbName, query, ¶ms, &results); // Converting results into a JSI Response auto jsiResult = createSequelQueryExecutionResult(rt, status, &results); @@ -213,13 +213,14 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker jsiBatchParametersToQuickArguments(rt, batchParams, &commands); auto batchResult = executeBatch(dbName, &commands); - if(batchResult.type == SequelResultOk) + if (batchResult.type == SQLiteOk) { auto res = jsi::Object(rt); res.setProperty(rt, "status", jsi::Value(0)); res.setProperty(rt, "rowsAffected", jsi::Value(batchResult.affectedRows)); return move(res); - } else + } + else { return createError(rt, batchResult.message); } @@ -239,7 +240,8 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker const jsi::Value ¶ms = args[1]; const jsi::Value &callbackHolder = args[2]; - if(!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) { + if (!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) + { jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncExecuteSqlBatch] The callback argument must be a function"); return {}; } @@ -264,9 +266,9 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker { // Inside the new worker thread, we can now call sqlite operations auto batchResult = executeBatch(dbName, commands.get()); - invoker->invokeAsync([&rt, batchResult = move(batchResult), callback] - { - if(batchResult.type == SequelResultOk) + invoker->invokeAsync([&rt, batchResult = move(batchResult), callback] + { + if(batchResult.type == SQLiteOk) { auto res = jsi::Object(rt); res.setProperty(rt, "status", jsi::Value(0)); @@ -275,8 +277,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker } else { callback->asObject(rt).asFunction(rt).call(rt, createError(rt, batchResult.message)); - } - }); + } }); } catch (std::exception &exc) { @@ -299,7 +300,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker const string sqlFileName = args[1].asString(rt).utf8(rt); const auto importResult = importSQLFile(dbName, sqlFileName); - if (importResult.type == SequelResultOk) + if (importResult.type == SQLiteOk) { auto res = jsi::Object(rt); res.setProperty(rt, "status", jsi::Value(0)); @@ -327,7 +328,8 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker } const jsi::Value &callbackHolder = args[2]; - if(!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) { + if (!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) + { jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncLoadSqlFile] The callback argument must be a function"); return {}; } @@ -347,7 +349,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker // Executing the callback invoke inside the JavaScript thread in order to safe build JSI objects that depends on jsi::Runtime and must be synchronized. invoker->invokeAsync([&rt, result = move(importResult), callback] { - if(result.type == SequelResultOk) + if(result.type == SQLiteOk) { auto res = jsi::Object(rt); res.setProperty(rt, "status", jsi::Value(0)); @@ -383,11 +385,12 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker } const jsi::Value &callbackHolder = args[3]; - if(!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) { + if (!callbackHolder.isObject() || !callbackHolder.asObject(rt).isFunction(rt)) + { jsi::detail::throwJSError(rt, "[react-native-quick-sqlite][asyncExecuteSql] The callback argument must be a function"); return {}; } - + const string dbName = args[0].asString(rt).utf8(rt); const string query = args[1].asString(rt).utf8(rt); const jsi::Value &originalParams = args[2]; @@ -404,7 +407,7 @@ void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker { // Inside the new worker thread, we can now call sqlite operations vector> results; - auto status = sequel_execute3(dbName, query, params.get(), &results); + auto status = sqliteExecute(dbName, query, params.get(), &results); invoker->invokeAsync([&rt, results = make_shared>>(results), status_copy = move(status), callback] { // Now, back into the JavaScript thread, we can translate the results diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index 8e1ce67..951bafa 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -48,7 +48,7 @@ SequelBatchOperationResult executeBatch(std::string dbName, vectorat(i); // We do not provide a datastructure to receive query data because we don't need/want to handle this results in a batch execution - auto result = sequel_execute3(dbName, command.sql, command.params.get(), NULL); - if(result.type == SequelResultError) + auto result = sqliteExecute(dbName, command.sql, command.params.get(), NULL); + if(result.type == SQLiteError) { return SequelBatchOperationResult { - .type = SequelResultError, + .type = SQLiteError, .message = result.errorMessage, }; } else @@ -72,17 +72,17 @@ SequelBatchOperationResult executeBatch(std::string dbName, vector *values) +void bindStatement(sqlite3_stmt *statement, vector *values) { size_t size = values->size(); if (size <= 0) @@ -288,15 +226,16 @@ void bindStatementWithValues(sqlite3_stmt *statement, vector *values } } -SequelOperationStatus sequel_execute3(string const dbName, string const &query, vector *params, vector> *results) +SQLiteOPResult sqliteExecute(string const dbName, string const &query, vector *params, vector> *results) { // Check if db connection is opened if (dbMap.count(dbName) == 0) { - return SequelOperationStatus{ - SequelResultError, - "[react-native-quick-sqlite]: Database " + dbName + " is not open", - 0}; + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = "[react-native-quick-sqlite]: Database " + dbName + " is not open", + .rowsAffected = 0 + }; } sqlite3 *db = dbMap[dbName]; @@ -309,15 +248,15 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, if (statementStatus == SQLITE_OK) // statemnet is correct, bind the passed parameters { - bindStatementWithValues(statement, params); + bindStatement(statement, params); } else { const char *message = sqlite3_errmsg(db); - return SequelOperationStatus{ - SequelResultError, - "[react-native-quick-sqlite] SQL execution error: " + string(message), - 0}; + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = "[react-native-quick-sqlite] SQL execution error: " + string(message), + .rowsAffected = 0}; } bool isConsuming = true; @@ -415,215 +354,32 @@ SequelOperationStatus sequel_execute3(string const dbName, string const &query, if (isFailed) { const char *message = sqlite3_errmsg(db); - return SequelOperationStatus{ - SequelResultError, - "[react-native-quick-sqlite] SQL execution error: " + string(message), - 0, - 0}; + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = "[react-native-quick-sqlite] SQL execution error: " + string(message), + .rowsAffected = 0, + .insertId = 0 + }; } int changedRowCount = sqlite3_changes(db); long long latestInsertRowId = sqlite3_last_insert_rowid(db); - return SequelOperationStatus{ - SequelResultOk, - "", - changedRowCount, - static_cast(latestInsertRowId)}; + return SQLiteOPResult{ + .type = SQLiteOk, + .rowsAffected = changedRowCount, + .insertId = static_cast(latestInsertRowId)}; } -SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const &query, jsi::Value const ¶ms) +SequelLiteralUpdateResult sqliteExecuteLiteral(string const dbName, string const &query) { // Check if db connection is opened if (dbMap.count(dbName) == 0) { - return SequelResult{ - SequelResultError, - "[react-native-quick-sqlite]: Database " + dbName + " is not open"}; - } - - sqlite3 *db = dbMap[dbName]; - - vector results; - - // SQLite statements need to be compiled before executed - sqlite3_stmt *statement; - - // Compile and move result into statement memory spot - int statementStatus = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, NULL); - - if (statementStatus == SQLITE_OK) // statemnet is correct, bind the passed parameters - { - bindStatement(statement, rt, params); - } - else - { - const char *message = sqlite3_errmsg(db); return { - SequelResultError, - "[react-native-quick-sqlite] SQL execution error: " + string(message), - jsi::Value::undefined()}; - } - - bool isConsuming = true; - bool isFailed = false; - - int result, i, count, column_type; - string column_name; - - while (isConsuming) - { - result = sqlite3_step(statement); - jsi::Object entry = jsi::Object(rt); - - switch (result) - { - case SQLITE_ROW: - i = 0; - count = sqlite3_column_count(statement); - - while (i < count) - { - column_type = sqlite3_column_type(statement, i); - column_name = sqlite3_column_name(statement, i); - - switch (column_type) - { - - case SQLITE_INTEGER: - { - /** - * It's not possible to send a int64_t in a jsi::Value because JS cannot represent the whole number range. - * Instead, we're sending a double, which can represent all integers up to 53 bits long, which is more - * than what was there before (a 32-bit int). - * - * See https://github.com/ospfranco/react-native-quick-sqlite/issues/16 for more context. - */ - double column_value = sqlite3_column_double(statement, i); - entry.setProperty(rt, column_name.c_str(), jsi::Value(column_value)); - break; - } - - case SQLITE_FLOAT: - { - double column_value = sqlite3_column_double(statement, i); - entry.setProperty(rt, column_name.c_str(), jsi::Value(column_value)); - break; - } - - case SQLITE_TEXT: - { - const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); - entry.setProperty(rt, column_name.c_str(), jsi::String::createFromUtf8(rt, column_value)); - break; - } - - case SQLITE_BLOB: - { - int blob_size = sqlite3_column_bytes(statement, i); - const void *blob = sqlite3_column_blob(statement, i); - jsi::Function array_buffer_ctor = rt.global().getPropertyAsFunction(rt, "ArrayBuffer"); - jsi::Object o = array_buffer_ctor.callAsConstructor(rt, blob_size).getObject(rt); - jsi::ArrayBuffer buf = o.getArrayBuffer(rt); - // It's a shame we have to copy here: see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564. - memcpy(buf.data(rt), blob, blob_size); - entry.setProperty(rt, column_name.c_str(), o); - break; - } - - case SQLITE_NULL: - // Intentionally left blank to switch to default case - default: - entry.setProperty(rt, column_name.c_str(), jsi::Value(nullptr)); - break; - } - - i++; - } - - results.push_back(move(entry)); - break; - - case SQLITE_DONE: - isConsuming = false; - break; - - default: - isFailed = true; - isConsuming = false; - } - } - - sqlite3_finalize(statement); - - if (isFailed) - { - const char *message = sqlite3_errmsg(db); - return { - SequelResultError, - "[react-native-quick-sqlite] SQL execution error: " + string(message), - jsi::Value::undefined()}; - } - - // Move everything into a JSI object - auto array = jsi::Array(rt, results.size()); - for (int i = 0; i < results.size(); i++) - { - array.setValueAtIndex(rt, i, move(results[i])); - } - - jsi::Object rows = jsi::Object(rt); - rows.setProperty(rt, "status", jsi::Value(0)); - rows.setProperty(rt, "length", jsi::Value((int)results.size())); - rows.setProperty(rt, "_array", move(array)); - - // For any future endaevors, I tried to create the accesor function directly on via JSI - // But this is too complex for my punny brain, so this function is created on the index.ts file - // // Create accessor function - // auto itemAccesser = jsi::Function::createFromHostFunction( - // rt, - // jsi::PropNameID::forAscii(rt, "item"), - // 1, - // [&array](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value - // { - // if(args[0].isNumber()) { - // double rowNumber = args[0].asNumber(); - // cout << "trying to access value at" << rowNumber << endl; - // return array.getValueAtIndex(rt, (int)rowNumber); - // } - // - // return {}; - // }); - - // rows.setProperty(rt, "item", move(itemAccesser)); - - jsi::Object res = jsi::Object(rt); - res.setProperty(rt, "rows", move(rows)); - - int changedRowCount = sqlite3_changes(db); - res.setProperty(rt, "rowsAffected", jsi::Value(changedRowCount)); - - // row id has nothing to do with the actual uuid/id of the object, but internal row count - long long latestInsertRowId = sqlite3_last_insert_rowid(db); - if (changedRowCount > 0 && latestInsertRowId != 0) - { - res.setProperty(rt, "insertId", jsi::Value((int)latestInsertRowId)); - } - - return { - SequelResultOk, - "", - move(res)}; -} - -SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, string const &query) -{ - // Check if db connection is opened - if (dbMap.count(dbName) == 0) - { - return { - SequelResultError, + SQLiteError, "[react-native-quick-sqlite] Database not opened: " + dbName, - 0}; + 0 + }; } sqlite3 *db = dbMap[dbName]; @@ -638,7 +394,7 @@ SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, str { const char *message = sqlite3_errmsg(db); return { - SequelResultError, + SQLiteError, "[react-native-quick-sqlite] SQL execution error: " + string(message), 0}; } @@ -675,14 +431,14 @@ SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, str { const char *message = sqlite3_errmsg(db); return { - SequelResultError, + SQLiteError, "[react-native-quick-sqlite] SQL execution error: " + string(message), 0}; } int changedRowCount = sqlite3_changes(db); return { - SequelResultOk, + SQLiteOk, "", changedRowCount}; } diff --git a/cpp/sqliteBridge.h b/cpp/sqliteBridge.h index 6da07ec..f301455 100644 --- a/cpp/sqliteBridge.h +++ b/cpp/sqliteBridge.h @@ -7,24 +7,20 @@ * This code is licensed under the MIT license */ -#include -#include #include "JSIHelper.h" #include using namespace std; using namespace facebook; -SequelResult sequel_open(string const dbName, string const docPath); +SQLiteOPResult sqliteOpenDb(string const dbName, string const docPath); -SequelResult sequel_close(string const dbName); +SQLiteOPResult sqliteCloseDb(string const dbName); -SequelResult sequel_remove(string const dbName, string const docPath); +SQLiteOPResult sqliteRemoveDb(string const dbName, string const docPath); // SequelResult sequel_attach(string const &dbName); -SequelResult sequel_execute(jsi::Runtime &rt, string const dbName, string const &query, jsi::Value const ¶ms); +SQLiteOPResult sqliteExecute(string const dbName, string const &query, vector *values, vector> *result); -SequelOperationStatus sequel_execute3(string const dbName, string const &query, vector *values, vector> *result); - -SequelLiteralUpdateResult sequel_execute_literal_update(string const dbName, string const &query); +SequelLiteralUpdateResult sqliteExecuteLiteral(string const dbName, string const &query); diff --git a/example/src/Database.ts b/example/src/Database.ts index 23fb95b..09dc5a4 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -10,28 +10,30 @@ export const lowLevelInit = async () => { // Just uncomment this methods to try the low level api of the library // Creates a table in db - // const result = sqlite.executeSql( - // 'test', - // 'CREATE TABLE "User" ( id INT PRIMARY KEY, name TEXT NOT NULL );', - // undefined - // ); - // console.warn('tried to create table result', result); + const createResult = sqlite.executeSql( + 'test', + 'CREATE TABLE "User" ( id INT PRIMARY KEY, name TEXT NOT NULL );', + undefined + ); + console.warn({ createResult }); // This is how you do a sync request - // const result = sqlite.executeSql( - // 'test', - // 'INSERT INTO "User" (id, name) VALUES(?, ?)', - // [new Date().getMilliseconds(), `${new Date().getMilliseconds()}`] - // ); + const insertResult = sqlite.executeSql( + 'test', + 'INSERT INTO "User" (id, name) VALUES(?, ?)', + [new Date().getMilliseconds(), `${new Date().getMilliseconds()}`] + ); + console.warn({ insertResult }); // A simple select - // const result = sqlite.executeSql('test', 'SELECT * FROM "User";', []); + const queryResult = sqlite.executeSql('test', 'SELECT * FROM "User";', []); + console.warn({ queryResult }); // For more advanced use cases where you don't want to block the UI thread // use async methods - sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { - console.warn('asyncRes2', asyncRes); - }); + // sqlite.asyncExecuteSql('test', 'SELECT * FROM "User";', [], (asyncRes) => { + // console.warn('asyncRes2', asyncRes); + // }); }; export async function typeORMInit() { From 45510dd5510fc91f05f90ee3295524ac75a80ad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Wed, 16 Mar 2022 19:21:00 -0300 Subject: [PATCH 44/47] Removal of third party libraries not used in this project --- android/CMakeLists.txt | 64 ++++++------- android/build.gradle | 199 +---------------------------------------- 2 files changed, 34 insertions(+), 229 deletions(-) diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index a91a4db..870c2a3 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.9.0) set (CMAKE_VERBOSE_MAKEFILE ON) set (CMAKE_CXX_STANDARD 14) -set (CMAKE_CXX_FLAGS "-DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_MOBILE=1 -DON_ANDROID -DONANDROID -DFOR_HERMES=${FOR_HERMES}") +#set (CMAKE_CXX_FLAGS "-DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_MOBILE=1 -DON_ANDROID -DONANDROID -DFOR_HERMES=${FOR_HERMES}") set (PACKAGE_NAME "react-native-quick-sqlite") set (BUILD_DIR ${CMAKE_SOURCE_DIR}/build) @@ -65,10 +65,10 @@ target_include_directories( # --- fbjni --- "${LIBFBJNI_INCLUDE_DIR}" # --- Third Party (required by RN) --- - "${BUILD_DIR}/third-party-ndk/boost" - "${BUILD_DIR}/third-party-ndk/double-conversion" - "${BUILD_DIR}/third-party-ndk/folly" - "${BUILD_DIR}/third-party-ndk/glog" +# "${BUILD_DIR}/third-party-ndk/boost" +# "${BUILD_DIR}/third-party-ndk/double-conversion" +# "${BUILD_DIR}/third-party-ndk/folly" +# "${BUILD_DIR}/third-party-ndk/glog" # --- React Native --- "${NODE_MODULES_DIR}/react-native/React" "${NODE_MODULES_DIR}/react-native/React/Base" @@ -84,25 +84,25 @@ target_include_directories( file (GLOB LIBRN_DIR "${BUILD_DIR}/react-native-0*/jni/${ANDROID_ABI}") -if(${FOR_HERMES}) - file (GLOB LIBHERMES_DIR "${BUILD_DIR}/third-party-ndk/hermes/jni/${ANDROID_ABI}") - # Use Hermes - find_library( - JS_ENGINE_LIB - hermes - PATHS ${LIBHERMES_DIR} - NO_CMAKE_FIND_ROOT_PATH - ) -else() - file (GLOB LIBJSC_DIR "${BUILD_DIR}/android-jsc*.aar/jni/${ANDROID_ABI}") - # Use JSC - find_library( - JS_ENGINE_LIB - jscexecutor - PATHS ${LIBRN_DIR} - NO_CMAKE_FIND_ROOT_PATH - ) -endif() +#if(${FOR_HERMES}) +# file (GLOB LIBHERMES_DIR "${BUILD_DIR}/third-party-ndk/hermes/jni/${ANDROID_ABI}") +# # Use Hermes +# find_library( +# JS_ENGINE_LIB +# hermes +# PATHS ${LIBHERMES_DIR} +# NO_CMAKE_FIND_ROOT_PATH +# ) +#else() +# file (GLOB LIBJSC_DIR "${BUILD_DIR}/android-jsc*.aar/jni/${ANDROID_ABI}") +# # Use JSC +# find_library( +# JS_ENGINE_LIB +# jscexecutor +# PATHS ${LIBRN_DIR} +# NO_CMAKE_FIND_ROOT_PATH +# ) +#endif() find_library( FBJNI_LIB @@ -110,12 +110,12 @@ find_library( PATHS ${LIBRN_DIR} NO_CMAKE_FIND_ROOT_PATH ) -find_library( - FOLLY_JSON_LIB - folly_json - PATHS ${LIBRN_DIR} - NO_CMAKE_FIND_ROOT_PATH -) +#find_library( +# FOLLY_JSON_LIB +# folly_json +# PATHS ${LIBRN_DIR} +# NO_CMAKE_FIND_ROOT_PATH +#) find_library( REACT_NATIVE_JNI_LIB @@ -146,9 +146,9 @@ target_link_libraries( ${PACKAGE_NAME} ${LOG_LIB} ${JSI_LIB} - ${JS_ENGINE_LIB} # <-- Hermes or JSC +# ${JS_ENGINE_LIB} # <-- Hermes or JSC ${REACT_NATIVE_JNI_LIB} ${FBJNI_LIB} - ${FOLLY_JSON_LIB} +# ${FOLLY_JSON_LIB} android ) diff --git a/android/build.gradle b/android/build.gradle index 3ff36e4..1be1a1f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -49,14 +49,6 @@ def reactProperties = new Properties() file("$nodeModules/react-native/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) } def REACT_NATIVE_VERSION = reactProperties.getProperty("VERSION_NAME").split("\\.")[1].toInteger() -def FOR_HERMES = System.getenv("FOR_HERMES") == "True" -rootProject.getSubprojects().forEach({ project -> - if (project.plugins.hasPlugin("com.android.application")) { - FOR_HERMES = project.ext.react.enableHermes - } -}) -logger.warn("JSI-WS: Building with ${FOR_HERMES ? "Hermes" : "JSC"}...") - android { compileSdkVersion getExtOrIntegerDefault('compileSdkVersion') @@ -74,8 +66,7 @@ android { abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' arguments '-DANDROID_STL=c++_shared', "-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION}", - "-DNODE_MODULES_DIR=${nodeModules}", - "-DFOR_HERMES=${FOR_HERMES}" + "-DNODE_MODULES_DIR=${nodeModules}" } } @@ -196,197 +187,14 @@ dependencies { extractJNI(files(rnAAR, jscAAR)) } - -// third-party-ndk deps headers -// mostly a copy of https://github.com/software-mansion/react-native-reanimated/blob/master/android/build.gradle#L115 - def downloadsDir = new File("$buildDir/downloads") -def thirdPartyNdkDir = new File("$buildDir/third-party-ndk") -def thirdPartyVersionsFile = new File("${nodeModules}/react-native/ReactAndroid/gradle.properties") -def thirdPartyVersions = new Properties() -thirdPartyVersions.load(new FileInputStream(thirdPartyVersionsFile)) - -def BOOST_VERSION = thirdPartyVersions["BOOST_VERSION"] -def boost_file = new File(downloadsDir, "boost_${BOOST_VERSION}.tar.gz") -def DOUBLE_CONVERSION_VERSION = thirdPartyVersions["DOUBLE_CONVERSION_VERSION"] -def double_conversion_file = new File(downloadsDir, "double-conversion-${DOUBLE_CONVERSION_VERSION}.tar.gz") -def FOLLY_VERSION = thirdPartyVersions["FOLLY_VERSION"] -def folly_file = new File(downloadsDir, "folly-${FOLLY_VERSION}.tar.gz") -def GLOG_VERSION = thirdPartyVersions["GLOG_VERSION"] -def glog_file = new File(downloadsDir, "glog-${GLOG_VERSION}.tar.gz") task createNativeDepsDirectories { doLast { downloadsDir.mkdirs() - thirdPartyNdkDir.mkdirs() - } -} - -task downloadBoost(dependsOn: createNativeDepsDirectories, type: Download) { - src("https://github.com/react-native-community/boost-for-react-native/releases/download/v${BOOST_VERSION.replace("_", ".")}-0/boost_${BOOST_VERSION}.tar.gz") - onlyIfNewer(true) - overwrite(false) - dest(boost_file) -} - -task prepareBoost(dependsOn: downloadBoost, type: Copy) { - from(tarTree(resources.gzip(downloadBoost.dest))) - from("src/main/jni/third-party/boost/Android.mk") - include("Android.mk", "boost_${BOOST_VERSION}/boost/**/*.hpp", "boost/boost/**/*.hpp") - includeEmptyDirs = false - into("$thirdPartyNdkDir") // /boost_X_XX_X - doLast { - file("$thirdPartyNdkDir/boost_${BOOST_VERSION}").renameTo("$thirdPartyNdkDir/boost") - } -} - -task downloadDoubleConversion(dependsOn: createNativeDepsDirectories, type: Download) { - src("https://github.com/google/double-conversion/archive/v${DOUBLE_CONVERSION_VERSION}.tar.gz") - onlyIfNewer(true) - overwrite(false) - dest(double_conversion_file) -} - -task prepareDoubleConversion(dependsOn: downloadDoubleConversion, type: Copy) { - from(tarTree(downloadDoubleConversion.dest)) - from("src/main/jni/third-party/double-conversion/Android.mk") - include("double-conversion-${DOUBLE_CONVERSION_VERSION}/src/**/*", "Android.mk") - filesMatching("*/src/**/*", { fname -> fname.path = "double-conversion/${fname.name}" }) - includeEmptyDirs = false - into("$thirdPartyNdkDir/double-conversion") -} - -task downloadFolly(dependsOn: createNativeDepsDirectories, type: Download) { - src("https://github.com/facebook/folly/archive/v${FOLLY_VERSION}.tar.gz") - onlyIfNewer(true) - overwrite(false) - dest(folly_file) -} - -task prepareFolly(dependsOn: downloadFolly, type: Copy) { - from(tarTree(downloadFolly.dest)) - from("src/main/jni/third-party/folly/Android.mk") - include("folly-${FOLLY_VERSION}/folly/**/*", "Android.mk") - eachFile { fname -> fname.path = (fname.path - "folly-${FOLLY_VERSION}/") } - includeEmptyDirs = false - into("$thirdPartyNdkDir/folly") -} - -task downloadGlog(dependsOn: createNativeDepsDirectories, type: Download) { - src("https://github.com/google/glog/archive/v${GLOG_VERSION}.tar.gz") - onlyIfNewer(true) - overwrite(false) - dest(glog_file) -} - -task prepareGlog(dependsOn: downloadGlog, type: Copy) { - from(tarTree(downloadGlog.dest)) - from("src/main/jni/third-party/glog/") - include("glog-${GLOG_VERSION}/src/**/*", "Android.mk", "config.h") - includeEmptyDirs = false - filesMatching("**/*.h.in") { - filter(ReplaceTokens, tokens: [ - ac_cv_have_unistd_h : "1", - ac_cv_have_stdint_h : "1", - ac_cv_have_systypes_h : "1", - ac_cv_have_inttypes_h : "1", - ac_cv_have_libgflags : "0", - ac_google_start_namespace : "namespace google {", - ac_cv_have_uint16_t : "1", - ac_cv_have_u_int16_t : "1", - ac_cv_have___uint16 : "0", - ac_google_end_namespace : "}", - ac_cv_have___builtin_expect : "1", - ac_google_namespace : "google", - ac_cv___attribute___noinline : "__attribute__ ((noinline))", - ac_cv___attribute___noreturn : "__attribute__ ((noreturn))", - ac_cv___attribute___printf_4_5: "__attribute__((__format__ (__printf__, 4, 5)))" - ]) - it.path = (it.name - ".in") - } - into("$thirdPartyNdkDir/glog") - - doLast { - copy { - from(fileTree(dir: "$thirdPartyNdkDir/glog", includes: ["stl_logging.h", "logging.h", "raw_logging.h", "vlog_is_on.h", "**/src/glog/log_severity.h"]).files) - includeEmptyDirs = false - into("$thirdPartyNdkDir/glog/exported/glog") - } - } -} - -task prepareThirdPartyNdkHeaders { - if (!boost_file.exists()) { - dependsOn(prepareBoost) - } - if (!double_conversion_file.exists()) { - dependsOn(prepareDoubleConversion) - } - if (!folly_file.exists()) { - dependsOn(prepareFolly) - } - if (!glog_file.exists()) { - dependsOn(prepareGlog) - } -} - -prepareThirdPartyNdkHeaders.mustRunAfter createNativeDepsDirectories - -task prepareHermes() { - doLast { - def hermesPackagePath = file("${nodeModules}/hermes-engine") - if (!hermesPackagePath.exists()) { - throw new GradleScriptException("Could not find the hermes-engine npm package", null) - } - - def hermesAAR = file("$hermesPackagePath/android/hermes-debug.aar") - if (!hermesAAR.exists()) { - throw new GradleScriptException("The hermes-engine npm package is missing \"android/hermes-debug.aar\"", null) - } - - def soFiles = zipTree(hermesAAR).matching({ it.include "**/*.so" }) - - copy { - from soFiles - from "$reactNative/ReactAndroid/src/main/jni/first-party/hermes/Android.mk" - into "$thirdPartyNdkDir/hermes" - } - } -} - -prepareHermes.mustRunAfter prepareThirdPartyNdkHeaders - -task prepareJSC { - doLast { - def jscPackagePath = file("${nodeModules}/jsc-android") - if (!jscPackagePath.exists()) { - throw new GradleScriptException("Could not find the jsc-android npm package", null) - } - - def jscDist = file("$jscPackagePath/dist") - if (!jscDist.exists()) { - throw new GradleScriptException("The jsc-android npm package is missing its \"dist\" directory", null) - } - - def jscAAR = fileTree(jscDist).matching({ it.include "**/android-jsc/**/*.aar" }).singleFile - def soFiles = zipTree(jscAAR).matching({ it.include "**/*.so" }) - - def headerFiles = fileTree(jscDist).matching({ it.include "**/include/*.h" }) - - copy { - from(soFiles) - from(headerFiles) - from("$reactNative/ReactAndroid/src/main/jni/third-party/jsc/Android.mk") - - filesMatching("**/*.h", { it.path = "JavaScriptCore/${it.name}" }) - - includeEmptyDirs(false) - into("$thirdPartyNdkDir/jsc") - } } } -prepareJSC.mustRunAfter prepareHermes task extractAARHeaders { doLast { @@ -401,7 +209,7 @@ task extractAARHeaders { } } -extractAARHeaders.mustRunAfter prepareJSC +extractAARHeaders.mustRunAfter createNativeDepsDirectories task extractJNIFiles { doLast { @@ -425,8 +233,5 @@ tasks.whenTaskAdded { task -> if (!task.name.contains('Clean') && (task.name.contains('externalNative') || task.name.contains('CMake'))) { task.dependsOn(extractAARHeaders) task.dependsOn(extractJNIFiles) - task.dependsOn(prepareJSC) - task.dependsOn(prepareHermes) - task.dependsOn(prepareThirdPartyNdkHeaders) } } \ No newline at end of file From e1866bde8937a92279447f381fb2425ab9d803f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Fraz=C3=A3o?= Date: Wed, 16 Mar 2022 19:27:54 -0300 Subject: [PATCH 45/47] Removal of commented lines --- android/CMakeLists.txt | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt index 870c2a3..b0956e0 100644 --- a/android/CMakeLists.txt +++ b/android/CMakeLists.txt @@ -64,11 +64,6 @@ target_include_directories( PRIVATE # --- fbjni --- "${LIBFBJNI_INCLUDE_DIR}" - # --- Third Party (required by RN) --- -# "${BUILD_DIR}/third-party-ndk/boost" -# "${BUILD_DIR}/third-party-ndk/double-conversion" -# "${BUILD_DIR}/third-party-ndk/folly" -# "${BUILD_DIR}/third-party-ndk/glog" # --- React Native --- "${NODE_MODULES_DIR}/react-native/React" "${NODE_MODULES_DIR}/react-native/React/Base" @@ -84,38 +79,12 @@ target_include_directories( file (GLOB LIBRN_DIR "${BUILD_DIR}/react-native-0*/jni/${ANDROID_ABI}") -#if(${FOR_HERMES}) -# file (GLOB LIBHERMES_DIR "${BUILD_DIR}/third-party-ndk/hermes/jni/${ANDROID_ABI}") -# # Use Hermes -# find_library( -# JS_ENGINE_LIB -# hermes -# PATHS ${LIBHERMES_DIR} -# NO_CMAKE_FIND_ROOT_PATH -# ) -#else() -# file (GLOB LIBJSC_DIR "${BUILD_DIR}/android-jsc*.aar/jni/${ANDROID_ABI}") -# # Use JSC -# find_library( -# JS_ENGINE_LIB -# jscexecutor -# PATHS ${LIBRN_DIR} -# NO_CMAKE_FIND_ROOT_PATH -# ) -#endif() - find_library( FBJNI_LIB fbjni PATHS ${LIBRN_DIR} NO_CMAKE_FIND_ROOT_PATH ) -#find_library( -# FOLLY_JSON_LIB -# folly_json -# PATHS ${LIBRN_DIR} -# NO_CMAKE_FIND_ROOT_PATH -#) find_library( REACT_NATIVE_JNI_LIB @@ -146,9 +115,7 @@ target_link_libraries( ${PACKAGE_NAME} ${LOG_LIB} ${JSI_LIB} -# ${JS_ENGINE_LIB} # <-- Hermes or JSC ${REACT_NATIVE_JNI_LIB} ${FBJNI_LIB} -# ${FOLLY_JSON_LIB} android ) From 973d8a439d0fa4f4302ce4872a9b1aaf0ed62201 Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Thu, 17 Mar 2022 06:15:55 +0100 Subject: [PATCH 46/47] Update readme --- README.md | 52 ++++++++++++++++++++++++++++++++-------------------- header.png | Bin 0 -> 177515 bytes 2 files changed, 32 insertions(+), 20 deletions(-) create mode 100644 header.png diff --git a/README.md b/README.md index 5a55afc..42c6375 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@

React Native Quick SQLite

-

Fast SQLite for react-native.

+

Fast SQLite for React-Native.

-![Frame 2](https://user-images.githubusercontent.com/1634213/127499575-aed1d0e2-8a93-42ab-917e-badaab8916f6.png) +![screenshot](https://raw.githubusercontent.com/ospfranco/react-native-quick-sqlite/main/header.png)
@@ -21,7 +21,7 @@
 

-This library uses [JSI](https://formidable.com/blog/2019/jsi-jsc-part-2) to directly call C++ code from JS. It provides a low-level API to execute SQL queries, therefore I recommend you use it with TypeORM. +This library provides a low-level API to execute SQL queries, fast bindings via [JSI](https://formidable.com/blog/2019/jsi-jsc-part-2). Inspired/compatible with [react-native-sqlite-storage](https://github.com/andpor/react-native-sqlite-storage) and [react-native-sqlite2](https://github.com/craftzdog/react-native-sqlite-2). @@ -30,15 +30,9 @@ Inspired/compatible with [react-native-sqlite-storage](https://github.com/andpor - **Javascript cannot represent intergers larger than 53 bits**, be careful when loading data if it came from other systems. [Read more](https://github.com/ospfranco/react-native-quick-sqlite/issues/16#issuecomment-1018412991). - **It's not possible to use a browser to debug a JSI app**, use [Flipper](https://github.com/facebook/flipper) (for android Flipper also has SQLite Database explorer). - Your app will now include C++, you will need to install the NDK on your machine for android. -- This library supports SQLite BLOBs which are mapped to JS ArrayBuffers, check out the sample project on how to use it -- From version 2.0.0 onwards errors are no longer thrown on invalid SQL statements. The response contains a `status` number, `0` signals correct execution, `1` signals an error. -- From version 3.0.0 onwards no JS errors are thown, every operation returns an object with a `status` field. -- On older react-native versions you might face weird NDK/SDK/Cmake errors, the latest version is tested against RN 0.67.3 ## API -It is also possible to directly execute SQL against the db: - ```typescript interface QueryResult { status: 0 | 1; // 0 for correct execution @@ -54,33 +48,41 @@ interface BatchQueryResult { } interface ISQLite { - open: (dbName: string, location?: string) => any; - - close: (dbName: string) => any; - + open: (dbName: string, location?: string) => { status: 0 | 1 }; + close: (dbName: string) => { status: 0 | 1 }; executeSql: ( dbName: string, query: string, params: any[] | undefined ) => QueryResult; - asyncExecuteSql: ( dbName: string, query: string, - params: any[] | undefined - ) => Promise; - + params: any[] | undefined, + cb: (res: QueryResult) => void + ) => void; executeSqlBatch: ( dbName: string, commands: SQLBatchParams[] ) => BatchQueryResult; + asyncExecuteSqlBatch: ( + dbName: string, + commands: SQLBatchParams[], + cb: (res: BatchQueryResult) => void + ) => void; + loadSqlFile: (dbName: string, location: string) => FileLoadResult; + asyncLoadSqlFile: ( + dbName: string, + location: string, + cb: (res: FileLoadResult) => void + ) => void; } ``` # Usage ```typescript -// You need to import this once in your app, it installs the binding on android +// Import as early as possible, auto-installs bindings import 'react-native-quick-sqlite'; // `sqlite` is a globally registered object, so you can directly call it from anywhere in your javascript @@ -132,15 +134,25 @@ if (!result.status) { } ``` +Async versions are also available if you have too much SQL to execute + +```ts +sqlite.asyncExecuteSql('myDatabase', 'SELECT * FROM "User";', [], (result) => { + if (result.status === 0) { + console.log('users', result.rows); + } +}); +``` + ## Use TypeORM This package offers a low-level API to raw execute SQL queries. I strongly recommend to use [TypeORM](https://github.com/typeorm/typeorm) (with [patch-package](https://github.com/ds300/patch-package)). TypeORM already has a sqlite-storage driver. In the `example` project on the `patch` folder you can a find a [patch for TypeORM](https://github.com/ospfranco/react-native-quick-sqlite/blob/main/example/patches/typeorm%2B0.2.31.patch). -Follow the instructions to make TypeORM work with React Native (enable decorators, configure babel, etc), then apply the patch via patch-package and you should be good to go. +Follow the instructions to make TypeORM work with React Native (enable decorators, configure babel, etc), then apply the example patch via patch-package. ## Learn React Native JSI -If you want to learn how to make your own JSI module buy my [JSI/C++ Cheatsheet](http://ospfranco.gumroad.com/l/IeeIvl), I'm also available for [freelance work](mailto:ospfranco@protonmail.com?subject=Freelance)! +If you want to learn how to make your own JSI module buy my [JSI/C++ Cheatsheet](http://ospfranco.gumroad.com/l/jsi_guide), I'm also available for [freelance work](mailto:ospfranco@protonmail.com?subject=Freelance)! ## License diff --git a/header.png b/header.png new file mode 100644 index 0000000000000000000000000000000000000000..272a12ad36cf5fb8d2de096076b92f4cebdfc719 GIT binary patch literal 177515 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

{ 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

~z6j)65a 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'II5)Vj4Q(WAeMb>I&!?n@PHb0Mn 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

Z(dxOS=_BSNbY5OwfH`nxHzUi$Y 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 P(z?w_2dknJ9(Vr->kMA6 literal 0 HcmV?d00001 From 6ad415898aba32231e455b637623d2b1f3db185a Mon Sep 17 00:00:00 2001 From: Oscar Franco Date: Thu, 17 Mar 2022 06:16:45 +0100 Subject: [PATCH 47/47] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5cc52e7..8584d13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-quick-sqlite", - "version": "3.0.1", + "version": "3.0.2", "description": "Fast SQLite for react-native", "main": "lib/commonjs/index", "module": "lib/module/index",