From 8109baaac9889089fa80ce05a4f32d0f07b75809 Mon Sep 17 00:00:00 2001 From: YuhangQ Date: Sat, 13 Nov 2021 23:15:21 +0800 Subject: [PATCH] ee --- CMakeLists.txt | 30 ++ demo/list.txt | 8 + demo/test.js | 24 +- package.json | 5 +- src/btree/btree.h | 12 +- src/btree/node.h | 4 +- src/collection/collection.cpp | 14 +- src/collection/collection.h | 5 +- src/collection/index.cpp | 44 ++- src/collection/query.cpp | 291 ++++++++++---- src/file/page_manager.cpp | 3 + src/file/page_manager.h | 21 +- src/file/storage_page.cpp | 2 +- src/test/test.h | 2 +- yarn.lock | 693 ---------------------------------- 15 files changed, 329 insertions(+), 829 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 demo/list.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f540b8b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,30 @@ +include_directories(./src) + +project (invodb) +cmake_minimum_required(VERSION 3.15) + +set(CMAKE_CXX_STANDARD 17) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") + +include_directories(${CMAKE_JS_INC}) + +file(GLOB SOURCE_FILES "src/*.h" "src/*.cpp" "src/btree/*.h" "src/collection/*.h" "src/collection/*.cpp" "src/file/*.h" "src/file/*.cpp" "src/test/*.h" "src/utils/*.h") + +add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC}) +set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node") +target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB}) + +# Include N-API wrappers +execute_process(COMMAND node -p "require('node-addon-api').include" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE NODE_ADDON_API_DIR + ) +string(REPLACE "\n" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR}) +string(REPLACE "\"" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR}) +target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_ADDON_API_DIR}) + +# define NPI_VERSION +add_definitions(-DNAPI_VERSION=3) + diff --git a/demo/list.txt b/demo/list.txt new file mode 100644 index 0000000..bf3d308 --- /dev/null +++ b/demo/list.txt @@ -0,0 +1,8 @@ +{"id": 1} +{"id": 2} +{"id": 3} +{"id": 4} +{"id": 5} +{"id": 6} +{"id": 7} +{"id": 8} \ No newline at end of file diff --git a/demo/test.js b/demo/test.js index 19e6686..61fe103 100644 --- a/demo/test.js +++ b/demo/test.js @@ -1,3 +1,6 @@ + +const fs = require('fs') + const invodb = require('..') invodb.database('zzz.invodb') @@ -5,18 +8,19 @@ invodb.database('zzz.invodb') let col = invodb.colection('blog') if(!col.exist()) col.create(); -for(let i=0; i<1; i++) { - col.insert({ id: "1s", title: "第一篇文章", author: "YuhangQ"}) - col.insert({ id: "2s", title: "第二篇文章", author: "Ciel"}) - col.insert({ id: "3s", title: "第三篇文章", author: "YuhangQ"}) - col.insert({ id: "4s", title: "第四篇文章", author: "By"}) +for(let json of col.query({})) col.remove(json) + +let list = fs.readFileSync(__dirname + "/list.txt").toString().split("\n") +for(let json of list) { + col.insert(JSON.parse(json)) } -let result = col.query({id: {}}) - -// for(let json of result) { -// col.remove(json) -// } +let result = col.query({ + id: { + $ne: 2 + } +}) +console.log(">>>>>>>>>>>>>>>>>>>>") console.log(result) console.log(result.length) \ No newline at end of file diff --git a/package.json b/package.json index 1ec293e..e2b4114 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "invodb", - "version": "1.0.3", + "version": "1.0.15", "description": "a nosql json document database", "main": "index.js", "scripts": { @@ -19,7 +19,6 @@ }, "homepage": "https://github.com/YuhangQ/InvoDB#readme", "dependencies": { - "node-addon-api": "^4.2.0", - "node-gyp": "^8.4.0" + "node-addon-api": "^4.2.0" } } diff --git a/src/btree/btree.h b/src/btree/btree.h index 56c12da..02a31fd 100644 --- a/src/btree/btree.h +++ b/src/btree/btree.h @@ -325,8 +325,8 @@ void BTree::split(const KT &key, int address, int parentAdd, int cur cur->linkSet[cur->insert(key)] = address; - auto lLeaf = BTreeNode::getNode(PageManager::Instance().allocate()); - auto rLeaf = BTreeNode::getNode(PageManager::Instance().allocate()); + auto lLeaf = BTreeNode::getNode(PageManager::allocate()); + auto rLeaf = BTreeNode::getNode(PageManager::allocate()); int mid = (cur->m / 2); for(int i=0; ilinkSet[lLeaf->insert(cur->keySet[i])] = cur->linkSet[i]; @@ -351,7 +351,7 @@ void BTree::split(const KT &key, int address, int parentAdd, int cur if(cur->address == root) { -// auto newRoot = BTreeNode::getNode(PageManager::Instance().allocate()); +// auto newRoot = BTreeNode::getNode(PageManager::allocate()); // newRoot->insert(rLeaf->keySet[0]); // newRoot->linkSet[0] = lLeaf->address; // newRoot->linkSet[1] = rLeaf->address; @@ -432,8 +432,8 @@ void BTree::insertInternal(const KT &key, int curAdd, int lLeafAdd, return; } - auto newLChild = BTreeNode::getNode(PageManager::Instance().allocate()); - auto newRChild = BTreeNode::getNode(PageManager::Instance().allocate()); + auto newLChild = BTreeNode::getNode(PageManager::allocate()); + auto newRChild = BTreeNode::getNode(PageManager::allocate()); newLChild->leaf = false; newRChild->leaf = false; newLChild->right = newRChild->address; @@ -479,7 +479,7 @@ void BTree::insertInternal(const KT &key, int curAdd, int lLeafAdd, if(cur->address == root) { -// auto newRoot = BTreeNode::getNode(PageManager::Instance().allocate()); +// auto newRoot = BTreeNode::getNode(PageManager::allocate()); // newRoot->insert(cur->keySet[mid]); // newRoot->linkSet[0] = newLChild->address; // newRoot->linkSet[1] = newRChild->address; diff --git a/src/btree/node.h b/src/btree/node.h index 3129899..fa51be4 100644 --- a/src/btree/node.h +++ b/src/btree/node.h @@ -61,7 +61,7 @@ LRUCache>> BTreeNode BTreeNode::BTreeNode(const int& address): address(address) { clear(); - StoragePage page = PageManager::Instance().getPage(address); + StoragePage page = PageManager::getPage(address); int p = 0; size = page.getIntStartFrom(p); p += 4; parent = page.getIntStartFrom(p); p += 4; @@ -119,7 +119,7 @@ std::shared_ptr> BTreeNode::ge template BTreeNode *BTreeNode::release(const int &index) { //cache.remove(index); - PageManager::Instance().release(index); + PageManager::release(index); return nullptr; } diff --git a/src/collection/collection.cpp b/src/collection/collection.cpp index 3049e0a..ac92798 100644 --- a/src/collection/collection.cpp +++ b/src/collection/collection.cpp @@ -21,7 +21,7 @@ Collection& Collection::createCollection(const std::string &name) { if(map.count(name) != 0) { return *map[name]; } - colList.insert(name, PageManager::Instance().allocate()); + colList.insert(name, PageManager::allocate()); Collection *col = new Collection(name, colList.find(name)); map.insert(make_pair(name, col)); return *col; @@ -42,7 +42,7 @@ Collection::Collection(const std::string &name, const int &firstPage) { Logger::info("load Collection: ", name); index = new BTree(firstPage); if(!index->exists("__INVO_ID__")) { - index->insert("__INVO_ID__", PageManager::Instance().allocate()); + index->insert("__INVO_ID__", PageManager::allocate()); } uuid = new BTree(index->find("__INVO_ID__")); } @@ -56,10 +56,10 @@ void Collection::insert(nlohmann::json &json) { } std::string id = json["__INVO_ID__"].get(); - int add = PageManager::Instance().saveJSONToFile(json); + int add = PageManager::saveJSONToFile(json); uuid->insert(id, add); - //Logger::info("INSERT ", json.dump()); + Logger::info("INSERT ", json.dump()); // add index indexJSON("", json, add); @@ -75,11 +75,11 @@ void Collection::remove(const nlohmann::json &json) { int address = uuid->find(id); uuid->remove(id); - nlohmann::json jsonInDisk = PageManager::Instance().readJSONFromFile(address); + nlohmann::json jsonInDisk = PageManager::readJSONFromFile(address); clearIndex("", json, address); - PageManager::Instance().release(address); + PageManager::release(address); } @@ -92,7 +92,7 @@ void Collection::test() { List list(qq->find(q)); //list.print(); for(auto& add : list.all()) { - std::cout << ">> " << PageManager::Instance().readJSONFromFile(add).dump() << std::endl; + std::cout << ">> " << PageManager::readJSONFromFile(add).dump() << std::endl; } } } diff --git a/src/collection/collection.h b/src/collection/collection.h index c45e12e..31a2a37 100644 --- a/src/collection/collection.h +++ b/src/collection/collection.h @@ -35,6 +35,8 @@ private: void insertIndex(const std::string indexName, const std::string indexValue, const int& address); void insertIndex(const std::string indexName, double indexValue, const int& address); void insertIndex(const std::string indexName, bool indexValue, const int& address); + void insertNullIndex(const std::string indexName, const int& address); + void removeNullIndex(const std::string indexName, const int& address); void clearIndex(const std::string prefix, const nlohmann::json &json, const int& address); void removeIndex(const std::string indexName, const std::string indexValue, const int& address); void removeIndex(const std::string indexName, double indexValue, const int& address); @@ -48,7 +50,8 @@ private: std::set queryString(const std::string &prefix, const std::string &minValue, const std::string &maxValue, const int &mod = 0); std::set queryNumber(const std::string &prefix, const double &minValue, const double &maxValue, const int &mod = 0); std::set queryBool(const std::string &prefix, const bool &value); - std::set queryRange(const std::string &prefix, const nlohmann::json &json); + std::set queryNull(const std::string &prefix); + std::set queryRange(const std::string &prefix, nlohmann::json json); std::set queryAllByField(const std::string &fieldName); static std::map map; diff --git a/src/collection/index.cpp b/src/collection/index.cpp index 39d9342..b8b5e71 100644 --- a/src/collection/index.cpp +++ b/src/collection/index.cpp @@ -14,6 +14,7 @@ void Collection::indexJSON(const std::string prefix, const nlohmann::json &json, if(value.is_boolean()) insertIndex(prefix + key, value.get(), address); if(value.is_number()) insertIndex(prefix + key, value.get(), address); if(value.is_string()) insertIndex(prefix + key, value.get(), address); + if(value.is_null()) insertNullIndex(prefix + key, address); if(value.is_object()) indexJSON(prefix + key + ".", value.get(),address); if(value.is_array()) { for(auto& element : value.get()) { @@ -33,13 +34,13 @@ void Collection::insertIndex(const std::string indexName, const std::string inde //printf("INDEX TO %s: %s = \"%s\" add:(%d)\n", treeName.c_str(), indexName.c_str(), indexValue.c_str(), address); if(!index->exists(treeName)) { - index->insert(treeName, PageManager::Instance().allocate()); + index->insert(treeName, PageManager::allocate()); } BTree indexTree(index->find(treeName)); if(!indexTree.exists(indexValue)) { - indexTree.insert(indexValue, PageManager::Instance().allocate()); + indexTree.insert(indexValue, PageManager::allocate()); } List list(indexTree.find(indexValue)); @@ -53,13 +54,13 @@ void Collection::insertIndex(const std::string indexName, double indexValue, con std::string treeName = indexName + "$number"; if(!index->exists(treeName)) { - index->insert(treeName, PageManager::Instance().allocate()); + index->insert(treeName, PageManager::allocate()); } BTree indexTree(index->find(treeName)); if(!indexTree.exists(indexValue)) { - indexTree.insert(indexValue, PageManager::Instance().allocate()); + indexTree.insert(indexValue, PageManager::allocate()); } List list(indexTree.find(indexValue)); @@ -71,13 +72,13 @@ void Collection::insertIndex(const std::string indexName, bool indexValue, const std::string treeName = indexName + "$boolean"; if(!index->exists(treeName)) { - index->insert(treeName, PageManager::Instance().allocate()); + index->insert(treeName, PageManager::allocate()); } BTree indexTree(index->find(treeName)); if(!indexTree.exists(indexValue)) { - indexTree.insert(indexValue, PageManager::Instance().allocate()); + indexTree.insert(indexValue, PageManager::allocate()); } List list(indexTree.find(indexValue)); @@ -91,6 +92,7 @@ void Collection::clearIndex(const std::string prefix, const nlohmann::json &json if(value.is_number()) removeIndex(prefix + key, value.get(), address); if(value.is_boolean()) removeIndex(prefix + key, value.get(), address); if(value.is_object()) clearIndex(prefix + key + ".", value.get(),address); + if(value.is_null()) removeNullIndex(prefix + key, address); if(value.is_array()) { for(auto& element : value.get()) { if(element.is_string()) removeIndex(prefix + key, element.get(), address); @@ -106,13 +108,13 @@ void Collection::removeIndex(const std::string indexName, const std::string inde std::string treeName = indexName + "$string"; if(!index->exists(treeName)) { - index->insert(treeName, PageManager::Instance().allocate()); + index->insert(treeName, PageManager::allocate()); } BTree indexTree(index->find(treeName)); if(!indexTree.exists(indexValue)) { - indexTree.insert(indexValue, PageManager::Instance().allocate()); + indexTree.insert(indexValue, PageManager::allocate()); } List list(indexTree.find(indexValue)); @@ -124,13 +126,13 @@ void Collection::removeIndex(const std::string indexName, double indexValue, con std::string treeName = indexName + "$number"; if(!index->exists(treeName)) { - index->insert(treeName, PageManager::Instance().allocate()); + index->insert(treeName, PageManager::allocate()); } BTree indexTree(index->find(treeName)); if(!indexTree.exists(indexValue)) { - indexTree.insert(indexValue, PageManager::Instance().allocate()); + indexTree.insert(indexValue, PageManager::allocate()); } List list(indexTree.find(indexValue)); @@ -142,15 +144,33 @@ void Collection::removeIndex(const std::string indexName, bool indexValue, const std::string treeName = indexName + "$boolean"; if(!index->exists(treeName)) { - index->insert(treeName, PageManager::Instance().allocate()); + index->insert(treeName, PageManager::allocate()); } BTree indexTree(index->find(treeName)); if(!indexTree.exists(indexValue)) { - indexTree.insert(indexValue, PageManager::Instance().allocate()); + indexTree.insert(indexValue, PageManager::allocate()); } List list(indexTree.find(indexValue)); list.remove(address); +} + +void Collection::insertNullIndex(const std::string indexName, const int& address) { + std::string treeName = indexName + "$null"; + if(!index->exists(treeName)) { + index->insert(treeName, PageManager::allocate()); + } + List list(index->find(treeName)); + list.insert(address); +} + +void Collection::removeNullIndex(const std::string indexName, const int& address) { + std::string treeName = indexName + "$null"; + if(!index->exists(treeName)) { + index->insert(treeName, PageManager::allocate()); + } + List list(index->find(treeName)); + list.remove(address); } \ No newline at end of file diff --git a/src/collection/query.cpp b/src/collection/query.cpp index 64f4724..5e574c7 100644 --- a/src/collection/query.cpp +++ b/src/collection/query.cpp @@ -24,92 +24,188 @@ std::vector Collection::query(const nlohmann::json &json) { * mod = 7: value >= minValue */ -std::set Collection::queryRange(const std::string &prefix, const nlohmann::json &json) { +std::set Collection::queryRange(const std::string &prefix, nlohmann::json json) { + + std::set set; + bool init = false; + + // grammer check + bool isNumber; + bool nInit = false; + for(auto& [key, value] : json.items()) { + if(key == "$or") { + auto arr = value.get(); + std::set tmp; + for(auto& q : arr) { + tmp = setUnion(tmp, queryRange(prefix, q.get())); + } + if(init) set = setIntersection(set, tmp); + else set = tmp, init = true; + } else if(key == "$ne") { + // do nothing + } else if(!nInit) { + if(value.is_string()) { + isNumber = false; + } else if(value.is_number()) { + isNumber = true; + } else { + throw "unvalid query json."; + } + nInit = true; + } else { + //printf("hello: %s %d %d\n", key.c_str(),isNumber && !value.is_number(), !isNumber && !value.is_string()); + if((isNumber && !value.is_number()) || (!isNumber && !value.is_string())) { + throw "unvalid query json."; + } + } + } + + if(isNumber) { + if(json.contains("$gt") && json.contains("$gte")) { + auto gt = json["$gt"].get(); + auto gte = json["$gte"].get(); + if(gte > gt) { + json.erase("$gt"); + } else { + json.erase("$gte"); + } + } + + if(json.contains("$lt") && json.contains("$lte")) { + auto lt = json["$lt"].get(); + auto lte = json["$lte"].get(); + if(lt <= lte) { + json.erase("$lte"); + } else { + json.erase("$lt"); + } + } + + std::set tmp; + + if(json.contains("$gt")) { + if(json.contains("$lt")) { + tmp = queryNumber(prefix, json["$gt"].get(), json["$lt"].get(), 3); + } else if(json.contains("$lte")) { + tmp = queryNumber(prefix, json["$gt"].get(), json["$lte"].get(), 1); + } else { + + tmp = queryNumber(prefix, json["$gt"].get(), 0, 6); + + } + } else if(json.contains("$gte")) { + if(json.contains("$lt")) { + tmp = queryNumber(prefix, json["$gte"].get(), json["$lt"].get(), 2); + } else if(json.contains("$lte")) { + tmp = queryNumber(prefix, json["$gte"].get(), json["$lte"].get(), 0); + } else { + tmp = queryNumber(prefix, json["$gte"].get(), 0, 7); + } + } else if(json.contains("$lt")) { + tmp = queryNumber(prefix, 0, json["$lt"].get(), 4); + } else if(json.contains("$lte")) { + tmp = queryNumber(prefix, 0, json["$lte"].get(), 5); + } + + if(init) set = setIntersection(set, tmp); + else set = tmp, init = true; + + } else { + if(json.contains("$gt") && json.contains("$gte")) { + auto gt = json["$gt"].get(); + auto gte = json["$gte"].get(); + if(gte > gt) { + json.erase("$gt"); + } else { + json.erase("$gte"); + } + } + + if(json.contains("$lt") && json.contains("$lte")) { + auto lt = json["$lt"].get(); + auto lte = json["$lte"].get(); + if(lt <= lte) { + json.erase("$lte"); + } else { + json.erase("$lt"); + } + } + + std::set tmp; + + if(json.contains("$gt")) { + if(json.contains("$lt")) { + tmp = queryString(prefix, json["$gt"].get(), json["$lt"].get(), 3); + } else if(json.contains("$lte")) { + tmp = queryString(prefix, json["$gt"].get(), json["$lte"].get(), 1); + } else { + tmp = queryString(prefix, json["$gt"].get(), "", 6); + } + } else if(json.contains("$gte")) { + if(json.contains("$lt")) { + tmp = queryString(prefix, json["$gte"].get(), json["$lt"].get(), 2); + } else if(json.contains("$lte")) { + tmp = queryString(prefix, json["$gte"].get(), json["$lte"].get(), 0); + } else { + tmp = queryString(prefix, json["$gte"].get(), "", 7); + } + } else if(json.contains("$lt")) { + tmp = queryString(prefix, "", json["$lt"].get(), 4); + } else if(json.contains("$lte")) { + tmp = queryString(prefix, "", json["$lte"].get(), 5); + } + + if(init) set = setIntersection(set, tmp); + else set = tmp, init = true; + } + + if(!init) set = queryAllByField(prefix); printf(">> queryRange prefix: %s query: %s\n", prefix.c_str(), json.dump().c_str()); - std::set set; + printf("result: \n"); + for(auto it=set.begin(); it!=set.end(); it++) { + printf(" - %s\n", it->dump().c_str()); + } - for(auto& [key, value] : json.items()) { - if(value.is_number()) { - if(json.contains("$ne")) { - if(!index->exists(prefix+"$number")) { - return set; - } - BTree tree(index->find(prefix+"$number")); - for(auto& key: tree.keySet()) { - if(key != json["$ne"].get()) continue; - List list(tree.find(key)); - for(auto& add : list.all()) { - set.insert(PageManager::Instance().readJSONFromFile(add)); - } + if(json.contains("$ne")) { + if(json["$ne"].is_null()) { + // do nothing + } else if(json["$ne"].is_string()) { + List tree(index->find(prefix + "$null")); + for(auto& add : tree.all()) { + set.insert(PageManager::readJSONFromFile(add)); + } + auto value = json["$ne"].get(); + BTree indexTree(index->find(prefix + "$string")); + if(indexTree.find(value) != -1) { + List indexList(indexTree.find(value)); + for(auto& add : indexList.all()) { + set.erase(PageManager::readJSONFromFile(add)); } } - else if(json.contains("$gt")) { - if(json.contains("$lt")) { - set = queryNumber(prefix, json["$gt"].get(), json["$lt"].get(), 3); - } else if(json.contains("$lte")) { - set = queryNumber(prefix, json["$gt"].get(), json["$lte"].get(), 1); - } else { - - set = queryNumber(prefix, json["$gt"].get(), 0, 6); - - } - } else if(json.contains("$gte")) { - if(json.contains("$lt")) { - set = queryNumber(prefix, json["$gte"].get(), json["$lt"].get(), 2); - } else if(json.contains("$lte")) { - set = queryNumber(prefix, json["$gte"].get(), json["$lte"].get(), 0); - } else { - set = queryNumber(prefix, json["$gte"].get(), 0, 7); - } - } else if(json.contains("$lt")) { - set = queryNumber(prefix, 0, json["$lt"].get(), 4); - } else if(json.contains("$lte")) { - set = queryNumber(prefix, 0, json["$lte"].get(), 5); + + } else if(json["$ne"].is_number()) { + List tree(index->find(prefix + "$null")); + for(auto& add : tree.all()) { + set.insert(PageManager::readJSONFromFile(add)); } - return set; - } - else if(value.is_string()) { - if(json.contains("$ne")) { - if(!index->exists(prefix+"$string")) { - return set; - } - BTree tree(index->find(prefix+"$string")); - for(auto& key: tree.keySet()) { - if(key != json["$ne"].get()) continue; - List list(tree.find(key)); - for(auto& add : list.all()) { - set.insert(PageManager::Instance().readJSONFromFile(add)); - } + auto value = json["$ne"].get(); + BTree indexTree(index->find(prefix + "$number")); + if(indexTree.find(value) != -1) { + List indexList(indexTree.find(value)); + for(auto& add : indexList.all()) { + set.erase(PageManager::readJSONFromFile(add)); } } - else if(json.contains("$gt")) { - if(json.contains("$lt")) { - set = queryString(prefix, json["$gt"].get(), json["$lt"].get(), 3); - } else if(json.contains("$lte")) { - set = queryString(prefix, json["$gt"].get(), json["$lte"].get(), 1); - } else { - set = queryString(prefix, json["$gt"].get(), "", 6); - } - } else if(json.contains("$gte")) { - if(json.contains("$lt")) { - set = queryString(prefix, json["$gte"].get(), json["$lt"].get(), 2); - } else if(json.contains("$lte")) { - set = queryString(prefix, json["$gte"].get(), json["$lte"].get(), 0); - } else { - set = queryString(prefix, json["$gte"].get(), "", 7); - } - } else if(json.contains("$lt")) { - set = queryString(prefix, "", json["$lt"].get(), 4); - } else if(json.contains("$lte")) { - set = queryString(prefix, "", json["$lte"].get(), 5); - } - return set; + } else { + throw "unvalid query json."; } } + + return set; } std::set Collection::innerQuery(const std::string &prefix, const nlohmann::json &json) { @@ -162,6 +258,14 @@ std::set Collection::innerQuery(const std::string &prefix, const } else tmp = setIntersection(queryNumber(tPrefix, element.get(), element.get()), tmp); + } else if(element.is_null()) { + if (flag) + { + tmp = queryNull(tPrefix); + flag = false; + } + else + tmp = queryNull(tPrefix); } } } else if(json[key].is_boolean()) { @@ -170,6 +274,8 @@ std::set Collection::innerQuery(const std::string &prefix, const tmp = queryString(tPrefix, json[key].get(), json[key].get()); } else if(json[key].is_number()) { tmp = queryNumber(tPrefix, json[key].get(), json[key].get()); + } else if(json[key].is_null()) { + tmp = queryNull(tPrefix); } if (flag) continue; if(init) res = tmp, init = false; @@ -184,9 +290,6 @@ std::set Collection::innerQuery(const std::string &prefix, const } if (init) return queryAllByField(prefix); - - - return res; } @@ -199,7 +302,7 @@ std::set Collection::queryAllByField(const std::string &fieldNa // return all if(fieldName == "") { for(auto& [key, value] : uuid->all()) { - res.insert(PageManager::Instance().readJSONFromFile(value)); + res.insert(PageManager::readJSONFromFile(value)); } } else { auto tfieldName = fieldName.substr(0, fieldName.size()-1); @@ -211,7 +314,7 @@ std::set Collection::queryAllByField(const std::string &fieldNa for(auto &[key, value] : tree.all()) { List list(value); for(auto& add : list.all()) { - res.insert(PageManager::Instance().readJSONFromFile(add)); + res.insert(PageManager::readJSONFromFile(add)); } } } @@ -221,7 +324,7 @@ std::set Collection::queryAllByField(const std::string &fieldNa for(auto &[key, value] : tree.all()) { List list(value); for(auto& add : list.all()) { - res.insert(PageManager::Instance().readJSONFromFile(add)); + res.insert(PageManager::readJSONFromFile(add)); } } } @@ -231,10 +334,18 @@ std::set Collection::queryAllByField(const std::string &fieldNa for(auto &[key, value] : tree.all()) { List list(value); for(auto& add : list.all()) { - res.insert(PageManager::Instance().readJSONFromFile(add)); + res.insert(PageManager::readJSONFromFile(add)); } } } + + if((treeID = index->find(tfieldName + "$null")) != -1) { + List list(treeID); + for(auto& add : list.all()) { + res.insert(PageManager::readJSONFromFile(add)); + } + } + } return res; } @@ -323,7 +434,7 @@ Collection::queryString(const std::string &prefix, const std::string &minValue, } List list(node->linkSet[i]); for(auto& add : list.all()) { - res.insert(PageManager::Instance().readJSONFromFile(add)); + res.insert(PageManager::readJSONFromFile(add)); } } if(!flag) break; @@ -408,7 +519,7 @@ Collection::queryNumber(const std::string &prefix, const double &minValue, const List list(node->linkSet[i]); for(auto& add : list.all()) { - res.insert(PageManager::Instance().readJSONFromFile(add)); + res.insert(PageManager::readJSONFromFile(add)); } } if(!flag) break; @@ -438,7 +549,7 @@ Collection::queryBool(const std::string &prefix, const bool &value) { } List list(node->linkSet[i]); for(auto& add : list.all()) { - res.insert(PageManager::Instance().readJSONFromFile(add)); + res.insert(PageManager::readJSONFromFile(add)); } } if(!flag) break; @@ -447,3 +558,17 @@ Collection::queryBool(const std::string &prefix, const bool &value) { } return res; } + + +std::set Collection::queryNull(const std::string &prefix) { + std::set res; + auto treeName = prefix + "$null"; + if(!index->exists(treeName)) { + return res; + } + List tree(index->find(treeName)); + for(auto& add : tree.all()) { + res.insert(PageManager::readJSONFromFile(add)); + } + return res; +} \ No newline at end of file diff --git a/src/file/page_manager.cpp b/src/file/page_manager.cpp index 50d1105..75e8242 100644 --- a/src/file/page_manager.cpp +++ b/src/file/page_manager.cpp @@ -4,6 +4,9 @@ #include "page_manager.h" +std::map PageManager::map; +std::fstream PageManager::stream; + int PageManager::loadDatabase(const char *filename) { Instance().stream.open(filename); Instance().stream.seekp(0, std::ios::end); diff --git a/src/file/page_manager.h b/src/file/page_manager.h index 7e00f7c..d3291cc 100644 --- a/src/file/page_manager.h +++ b/src/file/page_manager.h @@ -16,21 +16,22 @@ class PageManager { public: static PageManager& Instance() { - static PageManager instance; - return instance; + static PageManager* instance; + if(instance == nullptr) instance = new PageManager(); + return *instance; } static int loadDatabase(const char *filename); - StoragePage getPage(const int &index); - void setPage(const int &index, const StoragePage &page); + static StoragePage getPage(const int &index); + static void setPage(const int &index, const StoragePage &page); template static std::shared_ptr getNode(const int &index); - int allocate(); - void release(const int &index, const bool &next = true); - int saveJSONToFile(const nlohmann::json& json); - nlohmann::json readJSONFromFile(const int &index); - std::map map; - std::fstream stream; + static int allocate(); + static void release(const int &index, const bool &next = true); + static int saveJSONToFile(const nlohmann::json& json); + static nlohmann::json readJSONFromFile(const int &index); + static std::map map; + static std::fstream stream; // 私有化实现单例 PageManager() {} ~PageManager() {} diff --git a/src/file/storage_page.cpp b/src/file/storage_page.cpp index 4f4d783..c230e7e 100644 --- a/src/file/storage_page.cpp +++ b/src/file/storage_page.cpp @@ -54,7 +54,7 @@ void StoragePage::setStringStartFrom(const int &index, const std::string &str) { } void StoragePage::save() { - PageManager::Instance().setPage(address, *this); + PageManager::setPage(address, *this); } int StoragePage::getAddress() { diff --git a/src/test/test.h b/src/test/test.h index 493d1cb..987b47f 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -54,7 +54,7 @@ void terminal() { void testAndBenchmark(int n) { - auto btree = new BTree(PageManager::Instance().allocate()); + auto btree = new BTree(PageManager::allocate()); printf("nodeSize: %d\n", btree->getNodeSize()); diff --git a/yarn.lock b/yarn.lock index 76daeb6..65ee546 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,700 +2,7 @@ # yarn lockfile v1 -"@gar/promisify@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" - integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== - -"@npmcli/fs@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f" - integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ== - dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@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== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -agent-base@6, agent-base@^6.0.2: - 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: - debug "4" - -agentkeepalive@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" - integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== - dependencies: - debug "^4.1.0" - depd "^1.1.2" - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.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@^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== - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -cacache@^15.2.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -debug@4, debug@^4.1.0, debug@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encoding@^0.1.12: - 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" - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -glob@^7.1.3, 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" - -graceful-fs@^4.2.6: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -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" - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= - dependencies: - ms "^2.0.0" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 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= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, 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== - -ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^3.0.0: - version "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-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -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: - yallist "^4.0.0" - -make-fetch-happen@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" - integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== - dependencies: - agentkeepalive "^4.1.3" - cacache "^15.2.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.2" - promise-retry "^2.0.1" - socks-proxy-agent "^6.0.0" - ssri "^8.0.0" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== - dependencies: - minipass "^3.1.0" - minipass-sized "^1.0.3" - minizlib "^2.0.0" - optionalDependencies: - encoding "^0.1.12" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" - integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== - dependencies: - yallist "^4.0.0" - -minizlib@^2.0.0, minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -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== - node-addon-api@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== - -node-gyp@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.0.tgz#6e1112b10617f0f8559c64b3f737e8109e5a8338" - integrity sha512-Bi/oCm5bH6F+FmzfUxJpPaxMEyIhszULGR3TprmTeku8/dMFcdTcypk120NeZqEt54r1BrgEKtm2jJiuIKE28Q== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^9.1.0" - nopt "^5.0.0" - npmlog "^4.1.2" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -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-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -readable-stream@^2.0.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== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -rimraf@^3.0.2: - 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" - -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" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -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" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -signal-exit@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" - integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== - -smart-buffer@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3" - integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg== - dependencies: - agent-base "^6.0.2" - debug "^4.3.1" - socks "^2.6.1" - -socks@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" - integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== - dependencies: - ip "^1.1.5" - smart-buffer "^4.1.0" - -ssri@^8.0.0, ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2 || 3 || 4": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.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" - -tar@^6.0.2, tar@^6.1.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -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: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -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==