refactor: winston out, tslog in

This commit is contained in:
ppedziwiatr
2021-08-25 21:40:48 +02:00
parent 3a9a121c2b
commit b6b2c65be2
17 changed files with 171 additions and 339 deletions

View File

@@ -38,7 +38,7 @@ async function readContractState() {
logging: false // Enable network request logging
});
logger.debug('arweave created');
logger.trace('arweave created');
const changedSrc = `function handle(state, action) {
console.log("hello world from the new source:", SmartWeave.transaction.id);
@@ -64,12 +64,12 @@ async function readContractState() {
new LexicographicalInteractionsSorter(arweave)
);
logger.debug('swcClient created');
logger.trace('swcClient created');
const jwk = readJSON('../../redstone-node/.secrets/redstone-dev-jwk.json');
const jwkAddress = await arweave.wallets.jwkToAddress(jwk);
logger.debug('jwkAddress:', jwkAddress);
logger.trace('jwkAddress:', jwkAddress);
const { state, validity } = await swcClient.readState('OrO8n453N6bx921wtsEs-0OCImBLCItNU5oSbFKlFuU');

View File

@@ -215,7 +215,7 @@ async function main() {
logger.info('skipping ', contractTxId);
errorContractTxIds.push(contractTxId);
} finally {
logger.debug('Contracts with different states:', differentStatesContractTxIds);
logger.trace('Contracts with different states:', differentStatesContractTxIds);
logger.info('\n\n ==== END');
}
}
@@ -268,7 +268,7 @@ async function getNextPage(arweave, variables) {
variables
});
logger.debug('Status:', response.status);
logger.trace('Status:', response.status);
if (response.status !== 200) {
throw new Error('Wrong response from Ar GQL');
}

View File

@@ -69,7 +69,7 @@ async function main() {
for (const contractTx of contractTxs) {
const contractTxId = contractTx.node.id;
logger.debug(
logger.trace(
`\n[${contractTxs.indexOf(contractTx) + 1} / ${contractTxs.length}] loading interactions of the ${contractTxId}`
);
const interactions = await sendQuery(
@@ -89,7 +89,7 @@ async function main() {
transactionsQuery
);
logger.debug(`${contractTxId}: ${interactions.length}`);
logger.trace(`${contractTxId}: ${interactions.length}`);
result[contractTxId] = interactions.length;
@@ -113,7 +113,7 @@ async function main() {
const sortedContracts = {};
sortable.forEach((item) => (sortedContracts[item[0]] = item[1]));
logger.debug(sortedContracts);
logger.trace(sortedContracts);
fs.writeFileSync(path.join(__dirname, `swc-sorted-stats.json`), JSON.stringify(sortedContracts));
}

View File

@@ -49,8 +49,7 @@
"bignumber.js": "^9.0.1",
"bson": "^4.5.0",
"json-beautify": "^1.1.1",
"tslog": "^3.2.1",
"winston": "^3.3.3"
"tslog": "^3.2.1"
},
"devDependencies": {
"@textury/arlocal": "^1.0.27",

View File

@@ -2,7 +2,7 @@ import fs from 'fs';
import path from 'path';
import BSON from 'bson';
import { BlockHeightCacheResult, BlockHeightKey, BlockHeightSwCache } from '@smartweave/cache';
import { LoggerFactory } from '@smartweave/logging';
import { Benchmark, LoggerFactory } from '@smartweave/logging';
const logger = LoggerFactory.INST.create(__filename);
/**
@@ -59,7 +59,7 @@ export class BsonFileBlockHeightSwCache<V = any> implements BlockHeightSwCache<V
if (this.storage[directory] == null) {
this.storage[directory] = {};
}
logger.profile(`loading cache for ${directory}`);
const benchmark = Benchmark.measure();
const files = fs.readdirSync(cacheDirPath);
files.forEach((file) => {
const cacheFilePath = path.join(cacheDirPath, file);
@@ -69,7 +69,7 @@ export class BsonFileBlockHeightSwCache<V = any> implements BlockHeightSwCache<V
this.storage[directory][height] = cache as V;
});
logger.profile(`loading cache for ${directory}`);
logger.debug(`loading cache for ${directory}`, benchmark.elapsed());
});
logger.debug('Storage keys', Object.keys(this.storage));

View File

@@ -1,6 +1,7 @@
import Arweave from 'arweave';
import { JWKInterface } from 'arweave/node/lib/wallet';
import {
Benchmark,
ContractInteraction,
DefaultEvaluationOptions,
DefinitionLoader,
@@ -43,14 +44,13 @@ export class HandlerBasedSwcClient implements SwcClient {
evaluationOptions?: EvaluationOptions
): Promise<EvalStateResult<State>> {
logger.info(`Read state for ${contractTxId}`);
logger.profile('Creating execution context');
const benchmark = Benchmark.measure();
const executionContext = await this.createExecutionContext(contractTxId, blockHeight, evaluationOptions);
logger.profile('Creating execution context');
logger.debug('Creating execution context', benchmark.elapsed());
const now = Date.now();
logger.profile(`\nEvaluating ${contractTxId} state ${now}`);
benchmark.reset();
const result = await this.stateEvaluator.eval(executionContext, currentTx || []);
logger.profile(`\nEvaluating ${contractTxId} state ${now}`);
logger.debug(`Evaluating ${contractTxId} state`, benchmark.elapsed());
return result as EvalStateResult<State>;
}
@@ -63,9 +63,9 @@ export class HandlerBasedSwcClient implements SwcClient {
evaluationOptions?: EvaluationOptions
): Promise<InteractionResult<any, View>> {
logger.info(`View state for ${contractTxId}`);
logger.profile('Creating execution context');
const benchmark = Benchmark.measure();
let executionContext = await this.createExecutionContext(contractTxId, blockHeight, evaluationOptions);
logger.profile('Creating execution context');
logger.debug('Creating execution context', benchmark.elapsed());
if (!executionContext.currentBlockData) {
const currentBlockData = executionContext.currentNetworkInfo
@@ -85,10 +85,9 @@ export class HandlerBasedSwcClient implements SwcClient {
caller
};
const now = Date.now();
logger.profile(`\nEvaluating ${contractTxId} state ${now}`);
benchmark.reset();
const evalStateResult = await this.stateEvaluator.eval(executionContext, []);
logger.profile(`\nEvaluating ${contractTxId} state ${now}`);
logger.debug(`Evaluating ${contractTxId} state`, benchmark.elapsed());
const interaction: ContractInteraction = {
input,
@@ -122,14 +121,13 @@ export class HandlerBasedSwcClient implements SwcClient {
evaluationOptions?: EvaluationOptions
): Promise<InteractionResult<any, View>> {
logger.info(`Vies state for ${contractTxId}`, transaction);
logger.profile('Creating execution context');
const benchmark = Benchmark.measure();
const executionContext = await this.createExecutionContextFromTx(contractTxId, transaction);
logger.profile('Creating execution context');
logger.debug('Creating execution context', benchmark.elapsed());
const now = Date.now();
logger.profile(`\nEvaluating ${contractTxId} state ${now}`);
benchmark.reset();
const evalStateResult = await this.stateEvaluator.eval(executionContext, []);
logger.profile(`\nEvaluating ${contractTxId} state ${now}`);
logger.debug(`Evaluating ${contractTxId} state`, benchmark.elapsed());
const interaction: ContractInteraction = {
input,

View File

@@ -27,7 +27,7 @@ export class DefaultEvaluationOptions implements EvaluationOptions {
// not even notice that there was an exception in state evaluation.
// Current SDK version simply moves to next interaction in this case and ignores exception
// - I believe this is not a proper behaviour.
ignoreExceptions = false;
ignoreExceptions = true;
}
// an interface for the contract EvaluationOptions - can be used to change the behaviour of some of the features.

View File

@@ -1,4 +1,5 @@
import {
Benchmark,
ContractInteraction,
EvalStateResult,
ExecutionContext,
@@ -56,7 +57,7 @@ export class DefaultStateEvaluator<State = unknown> implements StateEvaluator<St
missingInteractions.length
} [of all:${executionContext.sortedInteractions.length}]`
);
logger.profile(`${missingInteraction.node.id} evaluation`);
const benchmark = Benchmark.measure();
const currentInteraction: GQLNodeInterface = missingInteraction.node;
const inputTag = this.findInputTag(missingInteraction, executionContext);
@@ -92,7 +93,7 @@ export class DefaultStateEvaluator<State = unknown> implements StateEvaluator<St
validity[currentInteraction.id] = result.type === 'ok';
currentState = result.state;
logger.profile(`${missingInteraction.node.id} evaluation`);
logger.debug(`${missingInteraction.node.id} evaluation`, benchmark.elapsed());
// I'm really NOT a fan of this "modify" feature, but I don't have idea how to better
// implement the "evolve" feature

18
src/logging/Benchmark.ts Normal file
View File

@@ -0,0 +1,18 @@
import { performance } from 'perf_hooks';
export class Benchmark {
public static measure(): Benchmark {
return new Benchmark();
}
private start = performance.now();
public reset() {
this.start = performance.now();
}
public elapsed(): string {
const end = performance.now();
return `${(end - this.start).toFixed(0)}ms`;
}
}

View File

@@ -1,17 +1,16 @@
import { Logger, LogLevel } from '@smartweave';
import { LoggerOptions } from 'winston';
import { RedStoneLogger, LogLevel } from '@smartweave';
import { ConsoleLoggerFactory } from './web/ConsoleLoggerFactory';
import { WinstonLoggerFactory } from './node/WinstonLoggerFactory';
import { TsLogFactory } from './node/TsLogFactory';
import { ISettingsParam } from 'tslog';
export class LoggerFactory {
static readonly INST: LoggerFactory =
typeof window === 'undefined' ? new WinstonLoggerFactory() : new ConsoleLoggerFactory();
static readonly INST: LoggerFactory = typeof window === 'undefined' ? new TsLogFactory() : new ConsoleLoggerFactory();
setOptions(newOptions: LoggerOptions, moduleName: string): void {
setOptions(newOptions: ISettingsParam, moduleName: string): void {
LoggerFactory.INST.setOptions(newOptions, moduleName);
}
getOptions(moduleName?: string): LoggerOptions {
getOptions(moduleName?: string): ISettingsParam {
return LoggerFactory.INST.getOptions(moduleName);
}
@@ -19,7 +18,7 @@ export class LoggerFactory {
LoggerFactory.INST.logLevel(level, moduleName);
}
create(moduleName?: string): Logger {
create(moduleName?: string): RedStoneLogger {
return LoggerFactory.INST.create(moduleName);
}
}

View File

@@ -1,7 +1,7 @@
export type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly';
export type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'silly';
export interface Logger {
profile(id: any);
export interface RedStoneLogger {
fatal(message?: any, ...optionalParams: any[]);
error(message?: any, ...optionalParams: any[]);
@@ -9,11 +9,9 @@ export interface Logger {
info(message?: any, ...optionalParams: any[]);
verbose(message?: any, ...optionalParams: any[]);
debug(message?: any, ...optionalParams: any[]);
silly(message?: any, ...optionalParams: any[]);
trace(message?: any, ...optionalParams: any[]);
log(message?: any, ...optionalParams: any[]);
silly(message?: any, ...optionalParams: any[]);
}

View File

@@ -1,5 +1,6 @@
export * from './web/ConsoleLogger';
export * from './web/ConsoleLoggerFactory';
export * from './node/WinstonLoggerFactory';
export * from './Logger';
export * from './node/TsLogFactory';
export * from './RedStoneLogger';
export * from './LoggerFactory';
export * from './Benchmark';

View File

@@ -0,0 +1,89 @@
import path from 'path';
import { ISettingsParam, Logger } from 'tslog';
import { LogLevel, RedStoneLogger } from '../RedStoneLogger';
export const defaultLoggerOptions: ISettingsParam = {
displayFunctionName: false,
displayFilePath: 'hideNodeModulesOnly',
displayLoggerName: false,
dateTimeTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone
};
/**
* A wrapper around "tslog" logging library that allows to change logging settings at runtime
* (for each registered module independently, or globally - for all loggers).
*/
export class TsLogFactory {
private readonly registeredLoggers: { [moduleName: string]: Logger } = {};
private readonly registeredOptions: { [moduleName: string]: ISettingsParam } = {};
private defaultOptions: ISettingsParam = { ...defaultLoggerOptions };
constructor() {
this.setOptions = this.setOptions.bind(this);
this.getOptions = this.getOptions.bind(this);
this.create = this.create.bind(this);
this.logLevel = this.logLevel.bind(this);
}
setOptions(newOptions: ISettingsParam, moduleName?: string): void {
// if moduleName not specified
if (!moduleName) {
// update default options
this.defaultOptions = newOptions;
// update options for all already registered loggers
Object.keys(this.registeredLoggers).forEach((key: string) => {
this.registeredLoggers[key].setSettings({
...this.registeredLoggers[key].settings,
...newOptions
});
});
} else {
// if logger already registered
if (this.registeredLoggers[moduleName]) {
// update its options
this.registeredLoggers[moduleName].setSettings({
...this.registeredLoggers[moduleName].settings,
...newOptions
});
} else {
// if logger not yet registered - save options that will be used for its creation
this.registeredOptions[moduleName] = {
...this.defaultOptions,
...newOptions
};
}
}
}
getOptions(moduleName?: string): ISettingsParam {
if (!moduleName) {
return this.defaultOptions;
} else {
if (this.registeredLoggers[moduleName]) {
return this.registeredLoggers[moduleName].settings;
} else if (this.registeredOptions[moduleName]) {
return this.registeredOptions[moduleName];
} else {
return this.defaultOptions;
}
}
}
logLevel(level: LogLevel, moduleName?: string) {
this.setOptions({ minLevel: level }, moduleName);
}
create(moduleName = 'SWC'): RedStoneLogger {
// in case of passing '__dirname' as moduleName - leaves only the file name without extension.
const normalizedModuleName = path.basename(moduleName, path.extname(moduleName));
if (!this.registeredLoggers[normalizedModuleName]) {
const logger = new Logger({
...this.getOptions(normalizedModuleName),
name: normalizedModuleName
});
this.registeredLoggers[normalizedModuleName] = logger;
}
return this.registeredLoggers[normalizedModuleName] as RedStoneLogger;
}
}

View File

@@ -1,124 +0,0 @@
import winston, { createLogger, format, LogEntry, LoggerOptions, transports } from 'winston';
import path from 'path';
import { Logger, LogLevel } from '@smartweave';
const { combine, errors, timestamp, colorize, printf } = format;
/**
* A wrapper around "Winston" logging library that allows to change logging settings at runtime
* (for each registered module independently, or globally - for all loggers).
*/
export class WinstonLoggerFactory {
public readonly baseFormat = combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss.SSS' }),
errors({ stack: true }),
format.splat(),
format((info) => {
info.level = info.level.toUpperCase();
return info;
})()
);
public readonly prettyFormat = combine(
this.baseFormat,
colorize({ all: false }),
printf(({ timestamp, level, message, ...rest }) => {
let result = `[${timestamp}] [${rest.module || 'SWC'}] ${level}: ${message}`;
if (rest?.durationMs) {
result += ` - ${rest.durationMs}ms`;
}
return result;
})
);
private readonly registeredLoggers: { [moduleName: string]: Logger } = {};
private readonly registeredOptions: { [moduleName: string]: LoggerOptions } = {};
private defaultOptions: LoggerOptions = {
level: 'debug',
format: this.prettyFormat,
transports: [new transports.Console()],
exitOnError: false
};
public constructor() {
winston.addColors({
error: 'bold redBG',
warn: 'bold magenta',
info: 'bold green',
http: 'bold magentaBG',
verbose: 'bold cyan',
debug: 'bold blue',
silly: 'grey'
});
this.setOptions = this.setOptions.bind(this);
this.getOptions = this.getOptions.bind(this);
this.create = this.create.bind(this);
this.logLevel = this.logLevel.bind(this);
}
setOptions(newOptions: LoggerOptions, moduleName?: string): void {
// if moduleName not specified
if (!moduleName) {
// update default options
this.defaultOptions = newOptions;
// update options for all already registered loggers
Object.keys(this.registeredLoggers).forEach((key: string) => {
Object.assign(this.registeredLoggers[key], newOptions);
});
} else {
// if logger already registered
if (this.registeredLoggers[moduleName]) {
// update its options
Object.assign(this.registeredLoggers[moduleName], newOptions);
} else {
// if logger not yet registered - save options that will be used for its creation
this.registeredOptions[moduleName] = {
...this.defaultOptions,
...newOptions
};
}
}
}
getOptions(moduleName?: string): LoggerOptions {
if (!moduleName) {
return this.defaultOptions;
} else {
if (this.registeredLoggers[moduleName]) {
// safe typecast in this case...
return this.registeredLoggers[moduleName] as LoggerOptions;
} else if (this.registeredOptions[moduleName]) {
return this.registeredOptions[moduleName];
} else {
return this.defaultOptions;
}
}
}
logLevel(level: LogLevel, moduleName?: string) {
this.setOptions({ level }, moduleName);
}
create(moduleName = 'SWC'): Logger {
// in case of passing '__dirname' as moduleName - leaves only the file name without extension.
const normalizedModuleName = path.basename(moduleName, path.extname(moduleName));
if (!this.registeredLoggers[normalizedModuleName]) {
const logger = createLogger({
...this.getOptions(normalizedModuleName),
// note: profiler this not currently honor defaultMeta - https://github.com/winstonjs/winston/pull/1935
defaultMeta: { module: normalizedModuleName }
});
// note: winston by default logs profile message with info level (to high IMO),
// with no option to set different default - so we're forcing level by
// overwriting default function...
const originalProfile = logger.profile.bind(logger);
logger.profile = (id: string | number, meta?: LogEntry) => {
return originalProfile(id, meta || { message: '', level: 'debug' });
};
this.registeredLoggers[normalizedModuleName] = logger;
}
return this.registeredLoggers[normalizedModuleName];
}
}

View File

@@ -1,7 +1,7 @@
import { Logger } from '@smartweave';
import { RedStoneLogger } from '@smartweave';
export class ConsoleLogger implements Logger {
debug(message?: any, ...optionalParams: any[]) {
export class ConsoleLogger implements RedStoneLogger {
trace(message?: any, ...optionalParams: any[]) {
console.debug(message, optionalParams);
}
@@ -13,15 +13,11 @@ export class ConsoleLogger implements Logger {
console.info(message, optionalParams);
}
profile(id: any) {
console.warn('Profile not implemented for this logger!');
}
silly(message?: any, ...optionalParams: any[]) {
console.debug(message, optionalParams);
}
verbose(message?: any, ...optionalParams: any[]) {
debug(message?: any, ...optionalParams: any[]) {
console.debug(message, optionalParams);
}
@@ -32,4 +28,8 @@ export class ConsoleLogger implements Logger {
log(message?: any, ...optionalParams: any[]) {
console.info(message, optionalParams);
}
fatal(message?: any, ...optionalParams: any[]) {
console.error(message, optionalParams);
}
}

View File

@@ -1,6 +1,6 @@
import { Logger, LogLevel } from '@smartweave';
import { LoggerOptions } from 'winston';
import { RedStoneLogger, LogLevel } from '@smartweave';
import { ConsoleLogger } from './ConsoleLogger';
import { ISettingsParam } from 'tslog';
export class ConsoleLoggerFactory {
constructor() {
@@ -10,11 +10,11 @@ export class ConsoleLoggerFactory {
this.logLevel = this.logLevel.bind(this);
}
setOptions(newOptions: LoggerOptions, moduleName?: string): void {
setOptions(newOptions: ISettingsParam, moduleName?: string): void {
// noop
}
getOptions(moduleName?: string): LoggerOptions {
getOptions(moduleName?: string): ISettingsParam {
return {};
}
@@ -22,7 +22,7 @@ export class ConsoleLoggerFactory {
// noop
}
create(moduleName = 'SWC'): Logger {
create(moduleName = 'SWC'): RedStoneLogger {
return new ConsoleLogger();
}
}

161
yarn.lock
View File

@@ -365,15 +365,6 @@
dependencies:
"@cspotcode/source-map-consumer" "0.8.0"
"@dabh/diagnostics@^2.0.2":
version "2.0.2"
resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31"
integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==
dependencies:
colorspace "1.1.x"
enabled "2.0.x"
kuler "^2.0.0"
"@eslint/eslintrc@^0.4.3":
version "0.4.3"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
@@ -1526,11 +1517,6 @@ async-retry@^1.2.1:
dependencies:
retry "0.13.1"
async@^3.1.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8"
integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -1906,7 +1892,7 @@ collect-v8-coverage@^1.0.0:
resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
color-convert@^1.9.0, color-convert@^1.9.1:
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@@ -1925,27 +1911,11 @@ color-name@1.1.3:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
color-name@^1.0.0, color-name@~1.1.4:
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-string@^1.5.2:
version "1.6.0"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==
dependencies:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
color@3.0.x:
version "3.0.0"
resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a"
integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==
dependencies:
color-convert "^1.9.1"
color-string "^1.5.2"
colorette@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
@@ -1956,19 +1926,11 @@ colorette@^1.3.0:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af"
integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==
colors@^1.2.1, colors@^1.3.3:
colors@^1.3.3:
version "1.4.0"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
colorspace@1.1.x:
version "1.1.2"
resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5"
integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==
dependencies:
color "3.0.x"
text-hex "1.0.x"
combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -2295,11 +2257,6 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
enabled@2.0.x:
version "2.0.0"
resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
encodeurl@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@@ -2699,11 +2656,6 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
fast-safe-stringify@^2.0.4:
version "2.0.8"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz#dc2af48c46cf712b683e849b2bbd446b32de936f"
integrity sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==
fastq@^1.6.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.12.0.tgz#ed7b6ab5d62393fb2cc591c853652a5c318bf794"
@@ -2718,11 +2670,6 @@ fb-watchman@^2.0.0:
dependencies:
bser "2.1.1"
fecha@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce"
integrity sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==
figlet@^1.5.0:
version "1.5.2"
resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.2.tgz#dda34ff233c9a48e36fcff6741aeb5bafe49b634"
@@ -2788,11 +2735,6 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561"
integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==
fn.name@1.x.x:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc"
integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==
follow-redirects@^1.10.0:
version "1.14.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.2.tgz#cecb825047c00f5e66b142f90fed4f515dec789b"
@@ -3252,7 +3194,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3:
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@~2.0.0, 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==
@@ -3295,11 +3237,6 @@ interpret@^2.2.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
is-arrayish@^0.3.1:
version "0.3.2"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
is-bigint@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
@@ -4152,11 +4089,6 @@ koa@2.13.1, koa@^2.13.1:
type-is "^1.6.16"
vary "^1.1.2"
kuler@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==
leven@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
@@ -4210,17 +4142,6 @@ lodash@4.x, lodash@^4.17.11, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
logform@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2"
integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==
dependencies:
colors "^1.2.1"
fast-safe-stringify "^2.0.4"
fecha "^4.2.0"
ms "^2.1.1"
triple-beam "^1.3.0"
loglevel@^1.6.7, loglevel@^1.7.0:
version "1.7.1"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
@@ -4629,13 +4550,6 @@ once@^1.3.0:
dependencies:
wrappy "1"
one-time@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45"
integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==
dependencies:
fn.name "1.x.x"
onetime@^5.1.0, onetime@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
@@ -4928,7 +4842,7 @@ react-is@^17.0.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
readable-stream@2, readable-stream@^2.0.6, readable-stream@^2.3.7:
readable-stream@2, 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==
@@ -4941,15 +4855,6 @@ readable-stream@2, readable-stream@^2.0.6, readable-stream@^2.3.7:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@@ -5104,7 +5009,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -5207,13 +5112,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
simple-swizzle@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
dependencies:
is-arrayish "^0.3.1"
sisteransi@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
@@ -5312,11 +5210,6 @@ sshpk@^1.7.0:
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
stack-trace@0.0.x:
version "0.0.10"
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
stack-utils@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277"
@@ -5404,13 +5297,6 @@ string.prototype.trimstart@^1.0.4:
call-bind "^1.0.2"
define-properties "^1.1.3"
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@@ -5575,11 +5461,6 @@ test-exclude@^6.0.0:
glob "^7.1.4"
minimatch "^3.0.4"
text-hex@1.0.x:
version "1.0.0"
resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -5661,11 +5542,6 @@ tr46@^2.1.0:
dependencies:
punycode "^2.1.1"
triple-beam@^1.2.0, triple-beam@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==
ts-invariant@^0.4.0:
version "0.4.4"
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86"
@@ -5870,7 +5746,7 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
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=
@@ -6008,29 +5884,6 @@ wide-align@^1.1.0:
dependencies:
string-width "^1.0.2 || 2"
winston-transport@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59"
integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==
dependencies:
readable-stream "^2.3.7"
triple-beam "^1.2.0"
winston@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170"
integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==
dependencies:
"@dabh/diagnostics" "^2.0.2"
async "^3.1.0"
is-stream "^2.0.0"
logform "^2.2.0"
one-time "^1.0.0"
readable-stream "^3.4.0"
stack-trace "0.0.x"
triple-beam "^1.3.0"
winston-transport "^4.4.0"
word-wrap@^1.2.3, word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"