1
0
mirror of https://github.com/verdaccio/verdaccio.git synced 2024-11-08 23:25:51 +01:00

feat: improve cli logging on start up (#2097)

* feat: improve cli logging on start up

* chore: remove deps
This commit is contained in:
Juan Picado 2021-02-14 20:56:43 +01:00
parent e2a4477c8f
commit d5eacc218b
25 changed files with 221 additions and 153 deletions

@ -0,0 +1,6 @@
---
'@verdaccio/cli': minor
'@verdaccio/node-api': minor
---
feat: improve cli loggin on start up

@ -44,7 +44,7 @@
},
"dependencies": {
"@verdaccio/config": "workspace:5.0.0-alpha.3",
"@verdaccio/logger": "workspace:5.0.0-alpha.3",
"@verdaccio/cli-ui": "workspace:5.0.0-alpha.3",
"@verdaccio/node-api": "workspace:5.0.0-alpha.6",
"commander": "6.2.0",
"envinfo": "7.4.0",

@ -1,7 +1,7 @@
import commander from 'commander';
import { bgYellow, bgRed } from 'kleur';
import { logger } from '@verdaccio/logger';
import { displayError } from '@verdaccio/cli-ui';
import infoCommand from './commands/info';
import initProgram from './commands/init';
@ -55,12 +55,9 @@ if (commander.info) {
}
process.on('uncaughtException', function (err) {
logger.fatal(
{
err: err,
},
'uncaught exception, please report (https://github.com/verdaccio/verdaccio/issues) ' +
'this: \n@{err.stack}'
displayError(
// eslint-disable-next-line max-len
`uncaught exception, please report (https://github.com/verdaccio/verdaccio/issues) this: \n${err.stack}`
);
process.exit(255);
process.exit(1);
});

@ -5,8 +5,6 @@ import { startVerdaccio, listenDefaultCallback } from '@verdaccio/node-api';
export const DEFAULT_PROCESS_NAME: string = 'verdaccio';
export default function initProgram(commander, pkgVersion, pkgName) {
// FIXME: we need to log before the setup is being applied
// const initLogger = createLogger();
const cliListener = commander.listen;
let configPathLocation;
let verdaccioConfiguration: ConfigRuntime;

@ -2,6 +2,7 @@
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"rootDir": "./src",
"jsx": "react",
"outDir": "./build"
},
"include": ["src/**/*"],

@ -16,6 +16,9 @@
{
"path": "../node-api"
},
{
"path": "../core/cli-ui"
},
{
"path": "../utils"
}

@ -0,0 +1,6 @@
{
"extends": "../../../.babelrc",
"presets": [
"@babel/preset-react"
]
}

@ -0,0 +1,5 @@
{
"rules": {
"no-console": 0
}
}

@ -0,0 +1,3 @@
const config = require('../../../jest/config');
module.exports = Object.assign({}, config, {});

@ -0,0 +1,55 @@
{
"name": "@verdaccio/cli-ui",
"version": "5.0.0-alpha.3",
"description": "cli ui components",
"keywords": [
"private",
"package",
"repository",
"registry",
"enterprise",
"modules",
"proxy",
"server",
"verdaccio"
],
"author": "Juan Picado <juanpicado19@gmail.com>",
"license": "MIT",
"homepage": "https://verdaccio.org",
"repository": {
"type": "https",
"url": "https://github.com/verdaccio/verdaccio",
"directory": "packages/core/cli-ui"
},
"bugs": {
"url": "https://github.com/verdaccio/verdaccio/issues"
},
"publishConfig": {
"access": "public"
},
"main": "build/index.js",
"types": "build/index.d.ts",
"files": [
"build"
],
"engines": {
"node": ">=10",
"npm": ">=6"
},
"dependencies": {
"chalk": "^4.1.0",
"terminal-link": "^2.1.1"
},
"scripts": {
"clean": "rimraf ./build",
"test": "cross-env NODE_ENV=test BABEL_ENV=test jest",
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
"build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
"watch": "pnpm build:js -- --watch",
"build": "pnpm run build:js && pnpm run build:types"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/verdaccio"
}
}

@ -0,0 +1 @@
export * from './messages';

@ -0,0 +1,25 @@
import chalk from 'chalk';
import terminalLink from 'terminal-link';
export const PRIMARY_COLOR = `#24394e`;
export function displayMessage(message: string) {
console.log(chalk.hex(PRIMARY_COLOR).bold(message));
}
export function displayWarning(message: string) {
console.log(chalk.yellow.bold(message));
}
export function displayError(message: string) {
console.log(chalk.red.bold(message));
}
export function displayLink(url: string) {
if (terminalLink.isSupported) {
const link = terminalLink(url, url);
return chalk.blue.underline(link);
}
return url;
}

@ -0,0 +1,3 @@
describe('cli ui', () => {
test.todo('add required test for this module');
});

@ -0,0 +1,9 @@
{
"extends": "../../../tsconfig.base.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./build"
},
"include": ["src/**/*"],
"exclude": ["src/**/*.test.ts"]
}

@ -0,0 +1,11 @@
{
"extends": "../../../tsconfig.reference.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./build",
"composite": true,
"declaration": true
},
"include": ["src/**/*.ts"],
"exclude": ["src/**/*.test.ts"]
}

@ -41,7 +41,7 @@
"dependencies": {
"@verdaccio/commons-api": "workspace:10.0.0-alpha.3",
"@verdaccio/config": "workspace:5.0.0-alpha.3",
"@verdaccio/logger": "workspace:5.0.0-alpha.3",
"@verdaccio/cli-ui": "workspace:5.0.0-alpha.3",
"@verdaccio/server": "workspace:5.0.0-alpha.6",
"core-js": "^3.6.5",
"debug": "^4.2.0",
@ -50,7 +50,8 @@
},
"devDependencies": {
"@verdaccio/mock": "workspace:5.0.0-alpha.3",
"@verdaccio/types": "workspace:10.0.0-alpha.3"
"@verdaccio/types": "workspace:10.0.0-alpha.3",
"jest-mock-process": "^1.4.0"
},
"publishConfig": {
"access": "public"

@ -7,6 +7,8 @@ import { Application } from 'express';
import { assign, isObject, isFunction } from 'lodash';
import buildDebug from 'debug';
import { displayError, displayMessage, displayLink } from '@verdaccio/cli-ui';
import {
ConfigRuntime,
Callback,
@ -16,7 +18,6 @@ import {
} from '@verdaccio/types';
import { API_ERROR } from '@verdaccio/commons-api';
import server from '@verdaccio/server';
import { logger } from '@verdaccio/logger';
export const keyPem = 'verdaccio-key.pem';
export const certPem = 'verdaccio-cert.pem';
@ -85,8 +86,8 @@ function unlinkAddressPath(addr) {
}
}
function logHTTPSWarning(storageLocation) {
logger.fatal(
function logHTTPSError(storageLocation) {
displayError(
[
'You have enabled HTTPS and need to specify either ',
' "https.key" and "https.cert" or ',
@ -113,6 +114,7 @@ function logHTTPSWarning(storageLocation) {
` cert: ${resolveConfigPath(storageLocation, certPem)}`,
].join('\n')
);
displayError(displayLink('https://verdaccio.org/docs/en/configuration#https'));
process.exit(2);
}
@ -128,7 +130,8 @@ function handleHTTPS(app: Application, configPath: string, config: ConfigWithHtt
// https must either have key and cert or a pfx and (optionally) a passphrase
if (!((keyCertConfig.key && keyCertConfig.cert) || pfxConfig.pfx)) {
logHTTPSWarning(configPath);
logHTTPSError(configPath);
process.exit(1);
}
if (pfxConfig.pfx) {
@ -149,8 +152,7 @@ function handleHTTPS(app: Application, configPath: string, config: ConfigWithHtt
}
return https.createServer(httpsOptions, app);
} catch (err) {
// catch errors related to certificate loading
logger.fatal({ err: err }, 'cannot create server: @{err.message}');
displayError(`cannot create server: ${err.message}`);
process.exit(2);
}
}
@ -163,35 +165,32 @@ function listenDefaultCallback(
): void {
webServer
.listen(addr.port || addr.path, addr.host, (): void => {
// send a message for tests
// send a message for test
if (isFunction(process.send)) {
process.send({
verdaccio_started: true,
});
}
const addressServer = `${
addr.path
? URL.format({
protocol: 'unix',
pathname: addr.path,
})
: URL.format({
protocol: addr.proto,
hostname: addr.host,
port: addr.port,
pathname: '/',
})
}`;
displayMessage(`http address ${displayLink(addressServer)}`);
displayMessage(`${pkgName} / ${pkgVersion}`);
})
.on('error', function (err): void {
logger.fatal({ err: err }, 'cannot create server: @{err.message}');
displayError(`cannot create server: ${err.message}`);
process.exit(2);
});
logger.warn(
{
addr: addr.path
? URL.format({
protocol: 'unix',
pathname: addr.path,
})
: URL.format({
protocol: addr.proto,
hostname: addr.host,
port: addr.port,
pathname: '/',
}),
version: pkgName + '/' + pkgVersion,
},
'http address - @{addr} - @{version}'
);
}
export { startVerdaccio, listenDefaultCallback };

@ -1,7 +1,7 @@
import path from 'path';
import semver from 'semver';
const logger = require('@verdaccio/logger');
import { displayLink, displayWarning } from '@verdaccio/cli-ui';
export const DEFAULT_PORT = '4873';
export const DEFAULT_PROTOCOL = 'http';
@ -87,12 +87,11 @@ export function getListListenAddresses(argListen: string, configListen: any): an
const parsedAddr = parseAddress(addr);
if (!parsedAddr) {
logger.logger.warn(
{ addr: addr },
'invalid address - @{addr}, we expect a port (e.g. "4873"),' +
' host:port (e.g. "localhost:4873") or full url' +
' (e.g. "http://localhost:4873/")'
displayWarning(
// eslint-disable-next-line max-len
`invalid address - ${addr}, we expect a port (e.g. "4873"), host:port (e.g. "localhost:4873") or full url '(e.g. "http://localhost:4873/")`
);
displayWarning(displayLink('https://verdaccio.org/docs/en/configuration#listen-port'));
}
return parsedAddr;

@ -1,6 +1,4 @@
import buildDebug from 'debug';
const debug = buildDebug('verdaccio:runtime:flags');
import { displayWarning, displayMessage } from '@verdaccio/cli-ui';
export function displayExperimentsInfoBox(flags) {
if (!flags) {
@ -9,12 +7,15 @@ export function displayExperimentsInfoBox(flags) {
const experimentList = Object.keys(flags);
if (experimentList.length >= 1) {
debug(
displayWarning(
'⚠️ experiments are enabled, we recommend do not use experiments in production, ' +
'comment out this section to disable it'
);
experimentList.forEach((experiment) => {
debug(` - support for %o %o`, experiment, flags[experiment] ? 'is enabled' : ' is disabled');
displayMessage(
` - support for ${experiment} ${flags[experiment] ? 'is enabled' : ' is disabled'}
`
);
});
}
}

@ -1,36 +0,0 @@
import { resolveConfigPath } from './cli-utils';
import { certPem, csrPem, keyPem } from './bootstrap';
const logger = require('@verdaccio/logger');
export function logHTTPSWarning(storageLocation) {
logger.logger.fatal(
[
'You have enabled HTTPS and need to specify either ',
' "https.key", "https.cert" and "https.ca" or ',
' "https.pfx" and optionally "https.passphrase" ',
'to run https server',
'',
// commands are borrowed from node.js docs
'To quickly create self-signed certificate, use:',
' $ openssl genrsa -out ' + resolveConfigPath(storageLocation, keyPem) + ' 2048',
' $ openssl req -new -sha256 -key ' +
resolveConfigPath(storageLocation, keyPem) +
' -out ' +
resolveConfigPath(storageLocation, csrPem),
' $ openssl x509 -req -in ' +
resolveConfigPath(storageLocation, csrPem) +
' -signkey ' +
resolveConfigPath(storageLocation, keyPem) +
' -out ' +
resolveConfigPath(storageLocation, certPem),
'',
'And then add to config file (' + storageLocation + '):',
' https:',
` key: ${resolveConfigPath(storageLocation, keyPem)}`,
` cert: ${resolveConfigPath(storageLocation, certPem)}`,
` ca: ${resolveConfigPath(storageLocation, csrPem)}`,
].join('\n')
);
process.exit(2);
}

@ -6,22 +6,9 @@ import selfsigned from 'selfsigned';
import { configExample } from '@verdaccio/mock';
import { parseConfigFile } from '@verdaccio/config';
import { logger } from '@verdaccio/logger';
import { startVerdaccio } from '../src';
import { DEFAULT_DOMAIN, DEFAULT_PROTOCOL } from '../src/cli-utils';
jest.mock('@verdaccio/logger', () => ({
setup: jest.fn(),
logger: {
child: jest.fn(),
debug: jest.fn(),
trace: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn(),
},
}));
const mockProcess = require('jest-mock-process');
describe('startServer via API', () => {
const parseConfigurationFile = (name) => {
@ -144,26 +131,19 @@ describe('startServer via API', () => {
});
test('should provide all HTTPS server fails', async (done) => {
let mockExit = mockProcess.mockProcessExit();
const store = path.join(__dirname, 'partials/store');
const serverName = 'verdaccio-test';
const version = '1.0.0';
const address = 'https://www.domain.com:443';
const realProcess = process;
const conf = configExample();
const conf = configExample({});
conf.https = {};
// save process to catch exist
const exitMock = jest.fn();
// @ts-ignore
global.process = { ...realProcess, exit: exitMock };
await startVerdaccio(conf, address, store, version, serverName, () => {
expect(logger.fatal).toHaveBeenCalled();
expect(logger.fatal).toHaveBeenCalledTimes(2);
expect(mockExit).toHaveBeenCalledWith(2);
done();
});
expect(exitMock).toHaveBeenCalledWith(2);
// restore process
global.process = realProcess;
});
test('should start a https server with key and cert', async (done) => {

@ -6,18 +6,6 @@ import {
getListListenAddresses,
} from '../src/cli-utils';
jest.mock('@verdaccio/logger', () => ({
setup: jest.fn(),
logger: {
child: jest.fn(),
debug: jest.fn(),
trace: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn(),
},
}));
describe('getListListenAddresses test', () => {
test('should return no address if a single address is wrong', () => {
// @ts-ignore

@ -21,6 +21,9 @@
},
{
"path": "../utils"
},
{
"path": "../core/cli-ui"
}
]
}

71
pnpm-lock.yaml generated

@ -284,16 +284,16 @@ importers:
verdaccio-htpasswd: workspace:10.0.0-alpha.6
packages/cli:
dependencies:
'@verdaccio/cli-ui': link:../core/cli-ui
'@verdaccio/config': link:../config
'@verdaccio/logger': link:../logger
'@verdaccio/node-api': link:../node-api
commander: 6.2.0
envinfo: 7.4.0
kleur: 3.0.3
semver: 7.3.2
specifiers:
'@verdaccio/cli-ui': workspace:5.0.0-alpha.3
'@verdaccio/config': workspace:5.0.0-alpha.3
'@verdaccio/logger': workspace:5.0.0-alpha.3
'@verdaccio/node-api': workspace:5.0.0-alpha.6
commander: 6.2.0
envinfo: 7.4.0
@ -323,6 +323,13 @@ importers:
minimatch: 3.0.4
mkdirp: 0.5.5
yup: ^0.29.3
packages/core/cli-ui:
dependencies:
chalk: 4.1.0
terminal-link: 2.1.1
specifiers:
chalk: ^4.1.0
terminal-link: ^2.1.1
packages/core/commons-api:
dependencies:
http-errors: 1.8.0
@ -531,9 +538,9 @@ importers:
supertest: ^4.0.2
packages/node-api:
dependencies:
'@verdaccio/cli-ui': link:../core/cli-ui
'@verdaccio/commons-api': link:../core/commons-api
'@verdaccio/config': link:../config
'@verdaccio/logger': link:../logger
'@verdaccio/server': link:../server
core-js: 3.6.5
debug: 4.2.0
@ -542,15 +549,17 @@ importers:
devDependencies:
'@verdaccio/mock': link:../mock
'@verdaccio/types': link:../core/types
jest-mock-process: 1.4.0
specifiers:
'@verdaccio/cli-ui': workspace:5.0.0-alpha.3
'@verdaccio/commons-api': workspace:10.0.0-alpha.3
'@verdaccio/config': workspace:5.0.0-alpha.3
'@verdaccio/logger': workspace:5.0.0-alpha.3
'@verdaccio/mock': workspace:5.0.0-alpha.3
'@verdaccio/server': workspace:5.0.0-alpha.6
'@verdaccio/types': workspace:10.0.0-alpha.3
core-js: ^3.6.5
debug: ^4.2.0
jest-mock-process: ^1.4.0
lodash: ^4.17.20
selfsigned: 1.10.7
packages/plugins/active-directory:
@ -1636,7 +1645,6 @@ packages:
resolution:
integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
/@babel/helper-plugin-utils/7.12.13:
dev: true
resolution:
integrity: sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==
/@babel/helper-regex/7.10.5:
@ -2290,7 +2298,7 @@ packages:
integrity: sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==
/@babel/plugin-syntax-async-generators/7.8.4:
dependencies:
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2299,7 +2307,7 @@ packages:
/@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.11.4:
dependencies:
'@babel/core': 7.11.4
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2422,7 +2430,7 @@ packages:
integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
/@babel/plugin-syntax-export-namespace-from/7.8.3:
dependencies:
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2431,7 +2439,7 @@ packages:
/@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.11.4:
dependencies:
'@babel/core': 7.11.4
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2475,7 +2483,7 @@ packages:
integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
/@babel/plugin-syntax-json-strings/7.8.3:
dependencies:
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2484,7 +2492,7 @@ packages:
/@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.11.4:
dependencies:
'@babel/core': 7.11.4
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2545,7 +2553,7 @@ packages:
integrity: sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==
/@babel/plugin-syntax-logical-assignment-operators/7.10.4:
dependencies:
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2554,7 +2562,7 @@ packages:
/@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.11.4:
dependencies:
'@babel/core': 7.11.4
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2580,7 +2588,7 @@ packages:
integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3:
dependencies:
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2589,7 +2597,7 @@ packages:
/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.11.4:
dependencies:
'@babel/core': 7.11.4
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2615,7 +2623,7 @@ packages:
integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
/@babel/plugin-syntax-numeric-separator/7.10.4:
dependencies:
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2624,7 +2632,7 @@ packages:
/@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.11.4:
dependencies:
'@babel/core': 7.11.4
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2650,7 +2658,7 @@ packages:
integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
/@babel/plugin-syntax-object-rest-spread/7.8.3:
dependencies:
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2659,7 +2667,7 @@ packages:
/@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.10.5:
dependencies:
'@babel/core': 7.10.5
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2668,7 +2676,7 @@ packages:
/@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.11.4:
dependencies:
'@babel/core': 7.11.4
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2694,7 +2702,7 @@ packages:
integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
/@babel/plugin-syntax-optional-catch-binding/7.8.3:
dependencies:
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2703,7 +2711,7 @@ packages:
/@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.11.4:
dependencies:
'@babel/core': 7.11.4
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2729,7 +2737,7 @@ packages:
integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
/@babel/plugin-syntax-optional-chaining/7.8.3:
dependencies:
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -2738,7 +2746,7 @@ packages:
/@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.11.4:
dependencies:
'@babel/core': 7.11.4
'@babel/helper-plugin-utils': 7.10.4
'@babel/helper-plugin-utils': 7.12.13
dev: false
peerDependencies:
'@babel/core': ^7.0.0-0
@ -9137,7 +9145,6 @@ packages:
resolution:
integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
/base64-js/1.5.1:
dev: true
resolution:
integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
/base64id/2.0.0:
@ -9291,7 +9298,7 @@ packages:
integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==
/bl/4.0.3:
dependencies:
buffer: 5.6.0
buffer: 5.7.1
inherits: 2.0.4
readable-stream: 3.6.0
resolution:
@ -9620,7 +9627,6 @@ packages:
dependencies:
base64-js: 1.5.1
ieee754: 1.2.1
dev: true
resolution:
integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
/builtin-modules/3.1.0:
@ -16373,7 +16379,6 @@ packages:
resolution:
integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
/ieee754/1.2.1:
dev: true
resolution:
integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
/iferr/0.1.5:
@ -17718,6 +17723,12 @@ packages:
node: '>= 10.14.2'
resolution:
integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==
/jest-mock-process/1.4.0:
dev: true
peerDependencies:
jest: '>=23.4 <27'
resolution:
integrity: sha512-3LM1TyEaRKRjh/x9rZPmuy28r7q8cgNkHYcrPWtxXT3ZzPPS+bKNs2ysb8BJPVB41X5yM1sMtatvE5z2XJ0S/w==
/jest-mock/26.6.2:
dependencies:
'@jest/types': 26.6.2
@ -24397,7 +24408,7 @@ packages:
integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
/slice-ansi/3.0.0:
dependencies:
ansi-styles: 4.2.1
ansi-styles: 4.3.0
astral-regex: 2.0.0
is-fullwidth-code-point: 3.0.0
dev: false
@ -25485,7 +25496,6 @@ packages:
dependencies:
has-flag: 4.0.0
supports-color: 7.2.0
dev: true
engines:
node: '>=8'
resolution:
@ -25698,7 +25708,6 @@ packages:
dependencies:
ansi-escapes: 4.3.1
supports-hyperlinks: 2.1.0
dev: true
engines:
node: '>=8'
resolution:

@ -6,6 +6,7 @@
"noImplicitAny": false,
"strict": true,
"declaration": true,
"jsx": "react",
"strictNullChecks": true,
"types": ["node", "jest", "express"],
"resolveJsonModule": true,