add struct logs

This commit is contained in:
Iuri Matias 2019-11-02 21:50:02 -04:00
parent aecb99d428
commit ee37fd0656
9 changed files with 321 additions and 7 deletions

1
dapps/tests/app/log.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -8,6 +8,9 @@ import { ServicesMonitor } from './services_monitor';
import { normalizeInput } from 'embark-utils';
import { Logger } from 'embark-logger';
// const Logger = require('embark-logger');
const Logger = require('./superlog.js');
const EMBARK_PROCESS_NAME = 'embark';
export class Engine {
@ -83,7 +86,13 @@ export class Engine {
const options = _options || {};
this.events = options.events || this.events || new Events();
this.logger = options.logger || new Logger({context: this.context, logLevel: options.logLevel || this.logLevel || 'info', events: this.events, logFile: this.logFile});
<<<<<<< HEAD:packages/core/core/src/engine.ts
this.config = new Config({env: this.env, logger: this.logger, events: this.events, context: this.context, webServerConfig: this.webServerConfig, version: this.version, package: this.package});
=======
this.logger.startSession();
this.config = new Config({env: this.env, logger: this.logger, events: this.events, context: this.context, webServerConfig: this.webServerConfig, version: this.version});
>>>>>>> add struct logs:packages/embark/src/lib/core/engine.js
this.config.loadConfigFiles({embarkConfig: this.embarkConfig, interceptLogs: this.interceptLogs});
this.plugins = this.config.plugins;
this.isDev = this.config && this.config.blockchainConfig && (this.config.blockchainConfig.isDev || this.config.blockchainConfig.default);

View File

@ -107,6 +107,11 @@ EmbarkEmitter.prototype.request2 = function() {
const requestName = arguments[0];
const other_args: any[] = [].slice.call(arguments, 1);
let requestId;
if (this.logger && this.logId) {
requestId = this.logger.log({parent_id: this.logId, type: "request", name: requestName, inputs: other_args})
}
log("\nREQUEST", requestName);
warnIfLegacy(requestName);
if (this._events && !this._events['request:' + requestName]) {
@ -121,10 +126,22 @@ EmbarkEmitter.prototype.request2 = function() {
const promise = new Promise((resolve, reject) => {
other_args.push(
(err, ...res) => {
if (err) { return reject(err); }
if (err) {
if (this.logger && this.logId) {
this.logger.log({id: requestId, type: "request", name: requestName, msg: err, error: true})
}
return reject(err);
}
if (res.length && res.length > 1) {
if (this.logger && this.logId) {
this.logger.log({id: requestId, type: "request", name: requestName, outputs: res})
}
return resolve(res);
}
if (this.logger && this.logId) {
this.logger.log({id: requestId, type: "request", name: requestName, outputs: res[0]})
}
return resolve(res[0]);
}
);
@ -150,6 +167,11 @@ EmbarkEmitter.prototype.request = function() {
const requestName = arguments[0];
const other_args = [].slice.call(arguments, 1);
let requestId;
if (this.logger && this.logId) {
requestId = this.logger.log({parent_id: this.logId, type: "old_request", name: requestName, inputs: other_args})
}
log("\nREQUEST(OLD)", requestName);
warnIfLegacy(requestName);
if (this._events && !this._events['request:' + requestName]) {
@ -161,7 +183,7 @@ EmbarkEmitter.prototype.request = function() {
}
const listenerName = 'request:' + requestName;
// TODO: remove this, it will lead to illusion of things working when this situatio shouldnt' hapepn in the first place
// TODO: remove this, it will lead to illusion of things working when this situation shouldnt' hapepn in the first place
// if we don't have a command handler set for this event yet,
// store it and fire it once a command handler is set
@ -181,6 +203,10 @@ EmbarkEmitter.prototype.request = function() {
EmbarkEmitter.prototype.setCommandHandler = function(requestName, cb) {
log("SET COMMAND HANDLER", requestName);
if (this.logger && this.logId) {
this.logger.log({parent_id: this.logId, type: "setCommandHandler", name: requestName})
}
// let origin = ((new Error().stack).split("at ")[3]).trim();
// origin = origin.split("(")[0].trim();
const origin = getOrigin();

View File

@ -138,6 +138,7 @@
"json-parse-better-errors": "1.0.2",
"lodash.clonedeep": "4.5.0",
"mocha": "6.2.0",
"mongoose": "5.7.7",
"neo-blessed": "0.2.0",
"node-http-proxy-json": "0.1.6",
"node-ipc": "9.1.1",

View File

@ -152,6 +152,11 @@ class EmbarkController {
engine.logger.info(__("loaded plugins") + ": " + pluginList.join(", "));
}
let runId = engine.logger.moduleInit("run_command")
let _events = Object.assign({}, engine.events, {logId: runId, logger: engine.logger});
Object.setPrototypeOf(_events, engine.events);
engine.events = _events;
engine.registerModuleGroup("coreComponents");
engine.registerModuleGroup("stackComponents");
engine.registerModuleGroup("consoleComponents");

View File

@ -0,0 +1,132 @@
const Logger = require('embark-logger');
const uuid = require('uuid');
const fs = require('fs-extra');
var DB = {
}
function addRecord(data) {
DB[data.id] = data
console.dir("---> added")
console.dir(DB[data.id])
}
function findRecord(id) {
return DB[id];
}
function updateRecord(id, data) {
DB[id] = {...DB[id], ...data}
console.dir("---> updated")
console.dir(DB[id])
}
setTimeout(() => {
console.dir(DB);
fs.writeJSONSync("./log.json", DB);
process.exit(0);
}, 60*1000);
class SuperLog extends Logger {
startSession() {
this.session = uuid.v4();
addRecord({
session: this.session,
id: this.session,
timestamp: Date.now(),
value: "new_session",
type: "new_session",
name: "new_session"
})
}
moduleInit(name) {
let id = uuid.v4();
addRecord({
session: this.session,
id: id,
timestamp: Date.now(),
parent_id: this.session,
type: 'module_init',
value: name,
name: name
})
return id;
}
log(values) {
// console.log("=> logging")
// console.log(values.id)
if (values.id) {
// console.log("=> has an id")
let existingLog = findRecord(values.id);
// console.log("=> record found")
if (existingLog) {
updateRecord(values.id, values)
return values.id;
}
}
let id = uuid.v4();
addRecord({
session: this.session,
timestamp: Date.now(),
id: id,
...values
})
return id;
}
info() {
let id = uuid.v4();
this.log({
session: this.session,
timestamp: Date.now(),
parent_id: this.session,
id: id,
type: "log_info",
name: "info: " + arguments[0]
})
super.info(...arguments);
}
}
module.exports = SuperLog;
// session
// branch
// branch
// cmd_controller
// * startSession()
// * module
// * log
// * branch off
// API:
// logger.startSession() - to start tracking logs
// let id = logger.tag({whatever-you-want}) - appends {whatever-you-want} to a mongo db, associated to the current session id
// let sub_id = logger.tag({parent_id: id, ...whatever-you-want}) - appends {whatever-you-want} to a mongo db, associated to the current session id and parent_id id
// - name (e.g module name, method name)
// - type (e.g module init, function call, event)
// - inputs
// - outputs
// - timestamp
// - file/origin (can kinda be done automatically almost)
// for inputs and outputs
// let sub_id = logger.tag({parent_id: id, ...whatever-you-want})
// logger.tag({id: sub_id, inputs: xyz})
// .... code
// // gonna return
// logger.tag({id: sub_id, outputs: [1,2,3]})
// return [1,2,3]

View File

@ -2,7 +2,14 @@ const async = require('async');
class ContractDeployer {
constructor(options) {
this.events = options.events;
// this.events = options.events;
this.logger = options.logger;
this.logId = this.logger.moduleInit("ContractDeployer");
this.events = Object.assign({}, options.events, {logId: this.logId, logger: this.logger});
Object.setPrototypeOf(this.events, options.events);
this.plugins = options.plugins;
this.deployer = {};
this.events.setCommandHandler("deployment:deployer:register", (blockchainType, deployerCb) => {

View File

@ -8,14 +8,21 @@ const constants = require('embark-core/constants');
class Deployment {
constructor(embark, options) {
this.config = embark.config;
this.events = embark.events;
this.logger = embark.logger;
this.logId = this.logger.moduleInit("DeploymentModule");
// this.events = embark.events;
this.events = Object.assign({}, embark.events, {logId: this.logId, logger: this.logger});
Object.setPrototypeOf(this.events, embark.events);
this.plugins = options.plugins;
this.blockchainConfig = this.config.blockchainConfig;
this.contractDeployer = new ContractDeployer({
events: this.events,
plugins: this.plugins
plugins: this.plugins,
logger: this.logger
});
this.events.setCommandHandler('deployment:contracts:deploy', (contractsList, contractDependencies, cb) => {
@ -24,6 +31,8 @@ class Deployment {
}
deployContracts(contracts, contractDependencies, done) {
let subId = this.logger.log({parent_id: this.logId, type: "method", name: "deployContracts", inputs: {contracts, contractDependencies}});
this.logger.info(__("deploying contracts"));
async.waterfall([
// TODO used to be called this.plugins.emitAndRunActionsForEvent("deploy:beforeAll", (err) => {
@ -44,6 +53,7 @@ class Deployment {
}
deployContract(contract, callback) {
let subId = this.logger.log({parent_id: this.logId, type: "method", name: "deployContract", inputs: {contract}});
this.events.request('deployment:contract:deploy', contract, (err) => {
if (err) {
contract.error = err.message || err;
@ -52,13 +62,16 @@ class Deployment {
} else {
this.logger.error(`[${contract.className}]: ${err.message || err}`);
}
this.logger.log({id: subId, outputs: err, error: true});
return callback(err);
}
this.logger.log({id: subId, outputs: ""});
callback();
});
}
deployAll(contracts, contractDependencies, done) {
let subId = this.logger.log({parent_id: this.logId, type: "method", name: "deployAll", inputs: {contracts, contractDependencies}});
const self = this;
const contractDeploys = {};
const errors = [];
@ -99,13 +112,17 @@ class Deployment {
async.auto(contractDeploys, (err, _results) => {
if (errors.length) {
err = __("Error deploying contracts. Please fix errors to continue.");
this.logger.log({id: subId, outputs: err, error: true});
return done(err);
}
if (contracts.length === 0) {
this.logger.info(__("no contracts found"));
this.logger.log({id: subId, outputs: "", msg: "no contracts found"});
return done();
}
this.logger.info(__("finished deploying contracts"));
this.logger.log({id: subId, outputs: err, error: !!err, msg: "finished deploying contracts"});
done(err);
});
}

120
yarn.lock
View File

@ -5029,6 +5029,16 @@ block-stream@*:
dependencies:
inherits "~2.0.0"
bluebird@3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.3.1.tgz#f97ae1970f41d85177283053e9a120160e66c61d"
integrity sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=
bluebird@3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==
bluebird@^2.9.34:
version "2.11.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
@ -5270,6 +5280,11 @@ bser@^2.0.0:
dependencies:
node-int64 "^0.4.0"
bson@^1.1.1, bson@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.1.tgz#4330f5e99104c4e751e7351859e2d408279f2f13"
integrity sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==
btoa-lite@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
@ -12257,6 +12272,11 @@ just-extend@^4.0.2:
resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc"
integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==
kareem@2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.1.tgz#def12d9c941017fabfb00f873af95e9c99e1be87"
integrity sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==
keccak@^1.0.2:
version "1.4.0"
resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80"
@ -13149,6 +13169,11 @@ memory-fs@^0.4.0, memory-fs@^0.4.1:
errno "^0.1.3"
readable-stream "^2.0.1"
memory-pager@^1.0.2:
version "1.5.0"
resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5"
integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==
memorystream@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
@ -13514,6 +13539,39 @@ monaco-editor@0.14.3:
resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.14.3.tgz#7cc4a4096a3821f52fea9b10489b527ef3034e22"
integrity sha512-RhaO4xXmWn/p0WrkEOXe4PoZj6xOcvDYjoAh0e1kGUrQnP1IOpc0m86Ceuaa2CLEMDINqKijBSmqhvBQnsPLHQ==
mongodb@3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.3.3.tgz#509cad2225a1c56c65a331ed73a0d5d4ed5cbe67"
integrity sha512-MdRnoOjstmnrKJsK8PY0PjP6fyF/SBS4R8coxmhsfEU7tQ46/J6j+aSHF2n4c2/H8B+Hc/Klbfp8vggZfI0mmA==
dependencies:
bson "^1.1.1"
require_optional "^1.0.1"
safe-buffer "^5.1.2"
optionalDependencies:
saslprep "^1.0.0"
mongoose-legacy-pluralize@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4"
integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==
mongoose@5.7.7:
version "5.7.7"
resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.7.7.tgz#038b47d10434ea6cc9ec9b45d88bfcf9ab401a1a"
integrity sha512-FU59waB4LKBa9KOnqBUcCcMIVRc09TFo1F8nMxrzSiIWATaJpjxxSSH5FBVUDxQfNdJLfg9uFHxaTxhhwjsZOQ==
dependencies:
bson "~1.1.1"
kareem "2.3.1"
mongodb "3.3.3"
mongoose-legacy-pluralize "1.0.2"
mpath "0.6.0"
mquery "3.2.2"
ms "2.1.2"
regexp-clone "1.0.0"
safe-buffer "5.1.2"
sift "7.0.1"
sliced "1.0.1"
mout@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/mout/-/mout-0.11.1.tgz#ba3611df5f0e5b1ffbfd01166b8f02d1f5fa2b99"
@ -13531,6 +13589,22 @@ move-concurrently@^1.0.1:
rimraf "^2.5.4"
run-queue "^1.0.3"
mpath@0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.6.0.tgz#aa922029fca4f0f641f360e74c5c1b6a4c47078e"
integrity sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==
mquery@3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.2.tgz#e1383a3951852ce23e37f619a9b350f1fb3664e7"
integrity sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==
dependencies:
bluebird "3.5.1"
debug "3.1.0"
regexp-clone "^1.0.0"
safe-buffer "5.1.2"
sliced "1.0.1"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@ -13541,7 +13615,7 @@ ms@2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
ms@^2.0.0, ms@^2.1.1:
ms@2.1.2, ms@^2.0.0, ms@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
@ -17227,6 +17301,11 @@ regex-parser@2.2.10:
resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37"
integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==
regexp-clone@1.0.0, regexp-clone@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63"
integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==
regexp-tree@^0.1.6:
version "0.1.13"
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f"
@ -17500,6 +17579,14 @@ require-uncached@^1.0.2, require-uncached@^1.0.3:
caller-path "^0.1.0"
resolve-from "^1.0.0"
require_optional@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==
dependencies:
resolve-from "^2.0.0"
semver "^5.1.0"
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
@ -17527,6 +17614,11 @@ resolve-from@^1.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
resolve-from@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=
resolve-from@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
@ -17797,6 +17889,13 @@ sane@^4.0.3:
minimist "^1.1.1"
walker "~1.0.5"
saslprep@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226"
integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==
dependencies:
sparse-bitfield "^3.0.3"
sass-graph@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
@ -17992,7 +18091,7 @@ semaphore@>=1.0.1, semaphore@^1.1.0:
resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0:
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@ -18245,6 +18344,11 @@ shellwords@^0.1.1:
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
sift@7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08"
integrity sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@ -18393,6 +18497,11 @@ slice-ansi@^2.1.0:
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
sliced@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41"
integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=
slide@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
@ -18634,6 +18743,13 @@ space-separated-tokens@^1.0.0:
dependencies:
trim "0.0.1"
sparse-bitfield@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11"
integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE=
dependencies:
memory-pager "^1.0.2"
spawn-wrap@^1.4.2:
version "1.4.3"
resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848"