diff --git a/.circleci/config.yml b/.circleci/config.yml index 3091fa8032..3f478af4d8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -153,6 +153,24 @@ jobs: command: | pnpm --dir libs/fixtures test + test-logging: + executor: nodejs + resource_class: xlarge + steps: + - checkout-and-install + - run: + name: Build + command: | + pnpm --dir libs/logging build + - run: + name: Lint + command: | + pnpm --dir libs/logging lint + - run: + name: Test + command: | + pnpm --dir libs/logging test + test-hmpb-interpreter: executor: nodejs resource_class: xlarge @@ -407,6 +425,7 @@ workflows: - test-hmpb-interpreter - test-integration-testing-bsd - test-integration-testing-election-manager + - test-logging - test-lsd - test-module-converter-ms-sems - test-module-scan diff --git a/apps/election-manager/package.json b/apps/election-manager/package.json index 0b46bbc926..df8b8fd9d4 100644 --- a/apps/election-manager/package.json +++ b/apps/election-manager/package.json @@ -88,6 +88,7 @@ "@types/styled-components": "^5.1.7", "@votingworks/ballot-encoder": "workspace:*", "@votingworks/fixtures": "workspace:*", + "@votingworks/logging": "workspace:*", "@votingworks/qrcode.react": "^1.0.2", "@votingworks/types": "workspace:*", "@votingworks/ui": "workspace:*", diff --git a/apps/election-manager/src/AppRoot.tsx b/apps/election-manager/src/AppRoot.tsx index e5a4f1a584..01acb36637 100644 --- a/apps/election-manager/src/AppRoot.tsx +++ b/apps/election-manager/src/AppRoot.tsx @@ -3,7 +3,12 @@ import React, { useState, useRef, useEffect, useCallback } from 'react'; import { RouteComponentProps } from 'react-router-dom'; import 'normalize.css'; import { sha256 } from 'js-sha256'; - +import { + Logger, + LogSource, + LogEventId, + LogDispositionStandardTypes, +} from '@votingworks/logging'; import { ElectionDefinition, parseElection, @@ -80,6 +85,7 @@ function AppRoot({ hardware, machineConfigProvider, }: Props): JSX.Element { + const logger = new Logger(LogSource.VxAdminApp, window.kiosk); const printBallotRef = useRef(null); const getElectionDefinition = useCallback(async (): Promise< @@ -310,6 +316,13 @@ function AppRoot({ const saveElection: SaveElection = useCallback( async (electionJSON) => { + const previousElection = electionDefinition; + if (previousElection) { + void logger.log(LogEventId.ElectionUnconfigured, 'admin', { + disposition: LogDispositionStandardTypes.Success, + previousElectionHash: previousElection.electionHash, + }); + } // we set a new election definition, reset everything await storage.clear(); setIsOfficialResults(false); @@ -322,6 +335,9 @@ function AppRoot({ const electionData = electionJSON; const electionHash = sha256(electionData); const election = safeParseElection(electionData).unsafeUnwrap(); + // Temporarily bootstrap an authenticated user session. This will be removed + // once we have a full story for how to bootstrap the auth process. + bootstrapAuthenticatedAdminSession(); setElectionDefinition({ electionData, @@ -331,9 +347,6 @@ function AppRoot({ const newConfiguredAt = new Date().toISOString(); setConfiguredAt(newConfiguredAt); - // Temporarily bootstrap an authenticated user session. This will be removed - // once we have a full story for how to bootstrap the auth process. - bootstrapAuthenticatedAdminSession(); await storage.set(configuredAtStorageKey, newConfiguredAt); await storage.set(electionDefinitionStorageKey, { @@ -341,10 +354,15 @@ function AppRoot({ electionData, electionHash, }); + await logger.log(LogEventId.ElectionConfigured, 'admin', { + disposition: LogDispositionStandardTypes.Success, + newElectionHash: electionHash, + }); } }, // eslint-disable-next-line react-hooks/exhaustive-deps [ + electionDefinition, storage, setIsOfficialResults, setCastVoteRecordFiles, diff --git a/apps/election-manager/tsconfig.json b/apps/election-manager/tsconfig.json index 50a6d037bc..a7029c7715 100644 --- a/apps/election-manager/tsconfig.json +++ b/apps/election-manager/tsconfig.json @@ -23,6 +23,7 @@ { "path": "../../libs/test-utils" }, { "path": "../../libs/types" }, { "path": "../../libs/utils" }, + { "path": "../../libs/logging" }, { "path": "../../libs/ui" } ] } diff --git a/libs/@types/kiosk-browser/kiosk-browser.d.ts b/libs/@types/kiosk-browser/kiosk-browser.d.ts index 36b38326da..1978673b17 100644 --- a/libs/@types/kiosk-browser/kiosk-browser.d.ts +++ b/libs/@types/kiosk-browser/kiosk-browser.d.ts @@ -1,7 +1,7 @@ declare namespace KioskBrowser { export interface BatteryInfo { - discharging: boolean - level: number // Number between 0–1 + discharging: boolean; + level: number; // Number between 0–1 } export type PrintSides = @@ -22,57 +22,57 @@ declare namespace KioskBrowser { * that a right-side up portrait sheet flipped over on the short edge remains * right-side up, i.e. a bound-at-the-top ring binder. */ - | 'two-sided-short-edge' + | 'two-sided-short-edge'; export interface PrintOptions { - deviceName?: string - paperSource?: string - copies?: number - sides?: PrintSides + deviceName?: string; + paperSource?: string; + copies?: number; + sides?: PrintSides; } export interface PrinterInfo { // Docs: http://electronjs.org/docs/api/structures/printer-info - description: string - isDefault: boolean - name: string - status: number + description: string; + isDefault: boolean; + name: string; + status: number; // Added via kiosk-browser - connected: boolean - options?: { [key: string]: string } + connected: boolean; + options?: { [key: string]: string }; } export interface Device { - locationId: number - vendorId: number - productId: number - deviceName: string - manufacturer: string - serialNumber: string - deviceAddress: number + locationId: number; + vendorId: number; + productId: number; + deviceName: string; + manufacturer: string; + serialNumber: string; + deviceAddress: number; } export interface UsbDrive { - deviceName: string - mountPoint?: string + deviceName: string; + mountPoint?: string; } export interface SaveAsOptions { - title?: string - defaultPath?: string - buttonLabel?: string - filters?: FileFilter[] + title?: string; + defaultPath?: string; + buttonLabel?: string; + filters?: FileFilter[]; } export interface MakeDirectoryOptions { - recursive?: boolean - mode?: number + recursive?: boolean; + mode?: number; } export interface FileFilter { // Docs: http://electronjs.org/docs/api/structures/file-filter - extensions: string[] - name: string + extensions: string[]; + name: string; } export enum FileSystemEntryType { @@ -86,13 +86,13 @@ declare namespace KioskBrowser { } export interface FileSystemEntry { - readonly name: string - readonly path: string - readonly type: FileSystemEntryType - readonly size: number - readonly mtime: Date - readonly atime: Date - readonly ctime: Date + readonly name: string; + readonly path: string; + readonly type: FileSystemEntryType; + readonly size: number; + readonly mtime: Date; + readonly atime: Date; + readonly ctime: Date; } export interface FileWriter { @@ -100,106 +100,107 @@ declare namespace KioskBrowser { * Writes a chunk to the file. May be called multiple times. Data will be * written in the order of calls to `write`. */ - write(data: Uint8Array | string): Promise + write(data: Uint8Array | string): Promise; /** * Finishes writing to the file and closes it. Subsequent calls to `write` * will fail. Resolves when the file is successfully closed. */ - end(): Promise + end(): Promise; - filename: string + filename: string; } export interface SetClockParams { - isoDatetime: string - IANAZone: string + isoDatetime: string; + IANAZone: string; } export interface TotpInfo { - isoDatetime: string - code: string + isoDatetime: string; + code: string; } export interface SignParams { - signatureType: string - payload: string + signatureType: string; + payload: string; } - + export interface Kiosk { - print(options?: PrintOptions): Promise - getPrinterInfo(): Promise + print(options?: PrintOptions): Promise; + getPrinterInfo(): Promise; /** * Prints the current page to PDF and resolves with the PDF file bytes. */ - printToPDF(): Promise + printToPDF(): Promise; + log(message: string): Promise; - getBatteryInfo(): Promise - devices: import('rxjs').Observable> - printers: import('rxjs').Observable> - quit(): void + getBatteryInfo(): Promise; + devices: import('rxjs').Observable>; + printers: import('rxjs').Observable>; + quit(): void; /** * Opens a Save Dialog to allow the user to choose a destination for a file. * Once chosen, resolves with a handle to the file to write data to it. */ - saveAs(options?: SaveAsOptions): Promise + saveAs(options?: SaveAsOptions): Promise; /** * Writes a file to a specified file path */ - writeFile(path: string): Promise - writeFile(path: string, content: Uint8Array | string): Promise + writeFile(path: string): Promise; + writeFile(path: string, content: Uint8Array | string): Promise; /* * Creates a directory at the specified path. */ - makeDirectory(path: string, options?: MakeDirectoryOptions): Promise + makeDirectory(path: string, options?: MakeDirectoryOptions): Promise; // USB sticks - getUsbDrives(): Promise - mountUsbDrive(device: string): Promise - unmountUsbDrive(device: string): Promise + getUsbDrives(): Promise; + mountUsbDrive(device: string): Promise; + unmountUsbDrive(device: string): Promise; /** * Writes a file to a specified file path */ - writeFile(path: string): Promise - writeFile(path: string, content: Uint8Array | string): Promise + writeFile(path: string): Promise; + writeFile(path: string, content: Uint8Array | string): Promise; /** * Creates a directory at the specified path. */ - makeDirectory(path: string, options?: MakeDirectoryOptions): Promise + makeDirectory(path: string, options?: MakeDirectoryOptions): Promise; /** * Reads the list of files at a specified directory path */ - getFileSystemEntries(path: string): Promise + getFileSystemEntries(path: string): Promise; /** * Reads a file from a specified path */ - readFile(path: string): Promise - readFile(path: string, encoding: string): Promise + readFile(path: string): Promise; + readFile(path: string, encoding: string): Promise; // storage storage: { - set(key: string, value: unknown): Promise - get(key: string): Promise - remove(key: string): Promise - clear(): Promise - } + set(key: string, value: unknown): Promise; + get(key: string): Promise; + remove(key: string): Promise; + clear(): Promise; + }; - setClock(params: SetClockParams): Promise + setClock(params: SetClockParams): Promise; totp: { - get(): Promise - } + get(): Promise; + }; - sign(params: SignParams): Promise + sign(params: SignParams): Promise; } } -declare var kiosk: KioskBrowser.Kiosk | undefined +declare var kiosk: KioskBrowser.Kiosk | undefined; diff --git a/libs/logging/.eslintignore b/libs/logging/.eslintignore new file mode 100644 index 0000000000..e2c7cf4cc8 --- /dev/null +++ b/libs/logging/.eslintignore @@ -0,0 +1,3 @@ +build +coverage +jest.config.js \ No newline at end of file diff --git a/libs/logging/.eslintrc.json b/libs/logging/.eslintrc.json new file mode 100644 index 0000000000..02874d38d9 --- /dev/null +++ b/libs/logging/.eslintrc.json @@ -0,0 +1,6 @@ +{ + "parserOptions": { + "project": "./tsconfig.test.json" + }, + "extends": ["plugin:vx/recommended"] +} diff --git a/libs/logging/.gitignore b/libs/logging/.gitignore new file mode 100644 index 0000000000..502167fa0b --- /dev/null +++ b/libs/logging/.gitignore @@ -0,0 +1 @@ +/lib diff --git a/libs/logging/jest.config.js b/libs/logging/jest.config.js new file mode 100644 index 0000000000..6596f6b03a --- /dev/null +++ b/libs/logging/jest.config.js @@ -0,0 +1,6 @@ +const shared = require('../../jest.config.shared'); + +module.exports = { + ...shared, + testEnvironment: 'jsdom', +}; diff --git a/libs/logging/package.json b/libs/logging/package.json new file mode 100644 index 0000000000..5673e2ebfe --- /dev/null +++ b/libs/logging/package.json @@ -0,0 +1,68 @@ +{ + "name": "@votingworks/logging", + "version": "1.0.0", + "private": true, + "description": "Utilities and definitions for logging in votingworks components", + "license": "GPL-3.0", + "author": "VotingWorks Eng ", + "main": "build/index.js", + "types": "build/index.d.js", + "files": [ + "build" + ], + "scripts": { + "type-check": "tsc --build", + "build": "tsc --build", + "build:watch": "tsc --build --watch", + "lint": "pnpm type-check && eslint .", + "lint:fix": "pnpm type-check && eslint . --fix", + "test": "is-ci test:ci test:watch", + "test:watch": "TZ=UTC jest --watch", + "test:coverage": "TZ=UTC jest --coverage", + "test:ci": "TZ=UTC pnpm build && pnpm test:coverage", + "pre-commit": "lint-staged" + }, + "lint-staged": { + "*.+(css|graphql|json|less|md|mdx|sass|scss|yaml|yml)": [ + "prettier --write" + ], + "*.+(js|jsx|ts|tsx)": [ + "eslint --quiet --fix" + ], + "package.json": [ + "sort-package-json" + ] + }, + "dependencies": { + "@types/kiosk-browser": "workspace:*", + "@types/node": "^12.20.11", + "@votingworks/types": "workspace:*", + "@votingworks/utils": "workspace:*", + "debug": "^4.3.2" + }, + "devDependencies": { + "@types/debug": "^4.1.6", + "@types/jest": "^26.0.23", + "@typescript-eslint/eslint-plugin": "^4.28.4", + "@typescript-eslint/parser": "^4.28.4", + "@votingworks/fixtures": "workspace:*", + "@votingworks/test-utils": "workspace:*", + "eslint": "^7.26.0", + "eslint-config-prettier": "^8.3.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-vx": "workspace:*", + "fast-check": "^2.18.0", + "fetch-mock": "^9.9.0", + "is-ci-cli": "^2.2.0", + "jest": "^26.6.3", + "jest-watch-typeahead": "^0.6.4", + "lint-staged": "^11.0.0", + "mockdate": "^3.0.2", + "prettier": "^2.3.0", + "sort-package-json": "^1.50.0", + "ts-jest": "^26.5.6", + "typescript": "^4.3.5" + } +} diff --git a/libs/logging/src/index.ts b/libs/logging/src/index.ts new file mode 100644 index 0000000000..cc5b5ba43b --- /dev/null +++ b/libs/logging/src/index.ts @@ -0,0 +1,5 @@ +/* istanbul ignore file */ +export * from './logger'; +export * from './types'; +export * from './logEventIDs'; +export * from './logEventTypes'; diff --git a/libs/logging/src/logEventIDs.test.ts b/libs/logging/src/logEventIDs.test.ts new file mode 100644 index 0000000000..f33d784ae7 --- /dev/null +++ b/libs/logging/src/logEventIDs.test.ts @@ -0,0 +1,8 @@ +import { getDetailsForEventId, LogEventId } from './logEventIDs'; + +test('getDetailsForEventId implemented for all events properly', () => { + for (const eventId of Object.values(LogEventId)) { + const logDetails = getDetailsForEventId(eventId); + expect(logDetails.eventId).toEqual(eventId); + } +}); diff --git a/libs/logging/src/logEventIDs.ts b/libs/logging/src/logEventIDs.ts new file mode 100644 index 0000000000..16d041c5e4 --- /dev/null +++ b/libs/logging/src/logEventIDs.ts @@ -0,0 +1,61 @@ +import { throwIllegalValue } from '@votingworks/utils'; +import { LogEventType } from './logEventTypes'; + +/** + * In order to add a new log event you must do three things: + * 1. Add the new event to the enum LogEventId + * 2. Define a LogDetails object representing the information about that log event. + * 3. Add a case statement to the switch in getDetailsForEventId returning your new LogDetails object when you see your new LogEventId. + * You will then be ready to use the log event from your code! + */ + +export enum LogEventId { + ElectionConfigured = 'election-configured', + ElectionUnconfigured = 'election-unconfigured', + MachineBoot = 'machine-booted', +} + +export interface LogDetails { + eventId: LogEventId; + eventType: LogEventType; + defaultMessage?: string; + documentationMessage: string; +} + +const ElectionConfiguredEvent: LogDetails = { + eventId: LogEventId.ElectionConfigured, + eventType: LogEventType.UserAction, + defaultMessage: 'Application has been configured for a new election.', + documentationMessage: + 'Message that the user has configured current machine to a new election definition.', +}; + +const ElectionUnconfiguredEvent: LogDetails = { + eventId: LogEventId.ElectionUnconfigured, + eventType: LogEventType.UserAction, + defaultMessage: + 'Application has been unconfigured from the previous election.', + documentationMessage: + 'Message that the user has unconfigured current machine to remove the current election definition.', +}; + +const MachineBootedEvent: LogDetails = { + eventId: LogEventId.MachineBoot, + eventType: LogEventType.HardwareAction, + documentationMessage: + 'Log that appears when the machine has successfully booted.', +}; + +export function getDetailsForEventId(eventId: LogEventId): LogDetails { + switch (eventId) { + case LogEventId.ElectionConfigured: + return ElectionConfiguredEvent; + case LogEventId.MachineBoot: + return MachineBootedEvent; + case LogEventId.ElectionUnconfigured: + return ElectionUnconfiguredEvent; + /* istanbul ignore next - compile time check for completeness */ + default: + throwIllegalValue(eventId); + } +} diff --git a/libs/logging/src/logEventTypes.test.ts b/libs/logging/src/logEventTypes.test.ts new file mode 100644 index 0000000000..167723a2fa --- /dev/null +++ b/libs/logging/src/logEventTypes.test.ts @@ -0,0 +1,8 @@ +import { getDocumentationForEventType, LogEventType } from './logEventTypes'; + +test('getDocumentationForEventType implemented for all log event types properly', () => { + for (const eventType of Object.values(LogEventType)) { + const documentation = getDocumentationForEventType(eventType); + expect(documentation.eventType).toEqual(eventType); + } +}); diff --git a/libs/logging/src/logEventTypes.ts b/libs/logging/src/logEventTypes.ts new file mode 100644 index 0000000000..805d7aac6d --- /dev/null +++ b/libs/logging/src/logEventTypes.ts @@ -0,0 +1,45 @@ +import { throwIllegalValue } from '@votingworks/utils'; + +/** + * In order to add a new log event type you must do three things: + * 1. Add the new event type to the enum LogEventType + * 2. Define a LogEventTypeDocumentation object with documentation about the meaning of the event type. This will be available publicly with the intended audience of users understanding the logs. + * 3. Add a case statement to the switch in getDocumentationForEventType returning your new LogEventTypeDocumentation object when you see the event type. + * You will then be ready to use this event type when defining log event Ids! + */ + +export enum LogEventType { + UserAction = 'user-action', + HardwareAction = 'hardware-action', +} + +export interface LogEventTypeDocumentation { + eventType: LogEventType; + documentationMessage: string; +} + +const UserActionEventDocumentation: LogEventTypeDocumentation = { + eventType: LogEventType.UserAction, + documentationMessage: + 'A log that results from a user taking an action, i.e. an election admin uploading an election definition to a machine.', +}; + +const HardwareActionEventDocumentation: LogEventTypeDocumentation = { + eventType: LogEventType.HardwareAction, + documentationMessage: + 'A log that results from the hardware completing some action, i.e. the machine booting.', +}; + +export function getDocumentationForEventType( + eventType: LogEventType +): LogEventTypeDocumentation { + switch (eventType) { + case LogEventType.UserAction: + return UserActionEventDocumentation; + case LogEventType.HardwareAction: + return HardwareActionEventDocumentation; + /* istanbul ignore next - compile time check for completeness */ + default: + throwIllegalValue(eventType); + } +} diff --git a/libs/logging/src/logServer.ts b/libs/logging/src/logServer.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libs/logging/src/logger.test.ts b/libs/logging/src/logger.test.ts new file mode 100644 index 0000000000..b090404824 --- /dev/null +++ b/libs/logging/src/logger.test.ts @@ -0,0 +1,96 @@ +/* eslint-disable no-console */ +import { fakeKiosk } from '@votingworks/test-utils'; +import MockDate from 'mockdate'; +import { LogEventType } from '.'; +import { LogEventId } from './logEventIDs'; +import { Logger } from './logger'; +import { LogDispositionStandardTypes, LogSource } from './types'; + +MockDate.set('2020-07-24T00:00:00.000Z'); + +test('logger logs server logs as expected', async () => { + console.log = jest.fn(); + const logger = new Logger(LogSource.System); + await logger.log(LogEventId.MachineBoot, 'system', { + message: 'I come back stronger than a 90s trend', + disposition: LogDispositionStandardTypes.Success, + reputation: 'callitwhatyouwant', + }); + expect(console.log).toHaveBeenCalledWith({ + source: LogSource.System, + eventId: LogEventId.MachineBoot, + eventType: LogEventType.HardwareAction, + user: 'system', + message: 'I come back stronger than a 90s trend', + disposition: LogDispositionStandardTypes.Success, + reputation: 'callitwhatyouwant', + }); +}); + +test('logger logs client logs as expected through kiosk browser with overridden message', async () => { + console.log = jest.fn(); + const kiosk = fakeKiosk(); + const logger = new Logger(LogSource.VxAdminApp, kiosk); + await logger.log(LogEventId.ElectionConfigured, 'admin', { + message: 'On my tallest tiptoes', + disposition: LogDispositionStandardTypes.NotApplicable, + folklore: 'mirrorball', + }); + expect(kiosk.log).toHaveBeenCalledTimes(1); + expect(kiosk.log).toHaveBeenCalledWith( + JSON.stringify({ + timeLogInitiated: new Date(2020, 6, 24).getTime().toString(), + source: LogSource.VxAdminApp, + eventId: LogEventId.ElectionConfigured, + eventType: LogEventType.UserAction, + user: 'admin', + message: 'On my tallest tiptoes', // overrides the default message + disposition: LogDispositionStandardTypes.NotApplicable, + folklore: 'mirrorball', + }) + ); + expect(console.log).not.toHaveBeenCalled(); +}); + +test('defaults to default message when defined and no disposition', async () => { + console.log = jest.fn(); + const kiosk = fakeKiosk(); + const logger = new Logger(LogSource.VxAdminApp, kiosk); + await logger.log(LogEventId.ElectionUnconfigured, 'admin'); + expect(kiosk.log).toHaveBeenCalledTimes(1); + expect(kiosk.log).toHaveBeenCalledWith( + JSON.stringify({ + timeLogInitiated: new Date(2020, 6, 24).getTime().toString(), + source: LogSource.VxAdminApp, + eventId: LogEventId.ElectionUnconfigured, + eventType: LogEventType.UserAction, + user: 'admin', + message: 'Application has been unconfigured from the previous election.', + disposition: LogDispositionStandardTypes.NotApplicable, + }) + ); + expect(console.log).not.toHaveBeenCalled(); +}); + +test('logs unknown disposition as expected', async () => { + console.log = jest.fn(); + const logger = new Logger(LogSource.System); + await logger.log(LogEventId.MachineBoot, 'system', { + message: 'threw out our cloaks and our daggers now', + disposition: 'daylight', + maybe: 'you', + ran: 'with', + the: 'wolves', + }); + expect(console.log).toHaveBeenCalledWith({ + source: LogSource.System, + eventId: LogEventId.MachineBoot, + eventType: LogEventType.HardwareAction, + user: 'system', + message: 'threw out our cloaks and our daggers now', + disposition: 'daylight', + maybe: 'you', + ran: 'with', + the: 'wolves', + }); +}); diff --git a/libs/logging/src/logger.ts b/libs/logging/src/logger.ts new file mode 100644 index 0000000000..ee7fdf7bdb --- /dev/null +++ b/libs/logging/src/logger.ts @@ -0,0 +1,58 @@ +import makeDebug from 'debug'; +import { Dictionary } from '@votingworks/types'; +import { getDetailsForEventId, LogLine } from '.'; +import { LogEventId } from './logEventIDs'; +import { + LogDisposition, + LogDispositionStandardTypes, + LoggingUserRole, + LogSource, +} from './types'; + +const debug = makeDebug('logger'); + +interface LogData extends Dictionary { + message?: string; + disposition?: LogDisposition; +} + +export class Logger { + constructor( + private readonly source: LogSource, + private readonly kiosk?: KioskBrowser.Kiosk + ) {} + + async log( + eventId: LogEventId, + user: LoggingUserRole, + logData: LogData = {} + ): Promise { + const eventSpecificDetails = getDetailsForEventId(eventId); + const { + message = eventSpecificDetails.defaultMessage, + disposition = LogDispositionStandardTypes.NotApplicable, + ...additionalData + } = logData; + const logLine: LogLine = { + source: this.source, + eventId, + eventType: eventSpecificDetails.eventType, + user, + message, + disposition, + ...additionalData, + }; + if (this.kiosk) { + debug(logLine); // for internal debugging use log to the console + await this.kiosk.log( + JSON.stringify({ + timeLogInitiated: Date.now().toString(), + ...logLine, + }) + ); + } else { + // eslint-disable-next-line no-console + console.log(logLine); + } + } +} diff --git a/libs/logging/src/types.ts b/libs/logging/src/types.ts new file mode 100644 index 0000000000..3dd3f45217 --- /dev/null +++ b/libs/logging/src/types.ts @@ -0,0 +1,25 @@ +import { CardDataTypes, Dictionary } from '@votingworks/types'; +import { LogEventId, LogEventType } from '.'; + +export enum LogDispositionStandardTypes { + Success = 'success', + Failure = 'failure', + NotApplicable = 'na', +} + +export type LoggingUserRole = CardDataTypes | 'vx-employee' | 'system'; +export type LogDisposition = LogDispositionStandardTypes | string; +export enum LogSource { + System = 'system', + VxAdminApp = 'vx-admin', +} + +export interface LogLine extends Dictionary { + source: LogSource; + eventId: LogEventId; + eventType: LogEventType; + user: LoggingUserRole; + disposition: LogDisposition; + message?: string; + time?: string; +} diff --git a/libs/logging/tsconfig.json b/libs/logging/tsconfig.json new file mode 100644 index 0000000000..a61dfa3b34 --- /dev/null +++ b/libs/logging/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../tsconfig.shared.json", + "compilerOptions": { + "module": "commonjs", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "rootDir": "src", + "outDir": "build", + "composite": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true + }, + "include": ["src"], + "exclude": ["**/*.test.ts"], + "references": [ + { "path": "../../libs/eslint-plugin-vx/tsconfig.build.json" }, + { "path": "../../libs/types" }, + { "path": "../../libs/fixtures" }, + { "path": "../../libs/utils" } + ] +} diff --git a/libs/logging/tsconfig.test.json b/libs/logging/tsconfig.test.json new file mode 100644 index 0000000000..4e679c3cb0 --- /dev/null +++ b/libs/logging/tsconfig.test.json @@ -0,0 +1,17 @@ +{ + "extends": "../eslint-plugin-vx/tsconfig.build.json", + "compilerOptions": { + "rootDir": ".", + "resolveJsonModule": true, + "esModuleInterop": true, + "noEmit": true + }, + "include": ["src", "src/data/*.json"], + "exclude": [], + "references": [ + { "path": "../../libs/eslint-plugin-vx/tsconfig.build.json" }, + { "path": "../../libs/test-utils" }, + { "path": "../../libs/types" }, + { "path": "../../libs/fixtures" } + ] +} diff --git a/libs/test-utils/src/fakeKiosk.ts b/libs/test-utils/src/fakeKiosk.ts index 082b14c5be..ec0e7de53d 100644 --- a/libs/test-utils/src/fakeKiosk.ts +++ b/libs/test-utils/src/fakeKiosk.ts @@ -78,5 +78,6 @@ export function fakeKiosk({ get: jest.fn(), }, sign: jest.fn(), + log: jest.fn(), }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb088494a1..7d9d4d545c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -472,6 +472,7 @@ importers: '@types/styled-components': 5.1.7 '@votingworks/ballot-encoder': link:../../libs/ballot-encoder '@votingworks/fixtures': link:../../libs/fixtures + '@votingworks/logging': link:../../libs/logging '@votingworks/qrcode.react': 1.0.2_react@17.0.1 '@votingworks/types': link:../../libs/types '@votingworks/ui': link:../../libs/ui @@ -573,6 +574,7 @@ importers: '@typescript-eslint/parser': ^4.28.4 '@votingworks/ballot-encoder': workspace:* '@votingworks/fixtures': workspace:* + '@votingworks/logging': workspace:* '@votingworks/qrcode.react': ^1.0.2 '@votingworks/test-utils': workspace:* '@votingworks/types': workspace:* @@ -810,7 +812,7 @@ importers: base64-js: 1.5.1 debug: 4.3.1 fetch-mock: 9.11.0 - http-proxy-middleware: 1.0.6_debug@4.3.1 + http-proxy-middleware: 1.0.6 i18next: 19.8.4 jest-fetch-mock: 3.0.3 js-file-download: 0.4.12 @@ -1336,6 +1338,66 @@ importers: ts-node: ^9.0.0 typescript: ^4.3.5 uuid: ^8.3.1 + libs/logging: + dependencies: + '@types/kiosk-browser': link:../@types/kiosk-browser + '@types/node': 12.20.15 + '@votingworks/types': link:../types + '@votingworks/utils': link:../utils + debug: 4.3.2 + devDependencies: + '@types/debug': 4.1.7 + '@types/jest': 26.0.23 + '@typescript-eslint/eslint-plugin': 4.30.0_30d5b6043eb1943afef560c3f2647d4d + '@typescript-eslint/parser': 4.29.3_eslint@7.29.0+typescript@4.3.5 + '@votingworks/fixtures': link:../fixtures + '@votingworks/test-utils': link:../test-utils + eslint: 7.29.0 + eslint-config-prettier: 8.3.0_eslint@7.29.0 + eslint-import-resolver-node: 0.3.6 + eslint-plugin-import: 2.24.2_eslint@7.29.0+typescript@4.3.5 + eslint-plugin-prettier: 3.4.1_4e72879372edbffcbdaf0fa17b22c203 + eslint-plugin-vx: link:../eslint-plugin-vx + fast-check: 2.18.0 + fetch-mock: 9.11.0 + is-ci-cli: 2.2.0 + jest: 26.6.3 + jest-watch-typeahead: 0.6.5_jest@26.6.3 + lint-staged: 11.0.0 + mockdate: 3.0.5 + prettier: 2.3.2 + sort-package-json: 1.50.0 + ts-jest: 26.5.6_jest@26.6.3+typescript@4.3.5 + typescript: 4.3.5 + specifiers: + '@types/debug': ^4.1.6 + '@types/jest': ^26.0.23 + '@types/kiosk-browser': workspace:* + '@types/node': ^12.20.11 + '@typescript-eslint/eslint-plugin': ^4.28.4 + '@typescript-eslint/parser': ^4.28.4 + '@votingworks/fixtures': workspace:* + '@votingworks/test-utils': workspace:* + '@votingworks/types': workspace:* + '@votingworks/utils': workspace:* + debug: ^4.3.2 + eslint: ^7.26.0 + eslint-config-prettier: ^8.3.0 + eslint-import-resolver-node: ^0.3.6 + eslint-plugin-import: ^2.24.2 + eslint-plugin-prettier: ^3.4.0 + eslint-plugin-vx: workspace:* + fast-check: ^2.18.0 + fetch-mock: ^9.9.0 + is-ci-cli: ^2.2.0 + jest: ^26.6.3 + jest-watch-typeahead: ^0.6.4 + lint-staged: ^11.0.0 + mockdate: ^3.0.2 + prettier: ^2.3.0 + sort-package-json: ^1.50.0 + ts-jest: ^26.5.6 + typescript: ^4.3.5 libs/lsd: dependencies: bindings: 1.5.0 @@ -1835,28 +1897,6 @@ packages: node: '>=6.9.0' resolution: integrity: sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - /@babel/core/7.12.10: - dependencies: - '@babel/code-frame': 7.12.11 - '@babel/generator': 7.12.11 - '@babel/helper-module-transforms': 7.12.1 - '@babel/helpers': 7.12.5 - '@babel/parser': 7.12.11 - '@babel/template': 7.12.7 - '@babel/traverse': 7.12.12 - '@babel/types': 7.12.12 - convert-source-map: 1.7.0 - debug: 4.3.1 - gensync: 1.0.0-beta.2 - json5: 2.1.3 - lodash: 4.17.20 - semver: 5.7.1 - source-map: 0.5.7 - dev: true - engines: - node: '>=6.9.0' - resolution: - integrity: sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== /@babel/core/7.12.3: dependencies: '@babel/code-frame': 7.12.13 @@ -2038,6 +2078,7 @@ packages: '@babel/types': 7.12.12 jsesc: 2.5.2 source-map: 0.5.7 + dev: false resolution: integrity: sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== /@babel/generator/7.13.16: @@ -2322,6 +2363,7 @@ packages: '@babel/helper-get-function-arity': 7.12.10 '@babel/template': 7.12.7 '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== /@babel/helper-function-name/7.12.13: @@ -2361,6 +2403,7 @@ packages: /@babel/helper-get-function-arity/7.12.10: dependencies: '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== /@babel/helper-get-function-arity/7.12.13: @@ -2405,6 +2448,7 @@ packages: /@babel/helper-member-expression-to-functions/7.12.7: dependencies: '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== /@babel/helper-member-expression-to-functions/7.13.12: @@ -2437,6 +2481,7 @@ packages: /@babel/helper-module-imports/7.12.5: dependencies: '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== /@babel/helper-module-imports/7.13.12: @@ -2469,6 +2514,7 @@ packages: '@babel/traverse': 7.12.12 '@babel/types': 7.12.12 lodash: 4.17.20 + dev: false resolution: integrity: sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== /@babel/helper-module-transforms/7.13.14: @@ -2543,6 +2589,7 @@ packages: /@babel/helper-optimise-call-expression/7.12.10: dependencies: '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== /@babel/helper-optimise-call-expression/7.12.13: @@ -2590,6 +2637,7 @@ packages: '@babel/helper-optimise-call-expression': 7.12.10 '@babel/traverse': 7.12.12 '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA== /@babel/helper-replace-supers/7.13.12: @@ -2644,6 +2692,7 @@ packages: /@babel/helper-simple-access/7.12.1: dependencies: '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== /@babel/helper-simple-access/7.13.12: @@ -2682,6 +2731,7 @@ packages: /@babel/helper-split-export-declaration/7.12.11: dependencies: '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== /@babel/helper-split-export-declaration/7.12.13: @@ -2750,6 +2800,7 @@ packages: '@babel/template': 7.12.7 '@babel/traverse': 7.12.12 '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== /@babel/helpers/7.13.17: @@ -2828,6 +2879,7 @@ packages: resolution: integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== /@babel/parser/7.12.11: + dev: false engines: node: '>=6.0.0' hasBin: true @@ -3430,19 +3482,10 @@ packages: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3451,7 +3494,7 @@ packages: /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.13.16: dependencies: '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3460,7 +3503,7 @@ packages: /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -3477,7 +3520,7 @@ packages: /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.8.4: dependencies: '@babel/core': 7.8.4 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3486,25 +3529,16 @@ packages: /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.9.0: dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3513,7 +3547,7 @@ packages: /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -3527,19 +3561,10 @@ packages: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3548,7 +3573,7 @@ packages: /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -3688,19 +3713,10 @@ packages: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA== - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3709,7 +3725,7 @@ packages: /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -3723,19 +3739,10 @@ packages: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3744,7 +3751,7 @@ packages: /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.13.16: dependencies: '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3753,7 +3760,7 @@ packages: /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -3770,7 +3777,7 @@ packages: /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.8.4: dependencies: '@babel/core': 7.8.4 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3779,7 +3786,7 @@ packages: /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.9.0: dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3821,19 +3828,10 @@ packages: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3842,7 +3840,7 @@ packages: /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.13.16: dependencies: '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3851,7 +3849,7 @@ packages: /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -3868,25 +3866,16 @@ packages: /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.8.4: dependencies: '@babel/core': 7.8.4 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3895,7 +3884,7 @@ packages: /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.13.16: dependencies: '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3904,7 +3893,7 @@ packages: /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -3921,7 +3910,7 @@ packages: /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.8.4: dependencies: '@babel/core': 7.8.4 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3930,25 +3919,16 @@ packages: /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.9.0: dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3957,7 +3937,7 @@ packages: /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.13.16: dependencies: '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3966,7 +3946,7 @@ packages: /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -3983,7 +3963,7 @@ packages: /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.8.4: dependencies: '@babel/core': 7.8.4 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -3992,25 +3972,16 @@ packages: /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.9.0: dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -4019,7 +3990,7 @@ packages: /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.13.16: dependencies: '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -4028,7 +3999,7 @@ packages: /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -4045,7 +4016,7 @@ packages: /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.8.4: dependencies: '@babel/core': 7.8.4 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -4054,25 +4025,16 @@ packages: /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.9.0: dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -4081,7 +4043,7 @@ packages: /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.13.16: dependencies: '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -4090,7 +4052,7 @@ packages: /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -4107,7 +4069,7 @@ packages: /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.8.4: dependencies: '@babel/core': 7.8.4 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -4116,25 +4078,16 @@ packages: /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.9.0: dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -4143,7 +4096,7 @@ packages: /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.13.16: dependencies: '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -4152,7 +4105,7 @@ packages: /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.14.3: dependencies: '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: true peerDependencies: '@babel/core': ^7.0.0-0 @@ -4169,7 +4122,7 @@ packages: /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.8.4: dependencies: '@babel/core': 7.8.4 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 dev: false peerDependencies: '@babel/core': ^7.0.0-0 @@ -4178,39 +4131,12 @@ packages: /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.9.0: dependencies: '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.13.0 - dev: false - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - /@babel/plugin-syntax-top-level-await/7.12.13_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/helper-plugin-utils': 7.13.0 - dev: true - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== - /@babel/plugin-syntax-top-level-await/7.12.13_@babel+core@7.12.3: - dependencies: - '@babel/core': 7.12.3 - '@babel/helper-plugin-utils': 7.13.0 - dev: false - peerDependencies: - '@babel/core': ^7.0.0-0 - resolution: - integrity: sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== - /@babel/plugin-syntax-top-level-await/7.12.13_@babel+core@7.14.3: - dependencies: - '@babel/core': 7.14.3 - '@babel/helper-plugin-utils': 7.13.0 - dev: true + '@babel/helper-plugin-utils': 7.14.5 + dev: false peerDependencies: '@babel/core': ^7.0.0-0 resolution: - integrity: sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== /@babel/plugin-syntax-top-level-await/7.12.1_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 @@ -4247,6 +4173,28 @@ packages: '@babel/core': ^7.0.0-0 resolution: integrity: sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.12.3: + dependencies: + '@babel/core': 7.12.3 + '@babel/helper-plugin-utils': 7.14.5 + dev: false + engines: + node: '>=6.9.0' + peerDependencies: + '@babel/core': ^7.0.0-0 + resolution: + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.14.3: + dependencies: + '@babel/core': 7.14.3 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + engines: + node: '>=6.9.0' + peerDependencies: + '@babel/core': ^7.0.0-0 + resolution: + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.15.8: dependencies: '@babel/core': 7.15.8 @@ -6297,6 +6245,7 @@ packages: '@babel/code-frame': 7.12.11 '@babel/parser': 7.12.11 '@babel/types': 7.12.12 + dev: false resolution: integrity: sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== /@babel/template/7.14.5: @@ -6328,6 +6277,7 @@ packages: debug: 4.3.1 globals: 11.12.0 lodash: 4.17.20 + dev: false resolution: integrity: sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== /@babel/traverse/7.12.12_supports-color@5.5.0: @@ -6438,6 +6388,7 @@ packages: '@babel/helper-validator-identifier': 7.12.11 lodash: 4.17.20 to-fast-properties: 2.0.0 + dev: false resolution: integrity: sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== /@babel/types/7.12.13: @@ -6651,7 +6602,7 @@ packages: /@eslint/eslintrc/0.4.2: dependencies: ajv: 6.12.6 - debug: 4.3.1 + debug: 4.3.2 espree: 7.3.1 globals: 13.9.0 ignore: 4.0.6 @@ -6735,7 +6686,7 @@ packages: /@jest/console/26.6.2: dependencies: '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 chalk: 4.1.2 jest-message-util: 26.6.2 jest-util: 26.6.2 @@ -6760,7 +6711,7 @@ packages: /@jest/console/27.2.5: dependencies: '@jest/types': 27.2.5 - '@types/node': 14.17.26 + '@types/node': 16.0.0 chalk: 4.1.2 jest-message-util: 27.2.5 jest-util: 27.2.5 @@ -6812,7 +6763,7 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 exit: 0.1.2 @@ -6846,9 +6797,9 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 - ansi-escapes: 4.3.1 - chalk: 4.1.0 + '@types/node': 16.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.4 jest-changed-files: 26.6.2 @@ -6864,11 +6815,11 @@ packages: jest-util: 26.6.2 jest-validate: 26.6.2 jest-watcher: 26.6.2 - micromatch: 4.0.2 + micromatch: 4.0.4 p-each-series: 2.2.0 rimraf: 3.0.2 slash: 3.0.0 - strip-ansi: 6.0.0 + strip-ansi: 6.0.1 dev: true engines: node: '>= 10.14.2' @@ -6883,9 +6834,9 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 - ansi-escapes: 4.3.1 - chalk: 4.1.0 + '@types/node': 16.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.4 jest-changed-files: 26.6.2 @@ -6901,11 +6852,11 @@ packages: jest-util: 26.6.2 jest-validate: 26.6.2 jest-watcher: 26.6.2 - micromatch: 4.0.2 + micromatch: 4.0.4 p-each-series: 2.2.0 rimraf: 3.0.2 slash: 3.0.0 - strip-ansi: 6.0.0 + strip-ansi: 6.0.1 dev: true engines: node: '>= 10.14.2' @@ -6921,9 +6872,9 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 - ansi-escapes: 4.3.1 - chalk: 4.1.0 + '@types/node': 16.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.4 jest-changed-files: 26.6.2 @@ -6939,11 +6890,11 @@ packages: jest-util: 26.6.2 jest-validate: 26.6.2 jest-watcher: 26.6.2 - micromatch: 4.0.2 + micromatch: 4.0.4 p-each-series: 2.2.0 rimraf: 3.0.2 slash: 3.0.0 - strip-ansi: 6.0.0 + strip-ansi: 6.0.1 dev: true engines: node: '>= 10.14.2' @@ -7007,7 +6958,7 @@ packages: dependencies: '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 jest-mock: 26.6.2 engines: node: '>= 10.14.2' @@ -7050,7 +7001,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@sinonjs/fake-timers': 6.0.1 - '@types/node': 14.17.26 + '@types/node': 16.0.0 jest-message-util: 26.6.2 jest-mock: 26.6.2 jest-util: 26.6.2 @@ -7422,7 +7373,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.1 - '@types/node': 14.17.26 + '@types/node': 16.0.0 '@types/yargs': 15.0.14 chalk: 4.1.2 engines: @@ -7456,7 +7407,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.1 - '@types/node': 14.17.26 + '@types/node': 16.0.0 '@types/yargs': 16.0.4 chalk: 4.1.2 dev: true @@ -8394,6 +8345,7 @@ packages: '@types/babel__generator': 7.6.2 '@types/babel__template': 7.4.0 '@types/babel__traverse': 7.11.1 + dev: true resolution: integrity: sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== /@types/babel__core/7.1.15: @@ -8579,7 +8531,7 @@ packages: integrity: sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== /@types/graceful-fs/4.1.5: dependencies: - '@types/node': 14.17.26 + '@types/node': 16.0.0 resolution: integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== /@types/history/4.7.8: @@ -8787,9 +8739,6 @@ packages: /@types/node/14.14.35: resolution: integrity: sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag== - /@types/node/14.17.26: - resolution: - integrity: sha512-eSTNkK/nfmnC7IKpOJZixDgG0W2/eHz1qyFN7o/rwwwIHsVRp+G9nbh4BrQ77kbQ2zPu286AQRxkuRLPcR3gXw== /@types/node/15.0.1: resolution: integrity: sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA== @@ -9138,12 +9087,6 @@ packages: '@types/yargs-parser': 20.2.0 resolution: integrity: sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== - /@types/yargs/15.0.12: - dependencies: - '@types/yargs-parser': 20.2.0 - dev: true - resolution: - integrity: sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw== /@types/yargs/15.0.13: dependencies: '@types/yargs-parser': 20.2.0 @@ -9391,6 +9334,30 @@ packages: optional: true resolution: integrity: sha512-tBgfA3K/3TsZY46ROGvoRxQr1wBkclbVqRQep97MjVHJzcRBURRY3sNFqLk0/Xr//BY5hM9H2p/kp+6qim85SA== + /@typescript-eslint/eslint-plugin/4.30.0_30d5b6043eb1943afef560c3f2647d4d: + dependencies: + '@typescript-eslint/experimental-utils': 4.30.0_eslint@7.29.0+typescript@4.3.5 + '@typescript-eslint/parser': 4.29.3_eslint@7.29.0+typescript@4.3.5 + '@typescript-eslint/scope-manager': 4.30.0 + debug: 4.3.2 + eslint: 7.29.0 + functional-red-black-tree: 1.0.1 + regexpp: 3.2.0 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.3.5 + typescript: 4.3.5 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + '@typescript-eslint/parser': ^4.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-NgAnqk55RQ/SD+tZFD9aPwNSeHmDHHe5rtUyhIq0ZeCWZEvo4DK9rYz7v9HDuQZFvn320Ot+AikaCKMFKLlD0g== /@typescript-eslint/eslint-plugin/4.30.0_942c48837be95e76bb4156c78358cdbe: dependencies: '@typescript-eslint/experimental-utils': 4.30.0_eslint@7.27.0+typescript@4.2.3 @@ -9678,6 +9645,23 @@ packages: typescript: '*' resolution: integrity: sha512-K8RNIX9GnBsv5v4TjtwkKtqMSzYpjqAQg/oSphtxf3xxdt6T0owqnpojztjjTcatSteH3hLj3t/kklKx87NPqw== + /@typescript-eslint/experimental-utils/4.30.0_eslint@7.29.0+typescript@4.3.5: + dependencies: + '@types/json-schema': 7.0.9 + '@typescript-eslint/scope-manager': 4.30.0 + '@typescript-eslint/types': 4.30.0 + '@typescript-eslint/typescript-estree': 4.30.0_typescript@4.3.5 + eslint: 7.29.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@7.29.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + eslint: '*' + typescript: '*' + resolution: + integrity: sha512-K8RNIX9GnBsv5v4TjtwkKtqMSzYpjqAQg/oSphtxf3xxdt6T0owqnpojztjjTcatSteH3hLj3t/kklKx87NPqw== /@typescript-eslint/parser/2.34.0_eslint@6.8.0+typescript@4.3.5: dependencies: '@types/eslint-visitor-keys': 1.0.0 @@ -10038,6 +10022,25 @@ packages: optional: true resolution: integrity: sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ== + /@typescript-eslint/parser/4.29.3_eslint@7.29.0+typescript@4.3.5: + dependencies: + '@typescript-eslint/scope-manager': 4.29.3 + '@typescript-eslint/types': 4.29.3 + '@typescript-eslint/typescript-estree': 4.29.3_typescript@4.3.5 + debug: 4.3.2 + eslint: 7.29.0 + typescript: 4.3.5 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ== /@typescript-eslint/scope-manager/4.13.0: dependencies: '@typescript-eslint/types': 4.13.0 @@ -10085,7 +10088,6 @@ packages: dependencies: '@typescript-eslint/types': 4.30.0 '@typescript-eslint/visitor-keys': 4.30.0 - dev: false engines: node: ^8.10.0 || ^10.13.0 || >=11.10.1 resolution: @@ -10125,7 +10127,6 @@ packages: resolution: integrity: sha512-s1eV1lKNgoIYLAl1JUba8NhULmf+jOmmeFO1G5MN/RBCyyzg4TIOfIOICVNC06lor+Xmy4FypIIhFiJXOknhIg== /@typescript-eslint/types/4.30.0: - dev: false engines: node: ^8.10.0 || ^10.13.0 || >=11.10.1 resolution: @@ -10310,6 +10311,26 @@ packages: optional: true resolution: integrity: sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg== + /@typescript-eslint/typescript-estree/4.30.0_typescript@4.3.5: + dependencies: + '@typescript-eslint/types': 4.30.0 + '@typescript-eslint/visitor-keys': 4.30.0 + debug: 4.3.2 + globby: 11.0.4 + is-glob: 4.0.1 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.3.5 + typescript: 4.3.5 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg== /@typescript-eslint/visitor-keys/3.10.1: dependencies: eslint-visitor-keys: 1.3.0 @@ -10365,7 +10386,6 @@ packages: dependencies: '@typescript-eslint/types': 4.30.0 eslint-visitor-keys: 2.1.0 - dev: false engines: node: ^8.10.0 || ^10.13.0 || >=11.10.1 resolution: @@ -11336,33 +11356,15 @@ packages: '@babel/core': ^7.0.0 resolution: integrity: sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== - /babel-jest/26.6.3_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@jest/transform': 26.6.2 - '@jest/types': 26.6.2 - '@types/babel__core': 7.1.14 - babel-plugin-istanbul: 6.0.0 - babel-preset-jest: 26.6.2_@babel+core@7.12.10 - chalk: 4.1.1 - graceful-fs: 4.2.4 - slash: 3.0.0 - dev: true - engines: - node: '>= 10.14.2' - peerDependencies: - '@babel/core': ^7.0.0 - resolution: - integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== /babel-jest/26.6.3_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/babel__core': 7.1.14 + '@types/babel__core': 7.1.16 babel-plugin-istanbul: 6.0.0 babel-preset-jest: 26.6.2_@babel+core@7.12.3 - chalk: 4.1.1 + chalk: 4.1.2 graceful-fs: 4.2.4 slash: 3.0.0 dev: false @@ -11576,26 +11578,6 @@ packages: dev: false resolution: integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.10 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.12.10 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.12.10 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.12.10 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.10 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.10 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.10 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.10 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.10 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.10 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.10 - '@babel/plugin-syntax-top-level-await': 7.12.13_@babel+core@7.12.10 - dev: true - peerDependencies: - '@babel/core': ^7.0.0 - resolution: - integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== /babel-preset-current-node-syntax/1.0.1_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 @@ -11610,7 +11592,7 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.3 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.3 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.3 - '@babel/plugin-syntax-top-level-await': 7.12.13_@babel+core@7.12.3 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.12.3 dev: false peerDependencies: '@babel/core': ^7.0.0 @@ -11630,7 +11612,7 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.14.3 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.14.3 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.14.3 - '@babel/plugin-syntax-top-level-await': 7.12.13_@babel+core@7.14.3 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.14.3 dev: true peerDependencies: '@babel/core': ^7.0.0 @@ -11679,18 +11661,6 @@ packages: '@babel/core': ^7.0.0 resolution: integrity: sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== - /babel-preset-jest/26.6.2_@babel+core@7.12.10: - dependencies: - '@babel/core': 7.12.10 - babel-plugin-jest-hoist: 26.6.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.12.10 - dev: true - engines: - node: '>= 10.14.2' - peerDependencies: - '@babel/core': ^7.0.0 - resolution: - integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== /babel-preset-jest/26.6.2_@babel+core@7.12.3: dependencies: '@babel/core': 7.12.3 @@ -12633,7 +12603,7 @@ packages: /cli-truncate/2.1.0: dependencies: slice-ansi: 3.0.0 - string-width: 4.2.2 + string-width: 4.2.3 dev: true engines: node: '>=8' @@ -13851,9 +13821,6 @@ packages: node: '>=4.0.0' resolution: integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - /deep-is/0.1.3: - resolution: - integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= /deep-is/0.1.4: resolution: integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -14488,6 +14455,7 @@ packages: estraverse: 4.3.0 esutils: 2.0.3 optionator: 0.8.3 + dev: false engines: node: '>=4.0' hasBin: true @@ -14765,6 +14733,15 @@ packages: eslint: '>=7.0.0' resolution: integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== + /eslint-config-prettier/8.3.0_eslint@7.29.0: + dependencies: + eslint: 7.29.0 + dev: true + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + resolution: + integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== /eslint-config-react-app/5.2.1_02b4072a867835d3744dd8fbd8b48cd4: dependencies: '@typescript-eslint/eslint-plugin': 4.29.3_45bc00290c8c374316d6c2f3e2573c27 @@ -15070,6 +15047,19 @@ packages: typescript: '*' resolution: integrity: sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== + /eslint-module-utils/2.6.2_eslint@7.29.0+typescript@4.3.5: + dependencies: + '@typescript-eslint/parser': 4.29.3_eslint@7.29.0+typescript@4.3.5 + debug: 3.2.7 + pkg-dir: 2.0.0 + dev: true + engines: + node: '>=4' + peerDependencies: + eslint: '*' + typescript: '*' + resolution: + integrity: sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== /eslint-plugin-cypress/2.11.2_eslint@7.17.0: dependencies: eslint: 7.17.0 @@ -15451,6 +15441,32 @@ packages: typescript: '*' resolution: integrity: sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q== + /eslint-plugin-import/2.24.2_eslint@7.29.0+typescript@4.3.5: + dependencies: + array-includes: 3.1.3 + array.prototype.flat: 1.2.4 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 7.29.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.6.2_eslint@7.29.0+typescript@4.3.5 + find-up: 2.1.0 + has: 1.0.3 + is-core-module: 2.6.0 + minimatch: 3.0.4 + object.values: 1.1.4 + pkg-up: 2.0.0 + read-pkg-up: 3.0.0 + resolve: 1.20.0 + tsconfig-paths: 3.11.0 + dev: true + engines: + node: '>=4' + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 + typescript: '*' + resolution: + integrity: sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q== /eslint-plugin-jest/23.20.0_eslint@7.17.0+typescript@4.3.5: dependencies: '@typescript-eslint/experimental-utils': 2.34.0_eslint@7.17.0+typescript@4.3.5 @@ -15787,6 +15803,24 @@ packages: optional: true resolution: integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== + /eslint-plugin-prettier/3.4.1_4e72879372edbffcbdaf0fa17b22c203: + dependencies: + eslint: 7.29.0 + eslint-config-prettier: 8.3.0_eslint@7.29.0 + prettier: 2.3.2 + prettier-linter-helpers: 1.0.0 + dev: true + engines: + node: '>=6.0.0' + peerDependencies: + eslint: '>=5.0.0' + eslint-config-prettier: '*' + prettier: '>=1.13.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + resolution: + integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== /eslint-plugin-prettier/3.4.1_7c5f1f59332aa465fcd97b1399d2f1c7: dependencies: eslint: 7.17.0 @@ -16100,6 +16134,17 @@ packages: eslint: '>=5' resolution: integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + /eslint-utils/3.0.0_eslint@7.29.0: + dependencies: + eslint: 7.29.0 + eslint-visitor-keys: 2.1.0 + dev: true + engines: + node: ^10.0.0 || ^12.0.0 || >= 14.0.0 + peerDependencies: + eslint: '>=5' + resolution: + integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== /eslint-visitor-keys/1.3.0: engines: node: '>=4' @@ -16455,9 +16500,9 @@ packages: '@babel/code-frame': 7.12.11 '@eslint/eslintrc': 0.4.2 ajv: 6.12.6 - chalk: 4.1.1 + chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.1 + debug: 4.3.2 doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -16486,7 +16531,7 @@ packages: progress: 2.0.3 regexpp: 3.2.0 semver: 7.3.5 - strip-ansi: 6.0.0 + strip-ansi: 6.0.1 strip-json-comments: 3.1.1 table: 6.7.1 text-table: 0.2.0 @@ -16689,11 +16734,11 @@ packages: cross-spawn: 7.0.3 get-stream: 6.0.1 human-signals: 2.1.0 - is-stream: 2.0.0 + is-stream: 2.0.1 merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 - signal-exit: 3.0.3 + signal-exit: 3.0.5 strip-final-newline: 2.0.0 dev: true engines: @@ -16942,18 +16987,6 @@ packages: node: '>=8' resolution: integrity: sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== - /fast-glob/3.2.6: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.7 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.4 - dev: true - engines: - node: '>=8' - resolution: - integrity: sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ== /fast-glob/3.2.7: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -17286,6 +17319,17 @@ packages: node: '>=0.10.0' resolution: integrity: sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= + /follow-redirects/1.14.1: + dev: false + engines: + node: '>=4.0' + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + resolution: + integrity: sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== /follow-redirects/1.14.1_debug@4.3.1: dependencies: debug: 4.3.1 @@ -17752,8 +17796,8 @@ packages: '@types/glob': 7.1.3 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.6 - glob: 7.1.7 + fast-glob: 3.2.7 + glob: 7.2.0 ignore: 5.1.8 merge2: 1.4.1 slash: 3.0.0 @@ -18253,24 +18297,10 @@ packages: node: '>=8.0.0' resolution: integrity: sha512-NyL6ZB6cVni7pl+/IT2W0ni5ME00xR0sN27AQZZrpKn1b+qRh+mLbBxIq9Cq1oGfmTc7BUq4HB77mxwCaxAYNg== - /http-proxy-middleware/1.0.6_debug@4.3.1: - dependencies: - '@types/http-proxy': 1.17.6 - http-proxy: 1.18.1_debug@4.3.1 - is-glob: 4.0.1 - lodash: 4.17.21 - micromatch: 4.0.4 - dev: false - engines: - node: '>=8.0.0' - peerDependencies: - debug: '*' - resolution: - integrity: sha512-NyL6ZB6cVni7pl+/IT2W0ni5ME00xR0sN27AQZZrpKn1b+qRh+mLbBxIq9Cq1oGfmTc7BUq4HB77mxwCaxAYNg== /http-proxy/1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.14.1_debug@4.3.1 + follow-redirects: 1.14.1 requires-port: 1.0.0 dev: false engines: @@ -18600,6 +18630,7 @@ packages: resolution: integrity: sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== /ip-regex/2.1.0: + dev: false engines: node: '>=4' resolution: @@ -19041,10 +19072,6 @@ packages: node: '>=0.10.0' resolution: integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - /is-potential-custom-element-name/1.0.0: - dev: true - resolution: - integrity: sha1-DFLlS8yjkbssSUsh6GJtczbG45c= /is-potential-custom-element-name/1.0.1: resolution: integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== @@ -19443,15 +19470,15 @@ packages: '@jest/core': 26.6.3_canvas@2.6.1 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - chalk: 4.1.0 + chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.4 - import-local: 3.0.2 + import-local: 3.0.3 is-ci: 2.0.0 jest-config: 26.6.3_canvas@2.6.1 jest-util: 26.6.2 jest-validate: 26.6.2 - prompts: 2.4.0 + prompts: 2.4.2 yargs: 15.4.1 dev: true engines: @@ -19466,15 +19493,15 @@ packages: '@jest/core': 26.6.3_canvas@2.6.1+ts-node@9.1.1 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - chalk: 4.1.0 + chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.4 - import-local: 3.0.2 + import-local: 3.0.3 is-ci: 2.0.0 jest-config: 26.6.3_canvas@2.6.1+ts-node@9.1.1 jest-util: 26.6.2 jest-validate: 26.6.2 - prompts: 2.4.0 + prompts: 2.4.2 yargs: 15.4.1 dev: true engines: @@ -19490,15 +19517,15 @@ packages: '@jest/core': 26.6.3_ts-node@9.1.1 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - chalk: 4.1.0 + chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.4 - import-local: 3.0.2 + import-local: 3.0.3 is-ci: 2.0.0 jest-config: 26.6.3_ts-node@9.1.1 jest-util: 26.6.2 jest-validate: 26.6.2 - prompts: 2.4.0 + prompts: 2.4.2 yargs: 15.4.1 dev: true engines: @@ -19588,13 +19615,13 @@ packages: integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== /jest-config/26.6.3_canvas@2.6.1: dependencies: - '@babel/core': 7.12.10 + '@babel/core': 7.15.8 '@jest/test-sequencer': 26.6.3_canvas@2.6.1 '@jest/types': 26.6.2 - babel-jest: 26.6.3_@babel+core@7.12.10 - chalk: 4.1.0 + babel-jest: 26.6.3_@babel+core@7.15.8 + chalk: 4.1.2 deepmerge: 4.2.2 - glob: 7.1.6 + glob: 7.2.0 graceful-fs: 4.2.4 jest-environment-jsdom: 26.6.2_canvas@2.6.1 jest-environment-node: 26.6.2 @@ -19604,7 +19631,7 @@ packages: jest-resolve: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 - micromatch: 4.0.2 + micromatch: 4.0.4 pretty-format: 26.6.2 dev: true engines: @@ -19619,13 +19646,13 @@ packages: integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== /jest-config/26.6.3_canvas@2.6.1+ts-node@9.1.1: dependencies: - '@babel/core': 7.12.10 + '@babel/core': 7.15.8 '@jest/test-sequencer': 26.6.3_canvas@2.6.1+ts-node@9.1.1 '@jest/types': 26.6.2 - babel-jest: 26.6.3_@babel+core@7.12.10 - chalk: 4.1.0 + babel-jest: 26.6.3_@babel+core@7.15.8 + chalk: 4.1.2 deepmerge: 4.2.2 - glob: 7.1.6 + glob: 7.2.0 graceful-fs: 4.2.4 jest-environment-jsdom: 26.6.2_canvas@2.6.1 jest-environment-node: 26.6.2 @@ -19635,7 +19662,7 @@ packages: jest-resolve: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 - micromatch: 4.0.2 + micromatch: 4.0.4 pretty-format: 26.6.2 ts-node: 9.1.1_typescript@4.3.5 dev: true @@ -19651,13 +19678,13 @@ packages: integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== /jest-config/26.6.3_ts-node@9.1.1: dependencies: - '@babel/core': 7.12.10 + '@babel/core': 7.15.8 '@jest/test-sequencer': 26.6.3_ts-node@9.1.1 '@jest/types': 26.6.2 - babel-jest: 26.6.3_@babel+core@7.12.10 - chalk: 4.1.0 + babel-jest: 26.6.3_@babel+core@7.15.8 + chalk: 4.1.2 deepmerge: 4.2.2 - glob: 7.1.6 + glob: 7.2.0 graceful-fs: 4.2.4 jest-environment-jsdom: 26.6.2 jest-environment-node: 26.6.2 @@ -19667,7 +19694,7 @@ packages: jest-resolve: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 - micromatch: 4.0.2 + micromatch: 4.0.4 pretty-format: 26.6.2 ts-node: 9.1.1_typescript@4.3.5 dev: true @@ -19857,7 +19884,7 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 jest-mock: 26.6.2 jest-util: 26.6.2 jsdom: 16.7.0 @@ -19870,10 +19897,10 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 + '@types/node': 16.0.0 jest-mock: 26.6.2 jest-util: 26.6.2 - jsdom: 16.4.0_canvas@2.6.1 + jsdom: 16.7.0_canvas@2.6.1 dev: true engines: node: '>= 10.14.2' @@ -19912,7 +19939,7 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 jest-mock: 26.6.2 jest-util: 26.6.2 engines: @@ -19984,7 +20011,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.5 - '@types/node': 14.17.26 + '@types/node': 16.0.0 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.4 @@ -20052,7 +20079,7 @@ packages: '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 @@ -20071,13 +20098,13 @@ packages: integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== /jest-jasmine2/26.6.3_canvas@2.6.1: dependencies: - '@babel/traverse': 7.12.12 + '@babel/traverse': 7.15.4 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 - chalk: 4.1.0 + '@types/node': 16.0.0 + chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 is-generator-fn: 2.1.0 @@ -20098,13 +20125,13 @@ packages: integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== /jest-jasmine2/26.6.3_canvas@2.6.1+ts-node@9.1.1: dependencies: - '@babel/traverse': 7.12.12 + '@babel/traverse': 7.15.4 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 - chalk: 4.1.0 + '@types/node': 16.0.0 + chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 is-generator-fn: 2.1.0 @@ -20126,13 +20153,13 @@ packages: integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== /jest-jasmine2/26.6.3_ts-node@9.1.1: dependencies: - '@babel/traverse': 7.12.12 + '@babel/traverse': 7.15.4 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 - chalk: 4.1.0 + '@types/node': 16.0.0 + chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 is-generator-fn: 2.1.0 @@ -20330,7 +20357,7 @@ packages: /jest-mock/26.6.2: dependencies: '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 engines: node: '>= 10.14.2' resolution: @@ -20536,7 +20563,7 @@ packages: '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 @@ -20562,8 +20589,8 @@ packages: '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 - chalk: 4.1.0 + '@types/node': 16.0.0 + chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 graceful-fs: 4.2.4 @@ -20576,7 +20603,7 @@ packages: jest-runtime: 26.6.3_canvas@2.6.1 jest-util: 26.6.2 jest-worker: 26.6.2 - source-map-support: 0.5.19 + source-map-support: 0.5.20 throat: 5.0.0 dev: true engines: @@ -20591,8 +20618,8 @@ packages: '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 - chalk: 4.1.0 + '@types/node': 16.0.0 + chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 graceful-fs: 4.2.4 @@ -20605,7 +20632,7 @@ packages: jest-runtime: 26.6.3_canvas@2.6.1+ts-node@9.1.1 jest-util: 26.6.2 jest-worker: 26.6.2 - source-map-support: 0.5.19 + source-map-support: 0.5.20 throat: 5.0.0 dev: true engines: @@ -20621,8 +20648,8 @@ packages: '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.14.21 - chalk: 4.1.0 + '@types/node': 16.0.0 + chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 graceful-fs: 4.2.4 @@ -20635,7 +20662,7 @@ packages: jest-runtime: 26.6.3_ts-node@9.1.1 jest-util: 26.6.2 jest-worker: 26.6.2 - source-map-support: 0.5.19 + source-map-support: 0.5.20 throat: 5.0.0 dev: true engines: @@ -20746,12 +20773,12 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/yargs': 15.0.12 - chalk: 4.1.0 + '@types/yargs': 15.0.14 + chalk: 4.1.2 cjs-module-lexer: 0.6.0 collect-v8-coverage: 1.0.1 exit: 0.1.2 - glob: 7.1.6 + glob: 7.2.0 graceful-fs: 4.2.4 jest-config: 26.6.3_canvas@2.6.1 jest-haste-map: 26.6.2 @@ -20783,12 +20810,12 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/yargs': 15.0.12 - chalk: 4.1.0 + '@types/yargs': 15.0.14 + chalk: 4.1.2 cjs-module-lexer: 0.6.0 collect-v8-coverage: 1.0.1 exit: 0.1.2 - glob: 7.1.6 + glob: 7.2.0 graceful-fs: 4.2.4 jest-config: 26.6.3_canvas@2.6.1+ts-node@9.1.1 jest-haste-map: 26.6.2 @@ -20821,12 +20848,12 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/yargs': 15.0.12 - chalk: 4.1.0 + '@types/yargs': 15.0.14 + chalk: 4.1.2 cjs-module-lexer: 0.6.0 collect-v8-coverage: 1.0.1 exit: 0.1.2 - glob: 7.1.6 + glob: 7.2.0 graceful-fs: 4.2.4 jest-config: 26.6.3_ts-node@9.1.1 jest-haste-map: 26.6.2 @@ -20889,7 +20916,7 @@ packages: integrity: sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== /jest-serializer/26.6.2: dependencies: - '@types/node': 14.17.26 + '@types/node': 16.0.0 graceful-fs: 4.2.4 engines: node: '>= 10.14.2' @@ -21020,7 +21047,7 @@ packages: /jest-util/26.6.2: dependencies: '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 chalk: 4.1.2 graceful-fs: 4.2.4 is-ci: 2.0.0 @@ -21045,7 +21072,7 @@ packages: /jest-util/27.2.5: dependencies: '@jest/types': 27.2.5 - '@types/node': 14.17.26 + '@types/node': 16.0.0 chalk: 4.1.2 graceful-fs: 4.2.4 is-ci: 3.0.0 @@ -21143,7 +21170,7 @@ packages: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.1 - jest: 26.6.3 + jest: 26.6.3_canvas@2.6.1 jest-regex-util: 27.0.1 jest-watcher: 27.0.2 slash: 3.0.0 @@ -21208,7 +21235,7 @@ packages: dependencies: '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 14.17.26 + '@types/node': 16.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 26.6.2 @@ -21235,7 +21262,7 @@ packages: dependencies: '@jest/test-result': 27.2.5 '@jest/types': 27.2.5 - '@types/node': 14.17.26 + '@types/node': 16.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.2.5 @@ -21265,7 +21292,7 @@ packages: integrity: sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== /jest-worker/26.6.2: dependencies: - '@types/node': 14.17.26 + '@types/node': 16.0.0 merge-stream: 2.0.0 supports-color: 7.2.0 engines: @@ -21317,7 +21344,7 @@ packages: /jest/26.6.3_canvas@2.6.1: dependencies: '@jest/core': 26.6.3_canvas@2.6.1 - import-local: 3.0.2 + import-local: 3.0.3 jest-cli: 26.6.3_canvas@2.6.1 dev: true engines: @@ -21330,7 +21357,7 @@ packages: /jest/26.6.3_canvas@2.6.1+ts-node@9.1.1: dependencies: '@jest/core': 26.6.3_canvas@2.6.1+ts-node@9.1.1 - import-local: 3.0.2 + import-local: 3.0.3 jest-cli: 26.6.3_canvas@2.6.1+ts-node@9.1.1 dev: true engines: @@ -21344,7 +21371,7 @@ packages: /jest/26.6.3_ts-node@9.1.1: dependencies: '@jest/core': 26.6.3_ts-node@9.1.1 - import-local: 3.0.2 + import-local: 3.0.3 jest-cli: 26.6.3_ts-node@9.1.1 dev: true engines: @@ -21469,34 +21496,34 @@ packages: node: '>=8' resolution: integrity: sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== - /jsdom/16.4.0_canvas@2.6.1: + /jsdom/16.6.0: dependencies: abab: 2.0.5 - acorn: 7.4.1 + acorn: 8.3.0 acorn-globals: 6.0.0 - canvas: 2.6.1 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 decimal.js: 10.2.1 domexception: 2.0.1 - escodegen: 1.14.3 + escodegen: 2.0.0 + form-data: 3.0.1 html-encoding-sniffer: 2.0.1 - is-potential-custom-element-name: 1.0.0 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.0 + is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.0 - parse5: 5.1.1 - request: 2.88.2 - request-promise-native: 1.0.9_request@2.88.2 + parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 - tough-cookie: 3.0.1 + tough-cookie: 4.0.0 w3c-hr-time: 1.0.2 w3c-xmlserializer: 2.0.0 webidl-conversions: 6.1.0 whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 - whatwg-url: 8.4.0 - ws: 7.4.3 + whatwg-url: 8.5.0 + ws: 7.4.6 xml-name-validator: 3.0.0 dev: true engines: @@ -21507,16 +21534,16 @@ packages: canvas: optional: true resolution: - integrity: sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== - /jsdom/16.6.0: + integrity: sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== + /jsdom/16.7.0: dependencies: abab: 2.0.5 - acorn: 8.3.0 + acorn: 8.5.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 - decimal.js: 10.2.1 + decimal.js: 10.3.1 domexception: 2.0.1 escodegen: 2.0.0 form-data: 3.0.1 @@ -21534,10 +21561,9 @@ packages: webidl-conversions: 6.1.0 whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 - whatwg-url: 8.5.0 - ws: 7.4.6 + whatwg-url: 8.7.0 + ws: 7.5.5 xml-name-validator: 3.0.0 - dev: true engines: node: '>=10' peerDependencies: @@ -21546,12 +21572,13 @@ packages: canvas: optional: true resolution: - integrity: sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== - /jsdom/16.7.0: + integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + /jsdom/16.7.0_canvas@2.6.1: dependencies: abab: 2.0.5 acorn: 8.5.0 acorn-globals: 6.0.0 + canvas: 2.6.1 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 @@ -21576,6 +21603,7 @@ packages: whatwg-url: 8.7.0 ws: 7.5.5 xml-name-validator: 3.0.0 + dev: true engines: node: '>=10' peerDependencies: @@ -21884,7 +21912,7 @@ packages: integrity: sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== /lint-staged/11.0.0: dependencies: - chalk: 4.1.1 + chalk: 4.1.2 cli-truncate: 2.1.0 commander: 7.2.0 cosmiconfig: 7.0.0 @@ -22210,7 +22238,7 @@ packages: integrity: sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== /log-symbols/4.1.0: dependencies: - chalk: 4.1.1 + chalk: 4.1.2 is-unicode-supported: 0.1.0 dev: true engines: @@ -22551,15 +22579,6 @@ packages: node: '>=0.10.0' resolution: integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - /micromatch/4.0.2: - dependencies: - braces: 3.0.2 - picomatch: 2.2.2 - dev: true - engines: - node: '>=8' - resolution: - integrity: sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== /micromatch/4.0.4: dependencies: braces: 3.0.2 @@ -22582,6 +22601,7 @@ packages: resolution: integrity: sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== /mime-db/1.47.0: + dev: false engines: node: '>= 0.6' resolution: @@ -22606,6 +22626,7 @@ packages: /mime-types/2.1.30: dependencies: mime-db: 1.47.0 + dev: false engines: node: '>= 0.6' resolution: @@ -23504,7 +23525,7 @@ packages: integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== /optionator/0.9.1: dependencies: - deep-is: 0.1.3 + deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 @@ -23796,10 +23817,6 @@ packages: dev: false resolution: integrity: sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== - /parse5/5.1.1: - dev: true - resolution: - integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== /parse5/6.0.1: resolution: integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -23939,12 +23956,6 @@ packages: /picocolors/1.0.0: resolution: integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - /picomatch/2.2.2: - dev: true - engines: - node: '>=8.6' - resolution: - integrity: sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== /picomatch/2.2.3: dev: false engines: @@ -26136,6 +26147,7 @@ packages: dependencies: lodash: 4.17.21 request: 2.88.2 + dev: false engines: node: '>=0.10.0' peerDependencies: @@ -26149,6 +26161,7 @@ packages: stealthy-require: 1.1.1 tough-cookie: 2.5.0 deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + dev: false engines: node: '>=0.12.0' peerDependencies: @@ -26178,6 +26191,7 @@ packages: tunnel-agent: 0.6.0 uuid: 3.4.0 deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dev: false engines: node: '>= 6' resolution: @@ -26340,7 +26354,7 @@ packages: /restore-cursor/3.1.0: dependencies: onetime: 5.1.2 - signal-exit: 3.0.3 + signal-exit: 3.0.5 engines: node: '>=8' resolution: @@ -27264,6 +27278,7 @@ packages: resolution: integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= /stealthy-require/1.1.1: + dev: false engines: node: '>=0.10.0' resolution: @@ -28038,8 +28053,8 @@ packages: lodash.clonedeep: 4.5.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 - string-width: 4.2.2 - strip-ansi: 6.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 dev: true engines: node: '>=10.0.0' @@ -28363,16 +28378,6 @@ packages: node: '>=0.8' resolution: integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - /tough-cookie/3.0.1: - dependencies: - ip-regex: 2.1.0 - psl: 1.8.0 - punycode: 2.1.1 - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== /tough-cookie/4.0.0: dependencies: psl: 1.8.0 @@ -28387,14 +28392,6 @@ packages: punycode: 2.1.1 resolution: integrity: sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - /tr46/2.0.2: - dependencies: - punycode: 2.1.1 - dev: true - engines: - node: '>=8' - resolution: - integrity: sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== /tr46/2.1.0: dependencies: punycode: 2.1.1 @@ -28483,7 +28480,7 @@ packages: bs-logger: 0.2.6 buffer-from: 1.1.1 fast-json-stable-stringify: 2.1.0 - jest: 26.6.3 + jest: 26.6.3_ts-node@9.1.1 jest-util: 26.6.2 json5: 2.2.0 lodash: 4.17.21 @@ -29644,16 +29641,6 @@ packages: dev: false resolution: integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - /whatwg-url/8.4.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 2.0.2 - webidl-conversions: 6.1.0 - dev: true - engines: - node: '>=10' - resolution: - integrity: sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== /whatwg-url/8.5.0: dependencies: lodash: 4.17.21 @@ -30051,8 +30038,8 @@ packages: /wrap-ansi/7.0.0: dependencies: ansi-styles: 4.3.0 - string-width: 4.2.2 - strip-ansi: 6.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 engines: node: '>=10' resolution: @@ -30096,20 +30083,6 @@ packages: dev: false resolution: integrity: sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - /ws/7.4.3: - dev: true - engines: - node: '>=8.3.0' - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - resolution: - integrity: sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== /ws/7.4.6: dev: true engines: diff --git a/vxsuite.code-workspace b/vxsuite.code-workspace index 73ed5c1662..bbf21bedb1 100644 --- a/vxsuite.code-workspace +++ b/vxsuite.code-workspace @@ -39,6 +39,9 @@ { "path": "libs/ui" }, + { + "path": "libs/logging" + }, { "path": "apps/precinct-scanner" },