This commit is contained in:
YuhangQ 2021-11-13 23:15:21 +08:00
parent 9798febb85
commit 8109baaac9
15 changed files with 329 additions and 829 deletions

30
CMakeLists.txt Normal file
View File

@ -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)

8
demo/list.txt Normal file
View File

@ -0,0 +1,8 @@
{"id": 1}
{"id": 2}
{"id": 3}
{"id": 4}
{"id": 5}
{"id": 6}
{"id": 7}
{"id": 8}

View File

@ -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)

View File

@ -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"
}
}

View File

@ -325,8 +325,8 @@ void BTree<KT, K_SIZE>::split(const KT &key, int address, int parentAdd, int cur
cur->linkSet[cur->insert(key)] = address;
auto lLeaf = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::Instance().allocate());
auto rLeaf = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::Instance().allocate());
auto lLeaf = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::allocate());
auto rLeaf = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::allocate());
int mid = (cur->m / 2);
for(int i=0; i<mid; i++) lLeaf->linkSet[lLeaf->insert(cur->keySet[i])] = cur->linkSet[i];
@ -351,7 +351,7 @@ void BTree<KT, K_SIZE>::split(const KT &key, int address, int parentAdd, int cur
if(cur->address == root) {
// auto newRoot = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::Instance().allocate());
// auto newRoot = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::allocate());
// newRoot->insert(rLeaf->keySet[0]);
// newRoot->linkSet[0] = lLeaf->address;
// newRoot->linkSet[1] = rLeaf->address;
@ -432,8 +432,8 @@ void BTree<KT, K_SIZE>::insertInternal(const KT &key, int curAdd, int lLeafAdd,
return;
}
auto newLChild = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::Instance().allocate());
auto newRChild = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::Instance().allocate());
auto newLChild = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::allocate());
auto newRChild = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::allocate());
newLChild->leaf = false;
newRChild->leaf = false;
newLChild->right = newRChild->address;
@ -479,7 +479,7 @@ void BTree<KT, K_SIZE>::insertInternal(const KT &key, int curAdd, int lLeafAdd,
if(cur->address == root) {
// auto newRoot = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::Instance().allocate());
// auto newRoot = BTreeNode<M_SIZE, KT, K_SIZE>::getNode(PageManager::allocate());
// newRoot->insert(cur->keySet[mid]);
// newRoot->linkSet[0] = newLChild->address;
// newRoot->linkSet[1] = newRChild->address;

View File

@ -61,7 +61,7 @@ LRUCache<int, std::shared_ptr<BTreeNode<M_SIZE, KT, K_SIZE>>> BTreeNode<M_SIZE,
template<int M_SIZE, typename KT, int K_SIZE>
BTreeNode<M_SIZE, KT, K_SIZE>::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<M_SIZE, KT, K_SIZE>> BTreeNode<M_SIZE, KT, K_SIZE>::ge
template<int M_SIZE, typename KT, int K_SIZE>
BTreeNode<M_SIZE, KT, K_SIZE> *BTreeNode<M_SIZE, KT, K_SIZE>::release(const int &index) {
//cache.remove(index);
PageManager::Instance().release(index);
PageManager::release(index);
return nullptr;
}

View File

@ -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<std::string, std::string>("load Collection: ", name);
index = new BTree<std::string, 128>(firstPage);
if(!index->exists("__INVO_ID__")) {
index->insert("__INVO_ID__", PageManager::Instance().allocate());
index->insert("__INVO_ID__", PageManager::allocate());
}
uuid = new BTree<std::string, 32>(index->find("__INVO_ID__"));
}
@ -56,10 +56,10 @@ void Collection::insert(nlohmann::json &json) {
}
std::string id = json["__INVO_ID__"].get<std::string>();
int add = PageManager::Instance().saveJSONToFile(json);
int add = PageManager::saveJSONToFile(json);
uuid->insert(id, add);
//Logger::info<std::string, std::string>("INSERT ", json.dump());
Logger::info<std::string, std::string>("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<int, 4> 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;
}
}
}

View File

@ -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<nlohmann::json> queryString(const std::string &prefix, const std::string &minValue, const std::string &maxValue, const int &mod = 0);
std::set<nlohmann::json> queryNumber(const std::string &prefix, const double &minValue, const double &maxValue, const int &mod = 0);
std::set<nlohmann::json> queryBool(const std::string &prefix, const bool &value);
std::set<nlohmann::json> queryRange(const std::string &prefix, const nlohmann::json &json);
std::set<nlohmann::json> queryNull(const std::string &prefix);
std::set<nlohmann::json> queryRange(const std::string &prefix, nlohmann::json json);
std::set<nlohmann::json> queryAllByField(const std::string &fieldName);
static std::map<std::string, Collection*> map;

View File

@ -14,6 +14,7 @@ void Collection::indexJSON(const std::string prefix, const nlohmann::json &json,
if(value.is_boolean()) insertIndex(prefix + key, value.get<bool>(), address);
if(value.is_number()) insertIndex(prefix + key, value.get<double>(), address);
if(value.is_string()) insertIndex(prefix + key, value.get<std::string>(), address);
if(value.is_null()) insertNullIndex(prefix + key, address);
if(value.is_object()) indexJSON(prefix + key + ".", value.get<nlohmann::json>(),address);
if(value.is_array()) {
for(auto& element : value.get<nlohmann::json>()) {
@ -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<std::string, 64> indexTree(index->find(treeName));
if(!indexTree.exists(indexValue)) {
indexTree.insert(indexValue, PageManager::Instance().allocate());
indexTree.insert(indexValue, PageManager::allocate());
}
List<int, 4> 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<double, 8> indexTree(index->find(treeName));
if(!indexTree.exists(indexValue)) {
indexTree.insert(indexValue, PageManager::Instance().allocate());
indexTree.insert(indexValue, PageManager::allocate());
}
List<int, 4> 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<bool, 1> indexTree(index->find(treeName));
if(!indexTree.exists(indexValue)) {
indexTree.insert(indexValue, PageManager::Instance().allocate());
indexTree.insert(indexValue, PageManager::allocate());
}
List<int, 4> 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<double>(), address);
if(value.is_boolean()) removeIndex(prefix + key, value.get<bool>(), address);
if(value.is_object()) clearIndex(prefix + key + ".", value.get<nlohmann::json>(),address);
if(value.is_null()) removeNullIndex(prefix + key, address);
if(value.is_array()) {
for(auto& element : value.get<nlohmann::json>()) {
if(element.is_string()) removeIndex(prefix + key, element.get<std::string>(), 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<std::string, 128> indexTree(index->find(treeName));
if(!indexTree.exists(indexValue)) {
indexTree.insert(indexValue, PageManager::Instance().allocate());
indexTree.insert(indexValue, PageManager::allocate());
}
List<int, 4> 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<double, 8> indexTree(index->find(treeName));
if(!indexTree.exists(indexValue)) {
indexTree.insert(indexValue, PageManager::Instance().allocate());
indexTree.insert(indexValue, PageManager::allocate());
}
List<int, 4> 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<bool, 1> indexTree(index->find(treeName));
if(!indexTree.exists(indexValue)) {
indexTree.insert(indexValue, PageManager::Instance().allocate());
indexTree.insert(indexValue, PageManager::allocate());
}
List<int, 4> 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<int, 4> 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<int, 4> list(index->find(treeName));
list.remove(address);
}

View File

@ -24,92 +24,188 @@ std::vector<nlohmann::json> Collection::query(const nlohmann::json &json) {
* mod = 7: value >= minValue
*/
std::set<nlohmann::json> Collection::queryRange(const std::string &prefix, const nlohmann::json &json) {
std::set<nlohmann::json> Collection::queryRange(const std::string &prefix, nlohmann::json json) {
std::set<nlohmann::json> set;
bool init = false;
// grammer check
bool isNumber;
bool nInit = false;
for(auto& [key, value] : json.items()) {
if(key == "$or") {
auto arr = value.get<nlohmann::json>();
std::set<nlohmann::json> tmp;
for(auto& q : arr) {
tmp = setUnion(tmp, queryRange(prefix, q.get<nlohmann::json>()));
}
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<double>();
auto gte = json["$gte"].get<double>();
if(gte > gt) {
json.erase("$gt");
} else {
json.erase("$gte");
}
}
if(json.contains("$lt") && json.contains("$lte")) {
auto lt = json["$lt"].get<double>();
auto lte = json["$lte"].get<double>();
if(lt <= lte) {
json.erase("$lte");
} else {
json.erase("$lt");
}
}
std::set<nlohmann::json> tmp;
if(json.contains("$gt")) {
if(json.contains("$lt")) {
tmp = queryNumber(prefix, json["$gt"].get<double>(), json["$lt"].get<double>(), 3);
} else if(json.contains("$lte")) {
tmp = queryNumber(prefix, json["$gt"].get<double>(), json["$lte"].get<double>(), 1);
} else {
tmp = queryNumber(prefix, json["$gt"].get<double>(), 0, 6);
}
} else if(json.contains("$gte")) {
if(json.contains("$lt")) {
tmp = queryNumber(prefix, json["$gte"].get<double>(), json["$lt"].get<double>(), 2);
} else if(json.contains("$lte")) {
tmp = queryNumber(prefix, json["$gte"].get<double>(), json["$lte"].get<double>(), 0);
} else {
tmp = queryNumber(prefix, json["$gte"].get<double>(), 0, 7);
}
} else if(json.contains("$lt")) {
tmp = queryNumber(prefix, 0, json["$lt"].get<double>(), 4);
} else if(json.contains("$lte")) {
tmp = queryNumber(prefix, 0, json["$lte"].get<double>(), 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<std::string>();
auto gte = json["$gte"].get<std::string>();
if(gte > gt) {
json.erase("$gt");
} else {
json.erase("$gte");
}
}
if(json.contains("$lt") && json.contains("$lte")) {
auto lt = json["$lt"].get<std::string>();
auto lte = json["$lte"].get<std::string>();
if(lt <= lte) {
json.erase("$lte");
} else {
json.erase("$lt");
}
}
std::set<nlohmann::json> tmp;
if(json.contains("$gt")) {
if(json.contains("$lt")) {
tmp = queryString(prefix, json["$gt"].get<std::string>(), json["$lt"].get<std::string>(), 3);
} else if(json.contains("$lte")) {
tmp = queryString(prefix, json["$gt"].get<std::string>(), json["$lte"].get<std::string>(), 1);
} else {
tmp = queryString(prefix, json["$gt"].get<std::string>(), "", 6);
}
} else if(json.contains("$gte")) {
if(json.contains("$lt")) {
tmp = queryString(prefix, json["$gte"].get<std::string>(), json["$lt"].get<std::string>(), 2);
} else if(json.contains("$lte")) {
tmp = queryString(prefix, json["$gte"].get<std::string>(), json["$lte"].get<std::string>(), 0);
} else {
tmp = queryString(prefix, json["$gte"].get<std::string>(), "", 7);
}
} else if(json.contains("$lt")) {
tmp = queryString(prefix, "", json["$lt"].get<std::string>(), 4);
} else if(json.contains("$lte")) {
tmp = queryString(prefix, "", json["$lte"].get<std::string>(), 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<nlohmann::json> 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<double, 8> tree(index->find(prefix+"$number"));
for(auto& key: tree.keySet()) {
if(key != json["$ne"].get<double>()) continue;
List<int, 4> 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<int, 4> tree(index->find(prefix + "$null"));
for(auto& add : tree.all()) {
set.insert(PageManager::readJSONFromFile(add));
}
auto value = json["$ne"].get<std::string>();
BTree<std::string, 64> indexTree(index->find(prefix + "$string"));
if(indexTree.find(value) != -1) {
List<int, 4> 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<double>(), json["$lt"].get<double>(), 3);
} else if(json.contains("$lte")) {
set = queryNumber(prefix, json["$gt"].get<double>(), json["$lte"].get<double>(), 1);
} else {
set = queryNumber(prefix, json["$gt"].get<double>(), 0, 6);
}
} else if(json.contains("$gte")) {
if(json.contains("$lt")) {
set = queryNumber(prefix, json["$gte"].get<double>(), json["$lt"].get<double>(), 2);
} else if(json.contains("$lte")) {
set = queryNumber(prefix, json["$gte"].get<double>(), json["$lte"].get<double>(), 0);
} else {
set = queryNumber(prefix, json["$gte"].get<double>(), 0, 7);
}
} else if(json.contains("$lt")) {
set = queryNumber(prefix, 0, json["$lt"].get<double>(), 4);
} else if(json.contains("$lte")) {
set = queryNumber(prefix, 0, json["$lte"].get<double>(), 5);
} else if(json["$ne"].is_number()) {
List<int, 4> 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<std::string, 64> tree(index->find(prefix+"$string"));
for(auto& key: tree.keySet()) {
if(key != json["$ne"].get<std::string>()) continue;
List<int, 4> list(tree.find(key));
for(auto& add : list.all()) {
set.insert(PageManager::Instance().readJSONFromFile(add));
}
auto value = json["$ne"].get<double>();
BTree<double, 8> indexTree(index->find(prefix + "$number"));
if(indexTree.find(value) != -1) {
List<int, 4> 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<std::string>(), json["$lt"].get<std::string>(), 3);
} else if(json.contains("$lte")) {
set = queryString(prefix, json["$gt"].get<std::string>(), json["$lte"].get<std::string>(), 1);
} else {
set = queryString(prefix, json["$gt"].get<std::string>(), "", 6);
}
} else if(json.contains("$gte")) {
if(json.contains("$lt")) {
set = queryString(prefix, json["$gte"].get<std::string>(), json["$lt"].get<std::string>(), 2);
} else if(json.contains("$lte")) {
set = queryString(prefix, json["$gte"].get<std::string>(), json["$lte"].get<std::string>(), 0);
} else {
set = queryString(prefix, json["$gte"].get<std::string>(), "", 7);
}
} else if(json.contains("$lt")) {
set = queryString(prefix, "", json["$lt"].get<std::string>(), 4);
} else if(json.contains("$lte")) {
set = queryString(prefix, "", json["$lte"].get<std::string>(), 5);
}
return set;
} else {
throw "unvalid query json.";
}
}
return set;
}
std::set<nlohmann::json> Collection::innerQuery(const std::string &prefix, const nlohmann::json &json) {
@ -162,6 +258,14 @@ std::set<nlohmann::json> Collection::innerQuery(const std::string &prefix, const
}
else
tmp = setIntersection(queryNumber(tPrefix, element.get<double>(), element.get<double>()), 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<nlohmann::json> Collection::innerQuery(const std::string &prefix, const
tmp = queryString(tPrefix, json[key].get<std::string>(), json[key].get<std::string>());
} else if(json[key].is_number()) {
tmp = queryNumber(tPrefix, json[key].get<double>(), json[key].get<double>());
} else if(json[key].is_null()) {
tmp = queryNull(tPrefix);
}
if (flag) continue;
if(init) res = tmp, init = false;
@ -184,9 +290,6 @@ std::set<nlohmann::json> Collection::innerQuery(const std::string &prefix, const
}
if (init) return queryAllByField(prefix);
return res;
}
@ -199,7 +302,7 @@ std::set<nlohmann::json> 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<nlohmann::json> Collection::queryAllByField(const std::string &fieldNa
for(auto &[key, value] : tree.all()) {
List<int, 4> list(value);
for(auto& add : list.all()) {
res.insert(PageManager::Instance().readJSONFromFile(add));
res.insert(PageManager::readJSONFromFile(add));
}
}
}
@ -221,7 +324,7 @@ std::set<nlohmann::json> Collection::queryAllByField(const std::string &fieldNa
for(auto &[key, value] : tree.all()) {
List<int, 4> list(value);
for(auto& add : list.all()) {
res.insert(PageManager::Instance().readJSONFromFile(add));
res.insert(PageManager::readJSONFromFile(add));
}
}
}
@ -231,10 +334,18 @@ std::set<nlohmann::json> Collection::queryAllByField(const std::string &fieldNa
for(auto &[key, value] : tree.all()) {
List<int, 4> 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<int, 4> 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<int, 4> 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<int, 4> 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<int, 4> 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<nlohmann::json> Collection::queryNull(const std::string &prefix) {
std::set<nlohmann::json> res;
auto treeName = prefix + "$null";
if(!index->exists(treeName)) {
return res;
}
List<int, 4> tree(index->find(treeName));
for(auto& add : tree.all()) {
res.insert(PageManager::readJSONFromFile(add));
}
return res;
}

View File

@ -4,6 +4,9 @@
#include "page_manager.h"
std::map<int, StoragePage> PageManager::map;
std::fstream PageManager::stream;
int PageManager::loadDatabase(const char *filename) {
Instance().stream.open(filename);
Instance().stream.seekp(0, std::ios::end);

View File

@ -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<typename T>
static std::shared_ptr<T> 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<int, StoragePage> 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<int, StoragePage> map;
static std::fstream stream;
// 私有化实现单例
PageManager() {}
~PageManager() {}

View File

@ -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() {

View File

@ -54,7 +54,7 @@ void terminal() {
void testAndBenchmark(int n) {
auto btree = new BTree<std::string, 128>(PageManager::Instance().allocate());
auto btree = new BTree<std::string, 128>(PageManager::allocate());
printf("nodeSize: %d\n", btree->getNodeSize());

693
yarn.lock
View File

@ -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==